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