CentOS 8 上的端口转发到虚拟机时,防火墙不起作用

CentOS 8 上的端口转发到虚拟机时,防火墙不起作用

我刚刚在服务器上安装了新的 CentOS 8,上面有一个虚拟机,我想使用防火墙将端口从主机转发到虚拟机(2228 到 22)。我添加了端口转发,打开了伪装,并从我的桌面尝试了它,这是输出:

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

我已经检查了系统上是否启用了 IP 转发,并检查了我是否可以从主机访问虚拟机,结果是可以的。我还尝试关闭 SELinux,但没有任何变化。有趣的是,仅在主机上进行端口转发(例如从 Host:1234 到 Host: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: 

在端口 2228 上运行 nmap 会返回该端口已关闭且未被过滤,因此似乎有些功能正在运行,但并非全部。

正如 JDI 所建议的,添加了一条带有日志记录的丰富规则,但它似乎也不起作用:

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

答案1

将 virbrX 添加到受信任区域并重试:firewall-cmd --add-interface=virbr0 --zone=trusted

答案2

如果需要伪装出站访客流量,将转发模式从 nat 更改为路由并不是解决方案。我的快速而肮脏的破解方法是

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(CentOS 8 上默认为 nftables),并且 iptables hook 优先于 nftables。

答案3

因此,问题不在于防火墙,而在于 libvirt 网络配置。由于虚拟网络是 nat 网络而不是路由网络,防火墙转发的数据包无法到达虚拟机。我不得不通过运行更改网络配置,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>

重启并生效!

编辑

Teutocat 是对的,这不是解决方案,甚至可能损害您的网络。尽管如他所说,这只是一个快速而肮脏的黑客行为。我发现的最佳“解决方案”是使用一个名为 libvirt-hook-qemu 的小软件。如果您想知道如何设置它或为什么需要它,请参阅此帖子: https://superuser.com/a/1475915

相关内容