Ограничение скорости потока ICMP с помощью nftables

Я пытаюсь выяснить, как разрешить пинг ICMP на сервер с nftables, не подвергаясь атакам флуд.

Вот мой начальный конфиг:

table inet firewall {
    chain incoming {
        type filter hook input priority 0; policy drop;

        # established/related connections
        ct state { established, related } accept

        # ICMP
        ip6 nexthdr icmpv6 icmpv6 type { destination-unreachable, packet-too-big, time-exceeded, parameter-problem, echo-reply, nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert } accept
        ip protocol icmp icmp type { destination-unreachable, router-advertisement, time-exceeded, parameter-problem } accept

        # ICMP ping dealt with separately to rate limit
        ip6 nexthdr icmpv6 icmpv6 type echo-request limit rate 1/second accept
        ip protocol icmp icmp type echo-request limit rate 1/second accept
    }
}

Тем не менее, наводнение с ping -f [IP_ADDRESS] показывает большинство пакетов, проходящих через. Конечно, больше, чем один в секунду.

Если я удалю ct state { established, related } accept Правило Я получаю 99% потерь пакетов при попытке флудить.

Таким образом, кажется, что первый запрос устанавливает соединение, и последующие эхо-запросы запускаются по этому правилу, и, кажется, не имеет значения, если я поставлю ct править после icmp править.

Любой способ разрешить установленные соединения, но все еще пинги ограничения скорости?

2 ответа

Попробуйте это решение:

межсетевой экран
    входящая цепь {
        тип фильтра ловушки приоритет ввода 0; падение политики;

        # ICMP пинг обрабатывается отдельно для ограничения скорости
        ip6 nexthdr icmpv6 тип icmpv6 предельная скорость эхо-запроса 1/ сек.
        ip6 nexthdr icmpv6 тип icmpv6 сброс счетчика эхо-запросов
        протокол ip icmp тип icmp предельная скорость эхо-запроса 1/ сек.
        протокол ip icmp тип icmp сброс счетчика эхо-запросов

        # установленные / связанные соединения
        кт состояние {установлено, связано} принять

        # ICMP
        ip6 nexthdr icmpv6 icmpv6 тип {пункт назначения недоступен, пакет слишком большой, превышено время, проблема с параметрами, эхо-ответ, nd-router-advert, nd-сосед-запрос, nd-сосед-объявление} принять
        протокол ip icmp icmp тип {адресат недоступен, объявление маршрутизатора, превышено время, проблема с параметрами} принять

    }
}

Вы должны явно отбросить пакеты, превышающие ограничение скорости, чтобы предотвратить их принятие по нижеуказанным правилам.

Поздно, но я только что наткнулся на ту же проблему, и Google привел меня сюда... проблема действительно в том, что эхо/ответ ICMP обрабатываетсяconntrackсм. https://www.frozentux.net/iptables-tutorial/chunkyhtml/x1582.html.

Вы можете использовать что-то вродеwatch -n1 conntrack -Lконтролировать содержимое таблицы отслеживания соединений в режиме реального времени (по умолчанию отображается только IPv4, IPv6 может отображаться через-f ipv6вариант)

Важно то, что вы должны сформулировать ограничитель какoverсостояние, в котором вещи попадаютdropпед перед _ct stateоператор и одеяло также принимают входящий запрос ping после оператора отслеживания соединения.

Что это делает:

  • первый входящий пакет запроса ICMP («НОВЫЙ» на жаргоне ct) принимается по обычному правилу
  • все последующие пакеты состояния «ESTABLISHED» разрешены отслеживанием соединений
  • но все пакеты все равно должны пройтиlimit rate over ...сначала правило, поэтому ограничитель по-прежнему работает должным образом

код:

         table inet firewall {
            
       chain incoming {

            type filter hook input priority 0; policy drop;
            
            # icmp echo rate limits
            ip6 nexthdr icmpv6 icmpv6 type echo-request limit rate over 1/second drop
            ip protocol icmp icmp type echo-request limit rate over 1/second drop


            # established/related connections
            ct state { established, related } accept
    

            # accept ICMP ping

            ip6 nexthdr icmpv6 icmpv6 type echo-request accept
            ip protocol icmp icmp type echo-request accept
        }
   }
Другие вопросы по тегам