使用 firewall-cmd 进行端口转发

Mat*_*ani 1 virtual-machines port-forwarding firewalld centos7

我有几个 VM 运行在服务器(虚拟机管理器,VMM)之上。我想将服务器上的端口 80 转发到我的一台虚拟机的端口 80。主机运行 CentOS7,因此 firewalld 负责。显然,VMM 也使用 firewalld 来处理虚拟连接,所以我不能把它扔出窗口。

我基本上没有成功地复制了这个线程中的所有命令,归结为:

firewall-cmd --permanent --zone=public --add-forward-port=port=80:proto=tcp:toport=80:toaddr=192.168.122.224
Run Code Online (Sandbox Code Playgroud)

或者

firewall-cmd --permanent --zone=public --add-rich-rule 'rule family=ipv4 forward-port port=80 protocol=tcp to-port=80 to-addr=192.168.122.224'
Run Code Online (Sandbox Code Playgroud)

firewalld 目前的状态如下:

[root@my-machine ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp8s0
  sources: 
  services: ssh dhcpv6-client samba smtp http
  ports: 25/tcp
  protocols: 
  masquerade: yes
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
  rule family="ipv4" forward-port port="80" protocol="tcp" to-port="80" to-addr="192.168.xxx.xxx"
Run Code Online (Sandbox Code Playgroud)

这是输出

iptables -L -n -v

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination         
13917 8976K ACCEPT     all  --  *      virbr0  0.0.0.0/0               192.168.122.0/24     ctstate RELATED,ESTABLISHED
13539 2093K ACCEPT     all  --  virbr0 *       192.168.122.0/24     0.0.0.0/0           
0     0 ACCEPT     all  --  virbr0 virbr0  0.0.0.0/0            0.0.0.0/0           
4   240 REJECT     all  --  *      virbr0  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable <-----
1   133 REJECT     all  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
0     0 ACCEPT     all  --  virbr1 virbr1  0.0.0.0/0            0.0.0.0/0           
0     0 REJECT     all  --  *      virbr1  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
0     0 REJECT     all  --  virbr1 *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
0     0 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
0     0 FORWARD_direct  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
0     0 FORWARD_IN_ZONES_SOURCE  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
0     0 FORWARD_IN_ZONES  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
0     0 FORWARD_OUT_ZONES_SOURCE  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
0     0 FORWARD_OUT_ZONES  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate INVALID
0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited
Run Code Online (Sandbox Code Playgroud)

问题是第二条规则,它似乎拒绝了我的包裹(尝试连接时我可以看到数量在增加)。事实上,如果我删除它:

iptables -D FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable
Run Code Online (Sandbox Code Playgroud)

我的端口转发工作。我错过了什么?

Mic*_*ton 5

将 firewalld 与 libvirt 混合使用会使您陷入这种情况。

默认情况下,使用“NAT”网络时,libvirt 的网络将设置伪装规则,以便虚拟机可以访问传统 IPv4 互联网。但是,libvirt 会阻止所有传入“NAT”网络的连接。

解决方案是将网络更改为普通路由网络,然后让 firewalld 处理您可能需要的任何伪装。

例如,您将编辑网络 XML 并更改

  <forward mode='nat'/>
Run Code Online (Sandbox Code Playgroud)

  <forward mode='route'/>
Run Code Online (Sandbox Code Playgroud)

我建议您将所有libvirt NAT 网络更改为路由,在这种情况下,如果您希望允许网络相互通信,而不仅仅是要将端口转发到的那个网络。

然后在与连接到 Internet 其余部分的接口相对应的 firewalld 区域上设置伪装。例如:

firewall-cmd [--permanent] --zone=public --add-masquerade
Run Code Online (Sandbox Code Playgroud)

(With firewalld 0.4.4.6 or later, you should not use this, but instead create a rich rule for IPv4 masquerade. These versions have a misfeature that causes an IPv6 masquerading rule to also be added when using --add-masquerade, which will break IPv6 connectivity.)

firewall-cmd [--permanent] --zone=public --add-rich-rule='rule family=ipv4 masquerade'
Run Code Online (Sandbox Code Playgroud)

  • firewall-cmd [--permanent] --zone=public --add-rich-rule='rule family=ipv4 masquerade' 神奇地为我工作。我的虚拟机带有路由 virbr0 接口,但我无法将我的虚拟机连接到互联网。 (2认同)