Skip to main content

使用frp进行内网穿透

· 5 min read

1. 什么是frp

frp是一个快速反向代理,可帮助您将NAT或防火墙后面的本地服务器暴露到互联网。它支持多种协议,包括TCP、UDP、HTTP、HTTPS等,并且可以通过自定义域名访问您的服务。

是一个GitHub上的开源项目,地址是:https://github.com/fatedier/frp

2. frp的工作原理

frp的工作原理非常简单,它通过客户端和服务端之间的通信来实现内网穿透。客户端将本地服务的流量发送到服务端,服务端将流量转发到目标服务器,从而实现内网穿透。

alt text

3. 如何使用frp

要使用frp进行内网穿透,您需要在本地服务器和目标服务器上分别安装frp客户端和服务端。然后,您需要配置frp客户端和服务端的配置文件,以便它们能够正确地通信。 frp是开源的,您可以从GitHub上下载最新的frp二进制文件,也可以从frp的官方网站下载预编译的二进制文件。

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

在下载frp之后,您需要解压缩文件,并将frpc和frps二进制文件复制到您的服务器上。然后,您需要创建一个配置文件,以便frp客户端和服务端能够正确地通信。

tip

要注意的是,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

其中:

  • serverAddrserverPort是frp服务端的地址和端口;
  • auth.token是frp服务端配置文件中的auth.token
  • proxies是要代理的服务;
  • name是服务的名称;
  • type是服务的类型,要与用户端的服务类型一致;
  • localIPlocalPort 被连接的本地服务的地址和端口;

启动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

配置说明:

  • serverAddrserverPort是frp服务端的地址和端口;
  • auth.token是frp服务端配置文件中的auth.token
  • visitors是要访问的服务;
  • name是服务的名称,可以任意取名;
  • type是服务的类型,与发布的服务类型一致;
  • serverName是发布服务的名称,与发布服务的name一致;
  • secretKey是发布服务的secretKey,与发布服务的secretKey一致;
  • bindAddrbindPort是本地绑定的地址和端口,可以是任意的地址和端口,用户端软件使用这个地址和端口访问发布的服务。这里是连接到发布的3389端口,远程桌面服务。

启动frpc客户端:

./frpc.exe -c frpc.toml

也可以使用winsw将frpc设置为windows服务,方法与发布服务的设置相同。

4. 使用客户端连接服务

将上述3个服务端和客户端配置文件分别放到对应的服务器上,启动服务端和客户端,即可实现内网穿透。

在连接服务的客户端上,使用远程桌面软件,连接到 127.0.0.1:6000,即可连接到发布的3389端口。

alt text

用一个图来总结一下

alt text