在Linux网络运维中,排查网络连接、端口占用、连接状态等问题是高频需求。提到网络诊断工具,很多人会先想到netstat,但随着Linux系统的迭代,ss命令已逐渐替代netstat成为首选工具------它直接从内核空间获取套接字(Socket)信息,执行速度更快、显示信息更详细,尤其适合高负载服务器环境下的网络排查工作。
本文将从基础到进阶,详细拆解ss命令的使用方法,结合实战场景说明其核心用法,帮助运维人员、开发人员快速掌握这一网络诊断利器,轻松应对各类网络连接问题。
文章目录
- 一、ss命令基础认知
-
- [1.1 什么是ss命令](#1.1 什么是ss命令)
- [1.2 ss与netstat的核心区别](#1.2 ss与netstat的核心区别)
- [1.3 基本语法](#1.3 基本语法)
- 二、ss命令核心选项详解(必记)
-
- [2.1 协议过滤选项(指定查看的网络协议)](#2.1 协议过滤选项(指定查看的网络协议))
- [2.2 连接状态选项(指定查看的连接状态)](#2.2 连接状态选项(指定查看的连接状态))
- [2.3 显示格式选项(调整输出信息的展示方式)](#2.3 显示格式选项(调整输出信息的展示方式))
- [2.4 统计与其他选项](#2.4 统计与其他选项)
- 三、ss命令进阶用法:过滤条件实战
-
- [3.1 按端口过滤(最常用)](#3.1 按端口过滤(最常用))
- [3.2 按IP地址过滤](#3.2 按IP地址过滤)
- [3.3 按进程过滤](#3.3 按进程过滤)
- [3.4 多条件组合过滤](#3.4 多条件组合过滤)
- 四、日常运维实战场景(必练)
- 五、常见问题与避坑指南
-
- [5.1 执行ss -p看不到进程信息?](#5.1 执行ss -p看不到进程信息?)
- [5.2 ss命令执行速度慢?](#5.2 ss命令执行速度慢?)
- [5.3 看不到TIME-WAIT状态的连接?](#5.3 看不到TIME-WAIT状态的连接?)
- [5.4 无法用ss关闭连接(ss -K无效)?](#5.4 无法用ss关闭连接(ss -K无效)?)
- 六、常用命令速查表(收藏备用)
- 七、总结
一、ss命令基础认知
1.1 什么是ss命令
ss(Socket Statistics)是Linux系统自带的网络工具,属于iproute2工具包的核心组件,用于查看系统中所有套接字的详细统计信息,包括TCP、UDP、Unix域套接字等各类网络连接的状态、端口、进程关联等关键信息。
1.2 ss与netstat的核心区别
很多运维人员习惯使用netstat,但在高并发场景下,ss的优势极为明显,二者核心区别如下表所示:
| 特性 | netstat | ss |
|---|---|---|
| 数据来源 | 读取/proc/net目录下的文本文件,解析效率低 |
通过netlink套接字直接与内核通信,获取第一手数据 |
| 执行速度 | 较慢,连接数达数万时会明显卡顿(实测5万连接需15秒左右) | 极快,高并发场景优势显著(实测5万连接仅需0.3秒左右) |
| 功能复杂度 | 功能基础,过滤能力有限 | 支持高级过滤、TCP内部状态分析、内存用量统计等 |
| 系统兼容性 | 旧系统默认安装(属于net-tools包),新系统需手动安装 | 新系统(Ubuntu 22.04+、RHEL 9+等)默认安装,替代netstat |
提示:目前大部分Linux发行版(如CentOS 7+、Ubuntu 16+)已默认预装ss,若未安装,可通过yum install iproute2(CentOS)或apt install iproute2(Ubuntu)快速安装。
1.3 基本语法
ss命令的语法简洁易懂,核心结构分为"选项"和"过滤条件"两部分,基础格式如下:
bash
ss [选项] [过滤条件]
说明:
- 选项:指定查看的范围(如TCP/UDP、监听状态)、显示格式(如数字端口、进程信息);
- 过滤条件:精准筛选目标连接(如按端口、IP、连接状态过滤),可选填。
二、ss命令核心选项详解(必记)
ss的选项众多,但日常运维中常用选项仅10余个,按功能分类拆解,结合示例帮助快速记忆,所有示例均经过CentOS 7/8、Ubuntu 20.04验证,可直接复制执行。
2.1 协议过滤选项(指定查看的网络协议)
用于筛选特定协议的连接,最常用的是TCP和UDP协议,其他协议可根据需求选用。
| 选项 | 功能说明 | 示例 |
|---|---|---|
| -t | 仅显示TCP协议的连接 | ss -t(查看所有TCP连接) |
| -u | 仅显示UDP协议的连接 | ss -u(查看所有UDP连接) |
| -x | 仅显示Unix域套接字(本地进程间通信) | ss -x(查看本地进程间通信连接) |
| -w | 仅显示RAW原始套接字(用于网络底层通信) | ss -w(查看RAW协议连接) |
| -4 | 仅显示IPv4协议的连接 | ss -4t(查看所有IPv4的TCP连接) |
| -6 | 仅显示IPv6协议的连接 | ss -6u(查看所有IPv6的UDP连接) |
2.2 连接状态选项(指定查看的连接状态)
TCP连接有11种状态(如LISTEN、ESTABLISHED),ss可通过选项快速筛选目标状态的连接,这是排查网络问题的核心用法之一。
| 选项/过滤条件 | 功能说明 | 示例 |
|---|---|---|
| -l | 仅显示"监听中"的连接(LISTEN状态),常用于确认服务是否正常启动 | ss -tl(查看所有TCP监听连接) |
| state 状态值 | 筛选指定TCP状态的连接,支持多状态组合 | ss -t state established(查看已建立的TCP连接) |
常用TCP状态值说明(必记):
- LISTEN:监听状态,服务已启动,等待客户端连接(如Nginx监听80端口);
- ESTABLISHED:已建立连接,客户端与服务器正常通信;
- TIME-WAIT:连接已关闭,等待回收(默认等待2MSL,过多会占用端口资源);
- CLOSE-WAIT:被动关闭连接,等待应用程序关闭端口(过多可能是程序异常);
- SYN-RECV:收到客户端SYN请求,等待客户端确认(过多可能是SYN Flood攻击);
- FIN-WAIT-1/2:主动关闭连接的中间状态。
补充示例:
- 查看所有非监听状态的TCP连接:
ss -t state connected; - 查看TIME-WAIT和CLOSE-WAIT状态的连接:
ss -t state time-wait,close-wait。
2.3 显示格式选项(调整输出信息的展示方式)
用于优化输出内容,方便快速读取关键信息(如IP、端口、进程),日常运维中高频组合使用。
| 选项 | 功能说明 | 示例 |
|---|---|---|
| -n | 不解析域名、服务名,直接显示数字IP和端口(速度更快,避免DNS解析耗时) | ss -tnl(数字显示TCP监听端口,常用) |
| -p | 显示连接关联的进程名和进程ID(PID),需root权限(精准定位端口占用进程) | sudo ss -tnlp(查看TCP监听端口及对应进程) |
| -e | 显示扩展信息,包括UID、计时器、网络接口等 | ss -te(查看TCP连接的扩展信息) |
| -o | 显示连接的计时器信息(如TIME-WAIT状态的剩余等待时间) | ss -to(查看TCP连接的计时器详情) |
| -m | 显示套接字的内存使用情况(用于排查内存泄漏、缓冲区问题) | ss -tm(查看TCP连接的内存占用) |
| -H | 不显示表头信息(适合脚本批量处理输出结果) | ss -tnlH(不显示表头,仅输出TCP监听端口) |
2.4 统计与其他选项
用于快速统计连接数量、查看全局网络状态,适合快速排查整体网络健康度。
| 选项 | 功能说明 | 示例 |
|---|---|---|
| -s | 显示所有套接字的统计信息(核心选项),包括TCP/UDP各状态连接数、总连接数 | ss -s(查看全局网络连接统计) |
| -a | 显示所有连接(包括监听和非监听状态),等价于不指定state过滤 | ss -ta(查看所有TCP连接,包括监听和已建立) |
| -K | 强制关闭指定的套接字连接(需root权限,谨慎使用) | sudo ss -tK state time-wait(强制关闭所有TIME-WAIT状态的TCP连接) |
三、ss命令进阶用法:过滤条件实战
ss的强大之处在于支持灵活的过滤条件,可按端口、IP、进程、连接状态等多维度精准筛选连接,解决复杂网络排查场景。过滤条件的语法类似tcpdump,核心支持"端口过滤""IP过滤""多条件组合过滤"。
3.1 按端口过滤(最常用)
通过sport(源端口)、dport(目标端口)筛选连接,支持等于、不等于、范围匹配,端口号前需加冒号:。
bash
# 1. 查看目标端口为80(HTTP)的TCP连接(如排查Nginx连接)
ss -tn state established dport = :80
# 2. 查看源端口为22(SSH)的TCP连接
ss -tn sport = :22
# 3. 查看端口范围为8000-9000的TCP监听连接
ss -tnl sport > :8000 and sport < :9000
# 4. 查看端口为80或443(HTTPS)的TCP连接(多端口匹配)
ss -tn dport = :80 or dport = :443
# 5. 查看非22端口的TCP连接(排除指定端口)
ss -tn sport != :22
3.2 按IP地址过滤
通过src(源IP)、dst(目标IP)筛选连接,支持单个IP、IP网段匹配,适合排查特定客户端/服务器的连接问题。
bash
# 1. 查看所有连接到目标IP 192.168.1.100 的TCP连接
ss -tn dst 192.168.1.100
# 2. 查看所有从源IP 192.168.1.20 发起的TCP连接
ss -tn src 192.168.1.20
# 3. 查看连接到192.168.1.0/24网段的UDP连接(网段匹配)
ss -un dst 192.168.1.0/24
# 4. 查看源IP为192.168.1.20且目标端口为3306(MySQL)的连接
ss -tn src 192.168.1.20 and dport = :3306
3.3 按进程过滤
结合-p选项,通过进程名或PID筛选连接,精准定位某个进程的所有网络连接。
bash
# 1. 查看nginx进程的所有网络连接(按进程名过滤,需root权限)
sudo ss -tup | grep nginx
# 2. 查看PID为1234的进程的所有连接(按PID过滤)
sudo ss -tup | grep 1234
# 3. 查看所有由java进程发起的TCP连接
sudo ss -tp | grep java
3.4 多条件组合过滤
使用and(且)、or(或)组合多个过滤条件,应对复杂排查场景(如排查特定IP、特定端口、特定状态的连接)。
bash
# 1. 查看源IP为192.168.1.20、目标端口为80、状态为ESTABLISHED的TCP连接
ss -tn state established src 192.168.1.20 and dport = :80
# 2. 查看目标IP为10.0.0.5、端口为3306或8080的TCP连接
ss -tn dst 10.0.0.5 and (dport = :3306 or dport = :8080)
# 3. 查看IPv4、TCP协议、非监听状态、端口不为22的连接
ss -4t state connected sport != :22
四、日常运维实战场景(必练)
结合实际工作中的高频网络问题,拆解ss命令的实战用法,学会这些场景,可快速应对90%以上的网络排查需求。
场景1:排查"端口被占用"问题(最高频)
当服务启动失败(如"Address already in use"),需快速定位占用目标端口的进程,核心组合-tnlp。
bash
# 示例:排查8080端口被哪个进程占用(需root权限)
sudo ss -tnlp | grep -w ":8080"
# 输出示例(解读):
# tcp LISTEN 0 128 *:8080 *:* users:(("java",pid=12345,fd=6))
# 说明:8080端口被PID为12345的java进程占用,可通过kill 12345关闭进程
场景2:统计服务器TCP连接数,判断并发负载
通过-s选项查看全局连接统计,或结合过滤条件统计特定状态的连接数,判断服务器并发是否过载。
bash
# 1. 查看全局TCP/UDP连接统计(快速了解网络健康度)
ss -s
# 输出解读:
# Total: 45 (kernel 60)
# TCP: 10 (estab 5, closed 2, orphaned 0, timewait 3) # TCP总连接10个,已建立5个,TIME-WAIT3个
# UDP: 3 # UDP总连接3个
# 2. 统计已建立的TCP连接数(判断并发量,如Nginx、Tomcat)
ss -tn state established | wc -l
# 3. 统计TIME-WAIT状态的连接数(过多需优化内核参数)
ss -tn state time-wait | wc -l
# 4. 按连接状态统计TCP连接数(生成详细报告)
ss -t | tail -n +2 | awk '{print $1}' | sort | uniq -c | sort -rn
场景3:排查异常连接(如恶意IP、端口扫描)
通过过滤条件筛选异常连接,如大量SYN-RECV状态(可能是SYN Flood攻击)、陌生IP的连接,快速定位问题。
bash
# 1. 查看是否有SYN Flood攻击(大量SYN-RECV状态连接)
ss -tn state syn-recv | wc -l # 数量过大(如上千)可能是攻击
# 2. 查看每个IP的TCP连接数,找出异常IP(如单个IP连接数过多)
ss -tn | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -20
# 3. 查看陌生IP(如非内网IP)的连接,排查恶意连接
ss -tn dst not 192.168.1.0/24 and dst not 127.0.0.1
# 4. 查看持续连接时间过长的TCP连接(结合计时器)
ss -to | grep -v "timewait" | grep -E "([0-9]+):([0-9]+):([0-9]+)"
场景4:排查UDP服务连通性(如DNS、NTP服务)
UDP协议无连接状态,需通过-unl查看监听端口,确认服务是否正常启动。
bash
# 1. 查看DNS服务(默认UDP 53端口)是否正常监听
ss -unl | grep :53
# 2. 查看NTP服务(默认UDP 123端口)的监听状态
ss -unl | grep :123
# 3. 查看所有UDP监听端口,确认UDP服务启动情况
ss -unl
场景5:批量处理连接(结合脚本)
ss命令的输出可结合awk、grep等工具批量处理,适合自动化运维脚本。
bash
# 示例1:生成TCP连接状态统计报告(保存到文件)
ss -t | tail -n +2 | awk '{print $1}' | sort | uniq -c | awk '{print $2": "$1}' > /tmp/tcp_state_report.txt
# 示例2:自动关闭所有TIME-WAIT状态且连接时间超过10秒的TCP连接(谨慎使用)
sudo ss -to state time-wait | grep "10:" | awk '{print $4,$5}' | while read local dst; do
sudo ss -tK "$local" "$dst"
done
五、常见问题与避坑指南
5.1 执行ss -p看不到进程信息?
原因:-p选项需要root权限,普通用户无法查看其他进程的连接信息;部分系统(如容器内)可能限制了进程信息的读取。
解决:使用sudo执行命令,如sudo ss -tnlp。
5.2 ss命令执行速度慢?
原因:未使用-n选项,ss会解析域名和服务名,DNS解析耗时较长;或系统连接数极多(需优化内核)。
解决:添加-n选项跳过解析,如ss -tnl替代ss -tl。
5.3 看不到TIME-WAIT状态的连接?
原因:默认情况下,ss会显示所有状态的连接,但部分系统可能因内核参数配置,隐藏了部分TIME-WAIT连接;或未指定正确的过滤条件。
解决:使用ss -tn state time-wait强制筛选,或检查内核参数net.ipv4.tcp_tw_recycle(不建议开启)。
5.4 无法用ss关闭连接(ss -K无效)?
原因:-K选项仅支持关闭TCP连接,不支持UDP、Unix域套接字;部分连接可能被内核保护,无法强制关闭。
解决:确认连接类型为TCP,且使用root权限执行;若仍无效,可通过杀死对应进程关闭连接(kill -9 PID)。
六、常用命令速查表(收藏备用)
整理日常运维中最常用的ss命令组合,无需记忆,直接复制执行:
bash
# 基础查看
ss -tnl # 数字显示所有TCP监听端口(最常用)
ss -unl # 数字显示所有UDP监听端口
ss -t # 查看所有TCP连接
ss -u # 查看所有UDP连接
ss -s # 查看全局连接统计
# 端口与进程排查
sudo ss -tnlp # 查看TCP监听端口及对应进程
sudo ss -tnlp | grep :80 # 排查80端口占用进程
sudo ss -unlp | grep :53 # 排查DNS服务端口
# 连接状态与过滤
ss -tn state established # 查看已建立的TCP连接
ss -tn state time-wait | wc -l # 统计TIME-WAIT连接数
ss -tn dport = :80 # 查看目标端口为80的TCP连接
ss -tn src 192.168.1.20 # 查看源IP为192.168.1.20的TCP连接
# 异常排查
ss -tn state syn-recv | wc -l # 排查SYN Flood攻击
ss -tn | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn # 统计各IP连接数
七、总结
ss命令作为Linux网络诊断的"神器",核心优势在于速度快、信息全、过滤灵活,是替代netstat的最佳选择,尤其适合高并发服务器环境。掌握其核心用法的关键的是:牢记常用选项组合(如-tnlp排查端口占用)、熟练使用过滤条件(按端口、IP、状态筛选)、结合实战场景灵活运用。
日常运维中,大部分网络连接问题(端口占用、并发过载、异常连接)都能通过ss命令快速定位,熟练掌握本文内容,可大幅提升网络排查效率,避免在故障排查中走弯路。建议多在实际服务器上练习,结合awk、grep等工具,实现更灵活的连接管理与排查。