使用frp进行内网穿透
1. 什么是frp
frp是一个快速反向代理,可帮助您将NAT或防火墙后面的本地服务器暴露到互联网。它支持多种协议,包括TCP、UDP、HTTP、HTTPS等,并且可以通过自定义域名访问您的服务。
是一个GitHub上的开源项目,地址是:https://github.com/fatedier/frp
2. frp的工作原理
frp的工作原理非常简单,它通过客户端和服务端之间的通信来实现内网穿透。客户端将本地服务的流量发送到服务端,服务端将流量转发到目标服务器,从而实现内网穿透。

3. 如何使用frp
要使用frp进行内网穿透,您需要在本地服务器和目标服务器上分别安装frp客户端和服务端。然后,您需要配置frp客户端和服务端的配置文件,以便它们能够正确地通信。 frp是开源的,您可以从GitHub上下载最新的frp二进制文件,也可以从frp的官方网站下载预编译的二进制文件。
https://github.com/fatedier/frp/releases
在下载frp 之后,您需要解压缩文件,并将frpc和frps二进制文件复制到您的服务器上。然后,您需要创建一个配置文件,以便frp客户端和服务端能够正确地通信。
要注意的是,frp因为是有风险的网络操作,会被杀毒软件误报,请在安装前关闭杀毒软件。并且需要在杀毒软件中将frp加入白名单。
3.1. 安装frps服务端
服务器配置文件示例:
# frps.toml
bindPort = 7000
auth.token = "eUH4K344Q7jY3Q8h1bRP3NkYBBVvHs7BmC5i5XA"
在服务器上使用命令行启动frps服务端:
./frps -c frps.toml
可以将frps服务端设置为开机自启动,以便在服务器重启后自动启动。
在/etc/systemd/system/frps.service中添加以下内容:
[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target
[Service]
Type = simple
User=frp
# 启动frps的命令,需修改为您的frps的安装路径
ExecStart = /opt/frp/frps -c /opt/frp/frps.toml
[Install]
WantedBy = multi-user.target
使用以下命令管理frps服务:
# 启动服务
systemctl start frps
# 停止服务
systemctl stop frps
# 重启服务
systemctl restart frps
# 查看服务状态
systemctl status frps
# 设置开机自启动
systemctl enable frps
3.2. 安装frpc客户端(发布服务)
客户端支持的协议很多,包括TCP、UDP、HTTP、HTTPS等,您可以根据需要选择合适的协议进行配置。
这里以xtcp协议为例,给出一个客户端配置文件示例, 这个配置文件将本地3389端口的RDP服务映射到互联网上:
# frpc.toml
serverAddr = "new.baca.org.cn"
serverPort = 7000
auth.token = "eUH4K344Q7jY3Q8h1bRP3NkYBBVvHs7BmC5i5XA"
[[proxies]]
name = "office"
type = "xtcp"
localIP = "127.0.0.1"
secretKey="99ioHhY0oz7gqQ1isAq"
localPort = 3389
其中:
serverAddr和serverPort是frp服务端的地址和端口;auth.token是frp服务端配置文件中的auth.token;proxies是要代理的服务;name是服务的名称;type是服务的类型,要与用户端的服务类型一致;localIP和localPort被连接的本地服务的地址和端口;
启动frpc客户端:
./frpc.exe -c frpc.toml
这是手动启动的方式,显然不够优雅,我们可以将其设置为开机自启动的服务。
可以利用另外一个开源项目将frpc设置为windows服务,这个项目是winsw,地址是:https://github.com/winsw/winsw
下载 winsw,得到文件WinSW-x64.exe,在同一目录下创建一个xml文件,文件名与exe文件名相同,只是后缀为xml,比如WinSW-x64.xml,内容如下:
<?xml version="1.0" ?>
<service>
<id>frpc</id>
<description>frpc.exe</description>
<executable>/opt/frp/frpc.exe</executable>
<log mode="roll-by-size">
<keepFiles>4</keepFiles>
<sizeThreshold>262144</sizeThreshold>
</log>
<name>frpc</name>
<onfailure action="restart" delay="1 sec"/>
<onfailure action="restart" delay="1 sec"/>
<onfailure action="restart" delay="1 sec"/>
<resetfailure>1 min</resetfailure>
<startarguments>-c /opt/frp/frpc.toml</startarguments>
</service>
使用如下命令管理服务:
# 安装服务
WinSW-x64.exe install
# 启动服务
WinSW-x64.exe start
# 停止服务
WinSW-x64.exe stop
可以查看同一个目录下的日志文件,查看服务的运行情况。
3.3. 安装frpc客户端(连接服务)
远端服务端配置文件示例,远端作为客户端连接到发布的服务:
# frpc.toml
serverAddr = "new.baca.org.cn"
serverPort = 7000
auth.token = "eUH4K344Q7jY3Q8h1bRP3NkYBBVvHs7BmC5i5XA"
[[visitors]]
name = "office_visitor"
type = "xtcp"
serverName = "office"
secretKey = "99ioHhY0oz7gqQ1isAq"
bindAddr = "127.0.0.1"
bindPort = 6000
配置说明:
serverAddr和serverPort是frp服务端的地址和端口;auth.token是frp服务端配置文件中的auth.token;visitors是要访问的服务;name是服务的名称,可以任意取名;type是服务的类型,与发布的服务类型一致;serverName是发布服务的名称,与发布服务的name一致;secretKey是发布服务的secretKey,与发布服务的secretKey一致;bindAddr和bindPort是本地绑定的地址和端口,可以是任意的地址和端口,用户端软件使用这个地址和端口访问发布的服务。这里是连接到发布的3389端口,远程桌面服务。
启动frpc客户端:
./frpc.exe -c frpc.toml
也可以使用winsw将frpc设置为windows服 务,方法与发布服务的设置相同。
4. 使用客户端连接服务
将上述3个服务端和客户端配置文件分别放到对应的服务器上,启动服务端和客户端,即可实现内网穿透。
在连接服务的客户端上,使用远程桌面软件,连接到 127.0.0.1:6000,即可连接到发布的3389端口。

用一个图来总结一下

