Nftables
nftables:更改或創建新表時刷新/刪除
我創建了一個網路過濾表。我在腳本中有它。我不能讓這個腳本總是載入。如果我刷新/刪除表,那麼如果表不存在,它就不起作用。如果我不刷新/刪除,那麼它將合併舊規則和新規則。
如果表存在,我如何刷新/刪除?
#!/usr/sbin/nft -f flush table my_table table ip my_table { chain output { type filter hook output priority 0; policy accept; ip daddr 8.8.8.8 counter ip daddr 1.1.1.1 counter skuid "other" jump restrict_chain skuid "d" jump d_chain } chain accept_chain { nftrace set 1 counter accept } chain reject_chain { nftrace set 1 counter reject } chain restrict_chain { #type filter priority 0; policy drop; counter ip daddr 1.1.1.1 counter oifname "lo" jump accept_chain oifname != "lo" jump reject_chain } chain d_chain { counter } }
首先聲明一個空表。如果表已經存在,它不會拋出錯誤也不會改變它的內容:什麼都不會發生。如果它不存在,則只是創建了空表。現在它在所有情況下都存在,可以將其刪除。所有這些都可以在同一個規則集中完成。
所以,聲明沒有鍊和規則的表,然後刪除它(手冊頁告訴刷新它將刷新鍊和規則,但這不會刪除鏈本身,它們只會被清空,這將留下舊的重命名鍊或如果它們的屬性被更改,則設置到位或與它們發生衝突。nftables wiki 有更多關於刪除和刷新行為的資訊。)。現在您可以真正創建它,仍然在相同且唯一的規則集文件中。同一個規則集現在可以冪等地載入多次,即使是第一次也不拋出錯誤。
#!/usr/sbin/nft -f table ip my_table delete table ip my_table table ip my_table { chain output { type filter hook output priority 0; policy accept; ip daddr 8.8.8.8 counter # [...] } }
您可以選擇使用
include
語句將所有此類準備行放在單獨的文件中,以防萬一有很多並且您不希望它們污染規則集。您可以在鏈級別執行相同的操作,即無需更改同一個表中的其他鏈,也不假設或要求該表及其鏈之前存在。這是一個
reject_chain
停用nftrace的範例,它不會刪除其他表或my_table
’ 鏈。這個例子並沒有真正的用處,只是舉個例子。#!/usr/sbin/nft -f table ip my_table { chain reject_chain { } } delete chain ip my_table reject_chain table ip my_table { chain reject_chain { nftrace set 0 counter reject } }
兼容性說明:核心 < 3.18 需要刷新 + 刪除才能正常工作,如wiki 中所述。這(以及鏈的等價物)甚至可以在任何核心版本上工作:
table ip my_table flush table ip my_table delete table ip my_table