我已经阅读了有关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时,我将响应发送到相同的 someIP
和 somePort
(与其他端口和地址使用相同的脚本) . 但我从未在本地机器上收到此回复 . 为什么?
此外,当服务器位于本地网络中时,此代码正常工作 .
2 回答
问题是你在NAT后面,你发送到服务器的数据包(在NAT外部)将具有NAT服务器的源IP . 外部服务器将发送的回复将具有NAT的目标IP . 当回复来到NAT时,它不知道如何处理该数据包,因为没有可用的地址/端口映射 .
您应该在NAT上创建一个映射,说明以下内容
NAT Address:5000 <---> localaddress:5000
在这种情况下,NAT会知道如果它在端口5000接收到数据包,它必须将该数据包发送到本地计算机 .
我一直处于类似的情况(当客户端在NAT后面时,没有通过UDP从服务器获得响应),在我的情况下帮助发送了来自请求发送到的服务器的 same port 的响应 . 不同类型的NAT工作方式不同,在我的情况下,路由器必须构建严格的映射
client:CLIENT_PORT <---> server:SERVER_PORT
,因此来自同一服务器的不同端口的"responses"被拒绝 . 也许你的情况也是如此 .