关于 NAT

之前对于 NAT 有一个错误认识,认为所有 NAT 都为 Full-Cone ( 全锥 ) 类型。后来学习了 NAT 分类,才知道打洞能否成功与打洞双方 NAT 类型有关。此外,使用 zerotier 组网时,通过 peers 命令查得的连接方式始终与传输大文件时带宽的直观感受不相匹配,也是一直疑惑的问题之一。

本文对以上问题进行大致梳理。

NAT 分类

根据形状和防火墙策略,将 NAT 分类如下。

表格

其中,NAT3-NAT4 / NAT4-NAT4 一般不能打洞[1]。遗憾的是,国内光猫多数使用 NAT4,一些路由器 ( 如华为 WS5200 ) 也为 NAT4 且不提供修改选项。光猫 NAT 和防火墙策略的修改需要进超级后台,可行性较低。对于 WS5200 这种路由器,可配置性有限[2] [3],比如光猫桥接后在路由器中设一台 DMZ 主机,则通过这种方式实现 NAT0。

端口映射

防火墙可以配置端口映射规则,将特定外部端口的流量映射到内部网络中的某个特定端口上。映射规则可以优先于防火墙对端口的限制而生效。因此,即便对于两个 NAT4 LAN,通过同时在两侧为穿透程序配置端口映射,也能够实现点对点直连。映射后的端口相当于 NAT0。

这对于 zerotier 很友好,因为 zerotier 有一个固定的握手端口 TCP 9993,并推测可使用该端口进行通信 ( 有一些 UDP 9993 的 Socket 连接 )。对于皎月连,只有服务端口是固定的 ( TCP 33272 ),握手和通信端口都是随机端口,因此难以手动映射。

什么是 DMZ 主机

DMZ ( Demilitarized Zone,缓冲区 ) 是内外网之间的一个特殊机器,该主机端口全映射到路由设备端口。

不要混淆 DMZ 与堡垒机。

UPnP

UPnP ( Universial Plugin and Play,通用即插即用 )

UPnP 的开启需要光猫 / 路由器 / PC 三方同时开启 UPnP 功能。允许程序动态地创建一些端口映射。不排除 zerotier 的 UDP 端口是靠 UPnP 创建。

光猫的 UPnP 固件可能存在一些问题

关于公网

光猫改桥接模式并不意味着能够通过路由器拨号获取公网 ip。即便少了光猫路由模式下的 NAT,由路由器拨号获得的地址仍可能处在运营商级 NAT 下 ( 如 100.xx 一类大内网地址 )。

如果想要 DDNS,则仍然需要申请公网或者使用 ipv6。但如果只有 p2p 打洞的需求,由于 CGNAT 一般为 NAT1,一个桥接模式的光猫已经足够。

穿透工具

Zerotier

使用 NatTypeTester[4] 测试网络类型,电信家宽为 Symmetric ( NAT4 )。无论校园网是 NAT3 还是 NAT4,都应该无法打洞。为什么 peers 显示的连接方式为 DIRECT 呢?

之前捕获物理网卡并过滤 ipv4 地址时,虽能抓到一些 UDP 通信,但数量极少。而两侧主机都已开启 ipv6 并且分到了公网 ipv6 地址,尝试过滤 ipv6 地址,抓到大量 zerotier 端口下的数据包。所以结论是,zerotier 实际上采用了 ipv6 通信,由于 ipv6 没有 NAT,即使存在防火墙,两侧也能成功打洞。

至于带宽只有 7Mbps,可能是 QoS 的原因。在某次测试中跑到了惊人的 50Mbps / 20Mbps ( 因为家宽上行限速 30 ),这份快乐只存在了极短时间,后面就跌回了日常速度。

Zerotier 分别在每一张可用网卡上创建连接。

Q: 校内打洞失败

这个可能有多个成因,比如 ipv6 被忽略了,强制用 ipv4 打洞,或 ipv6 只有 被访问权限,导致校内两台机器无法打洞。

Alter

  • Tailscale
  • Radmin

皎月连

皎月连[5]支持 TCP 打洞,支持某些情况下在 NAT3-NAT4 和 NAT4-NAT4 打洞。

组网模式

皎月连的虚拟网卡是动态创建的,仅在服务端 / 客户端启动 / 连接服务时创建。33272 端口固定为服务端口,另有一个 TCP 端口用于握手 ( 抓包显示该端口会向 ip 位于北京的一台中继服务器通信 ),一个 ( ≥1? ) UDP 端口用于与服务端通信。图为客户端皎月连占用端口情况。

服务端有数个 UDP 端口,且有一个有趣现象:服务端通信端口会随着客户端的端口号变化而变化,如图中的 UDP 26954。推测在 UDP 打洞成功的情况下,并不会使用 TCP 打洞。双方通信仍然基于 ipv6。

带宽测试结果始终为 3Mbps 左右,约为 zerotier 组网下的一半,不知道二者是否有联系。该问题的成因仍待探索。


  1. 皎月连支持 TCP 打洞和部分情形下的 NAT3-NAT4 / NAT4-NAT4 打洞。 ↩︎

  2. 河南联通宽带NAT4到NAT0全过程记录 - 哔哩哔哩 ↩︎

  3. 家用路由器修改NAT1 - 哔哩哔哩 ↩︎

  4. 如何快速判断自己的网络NAT类型_查看nat类型-CSDN博客 ↩︎

  5. 皎月连一键内网穿透 ↩︎