Как установить максимальный предел соединения с nftables?

Я хочу ограничить количество одновременных подключений к данной службе, запущенной на сервере Linux. Насколько я понимаю, это можно сделать в iptables с помощью модуля connlimit . Так, например, если я хотел ограничить количество одновременных подключений к моему SSH-серверу (и предполагая, что политика по умолчанию отклонена), тогда это должно разрешить 10 одновременных подключений, с отклоненным 11-м (записано по памяти):

iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-upto 10 -j ACCEPT

Дело в новых серверах Я building Я хочу реализовать брандмауэр, используя nftables . Хотя я могу найти connlimit , упомянутый на странице руководства, он просто утверждает, что рассматривает собственный интерфейс. См. Счетчики . Пошарив вокруг Meters, хотя это выглядит потрясающе с точки зрения ограничения скорости, я не могу найти ничего, что предлагало бы сделать эквивалент connlimit .

Итак, учитывая, что я хочу использовать nftables , как создать правило, которое будет соответствовать только до X одновременных подключений?

3
задан 5 October 2018 в 07:48
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

Некоторые примечания:

  • Как обычно счетчик является необязательным и используется для получения счетчика с набором правил nft list , чтобы узнать, сколько раз сработало правило.

  • Замена всех вышеупомянутых случаев ip на ip6 даст эквивалент для IPv6. Теперь более интересным является использование inet для получения комбинированного количества SSH-соединений IPv4 и IPv6 вместе, поскольку они учитываются conntrack вместе.

  • Ядра между 4.19.0 и 4.19. 9 следует избегать, потому что использование этой функции, скорее всего, приведет к сбою хоста. (Скоро) ядро ​​4.20 и ядро ​​4.19.10 включают несколько исправлений, связанных с подключением, исправлением сбоев и неправильного подсчета. Состояние ядра 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  }
    }
}
1
ответ дан 3 December 2019 в 07:21

Теги

Похожие вопросы