Как установить максимальный лимит подключения с помощью nftables?
Я пытаюсь ограничить количество одновременных подключений к определенной службе, работающей на сервере Linux. Насколько я понимаю, это можно сделать в iptables
с использованием connlimit
модуль. Так, например, если я хотел ограничить одновременные подключения к моему SSH-серверу (и предполагая, что политика по умолчанию отклонена), то это должно разрешить 10 одновременных подключений, при этом 11-е будет отклонено (записано из памяти):
iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-upto 10 -j ACCEPT
Дело в том, что на новых серверах, которые я создаю, я хочу реализовать брандмауэр, используя nftables
, Хотя я могу найти connlimit
упомянутое на странице руководства, это просто заявляет consider native interface. Refer to Meters
, Обыскав вокруг Метры, хотя это выглядит потрясающе для ограничения скорости, я не могу найти ничего, что подсказывает, что я могу сделать эквивалент connlimit
,
Итак, учитывая, что я хочу использовать nftables
Как создать правило, которое будет соответствовать только до X одновременных подключений?
1 ответ
Существует новое расширение nft_connlimit, которое было добавлено начиная с ядра Linux 4.18, обеспечивая ct count
выражение.
Для этого случая эквивалентные правила (с нуля) будут:
nft flush ruleset
nft add table ip filter
nft add chain ip filter input '{ type filter hook input priority 0; }'
nft add rule ip filter input tcp dport 22 ct count 10 counter accept
# nft add rule ip filter input tcp dport 22 counter reject with tcp reset
Некоторые замечания:
По-прежнему
counter
не является обязательным и используется для получения счетчика сnft list ruleset
знать, сколько раз сработало правило.Замена прежде всего вхождения
ip
сip6
получит эквивалент для IPv6. Теперь, что более интересно, используетinet
получить объединенное количество SSH-соединений IPv4 и IPv6, поскольку они учитываются вместе с помощью conntrack.Следует избегать использования ядер между 4.19.0 и 4.19.9, поскольку использование этой функции может привести к сбою хоста. (Предстоящее) ядро 4.20 и ядро 4.19.10 включают в себя несколько патчей, связанных с conncount, исправлением сбоев и неправильным подсчетом. Статус неизвестен для ядра 4.18.x.
ОБНОВЛЕНИЕ: ограничение по сети, а не только по IP, эквивалентно iptables --connlimit-mask
Перечитывая скудную документацию из начального патча в списке рассылки netfilter-devel, ct count
не ограничивается использованием только в автономном режиме (или ограничивается приведенным выше примером). Может использоваться в meter
выражение / список для более сложного использования.
Если кто-то хочет отклонить подключения к порту 2222 (где какой-либо процесс прослушивает) выше 3-х счетчиков подключений на любой случайный /24 IP-адрес сетевого источника, следует использовать это правило (начиная с nft 0.9.0 / kernel 4.19.10):
nft add rule ip filter input tcp dport 2222 meter test-2222-count-meter '{ ip saddr & 255.255.255.0 ct count over 3 }' counter reject with tcp reset
Это создаст список счетчиков с именем test-2222-count-meter
который будет динамически добавлять соответствующие данные "карты" (для каждой другой сети /24, для которой установлено соединение). Я не уверен, удаляются ли когда-нибудь устаревшие данные (то есть сети /24, у которых больше нет подключения) посредством сборки мусора или нет.
Содержимое счетчика может быть отображено (оно не будет отображать достигнутый счет, только динамически добавленные "карты" при появлении новых сетей). Например, после некоторых подключений 10.0.3.1
, 10.0.3.66
, 10.0.4.5
а также 172.31.4.5
:
# nft list meter ip filter test-2222-count-meter
table ip filter {
meter test-2222-count-meter {
type ipv4_addr
size 65535
elements = { 10.0.3.0 : ct count over 3 , 10.0.4.0 : ct count over 3 , 172.31.4.0 : ct count over 3 }
}
}