nftables: закрываем всё лишнее за пятнадцать минут
В Debian 12 и Ubuntu 24.04 nftables — штатный механизм фильтрации, iptables там работает через слой совместимости. Ниже — рабочий набор правил для типичного веб-сервера, который можно применить целиком и потом дополнять под себя.
Прежде чем начать
Одно неверное правило — и вы снаружи. Держите открытой VNC-консоль в панели: она работает независимо от сети и файрвола. Либо запустите страховку, которая через десять минут сбросит правила, если вы не отмените её вручную:
echo "nft flush ruleset" | at now + 10 minutes.
1. Проверяем, что уже есть
nft list ruleset
На наших образах набор пустой — фильтрация клиентского трафика полностью на вашей стороне. Базовая защита от DDoS работает уровнем выше, на границе сети, и от прикладных правил не зависит.
2. Скелет конфигурации
Создаём файл /etc/nftables.conf:
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
set ssh_meter { type ipv4_addr; flags dynamic, timeout; timeout 1h; }
chain input {
type filter hook input priority filter; policy drop;
# уже установленные соединения
ct state established,related accept
ct state invalid drop
# петля
iif lo accept
# ICMP: не отключайте — сломаете определение MTU
ip protocol icmp icmp type { echo-request, destination-unreachable, time-exceeded } accept
ip6 nexthdr icmpv6 accept
# SSH с ограничением частоты новых подключений
tcp dport 22 ct state new limit rate 6/minute burst 6 packets accept
tcp dport 22 ct state new add @ssh_meter { ip saddr } drop
# веб
tcp dport { 80, 443 } accept
# всё остальное — в лог и в мусор
limit rate 3/minute log prefix "nft-drop: " level info
}
chain forward { type filter hook forward priority filter; policy drop; }
chain output { type filter hook output priority filter; policy accept; }
}
3. Разбор ключевых мест
policy drop
Политика по умолчанию — запрет. Всё, что не разрешено явно, отбрасывается. Это единственно верный подход: разрешать по списку проще, чем угадывать, что забыли запретить.
ct state established,related accept
Первым правилом, до всех остальных. Пакеты уже установленных соединений не проходят проверку заново — это и корректность, и производительность.
Про ICMP
Полный запрет ICMP — классическая ошибка. Без destination-unreachable ломается определение MTU: соединение устанавливается, а крупные пакеты молча теряются. Сайт открывается через раз, ssh «зависает» на выводе больших файлов.
Ограничение частоты для SSH
Шесть новых подключений в минуту достаточно для человека и мало для перебора. Адреса, превысившие лимит, попадают в динамическое множество ssh_meter на час.
Посмотреть, кто там сейчас:
nft list set inet filter ssh_meter
4. Применение и автозапуск
nft -c -f /etc/nftables.conf # проверка синтаксиса без применения
nft -f /etc/nftables.conf # применение
systemctl enable --now nftables # загрузка правил при старте
Проверьте из другого окна, что ssh по-прежнему отвечает, и только потом закрывайте текущую сессию.
5. Типовые дополнения
Почтовый сервер
tcp dport { 25, 465, 587, 993 } accept
Помните: исходящий порт 25 у нас закрыт по умолчанию и открывается по запросу после проверки проекта.
WireGuard
udp dport 51820 accept
Доступ к базе только с одного адреса
ip saddr 203.0.113.10 tcp dport 5432 accept
Так лучше, чем открывать порт всему интернету и надеяться на пароль.
Блокировка отдельных стран
Технически возможно через именованные множества с загрузкой префиксов, но подумайте дважды: списки устаревают, а легитимные пользователи попадают под них через VPN и мобильных операторов.
6. Fail2ban поверх nftables
Ограничение частоты в правилах уже отсекает основной поток перебора. Fail2ban полезен там, где нужны блокировки по содержимому логов — например, по неудачным попыткам входа в панель приложения:
apt install fail2ban
systemctl enable --now fail2ban
В /etc/fail2ban/jail.local укажите бэкенд nftables, иначе он будет писать правила в таблицу совместимости iptables, и вы получите два независимых набора фильтров.
7. Что смотреть при проблемах
nft list ruleset # текущие правила
nft list counters # счётчики срабатываний
journalctl -k | grep nft-drop # что именно отбрасывается
ss -tulpn # какие порты реально слушаются
Частая ситуация: сервис не отвечает, а в правилах порт разрешён. Проверьте ss -tulpn — приложение может слушать только 127.0.0.1, и файрвол здесь ни при чём.
Чек-лист
- Политика
dropна цепочке input. - Разрешены established, loopback, нужные ICMP.
- SSH с ограничением частоты, порт совпадает с настроенным в sshd.
- Правила проверены через
nft -cперед применением. - Служба nftables включена в автозагрузку.
- Доступ проверен во втором окне.