Centos

為什麼重啟後啟用的firewalld和重啟後有不同的行為?

  • May 4, 2021

我在使用 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 鏈。

不正是firewalld添加了這些鏈。正如鍊的名稱所暗示的那樣,它將它們添加到您的配置libvirt之上。firewalld

CentOS 8 Stream 的出廠預設配置包括一些執行虛擬機(或嵌套虛擬化,如果 CentOS 8 系統本身是 VM)的準備工作。如果您不需要在 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服務或重新啟動。

引用自:https://unix.stackexchange.com/questions/647970