Nftables

nftables:更改或創建新表時刷新/刪除

  • April 6, 2020

我創建了一個網路過濾表。我在腳本中有它。我不能讓這個腳本總是載入。如果我刷新/刪除表,那麼如果表不存在,它就不起作用。如果我不刷新/刪除,那麼它將合併舊規則和新規則。

如果表存在,我如何刷新/刪除?

#!/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

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