Вопрос или проблема
Не могу заставить перенаправление портов на основе 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.