Задача: быстро отстреливать источники, ломающие
ssh, без демонов и лог-парсеров. Решение - динамический set с таймаутом + правило, которое само добавляет нарушителя.Шаги
1. Создаём таблицу, набор и цепочку:
sudo nft -f - <<'EOF'
table inet fw {
set ssh_bad {
type inet_addr
flags timeout
timeout 1h # дефолт для элементов
}
chain input {
type filter hook input priority 0; policy accept;
iif lo accept
ct state established,related accept
# уже занесённых — вон:
ip saddr @ssh_bad drop
# детект частых новых соединений на 22/tcp и бан + дроп:
tcp dport 22 ct state new limit rate over 10/minute \
add @ssh_bad { ip saddr timeout 2h } counter drop
}
}
EOF
2. Ручное управление бан-листом (админ-бан/разбан):
sudo nft add element inet fw ssh_bad { 203.0.113.5 timeout 24h comment "manual" }
sudo nft delete element inet fw ssh_bad { 203.0.113.5 }
3. Наблюдение за изменениями сета (для отладки):
sudo nft monitor set
4. Персистентность (Debian/Ubuntu/RHEL/Alma):
# Проверь синтаксис и атомарно загрузись
sudo nft -c -f /etc/nftables.conf && sudo nft -f /etc/nftables.conf
sudo systemctl enable --now nftables
совет: вынеси блок в/etc/nftables.d/ssh-ban.nftи подключиincludeв/etc/nftables.conf.
Зачем и когда
- Базовая защита от брутфорса без сторонних сервисов.
- Подходит для edge/VM/контейнер-хостов, где не нужен полный fail2ban.
- Работает в
family inet → одна логика и для IPv4, и для IPv6.Трюки / best practices
-
limit rate over срабатывает только при превышении порога - нормальные пользователи не пострадают.- Не делай
flush table inet fw в бою: обнулятся текущие баны (timeouts). Обновляй правила точечно (nft -a list ruleset, затем delete rule handle … / add rule …) или проверяй конфиг -c перед загрузкой.- Для нестандартных портов поменяй
tcp dport 22 на свой.#Linux@linux_odmin #LinuxTips@linux_odmin #Команды@linux_odmin
👉 @linux_odmin