conntrack-tools 是管理和监控 Linux 内核连接跟踪(Connection Tracking)表的瑞士军刀。它不仅是一个查看工具,还提供了强大的运维能力,可以用来排查网络问题、实现防火墙的高可用等。
下面我们来深入看看它的安装和核心用法。
📥 安装与内核模块准备
conntrack 命令通常需要单独安装:
- Debian/Ubuntu :
sudo apt install conntrack conntrackd nfct - RHEL/CentOS :
sudo yum install conntrack-tools
使用前,需确保内核已加载连接跟踪及相关 Netlink 模块:
bash
# 加载 nf_conntrack 与 netfilter netlink 模块
sudo modprobe nf_conntrack
sudo modprobe nf_conntrack_netlink
🔧 核心组件解析 (conntrack, conntrackd, nfct)
这个工具集主要包含三个部分:
conntrack:命令行管理工具,用来跟内核的连接跟踪表"对话",执行查看、删除、监听等操作。conntrackd:用户态守护进程,主要用于实现防火墙的高可用(HA)。它可以在多台机器间同步连接跟踪表,实现状态化的主备切换。nfct:较新的工具,目前主要用于管理连接跟踪的超时策略(cttimeout),未来可能替代conntrack。
🛠️ conntrack 核心命令详解
conntrack 是日常运维中最常用的部分。
基础命令 (-L, -C, -D, -F)
| 功能 | 命令格式 |
|---|---|
| 列出所有连接 | sudo conntrack -L |
| 统计当前连接数 | sudo conntrack -C |
| 删除单个连接条目 | sudo conntrack -D -p tcp --orig-src 10.0.0.1 --orig-dst 10.0.0.2 --orig-sport 12345 --orig-dport 80 |
| 清空整个连接表 | sudo conntrack -F |
conntrack -L 输出解读
conntrack -L 的输出信息量大,掌握它的含义是排查问题的基础:
text
tcp 6 431999 ESTABLISHED src=192.168.1.100 dst=10.0.0.1 sport=5432 dport=3306 src=192.168.1.100 dst=10.0.0.1 sport=5432 dport=3306 [ASSURED] mark=0 use=2
-
协议 & 状态 :
tcp和ESTABLISHED表示这是一个已建立的 TCP 连接。 -
超时 :
431999是此条目的剩余存活时间(秒)。若不活跃,条目将在此时间后自动删除。 -
二层元组 :
src/dst/sport/dport描述了一个完整的网络流。特别注意,一条记录会包含两次,分别代表原始方向 和期望回复方向的信息。运行 NAT 时尤其要注意:原始方向记录客户端发出的包;而期望回复方向会显示转化后的地址,便于调试。
-
[标志] :
[ASSURED]表示"确信"该连接是活跃的,条目不会被过早回收。- 若无此标识 :
conntrack可能尚不能100%确认该连接的状态,比如可能是一个新连接或收到了非 SYN 的 TCP 包(如 mid-stream pickup)。
- 若无此标识 :
高级过滤 (-p, -s, -d, --dst-nat)
你可以通过参数过滤信息,让输出更聚焦:
- 按协议过滤 :
sudo conntrack -L -p tcp - 按源/目IP过滤 :
sudo conntrack -L -s 192.168.1.100 -d 10.0.0.1 - 查看 NAT 条目 :
sudo conntrack -L --dst-nat 192.168.1.100
实时事件监控 (-E)
-E 参数可以实时输出连接状态变更事件,对动态追踪非常有用:
bash
sudo conntrack -E
它会显示每条连接从 [NEW] 建立到 [DESTROY] 销毁的全过程。
🚀 conntrackd 实现高可用
conntrackd 通过用户态守护进程,将主防火墙的连接表状态实时同步至备机。一旦主机宕机(通过 Keepalived 等检测),备份防火墙无缝接管,避免了已建立连接的 TCP 会话中断。其核心同步算法通常包括"无跟踪 (notrack)"和"完全容错 (FTFW)"等方式,需要精心配置。
⚙️ 性能调优:避免连接跟踪表爆炸
若服务器高负载时出现 "nf_conntrack: table full, dropping packet" 的内核日志,通常表明跟踪表已满。可在 conntrack 操作外,直接通过 sysctl 调优内核参数:
bash
# 查看当前最大连接数与使用率
sysctl net.netfilter.nf_conntrack_max
cat /proc/sys/net/netfilter/nf_conntrack_count
# 扩大最大连接数(需保留约1/4-1/8容量给bucket)
sudo sysctl -w net.netfilter.nf_conntrack_max=524288
sudo sysctl -w net.netfilter.nf_conntrack_buckets=131072
# 长期配置写入 /etc/sysctl.conf
🤔 conntrack vs nfct
简单总结一下 conntrack 和 nfct 这两个工具的区别:
conntrack:功能全面,覆盖所有连接跟踪操作(查看、删除、监听等),是目前成熟的通用工具。nfct:功能聚焦,当前主要用于管理超时策略(类似nft风格的语法),未来目标可能是完全替代conntrack。