本篇博客介绍了在使用 FRP 进行内网穿透时,如何在一台客户端上配置多台服务器,实现通过不同的服务器访问同一台客户端。
-
本篇博客建立在已经使用 FRP 实现通过一台服务器范围一台客户端的基础上,不会从头开始对如何配置 FRP 实现内网穿透进行介绍。有需要这方面的同学可以参考下面这篇文章:【计算机网络相关】内网穿透介绍以及使用FRP实现内网穿透Windows远程桌面_frp内网穿透-CSDN博客
-
本篇博客使用的 FRP 版本为 0.51.0 (下载链接);使用 winsw 软件进行 windows 服务注册 (下载链接)。
一、服务器端配置
在服务器端,我们不需要进行额外的配置,因为都是连接到同一台客户端。因此,我们只需要将在之前服务器上配置好的配置文件直接复制粘贴到需要新添加的服务器上,然后运行 frps 即可。
二、客户端配置
客户端的配置是主要的工作。我们已经配置好的客户端文件如下:
因为是配置客户端的内容,所以只需要对 frpc.ini 进行配置。
-
首先,我们需要对不同的服务器创建独立的 frpc.ini 文件。例如我们有编号为1和2的两台服务器,我们就需要创建 frpc-1.ini, frpc-2.ini 两个不同的配置文件。
frpc-1.ini 的配置示例:[common]server_addr = ip1 # 服务器公网ip,例如1.1.1.1server_port = 7000 # 用于frp服务客户端和服务端通讯的端口,需要再服务器防火墙设置里面放行该端口,例如:7000,需要与服务端bind_port保持一致。auto_token = Ba9SI3do718tCwu67V0qk4l5iNG6sAm1DJYzUO8TZxF9y6c52g0K4XLRQfjeW4bn #用于加密的token 可以使用强密码生成器(http://www.wetools.com/password-generator)生成一个64位强密码。例如:Ba9SI3do718tCwu67V0qk4l5iNG6sAm1DJYzUO8TZxF9y6c52g0K4XLRQfjeW4bn,需要与服务端auto_token保持一致。[ssh_1] #内穿穿透的连接名称,可以自定义,如ssh。type = tcp # 链接协议类型,如tcp,http等,具体需要依据穿透的服务进行设置。local_ip = 127.0.0.1 #本地ip,一般是127.0.0.1local_port = 3389 # 本地连接的端口,如内网穿透ssh远程连接,就是22端口,Windows远程桌面是3389端口,具体的需要根据服务类型进行设置。remote_port = 7001 # 用于frp服务客户端和服务端通讯的端口,需要再服务器防火墙设置里面放行该端口,例如:7000,这个端口不能与服务端bind_port设置成同一个,且每一个内网穿透均需要单独设置一个remote_port。
frpc-2.ini 的配置示例:
[common]server_addr = ip2 # 服务器公网ip,例如1.1.1.1server_port = 7000 # 用于frp服务客户端和服务端通讯的端口,需要再服务器防火墙设置里面放行该端口,例如:7000,需要与服务端bind_port保持一致。auto_token = Ba9SI3do718tCwu67V0qk4l5iNG6sAm1DJYzUO8TZxF9y6c52g0K4XLRQfjeW4bn #用于加密的token 可以使用强密码生成器(http://www.wetools.com/password-generator)生成一个64位强密码。例如:Ba9SI3do718tCwu67V0qk4l5iNG6sAm1DJYzUO8TZxF9y6c52g0K4XLRQfjeW4bn,需要与服务端auto_token保持一致。[ssh_2] # 内穿穿透的连接名称,可以自定义,如ssh。type = tcp # 链接协议类型,如tcp,http等,具体需要依据穿透的服务进行设置。local_ip = 127.0.0.1 #本地ip,一般是127.0.0.1local_port = 3389 # 本地连接的端口,如内网穿透ssh远程连接,就是22端口,Windows远程桌面是3389端口,具体的需要根据服务类型进行设置。remote_port = 7002 # 用于frp服务客户端和服务端通讯的端口,需要再服务器防火墙设置里面放行该端口,例如:7000,这个端口不能与服务端bind_port设置成同一个,且每一个内网穿透均需要单独设置一个remote_port。
可以看到,两个配置文件的主要区别就是 remote_port 不同。
-
然后,打开cmd,进入 frp 软件所在路径,运行以下命令即可分别运行两个服务。
frpc.exe -c frpc-1.inifrpc.exe -c frpc-2.ini
-
之后便可通过 windows 远程桌面连接,使用 server_addr: remote_port 通过不同服务器连接上同一台客户端。
三、使用 winsw 注册多个 FRP 服务为 windows 自启动服务
winsw 不支持在同一个 winsw.xml 配置文件中配置多个服务项,且在运行时,winsw.exe 只能识别与自己同名的 xml文件,即 winsw.exe 只认 winsw.xml,winsw-1.exe 只认 winsw-1.xml,且无法指定 xml 文件的路径。经测试,若配置多个服务项,它也只会识别第一个服务,因此需要为不同的服务创建不同的 xml 配置文件。
-
首先,为每个 frp 服务创建一个 xml 配置文件。
frpc1 服务的 winsw-1.xml 配置示例:
<service> <id>frp-1</id> <name>frp-1服务</name> <description>frp-1内网穿透服务</description> <executable>frpc</executable> <arguments>-c frpc-1.ini</arguments> <onfailure action="restart" delay="60 sec"/> <onfailure action="restart" delay="120 sec"/> <logmode>reset</logmode></service>
frpc2 服务的 winsw-2.xml 配置示例:
<service> <id>frp-2</id> <name>frp-2服务</name> <description>frp-2内网穿透服务</description> <executable>frpc</executable> <arguments>-c frpc-2.ini</arguments> <onfailure action="restart" delay="60 sec"/> <onfailure action="restart" delay="120 sec"/> <logmode>reset</logmode></service>
两个配置文件的主要区别在于:
1. 文件名不同;2. 服务的 id, name 和 arguments 不同,arguments 中对应于 服务的 .ini 文件,id 和 name 是唯一标识符,不能相同。
然后,我们需要复制 winsw.exe 文件,并将其分别命名为 winsw-1.exe 和 winsw-2.exe。
-
接下来进行服务的注册和启动。打开cmd,进入 winsw.exe 所在路径(与 frp 软件同目录下),运行以下命令:
# 注册 frpc1 服务./winsw-1.exe install# 运行 frpc1 服务./winsw-1.exe start# 注册 frpc2 服务./winsw-2.exe install# 运行 frpc2 服务./winsw-2.exe start
若是要注销服务,则运行:
./winsw-1.exe stop./winsw-1.exe uninstall./winsw-2.exe stop./winsw-2.exe uninstall
-
到这里,我们已经完成了将多个 frp 服务注册为 windows 自启动服务了。但是,只做到这一步的话,在你的客户端重启后,可能会出现服务没有自动启动的情况,因为在 windows 刚启动的时候客户端还没连上网,此时启动服务会因为客户端连接服务器失败而导致服务启动失败。
因此,我们还需要在 windows 的服务项中将注册好的 frp 服务启动类型设置为
自动(延迟启动)
,等其他的服务项运行完成后再启动 frp 服务。
四、Windows 远程桌面连接时目标客户端断开 WIFI连接解决办法
运行 frp 服务后,在连接目标客户端时会有概率出现目标客户端的 WIFI 自动断开导致远程连接失败的情况。这个问题需要在目标客户端的 WIFI 属性配置中解决。
在进入要连接的 WIFI 的 高级 WIFI 网络属性
后勾选上即使网络未广播其名称也连接
和 为此网络启用单一登录
,指定身份验证模式选择用户或计算机身份验证
。确定后,重新输入 WIFI 的用户名和密码即可。
更详细的步骤可参考:windows远程桌面一连接就断网,会是什么原因?
2024.01.30更新:
最近使用远程连接,发现又发生目标客户端自动断开 WIFI 的情况,原来的方式不好使了,所以又上网找了其他的方式尝试,下面是能够奏效的方法:
前面的步骤是一样的,在高级指定身份验证模式选择用户身份验证
,并点击保存凭据
,然后重新输入 WIFI 的用户名和密码即可。