linux 连接跟踪 conntrack
参考链接:
http://blog.iis7.com/article/24048.html
什么是连接跟踪?
连接跟踪是Linux内核中引入的nf_conntrack 模块所实现的功能,同时支持IPv4 和 IPv6,取代只支持 IPv4 的 ip_connktrack,用于跟踪连接的状态,供其他模块使用。顾名思义,就是跟踪并且记录连接状态。Linux为每一个经过网络堆栈的数据包都会记录其状态,生成一个新的连接记录,并将后续的数据包都分配给对应的连接,并更新连接的状态。连接跟踪主要用于Linux的NAT以及状态防火墙。
认识连接跟踪
通常情况下,连接跟踪模块会为每一个连接记录多个信息,用以区分不同的连接。多条连接记录组成一个连接跟踪表。首先查看一条连接跟踪记录,通常使用下面两种命令(不同系统可能有所区别)
- conntrack -L
- cat /proc/net/nf_conntrack
可以得到下面这样的连接跟踪记录
tcp 6 117 SYN_SENT src=192.168.1.6 dst=192.168.1.9 sport=32775 dport=22 [UNREPLIED] src=192.168.1.9 dst=192.168.1.6 sport=22 dport=32775 use=2
-
其中第一项为该记录的协议,即TCP。
-
第二项为协议号,TCP协议号为6。
-
第三项是该条记录的剩余生存时间,该时间会持续减少直到有新的数据包到达来更新该记录。
-
第四项是协议过程中的状态,表明当前该记录处在TCP的SYN_SENT状态,即发出了syn包,等待应答。
-
之后便是维护当前连接数据包的源IP、目的IP、源端口、目的端口。
-
中括号内的是连接的状态,[UNREPLIED]表示只有单向有数据传输,没有应答。当收到回复,数据变为双向传输后,连接跟踪变为删除该标记。当出现[ASSURED]时,表明该记录在两个方向上都没有数据传输,存在该标记的记录在连接跟踪表满时不会被删除。
-
中括号后是该连接所期望收到的数据包的源IP、目的IP、源端口和目的端口号,可见于之前的前面的一条记录是完全相反的
连接跟踪的工作原理
如上所见,连接跟踪通过记录多种数据包的信息来确定每个数据包应该匹配到哪一个连接,通常我们把这些信息叫做连接跟踪的五元组,当然针对不同的协议,可能还有四元组、七元组等等,也存在为了特殊需要而修改连接跟踪模块使其记录更多信息情况。对于一般情况下,X元组(tuple)指的是:
四元组:源IP地址、目的IP地址、源端口、目的端口
五元组:源IP地址、目的IP地址、协议号、源端口、目的端口
七元组:源IP地址、目的IP地址、协议号、源端口、目的端口,服务类型以及接口索引
nf_conntrack模块跟踪所有网络连接,首先根据数据包的元组信息计算出哈希值,分配一个桶位置。如果有冲突就在链表上遍历,直到找到一个精确匹配的key值,如果没有匹配的则新建一条记录。因此实际上存储连接跟踪表的是一个类似于哈希桶的结构。