为什么重启后启用的firewalld 和重启后启用的firewalld 会有不同的行为?

为什么重启后启用的firewalld 和重启后启用的firewalld 会有不同的行为?

我使用 Centos 8 Stream,这是一个滚动发布版本4.18.0-301.1.el8.x86_64,我发现奇怪且不一致的行为。

根据firewalld 的启动方式,它有不同的行为。

  • 当firewalld在启动时启动时,它会添加LIBVIRT_*链。

  • 当使用systemctl重新启动firewalld时,所有这些链都会消失。

  • 为什么?

# nftables after the reboot
$ nft list tables
table ip filter
table ip nat
table ip mangle
table ip6 filter
table ip6 nat
table ip6 mangle

# nftables after the systemctl restart
$ nft list tables
table ip filter
table ip nat
table ip mangle
table ip6 filter
table ip6 nat
table ip6 mangle
table bridge filter
table ip security
table ip raw
table ip6 security
table ip6 raw
table bridge nat
table inet firewalld
table ip firewalld
table ip6 firewalld
$ sudo iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
LIBVIRT_INP  all  --  0.0.0.0/0            0.0.0.0/0           

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
LIBVIRT_FWX  all  --  0.0.0.0/0            0.0.0.0/0           
LIBVIRT_FWI  all  --  0.0.0.0/0            0.0.0.0/0           
LIBVIRT_FWO  all  --  0.0.0.0/0            0.0.0.0/0           

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
LIBVIRT_OUT  all  --  0.0.0.0/0            0.0.0.0/0           

Chain LIBVIRT_INP (1 references)
target     prot opt source               destination         
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:53
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:53
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:67
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:67

Chain LIBVIRT_OUT (1 references)
target     prot opt source               destination         
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:53
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:53
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:68
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:68

Chain LIBVIRT_FWO (1 references)
target     prot opt source               destination         
ACCEPT     all  --  192.168.122.0/24     0.0.0.0/0           
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Chain LIBVIRT_FWI (1 references)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            192.168.122.0/24     ctstate RELATED,ESTABLISHED
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Chain LIBVIRT_FWX (1 references)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0    

$ sudo systemctl restart firewalld

$ sudo iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination       

这是非常令人不安的并且很难调试。特别是在我启动 openvpn-as 服务后,它添加了 iptables 链。

答案1

firewalld添加这些链并不完全是这样。正如链的名称所示,它将它们添加到您的配置libvirt之上。firewalld

CentOS 8 Stream 的出厂默认配置包括运行虚拟机(或嵌套虚拟化,如果 CentOS 8 系统本身就是一个虚拟机)的一些准备工作。如果您不需要在 CentOS 上运行虚拟机,您可能需要禁用它们。

我现在手头没有 CentOS 8 Stream 测试系统,但我认为这应该可以做到:

virsh net-destroy default              # unconfigure what libvirtd has done for now
systemctl stop libvirtd.service        # stop the service
systemctl disable libvirtd.service     # persistently disable it

如果您想libvirtd出于某种目的继续运行,但想禁用其默认网络设置,这可能会做到(但我不太确定这是否会清除 iptables 添加内容):

virsh net-destroy default           # unconfigure what libvirtd has done for now
virsh net-undefine default          # persistently remove libvirtd network config

或者也许只是:(这应该是可以撤消的,无需重新安装 libvirtd 或以其他方式恢复默认配置)

virsh net-destroy default               # unconfigure what libvirtd has done for now
virsh net-autostart default --disable   # tell libvirt to not autostart default config

要撤消第 3 版,只需使用virsh net-autostart default--disable带选项的版本,然后重新启动libvirtd服务或重新启动。

相关内容