UDP P2P NAT穿越:为何A向B发起连接成功而B向A发起失败?
端口限制锥型NAT下UDP打洞单向连通的原因分析
先明确端口限制锥型NAT的核心规则:这类NAT会为内部设备的每个出站连接(目标IP+目标端口的组合)创建独立的端口映射,并且仅允许该特定目标IP+端口的反向数据包通过NAT转发到内部设备。
为什么A先发消息能建立连接?
- 当A主动向B的公网IP:Port_B发送UDP包时:
- NAT_A会生成内网A→公网A_Port的映射,同时在NAT规则中添加一条记录:允许来自B公网IP:Port_B的数据包转发到内网A。
- 这个包到达NAT_B后,NAT_B同样生成内网B→公网B_Port的映射,同时添加记录:允许来自A公网IP:A_Port的数据包转发到内网B。
- 此时双方的NAT都已经为对方的公网地址+端口开了“放行通道”,后续互相发送的数据包都能被各自NAT正确转发,连接正常建立。
为什么B先发消息无法建立连接?
- 当B主动向A的公网IP:A_Port发送UDP包时:
- NAT_B生成内网B→公网B_Port的映射,同时添加规则:允许来自A公网IP:A_Port的数据包转发到内网B。
- 但这个包到达NAT_A时,NAT_A的规则里没有任何关于B公网IP:Port_B的放行记录(因为A从未主动给B发过包,NAT_A没创建过对应条目),所以NAT_A会直接丢弃这个包。
- 内网A收不到B的初始包,也就无法回复;而NAT_A始终不会添加允许B公网地址的规则,后续B再发的包依然会被NAT_A丢弃,连接无法建立。
关于心跳的补充说明
两台设备向中心服务器发心跳,只能维持各自到中心服务器IP+端口的NAT映射有效性,但这个映射和对方设备的公网地址无关——心跳不会在NAT中添加允许对方设备的规则,所以无法解决单向连通的问题。
内容的提问来源于stack exchange,提问作者K.Jno
相关产品推荐
相关产品推荐

