Все системы в норме · Средняя загрузка нод: 23% · Потери пакетов: 0,41 мс Статус сети →
Безопасность · 11 минут · обновлено 22.05.2026

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 включена в автозагрузку.
  • Доступ проверен во втором окне.
Дальше: шифрование диска LUKS — данные, недоступные никому, включая нас.