conntrack 是 Netfilter 框架的核心模块,负责状态防火墙、NAT 等功能的基础数据支撑。
一、 概述
conntrack,即连接跟踪,是 Linux 内核网络栈(Netfilter 子系统)的一个重要功能。它维护一个名为 conntrack table 的表,用于跟踪所有进出系统的网络连接的状态。
核心功能:识别和记录连接的状态(如 NEW, ESTABLISHED, RELATED, INVALID)。
依赖功能:是实现 iptables/nftables 状态防火墙 和 NAT(网络地址转换) 的基础。没有连接跟踪,就无法实现“只允许已建立连接的包通过”这样的规则。
协议支持:主要支持 TCP, UDP, ICMP 等协议。对于无连接协议如 UDP,conntrack 会基于超时时间来模拟一个“虚拟连接”。
二、 用户空间工具:conntrack-tools
要查看和管理连接跟踪表,你需要安装用户空间工具包 conntrack-tools。
安装命令:
Debian/Ubuntu: sudo apt-get install conntrack
RHEL/CentOS: sudo yum install conntrack-tools
或 sudo dnf install conntrack-tools常用 conntrack 命令
conntrack 命令是主要的用户空间管理工具。
查看连接跟踪表
sudo conntrack -L # 列出所有当前被跟踪的连接。
sudo conntrack -L -o extended # 以扩展格式显示,信息更详细(包括连接ID、启动时间等)。
sudo conntrack -L -o id
sudo conntrack -L -p tcp # 只查看 TCP 协议的连接。
sudo conntrack -L -s 192.168.1.x # 查看源IP为 192.168.1.x的连接。
sudo conntrack -L -d 8.8.8.x # 查看目标IP为 8.8.8.x 的连接。实时监控连接事件
sudo conntrack -E # 实时监控并显示连接跟踪表的新事件(如 NEW, UPDATE, DESTROY)。
sudo conntrack -E -o extended # 以扩展格式实时监控。删除连接跟踪项
sudo conntrack -D # 删除所有连接跟踪项(慎用! 会导致大量连接中断)
sudo conntrack -D -p tcp --state ESTABLISHED # 删除所有状态为 ESTABLISHED 的 TCP 连接。
sudo conntrack -D -s 192.168.1.x # 删除所有源IP为 192.168.1.x的连接。
# 精确删除一条连接(推荐先使用 -L -o extended 找到连接的唯一ID)
sudo conntrack -D --orig-src 192.168.1.x--orig-dst 8.8.8.x -p tcp --orig-port-src 54321 --orig-port-dst 80获取统计信息
sudo conntrack -S #显示 conntrack 的详细统计信息,包括查找次数、命中次数、新建数、删除数、插入失败等。三、 相关系统文件和参数
1)Linux 内核通过 /proc 和 /sys 文件系统保存 conntrack 配置和状态接口
/proc/net/nf_conntrack:这是连接跟踪表的主要内容文件。使用 cat /proc/net/nf_conntrack 可以查看所有跟踪的连接,其格式与 conntrack -L -o extended 类似。该文件的可读性不如 conntrack 命令。
/proc/net/stat/nf_conntrack:提供连接跟踪的统计信息。
/proc/sys/net/netfilter/ 下的参数用于调优和监控 conntrack 的性能与行为。
nf_conntrack_max:连接跟踪表的最大容量,即最多能同时跟踪多少个连接。默认值因系统内存而异。如果连接数超过此值,新连接会被丢弃。
nf_conntrack_count:当前已跟踪的连接数(只读)。监控这个值接近 nf_conntrack_max 的程度非常重要。
nf_conntrack_buckets:哈希表的大小(只读)。为了查找效率,连接跟踪表使用哈希表存储。通常不需要手动设置,内核会自动根据 max 计算一个合理值。
nf_conntrack_tcp_timeout_*:一系列控制不同 TCP 连接状态超时时间的参数。
nf_conntrack_tcp_timeout_established:已建立的 TCP 连接的超时时间(默认 432000 秒,即5天)。
nf_conntrack_tcp_timeout_time_wait:TIME_WAIT 状态的超时时间(默认 120 秒)。
nf_conntrack_udp_timeout:UDP “连接”的超时时间(默认 30 秒)。
nf_conntrack_icmp_timeout:ICMP 请求的超时时间(默认 30 秒)。
其他重要参数
nf_conntrack_tcp_loose:设置为 1 时,允许处于无效状态的 TCP 连接可能恢复(宽松模式)。设置为 0 则更严格。
nf_conntrack_checksum:是否验证进出数据的校验和。在生产环境中,如果网络硬件已经保证了校验和,可以设置为 0 以提升性能。
2)使用 sysctl 命令或直接 echo 值到文件中来修改
查看当前参数:sysctl -a | grep nf_conntrack
临时修改参数(示例,增加最大连接数):
echo 300000 | sudo tee /proc/sys/net/netfilter/nf_conntrack_max
永久修改参数:
在 /etc/sysctl.conf 或 /etc/sysctl.d/ 目录下的文件中添加一行,然后执行 sysctl -p。
例如:
net.netfilter.nf_conntrack_max = 300000
四、 常见问题与排查
1. 连接数过多,导致新连接被拒绝 (insert_failed)
这是最常见的问题。表现为服务器无法建立新连接,日志中可能出现 kernel: nf_conntrack: table full, dropping packet。
查看当前连接数:sudo conntrack -C 或 cat
/proc/sys/net/netfilter/nf_conntrack_count
查看最大限制:cat
/proc/sys/net/netfilter/nf_conntrack_max
查看统计信息中的错误:sudo conntrack -S,重点关注 insert_failed 计数器。
五、解决方案
清理连接跟踪表 (sudo conntrack -D),但这只是临时措施。
增加 nf_conntrack_max:根据系统内存适当调大。
优化超时时间:特别是
nf_conntrack_tcp_timeout_established,对于Web服务器等短连接服务,将其从5天减少到1小时(3600秒)或更短可以显著释放表空间。
找出并限制异常连接:使用 conntrack -L 分析连接,看是否有大量来自单一IP的连接(可能是攻击或错误配置),并用 iptables 限制单个IP的连接数。
六、如何禁用 conntrack?
通常不推荐,因为这会破坏依赖它的服务(如防火墙、Docker)。
方法一:卸载 nf_conntrack 内核模块。但这几乎不可能,因为太多模块依赖它。
sudo modprobe -r nf_conntrack_netlink nf_conntrack_ipv4 nf_conntrack_ipv6 nf_conntrack
方法二(更实际):在 raw 表中为不需要跟踪的流量设置 NOTRACK 目标(仅适用于 iptables,nftables 有类似功能)。
sudo iptables -t raw -A PREROUTING -p tcp --dport 80 -j NOTRACK
sudo iptables -t raw -A OUTPUT -p tcp --sport 80 -j NOTRACK
这样,所有端口80的流量将不会被连接跟踪。
七、 与 iptables/nftables 的交互
conntrack 与防火墙规则密不可分。iptables 可以使用 -m state 或 -m conntrack 模块来匹配连接状态。
常见状态匹配:
-m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
-m conntrack --ctstate INVALID -j DROP
在规则中查看经过某个网卡的连接:
sudo iptables -I INPUT -m conntrack --ctstate NEW -j LOG --log-prefix "NEW CONN: "