3

(Примечание: я переместил этот вопрос из StackOverflow, потому что он будет рассматриваться как не относящийся к теме, здесь лучше подходит и все еще не решен)

У меня есть клиент 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 не увеличивает счетчики пакетов 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

и клиент, и сервер используют один и тот же код, поэтому что-то на моем клиентском хосте, похоже, мешает входящему ответному пакету.

TL; график времени DR:

  • клиентское приложение открывает сокет UDP, "подключаясь" к серверу
  • клиентское приложение отправляет пакет запроса
  • серверное приложение получает пакет запроса
  • серверное приложение отправляет ответный пакет
  • клиентский хост получает ответный пакет (проверяется Wireshark на клиенте)
  • клиентский хост отправляет ICMP порт недоступным (замечено в wireshark на клиенте)
  • клиентское приложение получает тайм-аут чтения через 10 секунд
  • (только что попробовал :) отправка большего количества пакетов с клиента на сервер работает, поэтому сокет не закрылся.

0