Skip to content

NAT 及其穿透

NAT

对称 NAT = 普通 NAT

非对称 NAT = 锥形 NAT

其实锥形 NAT(非对称)是更简单的架构,也就是我们常常设想的那样

路由器将自己的一个端口,和内部 PC 的一个端口绑定

之后,外部可以通过路由器的该端口,直接访问到 PC

对称式 NAT

则上述的映射关系,会取决于内部 PC 访问的外部地址

PC 访问 A 网站,会经过路由器 1 端口,访问 B,则经过路由器 2 端口

映射关系动态变化

这使得 P2P 十分困难

检查你的网路 NAT 情况:

https://www.checkmynat.com/

https://www.whatsmynat.com/ (这网站功能还挺全,包括 UPnP)

**通用即插即用 (UPnP) **允许应用程序自动配置网络设置(例如端口转发),从而简化在线游戏。

其实具体分为:

  • NAT0 :Public 公网 IP
  • NAT1 :完全圆锥形 NAT(Full cone)动态家宽可以达到最优的状态,外网设备可以主动发信息给 NAT1 网络内的设备。
  • NAT2 :受限圆锥形 NAT (Address-Restricted cone)只有内网设备(地址:任意端口)主动发过信息给外网设备,外网设备才能主动连接 NAT2 的该设备的地址(地址:任意端口)
  • NAT3 :端口受限圆锥形 NAT(Port-Restricted Cone )只有内网设备(地址:指定端口)主动发过信息给外网设备,外网设备才能主动连接 NAT3 的该设备的地址(地址:指定端口),限制为通信过的端口
  • NAT4 :对称 NAT(Symmetric)

以上两个概念指,单个 NAT 设备(路由器)的行为模式。而不是你处在的 NAT 的层级

STUN

STUN(Session Traversal Utilities for NAT)的中文意思是“NAT 会话穿越实用工具”。它是一个轻量级的网络协议。

  • 第一步:发现映射地址
    • 客户端向 STUN 服务器发送一个请求:“你好,请告诉我你看到的我的地址是什么?”
    • STUN 服务器收到请求后,会从数据包的 IP 头里提取客户端的源 IP 地址源端口,然后将这个信息封装在一个响应里发回给客户端。
    • 客户端由此得知了自己的公网映射地址 IP1:Port1
  • 第二步:判断 NAT 类型(关键步骤)
    • 客户端会向 STUN 服务器发送另一个请求,但这个请求会要求 STUN 服务器通过一个不同的 IP 地址或端口来回复它。
    • STUN 服务器会照做,从另一个地址 IP2:Port2 回复客户端。
    • 客户端比较两次回复的地址:
      • 如果 IP1:Port1IP2:Port2 完全相同,说明无论客户端和谁通信,NAT 都分配同一个公网端口。这意味着是锥形 NAT
      • 如果 IP1:Port1IP2:Port2 不同,说明客户端与不同的目标通信时,NAT 分配了不同的公网端口。这意味着是对称式 NAT

FRP

Fast Reverse Proxy:快速反向代理

由于 NAT 的存在,外部服务器无法直接访问内部 PC

架构:

一台部署在公网的 FRP 服务器

你自己内网 PC 安装 FRP 服务端

目标:从公司访问家里电脑(IP 为 192.168.1.100)的 SSH 服务(端口 22)。

  1. 建立控制隧道

    • 你家里的 FRP 客户端主动发起连接,连接到你在公网云服务器上部署的 FRP 服务端(例如,服务端 IP 是 1.1.1.1,监听端口是 7000)。
    • 由于这个连接是从内网向外发起的,它完美地符合 NAT 设备的放行规则,NAT 会为其创建一个临时的映射。至此,一条稳定的、由内网客户端维护的控制隧道建立起来了。
  2. 公网访问与流量中转

    • 当你想访问家中 SSH 时,你不再直接连接 192.168.1.100:22(这是不可能的),而是连接** FRP 服务端**的某个特定端口(例如,在服务端配置中,将端口 6000 映射给客户端的 SSH 服务)。
    • 你的连接请求:ssh -p 6000 user@1.1.1.1
    • FRP 服务端在端口 6000 上收到这个请求。
    • 服务端通过已建立的控制隧道,立即通知 FRP 客户端:“有用户想要访问 SSH 服务了!”
    • FRP 客户端于是在家中的电脑上启动一个本地连接,连接到 192.168.1.100:22
    • 最终,服务端和客户端协作,将你的 SSH 请求数据通过隧道转发到内网的 SSH 服务,并将响应数据原路返回给你。对你来说,感觉就像是直接在使用公网服务器上的一个服务一样。

其实 FRP 就相当于一个在公网的代理服务器而已

本质上不是 P2P,而是一个中转

受到公网服务器水管大小的约束