Linux中的netstat命令介绍以及使用


在 Linux 系统中,netstat 是一个非常常用的网络工具,用于查看当前系统的网络状态和活动。它可以帮助管理员监控网络连接、路由表、接口状态、以及网络协议的统计信息。下面我会深入浅出地介绍 netstat 命令的使用,并附上详细的参数表格。

netstat 简介

netstat 全称为 “network statistics” (网络统计),是一个强大的命令行工具。无论是调试网络问题,还是监控网络连接状态,netstat 都可以提供有用的信息。例如,当某个端口突然出现连接中断时,可以使用 netstat 来查看网络连接的当前状态,找出问题的源头。

安装 netstat 命令

在 CentOS 上,netstat 命令不再默认安装在系统中。你可以通过安装 net-tools 软件包来获取 netstat 命令。以下是安装步骤:

  1. 更新系统的包索引:

    sudo yum update
    
  2. 安装 net-tools 软件包:

    sudo yum install net-tools
    
  3. 安装完成后,你可以通过以下命令验证 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-QSend-Q

  • Recv-QSend-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 状态。

具体分析:

  1. 行 3 (sonar:44546 -> 10.255.98.177:http,状态:SYN_SENT):

    • 本地主机 sonar 的端口 44546 正在尝试与远程主机 10.255.98.177 建立 HTTP 连接,但连接请求尚未被对方确认。SYN_SENT 状态意味着客户端发送了连接请求 (SYN),但未收到对方的回应。这种状态下可能是远程服务器没有响应,或者网络存在问题。
  2. 行 4 (localhost:48916 -> localhost:distinct,状态:ESTABLISHED):

    • 本地系统上两个进程正在通信,连接已经建立并处于 ESTABLISHED 状态,表示通信正常。localhost:distinct 可能是本地运行的一个服务。
  3. 行 5 (sonar:44540 -> 10.255.98.177:http,状态:SYN_SENT):

    • 同样是与远程主机 10.255.98.177 建立 HTTP 连接的尝试,当前处于 SYN_SENT 状态,说明连接请求未完成。
  4. 行 6 (sonar:45154 -> 10.255.98.220:http,状态:ESTABLISHED):

    • 本地主机 sonar 的端口 45154 已经与远程主机 10.255.98.220 的 HTTP 端口建立了连接,处于 ESTABLISHED 状态,通信正常。
  5. 行 7 (sonar:44544 -> 10.255.98.177:http,状态:SYN_SENT):

    • 又一次与 10.255.98.177 建立 HTTP 连接的尝试,仍然处于 SYN_SENT 状态。可以推测 10.255.98.177 可能没有响应这些连接请求。
  6. 行 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 实际应用场景

  1. 查找监听的端口:服务器有时会出现某些端口被意外占用的情况。可以使用 netstat -tuln 来快速查找所有正在监听的 TCP 和 UDP 端口,并以数字形式显示。

  2. 查找进程的网络连接:当怀疑某个进程消耗大量网络资源时,可以使用 netstat -p 查看哪些进程占用了网络连接,并找到对应的进程 PID。

  3. 查看实时网络连接:如果需要动态监控网络连接,可以使用 netstat -c,它会每秒刷新网络连接状态。

  4. 查看网络接口的流量:使用 netstat -i 来监控网络接口的流量情况,尤其是在调试网络性能问题时。

替代工具 ss

需要注意的是,虽然 netstat 仍然广泛使用,但在某些现代 Linux 发行版中,它已经被推荐使用 ss 命令替代。ss 命令的功能与 netstat 类似,但性能更好,尤其在处理大量连接时。

例如:

ss -tuln

该命令与 netstat -tuln 类似,用于显示所有监听的 TCP 和 UDP 连接,但速度更快。

总结

netstat 是 Linux 下非常强大的网络工具,能够帮助用户轻松查看网络连接、监听端口、路由表和网络协议统计信息。通过灵活使用各种参数,netstat 能够在网络故障排查和日常监控中提供极大的帮助。尽管 netstat 逐渐被 ss 替代,但它仍然是许多管理员处理网络问题时的首选工具。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XMYX-0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值