Stateful-фильтрация: почему firewall помнит соединения

Урок объясняет разницу между firewall, который помнит соединения, и тем, который судит о каждом пакете отдельно.

Stateful firewall — экран, который отслеживает состояние соединений и принимает решения с учётом контекста, а не по одному пакету.

Зачем помнить состояние

Stateless-firewall видит каждый пакет изолированно и вынужден разрешать целые диапазоны портов «на всякий случай» для ответов. Stateful помнит, что вы инициировали соединение, и автоматически пропускает только относящиеся к нему ответы. Это и безопаснее, и проще в настройке.

Таблица состояний

СостояниеЧто значит
NEWпервый пакет нового соединения
ESTABLISHEDпакет существующего соединения
RELATEDсвязанное соединение (например, данные FTP)
INVALIDпакет не относится ни к чему — отбрасываем

Как работает под капотом

Ядро ведёт таблицу отслеживания соединений (conntrack). При исходящем соединении туда добавляется запись; ответные пакеты сопоставляются с ней и получают статус ESTABLISHED. Подделанный пакет, не соответствующий ни одной записи, помечается INVALID и отбрасывается. Так firewall отсекает многие пакеты, не относящиеся к легитимным сессиям.

Исходящее SYN -> conntrack: запись NEW
Ответ SYN-ACK -> совпало -> ESTABLISHED -> пропустить
Левый пакет   -> нет записи -> INVALID -> DROP

Польза для защиты

  • Не нужно открывать широкие диапазоны портов для ответов — меньше поверхность атаки.
  • Подделанные пакеты без валидной сессии отбрасываются.
  • Лимиты на новые соединения (NEW) дают базовую устойчивость к флуду.

Базовый rate-limit (концепт)

# ограничить частоту новых SSH-подключений
iptables -A INPUT -p tcp --dport 22 -m state --state NEW \
  -m limit --limit 5/min -j ACCEPT

Частые ошибки

  • Использовать stateless-подход и открывать высокие порты «для ответов» — лишняя поверхность.
  • Не отбрасывать INVALID-пакеты.
  • Считать, что conntrack бесконечен: при флуде таблица может переполниться — нужны лимиты.

Итоги

  • Stateful-firewall помнит соединения и пропускает только их ответы.
  • Пакеты без валидной сессии (INVALID) отбрасываются.
  • Лимиты на NEW-соединения дают базовую защиту от флуда.
Проверьте себя
1. Чем stateful-firewall лучше stateless?
AОн быстрее, но менее безопасен
BОн помнит соединения и пропускает только их ответы, не открывая лишние порты
CОн не требует правил
DОн шифрует трафик
2. Что делать с пакетами в состоянии INVALID?
AПропускать
BЛогировать и пропускать
CОтбрасывать (DROP)
DПеренаправлять