Skip to content

FRP 内网穿透原理

你问到了一个很好的问题:为什么配置了 FRP 之后,就能从外网访问内网中的电脑?这背后涉及 NAT 穿透和反向代理技术。


一、正常情况下为什么无法直接远程连接?

  • 你家中的电脑位于一个内网(局域网),通常通过路由器上网,路由器有一个公网 IP(如 203.0.113.5)。
  • 内网中的电脑使用的是私有 IP(如 192.168.1.100),这些 IP 在互联网上无法直接路由。
  • 当你从外网(比如公司)访问你家电脑时,你只知道路由器的公网 IP,但不知道数据包应该转发给内网中的哪一台设备。
  • 即使你在路由器上设置了端口映射(将公网某端口映射到内网电脑的 3389 端口),也需要你家路由器拥有固定的公网 IP。而大多数家庭宽带没有固定公网 IP,甚至运营商做了 NAT 多层转发(CGNAT),导致你根本没有独立的公网 IP。

因此,直接连接是不可行的。


二、FRP 如何实现内网穿透?

FRP 采用了一种反向代理 + 隧道的技术,不需要在家里的路由器上做任何端口映射,也不要求你有公网 IP。

核心思路:让内网客户端主动连接外网服务器

  • 服务端(frps):部署在一台有公网 IP 的 VPS 上,监听一个固定端口(例如 <YOUR_BIND_PORT>)等待客户端连接。
  • 客户端(frpc):部署在你家中的电脑上,主动向服务端的 <YOUR_BIND_PORT> 端口发起 TCP 连接。

一旦这个连接建立,一条双向的通信隧道就形成了。这条隧道会一直保持打开(通过心跳保活)。

流量转发过程

当你想远程桌面到家中的电脑时:

  1. 你在外网的远程桌面客户端(mstsc)连接 VPS_IP:<YOUR_REMOTE_PORT>
  2. VPS 上的 FRP 服务端已经监听 <YOUR_REMOTE_PORT> 端口。它收到这个连接请求后,会通过之前建立好的隧道,将数据原封不动地转发给家中电脑上的 FRP 客户端。
  3. FRP 客户端收到数据后,连接本机的 127.0.0.1:3389(远程桌面服务),将数据送进去。
  4. 家中电脑的远程桌面服务返回的数据,沿着相反的路径回到你的外网客户端。

整个过程中,你家中的电脑不需要任何入方向的端口开放,所有通信都由 frpc 主动发起出方向连接。


三、关键技术点解释

技术作用
反向代理传统代理是客户端请求服务器,反向代理是服务器主动接收客户端请求后,再转发给内网中的真实服务器。FRP 服务端就是一个反向代理。
TCP 隧道frpc 与 frps 之间建立一条长连接 TCP 隧道。这条隧道可以复用,同时传输多个不同的数据流(比如远程桌面、SSH、Web 等)。
多路复用FRP 支持在一条 TCP 连接上同时传输多个请求(通过 tcpMux),减少多次建连的开销。
加密与压缩FRP 支持对隧道中的数据进行加密(use_encryption)和压缩(use_compression),提高安全性和传输效率。
心跳保活frpc 会定期发送心跳包给 frps,如果连接断开,frpc 会自动重连,保证隧道持久可用。

四、为什么不需要公网 IP 就能远程连接?

  • 因为 TCP 连接是由内网主动发起的,路由器会记录这个连接(NAT 会话表),当服务端有数据返回时,路由器会自动将数据包转发给内网中发起连接的电脑。
  • 这就像你主动打电话给一个人,对方回拨给你,你不需要在电话交换机上设置任何呼叫转移。

五、与你实际使用的对应关系

  • VPS 上的 frps:监听 <YOUR_BIND_PORT>(控制端口)和 <YOUR_REMOTE_PORT>(远程桌面映射端口)。
  • 家中电脑的 frpc:连接到 VPS 的 <YOUR_BIND_PORT>,并告诉服务端:“请将发送到 <YOUR_REMOTE_PORT> 的流量全部转给我,我会把它送到本机的 3389 端口”。
  • 远程连接:你运行 mstsc,输入 <YOUR_VPS_IP>:<YOUR_REMOTE_PORT>,连接请求到达 VPS 的 <YOUR_REMOTE_PORT>,VPS 通过隧道转发给家中电脑的 frpc,frpc 再交给本机的远程桌面服务。

六、总结一句话

FRP 让内网中的电脑主动向有公网 IP 的服务器建立一个隧道,然后服务器将外部用户的请求通过这个隧道反向转发到内网电脑,从而绕过了 NAT 和防火墙的限制,实现了内网穿透。

你可以把 FRP 想象成一条“电话专线”:你的电脑先拨通了 VPS(主动外呼),然后外网用户拨打 VPS 上的某个分机号,VPS 就通过已经接通的那条专线把声音传给你。

希望这个解释能帮你理解背后的原理。如果还有不清楚的地方,欢迎继续提问!

Powered by VitePress