Коротко: кладём “шумные” источники в чёрный список прямо из datapath - с авто-истечением и без внешних демонов. Подходит для брутфорса SSH и не только. Основано на
limit rate over и динамических set с timeout. Шаги
1. Таблица/цепь (если ещё нет):
nft add table inet filter
nft add chain inet filter input '{ type filter hook input priority 0; policy accept; }'
2. Два уровня списков: кратковременный “flood” и часовой “blackhole” (v4/v6):
# IPv4
nft add set inet filter ssh_flood4 '{ type ipv4_addr; flags dynamic; timeout 10s; size 131072; }'
nft add set inet filter ssh_blackhole4 '{ type ipv4_addr; flags dynamic; timeout 1h; size 65536; }'
# IPv6
nft add set inet filter ssh_flood6 '{ type ipv6_addr; flags dynamic; timeout 10s; size 131072; }'
nft add set inet filter ssh_blackhole6 '{ type ipv6_addr; flags dynamic; timeout 1h; size 65536; }'
flags dynamic+timeoutобязательны для пополнения set’ов из правил;size- защита от OOM. Пример такой схемы есть в man nft.
3. Сначала рубим тех, кто уже в бане:
nft add rule inet filter input ip saddr @ssh_blackhole4 drop
nft add rule inet filter input ip6 saddr @ssh_blackhole6 drop
4. Автобан SSH: >10 новых соединений/сек с одного источника ⇒ бан на 1 час:
(используем добавление в set прямо из правила;
limit rate over матчится на превышение порога)
# IPv4
nft add rule inet filter input tcp dport 22 ct state new \
add @ssh_flood4 { ip saddr limit rate over 10/second } \
add @ssh_blackhole4 { ip saddr timeout 1h } drop
# IPv6
nft add rule inet filter input tcp dport 22 ct state new \
add @ssh_flood6 { ip6 saddr limit rate over 10/second } \
add @ssh_blackhole6 { ip6 saddr timeout 1h } drop
Зачем и когда
- Нативная альтернатива fail2ban на L3/L4: реакция в ядре, без лог-парсинга.
- Хорошо для SSH/SMTP/HTTP-auth, анти-скан/скрэпинг, временное “blackhole”.
- Порог/
timeout легко подкручивать под трафик.Полезные трюки / предупреждения
🔎 Диагностика:
nft list set inet filter ssh_blackhole4 и nft monitor ruleset - видно пополнение set’ов. 🎚️ Тюнинг детектора: добавьте
burst 3 к limit, чтобы сгладить джиттер (по умолчанию 5 пакетов). 🧹 Снятие бана:
nft delete element inet filter ssh_blackhole4 { 1.2.3.4 } или nft flush set inet filter ssh_blackhole4.📐 Порядок правил: держите drop по
@ssh_blackhole вверху input, раньше любых accept.🧪 Если хочется “не более N коннектов одновременно”, используйте
ct count over N (connlimit). Сохрани, пригодится. А ты так настраиваешь?
#Linux@linux_odmin #LinuxTips@linux_odmin #Команды@linux_odmin
👉 @linux_odmin