在为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
和之间共享一个单个词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可能(正确)要求提供一些解释。据我了解:ct
引入连接跟踪规则,在这种情况下针对new tcp
连接,如果它们要到达端口8000(dport
是目标端口),则将源IPv4添加到预定义的集合集中greed_4
。如果发生这种情况,则该规则将继续使用第一个括号条件,即如果源地址具有三个以上的活动连接,则将源IPv4添加到第二个预定义的集合中blackhole_4
,但只能将其保留一分钟,并且如果已经得到了此,远离规则,然后断开连接。
最初发布的答案的两个长长的行被截断了,但是我弄清楚了我认为应该是什么,并将其插入上方。好消息是,我的测试表明此答案有效!
对我来说,还有一个好奇是如何决定何时设置集合集的大小,以及如何设置它们的大小,所以我只是暂时保留这些内容。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句