229. netstat
netstat 是一个强大的命令行工具,用于显示网络连接、路由表、接口统计信息等。对于监控连接状态、端口使用情况、查找可疑连接以及查看累积的流量统计非常有用。如果要显示实时的网络带宽使用率,如每秒多少MB,需要使用 iftop, nload等工具。
在 Linux 上,ss (Socket Statistics) 命令是 netstat 的更现代、更快速的替代品,语法类似,在较新的系统中优先考虑使用 ss。
以下是如何使用 netstat 来监控和分析网络活动的基础命令:
查看所有活动的网络连接 (TCP, UDP, 监听端口):
1
netstat -a
-a:显示所有活动的连接和正在监听的端口。
这会列出大量的信息,通常需要配合过滤(如 grep)来查看特定内容。
仅查看 TCP 连接:
1
netstat -at
-t:仅显示 TCP 连接。
仅查看 UDP 连接:
1
netstat -au
-u:仅显示 UDP 连接。
持续/动态刷新输出
1
netstat -c
每隔一秒刷新一次输出。可以与其他选项组合使用,例如 netstat -atnpc 来持续刷新 TCP 连接并显示进程信息。
显示网络接口统计信息 (累积的发送/接收数据包和字节)
1
netstat -i
要查看更详细的统计(包括字节数):
1
netstat -ie
这里显示的 RX bytes (接收字节) 和 TX bytes (发送字节) 是该接口自上次启动或计数器重置以来的累积总量,不是实时速率。
显示内核路由表
1
netstat -r
显示网络协议统计信息
1
netstat -s
显示各种网络协议(IP, ICMP, TCP, UDP 等)的详细统计信息(如发送/接收的数据包、错误、丢弃等)。对于诊断特定协议问题非常有用。
最后介绍几个实际应用场景:
找出哪个进程在使用特定连接或端口?
1
sudo netstat -tulnp
-l:仅显示处于 LISTEN监听状态 的套接字。
-n:以数字形式显示地址和端口号(不进行 DNS 解析和端口到服务名的转换)。强烈建议使用,因为它能显著加快输出速度并避免解析带来的混淆。
-p:显示拥有该连接的进程的 PID 和程序名称。
分析输出中的 PID/Program name 列,你就能知道哪个程序在监听哪个端口或建立了哪个连接。
查看所有活动的 TCP 连接,并实时刷新。
1
netstat -atnpc
观察连接的建立(ESTABLISHED)、关闭过程(TIME_WAIT, CLOSE_WAIT)、是否有大量异常连接。
查找特定 IP 地址或端口的连接。
1
netstat -anp | grep '192.168.1.100'
1
netstat -anp | grep ':80'
使用 grep 过滤出你关心的 IP 或端口。
检查哪个进程在使用特定端口 (如 8080)。
1
sudo netstat -tulnp | grep ':8080'
监控接口 eth0 的累积流量统计
1
netstat -ie | grep -A1 eth0
记录下 RX bytes 和 TX bytes,过一段时间再运行一次,计算差值即可估算这段时间内的总流量。
TCP 的几种状态
LISTEN:服务器正在等待连接。
ESTABLISHED:连接已建立,正在进行数据传输。
SYN_SENT:客户端尝试发起连接。
SYN_RECV:服务器收到连接请求 (SYN)。
TIME_WAIT:连接已关闭,等待确保远程端收到确认。短暂状态,大量出现可能表示高连接率。
CLOSE_WAIT:远程端已关闭连接,本地应用程序尚未关闭套接字。持续出现可能表示应用程序 bug。
FIN_WAIT1/2:连接正在关闭过程中。