客户端 - NAT后面的Windows桌面,运行UDP客户端应用程序。
服务器 - 具有公共IP的Ubuntu服务器运行UDP服务器应用程序,该应用程序需要端口6000上的数据包。
ClientPrivate / Public - 客户的私有/公共IP
ServerPrivate / Public - 服务器的私有/公共IP
服务器上的WireShark输出:
475 88.xxx.xxx.90 -> 10.0.0.5 UDP 777 → 6000
476 10.0.0.5 -> 88.xxx.xxx.90 UDP 6000 → 777
WireShark输出
152 192.168.2.85 104.40.xxx.250 UDP 777 → 6000
153 104.40.xxx.250 192.168.2.85 UDP 6000 → 777
服务器上的WireShark输出:
475 88.xxx.xxx.90 -> 10.0.0.5 UDP 777 → 6000
476 10.0.0.5 -> 88.xxx.xxx.90 UDP 46666 → 777
WireShark输出
152 192.168.2.85 104.40.xxx.250 UDP 777 → 6000
为什么确实客户在案例1中收到数据报而在案例2中不?
答案 0 :(得分:1)
我认为这是由客户端NAT引起的。当您的客户端向服务器发送公共IP时,NAT路由器正在其内部连接表中进行输入(类似于" 192.168.2.85 [777] => 104.40.xxx.250 [6000])。
因此,当响应从104.40.xxx.250 [6000]返回时,NAT将找到匹配的条目并将响应返回给客户端计算机。该条目是它如何知道客户端网络中的哪台机器发送数据包。但是,当响应从104.40.xx.250 [46666]返回时,它不匹配其表中的任何条目,因此它丢弃该数据包。
这是NAT的工作方式。考虑一下你的NAT 后面还有另一台机器与同一台服务器通话,比如," 192.168.2。 86 [777] => 104.40.xxx.250 [6000]&#34 ;.我想你会发现你的NAT路由器实际上将源端口改为777以外的其他东西。否则它如何正确地将响应路由回正确的机器。通常对于NAT,如果来自路由器的传入数据包与其表中的条目( OR 您已配置端口转发规则)不匹配,则数据包将被丢弃。
端口转发允许您打开内部计算机以供外界进行一般访问。但由于缺乏这一点,您真的不希望任何随机IP地址/端口对能够将数据报发送到您的客户端计算机。