frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
Github:https://github.com/fatedier/frp
通过在具有公网 IP 的节点上部署 frp 服务端,可以轻松地将内网服务穿透到公网。前提是,内网能访问外网。而不是像特殊单位的纯内网环境,不允许访问外网。
内网穿透有几个经典的应用场景:
- 开发人员在家办公,需要连接公司内网,进服务器shell调试/部署;
- 开发人员联调时,需要给外网提供部署在本地的web服务;
- 出差过程中,需要连接公司内网,登录内部系统审批流程;
- 访问家庭NAS服务器。
frp是基于Go语言开发的,上手难度低,配置起来并不算困难。
本文以服务端centos7,客户端windows为例进行演示说明。
一、下载最新版本的frp到服务器
下载页面:https://github.com/fatedier/frp/releases
根据自己的服务器架构,选择对应发行版本的文件下载。一般都是x86架构,下linux_amd64.tar.gz结尾的版本就可以。
当前最新版本是:0.34.3。
下载到/root目录:
cd /root && wget https://github.com/fatedier/frp/releases/download/v0.34.3/frp_0.34.3_linux_amd64.tar.gz
解压到/usr/local下,重命名文件夹为frp:
tar -zxvf frp_0.34.3_linux_amd64.tar.gz --directory=/usr/local/ && mv frp_0.34.3_linux_amd64 frp
二、配置frp systemd服务
#创建systemd服务文件 vim /usr/lib/systemd/system/frp.service #写入以下内容,退出并保存 [Unit] Description=The nginx HTTP and reverse proxy server After=network.target remote-fs.target nss-lookup.target [Service] Type=simple ExecStart=/usr/local/frp/frps -c /usr/local/frp/frps.ini KillSignal=SIGQUIT TimeoutStopSec=5 KillMode=process PrivateTmp=true StandardOutput=syslog StandardError=inherit [Install] WantedBy=multi-user.target
重载配置文件,使之立即生效。
systemctl daemon-reload
systemctl命令:
systemctl start frp #启动 systemctl stop frp #关闭 systemctl restart frp #重启 systemctl status frp #当前状态 systemctl enable frp #开机自启动 systemctl disable frp #取消开机自启动
三、修改frp服务端配置
#修改frp服务端配置文件 vim /usr/local/frp/frps.ini #按照以下内容配置,保存并退出 [common] bind_port = 7000 #frp服务端端口 vhost_http_port = 8080 #http访问端口 [web] #[]中的内容可以自己随便起,但不允许重复,只是起备注的功能而已。 type = http #服务类型,可以设为http,https custom_domains = xxx.keyboardman.fun #公网域名,记得域名的A记录要解析到外网主机的IP。 auth_token = 123456789 [ssh] #监听6000端口,外网SSH连接内网机器时,填写的IP即为frp服务端的IP和此处设定的6000端口。 listen_port = 6000 auth_token = 123456789 [tcp] #监听10889端口,转发消息给客户端。 listen_port = 10889 auth_token = 123456789
修改完frp服务端的配置文件后,需要检查服务器端口是否开放,上面的配置文件用到了6000/7000/8080/10089这4个端口。
重启frp服务端
systemctl restart frp
web配置项用于向外网提供本地web服务、ssh配置项用于连接本地虚拟机的shell、tcp配置项用于转发10889端口消息给本机。
需要注意的是,以上配置中,web/ssh/tcp的字眼并非是标准语法,而是我起的一个备注而已。
四、下载最新版本的frp到本机
同样的,在Github的release页面下载对应版本的frp:https://github.com/fatedier/frp/releases
本机是windows,因此下载windows_amd64.zip版本即可。
下载地址:https://github.com/fatedier/frp/releases/download/v0.34.3/frp_0.34.3_windows_amd64.zip
五、配置客户端参数
解压后进入目录,修改frpc.ini为如下内容:
[common] server_addr = xx.xx.xx.xx #部署frp服务端的IP地址 server_port = 7000 #frp服务端的端口 privilege_token = 123456789 #验证token/密码 [web] type = http local_ip = 127.0.0.1 local_port = 5500 #web服务本地端口 remote_port = 8080 #frp服务端HTTP端口 custom_domains = xxx.keyboardman.fun #反代域名 #将远程6000端口的tcp流量转发到本地的22端口 [ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 6000 #将远程10889端口的tcp流量转发到本地的10889端口 [tcp] type = tcp local_ip = 127.0.0.1 local_port = 10889 remote_port = 10889
此处的web项配置意为:frp服务端会把访问xxx.keyboardman.fun:8080端口的请求代理至本地的5500端口。
ssh项:将服务端6000端口的tcp流量转发至本地的22端口
tcp项:将服务端10889端口的tcp流量转发至本地的10889端口
六、运行本机上运行frp客户端并测试效果
打开cmd,cd到frp的目录下,frpc.exe运行客户端
1)web服务访问测试
访问http://xxx.keyboardman.fun:8080,frp服务端会将请求代理至本地的5500端口。
2)socket消息测试
SSH测试就不演示了,在本机上有搭建VMware,使用nat转发即可把本机的22端口tcp流量转发到目标虚拟机的22端口去,也就是远程SSH连接公司内网的应用场景了。
远程连接时,IP填frp服务端所在的IP,端口填6000,可以回头看一下上文frp服务端的配置,其中ssh项的监听端口我选择的就是6000。
REF:
https://zhuanlan.zhihu.com/p/129076009