Я создал поддельный недостижимый 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? Я делаю что-то не так в моей демонстрации? Любая помощь будет принята с благодарностью.
sysctl -w net.ipv4.ip_no_pmtu_disc = 1, это неверно. Как вы уже упоминали, оно должно быть установлено равным 0. По умолчанию это значение равно нулю, что означает, что MTU по умолчанию включен на всех Linux-машинах. – Aaron88
Вы правы. Спасибо за исправление :-) – Yoel
Кстати, было ли какое-то другое изменение, которое вам нужно было сделать? – Yoel