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 продолжают работать без переделки.