几个月前,我使用 debian 推荐的程序将 debian 笔记本电脑的防火墙从 迁移iptables
到nftables
,一切似乎都很好。现在,几个月后,我正在仔细检查由该迁移过程创建的规则集,尝试学习nftables
语法,并查看似乎是几个我不理解并且怀疑可能不正确的基于计数器的规则。我还没有发现nftables
wiki 是有用的教育资源,也没有找到任何其他在线教育资源来解决此类问题:
默认的自动迁移规则集包括以下内容:
table inet filter {
chain INPUT {
type filter hook input priority 0; policy drop;
counter packets 123 bytes 105891 jump ufw-before-logging-input
counter packets 123 bytes 105891 jump ufw-before-input
counter packets 0 bytes 0 jump ufw-after-input
counter packets 0 bytes 0 jump ufw-after-logging-input
counter packets 0 bytes 0 jump ufw-reject-input
counter packets 0 bytes 0 jump ufw-track-input
}
前两个counter
陈述是引起我注意的例子。我是否正确他们说“跳转到 ufw-before-foo 部分中的规则,但仅在收到前 123 个数据包和前 105891 个字节之后”。
- 为什么不立即从数据包 0 字节 0 开始?
- 为什么不使用 nftables 似乎支持的语法 >=?
- 这些数字是任意的吗?可能是由于迁移中的故障?
上面的规则集包括跳转到下面的链,可能有类似的问题。这是它的一个片段:
chain ufw-before-input {
iifname "lo" counter packets 26 bytes 3011 accept
ct state related,established counter packets 64 bytes 63272 accept
ct state invalid counter packets 0 bytes 0 jump ufw-logging-deny
ct state invalid counter packets 0 bytes 0 drop
...
}
- 为什么要根据接收到的 26 或 64 个先前的数据包来决定接受?
- 防火墙可以在开机和网络发现/连接后的任何时间任意刷新,那么为什么要丢弃所有这些初始数据包呢?
正如我上面提到的,这些规则已经实施了几个月,所以我想知道它们可能会产生什么负面影响。我想出的唯一候选者是笔记本电脑有时很难建立 wifi 连接(尤其是在从睡眠状态恢复后),而附近的第二台笔记本电脑则没有这样的问题。
- 这些丢弃数据包的规则是否会成为 wifi 连接协商困难的罪魁祸首?
不,解释要简单得多:计数器语句具有可选参数数据包和字节,它们显示当数据包达到其所在规则时计数器计数的数据包和字节数。如果在计数器之前没有过滤器,任何数据包(包括环回)都会因此增加值,因此它可以非常早和快速地发生。进行转换的工具看到了一个 iptables 默认计数器,并选择将其值转换为保真度。
因此,通常当您编写规则时,您不会设置这些值,而是
counter
单独放置一个简单的,它们都得到默认值 0。当数据包遍历它时,这些值会增加。可选地,特别是在命名计数器状态对象中使用时,它甚至可以显示和重置(使用类似的东西nft reset counters
),为了进行某种形式的记账,可以在编写规则集时设置这些值:通常在恢复保存的规则集时就在重新启动之前。这只能在用作命名的变体时重置,而不是作为“内联”匿名计数器。它们不能用于改变规则中的匹配,除了显示它们别无选择。您遇到的任何 wifi 问题都不是由任何反声明引起的。
如果现在要使用数据包计数来限制 nftables 防火墙中规则的使用,根据需要有几种不同的方法:
另一个有状态的对象配额(同样可以匿名使用,但只能在使用 named 时重置)。然后,您可以让规则从不匹配或根据其计数开始匹配。
有计算费率的限制声明。例如,如果您担心日志规则可能会淹没日志文件,您可以使用它来限制完成的日志数量。它还可以将速率限制为某些资源(通常与带有 conntrack 的其他过滤器一起使用)。
对于最近足够的 nftables(0.9.2?)和内核(4.18?),有ct count conntrack 表达式来计算使用 conntrack 建立的连接数,通常是为了限制对某些资源(ssh、web 服务器... )