FRP支持TCP、UDP、HTTP、HTTPS等多种协议,可以将内网服务以安全、便捷的方式通过具有公网IP节点的中转暴露到公网。通过在具有公网IP的节点上部署FRP服务端,可以轻松地将内网服务穿透到公网。
假设一个场景:实验室的服务器(简称主机A)在学校的内网中,ip地址为172.29.31.22
,我在主机A的端口8501
上部署了一个web服务,此时,因为A主机位于学校的NAT后面,我想在外网(学校以外的网络环境)中访问这个服务是做不到了。可巧,我有一台具有公网ip为192.144.236.11
的服务器(简称主机S),我想通过一个软件将S的7901端口映射到A的8501,这样我就可以通过访问192.144.236.11:7901 来访问172.29.31.22:8501上的服务,这个软件就可以是FRP。
下图是一个示意图,当然,你还可以将任意端口做映射,比如将主机A的22号端口映射为S的7922,或者将另一台主机B的22号端口映射为S的7822,需要注意的是映射关系为一对一,S上的端口不能有重复,具体用哪个随意定。
因为A位于内网中,不可能通过S来访问A,只能由A主动请求S才能建立连接,所以frp分为客户端和服务端,服务端程序为frps,客户端程序为frpc,分别对应的配置文件为frps.ini和frpc.ini。
程序下载地址:https://github.com/fatedier/frp/releases
本文分为3个部分,客户端和服务端的环境都为 amd64 Ubuntu18+:
- 配置服务端
- 配置客户端
- 开机自动启动和后台运行设置
一、配置服务端
服务端包括一个可执行程序frps和一个配置文件frps.ini,解压下载的文件能看到还有个frps_full.ini,这里包括了所有的可配置项,我们只需要从中取必要的几条即可,客户端同理。
1.1 配置文件
frps.ini文件内容如下,删除注释,修改XXX部分即可:
[common]
bind_port = 7000 # 服务程序监听的端口
token = XXX # 客户端认证用的token,就是客户端想要连接这个服务器需要知道这个token
# frp还提供了一个web仪表盘,可以查看当前程序的运行情况
dashboard_addr = 0.0.0.0 # 仪表盘的地址,默认是本机
dashboard_port = 7500 # 仪表盘的端口号
dashboard_user = XXX # 访问仪表盘的认证用户
dashboard_pwd = XXX # 访问仪表盘的认证密码
1.2 启动服务
将下载的程序解压后一同放入主机S的/opt/frp
目录下,我的可执行程序路径最终为/opt/frp/frp_0.51.2_linux_amd64/frps
,给可执行程序执行权限
sudo chmod a+x /opt/frp/frp_0.51.2_linux_amd64/frps
,然后使用-c
参数指定配置文件,运行程序/opt/frp/frp_0.51.2_linux_amd64/frps -c /opt/frp/frp_0.51.2_linux_amd64/frps.ini
。
这样,服务端程序就运行成功了。服务端程序不关心映射哪些端口,只要是客户端请求的,服务端都会满足,但是需要注意服务器的端口策略,无论你通过服务商还是自定义规则管理防火墙,都要将服务程序监听端口7000,仪表盘端口7500以及你要映射的端口(比如7901)放开。
二、配置客户端
2.1 配置文件
frpc.ini文件如下:
# common部分配置服务端的信息
[common]
server_addr = 192.144.236.11 # 服务端地址
server_port = 7000 # 服务程序监听端口
# tls_enable配置项用于启用TLS协议加密传输,新版本一定要打开
tls_enable = true
token = XXX # 服务器端前面设置的token
# 下面的每一项是一个映射配置,名称用于区分不同的映射,随意起
# 这里配置了两个映射,第一个是将A的8501映射到了S的7901,第二个是将B的22号端口映射到了S的7822
[user.A.web] # 随意起的名字,建议是 用户.设备.服务
type = tcp # 类型tcp,也可以使用http或者其他,但是要做不同配置
local_ip = 127.0.0.1 # 客户端程序跑在A上,所以是本机地址
local_port = 8501 # 本机服务端口
remote_port = 7901 # 远程要映射的端口,随意指定,个人习惯7开头,第二个数字区分设备,后两位区分服务
[user.B.ssh]
type = tcp
local_ip = 172.29.31.33 # 可以映射别的机器,前提是本机器能访问到
local_port = 22
remote_port = 7822
2.2 启动客户端程序
和服务端一样,不过把frps改成frpc即可。
启动成功提示(内容和路径和行文不同)
至此,端口转发就完成了, 可以试试能否通过192.144.236.11:7901 来访问172.29.31.22:8501上的web服务了。或者访问http://192.144.236.11:7500来查看是否映射成功,如果显示映射成功但是无法访问,基本就是你的服务器端口没放开。
三、开机自启动和后台运行
现在可以使用了,但是必须开着程序运行窗口,而且不会开机启动。个人习惯用tmux跑后台服务,把frp也放到tmux窗口中,然后开机时运行tmux。参考我这两篇文章,文章有点乱,你如果有自己的方法就别看了。
- tmux 入门 https://www.jianshu.com/p/6075c0fd98d9
- tmux 开机启动 https://www.jianshu.com/p/6700fc66adbe
网友评论