Переадресация портов Centos 7 с firewalld не работает

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

Не могу заставить перенаправление портов на основе firewalld работать в CentOS 7. Я перенаправляю 192.168.0.148:905 на 192.168.56.102:22. Когда я пытаюсь подключиться по ssh к 192.168.0.148 -p 905, я получаю “Соединение отклонено”.

Вот некоторые соответствующие настройки:

[root@GraceDev3 log]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: br0
  sources:
  services: ssh dhcpv6-client https
  ports: 3389/tcp 905/tcp 908/tcp
  protocols:
  masquerade: yes
  forward-ports: port=905:proto=tcp:toport=22:toaddr=192.168.56.102
        port=908:proto=tcp:toport=22:toaddr=192.168.56.105
  source-ports:
  icmp-blocks:
  rich rules:

Перенаправление портов:

[root@GraceDev3 log]# cat /proc/sys/net/ipv4/ip_forward
1

tcpdump на 192.168.0.148 порт 22 показывает, что запрос ssh поступает. В журнале firewalld не показано, что какие-либо пакеты были сброшены. Что я пропустил? Замечаю, что у других была такая же проблема, но я не нашел опубликованных решений.

Возможно, следующее является объяснением:

“NetworkManager уведомляет firewalld о зоне интерфейса. Вы можете назначать зоны интерфейсам с помощью NetworkManager, инструмента firewall-config или командного инструмента firewall-cmd. Последние два просто редактируют соответствующие конфигурационные файлы NetworkManager. Если вы изменяете зону интерфейса с помощью firewall-cmd или firewall-config, запрос передается в NetworkManager и не обрабатывается firewalld.”

Машина, через которую я пытаюсь перенаправить, является гипервизором, и я отключил NetworkManager. Это, похоже, нарушает конфигурацию зоны. Попробую обойти это и сообщу. (Или переключусь на iptables, которые, похоже, я понимаю!)

PS: Мне не удалось доказать, что вышеуказанное было источником проблемы, хотя это кажется вероятным. Переключение на iptables действительно позволяет перенаправление портов работать. В моем случае у меня также было прямое интернет-соединение на целевой машине (которое не допускает входящие соединения на порт 22). Это означало, что пакеты ответа никогда не были корректно обработаны NAT на обратном пути. Это было слишком сложно для меня, поэтому я переключился на использование ssh вместо netfilter для перенаправления, и это работает идеально!

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

Проблемы с перенаправлением портов в CentOS 7 под управлением firewalld

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

1. Проверка конфигурации firewalld

Ваш вывод команды firewall-cmd --list-all показывает, что вы настроили перенаправление портов, что является хорошим началом. Убедитесь, что указанные порты и IP-адреса корректны:

forward-ports: port=905:proto=tcp:toport=22:toaddr=192.168.56.102

Однако, важно убедиться, что указанный вами IP-адрес (192.168.56.102) доступен и правильно настроен для приема SSH соединений. Если адресация неверна или цель недоступна, это приведет к ошибке "Connection refused".

2. Включение IP-перенаправления

Вы уже подтвердили, что IP-перенаправление включено:

echo 1 > /proc/sys/net/ipv4/ip_forward

Это необходимо для работы NAT и перенаправления портов. Убедитесь, что эти настройки сохраняются и после перезагрузки. Для этого можно добавить以下 строку в файл /etc/sysctl.conf:

net.ipv4.ip_forward = 1

Затем примените изменения с помощью:

sysctl -p

3. Проверка сетевых интерфейсов

Поскольку вы упомянули, что работаете с гипервизором и отключили NetworkManager, проверьте интерфейсы вашего сервера:

  • Убедитесь, что используемые вами интерфейсы (например, br0) находятся в правильной зоне firewalld и имеют соответствующие разрешения.
  • Используйте firewall-cmd --get-active-zones для проверки, какие интерфейсы в каких зонах.

Если br0 в зоне public, а вы хотите, чтобы этот интерфейс обрабатывал перенаправление, убедитесь, что правила перенаправления включены для этой зоны.

4. Настройка правил NAT

Поскольку вы упомянули, что tcpdump показывает, что запросы SSH приходят, но возвращаемые пакеты не правильно NATируются, это может быть основным источником проблем. Для корректного перенаправления убедитесь, что ваш гипервизор правильно обрабатывает NAT. Вы можете вручную настроить правила с помощью iptables:

iptables -t nat -A PREROUTING -p tcp --dport 905 -j DNAT --to-destination 192.168.56.102:22
iptables -t nat -A POSTROUTING -j MASQUERADE

Эти команды будут перенаправлять трафик, предназначенный для порта 905 на порт 22 IP-адреса 192.168.56.102, и маскировать исходящие пакеты.

5. Альтернативное решение: Использование SSH

Как вы уже заметили, использование SSH для создания туннелей (например, через ssh -L) может быть более простой и эффективной альтернативой для выполнения проброса портов, особенно если у вас есть прямое подключение к Интернету на целевой машине.

Заключение

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

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

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

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