许多人在想要重新加载防火墙规则时不会清除 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 源代码树来获得此功能,但我不确定这在普通系统上是否真的有用。