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

用户1404316

为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有两种类型的标志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
dbjam更多

试试这个

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我将 IPv6 列入黑名单。想要撤销

来自分类Dev

如何在AWS安全组中将IPv6列入白名单?

来自分类Dev

使用nftables创建动态黑名单

来自分类Dev

IPv4和IPv6的动态DNS(使用freedns.afraid.org或其他)

来自分类Dev

创建IPv4和IPv6 SPF记录

来自分类Dev

设置静态IPv4和IPv6

来自分类Dev

IPv4,IPv6和IPTable

来自分类Dev

如何将IPV4地址与IPV6和IPV4一起放入powershell变量中?

来自分类Dev

如何将IPv4和IPv6源地址都绑定到Python套接字?

来自分类Dev

Ubuntu Server 20.04-用于动态IPv4和静态IPv6的Netplan配置

来自分类Dev

使用Zend Opcache将目录列入黑名单

来自分类Dev

将您自己的错误黑客发布列入黑名单

来自分类Dev

如何将色情内容列入黑名单?

来自分类Dev

我可以将治疗剂列入黑名单吗?

来自分类Dev

环境变量将共享库列入黑名单?

来自分类Dev

如何将amdgpu列入黑名单?

来自分类Dev

为什么将模块列入黑名单?

来自分类Dev

将DNS服务器列入黑名单?

来自分类Dev

如何将radeon模块列入黑名单?

来自分类Dev

如何将内核模块列入黑名单?

来自分类Dev

存储和检索IPv4和IPv6地址

来自分类Dev

Linux 内核 IPv4 和 IPv6 套接字创建:EPROTONOSUPPORT 和 ESOCKTNOSUPPORT 错误

来自分类Dev

golang区分IPv4 IPv6

来自分类Dev

ipv4映射的ipv6验证

来自分类Dev

使用IPV4访问IPV6

来自分类Dev

从IPv4到IPv6的ssh

来自分类Dev

从仅IPv4到仅IPv6的VPN

来自分类Dev

IPv6正常工作,但IPv4无效

来自分类Dev

使用IPV4访问IPV6