Linux网络连接之ss命令详细使用指南(从入门到运维实战)

在Linux网络运维中,排查网络连接、端口占用、连接状态等问题是高频需求。提到网络诊断工具,很多人会先想到netstat,但随着Linux系统的迭代,ss命令已逐渐替代netstat成为首选工具------它直接从内核空间获取套接字(Socket)信息,执行速度更快、显示信息更详细,尤其适合高负载服务器环境下的网络排查工作。

本文将从基础到进阶,详细拆解ss命令的使用方法,结合实战场景说明其核心用法,帮助运维人员、开发人员快速掌握这一网络诊断利器,轻松应对各类网络连接问题。

文章目录

一、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命令的输出可结合awkgrep等工具批量处理,适合自动化运维脚本。

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命令快速定位,熟练掌握本文内容,可大幅提升网络排查效率,避免在故障排查中走弯路。建议多在实际服务器上练习,结合awkgrep等工具,实现更灵活的连接管理与排查。

相关推荐
Ronin3051 小时前
信道管理模块
网络·rabbitmq·网络通信
航哥的女人2 小时前
基于TCP的socket编程
网络·网络协议·tcp/ip
掌心天涯2 小时前
大疆御Pro加装4G模块
网络·智能路由器
爱华晨宇2 小时前
Xshell高效运维实战指南
运维·服务器
未来之窗软件服务2 小时前
服务器运维(四十一)日服务器linux-audit.log分析工具—东方仙盟
linux·运维·服务器·服务器运维·仙盟创梦ide·东方仙盟
志栋智能2 小时前
AI驱动的自动化运维机器人:从“数字劳动力”到“智能协作者”的进化
大数据·运维·网络·人工智能·机器人·自动化
guizhoumen3 小时前
建站从零开始之域名、服务器和CMS网站程序的选择
运维·服务器·网络
笨蛋不要掉眼泪3 小时前
OpenFeign远程调用详解:声明式实现、第三方API集成与负载均衡对比
java·运维·负载均衡
Codefengfeng3 小时前
Kali安装工具通用教程
运维·服务器