当前位置: 首页 > Linux

Netfilter是如何工作的(五):初识连接轨道(connectiontrack)

时间:2023-04-06 05:16:55 Linux

消息过滤和连接跟踪可以说是Netfilter提供的两个基本功能。前者为大多数人所熟知,因为我们对防火墙的第一印象是它可以阻止有害数据包对计算机的危害;而后者则不是那么有名,很多人甚至不知道Netfilter有这个功能。为什么使用连接跟踪顾名思义,连接跟踪是一种保存连接状态的机制。为什么要保存连接状态?比如你通过浏览器访问一个网站(连接网站的80端口),你期望收到源端口为80的服务器的响应,防火墙自然应该允许这些响应包。那是不是说所有源端口为80端口的包都要放行?显然不是,我们应该只允许源IP为服务器地址且源端口为80的数据包,而应该阻止源地址不匹配的数据包,即使其源端口也是80。总结这种情况,我们应该只允许未经请求的连接生成的双向数据包通过。另一个例子是NAT。我们可以使用iptables配置nat表的规则进行地址或端口转换。如果每条消息都去查询规则,效率太低了,因为同一个连接的转换方式是不变的!connectiontracking提供了一种缓存方案:当一个connection的第一个数据包通过,查询nat表时,connectiontracking保存了转换方法,后续消息只需要按照connectiontracking中保存的转换方法即可。向上。连接跟踪发生在哪里?连接跟踪挂钩到高优先级NF_IP_LOCAL_OUT和NF_IP_PRE_ROUTING挂钩中,以便在数据包进入系统之前查看它们。连接跟踪需要得到数据包的第一手信息,所以它们的入口是高优先级的,存在于LOCAL_OUT(本地发送)和PRE_ROUTING(消息接收)两条链中。既然有入口,自然就有出口。connectiontracking采用的方案是入口记录,出口确认。以IPv4为例:当连接的第一个skb通过入口时,连接跟踪会将连接跟踪信息保存在skb->nfctinfo中,而在出口处,连接跟踪会将连接跟踪信息从skb中移除并将其保存在哈希表中。当然,如果这个数据包在中间的其他HOOK点被丢弃,也就没有最后的确认过程了。什么是连接跟踪信息?连接跟踪信息会在入口处计算并存储在skb上。这些信息包括元组信息(地址、端口、协议号等)、扩展信息和各个协议的私有信息。元组信息包括发送和接收两个方向。对于TCP和UDP,就是IP加Port;对于ICMP,就是IP加上Type和Code等;扩展信息比较复杂,本文暂时略过;每个协议的私有协议信息,例如对于TCP是序列号、重传次数、比例因子等。路由或本地输出)。该状态保存在skb->nfctinfo中,有以下常用值:IP_CT_ESTABLISHED:这是属于已建立连接的消息。Netfilter见证了两个方向都传递了消息。IP_CT_RELATED:该状态下的消息与另一个IP_CT_ESTABLISHED状态连接相关。比如典型的ftp,ftp-data连接是从ftp-control派生出来的,它是RELATED状态IP_CT_NEW:这是连接的第一个包,常见的是TCP中的SYN包,UDP和ICMP中的第一个包,IP_CT_ESTABLISHED+IP_CT_IS_REPLY:类似于IP_CT_ESTABLISHED,但在回复方向IP_CT_RELATED+IP_CT_IS_REPLY:类似于IP_CT_RELATED,但在回复方向Summary连接跟踪是Netfilter提供的一项基本功能,可以保存连接的状态。用户可以针对不同状态的连接消息制定不同的策略;连接跟踪在消息进入Netfilter的入口处记录消息上的信息,并在出口处进行确认。确认的连接信息会影响后续的消息;连接跟踪的信息主要包括描述连接的基本元组和各个协议的私有信息。