我不了解 conntrack 模块的一些基本概念。
首先,我确定它已在我的系统(Ubuntu 18.04)中启用,modinfo
显示有关 nf_conntrack 的信息,并且/proc/modules
文件告诉 nf_conntrack 是“实时的”。
其次,我有以下测试设置:
机器 A (192.168.1.2) <-----> 路由器机器 (192.168.1.1 & 192.168.2.1) <----> 机器 B (192.168.2.2)
在路由器机器上,我有以下 iptables 规则:
iptables -t filter -A FORWARD -m set --match-set BlackListPort dst -j DROP
BlackListPort 是一个 ipset 表。
现在我建立了从机器 A (1.2) 到机器 B (2.2) 的 SSH 连接。在我确认它有效后,我将端口 22(SSH 默认)添加到 BlackListPort 表。
SSH 连接冻结/挂起,直到我从该 ipset 表中删除端口 22。
现在的问题是:由于我的系统中存在 conntrack,为什么 SSH 阻止成功?SSH 连接是在端口 22 添加到 ipset 之前建立的,因此 conntrack 应该跳过所有数据包,允许 SSH 工作。
这是不正确的。
所有数据包都将通过过滤规则进行处理,无论它们是否属于被跟踪的连接。
这是 iptables 规则的一个非常常见的优化,将这样的内容放在相关规则链的开头附近(
FORWARD
在您的示例中):在较旧的发行版上,您可能会看到此版本:
(我知道
conntrack
匹配现在比state
匹配更受欢迎。我认为一些内核版本甚至会唠叨你。)如果存在连接跟踪信息,这将允许属于现有连接的数据包通过。但关键是,您可以控制该规则的确切放置位置,或者是否使用它。因此,您可以让防火墙规则尽可能多地或尽可能少地关心连接状态。