目录

如何使用 frp 内网穿透

frp 是一个基于 Go 语言开发的专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。frp 上手难度低,配置起来并不算困难。

Github:https://github.com/fatedier/frp

官网:https://gofrp.org

通过在具有公网 IP 的节点上部署 frp 服务端,可以轻松地将内网服务穿透到公网。前提是,内网能访问外网。而不是像特殊单位的纯内网环境,不允许访问外网。

举几个经典的应用场景:

  • 开发人员在家办公,需要连接公司内网,进服务器 shell 调试 / 部署;
  • 开发人员联调时,需要给外网提供部署在本地的 web 服务;
  • 出差过程中,需要连接公司内网,登录内部系统审批流程;
  • 访问家庭 NAS 服务器。

本文以服务端 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 运行客户端

/post_images/863a9fdd2dd85.png

1)web 服务访问测试

访问 http://xxx.keyboardman.fun:8080,frp 服务端会将请求代理至本地的 5500 端口。

/post_images/922f5d757bfe6.png

2)socket 消息测试

/post_images/f28f1d8fd4438.png

SSH 测试就不演示了,在本机上有搭建 VMware,使用 nat 转发即可把本机的 22 端口 tcp 流量转发到目标虚拟机的 22 端口去,也就是远程 SSH 连接公司内网的应用场景了。

远程连接时,IP 填 frp 服务端所在的 IP,端口填 6000,可以回头看一下上文 frp 服务端的配置,其中 ssh 项的监听端口我选择的就是 6000。

REF

https://zhuanlan.zhihu.com/p/129076009