2014-11-19 5 views
0

Я создал поддельный недостижимый ICMP с типом 3 и кодом 4 (требуется фрагментация и бит DF). Моя настройка имеет сервер, клиент и переключатель между ними. В идеале этот ICMP генерируется маршрутизатором/шлюзом, но я генерирую его на клиенте. Я создаю этот ICMP с помощью инструмента Scapy. Вот как я создаю:Как создать поддельный ICMP «Destination Unreachable» Тип 3 Код 4 пакет

ip = IP() 
icmp = ICMP() 
# IP Packet sent to client 
ip.dst = ip_server 
ip.src = ip_client 
ip.protocol = 1 #shows that ip header contains icmp as data 
# icmp type 3 + code 4 
icmp.type = 3 
icmp.code = 4 
mtu =1300 
icmp.unused = mtu 
# 
# build original packet for ICMP ping request 
# 
ip_orig = IP() 
ip_orig.src = ip_server 
ip_orig.dst = ip_client 
icmp_orig = TCP() 
tcp_orig.sport = 50000 
tcp_orig.dport = 50000 
tcp_orig.seq= original sequence number 
# 
# send the packet 
# 
send (ip/icmp/ip_orig/tcp_orig) 

шаги, которые я отслеживаю, чтобы продемонстрировать эффект этого протокола ICMP: 1> Сервер и клиент общаются друг с другом с помощью сокетов 2> Как только сервер принимает соединение, я даю 60-секундную паузу в машине, в течение которой я отключу все TCP ACK, выходящие из клиентской машины (потому что, если сервер получает ACK для отправленного сообщения, тогда он не будет отвечать на ICMP). 3> Сервер отправляет его первому сообщению клиенту, но не получает никаких ACK, и сервер сохраняет повторную передачу сообщения, между тем я вставляю ICMP-сообщение, как указано в вышеуказанном коде scapy: send (ip/icmp/ip_orig/tcp/ориг). Я сообщаю MTU 1300 в icmp, который я отправляю. 4> Идеально сервер должен уменьшить MTU и отправить сообщение клиенту с размером MTU 1300.

Но сервер продолжает передавать сообщение с размером MTU 1500. Просьба помочь мне в этом. Почему сервер не сокращает MTU? Я делаю что-то не так в моей демонстрации? Любая помощь будет принята с благодарностью.

ответ

0

Есть несколько советов, я обрисовал в this answer и в комментариях:

  1. спецификация требует, чтобы исходный IP-заголовок, который воплощен в сообщении об ошибке ICMP (т.е. ip_orig) точно совпадает с одной получено. Следовательно, установка только его исходного IP-адреса и IP-адресов назначения (то есть ip_orig.src и ip_orig.dst, соответственно), вероятно, недостаточно.
  2. Должен быть установлен порядковый номер исходного TCP-заголовка, который инкапсулирован в сообщении об ошибке ICMP (то есть tcp_orig.seq), поскольку спецификация требует, чтобы в ICMP было включено не менее 8 байтов полезной нагрузки IP-уровня проблемного пакета сообщение об ошибке.
  3. Убедитесь, что обнаружено обнаружение пути MTU и установлено значение бит DF. Вы можете enable path MTU discovery с sysctl -w net.ipv4.ip_no_pmtu_disc=0.
  4. Проверьте, нет ли правила брандмауэра и/или iptables, которое блокирует сообщения ICMP.
+0

sysctl -w net.ipv4.ip_no_pmtu_disc = 1, это неверно. Как вы уже упоминали, оно должно быть установлено равным 0. По умолчанию это значение равно нулю, что означает, что MTU по умолчанию включен на всех Linux-машинах. – Aaron88

+0

Вы правы. Спасибо за исправление :-) – Yoel

+0

Кстати, было ли какое-то другое изменение, которое вам нужно было сделать? – Yoel

Смежные вопросы