nftables 动态将 IPv4 和 IPv6 列入黑名单

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 维基,该术语已被弃用,取而代之的是 set,它需要一个包含特定协议类型的定义(例如ipv4_addr),因此如果 nftables 当前正在将该术语映射meter到较新的,这将解释为什么当前无法在set单个协议之间共享和。然而,中给出的例子meteripv4_addripv6_addrnftables 维基它本身也不是最新的:它会生成错误,因为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

答案1

试试这个

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,但仅将其保留一分钟,并且如果我们已经得到此在规则中走得很远,然后断开连接。

最初发布的答案有两行长行被截断,但我弄清楚了我认为它们应该是什么并将它们插入到上面。好消息是我的测试表明这个答案有效!

我剩下的好奇心是如何决定何时设置集合集的大小以及将它们设置为多大,所以我暂时保留了它们的原样。

相关内容