告别netstat!现代网络诊断利器ss命令完全指南

2026/01/06 linux 共 2823 字,约 9 分钟

告别netstat!现代网络诊断利器ss命令完全指南

在日常的Linux系统运维和网络问题排查中,查看网络连接、监听端口、套接字状态是必不可少的操作。过去,我们习惯使用经典的 netstat 命令。然而,随着技术的发展,一个更高效、更强大的替代品已经出现——它就是 ss(Socket Statistics)。本文将带你全面掌握 ss 命令,让你在运维工作中如虎添翼。

为什么选择ss而不是netstat?

在深入细节之前,我们先了解一下为什么要“弃用”netstat。

  1. 性能netstat 通过读取 /proc/net/tcp 等伪文件来获取信息,这个过程相对较慢,尤其是在连接数巨大(上万)时。而 ss 直接从内核空间获取套接字信息,速度极快。
  2. 信息更丰富ss 能显示比 netstat 更多的TCP状态信息(如send-Q, recv-Q的精确值)和更详细的协议选项。
  3. 更现代的过滤语法ss 提供了强大且直观的过滤功能,可以轻松筛选出你关心的连接。
  4. netstat已过时:在许多现代Linux发行版中,netstat 已被标记为“legacy”,并建议用户迁移到 ssip 命令。

简而言之,ss 是更快、更强、更受推荐的工具。

ss命令基础语法与常用选项

ss 命令的基本格式如下:

ss [选项] [过滤表达式]

让我们从最常用的选项开始。

1. 显示所有连接(类似 netstat -a)

ss -a

这将列出所有类型的套接字,包括监听的和已建立的。

2. 按协议类型查看

  • 查看TCP连接ss -t
  • 查看UDP连接ss -u
  • 查看UNIX域套接字ss -x

通常我们会组合使用 -a 选项来查看所有状态:

ss -t -a    # 查看所有TCP套接字
ss -u -a    # 查看所有UDP套接字

一个更常见的简写是 -tua

ss -tua     # 查看所有TCP和UDP套接字

3. 显示监听端口(类似 netstat -l)

ss -l

同样,可以组合使用:

ss -tln     # 查看所有TCP监听端口,并以数字形式显示(-n)
ss -uln     # 查看所有UDP监听端口,并以数字形式显示

这里 -n 选项阻止了端口到服务名的解析(如 22 -> ssh),在排查问题时可以更快地看到真实端口号。

4. 显示进程信息(类似 netstat -p)

这是一个非常实用的功能,可以查看是哪个进程占用了端口。

ss -tlnp

注意:查看进程信息通常需要 sudo 权限。 输出中会包含 PID/Program name 列,例如:

State      Recv-Q Send-Q Local Address:Port   Peer Address:Port
LISTEN     0      128          *:22                *:*        users:(("sshd",pid=1234,fd=3))

这清楚地告诉我们,22端口由PID为1234的sshd进程监听。

5. 显示详细的套接字信息(-e)

-e 选项可以显示套接字的额外详细信息,如用户ID(uid)、进程关联的inode等。

ss -t -e

进阶:强大的过滤功能

这是 ss 命令的精华所在。你可以使用过滤表达式精准定位你关心的连接。

1. 状态过滤

只显示处于特定TCP状态的连接,例如所有已建立的连接:

ss -t state established

常见的TCP状态有:

  • established:已建立的连接
  • listening:监听状态
  • time-wait:等待关闭状态(常出现在大量短连接后)
  • closed:已关闭
  • syn-sent:SYN已发送
  • syn-recv:SYN已接收
  • fin-wait-1, fin-wait-2, close-wait, closing, last-ack, closed

实战场景:快速找出系统中所有处于TIME-WAIT状态的连接,这有助于诊断端口耗尽问题。

ss -t state time-wait

2. 地址和端口过滤

使用 dst(目标)或 src(源)关键字进行过滤。

  • 查看连接到特定远程IP的连接
    ss -t dst 192.168.1.100
    
  • 查看从特定本地端口发起的连接
    ss -t src :80
    
  • 查看连接到特定远程IP和端口的连接
    ss -t dst 10.0.0.5:443
    
  • 组合过滤:查看所有已建立的、连接到 1.2.3.4 端口 80 的TCP连接。
    ss -t state established dst 1.2.3.4:80
    

3. 使用比较运算符进行高级过滤

ss 支持 ><>=<===!= 等运算符。

  • 查看本地端口号大于1024的所有TCP连接
    ss -t sport \> :1024
    

    注意:冒号 : 前有空格,大于号 > 需要转义。

  • 查看接收队列(Recv-Q)有积压的连接(可能意味着应用处理不过来):
    ss -t recv-q \> 0
    

实战运维场景示例

场景一:快速定位端口占用

“我的应用启动失败,说8080端口被占用了!”

sudo ss -tlnp | grep :8080

如果输出结果,你会立刻看到是哪个进程(PID和程序名)占用了该端口。

场景二:监控服务器对外连接

“我想知道我的服务器当前正在向哪些外部地址建立连接。”

ss -t state established dst \*:\*

或者,更聚焦一点,排除本地回环和私有网络:

ss -t state established dst \*:\* | grep -vE(127.0.0.1:|192.168.|10\.)

场景三:诊断连接数异常

“系统感觉变慢了,怀疑是连接数太多。”

  • 统计各种TCP状态的数量
    ss -t -a | grep -v ‘State’ | awk{print $1}’ | sort | uniq -c | sort -rn
    

    这会输出类似:

    150 ESTAB
    45 TIME-WAIT
    10 LISTEN
    

    如果 TIME-WAIT 数量异常高,可能需要调整内核TCP参数(如 net.ipv4.tcp_tw_reuse)。

  • 查看哪个远程IP建立的连接最多
    ss -t state established | awk{print $5}’ | cut -d: -f1 | sort | uniq -c | sort -rn | head -10
    

场景四:检查监听服务

“我想确认我的Web服务器(Nginx/Apache)和数据库(MySQL/Redis)的监听端口是否正确开启。”

sudo ss -tlnp | grep -E(nginx|httpd|mysqld|redis-server)

总结与常用命令速查表

ss 命令功能强大,但记住几个最常用的组合就能解决80%的问题:

命令作用描述
ss -tlnp最常用:查看所有TCP监听端口及对应进程
ss -tunp查看所有TCP和UDP连接及对应进程
ss -t state established查看所有已建立的TCP连接
ss -t state time-wait查看所有TIME-WAIT状态的连接(用于诊断)
ss -t dst [IP]:[PORT]查看连接到指定目标的TCP连接
ss -s查看统计摘要:显示套接字总数、各协议分类统计,非常直观

从今天开始,尝试在你的日常工作中使用 ss 替代 netstat 吧。起初你可能需要查一下手册,但很快你就会爱上它的速度和强大,并成为你网络诊断工具箱中最锋利的武器之一。

文档信息

Search

    Table of Contents