Как установить максимальный лимит подключения с помощью 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  }
    }
}
Другие вопросы по тегам