使用 nftables 限制 ICMP 洪水攻击速率

使用 nftables 限制 ICMP 洪水攻击速率

我正在尝试弄清楚如何允许 ICMP ping 到具有 nftables 的服务器而不受到洪水攻击。

这是我的初始配置:

table inet firewall {
    chain incoming {
        type filter hook input priority 0; policy drop;

        # established/related connections
        ct state { established, related } accept

        # ICMP
        ip6 nexthdr icmpv6 icmpv6 type { destination-unreachable, packet-too-big, time-exceeded, parameter-problem, echo-reply, nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert } accept
        ip protocol icmp icmp type { destination-unreachable, router-advertisement, time-exceeded, parameter-problem } accept

        # ICMP ping dealt with separately to rate limit
        ip6 nexthdr icmpv6 icmpv6 type echo-request limit rate 1/second accept
        ip protocol icmp icmp type echo-request limit rate 1/second accept
    }
}

但是,泛洪ping -f [IP_ADDRESS]显示大多数数据包都通过了。每秒肯定不止一个。

如果我删除该ct state { established, related } accept规则,在尝试泛洪时我会得到 99% 的数据包丢失。

因此,看起来第一个请求建立了一个连接,随后的 ping 遵循该规则,而且如果我将该ct规则放在规则之后似乎并不重要icmp

有什么方法可以允许建立连接但仍限制 ping 速率?

答案1

尝试这个解决方案:

表 inet 防火墙 {
    链传入 {
        类型过滤器钩子输入优先级0;政策删除;

        # ICMP ping 单独处理速率限制
        ip6 nexthdr icmpv6 icmpv6 类型 echo-r​​equest 限制速率 1/秒 接受
        ip6 nexthdr icmpv6 icmpv6 类型 echo-r​​equest 计数器丢弃
        ip 协议 icmp icmp 类型 echo-r​​equest 限制速率 1/秒 接受
        ip 协议 icmp icmp 类型 echo-r​​equest 计数器丢弃

        # 已建立/相关的连接
        ct 状态 { 已建立,相关 } 接受

        # ICMP
        ip6 nexthdr icmpv6 icmpv6 类型 { 目标不可达、数据包太大、超出时间、参数问题、回显答复、nd 路由器广告、nd 邻居请求、nd 邻居广告 } 接受
        ip 协议 icmp icmp 类型 { 目标不可达, 路由器通告, 超出时间, 参数问题 } 接受

    }
}

您应该明确丢弃那些超出速率限制的数据包,以防止它们被下面的规则接受。

答案2

很晚了,但我刚刚偶然发现了同样的问题,谷歌把我带到了这里......问题确实是ICMP echo/reply由处理conntrack,请参阅https://www.frozentux.net/iptables-tutorial/chunkyhtml/x1582.html

您可以使用类似的方法watch -n1 conntrack -L来实时监控连接跟踪表的内容(默认只显示 IPv4,可以通过-f ipv6选项显示 IPv6)

重要的是,你必须把限制器制定成一个over条件,在这个条件下,东西会dropct state声明全面接受传入的 ping 请求连接跟踪语句也是如此。

它的作用是:

  • 第一个传入的 ICMP 请求数据包(ct 术语中的“NEW”)通过正常规则被接受
  • 连接跟踪允许所有处于“ESTABLISHED”状态的后续数据包
  • 但所有数据包仍然必须limit rate over ...先通过规则,因此限制器仍按预期工作

代码:

   table inet firewall {
            
       chain incoming {

            type filter hook input priority 0; policy drop;
            
            # icmp echo rate limits
            ip6 nexthdr icmpv6 icmpv6 type echo-request limit rate over 1/second drop
            ip protocol icmp icmp type echo-request limit rate over 1/second drop


            # established/related connections
            ct state { established, related } accept
    

            # accept ICMP ping

            ip6 nexthdr icmpv6 icmpv6 type echo-request accept
            ip protocol icmp icmp type echo-request accept
        }
   }

相关内容