文章目录
在 Linux 系统中,netstat
是一个非常常用的网络工具,用于查看当前系统的网络状态和活动。它可以帮助管理员监控网络连接、路由表、接口状态、以及网络协议的统计信息。下面我会深入浅出地介绍 netstat
命令的使用,并附上详细的参数表格。
netstat
简介
netstat
全称为 “network statistics” (网络统计),是一个强大的命令行工具。无论是调试网络问题,还是监控网络连接状态,netstat
都可以提供有用的信息。例如,当某个端口突然出现连接中断时,可以使用 netstat
来查看网络连接的当前状态,找出问题的源头。
安装 netstat
命令
在 CentOS 上,netstat
命令不再默认安装在系统中。你可以通过安装 net-tools
软件包来获取 netstat
命令。以下是安装步骤:
-
更新系统的包索引:
sudo yum update
-
安装
net-tools
软件包:sudo yum install net-tools
-
安装完成后,你可以通过以下命令验证
netstat
是否安装成功:netstat -version
netstat
的基本用法
netstat
的常见使用方法是:
netstat [选项]
netstat
结果分析
[root@sonar ~]# netstat | head
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 1 sonar:44546 10.255.98.177:http SYN_SENT
tcp 0 0 localhost:48916 localhost:distinct ESTABLISHED
tcp 0 1 sonar:44540 10.255.98.177:http SYN_SENT
tcp 0 1 sonar:44542 10.255.98.177:http SYN_SENT
tcp 0 0 sonar:45154 10.255.98.220:http ESTABLISHED
tcp 0 1 sonar:44544 10.255.98.177:http SYN_SENT
tcp 0 1 sonar:44538 10.255.98.177:http SYN_SENT
tcp 0 36 sonar:ssh 10.255.50.26:54646 ESTABLISHED
[root@sonar ~]#
Proto
- 表示网络协议类型,所有行都是
tcp
,表明这些连接使用了 TCP 协议。
Recv-Q
和 Send-Q
Recv-Q
和Send-Q
分别代表接收和发送队列的大小。它们的数值一般应该为 0。- 如果
Send-Q
非 0,通常表示发送的数据还未完全发送出去,可能存在网络延迟或阻塞。 Recv-Q
非 0 则表示接收端还未读取到所有数据。
- 如果
Local Address
- 本地地址,表示连接的本地 IP 和端口。比如
sonar:44546
表示本地 IP 为sonar
,端口号为44546
。
Foreign Address
- 外部地址,表示与本地连接的远程主机的 IP 和端口。例如
10.255.98.177:http
表示远程主机的 IP 地址为10.255.98.177
,远程端口为 HTTP 端口(80)。
State
状态
TCP 状态表格:
状态 | 描述 |
---|---|
LISTEN | 侦听来自远方的 TCP 连接请求 |
SYN-SENT | 发送连接请求后等待匹配的连接请求,未得到响应 |
SYN-RECEIVED | 收到和发送连接请求后等待确认,未完成连接 |
ESTABLISHED | 表示连接已经建立,数据可以传输 |
FIN-WAIT-1 | 本地主机等待远程主机的连接中断请求或确认 |
FIN-WAIT-2 | 本地主机已经发送关闭请求,等待远程主机的连接中断请求 |
CLOSE-WAIT | 本地主机等待应用程序的关闭请求,远程主机已经关闭连接 |
CLOSING | 双方几乎同时关闭连接,等待确认 |
LAST-ACK | 本地主机等待对方的关闭确认,表明关闭请求已发送,但还未完成 |
TIME-WAIT | 本地主机主动关闭连接,并等待一段时间,确保远程主机收到确认 |
CLOSED | 表示连接已经关闭,无活动连接 |
1. LISTEN
- 定义:系统正在监听某个 TCP 端口,等待外部连接请求。此状态出现在服务器端进程上,如 HTTP、SSH 等服务。
- 应用场景:这是服务器在等待客户端连接时的状态,表明端口可以接受新的连接。
- 问题排查:如果某个端口长期没有新的连接,可能需要检查服务是否正常工作,或防火墙配置是否正确。
2. SYN-SENT
- 定义:客户端发送了 TCP 连接请求(SYN),正在等待服务器的响应。如果存在大量的
SYN-SENT
状态,说明许多连接请求还未得到对方的响应。 - 问题排查:这可能是由于网络延迟、对方服务器无响应,或者遭受了 SYN Flood 攻击(一种通过不断发送
SYN
包来消耗服务器资源的攻击)。 - 应对措施:检查网络是否正常、服务器响应是否正常,以及是否有异常的大量连接请求。必要时可以调整防火墙规则或使用防御工具来抵御 SYN Flood 攻击。
3. SYN-RECEIVED
- 定义:服务器收到了客户端的连接请求(SYN),并且已经发送了响应(SYN-ACK),等待客户端确认连接完成。如果有大量此状态,可能意味着正在遭受 SYN Flood 攻击。
- 问题排查:如果网络中存在大量的
SYN-RECEIVED
状态且连接无法完成,可能需要检查是否有恶意流量涌入网络,导致未完成的连接堆积。 - 应对措施:考虑配置防火墙、启用 SYN cookies 或其他网络防护措施。
4. ESTABLISHED
- 定义:表示 TCP 连接已经成功建立并正在传输数据。这是正常通信中的连接状态。
- 应用场景:该状态表示两个主机之间的通信通道已经打开,数据可以自由传输。
5. FIN-WAIT-1
- 定义:本地一方主动关闭连接并发送
FIN
包,等待远程一方的确认或远程也发来FIN
。 - 问题排查:这个状态通常很短暂,但如果长时间处于该状态,可能意味着远程主机没有及时响应,或者存在网络问题。
6. FIN-WAIT-2
- 定义:本地主机已收到远程主机的
FIN
包,正在等待对方完成连接中断。这是关闭连接的第二阶段。 - 问题排查:如果此状态持续很久,可能是远程主机的关闭操作未能完成,或者网络出现了异常。
7. CLOSE-WAIT
- 定义:表示远程主机已经关闭连接,但本地主机尚未关闭。这时本地应用应该发起关闭操作。
- 问题排查:如果
CLOSE-WAIT
状态大量出现,可能是应用程序没有正确处理关闭请求,导致连接无法完全关闭。
8. CLOSING
- 定义:表示双方几乎同时发送
FIN
包,且本地仍在等待对方对关闭请求的确认。 - 问题排查:此状态很少见,若经常出现,说明网络存在问题或某些连接没有正常关闭。
9. LAST-ACK
- 定义:本地主机已经发送了关闭请求(FIN),正在等待远程主机的确认。如果有大量此状态,可能意味着系统资源被耗尽或遭遇了攻击。
- 问题排查:若系统中有大量
LAST-ACK
状态,可能表明系统存在异常连接或攻击行为,特别是遭受 TCP FIN Flood 攻击。 - 应对措施:检查连接来源,监控异常流量,增强防火墙规则。
10. TIME-WAIT
- 定义:本地一方主动关闭连接,并在等待一段时间以确保对方收到了关闭确认。这个状态是为了防止旧连接数据干扰新连接。
- 问题排查:
TIME-WAIT
是正常的,但如果数量过多,可能表明系统处理的短连接过于频繁,服务器资源耗尽。 - 应对措施:可以通过调整内核参数(如减少
TIME-WAIT
的持续时间)来优化系统的连接处理能力。
11. CLOSED
- 定义:表示连接已经关闭,不存在任何活动状态。这是连接的初始和最终状态。
- 应用场景:当所有连接处理完毕后,连接进入
CLOSED
状态。
具体分析:
-
行 3 (
sonar:44546
->10.255.98.177:http
,状态:SYN_SENT
):- 本地主机
sonar
的端口44546
正在尝试与远程主机10.255.98.177
建立 HTTP 连接,但连接请求尚未被对方确认。SYN_SENT
状态意味着客户端发送了连接请求 (SYN),但未收到对方的回应。这种状态下可能是远程服务器没有响应,或者网络存在问题。
- 本地主机
-
行 4 (
localhost:48916
->localhost:distinct
,状态:ESTABLISHED
):- 本地系统上两个进程正在通信,连接已经建立并处于
ESTABLISHED
状态,表示通信正常。localhost:distinct
可能是本地运行的一个服务。
- 本地系统上两个进程正在通信,连接已经建立并处于
-
行 5 (
sonar:44540
->10.255.98.177:http
,状态:SYN_SENT
):- 同样是与远程主机
10.255.98.177
建立 HTTP 连接的尝试,当前处于SYN_SENT
状态,说明连接请求未完成。
- 同样是与远程主机
-
行 6 (
sonar:45154
->10.255.98.220:http
,状态:ESTABLISHED
):- 本地主机
sonar
的端口45154
已经与远程主机10.255.98.220
的 HTTP 端口建立了连接,处于ESTABLISHED
状态,通信正常。
- 本地主机
-
行 7 (
sonar:44544
->10.255.98.177:http
,状态:SYN_SENT
):- 又一次与
10.255.98.177
建立 HTTP 连接的尝试,仍然处于SYN_SENT
状态。可以推测10.255.98.177
可能没有响应这些连接请求。
- 又一次与
-
行 8 (
sonar:ssh
->10.255.50.26:54646
,状态:ESTABLISHED
):- 本地主机的
ssh
服务与远程主机10.255.50.26
的端口54646
建立了 SSH 连接,状态为ESTABLISHED
,说明 SSH 连接已经成功建立并处于活跃状态。
- 本地主机的
netstat
常用选项解析
查看所有的网络连接
netstat -a
该命令显示所有的网络连接和监听的端口,包括 TCP 和 UDP 连接。
查看所有 TCP 连接
netstat -t
仅显示 TCP 协议的连接。
查看所有 UDP 连接
netstat -u
仅显示 UDP 协议的连接。
查看监听状态的端口
netstat -l
该命令只显示当前处于监听状态的连接。
查看网络接口统计信息
netstat -i
此选项将显示各个网络接口的统计数据,例如接收和发送的数据包数量。
显示路由表
netstat -r
该选项用于显示内核的路由表信息。
显示网络接口的详细信息
netstat -ie
-ie
选项会显示每个网络接口的更多详细信息,包括接口的 MTU(最大传输单元)等。
显示连接状态和 PID
netstat -p
-p
选项会将连接对应的进程 ID 和进程名称一并显示出来,这在查找特定进程的网络连接时非常有用。
显示网络协议的统计信息
netstat -s
此选项将显示各种网络协议的统计信息,如 TCP、UDP、ICMP 等的统计情况。
netstat
参数表格
以下是 netstat
命令中常用参数的详细解释:
参数 | 描述 | 示例 |
---|---|---|
-a | 显示所有的网络连接和监听端口 | netstat -a |
-t | 仅显示 TCP 连接 | netstat -t |
-u | 仅显示 UDP 连接 | netstat -u |
-l | 仅显示监听状态的端口 | netstat -l |
-p | 显示连接对应的 PID 和进程名称 | netstat -p |
-r | 显示内核路由表 | netstat -r |
-i | 显示网络接口的统计信息 | netstat -i |
-e | 显示网络接口的详细信息 | netstat -ie |
-s | 显示各类网络协议的统计信息 | netstat -s |
-c | 持续打印网络状态,每秒刷新一次 | netstat -c |
-n | 以数字形式显示地址和端口号 | netstat -n |
-o | 显示计时器 | netstat -o |
-g | 显示组播组信息 | netstat -g |
netstat
实际应用场景
-
查找监听的端口:服务器有时会出现某些端口被意外占用的情况。可以使用
netstat -tuln
来快速查找所有正在监听的 TCP 和 UDP 端口,并以数字形式显示。 -
查找进程的网络连接:当怀疑某个进程消耗大量网络资源时,可以使用
netstat -p
查看哪些进程占用了网络连接,并找到对应的进程 PID。 -
查看实时网络连接:如果需要动态监控网络连接,可以使用
netstat -c
,它会每秒刷新网络连接状态。 -
查看网络接口的流量:使用
netstat -i
来监控网络接口的流量情况,尤其是在调试网络性能问题时。
替代工具 ss
需要注意的是,虽然 netstat
仍然广泛使用,但在某些现代 Linux 发行版中,它已经被推荐使用 ss
命令替代。ss
命令的功能与 netstat
类似,但性能更好,尤其在处理大量连接时。
例如:
ss -tuln
该命令与 netstat -tuln
类似,用于显示所有监听的 TCP 和 UDP 连接,但速度更快。
总结
netstat
是 Linux 下非常强大的网络工具,能够帮助用户轻松查看网络连接、监听端口、路由表和网络协议统计信息。通过灵活使用各种参数,netstat
能够在网络故障排查和日常监控中提供极大的帮助。尽管 netstat
逐渐被 ss
替代,但它仍然是许多管理员处理网络问题时的首选工具。