它首先需要存储状态。我使用的一些旧的BSD防火墙,我猜它被命名为IPFW,我曾经放置一条规则,即“跟踪离开数据包的状态”,并将其放置在接口的出站方向上。然后,另一个关于入站方向的规则将它们与由出站方向规则创建的状态进行检查。所以曾经有两条规则:(1)填充状态表,这是出站方向,(2)查找状态表,这是入站方向。
但是使用 connntrack,我看到它应用在 INPUT 链上,比如这条规则:
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
这让我想知道,该声明实际上在做什么?
- 是不是说它将通过将信息放入状态表中来开始跟踪匹配该规则的数据包?
- 还是说它已经拥有状态信息,并且将根据它对入站消息采取行动?(例如,如果它们属于先前接受的连接,则接受?)。但是,在这种情况下,states 表是在哪里填充的?是哪个规则?或者它是无规则的和隐含的?
Netfilter 和 conntrack 的介绍性介绍
首先是关于 Netfilter 和通用网络中的数据包流的强制性示意图:
Netfilter 是数据包过滤框架,将自身插入到网络堆栈的其余部分(由“路由决策”和其他白色圆边框部分表示)。Netfilter 为其他子系统和“客户端”提供挂钩和 API。这些部分包括conntrack(连接跟踪器)和iptables(或nftables)。Netfilter 和conntrack之间的分离是相当模糊的。您可以将conntrack视为 Netfilter 的一个集成部分。
在描述数据包遍历的各个步骤的示意图中,您可以看到在某个点(在 raw/PREROUTING 和 mangle/PREROUTING 之间,或在 raw/OUTPUT 和 mangle/OUTPUT 之间),数据包会遍历conntrack。
此时,conntrack将在它自己的查找表(一个保存在内核内存中的小型查找数据库)中进行搜索:
nf_conntrack_ftp
)(它是conntrack子系统的插件)检测到数据包是关联的单独数据流的一部分时使用 FTP 命令 PASV/EPSV 或 PORT/EPRT 在命令流(端口 21)上完成。解决问题
说了这么多,这里是你的两个子弹的答案:
在主网络命名空间中,一旦加载其模块(包括可能的相关协议特定子模块),conntrack就会开始跟踪连接。对于非初始网络命名空间(容器...),这还需要一些其他子系统引用它(例如 OP 的iptables的 conntrack 模块或使用一次
conntrack
稍后描述的命令)。这是默认设置,必须在conntrack之前将数据包专门标记为 UNTRACKED子系统看到它,因为这个数据包不被跟踪。在 Linux 上,只有少数情况不需要跟踪,但是当然状态防火墙和状态/动态 NAT 将不再可用(甚至可能首先需要使用 UNTRACKED 的无形 NAT,仍然可以完成,但不能使用iptables . tc或nftables可以)。为了避免conntrack处理某些数据包,可以使用这种iptables规则(例如:端口 80/tcp):当数据包遍历过滤器/输入并达到此规则时:
iptables的特定内核模块
xt_conntrack
查询conntrack子系统(由各种相关内核模块处理nf_conntrack*
)并在其查找数据库中询问此数据包的状态。如果答案是RELATED
或ESTABLISHED
数据包匹配并继续接受裁决。实际上,在第一次完成查找(通常通过conntrack )时,结果已经缓存在数据包中,所以这是一个廉价的“查找”。因此,这是处理之前已经接受的流的通用规则。这些流程最初可以在明确提及的规则中被接受,或者只是在没有提及但放在之后的规则中被接受-m conntrack --ctstate NEW
这个通用规则(但请记住 INVALID 状态,通常应该在这样做之前将其删除)。添加一个项目符号:传入数据包和传出数据包的处理在 PREROUTING 和 OUTPUT 之间非常对称(即使它们看起来并不对称):在 PREROUTING 和 OUTPUT 中的conntrack接口(以及在其他一些地方,考虑到NAT是使用conntrack,除了它的第一个数据包在状态 NEW 遍历iptables的 nat 表)。这可能与您写的有关 IPFW 的描述略有不同。如果运行应用程序的服务器也限制传出流量,那么它很可能需要在 filter/OUTPUT 和 filter/INPUT 中都使用相同的通用iptables规则,以允许已接受传入流量的传出回复数据包通过。
附加信息
有专门的工具可以与来自conntrack-tools的conntrack子系统的查找表进行交互。
conntrack
:查询、删除或更新由conntrack处理的查找表的内容。一些例子。
您可以使用以下命令列出所有跟踪的条目(如果没有额外的过滤器,它们可能很大):
如果您的系统正在执行 NAT(例如,私有 LAN 前的路由器,或运行虚拟机和容器),您可以使用
--any-nat
,--src-nat
或--dst-nat
仅显示 resp。所有 NAT、所有源 NAT(伪装)或所有目标 NAT(通常用于转发端口):实时监控conntrack事件:
conntrackd
:一个守护进程,它的两个主要目的是(conntrack)流记帐和统计,或高可用性状态防火墙集群状态同步。连接跟踪是 Netfilter 的一个单独功能,它没有配置 IPTables。
图中,INPUT 路径有两个
conntrack
步骤,OUTPUT 路径有一个步骤。这些步骤将单个数据包与连接跟踪表中跟踪的现有连接相关联,或在表中创建新的连接跟踪条目。Conntrack 功能是一个 Linux 内核模块,通常在默认配置中包含在内核中。
可以通过调整
net.netfilter.nf_conntrack
sysctl 值来调整 Conntrack 操作。你的第二个选择是发生了什么。状态信息由 Conntrack 函数记录,IPTables 规则简单地查阅 Conntrack 表获取信息。