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

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

---

LLMS 索引： [llms.txt](/llms.txt)

---

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

## 开始检测

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

```shell
./npc nat
```

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

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

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

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

```text
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 服务。

---

反链：

- [配置示例](/extend/example.html)
