报文过滤和 链接跟踪能够说是Netfilter
提供的两大基本功能。前者被大多数人熟知,由于咱们对防火墙的第一印象就是能够阻止有害的报文伤害计算机;然后者就没这么有名了,不少人甚至不知道Netfilter
有这项功能。
顾名思义,链接跟踪是保存链接状态的一种机制。为何要保存链接状态呢? 举个例子,当你经过浏览器访问一个网站(链接网站的80
端口)时,预期会收到服务器发送的源端口为80
的报文回应,防火墙天然应该放行这些回应报文。那是否是全部源端口为80
端口的报文都应该放行呢?显然不是,咱们只应该放行源IP为服务器地址,源端口为80
的报文,而应该阻止源地址不符的报文,即便它的源端口也是80
。总结一下这种状况就是,咱们只应该让主动发起的链接产生的双向报文经过。浏览器
另外一个例子是NAT
。咱们可使用iptables
配置nat
表进行地址或者端口转换的规则。若是每个报文都去查询规则,这样效率过低了,由于同一个链接的转换方式是不变的!链接跟踪提供了一种缓存解决方案:当一条链接的第一个数据包经过时查询nat
表时,链接跟踪将转换方法保存下来,后续的报文只须要根据链接跟踪里保存的转换方法就能够了。缓存
Connection tracking hooks into high-priorityNF_IP_LOCAL_OUT
andNF_IP_PRE_ROUTING
hooks, in order to see packets before they enter the system.
链接跟踪须要拿到报文的第一手资料,所以它们的入口是以高优先级存在于LOCAL_OUT
(本机发送)和PRE_ROUTING
(报文接收)这两个链。服务器
既然有入口,天然就有出口。链接跟踪采用的方案是在入口记录,在出口确认(confirm
)。以IPv4
为例:框架
当链接的第一个skb
经过入口时,链接跟踪会将链接跟踪信息保存在skb->nfctinfo
,而在出口处,链接跟踪会从skb
上取下链接跟踪信息,保存在本身的hash
表中。固然,若是这个数据包在中途其余HOOK
点被丢弃了,也就不存在最后的confirm
过程了。网站
链接跟踪信息会在入口处进行计算,保存在skb
上,信息具体包括tuple
信息(地址、端口、协议号等)、扩展信息以及各协议的私有信息。spa
tuple
信息包括发送和接收两个方向,对TCP
和UDP
来讲,是IP
加Port
;对ICMP
来讲是IP
加Type
和Code
,等等;TCP
就是序号、重传次数、缩放因子等。途径Netfilter
框架的每个报文老是会在入口处(PRE ROUTING
或者LOCAL OUT
)被赋予一个链接跟踪状态。这个状态存储在skb->nfctinfo
,有如下常见的取值:3d
Netfilter
目睹过两个方向都互经过报文了ftp
,ftp-data
的链接就是ftp-control
派生出来的,它就是RELATED
状态TCP
中的SYN
包,UDP
、ICMP
中第一个包,Netfilter
提供的一项基本功能,它能够保存链接的状态。用户能够为不一样状态的链接的报文制定不一样的策略;Netfilter
的入口将信息记录在报文上,在出口进行confirm
.确认后的链接信息能够影响以后的报文;tuple
以及各协议的私有信息。