Linux ss 指令

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 的应用场景广泛,以下是几个典型用途:

  1. 网络连接监控:查看活动 TCP/UDP 连接,分析通信状态。
  2. 端口管理:检查监听端口,识别服务或安全风险。
  3. 性能分析:统计网络流量和连接状态,优化系统。
  4. 故障排查:诊断连接失败、端口冲突等问题。
  5. 安全审计:检测可疑连接或未授权的监听端口。

️ 基础用法与示例

以下通过具体示例介绍 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 提供详细的网络信息,操作不当可能导致误判或性能影响。以下是一些关键注意事项:

  1. 权限要求:使用 -p 或查看详细连接信息需要 root 权限。
  2. 性能开销:频繁查询大量连接可能增加系统负载,建议合理使用。
  3. 解析主机名:默认解析 IP 为主机名(慢),建议用 -n 提高速度。
  4. 过滤精度:复杂过滤表达式需正确语法,避免遗漏关键信息。
  5. 安全监控:定期检查监听端口和外部连接,防范潜在威胁。
  6. 工具对比: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 都能提供强大支持。

更多技术分享,关注公众号:halugin

你可能感兴趣的:(Linux指令,linux,运维)