Firewall

nftables 將 IPv4 和 IPv6 動態列入黑名單

  • May 28, 2020

在為 nftables設置動態黑名單時,根據 AB 的出色回答,我在為 ipv4 和 ipv6 複製黑名單時遇到錯誤。我執行以下命令行操作(debian nftables)(編輯:最初的問題是針對以前的版本 0.9.0;在來回評論過程中,它已升級到最新版本 0.9.3,所以下面接受的答案對版本 0.9.3 API 有效):

nft flush ruleset && nft -f /etc/nftables.conf

對於一個配置文件,包括:

tcp flags syn tcp dport 8000 meter flood size 128000 { ip  saddr timeout 20s limit rate over 1/second } add @blackhole_4 { ip  saddr timeout 1m } drop
tcp flags syn tcp dport 8000 meter flood size 128000 { ip6 saddr timeout 20s limit rate over 1/second } add @blackhole_6 { ip6 saddr timeout 1m } drop
tcp flags syn tcp dport 8000 meter greed size 128000 { ip  saddr ct count over 3 } add @blackhole_4 { ip  saddr timeout 1m } drop                                                         
tcp flags syn tcp dport 8000 meter greed size 128000 { ip6 saddr ct count over 3 } add @blackhole_6 { ip6 saddr timeout 1m } drop

並得到以下錯誤響應:

/etc/nftables.conf:130:17-166: Error: Could not process rule: Device or resource busy
               tcp flags syn tcp dport 8000 meter flood size 128000 { ip6 saddr timeout 20s limit rate over 1/second } add @blackhole_6 { ip6 saddr timeout 1m } drop
                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/etc/nftables.conf:132:17-145: Error: Could not process rule: Device or resource busy
               tcp flags syn tcp dport 8000 meter greed size 128000 { ip6 saddr ct count over 3 } add @blackhole_6 { ip6 saddr timeout 1m } drop
                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

另外,我不確定是什麼size衡量標準;它設置為 128000,因為這是我在某處看到的權威。

編輯:好的。我決定繼續玩,看到為每個 ipv6 規則創建單獨的儀表會導致錯誤消息消失,但我不明白為什麼,所以我沒有回答我自己的問題,而是將它留給有一個知識淵博的解釋為什麼不能共享儀表。以下不會產生錯誤:

tcp flags syn tcp dport 8000 meter flood_4 size 128000 { ip  saddr timeout 20s limit rate over 1/second } add @blackhole_4 { ip  saddr timeout 1m } drop
tcp flags syn tcp dport 8000 meter flood_6 size 128000 { ip6 saddr timeout 20s limit rate over 1/second } add @blackhole_6 { ip6 saddr timeout 1m } drop
tcp flags syn tcp dport 8000 meter greed_4 size 128000 { ip  saddr ct count over 3 } add @blackhole_4 { ip  saddr timeout 1m } drop                                                         
tcp flags syn tcp dport 8000 meter greed_6 size 128000 { ip6 saddr ct count over 3 } add @blackhole_6 { ip6 saddr timeout 1m } drop

編輯:在撰寫本文時,nftables 的手冊頁使用術語meter,但根據nftables wiki,該術語已被棄用而支持 set ,這需要包含特定協議類型(例如ipv4_addr)的定義,所以如果 nftables 目前正在將該術語映射meter到較新的set,這將解釋為什麼單個meter目前不能在ipv4_addrand之間共享ipv6_addr。但是,nftables wiki本身給出的範例也不是最新的:它會生成錯誤,因為dynamic目前 (nftables v0.9.0) 不是有效的標誌類型。回到man頁面,我們可以看到它set的標誌類型為constantintervaltimeout,我不確定哪個適合這個目的。

編輯:計量的“計數”形式似乎已移至nftables:(ct連接跟踪)的單獨部分。現在似乎應該創建如下定義:

   set greed_4 {                                                                                                                                                                                 
       type ipv4_addr                                                                                                                                                                            
       flags constant                                                                                                                                                                            
       size 128000                                                                                                                                                                               
       }                                                                                                                                                                                         

   set greed_6 {                                                                                                                                                                                 
       type ipv6_addr                                                                                                                                                                            
       flags constant                                                                                                                                                                            
       size 128000                                                                                                                                                                               
       }                                                                                                                                                                                         

然後以下規則可能會關閉,但仍會產生錯誤:

ct state new add @greed_4 { tcp flags syn tcp dport 8000 ip saddr ct count over 3 } add @blackhole_4 { ip saddr timeout 1m } drop
ct state new add @greed_6 { tcp flags syn tcp dport 8000 ip6 saddr ct count over 3 } add @blackhole_6 { ip6 saddr timeout 1m } drop

試試這個

table inet filter {
 set blackhole_4 {
   type ipv4_addr
   flags timeout
 }
 set blackhole_6 {
   type ipv6_addr
   flags timeout
 }
 set greed_4 {
   type ipv4_addr
   flags dynamic
   size 128000
 }
 set greed_6 {
   type ipv6_addr
   flags dynamic
   size 128000
 }
 chain input {
   type filter hook input priority 0;
   ct state new tcp flags syn tcp dport 8000 add @greed_4 { ip saddr ct count over 3 } add @blackhole_4 { ip  saddr timeout 1m } drop
   ct state new tcp flags syn tcp dport 8000 add @greed_6 { ip6 saddr ct count over 3 } add @blackhole_6 { ip6  saddr timeout 1m } drop
 }
}

編輯:@User1404316 的解釋:因為@Zip May(正確地)要求一些解釋。據我了解:ct引入了一個連接跟踪規則,在這種情況下用於new tcp連接,如果它們正前往埠 8000(dport目標埠),請將源 IPv4 添加到預定義的集合集中greed_4。如果發生這種情況,則規則繼續第一個括號條件,即如果源地址具有三個以上的活動連接,則將源 IPv4 添加到第二個預定義集blackhole_4,但只保留一分鐘,如果我們得到了這個遠在規則中,然後斷開連接。

最初發布的答案有兩條長線被截斷,但我想出了我認為它們應該是什麼並將它們插入到上面。好消息是我的測試表明這個答案有效!

對我來說,剩下的一個好奇是如何決定何時為收藏集設置尺寸,以及製作它們的大小,所以我暫時保持原樣。

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