62·网络进阶

网络连接查看 ss/netstat

ssnetstatsockets

第 62 课 - 网络连接查看 ss/netstat

课程:Linux 系统管理与运维
所属模块:网络
难度:中级
标签:ss, netstat, sockets

学习目标

通过本课程的学习,你将能够:

  1. 理解 ssnetstat 命令的核心作用。
  2. 熟练使用 ssnetstat 查看当前主机的网络连接、监听端口和 Socket 状态。
  3. 掌握如何通过常用选项过滤和筛选特定的连接信息。
  4. 学会将命令输出与系统服务或进程进行关联分析。

核心概念

在运维工作中,了解“现在有哪些程序正在和网络通信”至关重要。这能帮助我们排查端口冲突、分析网络流量、检测异常连接。ssnetstat 就是完成这项任务的“侦察兵”。

Socket (套接字) 是什么? 你可以把它想象成一个“电话插孔”。应用程序通过它来接入网络(IP地址和端口)进行通信。ssnetstat 的主要工作,就是列出系统中所有活跃的 Socket 信息。

netstat vs ss

  • netstat:经典老牌工具,功能强大,在过去几十年里是系统管理员的标配。它依赖于读取 /proc/net 下的文件来获取信息。
  • ss:现代工具,iproute2 软件包的一部分。它通过更直接的内核接口(Netlink socket)获取信息,速度更快,能显示更详细的 TCP 内部状态信息。在现代 Linux 发行版中,ss 正逐渐成为更推荐的工具。

Socket 状态 (ss -t 输出中的 State 列) 理解这些状态是诊断网络问题的关键,比如 CLOSE_WAIT 过多可能意味着程序有连接泄漏。

  • LISTEN:正在监听,等待连接(服务器端)。
  • ESTABLISHED:连接已建立,正在进行数据传输。
  • TIME_WAIT:连接已关闭,但为了处理延迟的数据包,暂且等待一段时间(通常是2分钟)。
  • CLOSE_WAIT:被动关闭方收到了关闭请求,但程序还未执行关闭操作。

代码示例

1. 使用 ss 查看所有 TCP 连接

# -t: 显示 TCP 连接
# -a: 显示所有 sockets(包括监听和非监听)
# -n: 以数字形式显示地址和端口号(不解析服务名称,速度更快)
# -p: 显示使用 socket 的进程信息(需要 root 权限)
ss -tanp

示例输出片段:

State    Recv-Q Send-Q   Local Address:Port    Peer Address:Port  Process
LISTEN   0      128          0.0.0.0:22           0.0.0.0:*      users:(("sshd",pid=857,fd=3))
LISTEN   0      128             [::]:22              [::]:*      users:(("sshd",pid=857,fd=4))
ESTAB    0      0        192.168.1.100:22     192.168.1.101:54638  users:(("sshd",pid=1502,fd=3),("sshd",pid=1498,fd=3))

解读:第一行表示 sshd 服务正在监听所有 IPv4 地址的 22 端口。最后一行表示一个从 192.168.1.101 发起的、已经建立的 SSH 会话。

2. 使用 netstat 查看所有监听端口

# -t: TCP, -u: UDP
# -l: 仅显示监听 sockets
# -n: 数字形式显示
# -p: 显示进程
netstat -tlnp

示例输出片段:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      857/sshd
tcp6       0      0 :::22                   :::*                    LISTEN      857/sshd

解读:输出非常清晰,直接列出了所有正在监听的 TCP 服务。

3. 使用 ss 进行高级过滤

# 查看状态为 ESTABLISHED 的 SSH 连接(目标端口为 22)
ss -tn state established '( dport = :22 or sport = :22 )'

# 查看所有连接到特定 IP(如 10.0.0.1)的连接
ss -tn dst 10.0.0.1

# 结合 `watch` 实时监控网络变化(每秒刷新)
watch -n 1 "ss -tan state established | head -n 20"

实践练习

练习 1:基础查看 运行命令,列出你系统上所有正在监听的 TCP 和 UDP 端口,并说明哪个服务占用了 22 端口。

  • 命令ss -tulnpnetstat -tulnp
  • 预期:你应能看到一个列表,并能识别出 SSH 服务的进程名和 PID。

练习 2:状态分析与过滤 使用 ss 命令,仅列出当前状态为 TIME_WAIT 的 TCP 连接数量。

  • 提示:使用 ss -t state time-wait | wc -l 来计数。
  • 预期:得到一个数字,反映有多少连接正处于关闭后的等待状态。在高并发服务下,这个数字可能会很高。

练习 3:进程关联排查 假设你发现系统上 3306 端口被某个进程占用,但不确定是什么程序。请使用 ssnetstat 命令找出该进程的名称和 PID。

  • 预期输出示例users:(("mysqld",pid=1234,fd=10))

常见错误

  1. 权限不足:使用 -p 选项查看进程信息时,普通用户通常只能看到自己的进程。需要 sudo 或以 root 身份运行才能看到所有进程。

    # 正确:以 root 权限查看所有进程连接
    sudo ss -tanp
    
  2. 混淆输出:初学者容易混淆 Local Address:PortPeer Address:Port。对于 LISTEN 状态的连接,Peer Address 通常是 0.0.0.0:*[::]:*,表示接受来自任何地址的连接。

  3. 忽略 ss 的优势:习惯使用 netstat 后,可能不愿意尝试 ss。但在排查复杂网络问题(如 TCP 拥塞状态)时,ss 提供的额外信息(如 cwnd, rtt)是无价的。

  4. 误读 CLOSE_WAIT:发现大量 CLOSE_WAIT 状态时,应去排查对应的应用程序,而不是网络配置。这通常是应用程序未正确关闭连接(如代码缺陷)导致的。

小结

  • ss 是现代首选:它比 netstat 更快、信息更详细,是当前推荐的网络连接诊断工具。
  • 核心参数要记牢
    • -t (TCP), -u (UDP), -l (监听), -a (所有), -n (数字), -p (进程)。
  • 状态即线索LISTEN, ESTABLISHED, TIME_WAIT, CLOSE_WAIT 等状态直接反映了连接的生命周期,是故障排查的关键切入点。
  • 组合命令增威力:学会用 grep, awk, wcss 自带的过滤语法 (state, dst, src) 对输出进行精细筛选,能极大提升运维效率。
  • 理解其本质:无论是 ss 还是 netstat,它们都是在读取内核维护的 Socket 信息,帮助你可视化主机的网络“会话”清单。

掌握 ss/netstat,你便拥有了洞察主机内部网络活动的第一双“眼睛”。在下一课中,我们将学习如何使用 pingtraceroute 来诊断更广泛的网络连通性问题。

练习编辑器

rust
Loading...

继续学习

完成本课后,建议继续学习下一课「ping 与 traceroute 网络诊断」 以巩固所学知识。