Вопрос или проблема
С помощью утилиты 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 //неудача (TTL и ДЛИНА неверные)
ping -s 100 -t 200 10.6.7.10 //успех (TTL неверен)
ping -s 10 -t 10 10.6.7.10 //успех (Оба верны)
ping -s 10000 -t 10 10.6.7.10 // неудача, НО ДОЛЖНО БЫТЬ УСПЕХ.
Почему последняя попытка пинга не работает, и как это исправить?
Если оба условия должны быть истинными одновременно, нужно составить условия так:
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
Возможно, что ответ на пинг с удаленного хоста имеет больший TTL, так как опция -t
устанавливает только TTL исходящего пакета. Обычный текущий TTL по умолчанию — 64. (Я полагаю, что рекомендация в том, чтобы это было в два раза шире интернета.)
Другая возможность состоит в том, что, поскольку 10000-байтный пинг должен был быть фрагментирован, удаленный хост отказался отвечать на него. Попробуйте отправить 800-байтный пинг.
Также, если вы выполните sudo iptables -L -v
, это покажет, сколько раз правило сработало. Это может быть полезно для отладки.
Еще один вариант отладки — выполнить правило как:
sudo iptables -A LOGDROP -m length --length 722:65535 -j LOG
Перед правилом DROP. Это запишет пакет в журнал ядра (читается с помощью dmesg
) перед его отбросом. Вы сможете выяснить, что было отброшено.
Ответ или решение
Теория
Когда необходимо настроить фильтрацию сетевого трафика с использованием iptables
, важно правильно строить правила, чтобы они выполнялись в требуемой логической последовательности. В данной задаче требуется заблокировать все входящие соединения, если одновременно выполнены два условия: длина пакета больше 722 байт и значение TTL больше 22. Это значит, что оба условия должны выполняться одновременно, что эквивалентно логической операции И (AND).
Пример
В представленном примере настройки iptables
правила выглядят так:
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
Основная ошибка заключается в том, что логическая операция AND между TTL и длиной пакета не реализована правильно. Два первых правила добавляют пакеты в цепочку LOGDROP, если только одно из условий выполнено (TTL больше 22), но затем проверяется только длина пакета в цепочке LOGDROP. Это не соответствует поставленной задаче "AND", так как условия не зависят друг от друга.
Применение
Правильная настройка iptables
, которая выполняет оба условия одновременно, может быть выполнена так:
sudo iptables -A INPUT -m ttl --ttl-gt 22 -m length --length 722:65535 -j DROP
sudo iptables -A OUTPUT -m ttl --ttl-gt 22 -m length --length 722:65535 -j DROP
Эти правила обеспечат блокировку пакетов на базе логического И (AND) для входящих и исходящих соединений только если оба условия соблюдены. В случае с ping
командами возникает дополнительная сложность: возвращаемые пакеты могут иметь другие значения TTL. Параметр -t
в ping
устанавливает TTL только для исходящих пакетов, в то время как TTL для входящих может быть выше заданного значения. Возможным решением может быть проверка с помощью других инструментов диагностирования, таких как iptables -L -v
для отслеживания срабатываний правил или dmesg
для анализа журналов блокированных пакетов.
При наличии фрагментированных пакетов, как в случае с длиной пакета 10000 байт, возможно, проблема также связана с отказом удаленного узла отвечать на такие пакеты. Попробуйте отправку меньших пакетов, например, размером 800 байт, чтобы исключить данную возможность.