菜鸟科技网

conntrack命令如何查看和跟踪连接状态?

conntrack 是一个功能强大的命令行工具,用于在 Linux 系统上查看、修改和删除内核中的 Netfilter 连接跟踪表(Connection Tracking Table, 简称 conntrack 或 conntrack table),这个表是防火墙(如 iptablesnftables)和状态检测功能的核心,它记录了所有经过网络堆栈的、符合规则的活动的网络连接状态。

conntrack命令如何查看和跟踪连接状态?-图1
(图片来源网络,侵删)

什么是连接跟踪?

在深入命令之前,先理解它的作用至关重要。

想象一下,你的 Linux 服务器是一个繁忙的港口,每一个网络数据包(比如一个 SYN 包)就像一艘试图进港的船,连接跟踪系统就是港口的“调度中心”和“登记处”。

  1. 建立连接:当一艘船(SYN 包)进港时,调度中心记录下它的信息:来自哪个国家(源 IP)、开往哪个国家(目的 IP)、船的类型(协议,如 TCP/UDP)、货物是什么(端口),这就像创建了一个新的连接条目。
  2. 跟踪状态:调度中心会跟踪这艘船的状态,它是在等待靠岸(SYN_SENT)、已经靠岸卸货(ESTABLISHED)、准备离港(FIN_WAIT)还是已经离港(TIME_WAIT)?对于 TCP,ESTABLISHED, RELATED, NEW, INVALID 等状态。
  3. 允许返回流量:最关键的一点是,调度中心知道哪些船是合法的,如果一个港口的船(服务器)给外国(客户端)发了一箱货(一个 HTTP 响应),那么当外国船的返程船(客户端的 ACK 包)回来时,调度中心会认出:“哦,这是我们港口出去的船,让它回来。” 这就是所谓的“状态检测防火墙”的基础,没有连接跟踪,防火墙就只能基于 IP 和端口做简单的“允许/禁止”,而无法智能地识别“这个响应是允许的,因为它是由我们主动发起的请求引起的”。

conntrack 命令的基本使用

conntrack 命令通常需要 root 权限才能执行。

查看帮助

conntrack -h
# 或者
man conntrack

这是学习命令选项最快的方式。

conntrack命令如何查看和跟踪连接状态?-图2
(图片来源网络,侵删)

查看所有连接条目

这是最常用的功能,用于诊断当前系统上所有的网络活动。

sudo conntrack -L

输出示例解读:

ipv     origin destination                     proto     status
src=192.168.1.100            dst=8.8.8.8              sport=54321          dport=53            src=8.8.8.8              dst=192.168.1.100            sport=53            dport=54321          udp UNREPLIED src=192.168.1.100            dst=8.8.8.8              sport=54321          dport=53            src=8.8.8.8              dst=192.168.1.100            sport=53            dport=54321          udp ASSURED
src=10.0.0.5                dst=1.2.3.4              sport=12345          dport=80            src=1.2.3.4              dst=10.0.0.5                sport=80            dport=54321          tcp ESTABLISHED
  • ipv:IP 版本 (ipv4 或 ipv6)。
  • src/dst:源/目的 IP 地址。
  • sport/dport:源/目的端口号。
  • proto:协议 (tcp, udp, icmp 等)。
  • status:连接状态,这是最重要的信息,常见状态有:
    • ESTABLISHED:连接已建立,数据可以双向传输。
    • NEW:连接的第一个包,如 TCP 的 SYN 包。
    • RELATED:与一个已存在的连接相关的新连接,FTP 的数据连接(控制端口是 21,数据端口是 20)RELATED 连接。
    • UNREPLIED:已发送请求,但尚未收到响应。
    • ASSURED:连接被认为是合法的,可以保证返回流量被允许。
    • INVALID:无法识别或不符合预期的包,通常会被丢弃。

查看特定连接条目

当连接很多时,全量查看不现实,我们可以使用 -j--dump 选项,结合 grep 来过滤。

示例 1:查看与某个 IP 的所有连接

conntrack命令如何查看和跟踪连接状态?-图3
(图片来源网络,侵删)
# 查看 IP 192.168.1.100 的所有连接
sudo conntrack -L | grep 192.168.1.100

示例 2:查看特定端口的连接

# 查看 80 端口的所有 TCP 连接
sudo conntrack -L --proto tcp --dport 80

示例 3:查看特定状态的连接

# 查看所有已建立的连接
sudo conntrack -L --state ESTABLISHED

删除连接条目

当连接状态异常(半开连接过多导致性能下降),或者需要手动终止某个特定连接时,删除条目非常有用。

警告: 错误地删除连接可能会导致应用程序通信中断,请谨慎操作。

根据 ID 删除(最精确)

找到连接的 ID,然后用 -D 删除。

# 1. 找到目标连接的 ID
sudo conntrack -L | grep "src=1.2.3.4 dst=5.6.7.8"
# 假设输出是:
# ipv4     1.2.3.9678           5.6.7.880              tcp ESTABLISHED src=1.2.3.4 54321 dst=5.6.7.8 80 src=5.6.7.8 80 dst=1.2.3.4 54321 ESTABLISHED
# ID 1.2.3.9678
# 2. 使用 ID 删除
sudo conntrack -D 1.2.3.9678

根据规则删除(批量删除)

使用 -F (flush) 或 -D 加上过滤条件。

# 删除所有来自 192.168.1.100 的连接
sudo conntrack -D --src 192.168.1.100
# 删除所有到 10.0.0.5 的 UDP 连接
sudo conntrack -D --dst 10.0.0.5 --proto udp
# 清空整个连接跟踪表(非常危险!)
sudo conntrack -F

创建新的连接条目

这个功能比较高级,通常用于测试或模拟场景,你可以手动创建一个条目,让防火墙认为某个连接已经存在,从而允许后续的流量通过。

# 手动创建一个 TCP 连接条目
# 格式: conntrack -I [options]
sudo conntrack -I --proto tcp --src 192.168.1.100 --dst 8.8.8.8 --sport 12345 --dport 80 --state ESTABLISHED

更新连接条目

可以修改现有连接的某些属性,例如超时时间。

# 更新连接条目 1.2.3.9678 的超时时间为 600 秒
sudo conntrack -U --id 1.2.3.9678 --timeout 600

conntrackiptables 的关系

conntrackiptables 的幕后英雄,当你设置一条 iptables 状态检测规则时,iptables 内部会去查询或操作 conntrack 表。

示例:

# 允许所有已建立的、以及与已建立连接相关的流量进入
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

这条规则的工作原理是:

  1. 当一个数据包进入 INPUT 链时,iptablesstate 模块会检查这个数据包。
  2. 如果这个数据包是 ESTABLISHEDRELATED 状态(即 conntrack 表中存在对应条目),iptables 就允许它通过。
  3. 如果数据包是 NEW 状态(如一个新的 TCP SYN 请求),并且没有被其他规则拒绝,iptables 会允许它,conntrack 会自动为它创建一个新的条目。

conntrack-tools 服务

除了命令行工具,还有一个名为 conntrackd 的守护进程,它是 conntrack-tools 包的一部分,它主要用于高可用性集群环境keepalivedpacemaker,它的作用是同步主备防火墙之间的连接跟踪表,确保当一个节点故障时,另一个节点能无缝接管所有活动的连接,避免用户断线。

在单机服务器上,通常只需要安装 conntrack 命令行工具即可。

如何安装

在基于 Debian/Ubuntu 的系统上:

sudo apt-get update
sudo apt-get install conntrack

在基于 RHEL/CentOS/Fedora 的系统上:

sudo yum install conntrack
# 或者对于较新版本
sudo dnf install conntrack
功能 命令 用途
查看帮助 conntrack -h 了解所有可用选项。
全量查看 conntrack -L 查看当前所有连接跟踪条目。
过滤查看 conntrack -L \| grep ...conntrack -L --proto ... --dport ... 快速定位特定连接。
精确删除 conntrack -D <id> 根据连接 ID 安全删除单个连接。
批量删除 conntrack -D --src ...conntrack -F 根据条件删除多个或全部连接(需谨慎)。
手动创建 conntrack -I ... 用于测试或模拟场景。
更新条目 conntrack -U ... 修改现有连接的属性,如超时时间。

掌握 conntrack 命令是 Linux 网络和防火墙排障的必备技能,它能让你直观地看到网络连接的“全貌”,从而快速定位和解决网络问题。

分享:
扫描分享到社交APP
上一篇
下一篇