Linux ss 指令
ss(Socket Statistics)是 Linux 系统中用于显示网络套接字(socket)信息的现代命令行工具,是 netstat 的继任者,性能更高、输出更简洁。它提供详细的网络连接、监听端口和协议统计信息,广泛用于网络监控、故障排查和性能分析。相比传统的 netstat,ss 直接从内核获取数据显示更快,功能更强大,适合现代 Linux 系统。
📚 什么是 ss 指令?
ss 是 Linux 系统中的一个网络诊断工具,属于 iproute2 软件包,用于显示网络套接字的状态信息,包括 TCP、UDP、UNIX 套接字等。它从内核空间直接读取数据,提供实时、准确的网络统计,取代了老旧的 netstat(来自 net-tools 包)。ss 支持丰富的过滤和输出选项,是系统管理员和开发人员分析网络连接、监控端口和排查问题的首选工具。
核心特点
- 高性能:直接从内核获取数据,速度比 netstat 快。
- 详细输出:显示 TCP/UDP 连接、监听端口、进程信息等。
- 灵活过滤:支持按状态、地址、端口等过滤套接字。
- 多协议支持:涵盖 TCP、UDP、RAW、UNIX 套接字等。
- 现代设计:与 iproute2 工具集集成,适合现代 Linux 系统。
基本语法
ss [选项] [过滤表达式]
常用选项包括:
- -t:显示 TCP 套接字。
- -u:显示 UDP 套接字。
- -a:显示所有套接字(包括监听和非监听)。
- -l:仅显示监听套接字。
- -n:以数字格式显示地址和端口(不解析为主机名)。
- -p:显示与套接字相关的进程 ID 和程序名。
- -s:显示网络统计摘要。
- -o:显示计时器信息(如 TCP 连接的超时)。
- -e:显示扩展信息(如套接字选项)。
- -4:仅显示 IPv4 套接字。
- -6:仅显示 IPv6 套接字。
过滤表达式:
- 格式:[状态] [条件]
- 例如:dst 192.168.1.100(目标地址)、sport = :80(源端口)。
注意事项
-
权限要求:某些选项(如 -p)需要 root 权限(使用 sudo)。
-
软件包:ss 通常随 iproute2 预装,若缺失可安装:
sudo apt install iproute2 # Debian/Ubuntu sudo yum install iproute # CentOS/RHEL -
性能优势:比 netstat 更快,适合高负载环境。
-
输出解析:输出信息较多,建议结合 grep 或 awk 过滤。
🔧 ss 的常见用途
ss 的应用场景广泛,以下是几个典型用途:
- 网络连接监控:查看活动 TCP/UDP 连接,分析通信状态。
- 端口管理:检查监听端口,识别服务或安全风险。
- 性能分析:统计网络流量和连接状态,优化系统。
- 故障排查:诊断连接失败、端口冲突等问题。
- 安全审计:检测可疑连接或未授权的监听端口。
🛠️ 基础用法与示例
以下通过具体示例介绍 ss 的基础用法,帮助读者快速上手。以下示例假设运行在 Linux 系统(如 Ubuntu 22.04 或 CentOS 8)。
示例 1:显示所有活动连接
查看所有网络套接字(包括监听和非监听):
ss -a
-
解释:
-
-a:显示所有套接字,包括监听和已建立的连接。
-
输出示例:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* tcp ESTAB 0 0 192.168.1.100:22 192.168.1.101:12345 udp UNCONN 0 0 0.0.0.0:68 0.0.0.0:*
-
-
字段说明:
- Netid:协议(tcp、udp 等)。
- State:状态(LISTEN、ESTAB 等,UDP 为 UNCONN)。
- Recv-Q / Send-Q:接收/发送队列中的数据量。
- Local Address:Port:本地地址和端口。
- Peer Address:Port:远程地址和端口。
示例 2:显示监听端口
查看所有监听的 TCP 和 UDP 端口:
ss -tuln
-
解释:
-
-t:显示 TCP 套接字。
-
-u:显示 UDP 套接字。
-
-l:仅显示监听状态。
-
-n:以数字格式显示地址和端口。
-
输出示例:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* tcp LISTEN 0 128 127.0.0.1:3306 0.0.0.0:* udp UNCONN 0 0 0.0.0.0:68 0.0.0.0:*
-
示例 3:显示进程信息
查看与套接字相关的进程:
sudo ss -tunap
-
解释:
-
-p:显示进程 ID 和程序名。
-
输出示例:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3)) tcp ESTAB 0 0 192.168.1.100:22 192.168.1.101:12345 users:(("sshd",pid=5678,fd=4))
-
-
注意:需要 root 权限。
示例 4:显示网络统计摘要
查看网络协议统计信息:
ss -s
-
解释:
-
-s:显示 TCP、UDP 等协议的统计摘要。
-
输出示例:
Total: 204 (kernel 205) TCP: 10 (estab 2, closed 5, orphaned 0, synrecv 0, timewait 3/0), ports 5 Transport Total IP IPv6 RAW 0 0 0 UDP 3 2 1 TCP 5 4 1 INET 8 6 2 FRAG 0 0 0
-
-
用途:快速了解连接数量和协议分布。
示例 5:过滤特定端口
查看使用端口 22 的连接:
ss -t sport = :22
-
解释:
-
sport = :22:过滤源端口为 22 的套接字。
-
输出示例:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* tcp ESTAB 0 0 192.168.1.100:22 192.168.1.101:12345
-
示例 6:过滤特定 IP
查看与特定 IP 的连接:
ss -tn dst 192.168.1.101
-
解释:
-
dst 192.168.1.101:过滤目标地址为 192.168.1.101 的 TCP 连接。
-
输出示例:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port tcp ESTAB 0 0 192.168.1.100:22 192.168.1.101:12345
-
🚀 高级用法
ss 提供多种高级功能,适合复杂网络诊断和监控场景。以下介绍一些高级用法及其实现方法。
🛡️ 1. 过滤特定状态的连接
查看 TCP 连接中状态为 ESTABLISHED 的连接:
ss -t state established
-
解释:
-
state established:过滤状态为 ESTABLISHED 的 TCP 连接。
-
其他状态:listening、syn-sent、syn-recv、time-wait 等。
-
输出示例:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port tcp ESTAB 0 0 192.168.1.100:22 192.168.1.101:12345
-
🔍 2. 显示计时器信息
查看 TCP 连接的计时器详情:
ss -tno
-
解释:
-
-o:显示计时器信息,如超时和重传。
-
输出示例:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port tcp ESTAB 0 0 192.168.1.100:22 192.168.1.101:12345 timer:(keepalive,119min,0)
-
-
用途:分析连接超时或网络延迟。
🔄 3. 过滤 IPv4 或 IPv6 连接
仅显示 IPv4 连接:
ss -t4
或仅显示 IPv6 连接:
ss -t6
- 解释:
- -4:限制输出为 IPv4 套接字。
- -6:限制输出为 IPv6 套接字。
- 适合针对特定协议栈排查问题。
⚡ 4. 复杂过滤表达式
结合多个条件过滤连接:
ss -t 'dst 192.168.1.101 and sport = :22'
-
解释:
-
dst 192.168.1.101:目标地址为 192.168.1.101。
-
sport = :22:源端口为 22。
-
输出示例:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port tcp ESTAB 0 0 192.168.1.100:22 192.168.1.101:12345
-
🔐 5. 显示扩展信息
查看套接字的详细选项:
sudo ss -tune
-
解释:
-
-e:显示扩展信息,如套接字缓冲区大小。
-
输出示例:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* uid:0 ino:12345 sk:1
-
-
字段说明:
- uid:用户 ID。
- ino:索引节点号。
- sk:套接字标识。
⚠️ 使用 ss 时的注意事项
ss 提供详细的网络信息,操作不当可能导致误判或性能影响。以下是一些关键注意事项:
- 权限要求:使用 -p 或查看详细连接信息需要 root 权限。
- 性能开销:频繁查询大量连接可能增加系统负载,建议合理使用。
- 解析主机名:默认解析 IP 为主机名(慢),建议用 -n 提高速度。
- 过滤精度:复杂过滤表达式需正确语法,避免遗漏关键信息。
- 安全监控:定期检查监听端口和外部连接,防范潜在威胁。
- 工具对比:ss 比 netstat 更快,但输出格式不同,需适应。
🌟 高级技巧与实战案例
以下是一些高级技巧和实战案例,展示 ss 的强大功能。
🖥️ 案例 1:排查 Web 服务器问题
检查 Web 服务器(端口 80)是否正常监听:
ss -tuln | grep ":80"
-
解释:
-
验证 Apache/Nginx 是否监听 80 端口。
-
若无输出,检查服务状态:
sudo systemctl status apache2
-
📦 案例 2:监控 SSH 连接
查找所有 SSH(端口 22)连接:
sudo ss -tunap | grep ":22"
-
解释:
-
检查 SSH 连接状态和来源 IP。
-
结合 state established 过滤活跃连接:
sudo ss -t state established 'sport = :22'
-
🔒 案例 3:检测潜在安全威胁
查找可疑外部连接:
sudo ss -tunap | grep -v "127.0.0.1"
- 解释:
- 排除本地回环地址,检查外部连接。
- 关注 Process 列,识别异常进程。
📈 案例 4:分析网络性能
监控 TCP 连接状态分布:
ss -s
watch -n 5 'ss -t state established | wc -l'
- 解释:
- ss -s:显示连接统计。
- watch 每 5 秒统计 ESTABLISHED 连接数。
🔧 案例 5:自动化网络监控
编写脚本定期记录连接状态:
#!/bin/bash
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
echo "Network Status at $TIMESTAMP" >> /var/log/ss_status.log
ss -tunap >> /var/log/ss_status.log
echo "Established Connections: $(ss -t state established | wc -l)" >> /var/log/ss_status.log
添加到 cron:
sudo crontab -e
添加:
*/5 * * * * /path/to/script.sh
- 解释:
- 每 5 分钟记录网络连接和活跃连接数。
- 适合长期监控和审计。
🔗 结合其他工具
ss 常与其他工具结合,增强功能。
与 grep 结合
过滤特定 IP 或端口:
ss -tunap | grep "192.168.1.100"
与 awk 结合
提取特定字段:
ss -tunap | awk '{print $4, $5, $6}'
- 解释:提取本地地址、远程地址和进程信息。
与 watch 结合
实时监控连接:
watch -n 2 'ss -tunap'
- 解释:每 2 秒刷新网络状态。
与 netstat 结合
对比输出:
ss -tuln
netstat -tuln
- 解释:验证 ss 的高效性和准确性。
📝 总结
ss 是 Linux 系统中现代化的网络诊断工具,取代了传统的 netstat,提供更快、更简洁的套接字统计信息。该文从基础用法到高级技巧,结合具体示例和注意事项,全面介绍了 ss 的功能。无论是网络连接监控、端口管理、安全审计还是性能分析,ss 都能提供强大支持。
1503

被折叠的 条评论
为什么被折叠?



