nftables 將 IPv4 和 IPv6 動態列入黑名單
在為 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_addr
and之間共享ipv6_addr
。但是,nftables wiki本身給出的範例也不是最新的:它會生成錯誤,因為dynamic
目前 (nftables v0.9.0) 不是有效的標誌類型。回到man
頁面,我們可以看到它set
的標誌類型為constant
、interval
或timeout
,我不確定哪個適合這個目的。編輯:計量的“計數”形式似乎已移至
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
,但只保留一分鐘,如果我們得到了這個遠在規則中,然後斷開連接。最初發布的答案有兩條長線被截斷,但我想出了我認為它們應該是什麼並將它們插入到上面。好消息是我的測試表明這個答案有效!
對我來說,剩下的一個好奇是如何決定何時為收藏集設置尺寸,以及製作它們的大小,所以我暫時保持原樣。