iptables на Ubuntu в 2026 году: базовый файрвол для VPS поверх nftables

iptables на Ubuntu в 2026 году: базовый файрвол для VPS поверх nftables

iptables это классическая утилита для правил netfilter в Linux, и проект жив: на netfilter.org последней в ленте новостей стоит iptables 1.8.13. Но в Ubuntu и Debian под командой iptables давно работает не старый движок, а nftables. Ниже как это устроено, базовая политика для VPS, правила для SSH и веба, лимит подключений, логи и сохранение после перезагрузки.

iptables сейчас работает поверх nftables

В Debian, по вики проекта, стандартный файрвол уже nftables, а старый iptables объявлен устаревшим. Привычные команды при этом остаются: пакет ставит iptables-nft, которая принимает синтаксис iptables, а правила пишет в подсистему nf_tables ядра. В Ubuntu так же. Проверить, какой у вас вариант:

sudo iptables -V
# iptables v1.8.x (nf_tables) значит nft-вариант
# iptables v1.8.x (legacy) значит старый движок

Практический вывод: старые инструкции с iptables работают, но не смешивайте legacy и nft-варианты на одной машине и не правьте руками правила, которыми владеет UFW, firewalld или Docker. Если на сервере уже включён UFW, правьте правила через него.

Цепочки и порядок правил

  • INPUT: пакеты, адресованные самому серверу.
  • OUTPUT: исходящие с сервера.
  • FORWARD: транзитные, через сервер (роутер, VPN, контейнеры).

Правила в цепочке проверяются сверху вниз до первого совпадения с действием ACCEPT, DROP или REJECT. Если ничего не совпало, срабатывает политика цепочки (-P). Посмотреть текущие правила со счётчиками и без DNS-запросов:

sudo iptables -L -v -n --line-numbers

Базовая политика для VPS

Главное правило: сначала разрешить loopback, уже установленные соединения и SSH, и только потом ставить DROP по умолчанию. Иначе отрежете себе доступ. На проде держите открытой консоль в панели провайдера.

sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p icmp -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT

Без строки ESTABLISHED,RELATED ломаются ответы на исходящие соединения сервера: apt, DNS, запросы к API. ICMP лучше не закрывать полностью, на нём держатся ping и определение MTU. Если SSH на другом порту, поменяйте 22 на свой.

Для IPv6 правила отдельные, их задаёт ip6tables с тем же синтаксисом. Если у сервера есть IPv6-адрес, а правила есть только для IPv4, по IPv6 все порты открыты.

Доступ по адресам

# служебный порт только из своей сети
sudo iptables -A INPUT -p tcp -s 192.0.2.0/24 --dport 5432 -j ACCEPT
# заблокировать адрес раньше остальных правил
sudo iptables -I INPUT 1 -s 203.0.113.50 -j DROP
# удалить правило по номеру
sudo iptables -D INPUT 5

-A добавляет правило в конец, -I INPUT 1 вставляет первым. Для постоянного бана по логам удобнее Fail2Ban, который сам добавляет и снимает такие правила.

Лимит новых SSH-подключений

sudo iptables -I INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --set --name ssh
sudo iptables -I INPUT 2 -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 4 --name ssh -j DROP

Если с одного адреса за минуту приходит четвёртое новое подключение к SSH, оно отбрасывается. Модуль recent описан в man iptables-extensions. Это грубая защита от перебора, не замена ключам и Fail2Ban. Глобальный лимит SYN на весь INPUT лучше не ставить: на живом сайте он режет обычных посетителей, а от SYN-флуда в ядре есть syncookies (net.ipv4.tcp_syncookies = 1, обычно включено по умолчанию).

Логи

sudo iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables-drop: " --log-level 4

LOG не останавливает пакет, после записи обработка идёт дальше. Ставьте такое правило последним, перед политикой DROP, тогда в журнал попадут только отброшенные пакеты. Смотреть: journalctl -k | grep iptables-drop.

Сохранение после перезагрузки

Правила живут в ядре до перезагрузки. Штатный способ в Ubuntu и Debian это пакет iptables-persistent и служба netfilter-persistent:

sudo apt install iptables-persistent
sudo netfilter-persistent save
# правила лежат в /etc/iptables/rules.v4 и rules.v6

При загрузке служба сама восстанавливает rules.v4 и rules.v6. Вариант с rc.local на systemd-системах ненадёжен, его лучше не использовать.

Чеклист

  • Не ставьте -P INPUT DROP, пока не разрешены loopback, ESTABLISHED и SSH.
  • Проверьте iptables -V: nf_tables или legacy, и не смешивайте их.
  • Не забудьте про IPv6 и ip6tables.
  • После настройки netfilter-persistent save.
  • Если тонкая политика не нужна, проще UFW.

В итоге iptables в 2026 году это знакомый синтаксис поверх nftables. Для VPS хватает короткого набора: loopback, установленные соединения, SSH, 80 и 443, DROP по умолчанию, отдельно IPv6 и сохранение через netfilter-persistent. Новые конфигурации в Debian разумнее писать сразу на nftables, но старые правила iptables продолжают работать без переделки.

Источники и ссылки


Комментарии загружаются…