如何使用两台STUN服务器判定NAT映射行为类型
是否可通过两台STUN服务器判定NAT映射行为?
仅靠2台独立的STUN服务器无法完整区分三类NAT映射行为,最多只能判定出端点无关映射(Endpoint-Independent Mapping,简称EIM)类型,要区分剩下的两类映射,不需要额外增加STUN服务器,调整探测逻辑用单台STUN的多地址/多端口能力就能完成全量判定。
三类NAT映射的核心规则
- Endpoint-Independent Mapping(端点无关映射):同一内网IP:端口(X:x)发往任意外部IP、任意外部端口的报文,NAT都会复用同一个公网映射条目。不管目标地址是Y1:y1还是Y2:y2,NAT分配的公网地址X1':x1'和X2':x2'始终完全一致。
- Address-Dependent Mapping(地址依赖映射):同一内网IP:端口发往同一外部IP、任意端口的报文,NAT才会复用公网映射。只要目标IP相同,哪怕目标端口不同,映射的公网IP:端口都一致;如果目标IP变了,就会分配新的映射端口。
- Address and Port-Dependent Mapping(地址端口依赖映射/对称NAT):同一内网IP:端口只有发往完全相同的外部IP+端口时,才会复用公网映射。只要目标IP或者目标端口任意一个变了,NAT都会分配新的公网映射端口。
两台STUN服务器探测的局限性
用两台不同公网IP的STUN服务器做探测,本质是构造了「目标IP不同、目标端口固定为STUN默认3478端口」的测试场景:
- 如果两次探测拿到的公网IP:端口完全一致,可以直接判定为EIM,这个结论是准确的——毕竟只有EIM会在目标IP变化时仍然复用映射。
- 如果两次结果不一致,只能确定当前NAT不是EIM,但没法区分是ADM还是APDM:这两类NAT在目标IP变化时都会分配新的映射端口,两次探测结果都会出现差异,没有区分度。
区分ADM与APDM的具体方法
不需要新增STUN服务器,只要使用1台配置了两个不同监听端口,或者绑定了两个不同公网IP的STUN服务器,做两次对照探测即可:
- 第一步:固定内网源IP:端口为X:x,向STUN服务器的主服务地址
STUN_IP:3478发起STUN绑定请求,记录返回的公网映射地址MAP1:port1。 - 第二步:保持内网源IP:端口完全不变,向同一台STUN服务器的同IP不同端口(比如
STUN_IP:3479,STUN原生支持服务端多端口监听响应)发起第二次绑定请求,记录返回的公网映射地址MAP2:port2。 - 结果判定规则:
- 如果
MAP1:port1和MAP2:port2完全一致:说明目标IP不变、仅目标端口变化时NAT仍然复用映射,属于Address-Dependent Mapping类型。 - 如果
MAP1:port1和MAP2:port2不一致:说明只要目标端口变化NAT就会分配新映射,属于Address and Port-Dependent Mapping类型。
- 如果
补充:如果手头的STUN服务器不支持多端口监听,也可以用同一台服务器绑定的第二个公网IP搭配默认3478端口做探测,判定逻辑完全一致。
内容的提问来源于stack exchange,提问作者Santivi
相关产品推荐
相关产品推荐

