С помощью iptables
утилиты на хосте Linux нужно создать мини-брандмауэр. Мне нужно сбросить все входящие соединения с длиной пакета больше 722 И TTL больше 22. Нужно именно И. Сбрасывать только если оба условия ИСТИННЫ.
sudo iptables -N LOGDROP
sudo iptables -A OUTPUT -m ttl --ttl-gt 22 -j LOGDROP
sudo iptables -A INPUT -m ttl --ttl-gt 22 -j LOGDROP
sudo iptables -A LOGDROP -m length --length 722:65535 -j DROP
IP-адрес хоста защищен 10.6.7.9
брандмауэром.
Я провел 4 теста с этого хоста, пытаясь пропинговать другой хост:
ping -s 10000 -t 250 10.6.7.10 //fail (TTL AND LENGHT are wrong)
ping -s 100 -t 200 10.6.7.10 //success (TTL is wrong)
ping -s 10 -t 10 10.6.7.10 //success (Both are right)
ping -s 10000 -t 10 10.6.7.10 // fail, BUT SHOULD BE TRUE.
Почему последний пинг не работает и как это исправить?
решение1
Если оба условия должны выполняться одновременно, следует составить условия следующим образом:
sudo iptables -A OUTPUT -m ttl --ttl-gt 22 -m length --length 722:65535 -j DROP
sudo iptables -A INPUT -m ttl --ttl-gt 22 -m length --length 722:65535 -j DROP
решение2
Хорошая возможность заключается в том, что ответ ping от удаленного хоста имеет больший TTL, поскольку -t
опция устанавливает только TTL исходящего пакета. Распространенный TTL по умолчанию в наши дни — 64. (Я считаю, что рекомендуется в два раза больше ширины интернета.)
Другая возможность заключается в том, что, поскольку пинг в 10000 байт должен был быть фрагментированным, удаленный хост отказался отвечать на него. Попробуйте отправить пинг в 800 байт.
Также, если вы sudo iptables -L -v
это сделаете, он скажет вам, сколько раз правило сработало. Это может быть полезно для отладки.
Другой вариант отладки — создать правило вроде:
sudo iptables -A LOGDROP -m length --length 722:65535 -j LOG
Перед правилом DROP. Это запишет пакет в журнал ядра (читается с помощью dmesg
) перед его отбрасыванием. Затем вы можете выяснить, что было отброшено.