frp (Fast Reverse Proxy)是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议,且支持 P2P 通信。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
frp 采用经典的 C/S 架构,客户端连接服务端指定端口进行注册,由服务端进行 IP 流量转发,访问的数据通过客户端转发给内网的主机,然后再通过客户端将内网的响应发送给服务端,再由服务端返回给公网访问者,从而实现了不具备公网访问条件的内网资源的公网访问,也就是常说的内网穿透。
frp 使用 GO 语言开发,天生具有跨平台优势,安装和部署也十分便捷。各个平台都具有可直接执行二进制文件,简单配置后就可以使用。
1] 部署 frp 服务端
在部署 frp 服务端之前,有些条件需要满足。首先是 frp 服务端需要有一个公网 IP ,这也比较好理解,因为它是访问内网资源的中转部,它如果不具备公网 IP,那就相当于中转站都访问不了;其次是如果需要转发 HTTP、HTTPS 等流量,则需要有一个域名,从而实现通过域名访问内网网站的效果。
在具备了部署条件后,就可以部署 frp 的服务端了。 示例将使用 Debian 系统作为示例系统,其他系统的部署方式类似。
frp 目前最新发行版为0.71.0,后续还会开发1.x 以及 2.x 版本。frp 的发行版实际上客户端和服务端的两个二进制可执行文件。其中 frps 是服务端文件,frpc 是客户端文件。部署服务端只需要使用 frps 即可。
在 Debian 系统下载对应的软件包,并解压压缩包,并将执行文件移动到合适位置:
# https://github.com/fatedier/frp/releases/download/v0.71.0/frp_0.71.0_linux_amd64.tar.gz # tar -zxvf frp_0.71.0_linux_amd64.tar.gz # cp frp_0.71.0_linux_amd64/frps /usr/local/bin/ # frps --version
如果出现如下内容,则表示 frps 已经可以正常执行:

图.1 查看 frps 软件版本
事实上,frps 通过设置各种参数也可以启动 frp 服务端,为方便使用,可以编辑一个配置文件来对 frps 进行设置,创建一个 frps 的配置文件”/usr/local/share/frp/frps.toml”(之前版本配置文件格式为.ini,新版本采用.toml 格式),内容如下:
bindPort = 7000 vhostHTTPPort = 8080 auth.token = "Client-connect-token" webServer.addr = "0.0.0.0" webServer.port = 8008 webServer.user = "admin" webServer.password = "frp-web-console-password" log.to = "/var/log/frp/frps.log" log.level = "info" log.maxDays = 3
配置文件说明如下:
- bindPort:设置 frp 服务端侦听的端口,是 frp 客户端连接的端口
- vhostHTTPPort:设置虚拟 HTTP 主机的端口,是内网 HTTP 服务器公网的映射端口
- auth.token:设置 frp 服务端与客户端认证的令牌,是客户端与服务端的连接密码,令牌不一致的服务端和客户端不能建立连接
- webServer:设置 frp 管理控制台页面的各项参数,其中 addr 为绑定的 IP;port 为侦听端口;user 为控制台登录用户名;password 为控制台登录密码
- log:设置 frp 日志信息,其中 to 为日志文件位置;level 为日志级别(trace、debug、info、warn 和 error 可选); maxDays 为日志保存天数
配置文件保存完成后,就可以使用如下命令启动 frp 服务端了:
# frps -c /usr/local/share/frp/frps.toml
使用方便起见,可以创建一个 frps 服务”/etc/systemd/system/frps.service”文件,内容如下:
[Unit] Description = frp server After = network.target syslog.target Wants = network.target [Service] Type = simple ExecStart=/usr/local/bin/frps -c /usr/local/share/frp/frps.toml [Install] WantedBy = multi-user.target
之后,就可以使用如下命令管理 frp 服务端了:
/* 启动frp */ # systemctl start frps /* 停止frp */ # systemctl stop frps /* 重启frp */ # systemctl restart frps /* 查看frp状态 */ # systemctl status frps

图.2 查看 frp 服务端运行状态
frp 服务端启动成功后,就可以通过浏览器查看虚拟 web 服务器和控制台了:

图.3 frp 虚拟 web 页面

图.4 frp 控制台页面
至此,frp 的服务端就已经部署成功了。
2] frp 客户端的使用
frp 的客户端一般在需要穿透的内网主机上使用,只要客户端可以访问公网连接到 frp 服务器,就可以实现将内网资源发布到公网的功能。frp 的客户端和服务端成对使用,配置相互对应。frp 的客户端为 frpc,专门用于连接 frp 服务端并进行流量转发。
内网主机资源通过包括 Linux 主机、Windows 主机以及一些 Web 应用等,需要穿透的主机也并不是都需要使用 frp 客户端,只需要一台主机运行了 frp 客户端,其他主机的资源可以被运行了客户端的主机访问到就可以了,这些主机可以通过客户端添加主机代理的方式进行穿透。所以,示例就以最为常见的 windows 主机为例,来演示如何运行 frp 客户端,并配置内网穿透。
frp 的 windows 版客户端即为一个可执行文件”frpc.exe”,创建一个需要文件”frpc.toml”,并根据 frp 服务端的配置项,设置内容如下:
serverAddr = "Your-FRP-Server" serverPort = 7000 auth.method = "token" auth.token = "Client-connect-token"
frp 客户端的配置与服务端具有强相关性,理论上只需要配置服务端的访问地址和端口即可启动客户端,配置项说明如下:
- serverAddr:frp 服务端地址,支持 IP 地址和域名
- serverPort: frp 服务端侦听的端口,与服务端配置相对应
- auth:设置认证,其中 method 用于指定认证方式;token 用于指定连接停牌
之后,执行如下命令,就可以启动客户端并连接 frp 服务端了:
frpc.exe -c frpc.toml

图.5 启动 frp 客户端
此时,客户端由于没有配置主机代理,只是实现了客户端和服务端的连接,还不能实现内网穿透。想要内网穿透,就需要在配置文件中添加主机代理。假设有三台主机需要被穿透,其中一台为 windows 主机,一台为 linux 主机,还有一个内网网站。windows 主机开启了远程桌面,Linux 主机通过 ssh 访问,内网网站使用 IP 地址加端口方式访问。于是,在客户端配置文件”frpc.toml”中增加如下内容用于添加代理主机:
[[proxies]] name = "HOST-1" type = "tcp" localIP = "127.0.0.1" localPort = 3389 remotePort = 10001 [[proxies]] name = "HOST-2" type = "tcp" localIP = "192.168.1.1" localPort = 22 remotePort = 10002 [[proxies]] name = "WEB" type = "http" localIP = "127.0.0.1" localPort = 80 customDomains = ["www.yourdomain.com"]
每个代理主机对应一个”[[proxies]]”项,配置项说明如下:
- name:设置代理主机的名称
- type:设备代理主机的类型,可以使用tcp、udp、http、https 以及其他高级选项,根据实际情况进行配置
- localIP:设置代理主机的访问地址,内网可达即可
- localPort:设置内网代理主机的访问端口,根据实际情况进行设置,例如远程桌面为3389,ssh 服务为22,web 应用使用80等
- remotePort:设置内网代理主机访问端口在 frp 服务端映射的远程端口,例如连接 frp 服务器的10001端口即可访问主机的远程桌面端口
- customDomains:设置内网 web 应用的访问域名
再次启动 frp 客户端,就会提示所有代理主机启动成功:

图.6 ftp 客户端启动代理成功
我们可以将 web 配置中的域名指向 frp 服务端,就可以使用浏览器访问 frp 服务端的8080端口,验证内网 web 网站是否穿透成功。
当然,frp 客户端还支持其他类型的代理,可以访问其 >>官方文档要<< 了解更多的应用方式。
已经连接成功的客户端和启动成功的代理主机,会在 frps 服务端控制台页面进行展示:

图.7 frp 服务端控制台显示代理信息
如果想要访问 HOST-1 主机,由于其将远程桌面端口映射到 frp 服务端的 10001 端口,可以使用远程桌面客户端工具,在计算机输入框输入”frp-server-IP:10001″,即可进行远程桌面连接。同理也可以通过”frp-server-IP:10002″方式连接到内网 HOST-2 主机的22端口进行 ssh 连接。
至此,就通过使用 frp 的服务端工具和客户端工具实现了内网穿透功能。
3] 将 frpc 添加为 windows 服务
对于 windows 平台,虽然使用简单,但是要求不能关闭应用程序窗口。可以使用 EasyService 工具将 frpc 注册为系统服务,不仅可以后台运行,还能实现开机即运行功能。
下载 EasyService 工具包,会包含一个可执行软件”svc.exe”,创建文件夹”EasyService”,将 svc.exe 移动到该目录,然后创建 frp、worker 和 outfiles 目录,将 frpc.exe 和其配置文件 frpc.toml 移动要 frp 文件夹中。之后创建一个配置文件 svc.conf,内容如下:
ServiceName: Frp Service Worker: frpc.exe -c frpc.toml WorkingDir: frp OutFileDir: outfiles WorkerEncoding: utf8
整体项目结构如下:

图.8 EasyService 工具目录结构
之后,就以使用如下命令检查服务:
d:\> svc check d:\> svc test-worker

图.9 使用 svc 工具添加 windows 服务前检查
如果 frp 可以通过 svc 工具启动成功,就可以使用如下命令将 frp 添加到系统服务了:
d:\> svc install

图.10 使用 EasyService 添加 frpc 客户端至 windows 服务
如果需要重启、停止、删除系统服务,只需要运行以下命令即可:
svc stop /*停止服务*/ svc start /*开始服务*/ svc estart /*重启服务*/ svc remove /*删除服务*/
这样,就可以愉快的使用 frp 并且看不见那个烦人的窗口了。