FRP-高效的内网穿透工具使用手册

详细的配置和介绍,可查阅 FRP 的官方文档,此处只用于记录一下自己日常的使用和配置,全当是个备忘了。方便后面部署新机器的时候,可以直接抄一下配置,省事。

FRP 官方文档及下载:

https://gofrp.org/zh-cn/

基本原理

sequenceDiagram autonumber participant EC as 外网访问者<br/>(External Client) participant TS as 公网中继/隧道服务器<br/>(Tunnel Server) participant NAT as NAT/防火墙 participant IA as 内网代理/客户端<br/>(Agent) participant LS as 本地服务<br/>(127.0.0.1:PORT) Note over IA,NAT: 内网代理主动向公网中继发起连接(穿过 NAT) IA->>TS: 建立控制/数据隧道(持久连接,心跳) TS-->>IA: 鉴权/确认并保持心跳 EC->>TS: 外部访问域名/端口(HTTP/SSH 等) TS->>IA: 控制连接上通知有新请求 TS<<->>IA: 建立/复用数据通道(多路复用) IA->>LS: 将外部请求转发到本地服务 LS-->>IA: 本地服务返回响应 IA-->>TS: 通过隧道回传响应 TS-->>EC: 中继服务器将响应返回给外网访问者 Note over TS,IA: 中继负责鉴权、路由、连接复用与流量转发 Note over NAT: 无需端口映射;因连接由内网向外发起

前期准备

  • 一台能够外网访问的中继服务器(可以是有固定公网 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 之间支持两种身份验证方式,Tokenoidc,默认为 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 也不能重复。

此时网络流量的情况如图:

flowchart TD 外网 -->|域名先被解析到了 VPS 上| VPS VPS -->|端口 22333 被转发到 FRP 应用上| FRPS FRPS -->|流量通过隧道打到客户端上| FRPC FRPC -->| FRPC 把 22333 转发到 3389 上| RDP服务

如果需要访问 HTTP 服务,想要通过域名去访问的话,还需要在 VPS 上做一下反向代理。毕竟域名是被解析到 VPS 上的,而不是直接解析到了内网的机器上,需要在 VPS 上先把域名反向代理到 FRP 的 HTTP 端口上。

如图:把这两个域名都反代到 FRPS 的 vhostHTTPPort 上

这样就可以实现域名直接访问到内网的网站服务上了,此时流量情况如图:

flowchart TD 外网 -->|域名先被解析到了 VPS 上| VPS VPS -->|域名被 Nginx 监听,转发到 FRPS 的 HTTP 服务上| FRPS FRPS -->|流量通过隧道打到客户端上| FRPC FRPC -->| FRPC再访问内网 HTTP 服务| HTTP服务

我用的中继是阿里云的 VPS,之前的因为什么原因我忘了,直接使用 FRP 官方的示例配置是无法连接上的,后面查了资料得知是 TCP、UDP 流量在 VPS 上会有一些什么管控。不过好在 FRP 支持 QUIC 协议,这个协议不会被拦,所以我的示例配置中,用的都是 QUIC 协议。

评论