一、简要介绍
- 官网:https://netfilter.org/projects/conntrack-tools/index.html
- git库:https://git.netfilter.org/conntrack-tools/
- conntrack-tools包括:conntrack、conntrackd、nfct。
- conntrack:从用户空间查看和管理内核的连接跟踪表
- conntrackd:可以用在热备场景下在多台机器直接实时同步连接跟踪表。
- nfct:目前只支持nfnetlink_cttimeout。从长远来看,希望通过提供类似于nftables的语法来替代conntrack。
- 需要内核加载nf_conntrack_netlink和nfnetlink模块,且net.netflilter.nf_conntrack_events=1(默认值)。
- 依赖的库有:
- libnetfilter_conntrack
- libnetfilter_cthelpter
- libnetfilter_cttimeout
- libnetfilter_queue
- libnfnetlink
- libmnl
- 主要功能有:
- 支持用纯文本或XML格式列出conntrack表的内容
- 在conntrack表中搜索特定条目
- 向conntrack表添加新条目
- 列出expect表的条目
- 向expect表添加新条目
- 添加/删除/更新连接跟踪超时策略
- 应用场景:
- conntrack可以用来查看/监控连接信息(状态)的变更。
- conntrackd可以用于无缝双机热备环境,Linux主机可以实时的将一台机器的conntrack信息同步到相应的备机上,一旦主机宕机IP地址漂到备机,流量就会无缝的经过备机,而不需要在流量经过备机时重新生成conntrack信息(因为在重新生成的情况下,对于已经建立连接的TCP流量会有问题的)。
二、使用
- Centos7安装:yum install -y conntrack-tools
- 示例1:conntrack -L:打印连接跟踪表,和cat /proc/net/nf_conntrack效果一样。
- 示例2:实时捕捉连接的状态变化
- -o [extended,xml,timestamp,id,ktimestamp,labels] 选项指定输出的一些格式,如:
- -o timestamp:每条打印前会加上timestamp,需要自己转换成可读的日期格式,如date "+%Y-%m-%d %H:%M:%S" -d @xxxxxxx。
- -o ktimestamp:连接destroy是会打印连接的start和stop时间。ktimestamp需要sysctl -w net.netfilter.nf_conntrack_timestamp=1。
- -o id:会打印每条连接的ID,这样可以通过ID来识别同一条连接。
- -e [ALL|NEW|UPDATES|DESTORY][,...]选项只监听指定的事件,减少上报的数量。
- -o [extended,xml,timestamp,id,ktimestamp,labels] 选项指定输出的一些格式,如:
三、实现原理
通过netlink和内核的nf_conntrack_netlink模块进行通信来查询/操作连接跟踪表。
源码涉及3个包:conntrack-tools->libnetfilter_conntrack->libnfnetlink