Я хочу ограничить количество одновременных подключений к данной службе, запущенной на сервере 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 одновременных подключений?
Существует новое расширение 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 }
}
}