李成笔记网

专注域名、站长SEO知识分享与实战技巧

Linux conntrack(连接跟踪)相关知识点

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: "

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言