Linux conntrack 功能简介与操作

什么是 conntrack

大家在关注Linux性能调优时可能会接触到Linux的连接跟踪,我们先回顾一下相关概念,了解一下它的作用是什么。

连接跟踪(connection tracking,conntrack)是Linux内核中引入的nf_conntrack 模块所实现的功能,同时支持IPv4 和 IPv6,用于跟踪连接的状态,供其它模块或程序功能使用。 Linux为每一个经过网络堆栈的数据包都会记录其状态,生成一个新的连接记录,并将后续的数据包都分配给对应的连接,并更新连接的状态。连接跟踪是许多网络应用的基础。如nat地址转换、有状态防火墙等功能,都依赖连接跟踪功能。

需要注意的是,连接跟踪中所说的“连接”的概念,与 TCP/IP 的“连接”并不完全相同, 在 conntrack 中,一个元组定义的一条数据流(flow)就表示一条连接,类似于 UDP、ICMP 协议在 conntrack 中也都是有连接记录的。

顺便说一下 conntrack 的实现原理,它是通过netfilter的hook机制,在相应点上拦截报文,进行相应的conntrack的建立和处理。

还是实际操作一下 conntrack 吧

首先,先检查系统内核是否已正常加载nf_conntrack:

# lsmod | grep nf_conntrack 
nf_conntrack_ipv6 18935 7 
nf_defrag_ipv6 35104 1 nf_conntrack_ipv6
nf_conntrack_ipv4 15053 6 
nf_defrag_ipv4 12729 1 nf_conntrack_ipv4
nf_conntrack 139264 6 nf_nat,nf_nat_ipv4,nf_nat_ipv6,xt_conntrack,nf_conntrack_ipv4,nf_conntrack_ipv6
libcrc32c 12644 3 xfs,nf_nat,nf_conntrack

注意,如果关闭了防火墙firewalld,内核不会加载nf_conntrack模块。

安装 conntrack 工具集,便于方便的查看和操作 conntrack:

# dnf install -y conntrack-tools

之后就可以通过命令查看系统当前的 conntrack 信息:

# conntrack -L
tcp 6 299 ESTABLISHED src="/c2021/img/data-img.jpg" data-src=192.168.1.109 dst=192.168.1.182 sport=55527 dport=22 src="/c2021/img/data-img.jpg" data-src=192.168.1.182 dst=192.168.1.109 sport=22 dport=55527 [ASSURED] mark=0 use=1
conntrack v1.4.4 (conntrack-tools): 1 flow entries have been shown.

这里可以看到,我们有一个SSH连接到这台Linux,能识别到的信息包括协议、协议号、session生存时间、session状态、源IP地址、目的IP地址、源端口、目的端口、连接的状态。


从远端ping一下这台机器,这里能看到识别到了ICMP协议及其它元组信息:

# conntrack -L
tcp 6 431999 ESTABLISHED src="/c2021/img/data-img.jpg" data-src=192.168.1.182 dst=192.168.1.109 sport=22 dport=55527 src="/c2021/img/data-img.jpg" data-src=192.168.1.109 dst=192.168.1.182 sport=55527 dport=22 [ASSURED] mark=0 use=1
icmp 1 29 src="/c2021/img/data-img.jpg" data-src=192.168.1.121 dst=192.168.1.182 type=8 code=0 id=2031 src="/c2021/img/data-img.jpg" data-src=192.168.1.182 dst=192.168.1.121 type=0 code=0 id=2031 mark=0 use=1
conntrack v1.4.4 (conntrack-tools): 2 flow entries have been shown.


当然我们可以查看系统的运行时信息,只是显示格式上的差异,信息是基本一致的:

# cat /proc/net/nf_conntrack
ipv4 2 tcp 6 431999 ESTABLISHED src="/c2021/img/data-img.jpg" data-src=192.168.1.182 dst=192.168.1.109 sport=22 dport=55527 src="/c2021/img/data-img.jpg" data-src=192.168.1.109 dst=192.168.1.182 sport=55527 dport=22 [ASSURED] mark=0 zone=0 use=2
ipv4 2 icmp 1 29 src="/c2021/img/data-img.jpg" data-src=192.168.1.121 dst=192.168.1.182 type=8 code=0 id=2031 src="/c2021/img/data-img.jpg" data-src=192.168.1.182 dst=192.168.1.121 type=0 code=0 id=2031 mark=0 zone=0 use=2


我们还可以-E参数,实时观察链接层面的变化:

# conntrack -E
[NEW] icmp     1 30 src="/c2021/img/data-img.jpg" data-src=192.168.1.121 dst=192.168.1.182 type=8 code=0 id=2074 [UNREPLIED] src="/c2021/img/data-img.jpg" data-src=192.168.1.182 dst=192.168.1.121 type=0 code=0 id=2074
[UPDATE] icmp 1 30 src="/c2021/img/data-img.jpg" data-src=192.168.1.121 dst=192.168.1.182 type=8 code=0 id=2074 src="/c2021/img/data-img.jpg" data-src=192.168.1.182 dst=192.168.1.121 type=0 code=0 id=2074
[DESTROY] icmp 1 src="/c2021/img/data-img.jpg" data-src=192.168.1.121 dst=192.168.1.182 type=8 code=0 id=2074 src="/c2021/img/data-img.jpg" data-src=192.168.1.182 dst=192.168.1.121 type=0 code=0 id=2074


事件参考

在某些场景下,如主机的并发连接数过多,达到conntrack最大跟踪数量,会导致链接层面的一些异常,拿云上的一个案例分享:

Linux实例出现间歇性丢包,无法连接实例,在系统日志中重复出现大量类似以下错误信息。

kernel: nf_conntrack: table full, dropping packet.
kernel: nf_conntrack: table full, dropping packet.

涉及到的内核参数包括:

net.netfilter.nf_conntrack_buckets

net.netfilter.nf_conntrack_max

此场景下,一般建议调大nf_conntrack_max参数值来进行处理,由于系统维护连接比较消耗内存,需要在系统空闲和内存充足的情况下调大nf_conntrack_max参数。


总结

Linux conntrack 功能是诸多应用的基础,在某些性能调优、故障处置场景下需要关注到conntrack,希望本文介绍的一些内容能对大家有所帮助。

展开阅读全文

页面更新:2024-05-17

标签:功能   目的   内核   模块   场景   状态   协议   参数   操作   简介   系统   信息

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top