iptables 在 firewalld 重新載入時刷新
我在 Rocky Linux(基於 RHEL8)上執行,並且在使用 firewalld 和 iptables 時遇到了一些困難。好吧,反正不是真正的 iptables……讓我解釋一下。
我在 VMWare ESXi 上設置了一個 K8S 集群,有六個虛擬機,都一樣。鑑於這種環境,我需要執行firewalld。我正在使用 Weave CNI,它使用 iptables 來創建其網路規則。
以下是我的初步發現:
在 weave docker 容器和VM 主機上,使用帶有 nf_tables 後端的 iptables
- 輸出證實了這一點,
iptables -V
這給了我iptables v1.8.4 (nf_tables)
firewalld 設置為使用 nftables 作為其後端(
FirewallBackend
)iptables 服務不存在(
Unit iptables.service could not be found.
)nftables 服務已載入,但處於非活動狀態
防火牆服務正在執行
如果我啟動 nftables 服務,firewalld 服務將停止,反之亦然
根據我對firewalld的理解,因為它使用nftables,所以它根本不應該刷新iptables,根據他們關於nftables後端的部落格文章。
當 weave 設置其 iptables 規則(用於路由和網路策略)時,我可以使用
iptables-save
或看到它們nft list ruleset
。這意味著即使 weave 使用 iptables 來設置它的規則,它們實際上也被設置到 nftables 中。現在,我的問題是,如果我在 weave 設置規則後重新載入 firewalld(使用
firewall-cmd --reload
orsystemctl reload firewalld.service
),所有規則都會被刷新!iptables-save
我可以用或來確認nft list ruleset
。可能與使用
iptables
命令而不是有關nft
?即使 iptables 使用 nf_tables 後端?請注意,weave 部分解決了這個問題,因為他們監視規則以查看特殊(空)鏈 WEAVE-CANARY 是否仍然存在。如果它不存在,它們會重新創建路由路由,但不會對網路策略規則執行任何操作。這是目前的功能請求。
有哪些可能的解決方案?我考慮過連接firewalld服務來添加
ExecStopPre
和ExecReloadPre
保存除firewalld之外的其他規則/etc/sysconfig/nftables.conf
(或另一個文件,包括從那裡),但它有點hackish,我不喜歡這個“解決方案”。此外,鑑於 nftables 服務已停止,我什至不確定這是否可行。編輯:我做了一些測試,行為真的很奇怪。
我用
iptables
:添加了一條規則iptables -I INPUT 3 -s 10.1.1.9 -j DROP
,然後重新載入了防火牆,該規則不再存在!nft
我對:進行了同樣的嘗試nft add rule ip filter INPUT ip saddr 10.1.1.9 drop
,重新載入了防火牆,結果是一樣的……這讓我發瘋,firewalld 不應該觸及其他規則表而不是它自己的規則表,但這裡不是這種情況!
這裡發生了幾件事。
- 的 nft 變體
iptables
將nftables
在已知表中添加規則:filter
、nat
、raw
等。- firewalld 總是刷新所有
iptables
規則(例如iptables -F -t filter
),這些規則會刷新表中的所有鏈filter
。這對應於nftables
上面提到的已知表名。Firewalld 的
nftables
後端只接觸firewalld
表格,但通過支持 iptables 直接規則間接接觸表格、、、等filter
。由於兼容性,此行為無法更改。不過, Firewalld 不會觸及其他表,例如,名為的表不會被刷新。nat``raw``iptables-nft``nftables``foobar
不幸的是,我們在這裡無能為力。我們要麼 a) 保持兼容性並讓
iptables
命名表被刷新,要麼 b) 放棄iptables
直接規則支持。選項 A 是最使用者友好的。