如何理解nftables“添加@my_ssh_meter { ip Saddr限制速率10/秒}接受”规则?

如何理解nftables“添加@my_ssh_meter { ip Saddr限制速率10/秒}接受”规则?

nftables支持动态填充的集合,这些集合记录在nftables 维基。 wiki 页面上的第一个示例如下:

table ip my_filter_table {
        set my_ssh_meter {
                type ipv4_addr
                size 65535
                flags dynamic
        }

        chain my_input_chain {
                type filter hook input priority filter; policy accept;
                tcp dport 22 ct state new add @my_ssh_meter { ip saddr limit rate 10/second } accept
        }
}

nftables上面的配置解释如下:

在此示例中,我们创建一条规则来匹配新的 TCP ssh(端口 22)连接,该规则使用名为 my_ssh_meter 的动态集将每个源 IP 地址的流量速率限制为每秒 10 个连接。

如何解读这条规则或者如何理解它?我的意思是,如果 Linux 连接跟踪子系统看到到 TCP 目标端口 22( )的新连接 ( ),则带有数据的源 IP 地址 ( ip saddr)limit rate 10/second会添加到命名集中。不过这套好像从来没用过?填充集合时执行的操作是否成功?my_ssh_meterct state newtcp dport 22my_ssh_meteraccept

答案1

会发生什么:

  • 当新的 ssh 连接到达时,其源加上附加的计量表将添加到该集合中(如果尚未存在:它是一个集合,因此每个元素仅出现一次)并进行评估以提供布尔结果 true/false

  • 如果评估为真,则规则可以继续,否则规则停止。

    注意:如果没有附加的仪表,添加元素将始终评估为 true:添加到集合不是终结。

这里:

  • 如果它评估为真(即:它没有泛滥),则该规则继续accept结束当前输入挂钩(即:chain my_input_chain)评估。

  • 如果评估结果为 false,则规则在最终accept语句之前结束

    • 它继续到下一个规则,或者如果没有
    • 使用默认链策略:accept

因此,无论发生什么,新的连接数据包总是被接受:这个规则集除了填充规则集之外没有任何可见的效果。

wiki 的规则集示例不完整。在相同的条件下,它后面应该跟一个drop(或)(某些规则分解当然是可能的):reject

% nft add rule ip my_filter_table my_input_chain tcp dport 22 ct state new drop

因此,如果指标确实溢出,accept则不会评估前一个规则的最后部分,并且传入连接将在下一个规则中被丢弃。只要进行了尝试,就会将其计入指标的令牌桶中。因此,只要尝试保持太快,就可能有零个新连接(请注意,默认令牌桶突发为 5,即使立即泛洪,第一个连接也始终会成功)。

这里要知道的重要一点是,与许多其他陈述一样,陈述(其特殊语法使用@)都执行带有更改的操作(在集合中添加元素)并具有布尔结果:true 或 false,这条件是对规则的其余部分进行进一步评估:两个角色同时使用。

要进行测试,只需替换10/second10/minute10/hour:行为现在将变得更加明显(在第 5 个连接之后:默认情况下limit的令牌桶允许突发 5 个数据包。)

相关内容