首页 文章

无法在NAT路由器后面接收UDP数据包

提问于
浏览
3

我已经阅读了有关port translation的内容,现在我想测试它 .

我在NAT路由器和具有外部IP地址的服务器后面有一台本地机器 .

这是我将数据包从我的机器上的第5000个端口发送到服务器上的第4000个端口的方式 .

import socket
import sys

UDP_IP = #external server IP address
UDP_PORT = 4000
MESSAGE = "Hi!"

sock = socket.socket(socket.AF_INET, # Internet
                     socket.SOCK_DGRAM) # UDP
sock.bind(('0.0.0.0', 5000))
sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))

在那之后我开始在本地机器上听5000

import socket
import sys

UDP_IP = #my ip address in the local network
UDP_PORT = 5000

sock = socket.socket(socket.AF_INET, # Internet
                     socket.SOCK_DGRAM) # UDP
sock.bind((UDP_IP, UDP_PORT))

while True:
    data, addr = sock.recvfrom(1024)
    print "received message:", data

在服务器上,当我看到来自 (someIP, somePort) 的传入UDP时,我将响应发送到相同的 someIPsomePort (与其他端口和地址使用相同的脚本) . 但我从未在本地机器上收到此回复 . 为什么?

此外,当服务器位于本地网络中时,此代码正常工作 .

2 回答

  • 1

    问题是你在NAT后面,你发送到服务器的数据包(在NAT外部)将具有NAT服务器的源IP . 外部服务器将发送的回复将具有NAT的目标IP . 当回复来到NAT时,它不知道如何处理该数据包,因为没有可用的地址/端口映射 .
    您应该在NAT上创建一个映射,说明以下内容
    NAT Address:5000 <---> localaddress:5000

    在这种情况下,NAT会知道如果它在端口5000接收到数据包,它必须将该数据包发送到本地计算机 .

  • 1

    我一直处于类似的情况(当客户端在NAT后面时,没有通过UDP从服务器获得响应),在我的情况下帮助发送了来自请求发送到的服务器的 same port 的响应 . 不同类型的NAT工作方式不同,在我的情况下,路由器必须构建严格的映射 client:CLIENT_PORT <---> server:SERVER_PORT ,因此来自同一服务器的不同端口的"responses"被拒绝 . 也许你的情况也是如此 .

相关问题