iptables сброс длины и условия TTL не работает

Вопрос или проблема

С помощью утилиты 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 байт, чтобы исключить данную возможность.

Оцените материал
Добавить комментарий

Капча загружается...