Рейтинг:2

iptables/nftables: как исключить весь пересылаемый трафик из отслеживания соединений на маршрутизаторе?

флаг ua

Ящик с Linux имеет несколько сетевых интерфейсов. IP-переадресация включена для IPv4 и IPv6.

Я хотел бы защитить службы, работающие на самом маршрутизаторе, через брандмауэр с отслеживанием состояния. Для этого необходимо включить отслеживание соединений. При этом хотелось бы исключить из отслеживания соединений весь трафик, который перенаправляется с одного интерфейса на другой.

Для межсетевого экрана с отслеживанием состояния я обычно использую цепочки INPUT и OUTPUT таблицы фильтров. Переадресованный трафик будет идти в цепочку FORWARD. Но, насколько мне известно, нет способа пометить трафик как неотслеживаемый в цепочке FORWARD. Такая логика должна идти в цепочку PREROUTING в необработанной таблице. Но, я полагаю, в цепочке PREROUTING еще не решено, пробрасывать трафик или нет.

Отслеживание соединений имеет много недостатков, например, отбрасывание пакетов, когда список отслеживаемых соединений достигает максимального размера.

Как проще всего исключить переадресованный трафик (и только этот переадресованный трафик) из отслеживания соединений?

A.B avatar
флаг cl
A.B
Можете ли вы указать схему вашей сети (`ссылка ip -br; адрес ip -br; маршрут ip -4; маршрут ip -6`) и указать, ожидается ли какой-либо NAT?
флаг ua
Просто рассмотрим маршрутизатор с двумя интерфейсами, eth0 и eth1 с адресами 192.168.1.1/24 и 192.168.2.1/24.
Рейтинг:1
флаг cl
A.B

Для общего набора правил можно задать nftables выполнить поиск маршрута заранее, используя выдумка выражение вместо того, чтобы ждать, пока это сделает стек маршрутизации. Это позволяет задействовать (будущее) вывод интерфейс, несмотря на то, что он еще не существует (решение о маршрутизации не принято), за счет дополнительного поиска. Затем, если результаты показывают, что пакет будет маршрутизирован, предотвратите отслеживание с помощью неттрек утверждение.

ВЫРАЖЕНИЯ ФИБ

выдумывать {саддр | отец | отметка | иф | оиф} [. ...] {oif | имя | тип}

А выдумка выражение запрашивает выдумка (экспедиционная информационная база) на получить такую ​​информацию, как индекс выходного интерфейса конкретного адрес будет использовать. Вход представляет собой кортеж элементов, который используется как вклад в выдумка поисковые функции.

ЗАЯВЛЕНИЕ НЕ ОТСЛЕЖИВАТЬ

Оператор notrack позволяет отключить отслеживание соединения для определенные пакеты.

неттрек

Обратите внимание, что для того, чтобы это утверждение было эффективным, оно должно быть применено к пакеты перед коннтрек происходит поиск. Значит надо сидеть в цепочке с любым предварительная маршрутизация или же вывод хук и приоритет хука от -300 или меньше.

Поэтому следует выполнить «простую» проверку маршрута из предварительная маршрутизация, используя только адрес назначения в качестве селектора и проверяя наличие выходного интерфейса (немаршрутизируемые пакеты или пакеты, предназначенные для хоста, не разрешаются). Есть исключение для вот (петлевой) интерфейс для отслеживания: хотя он представляет собой локальный трафик, пакет, отправленный (через вывод путь) от хоста к себе возвращается через предварительная маршрутизация path и имеет выходной интерфейс вот тоже. Поскольку исходящий пакет уже создал коннтрек вход, лучше держите это последовательным.

nft добавить IP-адрес таблицы без сохранения состояния
nft add chain ip stateless prerouting '{ type filter hook prerouting priority -310; политика принять; }'
nft добавить правило IP prerouting без сохранения состояния iif != lo fibdddr oif существует notrack

Замена IP семья с инет семейство комбо должно распространять такое же общее поведение на IPv4+IPv6.

Чтобы быть более конкретным, можно указать будущий выходной интерфейс с помощью fib ddr oif eth1 например, что более или менее эквивалентно эт1, но также доступны в предварительная маршрутизация.

Конечно, если топология известна заранее, можно избежать поиска в FIB, используя одно или несколько правил, основанных на проверке адресов, поскольку в этом случае маршруты заранее известны администратору. Может потребоваться сравнительный анализ результатов, чтобы узнать, является ли это более интересным, чем сохранение универсального метода.

Например, с предоставленной OP информацией, заменив предыдущее правило на:

nft добавить правило ip без сохранения состояния prerouting 'ip daddr!= {192.168.1.1, 192.168.2.1, 127.0.0.0/8} notrack'

должен иметь почти эквивалентный эффект. 127.0.0.0/8 присутствует по тем же причинам, что и выше, с вот интерфейс.

Обработка широковещательной рассылки (например, 192.168.1.255, полученной на eth0) и многоадресная рассылка (например, локальная ссылка 224.0.0.1, полученная на интерфейсе) могут не работать одинаково в обоих методах и не так, как ожидалось, и, возможно, потребуются дополнительные правила для конкретных нужд, особенно для второго метода. Поскольку отслеживание широковещательной и многоадресной рассылки редко бывает полезным, поскольку источник ответа не будет (и не может) исходным адресом назначения широковещательной или многоадресной рассылки, поэтому запись conntrack никогда не «увидит» двунаправленный трафик, обычно это не имеет большого значения для правила состояния.


Примечания

  • Обычно это несовместимо с NAT с отслеживанием состояния.

    Насколько я понимаю, DNAT в направлении удаленного хоста получит свой ответный трафик, не де-NAT, и потерпит неудачу, и что перенаправленный SNAT не сработает, поскольку не было коннтрек запись создана. Редко используемый SNAT во входном пути должен подойти, и комбинация DNAT+SNAT (с использованием локального источника адреса) также может работать, поскольку в этом случае как в исходном, так и в ответном направлениях задействован локальный пункт назначения, поэтому коннтрек запись должна всегда правильно создаваться или искаться.

  • стандартный набор правил

    Актуальные правила использования iptables или же nftables (в своей собственной другой таблице) может выполняться как обычно, включая правила с отслеживанием состояния для самого хоста. Поскольку маршрутизируемый трафик не будет создавать коннтрек записи, правила, если таковые имеются, связанные с таким трафиком, должны оставаться только без гражданства и не использовать какие-либо кт выражение, потому что оно никогда не будет соответствовать.

  • проверка поведения

    Можно проверить общее поведение даже без надлежащих правил брандмауэра:

    • с помощью манекена кт правило, чтобы убедиться, что коннтрек объект регистрируется в текущем сетевом пространстве имен.

      nft добавить таблицу ip mytable
      nft add chain ip mytable mychain '{ type filter hook prerouting priority -150; политика принять; }'
      nft добавить правило ip mytable mychain ct состояние новое
      
    • использовать коннтрек инструмент для отслеживания событий:

      коннтрак -E
      
    • генерировать трафик с удаленного

      НОВЫЙ коннтрек записи будут созданы для трафика, который должен быть получен маршрутизатором, но не для маршрутизируемого трафика.

флаг ua
Это вымышленное выражение — именно то, что я искал. Проверка того, является ли папочка локальным адресом, может сработать. Но учитывая, что некоторые адреса (например, некоторые IPv6) со временем могут измениться, мне это кажется непрактичным.
флаг ua
Что делать, если существует недостижимый маршрут? Будет ли этот трафик также соответствовать `fib ddr oif exists`?
A.B avatar
флаг cl
A.B
Если нет маршрута, то нет и выходного интерфейса: нет notrack. Но на самом деле, в то время как правила до решения о маршрутизации будут иметь `ct state new`, соответствующие таким пакетам, conntrack не зафиксирует его, потому что он отброшен на полпути (в фактическом решении о маршрутизации): `conntrack -E` вообще не отобразит его. Так что цель все же достигнута. (Помимо этого, во время тестов мне не удалось заставить `oifdddr type xxx` соответствовать ожидаемому, когда нет маршрута.)

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.