什么是 frp
frp 全名 Fast Reverse Proxy,是用于提供内网穿透服务的工具,主要用于解决一些内网服务没有公网 ip 但是却需要提供外网访问的问题。使用 frp 你可以将内网中的 TCP、UDP、HTTP、HTTPS 等协议类型的服务发布到公网,并且支持 Web 服务根据域名进行路由转发
为什么要内网穿透
针对不同业务需求,总结为以下几点:
- Web 项目对于电脑(服务器)的性能(内存、CPU、硬盘和图形运算等)要求比较高,需要部署在局域网性能较高的电脑上,且需求进行外网访问
- 搭建内网穿透小工具,服务于有项目部署需求但没有服务器(或公网 IP)的人群
- 远程桌面连接,当然这个需求可以使用很多远程桌面软件代替,但是如果要使用 Windows 远程桌面连接公司电脑的话就需要内网穿透
准备工作
在使用 frp 之前,需要一台有公网 IP 的服务器(下文称外网主机),一台需要实现内网穿透的机器(就是自己的电脑),SSH 工具,以及一个域名(如果只是建立 SSH 反向代理则不需要域名)
服务器是用来部署 frp 服务端,个人电脑用来实现内网穿透,SSH 工具是用来连服务器,如果是 Windows Server 服务器则使用 Windows 系统自带的远程桌面就可以
如上图的 frp 架构图所示:
- (必须)想要使用 frp 服务,将内网中的服务发布到公网。你需要先拥有一台拥有公网 ip 的网络设置搭建 frp 服务端,再在内网需要穿透的设置中搭建 frp 客户端服务才能进行穿透
- (非必需)你需要拥有一个域名解析到公网的 ip 地址,才能够实现 web 服务的通过域名进行路由转发的功能
Frp 服务的搭建#
搭建 frp 很简单,关键的步骤只有三步:
- 获取 frp 文件
- 设置 frp 配置文件
- 启动 frp 服务
注意:frp 搭建的的这三步是分为客户端和服务端的,但是操作基本是一致的。本教程 frp 服务的搭建主要介绍 frp 搭建的主要三步,以及 frp 服务端和客户端配置文件内容的解释说明,以及如何将 frp 在 linux 系统中创建 systemd 服务,进行服务管理
第一步:获取 frp 文件#
frp 支持 linux 平台和 windows 平台。参照你的设置的运行平台下载 linux 版本的文件或者是 windows 的。
下载地址:https://github.com/fatedier/frp/releases
一般 linux 平台下载的版本为:frp_版本号_linux_amd64.tar.gz
windows 平台下载的版本为:frp_版本号_windows_amd64.zip
linux 版本文件的解压命令为tar zxvf 文件名
,windows 版本文件直接右键解压即可。
文件解压后,一般都含有 frps (frp 服务端运行文件)、frpc (frp 客户端运行文件)、frps.ini (frp 服务端配置文件)、frpc.ini (frp 客户端配置文件),以及 frp_full.ini (frp 全部配置文件解释说明和参考。)
frp 配置文件分为服务端和客户端,想要正常只用 frp 工具,我们需要对服务端和客户端的配置文件分别进行设置
- frps.ini(服务端)配置文件解释说明:
[common]
bind_port = 7000
vhost_http_port = 8080
注:【bind_port】是 frp 客户端连接服务端的端口,【vhost_http_port】是 http 访问的端口(外网端口)
- frpc.ini(客户端)配置文件解释说明:
[common]
server_addr = 127.0.0.1 #服务器IP
server_port = 7000 #frp服务端端口地址
[web]
type = http
local_port = 8080 #本地项目端
custom_domains = test.frp.xxx.com #域名
第三步:启动服务#
linux 环境下启动服务,需要先把运行文件添加可执行权限
例如我的文件实在 root 文件夹中,我需要搭建 frp 服务端,那么待设置好服务端配置文件(frps.ini)后执行以下命令即可:
cd /root
chmod +x frps
nohup ./frps -c ./frps.ini &
执行成功后,会显示 frp 的进程号码。你也可以通过命令来查看 frps 运行的进程编号:ps -e | grep frps
在 windows 环境下则是以管理员身份运行 cmd 命令提示符。进入相应的目录后,运行命令即可: frps -c frps.ini &
关于 frp 管理的优化设置#
注:现官方已提供 systemd 服务配置文件,可直接使用。
debian8.0,或者是 centos7.0 以上的版本,服务都是基于 systemd 的方式进行管理的。frp 通过设置后也可以实现 systemd 的方式进行管理,这样我们就可以通过 systemctl 命令来进行服务的统一管理,同时通过这样的设置也可以将 frp 服务加入开机自启动
- 将 frp 设置成 linux 系统的服务,基于 systemd 方式管理 编写 frps.service 文件,以 centos7 为例:
nano /usr/lib/systemd/system/frps.service
内容如下:
[Unit]
Description=Frp Server Service
After=network.target
[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/usr/bin/frps -c /etc/frp/frps.ini
[Install]
WantedBy=multi-user.target
编写 frpc.service 文件,以 centos7 为例:
nano /usr/lib/systemd/system/frps.service
内容如下:
[Unit]
Description=Frp Client Service
After=network.target
[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/usr/bin/frpc -c /etc/frp/frpc.ini
ExecReload=/usr/bin/frpc reload -c /etc/frp/frpc.ini
[Install]
WantedBy=multi-user.target
- 将 frp 设置成开机自启动
#frps
systemctl enable frps
systemctl start frps
#frpc
systemctl enable frpc
systemctl start frpc
Frp 到此就配置完了
附:个人参考配置#
服务器端:
[common]
bind_addr = 0.0.0.0 //绑定地址
bind_port = 8888 //TCP绑定端口
bind_udp_port = 8888 //UDP绑定端口
kcp_bind_port = 8888 //KCP绑定端口
vhost_http_port = 80 //HTTP代理端口
vhost_https_port = 443 //HTTPS代理端口
dashboard_addr = 0.0.0.0 //仪表盘地址
dashboard_port = 10000 //仪表盘端口
dashboard_user = admin //仪表盘用户名
dashboard_pwd = admin //仪表盘密码
token = 123456 //连接密码
subdomain_host = test.com //子域名使用的主机名
客户端:
[common]
server_addr = 172.16.100.100 //服务器地址
server_port = 8888 //服务器绑定端口
token = 123456 //特权模式密码
tls_enable = true //加密传输
admin_addr = 127.0.0.1 //客户端Web地址
admin_port = 7400 //Web访问端口
admin_user = admin //Web访问账户
admin_pwd = admin //Web访问密码
user = your_name //用户名,设置后代理将显示为 <用户名.代理名>
[web] //服务名称(自定义)
local_ip = 127.0.0.1 //本机ip
type = http //链路类型
local_port = 80 //本机端口
subdomain = web //服务端为test.com,故此处子域名为web.test.com
custom_domains = demo.com //自定义访问域名,多个使用,分割
use_compression = true //使用压缩
use_encryption = true //使用加密
[ssh]
local_ip = 127.0.0.1
type = tcp
local_port = 22
remote_port = 9000
use_compression = true
use_encryption = true
- 👻:具体参数请根据需要配置