什么是conntrack 大家在关注Linux性能调优时可能会接触到Linux的连接跟踪,我们先回顾一下相关概念,了解一下它的作用是什么。 连接跟踪(connectiontracking,conntrack)是Linux内核中引入的nfconntrack模块所实现的功能,同时支持IPv4和IPv6,用于跟踪连接的状态,供其它模块或程序功能使用。Linux为每一个经过网络堆栈的数据包都会记录其状态,生成一个新的连接记录,并将后续的数据包都分配给对应的连接,并更新连接的状态。连接跟踪是许多网络应用的基础。如nat地址转换、有状态防火墙等功能,都依赖连接跟踪功能。 需要注意的是,连接跟踪中所说的连接的概念,与TCPIP的连接并不完全相同,在conntrack中,一个元组定义的一条数据流(flow)就表示一条连接,类似于UDP、ICMP协议在conntrack中也都是有连接记录的。 顺便说一下conntrack的实现原理,它是通过netfilter的hook机制,在相应点上拦截报文,进行相应的conntrack的建立和处理。 还是实际操作一下conntrack吧 首先,先检查系统内核是否已正常加载nfconntrack:lsmodgrepnfconntracknfconntrackipv6189357nfdefragipv6351041nfconntrackipv6nfconntrackipv4150536nfdefragipv4127291nfconntrackipv4nfconntrack1392646nfnat,nfnatipv4,nfnatipv6,xtconntrack,nfconntrackipv4,nfconntrackipv6libcrc32c126443xfs,nfnat,nfconntrack 注意,如果关闭了防火墙firewalld,内核不会加载nfconntrack模块。 安装conntrack工具集,便于方便的查看和操作conntrack:dnfinstallyconntracktools 之后就可以通过命令查看系统当前的conntrack信息:conntrackLtcp6299ESTABLISHEDsrca2020imgdataimg。jpgdatasrc192。168。1。109dst192。168。1。182sport55527dport22srca2020imgdataimg。jpgdatasrc192。168。1。182dst192。168。1。109sport22dport55527〔ASSURED〕mark0use1conntrackv1。4。4(conntracktools):1flowentrieshavebeenshown。 这里可以看到,我们有一个SSH连接到这台Linux,能识别到的信息包括协议、协议号、session生存时间、session状态、源IP地址、目的IP地址、源端口、目的端口、连接的状态。 从远端ping一下这台机器,这里能看到识别到了ICMP协议及其它元组信息:conntrackLtcp6431999ESTABLISHEDsrca2020imgdataimg。jpgdatasrc192。168。1。182dst192。168。1。109sport22dport55527srca2020imgdataimg。jpgdatasrc192。168。1。109dst192。168。1。182sport55527dport22〔ASSURED〕mark0use1icmp129srca2020imgdataimg。jpgdatasrc192。168。1。121dst192。168。1。182type8code0id2031srca2020imgdataimg。jpgdatasrc192。168。1。182dst192。168。1。121type0code0id2031mark0use1conntrackv1。4。4(conntracktools):2flowentrieshavebeenshown。 当然我们可以查看系统的运行时信息,只是显示格式上的差异,信息是基本一致的:catprocnetnfconntrackipv42tcp6431999ESTABLISHEDsrca2020imgdataimg。jpgdatasrc192。168。1。182dst192。168。1。109sport22dport55527srca2020imgdataimg。jpgdatasrc192。168。1。109dst192。168。1。182sport55527dport22〔ASSURED〕mark0zone0use2ipv42icmp129srca2020imgdataimg。jpgdatasrc192。168。1。121dst192。168。1。182type8code0id2031srca2020imgdataimg。jpgdatasrc192。168。1。182dst192。168。1。121type0code0id2031mark0zone0use2 我们还可以E参数,实时观察链接层面的变化:conntrackE〔NEW〕icmp130srca2020imgdataimg。jpgdatasrc192。168。1。121dst192。168。1。182type8code0id2074〔UNREPLIED〕srca2020imgdataimg。jpgdatasrc192。168。1。182dst192。168。1。121type0code0id2074〔UPDATE〕icmp130srca2020imgdataimg。jpgdatasrc192。168。1。121dst192。168。1。182type8code0id2074srca2020imgdataimg。jpgdatasrc192。168。1。182dst192。168。1。121type0code0id2074〔DESTROY〕icmp1srca2020imgdataimg。jpgdatasrc192。168。1。121dst192。168。1。182type8code0id2074srca2020imgdataimg。jpgdatasrc192。168。1。182dst192。168。1。121type0code0id2074 事件参考 在某些场景下,如主机的并发连接数过多,达到conntrack最大跟踪数量,会导致链接层面的一些异常,拿云上的一个案例分享: Linux实例出现间歇性丢包,无法连接实例,在系统日志中重复出现大量类似以下错误信息。kernel:nfconntrack:tablefull,droppingpacket。kernel:nfconntrack:tablefull,droppingpacket。 涉及到的内核参数包括: net。netfilter。nfconntrackbuckets net。netfilter。nfconntrackmax 此场景下,一般建议调大nfconntrackmax参数值来进行处理,由于系统维护连接比较消耗内存,需要在系统空闲和内存充足的情况下调大nfconntrackmax参数。 总结 Linuxconntrack功能是诸多应用的基础,在某些性能调优、故障处置场景下需要关注到conntrack,希望本文介绍的一些内容能对大家有所帮助。