Удалить IP-фрагменты определенного протокола

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

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

2 ответа

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

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

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

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

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

Другие вопросы по тегам