Я только что установил новую 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
.