为什么清除 conntrack 表时的“echo f”在 debian 上不起作用?

为什么清除 conntrack 表时的“echo f”在 debian 上不起作用?

许多人在想要重新加载防火墙规则时不会清除 conntrack 表。当您有一些 ESTABLISHED 连接时,当您添加阻止某些相关连接(处于 NEW 状态)的规则时,所有会话都不会受到影响。确保这种情况不会发生的唯一方法是通过清除 conntrack 表来终止所有会话。在这种情况下,所有数据包都将符合 INVALID 规则,并且您必须建立一个新连接,该连接现在将通过 的新规则iptables

在OpenWRT中,您可以简单地执行以下操作:

# echo f > /proc/net/nf_conntrack

但不幸的是这个解决方案不适用于 debian。

# echo f > /proc/net/nf_conntrack
echo: write error: Input/output error

原因如下:

# ls -al /proc/net/nf_conntrack
-r--r----- 1 root root 0 2016-06-05 10:45:52 /proc/net/nf_conntrack

在 Debian 上,您必须安装该conntrack包,然后输入以下命令:

# conntrack -F
conntrack v1.4.3 (conntrack-tools): connection tracking table has been emptied.

为什么echo f在 debian 上不起作用?有没有办法让它以某种方式工作,或者我被迫使用该conntrack工具?

答案1

OpenWRT 维护着几个特定的​​内核补丁。其中,有一个特定的补丁提供了您抱怨的 Debian 中缺少的功能。实际上是可用的仅有的在 OpenWRT 中。

对于内核 4.4,选择靠近所问问题的时间线的 git 历史记录。

600-netfilter_conntrack_flush.patch:

static const struct file_operations ct_file_ops = {
       .owner   = THIS_MODULE,
       .open    = ct_open,       .read    = seq_read,
 +     .write   = ct_file_write,
       .llseek  = seq_lseek,
       .release = seq_release_net,
 };
@@ -393,7 +450,7 @@ static int nf_conntrack_standalone_init_
 {
        struct proc_dir_entry *pde;

-       pde = proc_create("nf_conntrack", 0440, net->proc_net, &ct_file_ops);
+       pde = proc_create("nf_conntrack", 0660, net->proc_net, &ct_file_ops);
        if (!pde)
                goto out_nf_conntrack;

虽然我无法弄清楚具体的f语法是在哪里处理的(在上面的代码片段之外),但上面的片段清楚地显示 OpenWRT 添加了一个补丁,以允许写入 /proc/net/nf_conntrack在普通内核上只读的内容。

依然是今天可用于内核 5.4但其内容却更不明显。

人们可以想象它是为了应对嵌入式环境和有限的大小:如果内核补丁允许避免运送 conntrack 工具,则可以为其他功能腾出空间。

这是一个黑客行为。预期的现代互动连线子系统是通过conntrack工具和网络链接内核 API,不断发展。 (只读)/proc/net/nf_conntrack保留只是为了与更简单的工具兼容。

您可能可以使用此附加补丁(可能需要其他相关补丁)编译 Debian 源代码树来获得此功能,但我不确定这在普通系统上是否真的有用。

相关内容