UDP协议P2P打洞为什么会失败
全锥形NAT(Full Cone NAT)
转换:DST_IP 转 NAT_IP, SRC_PORT = NAT_PORT 不变
查找: 公网报文(DST_IP + DST_PORT) -> 内网主机
效果: 任何外部主机都可访问该公网端口
打洞:成功
地址受限锥形NAT(Address Restricted Cone NAT)
转换:DST_IP 转 NAT_IP, SRC_PORT = NAT_PORT 不变
查找: 公网报文(SRC_IP + DST_IP + DST_PORT) -> 内网主机
效果:只允许之前发过包的外部 IP 回包(不看端口)
打洞: 成功 (注意:第三方主机 将SRC_IP填为 NAT_IP)
端口受限锥形NAT(Port Restricted Cone NAT)
转换:DST_IP 转 NAT_IP, SRC_PORT = NAT_PORT 不变
查找: 公网报文(SRC_IP + SRC_PORT + DST_IP + DST_PORT) -> 内网主机
打洞: 成功 (注意:第三方主机 将SRC_IP:SRC_PORT 填为 NAT_IP:NAT_PORT)
对称NAT(Symmetric NAT)
转换:DST_IP 转 NAT_IP, SRC_PORT 动态转换 NAT_PORT
查找: 公网报文(NAT_IP + NAT_PORT + DST_IP + DST_PORT) -> 内网主机
打洞: 失败
总结:但凡存在一方是对称 NAT, 对称 NAT 将 SRC_PORT 动态转换 NAT_PORT, 打洞失败。
ref: https://www.networkacademy.io/ccie-enterprise/sdwan/tlocs-and-nat