Firewalls

Предпосылки: IP и маршрутизация (IP-адрес, пакет), TCP (соединение, SYN, ACK, порт), UDP (порт, датаграмма).

Протоколы маршрутизации | VPN

Сервер подключён к интернету. На нём работает веб-приложение (порт 443), SSH для администрирования (порт 22) и PostgreSQL (порт 5432). Без ограничений любой IP в интернете может попытаться подключиться к любому порту: перебирать пароли SSH, сканировать PostgreSQL, эксплуатировать уязвимости. Нужен механизм, который пропускает только разрешённый трафик.

Packet filter: простейший файрвол

Packet filter — набор правил, которые проверяют каждый пакет и решают: пропустить (allow) или отбросить (drop/reject). Правила основаны на полях заголовков: IP-адрес отправителя/получателя, протокол (TCP/UDP/ICMP), порт отправителя/получателя.

Пример набора правил для описанного сервера:

allow  TCP  any       -> self:443    # HTTP от кого угодно
allow  TCP  10.0.0.0/8 -> self:22   # SSH только из внутренней сети
drop   TCP  any       -> self:5432   # PostgreSQL закрыт снаружи
drop   any  any       -> self:*      # всё остальное — отбросить

Правила проверяются сверху вниз, срабатывает первое подходящее. Последнее правило — default deny: всё, что явно не разрешено, запрещено. Это безопаснее обратного подхода (default allow), потому что забытое правило приводит к блокировке, а не к утечке.

Packet filter работает быстро — решение принимается по каждому пакету независимо. Но он не понимает контекст: не знает, является ли пакет частью установленного соединения или это попытка атаки.

Stateful firewall: понимание соединений

Stateful firewall (файрвол с отслеживанием состояния) ведёт таблицу активных соединений — connection tracking (conntrack). Когда клиент устанавливает TCP-соединение (SYN → SYN-ACK → ACK), файрвол записывает его в таблицу. Последующие пакеты этого соединения автоматически пропускаются без проверки по всем правилам.

Преимущества. Правила становятся проще: достаточно разрешить новые (NEW) соединения на нужные порты, а ответные пакеты (ESTABLISHED) пропускаются автоматически. Файрвол может отличить легитимный ответный ACK от поддельного — если SYN на этот сокет не проходил, ACK отбрасывается.

Stateful firewall работает и для UDP: хотя UDP — connectionless, файрвол создаёт “виртуальное соединение” по паре IP:порт и помнит его в течение таймаута.

Цена: таблица conntrack потребляет память. При большом количестве активных соединений (сотни тысяч) таблица может переполниться, и новые соединения начнут отбрасываться. Размер таблицы настраивается (nf_conntrack_max на Linux).

Зоны и DMZ

В реальной инфраструктуре не два мира (внутренний и внешний), а минимум три:

Internal (внутренняя сеть) — рабочие станции, внутренние сервисы. Полный доступ между собой, ограниченный доступ наружу.

External (интернет) — недоверенная зона. Входящий трафик фильтруется жёстко.

DMZ (Demilitarized Zone — демилитаризованная зона) — промежуточная зона для серверов, доступных из интернета: веб-серверы, почтовые серверы, DNS. Доступ из интернета в DMZ разрешён на конкретные порты. Доступ из DMZ во внутреннюю сеть — запрещён или ограничен конкретными соединениями (например, DMZ-сервер → база данных во внутренней сети на порту 5432).

flowchart LR
    Internet --> FW["Firewall"]
    FW --> DMZ["DMZ<br>(web, mail, DNS)"]
    FW --> Int["Internal<br>(workstations, databases)"]

Если злоумышленник компрометирует сервер в DMZ, он не получает прямого доступа к внутренней сети — файрвол между DMZ и Internal продолжает действовать.

Application-layer firewall и WAF

Packet filter и stateful firewall работают на уровнях L3–L4: IP-адреса и порты. Они не анализируют содержимое HTTP-запросов. Application-layer firewall (L7) понимает протоколы прикладного уровня и может блокировать запросы на основе URL, HTTP-методов, содержимого тела запроса.

WAF (Web Application Firewall) — специализированный application-layer firewall для веб-приложений. Блокирует SQL-инъекции, XSS, подозрительные паттерны в запросах. Популярные реализации: ModSecurity (open source), Cloudflare WAF (CDN-integrated), AWS WAF.

WAF может работать на edge-серверах CDN — тогда вредоносный трафик блокируется до того, как достигнет origin-сервера.

Linux: iptables и nftables

На Linux файрвол реализован в ядре. iptables — классический интерфейс, использует цепочки (chains) и таблицы. nftables — более новая замена с унифицированным синтаксисом. Оба используют фреймворк обработки пакетов в ядре Linux. Connection tracking реализован модулем nf_conntrack.


Протоколы маршрутизации | VPN