iptables: настройка stateful firewall в Linux — АйТи Фреш

iptables: настройка stateful firewall в Linux

iptables: настройка stateful firewall в Linux

Stateful firewall и conntrack: как это работает

iptables — классический инструмент управления netfilter, подсистемой firewall ядра Linux. Несмотря на то что nftables постепенно его вытесняет, iptables остаётся актуальным на огромном числе работающих серверов. Понять iptables — значит понять, как работает сетевая фильтрация в Linux в целом.

Stateful firewall — это не просто набор правил «разрешить/запретить». Это отслеживание состояния соединений через модуль conntrack. Суть: когда ваш сервер устанавливает исходящее соединение, conntrack запоминает его. Ответные пакеты пропускаются автоматически — без дополнительных правил. Это ключевое отличие от stateless firewall, где нужно явно разрешать как входящий, так и исходящий трафик для каждого соединения.

Три таблицы iptables и их назначение:

  • filter — фильтрация пакетов (INPUT, OUTPUT, FORWARD). Большинство правил здесь
  • nat — трансляция адресов (PREROUTING, POSTROUTING, OUTPUT)
  • mangle — изменение полей пакетов (маркировка, ToS, TTL)

Базовые правила iptables

Начнём с синтаксиса и базового набора правил. Это то, что мы ставим на каждый новый сервер перед его подключением к сети.

Синтаксис и основные команды

Главные ключи iptables, которые нужно знать:

# Просмотр правил с счётчиками и номерами строк
iptables -L INPUT -v --line-numbers
iptables -L -n -v  # все таблицы, без DNS-разрешения

# Добавить правило в конец цепочки
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# Вставить правило в начало (позиция 1)
iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT

# Удалить по номеру строки
iptables -D INPUT 3

# Сбросить все правила в цепочке
iptables -F INPUT

# Изменить политику по умолчанию
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

# Счётчики пакетов и байт
iptables -L INPUT -v
# pkts bytes target  prot opt in out source destination

Базовый stateful firewall для веб-сервера

Минимальный рабочий набор правил для сервера с nginx и SSH:

#!/bin/bash
# /etc/iptables/setup-firewall.sh

# Сбрасываем все правила
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

# Уже установленные соединения (ключ stateful firewall!)
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# ICMP — ping (ограничиваем rate)
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 10/sec -j ACCEPT

# SSH — только с доверенной подсети
iptables -A INPUT -p tcp --dport 22 -s 10.0.0.0/8 -j ACCEPT
# или без ограничений по 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

# Логируем отброшенные пакеты (optional, может быть шумно)
iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables-DROP: " --log-level 7

echo "Firewall rules applied"
iptables -L -v --line-numbers

Ключевое правило — -m conntrack --ctstate ESTABLISHED,RELATED. Без него сервер не сможет получать ответы на исходящие соединения — ни обновления пакетов, ни DNS, ничего.

Conntrack: состояния соединений

Conntrack: состояния соединений

Conntrack — модуль отслеживания соединений, сердце stateful firewall. Понимать состояния — значит понимать, почему работают или не работают правила.

Состояния conntrack

Четыре основных состояния соединения:

# Просмотр таблицы соединений
conntrack -L
# или через /proc
cat /proc/net/nf_conntrack | head -20

# Состояния:
# NEW — первый пакет нового соединения
# ESTABLISHED — соединение установлено (пакеты в обоих направлениях)
# RELATED — связанное соединение (например, FTP data для FTP control)
# INVALID — пакет не принадлежит ни одному соединению

# Статистика conntrack
conntrack -S

# Максимум отслеживаемых соединений (важно для нагруженных серверов)
cat /proc/sys/net/netfilter/nf_conntrack_max
# По умолчанию ~131072

# Увеличить если нужно
echo 524288 > /proc/sys/net/netfilter/nf_conntrack_max
# /etc/sysctl.conf: net.netfilter.nf_conntrack_max = 524288

На нагруженных серверах с тысячами одновременных соединений переполнение таблицы conntrack — реальная проблема. Симптом: «Connection refused» при наличии свободных портов. Проверяем: dmesg | grep "nf_conntrack: table full".

Защита от атак: rate limiting и брутфорс

Базовый firewall фильтрует по портам и IP. Более продвинутый — защищает от перебора паролей и DDoS на уровне пакетов.

Защита SSH от брутфорса

Rate limiting для SSH — обязательно на любом публичном сервере:

# Создаём цепочку для защиты SSH
iptables -N SSH_BRUTE
iptables -A INPUT -p tcp --dport 22 -j SSH_BRUTE

# В цепочке SSH_BRUTE:
# Разрешаем не более 4 подключений в минуту с одного IP
iptables -A SSH_BRUTE -m recent --name SSH --rcheck --seconds 60 --hitcount 4 -j DROP
iptables -A SSH_BRUTE -m recent --name SSH --set -j ACCEPT

# Защита от SYN flood
iptables -A INPUT -p tcp --syn -m limit --limit 25/second --limit-burst 50 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP

# Блокировка NULL-пакетов
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

# Блокировка XMAS-пакетов
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

# Запрет новых соединений без SYN
iptables -A INPUT -p tcp ! --syn -m conntrack --ctstate NEW -j DROP

NAT и проброс портов

iptables nat — для шлюзов и проброса портов на внутренние серверы:

# Включаем IP forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
# /etc/sysctl.conf: net.ipv4.ip_forward = 1

# Masquerade — NAT для исходящего трафика (шлюз)
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# Проброс порта: внешний 8080 → внутренний 192.168.1.10:80
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT \
  --to-destination 192.168.1.10:80
iptables -A FORWARD -p tcp -d 192.168.1.10 --dport 80 -j ACCEPT

# Просмотр nat-правил
iptables -t nat -L -v --line-numbers
Сохранение правил и автозагрузка

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

Правила iptables живут только до перезагрузки. Чтобы они применялись автоматически — нужно сохранить и настроить загрузку при старте системы.

iptables-persistent

Самый простой способ на Debian/Ubuntu:

# Установка
apt install iptables-persistent -y

# Сохранить текущие правила
netfilter-persistent save
# или
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6

# Восстановить вручную
iptables-restore < /etc/iptables/rules.v4

# Просмотр сохранённых правил
cat /etc/iptables/rules.v4

После каждого изменения правил не забывайте выполнять netfilter-persistent save. Иначе после перезагрузки вернётся старая конфигурация.

Часто задаваемые вопросы

Stateless проверяет каждый пакет независимо. Stateful отслеживает состояние соединений через conntrack: ответные пакеты уже установленного соединения пропускаются без прохода через все правила. Это и быстрее, и безопаснее.

nftables — более новый фреймворк с единым синтаксисом, лучшей производительностью и атомарными транзакциями. Ubuntu 22.04+ использует nftables. iptables на новых системах — обёртка над nftables. Начинаете с нуля — изучайте nftables.

Перед применением правил создайте cron-задачу: */5 * * * * iptables -F. Она сбросит правила через 5 минут, если заблокируете SSH. При работе удалённо держите правило ACCEPT для текущего SSH-соединения первым.

На Debian/Ubuntu: apt install iptables-persistent, затем netfilter-persistent save. Правила сохраняются в /etc/iptables/rules.v4.

Скорее всего перед DROP есть ACCEPT для ESTABLISHED,RELATED — это нормально. Другая причина: DROP стоит после ACCEPT для этого трафика. Смотрите порядок: iptables -L INPUT -v --line-numbers. Правила применяются сверху вниз.

#iptables настройка #stateful firewall linux #conntrack linux

Столкнулись с похожей задачей? Обращайтесь — решим

Если у вас происходит что-то из описанного в этой статье — или любая другая проблема с ИТ-инфраструктурой, — обращайтесь в любое время. Мои специалисты и я лично разберём ситуацию, найдём настоящую причину и доведём до решения.

Возьмёмся и за разовую задачу, и за постоянное обслуживание. Первичная консультация — бесплатно и без обязательств.

📞 +7 903 729-62-41 💬 MAX: +7 903 729-62-41 ✈️ Telegram @ITfresh_Boss

С уважением, Семёнов Евгений Сергеевич, директор «АйТи Фреш» — IT-аутсорсинг для компаний до 50 рабочих мест, 15+ лет практики

Подпишитесь на рассылку ITfresh

Каждую неделю мы выпускаем практические гайды для руководителей IT и системных администраторов. Это не просто теория! Здесь вы найдёте всё: безопасность, 1С, миграции, резервные копии и проверенные лайфхаки из наших реальных проектов.

Письмо придёт в течение минутыНе нашли его во «Входящих» — загляните в папку «Спам» или «Промоакции» и нажмите «Не спам». Так все следующие выпуски будут приходить прямо в основную почту.
Реквизиты оператора персональных данных

ООО «АЙТИ-ФРЕШ», ИНН 7719418495, КПП 771901001. Юридический адрес: 105523, г. Москва, Щёлковское шоссе, д. 92, корп. 7. Контакт: info@itfresh.ru, +7 903 729-62-41. Оператор обрабатывает e-mail подписчика в целях рассылки информационных и рекламных материалов до момента отзыва согласия.