技术原理
P2P NAT 穿透原理与常见网络类型
NAT 穿透尝试让两个位于路由器后的设备建立直接通信路径。实际结果取决于两端 NAT 行为、防火墙策略和运营商网络。
为什么需要 NAT 穿透
家庭路由器会把多个私有 IPv4 地址转换为一个公网地址。外部设备通常不能主动访问尚未建立映射的内网设备,因此两端需要先通过协调服务交换可用端点,再几乎同时向对方发送数据来建立映射。
从地址发现到直连
- 客户端收集本机地址并探测 NAT 映射后的公网 IP 与端口。
- 协调服务帮助两端交换候选端点,但不等于承载后续业务流量。
- 两端对候选地址执行连通性尝试,让路由器和防火墙创建允许返回流量的状态。
- 找到可用路径后建立加密隧道,并分配 100.99.71.0/24 中的虚拟地址。
提示:这是帮助理解故障位置的简化说明;p2pRemote 的具体协议实现不等同于浏览器 WebRTC 的 ICE 流程。
映射和过滤为什么重要
- 端点无关映射通常更容易打洞:访问不同目标时可以复用外部端口。
- 端点相关映射会为不同目标分配不同端口,双方更难预测可用端点。
- 地址或端口相关过滤要求内网设备先向特定目标发包,打洞时序更严格。
- 企业防火墙可能直接阻止未知 UDP 流量,即使 NAT 映射本身可用。
双重 NAT 与运营商级 NAT
如果光猫和自有路由器都在路由模式,流量要经过两层转换。移动宽带和部分家庭宽带还会在运营商网络中增加 CGNAT。每增加一层不可控映射,直连难度通常都会上升。
- 路由器 WAN 地址若属于 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16 或 100.64.0.0/10,说明上游仍可能存在 NAT。
- 将 WAN 地址与公网查询结果比较;不一致通常意味着还有上游转换。
- IPv6 可减少 IPv4 NAT 问题,但仍受主机与网络防火墙策略限制。
相关标准
STUN 用于发现 NAT 分配的地址和端口;ICE 描述候选地址交换与连通性检查;TURN 在无法直连时通过服务器中继。它们提供理解 NAT 穿透的通用框架。
参考资料:RFC 8489:STUN · RFC 8445:ICE · RFC 8656:TURN