3

我读过一些关于端口翻译的东西,现在我想测试一下。

我在 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))

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

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

在服务器上,当我看到传入的 UDP 时,(someIP, somePort)我将响应发送到相同的 someIPsomePort(使用具有其他端口和地址的相同脚本)。但我从来没有在我的本地机器上收到这个响应。为什么?

此外,当服务器在本地网络中时,此代码可以正常工作。

4

2 回答 2

1

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

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

于 2012-11-25T16:47:45.100 回答
1

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

于 2014-11-24T14:04:59.853 回答