sockets - udp 客户端在从服务器接收消息时发送 ICMP "port unreachable"

原文 标签 sockets networking udp icmp luasocket

移动:https://superuser.com/questions/782549/udp-client-sending-icmp-port-unreachable-when-receiveing-messages-from-the-ser

我有一个使用 luasocket 的 udp 客户端,基本上是这样做的(有几个抽象层,但这就是那里发生的事情):

s=socket.udp()
s:setsockname("*",0)
s:setpeername(socket.dns.toip("example.com"),64299)
s:settimeout(0)
s:send(...)
s:settimeout(10)
msg,err=s:receive()
s:settimeout(0)
print(msg,err)

在服务器的调试输出(ssh 到远程主机)中看到一切正常时,我在客户端收到“超时”错误。

使用客户端wireshark检查所有内容时,我看到我的客户端发送的数据包,以及来自服务器的响应数据包(正确的端口和所有内容),以及从我的客户端主机发送到服务器的ICMP“端口无法访问”数据包以响应这是(正确的)回应。

怎么回事?我尝试了一切,包括将我的 iptables 重置为“接受一切”,但我的客户端仍然发送“端口无法访问”。

相关数据包是:
From            To                  Len Description
192.168.2.100   95.143.172.171  UDP 61  Source port: 45025  Destination port: 64299
  000e8f11e7000025229835a908004500002f4008400040112b6fc0a802645f8facabafe1fb2b001b28d794d2000ec8360100aa81a477616e74a3756964
95.143.172.171  192.168.2.100   UDP 60  Source port: 64299  Destination port: 45025
  0025229835a9000e8f11e70008004500002b000040003911727b5f8facabc0a80264fb2bafe100172e8d94d2000e0ea10100a681a3756964ff000000
192.168.2.100   95.143.172.171  ICMP 85 Destination unreachable (Port unreachable)
  000e8f11e7000025229835a9080045c00047061d00004001a492c0a802645f8facab0303cc6c000000004500002b000040003911727b5f8facabc0a80264fb2bafe100172e8d94d2000e0ea10100a681a3756964ff

防火墙,以防它很重要(我认为这并不重要,因为 iptables 在发生这种情况时不会增加任何 INPUT 数据包计数器):
$ sudo iptables -S
-P INPUT DROP
-P FORWARD DROP
-P OUTPUT ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -i eth0 -p udp -m udp --sport 64299 -j ACCEPT
-A INPUT -i eth0 -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i eth0 -p tcp -m tcp --dport 10001:30000 -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -o lo -j ACCEPT

最佳答案

您的客户端防火墙正在主动阻止入站 UDP。

关于sockets - udp 客户端在从服务器接收消息时发送 ICMP "port unreachable",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24720022/

相关文章:

java - Java中的套接字和流

networking - 有人知道一个数据包生成器吗?

java - 如何确定理想的数据报设置

c# - 在C#中需要多播udp服务器发现方面的帮助

python - 使用Python测试端口是否正在使用的快速方法

java - 无法将套接字从android客户端应用程序连接到服务器

c - 线程结束,结束整个程序?

c - 局域网外的UDP “sendto”

c - unistd write()在连续100次套接字写入/读取后停止写入,程序返回3328错误代码

java - 从 HTTP 服务器中的套接字读取的推荐方法