Удалить 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
,