请进行健全性检查。
如果我将 UDP 数据包从 NAT 后面的机器 A 发送到机器 B 的端口 N,而机器 B 位于 NAT 之外(在互联网上的其他地方),我是否可以合理地期望 NAT 将从机器 B 的端口 N 上收到的 UDP 数据包传递回机器 A 的端口 N,而不需要在 NAT 上手动进行端口转发?
答案1
仅当原始传出数据报的源端口也是端口 N,并且 NAT 未选择浮动源端口时才会发生这种情况。
也就是说,来自机器 A 的第一个 UDP 数据报在您的 LAN 上如下所示:
Source IP: MachineAPrivate
Source Port: PortA <-- note this is typically different than the destination port
Destination IP: MachineBPublic
Destination Port: PortN
然后,经过出站方向的 NAT 转换后,它看起来是这样的:
Source IP: NATPublic
Source Port: PortC <-- note this may or may not be the same as "PortA" above
Destination IP: MachineBPublic
Destination Port: PortN
现在,当机器 B 回复时,回复通常如下所示:
Source IP: MachineBPublic
Source Port: PortN
Destination IP: NATPublic
Destination Port: PortC
然后,经过入站 NAT 转换过程后:
Source IP: MachineBPublic
Source Port: PortN
Destination IP: MachineAPrivate
Destination Port: PortA
所以,如果机器 A 从与目标端口相同的源端口(“端口 N”)发送帧,并且如果NAT 能够保留该源端口(即,它配置为在可能的情况下保留源端口,并且该源端口未被使用),然后您可以期待对“端口 N”的回复以返回到机器 A。
以下是有关正确的 NAT UDP 行为的权威参考:
RFC 4787 / BCP 127:单播 UDP 的网络地址转换 (NAT) 行为要求
答案2
接近,但是机器 B 需要查看它实际接收的源地址和端口号,这可能与 N 不同。
计算机 A 上的 NAT 可能不会使用计算机 A 发送的端口 N。(假设位于同一 NAT 后面的计算机 C 也在端口 N 上发送:它们不能同时使用它。)因此,计算机 B 可能会看到不同的源端口 M。但如果 NAT 这样做,那么它应该接受发送回端口 M 的流量并自动将其映射回计算机 B 上的 N。
换句话说,只要机器 B 向其收到的数据包中提供的源地址和源端口发送回数据包,您就可以合理地预期返回数据包会找到返回原始源的路径。这假设返回数据包是在很短的时间内发送的,因为自动 NAT 规则往往会在几分钟后超时。
答案3
我没想到这一点。
NAT 后面可以有多个 IP,因此您需要选择要转发到哪个 IP。NAT 之外只有路由器 IP 可见,内部 NAT IP 不可见。
UDP 不形成连接,而只是通过网络传输数据报。
发送端口和接收端口号也有区别。