2012-11-25 55 views
3

我读了一些关于port translation的内容,现在我想测试它。无法接收NAT数据包后面的UDP数据包

我有一台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)) 

权后,我开始本地机器

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 

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

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

+1

为什么你不使用相同的套接字? –

回答

1

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

在这种情况下,NAT就会知道,如果它在5000端口收到一个数据包,它必须是数据包发送到你的本地计算机。

+4

为什么出站数据报不会创建临时地址/端口映射?这不是NAT伪装总是如何工作的吗? –

+1

@DavidSchwartz请参阅http://superuser.com/questions/456812/nat-and-udp-replies –

1

我一直处于类似的情况(没有通过UDP从服务器获取响应,而客户端在NAT后面),并且在我的情况下帮助发送了请求的服务器的相同端口的响应被送到。不同类型的NAT工作方式不同,在我的情况下,路由器必须建立严格的映射client:CLIENT_PORT <---> server:SERVER_PORT,因此来自同一服务器的不同端口的“响应”被拒绝。也许你的情况。