当前位置: 首页 > 知识库问答 >
问题:

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

蓬运诚
2023-03-14

我已经读过一些关于端口转换的内容,现在我想测试它。

我有一台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 发送响应(对其他端口和地址使用相同的脚本)。但我从未在本地机器上收到此响应。为什么?

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

共有2个答案

和斌
2023-03-14

我也遇到过类似的情况(当客户端位于NAT之后时,没有通过UDP从服务器获得响应),而在我的情况下,有帮助的是从请求发送到的服务器的同一端口发送响应。不同类型的NAT工作方式不同,在我的例子中,路由器必须建立了严格的映射客户端:client_port

柏高丽
2023-03-14

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

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

 类似资料:
  • 我正在尝试使用UDP在服务器(在公共IP上)和客户端(通过NAT)之间进行双向通信。我的逻辑是,如果服务器向IP和它接收数据包的端口发送一些数据,客户端仍然应该得到它,因为NAT最终会有将数据包发送到客户端的映射。 客户端有 2 个进程,一个用于发送数据包,另一个进程用于接收数据。服务器继续等待数据,如果它获得数据,它会将数据发送回从接收数据的端口和 IP。 客户代码如下: client_recv

  • 我不知道是网络配置还是我的软件出了问题。 这是监听代码: 奇怪的是,在wireshark上,我可以看到:数据包已从发送到,并且设备已对此数据包作出响应--来自的数据包已发送到。使用bind(0.0.0.0,端口)似乎不能涵盖。我迷路了,一点主意都没有。 ifconfig为:

  • 我有一个示例代码如下,套接字绑定到IP10.10.88.11和端口9876。我用下面的wireshark测试了2种情况。两台电脑都在同一个子网中。 从同一PC发送UDP数据包(10.10.88.11)-UDP服务器能够接收 从另一台电脑发送UDP数据包(10.10.88.10)-UDP服务器无法接收,但Wireshark(在10.10.88.11)能够捕获数据包 我在网上搜索过,但找不到解决办法。

  • 我正在尝试接收通过LAN电缆连接的FPGA发送的UDP广播数据包。FPGA向端口5001发送连续数据包。 我的python接收器代码很简单: 我使用Wireshark进行了检查,发现PC接收数据包。但是,我的Python代码没有。我还检查了从另一个本地python代码发送数据包的情况(发送到相同的地址和端口),并且我的接收器获得了这些数据包。

  • 我已经在互联网上搜索了一两个星期,想找到一个UDP客户端程序,它可以同时发送和接收数据,但是对于c#来说,没有关于这个主题的内容。在过去的几天里,我尝试创建一个UDP客户端,其中包含一个接收数据的线程。 发送UDP数据包效果很好,但程序无法接收我发送到的服务器,我相信服务器正在将所有数据包发送到不同的端口。 我如何修复这个程序? 有没有一种更简单的方法来进行UDP编程,比如用于TCP的Stream

  • 我需要你的帮助。有一个Vue应用程序,我使用vuex商店和Vue路由器。问题是,我从API调用中获取存储数据,如果我从其他地方导航到页面,用户数据已经存储在存储中,并且在组件中,我可以使用getter接收到的数据。但是,如果我在create或mount方法中重新加载页面,则getter不包含任何数据。但如果在Vuex开发工具中查看,我可以看到fetchedd数据。如何修复此行为?