linux内核协议栈 netfilter 之连接跟踪模块概述

连接跟踪(CONNTRACK)模块在Linux内核中负责跟踪和记录TCP、UDP、ICMP等协议的连接状态。它通过nf_conntrack_l3proto和nf_conntrack_l4proto结构处理不同协议的数据包,确保能唯一识别数据流。在netfilter的hook点中,CONNTRACK在入口和出口处理数据包,创建和确认连接跟踪项。数据包路径涉及的函数如ipv4_conntrack_defrag、ipv4_conntrack_in、ipv4_conntrack_help和ipv4_confirm分别用于分段重组、创建连接跟踪项、处理期望连接和添加到跟踪表。此外,CONNTRACK解决如FTP的多通道和SNAT后的应用层协议匹配问题,引入了期望连接和helper函数的概念。
摘要由CSDN通过智能技术生成

连接跟踪(CONNTRACK)就是跟踪并且记录连接状态。包括 TCP 、UDP、ICMP  等协议类型的连接。其主要是判断该数据包是什么状态。根据数据包的源ip地址、目的ip地址、源端口、目的端口、协议号来确定一条连接。

因为连接跟踪支持TCP、UDP、ICMP等协议,而不同的协议,其处理上会有一些不同,因此增加了协议相关的连接跟踪结构,即nf_conntrack_l3proto,nf_conntrack_l4proto。nf_conntrack_l4proto 是四层协议的连接跟踪相关的结构,这个结构定义了四层协议相关的接口函数,使用这些函数我们能从一个skb中,抽取到在协议层上唯一识别一个数据流的信息。而 nf_conntrack_l3proto 为连接跟踪中三层协议相关的结构,这个结构定义了三层协议相关的接口函数,使用这些函数我们能从一个skb中,抽取到在协议层上唯一识别一个数据流的信息。结合三层与四层协议的这些函数,我们就能唯一确定一条流了,这两个协议层相关的结构是实现数据流从个性到共性的归纳依据。

那么连接跟踪模块在netfilter中与哪些hook有关呢,即一个数据包从进入一个接口到从一个接口发出需要经历哪些过程呢?

1、连接跟踪模块的hook回调函数分别注册在

  • NF_IP_PRE_ROUTING
  • NF_IP_LOCAL_OUT
  • NF_IP_POST_ROUTING
  • NF_IP_LOCAL_IN

从netfilter的角 度来说,NF_IP_PRE_ROUTING、NF_IP_LOCAL_OUT为 netfilter 的入口,而 NF_IP_POST_ROUTING、NF_IP_LOCAL_IN 为 netfilter 的出口hook点

那连接跟踪模块就是在netfilter的入口处,最先处理进入的数据包(可以根据hook的注册优先级nf_ip_hook_priorities来识别),根据数据包三层与四层协议的特点抽象出一个连接跟踪项;而在数据包的出口处对一个连接跟踪项进行确认。

2、如果仅考虑连接跟踪模块的hook函数,则对于不同的数据包,其经过netfilter 的路 径大概有三个,下面就按这三个路径进行分析,看不同路径下调用的连接跟踪hook函数是否相同。

A) 发往本机的数据包

ipv4_conntrack_defrag->ipv4_conntrack_in->ipv4_conntrack_help->ipv4_confirm

B)需要本机转发的数据包

ipv4_conntrack_defrag->ipv4_conntrack_in->ipv4_conntrack_help->ipv4_confirm

C) 本机发出的数据包

ipv4_conntrack_local->ipv4_conntrack_help->ipv4_confirm

上面的函数中,ipv4_conntrack_defrag用于对分段数据进行重组的,ipv4_conntrack_in对数据流创建相应的连接跟踪项,而ipv4_conntrack_help函数实现期望连接的创建、协议相关ALG功能的实现等功能,ipv4_confirm则是将新的连接跟踪项添加到连接跟踪表中。

在开始分析连接跟踪前,还有两个问题需要描述一下:

  1. 有些应用层协议的c/s模式的设计中,需要两条通道,以ftp为例,需要建立一条server port 21的命令通道,还需要建立一条server port 20 /(端口号大于1024)的数据通道用于数据传输。这时候如果还按照平常的流程分别为这两条数据通道建立两条连接跟踪项,而且每条连接跟踪项的状态都是从NEW_STATE开始进行转变,反而有些问题,因为先建立的命令通道相关的连接跟踪项已经从NEW_STATE转换为IP_CT_ESTABLISHED了,这时对于新建立的数据通道,其连接跟踪状态也应该可以直接设置成 IP_CT_ESTABLISHED了,而不必从NEW_STATE开始经过一系列的转换了。
  2. 有些应用层协议会存放三层的ip地址,当我们对从lan侧出去的数据包的三层ip地址进行了SNAT映射后,数据包的三层源地址就转变成wan侧地址了,但是应用层协议中携带的源ip地址仍然是lan侧内网的地址,如果不把应用层携带了源ip地址也进行SNAT映射,则在应用层协议之间建立的数据通道的数据可能就无法进入到lan侧。

基于以上问题,连接跟踪模块提出了期望连接与helper函数两个概念。

其中期望连接就是解决第一个问题,当创建一个连接跟踪项时,会根据reply方向的tuple结构查找helpers链表,并与该连接跟踪项进行绑定,接着在调用函数ipv4_conntrack_help时就调用该连接跟踪项的helper函数,注册的helper函数如果有期望连接的概念,就会创建一个期望连接,并添加到期望连接表中。

而helper函数的另一个功能就是用来解决第二个问题的,但是要想完整的解决第二个问题,还需要一个nat转换函数,用于对应用层中携带的ip地址进行NAT转换操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值