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

Перенаправление порта на CentOS 8 на виртуальную машину с неработающим firewalld

Я только что установил новую CentOS 8 на своем сервере с виртуальной машиной на нем, и я хотел перенаправить порт с хоста на виртуальную машину (с 2228 по 22) с помощью firewalld. Я добавил переадресацию портов, включил маскарад и попробовал его со своего рабочего стола, и вот результат:

ssh: connect to host x.x.x.x port 2228: Connection refused

Я уже проверил, включена ли переадресация ip в системе, и проверил, могу ли я связаться с виртуальной машиной с хоста, что я могу. Я также пробовал выключить SELinux, но ничего не изменилось. Интересно, что переадресация порта только на хосте (например, с хоста: 1234 на хост: 22) работает.

Это моя огненная зона:

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp3s0
  sources: 
  services: dhcpv6-client ssh
  ports: 
  protocols: 
  masquerade: yes
  forward-ports: port=2228:proto=tcp:toport=22:toaddr=192.168.122.8
  source-ports: 
  icmp-blocks: 
  rich rules: 

Запуск nmap на порту 2228 возвращает, что порт закрыт и не фильтруется, поэтому кажется, что что-то работает, но не все.

Как предложил JD, я добавил богатое правило с ведением журнала, но оно, похоже, тоже не работает:

`rule family="ipv4" forward-port port="2228" protocol="tcp" to-port="22" to-addr="192.168.122.8" log prefix="forward-log" level="debug"`

Изменение режима пересылки с nat на route не является решением, если требуется маскировка исходящего гостевого трафика. Мой быстрый и грязный прием

iptables -I FORWARD -o virbr0 --proto tcp --dport 22 -d 192.168.122.8 -m conntrack --ctstate NEW -j ACCEPT

Но это необходимо применять после каждого firewall-cmd --reload.

Кажется, что libvirt не уважает FirewalldBackend (nftables по умолчанию в CentOS 8), а ловушка iptables имеет приоритет над nftables.

Получается, что проблема была не в firewalld, а в конфигурации сети libvirt. Поскольку виртуальная сеть является сетью nat, а не сетью с маршрутизацией, пакеты, пересылаемые firewalld, не достигают vm. Мне пришлось изменить конфигурацию сети, запустив sudo virsh net-edit default и измените значение форварда с nat к route так это выглядит примерно так:

<network connections='4'>
  <name>default</name>
  <uuid>b812951c-2f19-4e62-83ad-a73a3f1ca529</uuid>
  <forward mode='route'/>
  <bridge name='virbr0' stp='on' delay='0'/>
  <mac address='52:54:00:75:97:4e'/>
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.2' end='192.168.122.254'/>
    </dhcp>
  </ip>
</network>

Перезагрузитесь и все работает!

Добавьте virbrX в доверенную зону и попробуйте еще раз: firewall-cmd --add-interface=virbr0 --zone=trusted.