NAT 类型概念
NAT 类型通常会被简单分成四类。前三类一般归纳为 Cone NAT,也就是圆锥型 NAT;第四类是 Symmetric NAT,也就是对称型 NAT。
| 常见叫法 | 英文名称 | 大致特征 | 边缘节点/PCDN 影响 |
|---|---|---|---|
| NAT1 | Full Cone NAT | 接近公网裸奔,公网访问限制最少。 | 最友好,云主机、公网 IP、弱限制出口常见。 |
| NAT2 | Address-Restricted Cone NAT | 有路由或 NAT,但限制较少,通常按对端地址限制回包。 | 一般可用性较好。 |
| NAT3 | Port-Restricted Cone NAT | 对端地址和端口都参与限制,好出不好进。 | 可用性一般,P2P 连接成功率可能下降。 |
| NAT4 | Symmetric NAT | 多层 NAT 或强限制 NAT 常见,不同目的地址/端口可能生成不同映射。 | 限制最重;没有 IPv6 时,PCDN 边缘节点收益通常很差。 |
说明:运维里常说的 NAT1、NAT2、NAT3、NAT4 适合快速判断节点质量。更严谨的说法应该拆成 NAT 映射行为和过滤行为,例如 Endpoint-Independent Mapping、Address-Dependent Filtering 等。
对 PCDN 的影响
PCDN、边缘节点、P2P 分发这类业务,通常不只是能访问公网就行,还要看外部节点能不能比较顺利地打进来或建立连接。NAT 越严格,连接成功率和可调度价值通常越低。
| 网络条件 | 大致判断 | 建议 |
|---|---|---|
| 公网 IPv4 / NAT1 | 最理想。 | 优先保留,注意安全组、防火墙和端口策略。 |
| NAT2 / NAT3 | 可用,但连接质量取决于路由器、防火墙和运营商网络。 | 可测试实际业务收益,必要时开启 UPnP、端口映射或 DMZ。 |
| NAT4 且无 IPv6 | 限制最重,打洞困难。 | 边缘节点价值通常较低,优先考虑公网 IP、桥接、IPv6 或更换网络。 |
| NAT4 但有原生 IPv6 | IPv4 受限,但 IPv6 可能绕开 NAT 限制。 | 确认业务是否支持 IPv6,并检查 IPv6 防火墙放行情况。 |
Linux 检测方法
这里以 Linux 系统为主。先进入临时目录,再根据 CPU 架构下载对应程序。
cd /tmp uname -m
根据架构下载 stun-client
# x86_64 / amd64 curl -fL -o stun-client https://download.niulinkcloud.com/czl/tcpstunc_linux_amd64 # aarch64 / arm64 curl -fL -o stun-client https://download.niulinkcloud.com/czl/tcpstunc_linux_arm64 # armv7l / arm curl -fL -o stun-client https://download.niulinkcloud.com/czl/tcpstunc_linux_arm
授权并执行检测
chmod +x stun-client # STUN 服务器:stun.niulinkcloud.com ./stun-client -D -H stun.niulinkcloud.com 一键部署: arch=arm; [ $(uname -m) = "aarch64" ] && arch=arm64; [ $(uname -m) = "x86_64" ] && arch=amd64; cd /tmp; curl -o gostun https://download.niulinkcloud.com/czl/gostun_linux_$arch; chmod +x gostun; ./gostun -H stun.miwifi.com
注意:这是从公网地址下载二进制文件并执行。生产环境建议确认来源可信,必要时先在测试环境执行,避免盲跑未知二进制或一键脚本。
以上的nat类型检测是tcp的,下面简单介绍使用python里面的pystun来检测udp nat类型的办法
以centos 7.9为例,使用pystun,下载epel-release、python-pip;部分可能已经是python3,pystun3了,整体用法类似
安装: yum install -y epel-release yum install -y python-pip python -m pip install \ -i https://pypi.tuna.tsinghua.edu.cn/simple \ --trusted-host pypi.tuna.tsinghua.edu.cn \ pystun pystun使用: pystun -i $ip(网卡IP) 示例: [root@CentOS764 ~]# pystun -i 112.46.161.154 -H 222.222.95.40 -P 3478 NAT Type: Open Internet External IP: 112.46.161.154 External Port: 47551
结果示例
1. Symmetric NAT:NAT4
如果检测结果为 Symmetric NAT,通常说明 NAT 限制较强。PCDN 场景里,如果没有可用 IPv6,这类节点通常价值较低。

2. Full Cone:NAT1
Full Cone NAT 限制较少,云主机一般是 NAT1 或直接公网环境,通常对边缘节点更友好。

抓包报文
抓包可以辅助确认检测过程中的请求、响应和公网映射情况。排查时可以结合源地址、目的地址、端口变化一起看。

一键检测
也可以使用下面的一键命令,根据当前系统架构自动选择下载文件并执行检测。
arch=arm [ "$(uname -m)" = "aarch64" ] && arch=arm64 [ "$(uname -m)" = "x86_64" ] && arch=amd64 cd /tmp curl -fL -o gostun "https://download.niulinkcloud.com/czl/gostun_linux_$arch" chmod +x gostun ./gostun -H stun.miwifi.com
如果想保留原来的一行写法
arch=arm; [ "$(uname -m)" = "aarch64" ] && arch=arm64; [ "$(uname -m)" = "x86_64" ] && arch=amd64; cd /tmp; curl -fL -o gostun "https://download.niulinkcloud.com/czl/gostun_linux_$arch"; chmod +x gostun; ./gostun -H stun.miwifi.com
补充说明
1. NAT 检测结果不是永久标签
STUN 类检测只能说明当前客户端、当前端口、当前 STUN 服务器、当前网络状态下观察到的 NAT 行为。路由器负载、运营商策略、出口切换、防火墙策略变化,都可能让结果发生变化。
建议:重要节点可以多测几次,换不同 STUN 服务器、不同时间段测,再结合实际 PCDN 业务收益判断。
2. 检查是否存在 CGNAT 或多层 NAT
如果路由器 WAN 口拿到的是内网地址,或者运营商侧做了 CGNAT,节点通常会更受限制。可以把本机公网出口 IP 和路由器 WAN 口 IP 做对比。
# 查看 IPv4 公网出口 curl -4 https://ifconfig.me # 查看 IPv6 公网出口 curl -6 https://ifconfig.me # 查看本机 IPv4 / IPv6 地址 ip -4 addr ip -6 addr
常见私网/CGNAT 网段:10.0.0.0/8、172.16.0.0/12、192.168.0.0/16、100.64.0.0/10。如果路由器 WAN 口落在这些网段里,一般就不是直接公网 IPv4。
3. NAT4 节点重点看 IPv6
NAT4 在 IPv4 下限制较重,但如果节点有原生 IPv6,并且业务支持 IPv6,实际可用性可能明显改善。
# 查看 IPv6 地址 ip -6 addr # 测试 IPv6 出口 curl -6 https://ifconfig.me # 测试 IPv6 连通性 ping -6 -c 3 2400:3200::1
4. 常见优化方向
- 向运营商申请公网 IPv4,或者确认是否能取消 CGNAT。
- 光猫改桥接,由主路由拨号,减少多层 NAT。
- 路由器开启 UPnP、端口映射或 DMZ,但要同步检查安全风险。
- 确认系统防火墙、安全组、路由器防火墙没有拦业务端口。
- 如果有原生 IPv6,确认 IPv6 地址、默认路由、防火墙和业务监听都正常。
安全提醒:公网 IP、DMZ、端口映射会提升入站可达性,也会增加暴露面。边缘节点建议只开放业务需要的端口,并做好系统更新、弱口令检查和防火墙策略。