在Linux网络管理和监控领域,conntrack
命令是一个强大的工具,它提供了对netfilter连接跟踪系统的直接访问🔍。这篇文章将深入探讨conntrack
的由来、底层原理、参数意义,以及其常见用法,并对返回结果的每个字段进行详细解释。
1. conntrack的由来📜
conntrack
命令源于Linux的netfilter项目🌐,这是一个内置于Linux内核中的网络包处理模块。Netfilter支持各种网络相关任务,如包过滤(防火墙)🔥、网络地址转换(NAT)🔄和连接跟踪。conntrack
工具最初设计的目的是为了管理和监视netfilter的连接跟踪系统,这个系统记录了所有经过防火墙的网络连接的状态信息。
2. 底层原理🔬
conntrack
工具的底层原理基于netfilter的连接跟踪表📈,该表位于内核空间。每当网络包经过netfilter时,连接跟踪系统会检查包的信息,如源IP地址、目的IP地址、传输层协议(TCP/UDP)、端口等,并据此更新内部的连接跟踪表。这个表包含了所有活跃连接的状态信息,例如是否已建立连接、连接是否已关闭等。
3. 参数解释📋
conntrack
命令支持多种参数,用于执行不同的操作✅:
-L, --list
:列出连接跟踪表中的所有条目。-G, --get
:获取单个连接跟踪条目的信息。-D, --delete
:从连接跟踪表中删除条目。-I, --create
:创建一个新的连接跟踪条目。-U, --update
:更新已存在的连接跟踪条目。-E, --event
:监听连接跟踪事件。
4. conntrack返回结果解释
当你运行conntrack -L
时,会看到类似以下的输出:
tcp 6 431999 ESTABLISHED src=192.168.1.2 dst=93.184.216.34 sport=34567 dport=80 [UNREPLIED] src=93.184.216.34 dst=192.168.1.2 sport=80 dport=34567
每个字段的含义如下📝:
-
协议:表示连接使用的协议,如
tcp
、udp
等。 -
协议号:表示连接使用的协议号,如
6
代表tcp连接、17
代表udp连接等。 -
TCP状态计数器,可以理解为超时时间(Timeout):表示连接条目在连接跟踪表中保持的剩余时间(秒)。当这个时间到达0时,条目将被自动从跟踪表中移除。
- 对于TCP连接,该数字表示连接跟踪条目在内核连接跟踪表中的剩余时间。这个计时器的值会根据连接的状态(如ESTABLISHED、TIME_WAIT等)和配置的超时设置变化。计时器的值为零时,连接跟踪条目会从表中删除。
- 对于非TCP连接(如UDP),因为UDP是无连接的,所以这个计数器代表连接跟踪条目在没有任何新的数据包更新的情况下,还可以在连接跟踪表中存活多长时间。
-
连接状态:描述TCP连接的当前状态。
ESTABLISHED
:已建立连接TIME_WAIT
:等待足够的时间以确保远程TCP接收到连接终止请求的确认)CLOSE_WAIT
:CLOSE_WAIT状态表示对端(远程主机)已经关闭了连接的一半(发送了一个FIN包),并且本地端(你的计算机)已经接收到这个关闭请求,但是本地应用程序还没有关闭(或者说还没有调用close来关闭连接)。简单来说,CLOSE_WAIT状态意味着TCP连接在等待本地应用程序去关闭连接。SYN_SENT
:客户端已发送一个连接请求(SYN包)给服务器,并等待服务器的确认。这表示客户端已经开始了TCP三次握手过程SYN_RECE
:服务器收到客户端的SYN包,并回应一个SYN+ACK包,等待客户端的确认。这个状态表示服务器端已经响应了连接请求,正在进行三次握手的第二步。FIN_WAIT_1
:的一方(通常是客户端)决定关闭连接,并发送一个FIN包给对方,等待对方的确认。这标志着连接关闭过程的开始FIN_WAIT_2
:在发送FIN包并收到ACK包后,连接进入FIN_WAIT_2状态。在这个状态下,连接的关闭一方等待对方的FIN包。CLOSE_WAIT
:当一方收到另一方的FIN包,即对方请求关闭连接时,它会发送一个ACK包作为回应,并进入CLOSE_WAIT状态。在这个状态下,等待本地应用程序关闭连接。CLOSING
:在同时关闭的情况下,当双方几乎同时发送FIN包时,连接会进入CLOSING状态,表示双方都在等待对方的FIN包的确认。LAST_ACK
:当处于CLOSE_WAIT状态的一方发送FIN包,并等待对方的最终ACK包时,连接进入LAST_ACK状态。TIME_WAIT
:在收到对方的FIN包并发送ACK包后,连接进入TIME_WAIT状态。这个状态持续一段时间(2倍的MSL,最大报文生存时间),以确保对方收到了最终的ACK包。这也允许老的重复数据包在网络中消失。CLOSED
:连接完全关闭,两端都释放了连接的资源。
-
源地址(src)、目的地址(dst):发送数据包的主机的IP地址。
src=源IP dst=目的IP
:表示数据包的源和目的IP地址。 -
源端口(sport)、目的端口(dport):发送数据包的主机的端口号。
sport=源端口 dport=目的端口
:表示数据包的源和目的端口号。 -
[UNREPLIED] / [ASSURED]:
[UNREPLIED]
:表示从源到目标的连接请求尚未收到回复。[ASSURED]
:表示连接已经被确认,不会因为短时间内没有数据包而被清除。
-
Mark(标记):
mark
字段用于表示特定的连接跟踪条目被打上的标记(或称为标签)- 这个标记是一个整数值,通常由防火墙规则(如iptables)设置,用于对特定的数据包或连接进行分类或执行特定的处理逻辑。
- 可能的取值:
mark
的取值范围是从0
到4294967295
(即2^32-1),其中0
通常表示未被标记的连接。非零的值则根据实际的防火墙规则和策略而定,不同的值可以代表不同的分类或处理逻辑。例如,在某些配置中,mark
可以用来区分经过VPN的流量、被特定规
-
Use(使用):
use
字段表示当前有多少个内核组件正在引用这个连接跟踪条目。简而言之,它表明这个连接跟踪条目的“使用度”或“引用计数”。- 可能的取值:
use
的取值是一个正整数,起始值至少为1
,表示至少有一个引用(即连接跟踪本身)。如果有多个内核组件因为某些原因(如特定的路由或防火墙规则)同时需要跟踪这个连接,use
的值会相应增加。一般而言,大多数情况下use
的值会比较低,除非系统配置导致多个组件需要引用同一个连接跟踪条目。
- 可能的取值:
4.1. 例一:查看所有TCP连接
命令:conntrack -L -p tcp
示例输出:
tcp 6 431999 ESTABLISHED src=192.168.1.100 dst=192.168.1.1 sport=34567 dport=22 [ASSURED] mark=0 use=1
解释:
- 这是一个TCP连接,连接状态为
ESTABLISHED
。 - 连接从源地址
192.168.1.100
的34567
端口到目的地址192.168.1.1
的22
端口。 [ASSURED]
表示连接已经被确认。mark=0 use=1
提供了额外的连接标记和使用信息。
4.2. 例二:查看所有UDP连接
命令:conntrack -L -p udp
示例输出:
udp 17 28 src=192.168.1.100 dst=192.168.1.255 sport=137 dport=137 [UNREPLIED] src=192.168.1.255 dst=192.168.1.100 sport=137 dport=137 mark=0 use=1
解释:
- 这是一个UDP连接,通常用于网络广播。
- 连接尝试从
192.168.1.100
到192.168.1.255
,这是一个局域网广播地址。 [UNREPLIED]
标志表示广播请求尚未收到回复。
4.3. 例三:监听连接跟踪事件
命令:conntrack -E
示例输出:实时显示连接跟踪事件,如新建(NEW)、更新(UPDATE)和销毁(DESTROY)事件。
root@linux-study:~# conntrack -E|head -n 20
[DESTROY] tcp 6 src=192.168.201.109 dst=182.75.23.156 sport=40175 dport=443 src=182.75.23.156 dst=172.30.3.222 sport=443 dport=40175 [ASSURED]
[NEW] tcp 6 120 SYN_SENT src=192.168.201.109 dst=182.75.23.156 sport=40175 dport=443 [UNREPLIED] src=182.75.23.156 dst=172.30.3.222 sport=443 dport=40175
[UPDATE] tcp 6 60 SYN_RECV src=192.168.201.109 dst=182.75.23.156 sport=40175 dport=443 src=182.75.23.156 dst=172.30.3.222 sport=443 dport=40175
[UPDATE] tcp 6 432000 ESTABLISHED src=192.168.201.109 dst=182.75.23.156 sport=40175 dport=443 src=182.75.23.156 dst=172.30.3.222 sport=443 dport=40175 [ASSURED]
[NEW] tcp 6 120 SYN_SENT src=192.168.201.109 dst=182.75.23.156 sport=24526 dport=443 [UNREPLIED] src=182.75.23.156 dst=172.30.3.222 sport=443 dport=24526
[UPDATE] tcp 6 60 SYN_RECV src=192.168.201.109 dst=182.75.23.156 sport=24526 dport=443 src=182.75.23.156 dst=172.30.3.222 sport=443 dport=24526
[UPDATE] tcp 6 432000 ESTABLISHED src=192.168.201.109 dst=182.75.23.156 sport=24526 dport=443 src=182.75.23.156 dst=172.30.3.222 sport=443 dport=24526 [ASSURED]
[NEW] tcp 6 120 SYN_SENT src=192.168.201.110 dst=182.75.23.156 sport=6069 dport=443 [UNREPLIED] src=182.75.23.156 dst=172.30.3.222 sport=443 dport=6069
[UPDATE] tcp 6 60 SYN_RECV src=192.168.201.110 dst=182.75.23.156 sport=6069 dport=443 src=182.75.23.156 dst=172.30.3.222 sport=443 dport=6069
[UPDATE] tcp 6 432000 ESTABLISHED src=192.168.201.110 dst=182.75.23.156 sport=6069 dport=443 src=182.75.23.156 dst=172.30.3.222 sport=443 dport=6069 [ASSURED]
[UPDATE] tcp 6 120 FIN_WAIT src=192.168.201.109 dst=182.75.23.156 sport=24526 dport=443 src=182.75.23.156 dst=172.30.3.222 sport=443 dport=24526 [ASSURED]
[UPDATE] tcp 6 60 CLOSE_WAIT src=192.168.201.109 dst=182.75.23.156 sport=24526 dport=443 src=182.75.23.156 dst=172.30.3.222 sport=443 dport=24526 [ASSURED]
[UPDATE] tcp 6 30 LAST_ACK src=192.168.201.109 dst=182.75.23.156 sport=24526 dport=443 src=182.75.23.156 dst=172.30.3.222 sport=443 dport=24526 [ASSURED]
[UPDATE] tcp 6 120 TIME_WAIT src=192.168.201.109 dst=182.75.23.156 sport=24526 dport=443 src=182.75.23.156 dst=172.30.3.222 sport=443 dport=24526 [ASSURED]
[NEW] tcp 6 120 SYN_SENT src=192.168.201.109 dst=182.75.23.156 sport=7378 dport=443 [UNREPLIED] src=182.75.23.156 dst=172.30.3.222 sport=443 dport=7378
[UPDATE] tcp 6 60 SYN_RECV src=192.168.201.109 dst=182.75.23.156 sport=7378 dport=443 src=182.75.23.156 dst=172.30.3.222 sport=443 dport=7378
[UPDATE] tcp 6 432000 ESTABLISHED src=192.168.201.109 dst=182.75.23.156 sport=7378 dport=443 src=182.75.23.156 dst=172.30.3.222 sport=443 dport=7378 [ASSURED]
[UPDATE] tcp
解释:
- 实时监控连接状态变化,有助于诊断网络问题和分析流量模式。
4.4. 例四:解释协议号和TCP状态计数器
考虑以下conntrack
命令的输出示例:
tcp 6 431999 ESTABLISHED src=192.168.1.100 dst=93.184.216.34 sport=34567 dport=80 [ASSURED] mark=0 use=1
udp 17 170 src=192.168.1.100 dst=192.168.1.255 sport=137 dport=137 [UNREPLIED] src=192.168.1.255 dst=192.168.1.100 sport=137 dport=137 mark=0 use=1
在这个示例中:
- 对于TCP连接,
6
是TCP的协议号,431999
是剩余的计时器值(单位是秒),表示该TCP连接跟踪条目将在大约431999秒后从连接跟踪表中移除,除非有新的数据包更新此连接状态。 - 对于UDP连接,
17
是UDP的协议号,170
是剩余的计时器值,表示该UDP连接跟踪条目将在170秒后从连接跟踪表中移除,如果没有新的数据包到达更新状态。
5. 常见用法🛠️
5.1. 列出所有连接
命令:conntrack -L
root@linux-study:~# conntrack -L|head
tcp 6 75 TIME_WAIT src=192.168.201.108 dst=182.75.23.156 sport=12753 dport=443 src=182.75.23.156 dst=172.30.3.222 sport=443 dport=12753 [ASSURED] mark=0 use=1
tcp 6 29 TIME_WAIT src=192.168.201.104 dst=182.75.23.156 sport=22689 dport=443 src=182.75.23.156 dst=172.30.3.222 sport