linux ss命令
ss命令 用于查看系统套接字(socket)统计信息,是netstat命令的现代替代品。ss能够显示比netstat更详细的信息,并且速度更快,特别是在有大量连接的情况下。
命令格式
常用选项
| 选项 |
说明 |
-t, --tcp |
显示TCP套接字 |
-u, --udp |
显示UDP套接字 |
-l, --listening |
显示监听中的套接字 |
-a, --all |
显示所有套接字(包括监听和非监听) |
-n, --numeric |
不解析服务名称(显示端口号) |
-p, --processes |
显示使用套接字的进程 |
-s, --summary |
显示套接字使用摘要 |
-4, --ipv4 |
仅显示IPv4套接字 |
-6, --ipv6 |
仅显示IPv6套接字 |
-0, --packet |
显示PACKET套接字 |
-x, --unix |
显示UNIX域套接字 |
-w, --raw |
显示RAW套接字 |
-e, --extended |
显示详细的套接字信息 |
-m, --memory |
显示套接字内存使用情况 |
-i, --info |
显示TCP内部信息 |
-o, --options |
显示TCP计时器信息 |
-r, --resolve |
解析主机名(默认行为) |
-H, --no-header |
不显示标题行 |
-A, --query=查询 |
套接字表选择(tcp, udp, raw等) |
-D, --diag=文件 |
将原始TCP套接字信息转储到文件 |
-F, --filter=文件 |
从文件读取过滤信息 |
-Z, --context |
显示SELinux安全上下文 |
输出字段说明
| 字段 |
说明 |
| State |
套接字状态(ESTAB, LISTEN, TIME-WAIT等) |
| Recv-Q |
接收队列中的数据大小(字节) |
| Send-Q |
发送队列中的数据大小(字节) |
| Local Address:Port |
本地地址和端口 |
| Peer Address:Port |
远程地址和端口 |
| Process |
使用套接字的进程信息 |
| Timer |
TCP计时器信息 |
| uid |
用户ID |
| Inode |
套接字索引节点号 |
TCP连接状态说明
- LISTEN - 监听传入连接
- ESTABLISHED - 已建立的连接
- SYN-SENT - 主动发起连接
- SYN-RECV - 收到连接请求
- FIN-WAIT-1 - 等待远程TCP连接终止请求
- FIN-WAIT-2 - 等待远程TCP连接终止请求
- TIME-WAIT - 等待足够时间以确保远程TCP接收到连接终止请求的确认
- CLOSE-WAIT - 等待本地用户连接终止请求
- CLOSED - 连接已关闭
使用实例
1. 查看所有TCP连接
2. 查看所有UDP连接
3. 查看所有监听中的端口
4. 查看所有TCP监听端口(显示端口号)
5. 查看所有TCP连接(包括监听和非监听)
6. 查看所有TCP连接并显示进程信息
7. 查看套接字使用摘要
8. 查看指定端口的连接
# 查看80端口
ss -t sport = :80
# 查看22端口
ss -t sport = :22
# 查看源端口是80的连接
ss -t sport = :80
# 查看目标端口是80的连接
ss -t dport = :80
9. 查看指定IP的连接
# 查看与192.168.1.100的连接
ss -t dst 192.168.1.100
# 查看从192.168.1.100发起的连接
ss -t src 192.168.1.100
10. 查看UNIX域套接字
11. 显示详细信息和内存使用
12. 查看TCP内部信息
13. 显示TCP计时器信息
14. 组合过滤条件
# 查看ESTABLISHED状态的TCP连接
ss -t state established
# 查看所有非监听状态的TCP连接
ss -t state connected
# 查看TIME-WAIT状态的TCP连接
ss -t state time-wait
# 查看指定状态的连接
ss -t state listening
ss -t state fin-wait-1
ss -t state fin-wait-2
ss -t state close-wait
ss -t state closing
ss -t state last-ack
ss -t state closed
15. 查看SELinux安全上下文
16. 查看IPv4和IPv6分别的统计
17. 使用表达式过滤
# 查看端口范围在80-100的连接
ss -t sport gt :80 sport lt :100
# 查看接收队列大于0的连接
ss -t 'recv-q > 0'
# 查看发送队列大于0的连接
ss -t 'send-q > 0'
18. 持续监控连接变化
# 每秒刷新一次
watch -n 1 ss -t
# 监控特定端口
watch -n 1 'ss -t sport = :80'
实际输出示例
示例1:查看TCP监听端口
$ ss -ltn
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::80 :::*
LISTEN 0 128 :::22 :::*
示例2:查看TCP连接及进程
$ ss -tp
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.1.100:ssh 192.168.1.200:54321 users:(("sshd",pid=1234,fd=3))
ESTAB 0 0 192.168.1.100:http 203.0.113.45:48231 users:(("nginx",pid=5678,fd=12))
LISTEN 0 128 *:ssh *:* users:(("sshd",pid=9012,fd=3))
示例3:套接字使用摘要
$ ss -s
Total: 456
TCP: 45 (estab 30, closed 5, orphaned 0, timewait 5)
Transport Total IP IPv6
RAW 1 0 1
UDP 15 10 5
TCP 40 25 15
INET 56 35 21
FRAG 0 0 0
示例4:查看TCP内部信息
$ ss -ti
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.1.100:ssh 192.168.1.200:54321
cubic wscale:7,7 rto:204 rtt:0.4/0.8 ato:40 mss:1448 cwnd:10 send 4.3Mbps rcv_rtt:4 rcv_space:14600
ESTAB 0 0 192.168.1.100:http 203.0.113.45:48231
cubic wscale:6,7 rto:240 rtt:12.5/25 ato:40 mss:1448 cwnd:10 send 1.2Mbps rcv_rtt:12 rcv_space:29200
实用场景
- 端口占用检查
- 网络连接泄漏分析
- 连接状态异常检查
- 防火墙规则验证
- 网络连接数监控
- TCP参数调优
- 缓冲区使用分析
- 网络吞吐量估算
- 可疑连接检测
- 未授权端口扫描
- SELinux策略检查
- 入侵检测分析
- 服务端口验证
- 进程网络行为分析
- 负载均衡监控
- 容器网络检查
实用命令组合
# 查看占用80端口的进程
ss -ltnp | grep :80
# 统计各种TCP状态的数量
ss -t -a | grep -v State | awk '{print $1}' | sort | uniq -c | sort -rn
# 查看所有ESTABLISHED连接并按本地端口排序
ss -t state established -n | sort -n -k 4
# 查看所有非本地IP的连接
ss -t | grep -v '127.0.0.1' | grep -v '::1'
# 监控新连接建立
watch -d -n 1 'ss -t state established'
# 查看TCP重传情况
ss -ti | grep -E "retrans|lost"
# 查看每个进程的TCP连接数
ss -tp | awk '/users:/{print $NF}' | cut -d= -f2 | cut -d, -f1 | sort | uniq -c | sort -rn
# 查找连接数最多的IP
ss -tn | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -10
与netstat对比
| 对比项 |
ss命令 |
netstat命令 |
| 速度 |
快速,直接从内核获取信息 |
较慢,需要遍历/proc文件系统 |
| 信息量 |
更详细,支持更多TCP内部信息 |
基本信息 |
| 资源占用 |
低 |
高(尤其在连接数多时) |
| 过滤功能 |
强大,支持表达式过滤 |
有限 |
| 兼容性 |
较新的Linux发行版 |
几乎所有系统 |
| 推荐度 |
推荐使用 |
传统命令,逐渐被ss取代 |
注意事项:
- ss命令是iproute2软件包的一部分,大多数现代Linux发行版已预装
- ss显示的信息比netstat更准确,特别是TCP状态信息
- 使用
-n选项可以避免DNS查询,提高显示速度
- ss支持丰富的过滤表达式,可以精确筛选需要的连接
- 对于大量连接的系统,ss的性能优势非常明显
- ss的某些选项需要root权限才能查看完整信息
安装ss
ss命令通常包含在iproute2软件包中,大多数Linux发行版默认已安装。
# 检查是否已安装
which ss
ss --version
# Ubuntu/Debian安装(如果需要)
sudo apt-get install iproute2
# CentOS/RHEL/Fedora安装
sudo yum install iproute
# Arch Linux
sudo pacman -S iproute2
# 验证安装
ss --help
高级用法
1. 使用BPF过滤器
# 使用BPF(Berkeley Packet Filter)语法
ss -tn '( dst 192.168.1.0/24 and port 80 )'
# 查看所有到192.168.1.100的HTTP连接
ss -t '( dst 192.168.1.100 and dport = :80 )'
2. 查看连接的内存使用
# 显示每个连接的缓冲区使用情况
ss -mt
# 显示TCP内存使用统计
cat /proc/net/sockstat
3. 监控网络连接变化脚本
#!/bin/bash
# 网络连接监控脚本
LOG_FILE="/var/log/connection_monitor.log"
INTERVAL=10 # 监控间隔(秒)
echo "=== 网络连接监控开始于 $(date) ===" >> $LOG_FILE
while true; do
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
# 统计各种状态的TCP连接数
TCP_STATS=$(ss -t -a | tail -n +2 | awk '{print $1}' | sort | uniq -c)
# 获取连接总数
TOTAL_CONN=$(ss -t -a | tail -n +2 | wc -l)
# 获取ESTABLISHED连接数
ESTAB_CONN=$(ss -t state established | tail -n +2 | wc -l)
echo "[$TIMESTAMP] 总连接数: $TOTAL_CONN, ESTABLISHED: $ESTAB_CONN" >> $LOG_FILE
echo "$TCP_STATS" | while read count state; do
echo " $state: $count" >> $LOG_FILE
done
# 如果ESTABLISHED连接数异常,发出警告
if [ $ESTAB_CONN -gt 1000 ]; then
echo "[$TIMESTAMP] [警告] ESTABLISHED连接数异常: $ESTAB_CONN" >> $LOG_FILE
# 可以添加邮件通知等
fi
sleep $INTERVAL
done
相关命令