本文档前提:
- 有一个拥有外网IP的服务器作为frp服务器端的服务器
- 有一个域名,这个作为frp服务器虽然不是必须的,但是本文档是基于这个前提
- 本文档基于frp服务器和客户端的v0.52.3版本
1 服务器端
1.1 frp官方git
https://github.com/fatedier/frp
1.2 frp官方中文文档
https://gofrp.org/zh-cn/docs/reference/
1.3 docker镜像的例子
1.3.1 服务器端配置文件
- 首先编辑服务器端配置文件frps.toml,本例放在宿主机上/docker_volume/frps/frps.toml
- 目前使用toml作为配置文件,项目名和以前版本的ini有非常大不同,另外toml是强类型的配置文件,字符串要加引号。
- 下面标记的“ ※根据需求自行更改”的地方,请根据实际情况更改。
1 | bindAddr = "0.0.0.0" |
1.3.2 下载和启动docker镜像
官方镜像可能是:fatedier/frps:v0.52.3,说明太少所以不使用。
星星最多的一个snowdreamtech/frps:latest镜像,看了下dockfile,从官方的github下载tar包,然后解压启动。没有多余操作。可以放心使用。
此镜像的git地址:https://github.com/snowdreamtech/frp
1 | docker pull snowdreamtech/frps:latest |
打开防火墙(阿里云的安全策略里的规则也需要添加,下边是系统的防火墙)
- 开放的端口号,更具自己的服务器配置自行更改。
- 目前需要开放服务器端配置的bindPort和tcpmuxHTTPConnectPort的端口。
- vhostHTTPPort的端口后边通过nginx转发,所以不用打开。
- 最终的目标是bindPort和tcpmuxHTTPConnectPort的端口也通过nginx转发。暂没实现。
1 | sudo firewall-cmd --zone=public --add-port=1111/tcp --permanent |
2 DNS配置
2.1 设置A记录
- frp主服务的域名的A记录添加,例frpserver.mydomain.xxx
- subDomainHost的域名的A记录添加,例如*.frp.mydomain.xxx。客户端会作为它的子域名的形式进行访问,例如server1.frp.mydomain.xxx
3 客户端
3.1 客户端例子
3.1.1 老客户端配置
这里是华硕路由器的例子。注意是ini文件的例子。ini和toml的字段名有很大不同,使用时候一定要注意!
- ※根据需求自行更改”的地方,需要根据服务器配置更改。此例子是连接路由器的管理页面。为了安全,可以套一层base64的认证(通过http_user和http_pwd设置)。
- 前提是安装了官改固件或者梅林官改,然后安装frpc的客户端插件
- frpc插件,不要用插件的配置页面,直接选择自定义配置。然后将下面的配置输入。
1 | # frpc configuration |
通过上面subdomain的配置和服务器端的subDomainHost的值连在一起,就是访问此映射的URL
例如此例子就是通过router.frp.mydomain.xxx来访问。 后面nginx的配置的部分,会给*.frp.mydomain.xxx的内容转发给frp
3.1.2 docker镜像客户端的例子
下面是docker的snowdreamtech/frpc:latest镜像的例子。启动和服务器端差不多。此处省略记载。
下边是客户端的配置文件frpc.toml的内容。
1 | # ※根据需求自行更改,服务器端的地址 |
3.1.3 访问方法
- 上面例子的web服务的访问地址
https://healthcheck.frp.mydomain.xxx - 例子中的ssh的访问方式,22是内网机器的ssh端口,2222是服务器配置的tcpmuxHTTPConnectPort的端口,mysshsample是客户端配置的customDomains的名字。
这里需要安装socat工具
1 | ssh -v -o 'proxycommand socat - "PROXY:server.mydomain.xxx:mysshsample:22,proxyport=2222"' ssh_username@mysshsample |
- 例子中,openvpn的访问方式,
从服务器端导出.ovpn文件,服务器端连接方式需要是TCP。然后编辑.ovpen文件。
更改remote,地址是客户端配置的customDomains的名字,端口是局域网的openvpn服务的端口。
追加http-proxy行,地址是frp服务器的域名地址,端口是服务器端配置的tcpmuxHTTPConnectPort的端口号。1
2
3
4
5client
dev tun
proto tcp-client
remote openvpn.mydomain.xxx 1234
http-proxy frpserver.mydomain.xxx 2222
4 nginx配置
1 | server { |
下面是frp管理界面的配置
1 | server { |
5 安全性
从官方文档上来看,v0.50.0 开始,transport.tls.enable 的默认值将会为 true,默认开启 TLS 协议加密。如果 frps 端没有配置证书,则会使用随机生成的证书来加密流量。
如果想用自定义的证书,客户端和服务器都进行验证的话,可以看下边连接。