网络类–NAT类型

工具教程4个月前发布 hank
308 1 0

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,这类节点通常价值较低。

Symmetric NAT NAT4 检测结果
Symmetric NAT,也就是常说的 NAT4。

2. Full Cone:NAT1

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

Full Cone NAT NAT1 检测结果
Full Cone NAT,也就是常说的 NAT1。

抓包报文

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

NAT 检测抓包报文示例
抓包观察 NAT 检测过程中的报文交互。

一键检测

也可以使用下面的一键命令,根据当前系统架构自动选择下载文件并执行检测。

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/8172.16.0.0/12192.168.0.0/16100.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. 常见优化方向

  1. 向运营商申请公网 IPv4,或者确认是否能取消 CGNAT。
  2. 光猫改桥接,由主路由拨号,减少多层 NAT。
  3. 路由器开启 UPnP、端口映射或 DMZ,但要同步检查安全风险。
  4. 确认系统防火墙、安全组、路由器防火墙没有拦业务端口。
  5. 如果有原生 IPv6,确认 IPv6 地址、默认路由、防火墙和业务监听都正常。

安全提醒:公网 IP、DMZ、端口映射会提升入站可达性,也会增加暴露面。边缘节点建议只开放业务需要的端口,并做好系统更新、弱口令检查和防火墙策略。

© 版权声明

相关文章