跳转到主要内容

检测 NAT 类型并评估 P2P 直连条件

使用 STUN 查看当前网络的 NAT 类型和公网 UDP 映射地址

NPC 可以通过 STUN 检测当前网络的 NAT 类型。这项结果适合在配置 P2P 连接前做初步判断,不代表两端一定能建立直连。

开始检测

在将要运行 NPC 的设备和网络中执行:

./npc nat

NPC 默认访问 stun.stunprotocol.org:3478。需要使用自建或其他 STUN 服务时,传入完整的主机名和端口:

./npc nat -stun_addr=stun.example.com:3478

需要寻找候选地址时,可查看 always-online-stun 的 STUN 主机清单 ,选择一个 主机名:端口 传给 -stun_addr。该清单由第三方维护,文件记录的是 TCP 在线检测结果;NPC 的 NAT 检测需要 UDP,因此仍必须在 NPC 所在网络实际运行命令确认可用。公共服务的可用性和使用政策可能变化,不要将某一条地址视为固定依赖。

成功后会输出 NAT 类型和 STUN 观察到的公网映射地址,例如:

nat type: Full Cone NAT
public address: 203.0.113.20:54321

public address 是本次 UDP 检测得到的映射,不是可以长期固定使用的服务地址。路由器重启、运营商网络切换或映射超时后,地址和端口都可能变化。

理解结果

结果对 NPS P2P 的含义
Open Internet、Full Cone、Restricted 或 Port Restricted通常比 Symmetric NAT 更有利,但仍受防火墙、多层 NAT、运营商网络和 UDP 质量影响
Symmetric NAT对不同目标使用不同映射,穿透难度较高;两端都是 Symmetric NAT 时不应依赖 P2P 直连
Blocked 或检测超时NPC 未完成 STUN 交互,常见原因是 DNS 解析失败、UDP 被拦截或 STUN 服务不可用

访问端和目标端应分别检测,并在实际网络中试连。检测成功只说明当前设备能通过 UDP 访问所选 STUN 服务;企业防火墙仍可能拦截 P2P 使用的其他 UDP 地址或端口。

检测失败时

  1. 确认设备可解析 STUN 主机名,并能向其端口发送 UDP。
  2. 更换可达的 STUN 服务后再次检测,不要根据单次超时判定 NAT 类型。
  3. 在公司网络、家庭宽带和移动热点之间切换时重新检测,结果不能沿用。
  4. 无法稳定直连时,改用由 NPS 中转的 TCP 隧道或私密代理。

公共 STUN 服务会看到检测设备的公网 IP。对外部服务有限制的环境,应使用组织自己管理的 STUN 服务。