Есть ли необходимость в цепочке INPUT таблицы nat?

Вопрос или проблема

Страница руководства iptables предлагает следующие стандартные таблицы и цепочки:

                raw     mangle  nat     filter
PREROUTING       X       X       X       
INPUT                    X       X       X
FORWARD                  X               X
OUTPUT           X       X       X       X
POSTROUTING              X       X

Но диаграмма на википедийной странице iptables не указывает на использование цепочки nat INPUT. Я знаю, что диаграмма является упрощением, поскольку, например, они намеренно опускают таблицу безопасности. Это может быть педантичный вопрос, поскольку я пытаюсь самостоятельно изучить брандмауэры, но ответ может быть интересен.
вставьте описание изображения здесь

ОБНОВЛЕНИЕ: исправьте порядок nat/INPUT.

Схема изначально не включала nat/INPUT, но я неправильно написал, что она была перед filter/INPUT, и эта схема (неправильно) была обновлена позже с этой цепочкой между mangle/INPUT и filter/INPUT, что оказалось неверным.

nat/INPUT срабатывает после filter/INPUT.

Поскольку тип nat является специальным и связан с conntrack, оказывается, что приоритет nftables даже не зависит от приоритета хуков, что для nat влияет только на приоритеты между несколькими цепочками внутри одного и того же nat хука. Использование nftables вместо iptables не может изменить это, изменив приоритет на значение ниже, чем 0 для filter/INPUT или -150 для mangle/INPUT: он всегда срабатывает точно на 100. (Тот же поведение с nat/PREROUTING: он всегда срабатывает точно на -100 для PREROUTING, даже если задавать приоритет цепочки -199). Все это можно проверить, используя iptables-j TRACE или nftablesmeta nftrace set 1 и наблюдая за последовательностью проходящих цепочек. Тесты проводились на ядре 5.13.x, специфическое поведение по этому поводу может измениться в будущем. iptables даже не имея возможности изменить эти приоритеты все равно не имеет выбора.

Как написал @Эндрю Бейт, правильная схема, отображающая правильный порядок, может быть найдена здесь с текущим изображением:

схема

Что касается вопроса…


nat/PREROUTING будет применяться перед первоначальным решением маршрутизации, для всех случаев (маршрутный или для локального трафика), nat/INPUT произойдет после первоначального решения маршрутизации, только если трафик считается локальным.

Таким образом, реализовано в отношении маршрутизации и отслеживания соединений перед маршрутизацией, с nat/PREROUTING, вам разрешается изменять то, что повлияет на маршрутизацию: назначение (-j DNAT), но не источник. После маршрутизации, с nat/INPUT, это наоборот: вы не можете изменить назначение, но можете изменить источник (-j SNAT).

У вас есть определенная инвертированная симметрия с nat/OUTPUT (которая на схеме) и nat/POSTROUTING: nat/OUTPUT предназначен только для локально инициированного трафика и может изменять решение маршрутизации, как в nat/PREROUTING, тем самым может изменять назначение (с -j DNAT), второй предназначен для всего трафика, маршрутизируемого или локально инициированного, после того, как любое решение маршрутизации уже было принято (и может изменять источник, как nat/INPUT, с -j SNAT).

Отвечая на вопрос, nat/INPUT не существовал, пока не возникла необходимость. Он был специально создан для обработки новых возникающих случаев, избегая необходимости в пространстве имен, но используя зоны conntrack вместо этого. Он появился в 2010 году. Эта ссылка включает примеры использования, которые мотивировали его создание, но их довольно трудно понять, поскольку они используют зоны conntrack (которые позволяют разделять абсолютно идентичные потоки (одинаковые 5-тугли протокола, saddr, sport, daddr, dport) на разные записи conntrack, добавляя на них тег зоны. Например, для специального маршрута полисного трафика, один приходит с eth0 и идет на eth2, другой приходит с eth1 и идет на eth3, или, как в первой ссылке, для возвратного трафика и его отслеживания/nat отдельно).

Ответ или решение

Необходимость цепочки INPUT в таблице NAT: Детальное исследование и объяснение

Вопрос о необходимости использования цепочки INPUT в таблице NAT является важным для понимания работы фаерволов на базе iptables, и требует внимательного рассмотрения. В ответе я рассмотрю назначение этой цепочки и контекст, который позволяет понять её важность.

Основные концепции iptables и архитектура NAT

  1. Понимание iptables: iptables — это инструмент для настройки правил фильтрации пакетов в Linux. Он использует различные таблицы для обработки сетевых пакетов в зависимости от их назначения:

    • filter: основной уровень фильтрации.
    • nat: используется для изменения заголовков пакетов, например, для трансляции адресов.
    • mangle: предназначен для модификации пакетов в более специфических целях.
    • raw: используется для пропуска пакетов через определенные правила до обработки conntrack.
  2. Цепочки нат:

    • PREROUTING: позволяет изменить пакеты перед их маршрутизацией.
    • INPUT: используется для обработки пакетов, адресованных локальному хосту.
    • FORWARD: управляет пакетами, которые проходят через хост, но не предназначены для него.
    • OUTPUT: изменяет пакеты, исходящие из локального хоста.
    • POSTROUTING: позволяет изменять пакеты после выхода из интерфейса.

Назначение цепочки INPUT в таблице NAT

Цепочка INPUT в таблице NAT существует для обработки трафика, который уже был маршрутизирован к локальному хосту, и предоставляет возможность изменять заголовки пакетов, которые приходят на этот хост. Основные функции этой цепочки:

  • SNAT (Source Network Address Translation): Эта техника позволяет изменить исходящий адрес источника пакетов, что может быть полезно в ситуациях, когда требуется скрытие реального IP-адреса хоста.
  • Conntrack: Важность цепочки INPUT также связана с механизмом отслеживания соединений (conntrack), который позволяет отслеживать состояния соединений и управлять ими. Это особенно полезно в сложных сетевых сценариях, где требуется разделение идентичных потоков трафика с использованием меток зон для conntrack.

Примеры использования и потребность в цепочке NAT/INPUT

  1. Сложные сценарии маршрутизации: В ситуациях, когда требуется адресация для трафика, проходящего через специальный маршрутизатор или сервер, необходимость в NAT/INPUT становится очевидной. Например, когда трафик поступает с одного интерфейса и должен быть переправлен на другой с модификацией IP-адреса.

  2. Потоки с разными зонами: Использование conntrack зон для идентификации и управления идентичными потоками трафика, поступающими от разных интерфейсов, делает цепочку INPUT в NAT еще более необходимой для решения задач изоляции трафика и управления сетевыми политиками.

Заключение

Таким образом, цепочка NAT/INPUT действительно необходима в определённых контекстах сетевой маршрутизации и трансляции адресов. Она не является избыточной, а служит для специфических случаев, связанных с обработкой трафика, адресованного локальному хосту. Понимание этой цепочки и её функций поможет в дальнейшем более глубоком изучении построения и настройки сетевых фаерволов, а также в более эффективном управлении сетевым трафиком.

Эта информация станет полезной для администраторов и сетевых инженеров, стремящихся к более тщательному пониманию работы NAT и функциональности iptables.

Оцените материал
Добавить комментарий

Капча загружается...