Ограничение скорости потока 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
}
}