我正在尝试弄清楚如何允许 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-request 限制速率 1/秒 接受 ip6 nexthdr icmpv6 icmpv6 类型 echo-request 计数器丢弃 ip 协议 icmp icmp 类型 echo-request 限制速率 1/秒 接受 ip 协议 icmp icmp 类型 echo-request 计数器丢弃 # 已建立/相关的连接 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
条件,在这个条件下,东西会drop
被前该ct 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
}
}