1. Архитектура и логика работы iptables: хуки Netfilter
Архитектура и логика работы iptables: хуки Netfilter
Многие начинающие системные администраторы воспринимают настройку сетевой безопасности как слепое копирование команд из интернета. Это приводит к тому, что при малейшем отклонении от шаблона или возникновении нестандартной сетевой атаки защита рушится. Чтобы осознанно управлять трафиком, необходимо понимать, что происходит с сетевым пакетом в ту самую миллисекунду, когда он достигает сетевой карты вашего сервера.
Первое и самое важное правило, которое необходимо усвоить: iptables не является файрволом в прямом смысле этого слова. Это лишь утилита пользовательского пространства (user-space), которая позволяет администратору передавать команды в ядро операционной системы Linux. Настоящим межсетевым экраном, выполняющим всю тяжелую работу по фильтрации и модификации пакетов, является встроенный в ядро фреймворк Netfilter.
> Netfilter — это набор перехватчиков (хуков) внутри сетевого стека ядра Linux, которые позволяют модулям ядра регистрировать функции обратного вызова для обработки каждого проходящего сетевого пакета.
Чтобы понять эту связку, представьте себе современный аэропорт. Netfilter — это физические контрольно-пропускные пункты, рамки металлоискателей и ленты досмотра багажа. А iptables — это свод правил, который вы выдаете службе безопасности: «пассажиров с красными паспортами отправлять на дополнительный досмотр», «жидкости объемом более 100 мл изымать». Без правил (iptables) пункты досмотра (Netfilter) будут просто пропускать всех подряд.
Пять хуков Netfilter
Любой сетевой пакет, попадающий в систему или покидающий ее, движется по строго определенному маршруту. На этом маршруте ядро Linux расставило пять контрольных точек — хуков (hooks). В этих точках пакет может быть приостановлен, изучен, изменен или уничтожен.
NF_IP_PRE_ROUTING — перехватывает любой входящий трафик сразу после того, как он попадает в сетевой стек от драйвера сетевой карты, но до того, как ядро примет решение о маршрутизации.NF_IP_LOCAL_IN — срабатывает, если после принятия решения о маршрутизации выясняется, что пакет предназначен самому локальному серверу (например, запрос к вашему веб-серверу на порт 80).NF_IP_FORWARD — активируется, если пакет предназначен другому узлу, а ваш сервер выступает в роли маршрутизатора (роутера).NF_IP_LOCAL_OUT — перехватывает пакеты, которые были сгенерированы локальными процессами самого сервера (например, ваш сервер скачивает обновления) перед их отправкой в сеть.NF_IP_POST_ROUTING — финальная точка для любого исходящего или транзитного трафика перед тем, как он будет передан драйверу сетевой карты для отправки в кабель.Таблицы и цепочки: организация правил
Утилита iptables организует правила управления трафиком в виде иерархической структуры: Таблицы Цепочки Правила.
Таблицы (Tables)
Таблицы группируют правила по их глобальному назначению. Всего существует четыре основные таблицы:Цепочки (Chains)
Цепочки — это прямые проекции хуков Netfilter в интерфейс iptables. Их названия пишутся заглавными буквами и соответствуют точкам перехвата:PREROUTING привязана к хуку NF_IP_PRE_ROUTINGINPUT привязана к хуку NF_IP_LOCAL_INFORWARD привязана к хуку NF_IP_FORWARDOUTPUT привязана к хуку NF_IP_LOCAL_OUTPOSTROUTING привязана к хуку NF_IP_POST_ROUTINGНе каждая таблица присутствует в каждой цепочке. Ядро оптимизировано так, чтобы не выполнять лишних проверок. Например, таблица filter не имеет смысла в цепочке PREROUTING, так как решение о блокировке логичнее принимать после того, как станет ясно, куда идет пакет.
| Цепочка / Таблица | raw | mangle | nat | filter | | :--- | :--- | :--- | :--- | :--- | | PREROUTING | Да | Да | Да | Нет | | INPUT | Нет | Да | Нет | Да | | FORWARD | Нет | Да | Нет | Да | | OUTPUT | Да | Да | Да | Да | | POSTROUTING | Нет | Да | Да | Нет |
!Схема прохождения сетевого пакета через таблицы и цепочки Netfilter
Жизненный цикл сетевого пакета
Чтобы научиться писать эффективные правила, необходимо уметь мысленно «пройти» путь вместе с пакетом. Рассмотрим три классических сценария из реальной практики.
Сценарий 1: Пакет предназначен вашему серверу
Предположим, хакер пытается подключиться к вашему серверу по SSH (порт 22). Пакет размером 64 байта поступает на сетевой интерфейсeth0.PREROUTING. Сначала он проходит таблицу raw, затем mangle, затем nat. На этом этапе мы могли бы перенаправить его на другой порт, но если правил нет, пакет идет дальше.INPUT. Здесь он проходит таблицы mangle и filter. Именно в таблице filter цепочки INPUT должно находиться правило, которое проверит IP-адрес хакера и заблокирует пакет.Сценарий 2: Сервер выступает в роли маршрутизатора
Ваш сервер работает как шлюз для офисной сети. Сотрудник отправляет запрос к внешнему сайту.PREROUTING.FORWARD. Здесь в таблице filter мы можем запретить сотрудникам доступ к определенным ресурсам.POSTROUTING. Здесь в таблице nat происходит маскарадинг — внутренний IP-адрес сотрудника подменяется на внешний IP-адрес сервера, чтобы ответ смог вернуться обратно.Сценарий 3: Сервер сам инициирует соединение
Вы запустили команду обновления системыapt-get update.OUTPUT, проходя таблицы raw, mangle, nat и filter.POSTROUTING (таблицы mangle и nat).Правила и действия (Targets)
Когда пакет проходит через цепочку, он по очереди, сверху вниз, сверяется с каждым правилом. Правило состоит из критерия (например, «протокол TCP, порт 80») и действия (target).
Если пакет совпадает с критерием, к нему применяется действие, и дальнейшая проверка в этой цепочке (как правило) прекращается. Если пакет прошел все правила и ни с одним не совпал, применяется политика по умолчанию (default policy).
Основные действия в таблице filter:
Stateful-фильтрация: память Netfilter
Исторически первые файрволы были stateless (без сохранения состояния). Они проверяли каждый пакет изолированно. Если вы разрешали входящий трафик на порт 80, вам приходилось вручную разрешать исходящий трафик с порта 80, чтобы сервер мог ответить клиенту.
Netfilter обладает модулем conntrack (connection tracking), который делает iptables stateful-файрволом. Ядро запоминает контекст передачи данных. Когда ваш сервер отправляет запрос к DNS-серверу, conntrack создает запись в оперативной памяти. Когда возвращается ответный пакет, Netfilter узнает его и пропускает автоматически, как часть уже «установленного» (ESTABLISHED) соединения, даже если явного правила для входящего DNS-трафика нет.
Понимание этой архитектуры — ключ к профессиональной работе с сетью в Linux. В следующих материалах мы перейдем от теории к практике и начнем конструировать надежный набор правил для защиты типового веб-сервера, опираясь на изученные сегодня цепочки и таблицы.