第 62 课 - 网络连接查看 ss/netstat
课程:Linux 系统管理与运维
所属模块:网络
难度:中级
标签:ss, netstat, sockets
学习目标
通过本课程的学习,你将能够:
- 理解
ss和netstat命令的核心作用。 - 熟练使用
ss和netstat查看当前主机的网络连接、监听端口和 Socket 状态。 - 掌握如何通过常用选项过滤和筛选特定的连接信息。
- 学会将命令输出与系统服务或进程进行关联分析。
核心概念
在运维工作中,了解“现在有哪些程序正在和网络通信”至关重要。这能帮助我们排查端口冲突、分析网络流量、检测异常连接。ss 和 netstat 就是完成这项任务的“侦察兵”。
Socket (套接字) 是什么?
你可以把它想象成一个“电话插孔”。应用程序通过它来接入网络(IP地址和端口)进行通信。ss 和 netstat 的主要工作,就是列出系统中所有活跃的 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 -tulnp或netstat -tulnp - 预期:你应能看到一个列表,并能识别出 SSH 服务的进程名和 PID。
练习 2:状态分析与过滤
使用 ss 命令,仅列出当前状态为 TIME_WAIT 的 TCP 连接数量。
- 提示:使用
ss -t state time-wait | wc -l来计数。 - 预期:得到一个数字,反映有多少连接正处于关闭后的等待状态。在高并发服务下,这个数字可能会很高。
练习 3:进程关联排查
假设你发现系统上 3306 端口被某个进程占用,但不确定是什么程序。请使用 ss 或 netstat 命令找出该进程的名称和 PID。
- 预期输出示例:
users:(("mysqld",pid=1234,fd=10))
常见错误
-
权限不足:使用
-p选项查看进程信息时,普通用户通常只能看到自己的进程。需要sudo或以 root 身份运行才能看到所有进程。# 正确:以 root 权限查看所有进程连接 sudo ss -tanp -
混淆输出:初学者容易混淆
Local Address:Port和Peer Address:Port。对于LISTEN状态的连接,Peer Address通常是0.0.0.0:*或[::]:*,表示接受来自任何地址的连接。 -
忽略
ss的优势:习惯使用netstat后,可能不愿意尝试ss。但在排查复杂网络问题(如 TCP 拥塞状态)时,ss提供的额外信息(如cwnd,rtt)是无价的。 -
误读
CLOSE_WAIT:发现大量CLOSE_WAIT状态时,应去排查对应的应用程序,而不是网络配置。这通常是应用程序未正确关闭连接(如代码缺陷)导致的。
小结
ss是现代首选:它比netstat更快、信息更详细,是当前推荐的网络连接诊断工具。- 核心参数要记牢:
-t(TCP),-u(UDP),-l(监听),-a(所有),-n(数字),-p(进程)。
- 状态即线索:
LISTEN,ESTABLISHED,TIME_WAIT,CLOSE_WAIT等状态直接反映了连接的生命周期,是故障排查的关键切入点。 - 组合命令增威力:学会用
grep,awk,wc或ss自带的过滤语法 (state,dst,src) 对输出进行精细筛选,能极大提升运维效率。 - 理解其本质:无论是
ss还是netstat,它们都是在读取内核维护的 Socket 信息,帮助你可视化主机的网络“会话”清单。
掌握 ss/netstat,你便拥有了洞察主机内部网络活动的第一双“眼睛”。在下一课中,我们将学习如何使用 ping 和 traceroute 来诊断更广泛的网络连通性问题。