Firewalld

RHEL/CentOS 現在要在系統啟動時向 firewalld 添加 nftable 規則嗎?

  • December 15, 2020

我在 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 foobridge 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/)。

引用自:https://serverfault.com/questions/1046179