2

Когда conntrack активен, стек iptables никогда не видит фрагментированный IP-пакет, а только повторно собранный (исходный), поэтому тест -f никогда не совпадает.

Если я хочу заблокировать какой-либо фрагмент, я мог бы установить для ipfrag_high_thresh или ipfrag_time значение 0 (источник), но это приведет к удалению любого вида фрагмента. Что я могу сделать, если я хочу отбросить фрагменты определенного протокола IP?

2 ответа2

2

Я вижу два способа достижения вашей цели, в зависимости от ваших потребностей.

Вы можете разрешить повторной сборке работать, а затем, после успешной сборки, отбросить весь пакет. Это работает, только если повторно собранный пакет находится через интерфейс MTU (в противном случае вы не сможете различить повторно собранные и «нормальные» пакеты). Если пакеты не могут быть успешно собраны повторно, они все равно будут отброшены, но с большей загрузкой ЦП.

Другой способ - изменить источник и заставить nf_defrag_ipv4 игнорировать пакеты из протокола (ов), которые вы хотите обрабатывать напрямую. Быстрый взгляд показывает, что это должно сработать, поскольку для сокетов RAW уже имеется опция (IP_NODEFRAG), позволяющая обойти код повторной сборки.

Если честно, мне бы тоже хотелось иметь больше контроля над этой частью фильтрации, поэтому я постараюсь установить патч, чтобы исправить ситуацию.

1

Интересно, можно ли использовать "сырую" таблицу netfilter, которая предшествует большинству хуков отслеживания соединений. У него есть цель "NOTRACK", которую вы можете использовать для освобождения определенных пакетов от conntrack, или, возможно, само условие -f будет работать с --table raw .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .