
iptables - инструмент управления сетевым фильтром ядра Linux (Netfilter). Несмотря на то что nftables постепенно его вытесняет, iptables по-прежнему стоит на большинстве серверов с Ubuntu 20.04/22.04 и CentOS 7. Пять минут практики - и базовая защита VPS готова.
Как это работает: цепочки и таблицы
Входящий пакет проходит через последовательность правил. Proxmox VE делает то же самое для LXC и VM. Упрощённая схема:
Входящий трафик -> PREROUTING -> [маршрутизация] -> INPUT (для локальных процессов)
-> FORWARD (для транзитного трафика)
Исходящий трафик -> OUTPUT -> POSTROUTING -> сеть
Три главные цепочки:
INPUT - пакеты, предназначенные локальному хосту
OUTPUT - пакеты, исходящие от локального хоста
FORWARD - транзитные пакеты (актуально для роутеров и VPN-серверов)
Таблица filter - стандартная, используется по умолчанию. Есть также nat и mangle, но они нужны для более специфических задач.
Каждое правило заканчивается одним из действий (targets):
ACCEPT- пропустить пакетDROP- отбросить без ответаREJECT- отбросить с ICMP-ошибкой (отправитель знает, что соединение отклонено)
Просмотр текущих правил
sudo iptables -L -v -n --line-numbers
Флаги:
-L- показать правила-v- verbose, с счётчиками пакетов-n- числовой вывод IP без DNS-резолва (быстрее)--line-numbers- номера строк (нужны для удаления конкретного правила)
На чистом сервере Ubuntu вывод обычно показывает пустые цепочки с политикой ACCEPT - весь трафик разрешён.

Базовый набор правил
Строим файрвол с нуля. Сначала создаём скрипт, чтобы легко переприменить правила после ребута:
sudo nano /etc/iptables/rules.sh
#!/bin/bash
# Сбрасываем все текущие правила
iptables -F
iptables -X
iptables -Z
# Политики по умолчанию
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# Разрешаем loopback
iptables -A INPUT -i lo -j ACCEPT
# Разрешаем established и related соединения
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# SSH - разрешаем с любого IP
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# HTTP и HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# ICMP ping - разрешаем
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
echo "Правила применены"
iptables -L -v -n
sudo chmod +x /etc/iptables/rules.sh
sudo bash /etc/iptables/rules.sh
Критически важна строка с ESTABLISHED,RELATED - без неё исходящие соединения (apt update, curl, etc.) сломаются, потому что ответные пакеты будут отброшены политикой DROP на INPUT.
Ограничение SSH по IP
Если SSH нужен только с конкретного IP, ограничиваем доступ:
# Сначала удаляем общее правило для порта 22
iptables -D INPUT -p tcp --dport 22 -j ACCEPT
# Добавляем только для своего IP
iptables -A INPUT -p tcp --dport 22 -s 203.0.113.5 -j ACCEPT
Если несколько офисов или IP меняется - создаём набор адресов через ipset:
sudo apt install ipset -y
ipset create allowed-admins hash:ip
ipset add allowed-admins 203.0.113.5
ipset add allowed-admins 198.51.100.10
iptables -A INPUT -p tcp --dport 22 -m set --match-set allowed-admins src -j ACCEPTЗащита от брутфорса
Ограничиваем количество новых SSH-соединений: не более 3 попыток в минуту:
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --name SSH -j DROP
Первое правило регистрирует каждое новое соединение. Второе блокирует, если с одного IP за 60 секунд пришло 4 и более новых запросов.
Для более надёжной защиты используйте fail2ban в паре с iptables - fail2ban автоматически добавляет IP в blocklist на основе паттернов из логов.
Дополнительные полезные правила
Блокировка конкретного IP
iptables -A INPUT -s 185.234.219.0/24 -j DROPРазрешить доступ к PostgreSQL только с определённого IP
iptables -A INPUT -p tcp --dport 5432 -s 10.0.0.5 -j ACCEPT
iptables -A INPUT -p tcp --dport 5432 -j DROPЛогирование заблокированных пакетов
iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables-DROP: " --log-level 4
iptables -A INPUT -j DROP
Логи попадают в /var/log/kern.log. Флаг --limit предотвращает переполнение лога при DDoS.

Сохранение правил: iptables-persistent
Правила iptables сбрасываются при перезагрузке. Для сохранения устанавливаем iptables-persistent:
sudo apt install iptables-persistent -y
При установке спрашивает, сохранить ли текущие правила IPv4 и IPv6. Отвечаем "Yes".
Правила сохраняются в:
/etc/iptables/rules.v4- для IPv4/etc/iptables/rules.v6- для IPv6
Сохранить правила вручную в любой момент:
sudo iptables-save > /etc/iptables/rules.v4
sudo ip6tables-save > /etc/iptables/rules.v6
Загрузить сохранённые правила:
sudo iptables-restore < /etc/iptables/rules.v4
Сервис netfilter-persistent автоматически загружает правила при старте системы.
IPv6
Не забываем про IPv6 - если сервер имеет IPv6-адрес, трафик может обходить iptables (IPv4). Управляем отдельно:
# Аналогичные правила для IPv6
sudo ip6tables -P INPUT DROP
sudo ip6tables -P FORWARD DROP
sudo ip6tables -P OUTPUT ACCEPT
sudo ip6tables -A INPUT -i lo -j ACCEPT
sudo ip6tables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo ip6tables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo ip6tables -A INPUT -p icmpv6 -j ACCEPT
ICMP v6 полностью разрешаем - он нужен для корректной работы IPv6 (neighbor discovery, path MTU discovery).
Удаление конкретного правила
Смотрим номер строки:
iptables -L INPUT --line-numbers
Удаляем правило по номеру:
iptables -D INPUT 3
Или удаляем по точному совпадению (заменяем -A на -D):
iptables -D INPUT -p tcp --dport 8080 -j ACCEPT

nftables как альтернатива
На Debian 12 и Ubuntu 24.04 iptables фактически является враппером над nftables (iptables-nft). Команды те же, но под капотом используется nftables. Если начинаете с нуля на свежей системе, рассмотрите nftables напрямую: синтаксис удобнее, правила загружаются из одного файла, производительность немного выше при большом числе правил.
Итог
Базовый файрвол сводится к трём шагам: политика DROP на INPUT, разрешаем ESTABLISHED/RELATED, разрешаем нужные порты. iptables-persistent сохраняет правила между перезагрузками. Ограничение SSH по IP и лимит новых соединений закрывают основные векторы атаки без дополнительного ПО. Для IPv6 нужны отдельные правила через ip6tables.