2014-07-13 76 views
1

感動:https://superuser.com/questions/782549/udp-client-sending-icmp-port-unreachable-when-receiveing-messages-from-the-serUDP客戶端發送ICMP「端口不可達」從服務器receiveing消息時

我有一個UDP客戶端使用luasocket,基本上這樣(與抽象的數層,但是這是怎麼回事在那裏):

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的不增加任何輸入包櫃,而出現這種情況):

$ 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 
+0

某些服務器會阻止'ICMP'(出於安全原因),這可能會解釋它。 – alfasin

+0

@alfasin解釋它如何? – EJP

+0

@EJP不知道我是否理解你的問題,你可以設置'iptables -P DROP'來丟棄ICMP請求 – alfasin

回答

2

您的客戶端防火牆正在主動阻止入站UDP。

+0

好吧,不,恐怕不是。至少如果我理解正確的話。因爲:'iptables -t filter -A INPUT -i eth0 -p UDP --sport 64299 -j ACCEPT' – nonchip

+0

1.您的客戶端主機發布了ICMP PORT UNREACHABLE。 2.您的客戶端應用程序沒有收到數據報:取而代之的是超時。 Ergo您的客戶端防火牆會以某種方式阻止它。QED – EJP

+0

我看到這是唯一可能的解釋,但我不明白這可能是什麼,因爲我明確接受源端口。我也接受所有已建立的/相關的狀態,這也應該隱含地涵蓋這種情況(iptables會記住IP /端口對用於像UDP那樣的無狀態「連接」)。更陌生: – nonchip

相關問題