FRP-高效的内网穿透工具使用手册
详细的配置和介绍,可查阅 FRP 的官方文档,此处只用于记录一下自己日常的使用和配置,全当是个备忘了。方便后面部署新机器的时候,可以直接抄一下配置,省事。
FRP 官方文档及下载:
https://gofrp.org/zh-cn/
基本原理
前期准备
一台能够外网访问的中继服务器(可以是有固定公网 IP 的电脑,或直接买一台 VPS)
一个部署了网络服务或其他服务的内网电脑(需要能连上外网)
内网穿透首先需要有一个能够使用外网访问的主机,通常直接使用 VPS 作为这个中继服务器来使用,并在中继服务器上安装 FRPS(FRP 服务端),内网服务通过 FRPC(FRP 客户端)与中继服务器建立并保持连接。
外部的请求首先会打到中继服务器上,通过规则的匹配,中继服务器会将对应的网络请求再转发到内网服务上。 所有的流量其实都是需要经过中继服务器的,我的使用场景基本都是用来映射内网电脑的远程桌面,实际使用下来 5Mbps 的带宽体验最好,性价比也合适。
FRPS配置
中继服务器上,可以直接安装 FRPS 应用并通过配置文件配置好相关参数。也可以通过 1Panel 面板直接部署,我一般直接使用面板进行部署,这样方便后面进行版本管理和维护。
服务端需要设置以下内容:
服务端口(bindPort 和 quicBindPort):用于监听客户端的端口,客户端的配置中需要与服务端的这个端口对应,如果用 TCP 和 UDP,则写
bindPort,如果用 QUIC,则写quicBindPort。这个根据客户端的配置来定HTTP 服务端口(vhostHTTPPort):用于监听客户端的 HTTP 服务,就算部署多个网站服务也都是用的同一个端口
HTTPS 服务端口(vhostHTTPSPort):
Dashboard 端口(WebServer.port):网页面板的端口,只用于进入面板,跟客户端的连接是没有关联的
用户名(webServer.user):进入 Dashboard 的用户名
密码(webServer.password):进入 Dashboard 的用户密码
密钥:客户端需要通过这个密钥与服务端进行鉴权,只有当 FRPS 设置的身份认证方式是
Token时才有效
目前 frpc 和 frps 之间支持两种身份验证方式,
Token和oidc,默认为Token
我的配置
quicBindPort = 12345
vhostHTTPPort = 12346
vhostHTTPSPort = 12347
subDomainHost = "中继服务器的域名,配合客户端的配置可以实现自定义二级域名"
[auth]
method = "token"
token = "自己设置一个 Token"
[log]
to = "/opt/1panel/apps/frps/frps/data/log/run.log"
maxDays = 3
level = "info"
[webServer]
addr = "0.0.0.0"
port = 12348
user = "自己写一个用户名"
password = "自己写一个密码"FRPC配置
服务端配置好后,就要给客户端进行配置了,客户端需要配置以下的内容:
中继服务器的地址(serverAddr):可以写 IP,也可以写域名
中继服务器的端口(serverPort):要跟服务端配置的
quicBindPort保持一致身份认证(auth):method 要写跟服务端的一致,如果使用
Token方式,那么需要保证Token与服务端的一致协议类型(transport.protocol):如果用 TCP/UDP,可以不写这一块,但是我用的是 QUIC,所以需要写一下协议类型。并且 FRPS 中配置的服务端口也是quicBindPort
代理(proxies):多个代理可以写多条,可以直接参考我的配置
其中二级域名的配置有两种方式:
自定义二级域名:使用 customDomains 来配置,写成字符串列表的形式
使用 subDomainHost和 subdomain 来定义二级域名:不需要写其他字段,直接通过 proxies.subdomain 和服务端配置的 subDomainHost 访问
我的配置
loginFailExit = true
udpPacketSize = 1500
serverAddr = "可以写 IP,也可以写域名"
serverPort = 12345 # 要跟服务端配置的监听端口一致
[auth]
method = "token"
token = "确保和服务端配置的 Token 一致"
[log]
to = "D:\\Program Files\\Frp\\run.log"
maxDays = 3
level = "info"
[transport]
poolCount = 0
tcpMux = true
protocol = "quic"
[[proxies]]
name = "website1" # 全局唯一,同一个FRPS 上注册的 name 不能有重复的
type = "http" # 网络服务可以用 HTTP,配合 Nginx 可以实现域名直接访问
localIP = "127.0.0.1" # 本地访问的IP,如果是需要通过这台机器再访问到内网其他的服务上,这里就应该要填对应的内网IP
localPort = 8000 # 本地访问的端口
customDomains = ["aaa.bbb.com"] # 自定义二级域名的方式
[proxies.transport]
useEncryption = true # 启用加密
useCompression = true # 启用流量压缩
[[proxies]]
name = "rdp1" # 这是个 Windows 远程桌面的示例
type = "tcp" # 远程桌面需要使用 TCP
localIP = "127.0.0.1"
localPort = 3389 # 本机远程桌面端口
remotePort = 22333 # 这个端口需要在服务端的防火墙放通,到时候访问服务端 IP:这个端口,就能访问到远程桌面
[proxies.transport]
useEncryption = true
useCompression = true
[[proxies]]
name = "website2" # 这是个不使用自定义二级域名的 HTTP 服务示例
type = "http"
localIP = "127.0.0.1"
localPort = 3000
subdomain = "自己写个域名" # 这里只写二级域名,不用写后面那一段,比如tieba.baidu.com,这里只需要写tieba
[proxies.transport]
useEncryption = true
useCompression = true最终效果
在以上配置中,如果需要访问远程桌面,那么只需要访问:中继服务器的IP或域名:客户端配置中的remotePort。

如果你有多台电脑都需要把远程桌面给放出去,那么每台电脑都需要配置一份 FRP 客户端,并且 name 不能重复,remotePort 也不能重复。
此时网络流量的情况如图:
如果需要访问 HTTP 服务,想要通过域名去访问的话,还需要在 VPS 上做一下反向代理。毕竟域名是被解析到 VPS 上的,而不是直接解析到了内网的机器上,需要在 VPS 上先把域名反向代理到 FRP 的 HTTP 端口上。
如图:把这两个域名都反代到 FRPS 的 vhostHTTPPort 上


这样就可以实现域名直接访问到内网的网站服务上了,此时流量情况如图:
坑
我用的中继是阿里云的 VPS,之前的因为什么原因我忘了,直接使用 FRP 官方的示例配置是无法连接上的,后面查了资料得知是 TCP、UDP 流量在 VPS 上会有一些什么管控。不过好在 FRP 支持 QUIC 协议,这个协议不会被拦,所以我的示例配置中,用的都是 QUIC 协议。
评论