ss 命令指南:网络排查神器
一、命令语法结构ss[options][filter_expression]ss是Socket Statistics的缩写是 Linux 下比netstat更强大、更高效的网络连接查看工具。它直接从内核获取 socket 信息速度快、输出详细是网络排查的首选利器。二、核心选项详解Options2.1 Socket 类型筛选可叠加选项含义使用场景-tTCP socket最常用查看 TCP 连接-uUDP socket查看 UDP 会话-wRAW socket查看原始套接字如 ICMP-xUnix domain socket查看进程间通信 socket-dDCCP 协议数据报拥塞控制协议较少用-l仅显示 listening只看监听中的服务端口-a所有状态包含 listening established 其他所有状态-r解析主机名/服务名默认行为但会变慢-n数字显示不解析强烈推荐避免 DNS 卡顿关键点TCP 类型-t默认只显示 non-listening状态即 established、time-wait 等。想看监听端口必须加-l或-a。2.2 输出格式控制选项含义实战价值-p显示进程名和 PID排查哪个进程占用了端口-e扩展信息socket 详细信息查看 uid、ino 等底层信息-iTCP 内部细节查看 cwnd、rtt、ssthresh、拥塞窗口 ——排查网络性能-o计时器信息查看重传定时器、keepalive、超时时间-msocket 内存用量查看收发缓冲区大小、内存占用-4仅 IPv4过滤 IPv4 连接-6仅 IPv6过滤 IPv6 连接-H不打印表头便于脚本解析-OJSON 格式输出程序化处理监控系统采集-b显示 cgroup 信息容器环境识别进程归属-s汇总统计快速查看协议统计计数三、输出字段详解看懂每一列3.1 标准输出格式ss -tln$ ss-tlnState Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN01280.0.0.0:220.0.0.0:* LISTEN0128[::]:22[::]:*字段含义排查要点Statesocket 状态LISTEN/ESTAB/TIME-WAIT 等Recv-Q接收队列积压字节数0 表示应用层未及时读取数据Send-Q发送队列积压字节数0 表示数据未发送完成或对方未确认Local Address:Port本地地址和端口服务监听的 IP 和端口Peer Address:Port对端地址和端口连接的对端 IP 和端口*表示监听3.2 高级输出ss -tin$ ss-tinstate established sport:443 State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB00192.168.1.10:44310.0.0.5:54321 cubic wscale:7,7 rto:204 rtt:12.5/2.3 ato:40 cwnd:10 ssthresh:256 send1.2Mbps rcv_rtt:1 rcv_space:29200TCP 细节字段解读字段含义排查价值cubic拥塞控制算法是否为 cubic/bbrwscale窗口缩放因子支持大窗口传输rto重传超时时间ms1000ms 可能网络延迟高或丢包rtt往返时延ms网络延迟指标rttvarRTT 方差网络抖动程度ato延迟确认超时TCP 延迟确认机制cwnd拥塞窗口大小包数吞吐量关键指标ssthresh慢启动阈值拥塞控制状态send发送速率实际传输速度rcv_rtt接收端 RTT对端延迟视角rcv_space接收端通告窗口对端缓冲区大小3.3 进程信息ss -tnlp$ ss-tlnpsport:22 State Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN01280.0.0.0:220.0.0.0:* users:((sshd,pid1234,fd3))LISTEN0128[::]:22[::]:* users:((sshd,pid1234,fd4))四、过滤表达式详解Filter Expression4.1 基本语法结构ss[options][stateSTATE][条件表达式]重要区别ss 的过滤语法不是 tcpdump 的 BPF而是键值对匹配推荐始终使用运算符以避免歧义。4.2 状态过滤可用的所有状态established syn-sent syn-recv fin-wait-1 fin-wait-2 time-wait closed close-wait last-ack listening closing all# 只查看已建立连接ss state established# 只查看 TIME_WAIT 状态的连接排查端口耗尽ss state time-wait# 查看所有状态ss state all4.3 地址/端口过滤过滤条件语法示例实战场景源端口sport :22查看 SSH 服务端连接目标端口dport :443查看 HTTPS 客户端连接源地址src 192.168.1.1查看来自某 IP 的连接源网段src 192.168.1.0/24查看内网某网段的连接目标地址dst 10.0.0.5查看发往某 IP 的连接地址端口src 192.168.1.1:443精确匹配排除条件src ! 192.168.1.1sport ! :22过滤掉某个 IP/端口4.4 表达式组合# OR 组合匹配 80 或 443 端口ss-tn( sport :80 or sport :443 )# AND 组合已建立且来自内网ss state established and src10.0.0.0/8# 复杂组合已建立且80 或 443且来自 192.168.x.xss-tnstate established and src192.168.0.0/16 and( sport :80 or sport :443 )五、实战场景与实例输出5.1 场景一服务端口被占用查谁在用# 问题启动 nginx 报错 port 80 already in use# 排查查看 80 端口被哪个进程占用$ ss-tlnpsport:80 State Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN01280.0.0.0:800.0.0.0:* users:((nginx,pid12345,fd6))LISTEN0128[::]:80[::]:* users:((nginx,pid12345,fd7))# 结论nginx (PID 12345) 正在占用 80 端口# 解决方案kill -9 12345 或修改 nginx 配置5.2 场景二网站访问慢看 TCP 性能参数# 问题用户反馈访问 Web 服务慢# 排查查看 443 端口的 TCP 细节$ ss-tinstate established sport:443 State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB00192.168.1.10:44310.0.0.5:39821 cubic wscale:7,7 rto:204 rtt:12.5/2.3 ato:40 cwnd:10 ssthresh:256 send1.2Mbps rcv_rtt:1 rcv_space:29200 ESTAB00192.168.1.10:44310.0.0.8:48123 cubic wscale:7,7 rto:800 rtt:345.2/120.5 ato:40 cwnd:3 ssthresh:10 send0.2Mbps rcv_rtt:2 rcv_space:29200# 分析# - 第一个连接rtt12.5ms延迟正常cwnd10窗口适中速率 1.2Mbps# - 第二个连接rtt345ms延迟高cwnd3窗口很小速率仅 0.2Mbps# - 且 rto800ms重传超时很高ssthresh10已进入拥塞避免## 结论第二个连接可能存在网络丢包或对端带宽受限# 建议检查对端 10.0.0.8 的网络状况或调整拥塞控制算法为 bbr5.3 场景三排查大量 TIME_WAIT 连接# 问题系统出现 Cannot assign requested address 错误# 排查查看 TIME_WAIT 数量是否过多$ ss-tstate time-wait|wc-l8543# 分析8543 个 TIME_WAIT可能耗尽本地端口默认范围 32768-60999约 28000 个# 如果短期内达到 28000就会出现端口耗尽# 查看具体 TIME_WAIT 分布$ ss-tstate time-wait sport:80|head-5TIME-WAIT00192.168.1.10:8010.0.0.5:54321 TIME-WAIT00192.168.1.10:8010.0.0.5:54322 TIME-WAIT00192.168.1.10:8010.0.0.5:54323...# 解决方案调整内核参数 net.ipv4.tcp_tw_reuse1# 或减少 net.ipv4.tcp_fin_timeout 值5.4 场景四DDoS 攻击检测单 IP 大量连接# 问题服务器负载飙升怀疑 CC 攻击# 排查查看 ESTAB 连接数 TOP 10$ ss-tnstate established|awk{print $5}|cut-d:-f1|sort|uniq-c|sort-nr|head-101256203.0.113.100432203.0.113.10589192.168.1.1001210.0.0.58192.168.1.1# 分析203.0.113.100 有 1256 个 ESTAB 连接远超正常值# 结论该 IP 疑似攻击源# 查看该 IP 的详细连接$ ss-tnstate established src203.0.113.100 ESTAB00192.168.1.10:443203.0.113.100:48723 ESTAB00192.168.1.10:443203.0.113.100:48724...共1256行# 解决方案iptables -A INPUT -s 203.0.113.100 -j DROP5.5 场景五接收/发送队列积压排查# 问题服务响应慢Recv-Q / Send-Q 数值异常$ ss-tn|head-5State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB00192.168.1.10:8010.0.0.5:39821 ESTAB125680192.168.1.10:8010.0.0.8:48123# ⚠️ Recv-Q12568ESTAB00192.168.1.10:8010.0.0.3:51234 ESTAB037654192.168.1.10:8010.0.0.9:49123# ⚠️ Send-Q37654# 分析# - Recv-Q12568内核接收缓冲区有 12KB 数据应用层未读取 → 应用处理能力不足# - Send-Q37654内核发送缓冲区有 37KB 数据未发送 → 对端接收慢或网络拥塞## 解决方案# - Recv-Q 高检查应用进程是否卡死调大应用读取速度# - Send-Q 高检查对端处理能力或网络带宽是否受限5.6 场景六查看所有监听服务安全审计# 问题安全审计查看服务器开放了哪些端口# 排查显示所有监听端口及进程$ ss-tulnpNetid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process tcp LISTEN01280.0.0.0:220.0.0.0:* users:((sshd,pid1234,fd3))tcp LISTEN01280.0.0.0:800.0.0.0:* users:((nginx,pid12345,fd6))tcp LISTEN01280.0.0.0:4430.0.0.0:* users:((nginx,pid12345,fd7))tcp LISTEN0128127.0.0.1:33060.0.0.0:* users:((mysqld,pid2345,fd22))udp UNCONN000.0.0.0:530.0.0.0:* users:((dnsmasq,pid3456,fd5))# 分析# - 22: SSH外部访问# - 80/443: Nginx Web 服务外部访问# - 3306: MySQL 只监听 127.0.0.1安全仅本机访问# - 53: DNS 服务UDP## ⚠️ 检查是否有异常端口开放如 4444、6667 等可疑端口5.7 场景七Unix Domain Socket 排查进程间通信# 问题Docker/容器服务通信异常# 排查查看 Unix socket 状态$ ss-xlnpState Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN0128/run/docker.sock * users:((dockerd,pid5678,fd3))LISTEN0128/var/run/dbus/system_bus_socket * users:((dbus-daemon,pid7890,fd3))# 分析docker.sock 存在且监听正常说明 Docker 服务可访问# 如果 docker.sock 不存在 → Docker 服务未启动5.8 场景八JSON 输出监控系统集成# 监控系统采集数据使用 JSON 格式便于解析$ ss-tlnOsport:443[{netid:tcp,state:LISTEN,recv-q:0,send-q:0,local:0.0.0.0:443,peer:0.0.0.0:*,process:nginx}]# 可用 jq 处理$ ss-tlnOsport:443|jq.[] | {port: .local, state: .state}{port:0.0.0.0:443,state:LISTEN}六、统计信息模式ss -s# 查看系统整体 socket 统计$ ss-sTotal:1256(kernel1892)TCP:456(estab123, closed285, orphaned12, timewait42)Transport Total IP IPv6 RAW211UDP862TCP45642333INET46643036FRAG000# 解读# - Total: 1256 个 socketkernel 级 1892含未显示# - estab 123当前活跃连接数# - closed 285已关闭但未释放的 socket# - timewait 42TIME_WAIT 状态数量# - orphaned 12孤儿连接需要关注可能连接泄漏# ⚠️ 如果 orphaned 持续增长 → 应用程序可能存在 socket 泄漏七、状态流转图帮助理解客户端连接流程 CLOSED ↓ (connect) SYN-SENT ↓ (收到 SYNACK) ESTABLISHED ↓ (发送 FIN) FIN-WAIT-1 → FIN-WAIT-2 → TIME-WAIT → CLOSED 服务端监听流程 CLOSED ↓ (bind listen) LISTEN ↓ (收到 SYN) SYN-RECV ↓ (发送 SYNACK) ESTABLISHED ↓ (收到 FIN) CLOSE-WAIT → LAST-ACK → CLOSED八、快速故障排查流程图用户报障 服务访问不了 ↓ ss -tlnp sport :端口 → 服务是否在监听 ├─ 否 → 检查服务进程是否启动 └─ 是 → ss -tn state established dst 对端IP ├─ 无连接 → 检查防火墙/网络路由 └─ 有连接 → ss -tin 查看性能参数 ├─ rtt 200ms → 网络延迟高 ├─ cwnd 10 → 拥塞控制受限 ├─ rto 500ms → 丢包重传 └─ Recv-Q/Send-Q 0 → 应用层瓶颈九、推荐最佳实践9.1 常用别名配置# 添加到 ~/.bashrc 或 ~/.zshrcaliasssallss -tunap# 所有连接 进程aliassslss -tlnp# 所有监听端口 进程aliassscss -tunp state established# 仅已建立连接aliassswss -tn state time-wait# TIME_WAIT 连接aliasssmss -tin# TCP 性能参数# 端口查询函数ssport(){ss-tlnpsport:$1|grep-v^State}# 连接数统计sscount(){echoESTAB:$(ss-tstate established|wc-l)echoTIME_WAIT:$(ss-tstate time-wait|wc-l)echoLISTEN:$(ss-tstate listening|wc-l)}9.2 生产环境排查 checklist步骤命令检查项正常值1ss -tlnp sport :端口服务是否监听LISTEN 状态2ss -tn state established | wc -l活跃连接数无突发暴涨3ss -tin state establishedRTT、CWNDrtt 100ms4ss -tn | grep -v 0 0队列积压Recv-Q/Send-Q 全为 05ss -t state time-wait | wc -lTIME_WAIT 数量 200006ss -s | grep orphaned孤儿连接持续增长需警惕9.3 常见问题速查表现象排查命令可能原因解决方案端口被占用ss -tlnp sport :端口进程未退出kill 对应 PID网站访问慢ss -tin src 客户端IPrtt 高/丢包检查网络链路连接数暴涨ss -tn | awk {print $5} | cut -d: -f1 | sort | uniq -c | sort -nr流量攻击iptables 封禁Cannot assign requested addressss -t state time-wait | wc -l端口耗尽调整 tw_reuse/tw_recycleRecv-Q 持续增长ss -tnp查看对应 PID应用处理慢检查应用日志Send-Q 持续增长ss -tnp查看对端网络拥塞/对端慢检查带宽和对方服务