opened image

iptables для начинающих: правила и цепочки без страха

 

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.