229. netstat

netstat 是一个强大的命令行工具,用于显示网络连接、路由表、接口统计信息等。对于监控连接状态、端口使用情况、查找可疑连接以及查看累积的流量统计非常有用。如果要显示实时的网络带宽使用率,如每秒多少MB,需要使用 iftop, nload等工具。

在 Linux 上,ss (Socket Statistics) 命令是 netstat 的更现代、更快速的替代品,语法类似,在较新的系统中优先考虑使用 ss。

以下是如何使用 netstat 来监控和分析网络活动的基础命令:

  1. 查看所有活动的网络连接 (TCP, UDP, 监听端口):

    1
    netstat -a

    -a:显示所有活动的连接和正在监听的端口。

    这会列出大量的信息,通常需要配合过滤(如 grep)来查看特定内容。

  2. 仅查看 TCP 连接:

    1
    netstat -at

    -t:仅显示 TCP 连接。

  3. 仅查看 UDP 连接:

    1
    netstat -au

    -u:仅显示 UDP 连接。

  4. 持续/动态刷新输出

    1
    netstat -c

    每隔一秒刷新一次输出。可以与其他选项组合使用,例如 netstat -atnpc 来持续刷新 TCP 连接并显示进程信息。

  5. 显示网络接口统计信息 (累积的发送/接收数据包和字节)

    1
    netstat -i

    要查看更详细的统计(包括字节数):

    1
    netstat -ie

    这里显示的 RX bytes (接收字节) 和 TX bytes (发送字节) 是该接口自上次启动或计数器重置以来的累积总量,不是实时速率。

  6. 显示内核路由表

    1
    netstat -r
  7. 显示网络协议统计信息

    1
    netstat -s

    显示各种网络协议(IP, ICMP, TCP, UDP 等)的详细统计信息(如发送/接收的数据包、错误、丢弃等)。对于诊断特定协议问题非常有用。

最后介绍几个实际应用场景:

  1. 找出哪个进程在使用特定连接或端口?

    1
    sudo netstat -tulnp

    -l:仅显示处于 LISTEN监听状态 的套接字。

    -n:以数字形式显示地址和端口号(不进行 DNS 解析和端口到服务名的转换)。强烈建议使用,因为它能显著加快输出速度并避免解析带来的混淆。

    -p:显示拥有该连接的进程的 PID 和程序名称。

    分析输出中的 PID/Program name 列,你就能知道哪个程序在监听哪个端口或建立了哪个连接。

  2. 查看所有活动的 TCP 连接,并实时刷新。

    1
    netstat -atnpc

    观察连接的建立(ESTABLISHED)、关闭过程(TIME_WAIT, CLOSE_WAIT)、是否有大量异常连接。

  3. 查找特定 IP 地址或端口的连接。

    1
    netstat -anp | grep '192.168.1.100'
    1
    netstat -anp | grep ':80'

    使用 grep 过滤出你关心的 IP 或端口。

  4. 检查哪个进程在使用特定端口 (如 8080)。

    1
    sudo netstat -tulnp | grep ':8080'
  5. 监控接口 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:连接正在关闭过程中。