nftables dnat в цепочке input

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

Я пытаюсь перенаправить весь трафик, поступающий на брандмауэр на портах 80 и 443, на 10.133.8.11.

Я понимаю из этого, что NAT в цепочке input должен быть возможен. Но, похоже, днат не работает. Какой вид NAT возможен?

Причина, по которой я пытаюсь сделать это с помощью цепочки input, заключается в том, что если я помещу это в цепочку prerouting, весь трафик будет перенаправлен, а не только трафик, предназначенный для брандмауэра.

Вот моя попытка на данный момент:

таблица inet nat уже существует.

# nft 'add chain inet nat input { type nat hook input priority -100; }'

# nft 'add rule inet nat input tcp dport { 80, 443 } dnat ip to 10.133.8.11'
Ошибка: Не удалось обработать правило: Операция не поддерживается
add rule inet nat input tcp dport { 80, 443 } dnat ip to 10.133.8.11
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

#
``

Вы пытаетесь перенаправить пакеты, поступающие на локальный порт, на нелокальное назначение. Чтобы это сработало, перенаправление должно быть выполнено до принятия решения о маршрутизации, то есть в цепочке PREROUTING.

Пакеты в цепочке INPUT уже находятся на пути к доставке какому-то локальному процессу, поэтому, хотя изменение номера порта не должно вызывать ограничений, изменение IP-адреса назначения, возможно, невозможно или ограничено только адресами, которые используются на локальном хосте.

Вы можете сделать что-то вроде

nft 'add chain inet nat prerouting { type nat hook prerouting priority -100; };'
nft 'add rule inet nat prerouting ip daddr <IP-адрес брандмауэра здесь> tcp dport { 80, 443 } dnat ip to 10.133.8.11'

Поскольку ваш DNAT влияет на решение о маршрутизации (локальный против нелокального), это должно быть выполнено в хуке prerouting.

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

И да, вы можете требовать, чтобы пакет соответствовал более чем одному критерию (например, адресу назначения и порту назначения) в одном правиле.

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

Вопрос: DNAT в цепочке INPUT nftables

Вы пытаетесь перенаправить весь трафик, поступающий на брандмауэр на порты 80 и 443, на IP-адрес 10.133.8.11. В Вашем запросе упоминается, что Вы хотите использовать цепочку INPUT для этого перенаправления, но столкнулись с ошибкой при попытке добавить правило DNAT в этой цепочке.

Понимание работы NAT и цепочек nftables

В правилах обработки сетевого трафика важным является порядок обработки пакетов и то, в какой цепочке выполняется NAT. NAT, или преобразование сетевых адресов, работает путем изменения адресов IP пакетов. В случае DNAT (Destination NAT), пакет направляется к другому IP-адресу до того, как будет выполнено какое-либо маршрутизирование.

Почему DNAT не работает в цепочке INPUT

Когда трафик поступает в цепочку INPUT, он уже на пути к сопоставлению с локальным процессом на вашей машине. Поскольку такие пакеты уже рассматриваются как направленные к локальному порту, изменение их IP-адреса (особенно на адрес, который не является локальным) может вызвать проблемы, так как пакеты должны быть переданы какому-то процессу на самой машине. Это является причиной ошибочного сообщения: "Операция не поддерживается".

Для корректного перенаправления трафика с помощью DNAT необходимо использовать цепочку PREROUTING. Данная цепочка обрабатывает пакеты до того, как будет известно, на какой именно локальный адрес они будут направлены, что позволяет эффективно перенаправлять пакеты на другой IP-адрес.

Решение: Использование цепочки PREROUTING

Чтобы выполнить желаемое перенаправление трафика, используя цепочку PREROUTING, вам следует выполнить следующие команды:

nft 'add chain inet nat prerouting { type nat hook prerouting priority -100; }'
nft 'add rule inet nat prerouting ip daddr <IP-адрес вашего брандмауэра> tcp dport { 80, 443 } dnat ip to 10.133.8.11'

Здесь <IP-адрес вашего брандмауэра> — это адрес вашей машины, который вы хотите перенаправить. Важно понимать, что в этом случае ваши правила также должны учитывать, что дальнейшие правила (например, в цепочке FORWARD) должны позволять такие перенаправленные пакеты.

Итог

Суммируя вышесказанное, DNAT возможно реализовать только в цепочке PREROUTING, так как только там у нас есть возможность изменять адрес назначения пакетов до принятия решения о том, куда они должны быть отправлены. Это решение позволит перенаправить трафик на 10.133.8.11 только для пакетов, поступающих на порты 80 и 443.

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

Если у вас возникнут дополнительные вопросы, всегда рад помочь!

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

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