firewall-cmd не позволяет перенаправление на локальный интерфейс

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

firewall-cmd не позволяет перенаправление на локальный интерфейс

Я пытаюсь перенаправить порт на интерфейсе петли, но, похоже, это не работает

firewall-cmd --list-all-zones

trusted (active)
target: ACCEPT
interfaces: lo
...
rich rules:
    rule family="ipv4" source address="127.0.0.1" forward-port port="400" protocol="tcp" to-port="500"

Но когда я запускаю nc -v 127.0.0.1 400, я получаю отказ в соединении. nc -v 127.0.0.1 500 подключается нормально.

Есть ли какие-либо советы по правильной настройке?
Спасибо

firewalld устанавливает правило в цепочке PREROUTING таблицы nat. Эта таблица применяется только для иностранного трафика.

Локально генерируемый трафик проходит через цепочку OUTPUT таблицы nat, поэтому вам нужно установить правило с:

firewall-cmd --direct --add-rule ipv4 nat OUTPUT 0 -s 127.0.0.1\
-p tcp --dport 400 -j REDIRECT --to-port 500

Использование –direct в firewall-cmd устарело.
Вместо этого следует использовать политики.
https://firewalld.org/2020/09/policy-objects-introduction

Следующие команды создают политику для любого трафика, исходящего от ХОСТа к любой зоне/назначению.
https://firewalld.org/documentation/man-pages/firewall-cmd.html
https://firewalld.org/documentation/man-pages/firewalld.policies.html
Эта политика затем имеет богатые правила для достижения локального перенаправления портов, не изменяя порт назначения любого обычного исходящего запроса хоста.
https://firewalld.org/documentation/man-pages/firewalld.richlanguage.html
Фильтрация внутри богатого правила необходима, потому что зона ХОСТа не может быть одновременно входящей и выходящей.

Как было установлено, использование обычной зоны для достижения этого локального перенаправления портов для локальных запросов невозможно, потому что правила в зонах обрабатываются только для входящего трафика, а связь localhost->localhost не является таковой.
То же самое верно и для использования ANY как входящего и HOST как исходящего. По крайней мере, согласно документации, на которую я ссылался выше.

firewall-cmd --permanent --new-policy=portforw-internal
firewall-cmd --permanent --policy=portforw-internal --add-ingress-zone=HOST
firewall-cmd --permanent --policy=portforw-internal --add-egress-zone=ANY
firewall-cmd --permanent --policy=portforw-internal --add-rich-rule="rule family="ipv4" destination address="127.0.0.0/8" forward-port port="400" protocol="tcp" to-port="500" to-addr="127.0.0.1""
firewall-cmd --permanent --policy=portforw-internal --add-rich-rule="rule family="ipv4" destination address="127.0.0.0/8" forward-port port="400" protocol="udp" to-port="500" to-addr="127.0.0.1""
firewall-cmd --permanent --policy=portforw-internal --add-rich-rule="rule family="ipv6" destination address="::1/128" forward-port port="400" protocol="tcp" to-port="500" to-addr="::1""
firewall-cmd --permanent --policy=portforw-internal --add-rich-rule="rule family="ipv6" destination address="::1/128" forward-port port="400" protocol="udp" to-port="500" to-addr="::1""
firewall-cmd --permanent --policy=portforw-internal --list-all
firewall-cmd --check-config
firewall-cmd --reload

Для тестирования вы можете использовать

ncat -4 -v localhost 400
ncat -6 -v localhost 400

Я знаю, что это довольно странная необходимость, но я пытаюсь запустить контейнер без прав root с реверс-прокси без прав root, и служба внутри контейнера без прав root должна выполнять https/http3 запрос к самой себе. Я не могу заставить службу выполнять запрос к реальному (без прав root) порту, она может выполнять проверку только к публичному порту.

Далеко не идеально, но для меня это работает.

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

Для решения проблемы с перенаправлением порта на интерфейсе локальной петли (loopback) с использованием firewalld, необходимо учитывать, что правила firewalld, обычно, обрабатываются только для входящего трафика, а не для трафика, генерируемого локально. Чтобы перенаправить локальный трафик, вам следует использовать политики и правила.

Шаги для настройки перенаправления порта:

  1. Создание политики:
    Сначала создайте новую политику для перенаправления портов, чтобы обрабатывать трафик, исходящий из хоста:

    firewall-cmd --permanent --new-policy=portforw-internal
  2. Настройка зон для политики:
    Добавьте зоны, которые будут использоваться как входящие и исходящие:

    firewall-cmd --permanent --policy=portforw-internal --add-ingress-zone=HOST
    firewall-cmd --permanent --policy=portforw-internal --add-egress-zone=ANY
  3. Добавление правил перенаправления:
    Теперь добавьте правила для перенаправления трафика от локальной петли к нужному порту. Указанные ниже команды будут перенаправлять локальный TCP и UDP трафик:

    firewall-cmd --permanent --policy=portforw-internal --add-rich-rule='rule family="ipv4" destination address="127.0.0.0/8" forward-port port="400" protocol="tcp" to-port="500" to-addr="127.0.0.1"'
    firewall-cmd --permanent --policy=portforw-internal --add-rich-rule='rule family="ipv4" destination address="127.0.0.0/8" forward-port port="400" protocol="udp" to-port="500" to-addr="127.0.0.1"'
    firewall-cmd --permanent --policy=portforw-internal --add-rich-rule='rule family="ipv6" destination address="::1/128" forward-port port="400" protocol="tcp" to-port="500" to-addr="::1"'
    firewall-cmd --permanent --policy=portforw-internal --add-rich-rule='rule family="ipv6" destination address="::1/128" forward-port port="400" protocol="udp" to-port="500" to-addr="::1"'
  4. Проверка конфигурации:
    После добавления всех необходимых правил, проверьте конфигурацию:

    firewall-cmd --permanent --policy=portforw-internal --list-all
    firewall-cmd --check-config
  5. Перезагрузка firewalld:
    Примените изменения, перезагрузив firewalld:

    firewall-cmd --reload

Тестирование перенаправления:

Для проверки корректности перенаправления используйте следующие команды:

ncat -4 -v localhost 400
ncat -6 -v localhost 400

Заключение:

Метод перенаправления локального трафика через firewalld может показаться сложным и неочевидным, но следуя вышеизложенным шагам, вы сможете добиться успешного результата. Если у вас есть дополнительные вопросы или возникли проблемы при настройке, не стесняйтесь обращаться за помощью.

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

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