简介
Frp (Fast reverse proxy)是一种基于多用户tcp/udp端口映射软件,可以帮助用户轻松穿越防火墙,远程连接内网服务器或联网设备。
frp 采用go语言开发。更多的人使用 frp 是为了进行反向代理,满足通过公网服务器访问处于内网的服务,如访问内网web服务,远程ssh内网服务器,远程控制内网NAS等,实现类似花生壳、ngrok等功能。
工作原理
frp 主要由客户端(frpc)和服务端(frps)组成,服务端通常部署在具有公网 IP 的机器上,客户端通常部署在需要穿透的内网服务所在的机器上。内网服务由于没有公网 IP,不能被非局域网内的其他用户访问。隐藏用户通过访问服务端的 frps,由 frp 负责根据请求的端口或其他信息将请求路由到对应的内网机器,从而实现通信。
1、 客户端向Frp服务器发起连接,Frp为客户端分配一对密钥(ID和密钥),用于服务器和客户端之间加密通信,并预分配一个随机映射端口号;
2、 客户端使用分配的端口号和密钥向Frp服务器注册,同时告知需要反向映射那些本地服务;
3、 客户端收到注册成功消息后,Frp服务器主动向客户端发送连接,客户端建立加密的数据通道,从此客户端和Frp服务器之间形成了安全的数据通道;
4、 当外部主机向Frp服务器指定端口发起连接时,Frp服务器将请求转发到内网,客户端收到Frp服务器的内部连接后,会将外部主机的请求转发到服务器进程上;
5、 服务器受到客户端的转发后对外部主机的请求做出反应,并将结果发回给客户端;
6、 客户端收到结果后,将结果通过加密的数据通道发回给Frp服务器,Frp服务器根据请求映射将结果发回给发出请求的外部主机。
以上是典型的Frp反向代理工作原理。Frp有效构建了一个可靠的反向代理系统,可以很容易地对外部主机提供安全可靠的服务。
官方架构图:
VPN与FRP
下面简单画了下VPN与FRP工作方式的区别:
实践操作
以上面右图为拓扑进行操作,其中相关几个节点信息:
节点名称 | IP地址(打码) | 使用程序 |
FRP服务端 | 公:47.*.*.* | frps |
FRP客户端 | 公:218.*.*.* 内:192.168.2.* |
frpc、具体服务 |
用户 | 公:183.*.*.* | 连接工具 |
首先,服务端安装:
下载官方最新程序,编辑配置文件运行即可:
wget https://github.com/fatedier/frp/releases/download/v0.47.0/frp_0.47.0_linux_amd64.tar.gz tar zxf frp_0.47.0_linux_amd64.tar.gz -C /usr/local/ mv /usr/local/frp_0.47.0_linux_amd64/ /usr/local/frp cd /usr/local/frp/ vim frps.ini
[common] bind_port = 7000 dashboard_port = 7500 dashboard_user = admin dashboard_pwd = admin token = ba1f2511fc30423bdbb183fe33f3dd0f log_file = /var/log/frps.log log_level = info log_max_days = 3
Tips:同目录下,也有全配置示例文件。
创建服务,运行:
vim /usr/lib/systemd/system/frps.service
[Unit] Description=FRP Server Daemon [Service] Type=simple AmbientCapabilities=CAP_NET_BIND_SERVICE ExecStart=/usr/local/frp/frps -c /usr/local/frp/frps.ini Restart=always RestartSec=2s User=nobody LimitNOFILE=infinity [Install] WantedBy=multi-user.target
systemctl enable frps systemctl start frps systemctl status frps netstat -nlput | grep frp
通过查看仪表盘7500端口,可以得到服务端运行状态: