Назад | Перейти на главную страницу

перенаправление портов ssh с помощью firewall-cmd

Я пытаюсь создать туннель ssh на сервер за NAT:

ssh с ноутбука -> Хост с переадресацией портов в брандмауэре -> Перейти непосредственно в гостевую систему (172.16.0.2, за NAT хоста).

Используя iptables на хосте - он будет работать:

# iptables -I OUTPUT  -d 0.0.0.0/0 -j ACCEPT
# iptables -I FORWARD  -d 0.0.0.0/0 -j ACCEPT
# iptables -I INPUT  -d 0.0.0.0/0 -j ACCEPT
# iptables -t nat -I PREROUTING -d 0.0.0.0/0 -p tcp --dport 222 -j DNAT --to-destination 172.16.0.2:22

тем не мение, iptables не сохраняется при перезагрузке хоста, так как служба firewalld работает (firewalld используется по умолчанию в RHEL 7).

Так что я пытаюсь сделать то же самое перенаправление портов с помощью firewall-cmd.

Использование firewall-cmd на хосте - НЕ будет работать:

# firewall-cmd --permanent --zone=public --add-forward-port=port=222:proto=tcp:toport=22:toaddr=172.16.0.2'
# firewall-cmd --permanent --zone=public --add-masquerade
# firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -d 0.0.0.0/0 -j ACCEPT
# firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 0 -d 0.0.0.0/0 -j ACCEPT
# firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -d 0.0.0.0/0 -j ACCEPT

# firewall-cmd --permanent --direct --add-rule ipv4 nat PREROUTING 0 -d 0.0.0.0/0 -p tcp --dport 222 -j DNAT --to-destination 172.16.0.2:22

# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="0.0.0.0/0" forward-port port="222" protocol="tcp" to-port="22" to-addr='"172.16.0.2"

# firewall-cmd --reload

# firewall-cmd --list-all

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp4s0f0
  sources: 
  services: ssh dhcpv6-client
  ports: 8139/tcp
  protocols: 
  masquerade: yes
  forward-ports: port=222:proto=tcp:toport=22:toaddr=172.16.0.2
  source-ports: 
  icmp-blocks: 
  rich rules: 
     rule family="ipv4" destination address="0.0.0.0/0" forward-port port="222" protocol="tcp" to-port="22" to-addr="172.16.0.2" 

# firewall-cmd --direct --get-all-rules

ipv4 filter INPUT 0 -d 0.0.0.0/0 -j ACCEPT
ipv4 filter OUTPUT 0 -d 0.0.0.0/0 -j ACCEPT
ipv4 filter FORWARD 0 -d 0.0.0.0/0 -j ACCEPT
ipv4 nat PREROUTING 0 -d 0.0.0.0/0 -p tcp --dport 222 -j DNAT --to-destination 172.16.0.2:22

Теперь при попытке подключиться к гостю - с моего ноутбука через хост-порт 222 - в ssh-соединении отказано:

ssh -l stack my-host -p 222
ssh: connect to host my-host port 222: Connection refused

Есть идеи, что мне не хватает?

Вы могли бы попробовать firewall-cmd --add-forward-port:

firewall-cmd --permanent --add-forward-port=port=222:proto=tcp:toaddr=172.x.x.x:toport=22
firewall-cmd --reload

Общий синтаксис (https://firewalld.org/documentation/man-pages/firewall-cmd.html):

firewall-cmd [--permanent] [--zone=zone] \
 --add-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[/mask]] \
 [--timeout=timeval]

«Симптомы» и представленные вами данные очень похожи на то, что мы испытали при использовании KVM (libvirt) с «сетью по умолчанию». По этой причине мы считаем приведенный ниже ответ очень уместным ...

«Единственный» способ сделать переадресацию порта с помощью KVM (libvirt) с «сетью по умолчанию» (virbr0) - это использовать хак / обходной путь, проинформированный @Antony Nguyen. Или, проще говоря, вы можете использовать libvirt-крючок-qemu.

В этом потоке есть полное объяснение того, как решить эту проблему для CentOS 7 (и, конечно, для других дистрибутивов) с помощью libvirt-hook-qemu: https://superuser.com/a/1475915/195840 .

Похоже, ваши проблемы связаны не с командами firewall-cmd, а с OpenStack?

Для справки я отправлю окончательный ответ (Джеймс Слэгл, предположительно вот этот) на Отчет Bugzilla вы сделали - на всякий случай кому-то поможет:

Как предположил Эрик, эта проблема связана с развертыванием OSP, что приводит к смене владельцев ошибок на TripleO.

Обратите внимание, что известно, что он влияет на OSP 14 и ниже.

Нет, это неверно в зависимости от того, как я интерпретирую ошибку. Вы пытаетесь добавить правила брандмауэра на хост (titan08), на котором размещается виртуальная машина с именем undercloud-0.

undercloud-0 - это место, где установлен OpenStack. Но на самом физическом хосте (titan08) не выполняется никаких об / мин OpenStack или конфигурации.

В этом случае кажется, что это полностью касается конфигурации брандмауэра физического хоста, а не OpenStack vm.

Как заметил Эрик, правила, которые вы пытаетесь добавить с помощью firewalld, не сохраняются на физическом хосте (titan08).

Я правильно понимаю?

Когда вы устанавливаете OpenStack на виртуальную машину, он не вносит изменений в сам физический хост.

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

Есть несколько способов получить доступ к серверу за NAT: Перенаправление портов, вы можете настроить маршрутизатор / брандмауэр для перенаправления входящего трафика на внутренний сервер. Обычно вам нужно указать протокол (UDP / TCP), порт внешней службы и порт внутренней службы.

Для переадресации порта ssh с помощью firewall-cmd попробуйте эту команду:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 222 -j DNAT \--to 172.x.x.x.:22 

Из приведенного кода я как бы понимаю, что это то, чего вы пытаетесь достичь. Поэтому обязательно проверьте порт. В моем случае я пробовал то же самое с портом 80.

Это правило указывает таблице NAT для использования встроенной цепочки PREROUTING для пересылки входящих HTTP-запросов исключительно на указанный IP-адрес назначения.