Netfilter 是如何工做的(五):初识链接跟踪(connection track)

logo

报文过滤链接跟踪能够说是 Netfilter提供的两大基本功能。前者被大多数人熟知,由于咱们对防火墙的第一印象就是能够阻止有害的报文伤害计算机;然后者就没这么有名了,不少人甚至不知道 Netfilter有这项功能。

Why 使用链接跟踪

顾名思义,链接跟踪是保存链接状态的一种机制。为何要保存链接状态呢? 举个例子,当你经过浏览器访问一个网站(链接网站的80端口)时,预期会收到服务器发送的源端口为80的报文回应,防火墙天然应该放行这些回应报文。那是否是全部源端口为80端口的报文都应该放行呢?显然不是,咱们只应该放行源IP为服务器地址,源端口为80的报文,而应该阻止源地址不符的报文,即便它的源端口也是80。总结一下这种状况就是,咱们只应该让主动发起的链接产生的双向报文经过浏览器

NAT

另外一个例子是NAT。咱们可使用iptables配置nat表进行地址或者端口转换的规则。若是每个报文都去查询规则,这样效率过低了,由于同一个链接的转换方式是不变的!链接跟踪提供了一种缓存解决方案:当一条链接的第一个数据包经过时查询nat表时,链接跟踪将转换方法保存下来,后续的报文只须要根据链接跟踪里保存的转换方法就能够了。缓存

链接跟踪发生在哪里

Connection tracking hooks into high-priority NF_IP_LOCAL_OUT and NF_IP_PRE_ROUTING hooks, in order to see packets before they enter the system.

链接跟踪须要拿到报文的第一手资料,所以它们的入口是以高优先级存在于LOCAL_OUT(本机发送)和PRE_ROUTING(报文接收)这两个链。服务器

既然有入口,天然就有出口。链接跟踪采用的方案是在入口记录,在出口确认(confirm)。以IPv4为例:框架

arch

当链接的第一个skb经过入口时,链接跟踪会将链接跟踪信息保存在skb->nfctinfo,而在出口处,链接跟踪会从skb上取下链接跟踪信息,保存在本身的hash表中。固然,若是这个数据包在中途其余HOOK点被丢弃了,也就不存在最后的confirm过程了。网站

链接跟踪信息是什么

链接跟踪信息会在入口处进行计算,保存在skb上,信息具体包括tuple信息(地址、端口、协议号等)、扩展信息以及各协议的私有信息。spa

struct

  • tuple信息包括发送和接收两个方向,对TCPUDP来讲,是IPPort;对ICMP来讲是IPTypeCode,等等;
  • 扩展信息比较复杂,本文暂时略过;
  • 各协议的私有信息,好比对TCP就是序号、重传次数、缩放因子等。

报文的链接跟踪状态

途径Netfilter框架的每个报文老是会在入口处(PRE ROUTING或者LOCAL OUT)被赋予一个链接跟踪状态。这个状态存储在skb->nfctinfo,有如下常见的取值:3d

  • IP_CT_ESTABLISHED:这是一个属于已经创建链接的报文,Netfilter目睹过两个方向都互经过报文了
  • IP_CT_RELATED:这个状态的报文所处的链接与另外一个IP_CT_ESTABLISHED状态的链接是有联系的。好比典型的ftpftp-data的链接就是ftp-control派生出来的,它就是RELATED状态
  • IP_CT_NEW:这是链接的第一个包,常见的就是TCP中的SYN包,UDPICMP中第一个包,
  • IP_CT_ESTABLISHED + IP_CT_IS_REPLY:与IP_CT_ESTABLISHED相似,可是是在回复方向
  • IP_CT_RELATED + IP_CT_IS_REPLY:与IP_CT_RELATED相似,可是是在回复方向

总结

  • 链接跟踪Netfilter提供的一项基本功能,它能够保存链接的状态。用户能够为不一样状态的链接的报文制定不一样的策略;
  • 链接跟踪在报文进入Netfilter入口将信息记录在报文上,在出口进行confirm.确认后的链接信息能够影响以后的报文;
  • 链接跟踪的信息主要包括基本的描述链接的tuple以及各协议的私有信息。
相关文章
相关标签/搜索