Mik*_*kov 6 networking firewall debian iptables
许多人在想要重新加载防火墙规则时不会清除 conntrack 表。当您有一些 ESTABLISHED 连接时,当您添加阻止某些相关连接(处于 NEW 状态)的规则时,所有会话都不会受到影响。确保这不会发生的唯一方法是通过清除 conntrack 表来终止所有会话。在这种情况下,所有数据包都将符合 INVALID 规则,您必须建立一个新连接,该连接现在通过iptables.
在 OpenWRT 中,您可以简单地执行以下操作:
# echo f > /proc/net/nf_conntrack
Run Code Online (Sandbox Code Playgroud)
但不幸的是,此解决方案不适用于 debian。
# echo f > /proc/net/nf_conntrack
echo: write error: Input/output error
Run Code Online (Sandbox Code Playgroud)
原因如下:
# ls -al /proc/net/nf_conntrack
-r--r----- 1 root root 0 2016-06-05 10:45:52 /proc/net/nf_conntrack
Run Code Online (Sandbox Code Playgroud)
在 debian 上,您必须安装该conntrack软件包,然后键入以下命令:
# conntrack -F
conntrack v1.4.3 (conntrack-tools): connection tracking table has been emptied.
Run Code Online (Sandbox Code Playgroud)
为什么echo f在 debian 上不起作用?有没有办法让它以某种方式工作,还是我被迫使用该conntrack工具?
OpenWRT 维护着几个特定的内核补丁。其中,有一个特定的补丁提供了您抱怨的 Debian 中缺少的功能。它实际上仅在 OpenWRT 中可用。
对于内核 4.4,选择靠近所问问题的时间线的 git 历史记录。
600-netfilter_conntrack_flush.patch:
Run Code Online (Sandbox Code Playgroud)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子系统的现代交互是通过该conntrack工具和不断发展的netlink内核 API 进行的。(只读)/proc/net/nf_conntrack保留只是为了与更简单的工具兼容。
您可能可以使用此附加补丁(可能需要其他相关补丁)编译 Debian 源代码树来获得此功能,但我不确定这在普通系统上是否真的有用。