RHEL/CentOS 現在要在系統啟動時向 firewalld 添加 nftable 規則嗎?
我在 RHEL 8 上使用 firewalld,並且還需要添加一些 nftable 規則。
(nftable 規則基於對CentOS 8 作為 NAT 路由器的回答,帶有 nft 和 firewalld - 如何讓它通過 TFTP?)
在正在執行的防火牆中,這與 nft -f 命令配合得很好。
但是,這會在重新啟動時失去。
RedHat 文件(在付費牆後面)建議使用 nftables.service 服務在重新啟動時載入規則,但這不能與 firewalld 一起使用。這兩個服務被列為衝突,即使它們不是,firewalld 也可能會刷新 nftable 規則。
是否有另一種方法可以讓 nftable 規則在重新啟動時載入?
使用nftables後端時,firewalld實用程序不會刷新不屬於它的表:
只刷新firewalld的規則
由於 nftables 允許命名空間(通過表),firewalld 不再完全刷新防火牆規則。它只會刷新 firewalld表中的規則。這可以避免在重新啟動或重新載入 firewalld 時意外清除自定義使用者規則或其他工具安裝的規則的情況。
在管理其他表時也必須這樣做。
實際上在前面的答案中,它已經完成了:nftables規則冪等地只刪除他們自己的 table:
handletftp
。可悲的是,
nftables.service
停止操作並非如此:ExecStop=/sbin/nft flush ruleset
必須確保 systemd 服務的停止部分在仍在執行工作時不會直接刷新所有規則。該作業將被委派給停止操作的專用nftables規則。
所以這是一個實用的方法:複製(例如:)
systemctl cat nftables.services
並更改為要放入nftables.service
的實例化版本:local-idempotent-nft@.service``/etc/systemd/system/local-idempotent-nft@.service
[Unit] Description=Idempotent nftables rules for %I Wants=network-pre.target Before=network-pre.target [Service] Type=oneshot ProtectSystem=full ProtectHome=true ExecStart=/sbin/nft -f /etc/nftables/idempotent/%I.nft # As the rules are idempotent, ExecReload is same as ExecStart ExecReload=/sbin/nft -f /etc/nftables/idempotent/%I.nft # The stop rules should only have the first boilerplate parts ExecStop=/sbin/nft -f /etc/nftables/idempotent/stop-%I.nft RemainAfterExit=yes [Install] WantedBy=multi-user.target
創建上面使用的專用配置目錄:
mkdir -p /etc/nftables/idempotent
放置規則,對於定義的每個表,總是這樣開始,因此載入規則獨立於其他表和冪等(例如表
ip foo
和bridge bar
):table ip foo delete table ip foo table bridge bar delete table bridge bar table ip foo { ... } table bridge bar { .... }
或者每個文件只使用一個表。該
flush ruleset
聲明被禁止,因為它是全球性的。創建,刪除和重新創建表的原因是為了獲得結果冪等性:雖然刪除不存在的表是一個錯誤,並且會原子地使整個載入失敗,聲明一個現有的表而不定義它(通過添加一個空表)如果它以前不存在,則永遠不會失敗並且除了將其創建為空之外什麼都不做。在這兩種情況下(在啟動時不存在,在重新載入時存在)刪除現在可以工作,留下真正定義表的地方。所有這些都發生在同一個事務中並且仍然是原子的:如果在此期間之前存在失去的 ip foo 表,則不會使用失去的ip foo表來評估任何數據包。
準備上面的停止版本,只會刪除(這裡的空聲明不是嚴格需要的,如果只有一個表可以刪除,但如果有多個表則應該保留:失敗是針對整個事務的):
table ip foo delete table ip foo table bridge bar delete table bridge bar
並將所有內容放在他們的位置:
/etc/nftables/idempotent/foobar.nft /etc/nftables/idempotent/stop-foobar.nft
現在可以通過以下方式啟動:
systemctl enable --now local-idempotent-nft@foobar
先前OP問題的範例:
在
/etc/nftables/idempotent/handletftp.nft
:table ip handletftp delete table ip handletftp table ip handletftp { ct helper helper-tftp { type "tftp" protocol udp } chain sethelper { type filter hook forward priority 0; policy accept; ip saddr 192.168.1.0/24 ip daddr 10.0.10.10 udp dport 69 ct helper set "helper-tftp" } }
在
/etc/nftables/idempotent/stop-handletftp.nft
table ip handletftp delete table ip handletftp
啟用並啟動它:
systemctl enable --now local-idempotent-nft@handletftp
停止它:
systemctl stop local-idempotent-nft@handletftp
這將保留firewalld的規則。同樣,停止或重新啟動firewalld將保留這些規則。
可能需要改進:
- nftables有一個include語句,可以以某種方式使用它來避免樣板文件的重複。
- 關於 TFTP 的具體範例依賴於
nf_nat_tftp
不會自動完成的載入(與nf_conntrack_tftp
規則中的引用自動載入相反,或者與將顯式載入的firewalldnf_nat_tftp
相反)。所以相關但非嚴格的nftables配置應該牢記在心(這個設置可以簡單地放入/etc/modules-load.d/
)。