NAT 和 UDP 回复

tom*_*ing 22 nat udp

请进行健康检查。

如果我将 UDP 数据包从 NAT 后面的机器 A 发送到机器 B 的端口 N,其中机器 B 在 NAT 之外(互联网上的其他地方),我是否可以合理地期望 NAT 将从端口 N 上的机器 B 接收的 UDP 数据包传递回机器 A 上的端口 N,不需要在 NAT 上手动端口转发?

Spi*_*iff 23

仅当原始传出数据报的源端口也是端口 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  
Run Code Online (Sandbox Code Playgroud)

然后,经过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  
Run Code Online (Sandbox Code Playgroud)

现在,当机器 B 回复时,回复通常如下所示:

       Source IP: MachineBPublic  
     Source Port: PortN  
  Destination IP: NATPublic  
Destination Port: PortC  
Run Code Online (Sandbox Code Playgroud)

然后,在它通过入站 NAT 转换过程之后:

       Source IP: MachineBPublic  
     Source Port: PortN  
  Destination IP: MachineAPrivate  
Destination Port: PortA  
Run Code Online (Sandbox Code Playgroud)

因此,如果机器 A 从与目标端口相同的源端口(“端口 N”)发送帧,并且如果NAT 能够保留该源端口(即,它被配置为在可能的情况下保留源端口,并且该源端口未使用),那么您可以期待对“端口 N”的回复以返回到机器 A。

以下是有关正确 NAT UDP 行为的权威参考:
RFC 4787 / BCP 127:单播 UDP 的网络地址转换 (NAT) 行为要求


rum*_*rak -1

我没想到会这样。

NAT 后面可以有多个 IP,因此您需要选择将其转发到哪个 IP。在 NAT 外部,只有路由器 IP 可见,内部 NAT IP 不可见。

UDP 不形成连接,而只是在网络上传输的数据报。

发送端口号和接收端口号也有区别。