Linux ss 命令示例

套接字统计 (ss) 命令与 netstat 类似,因为它用于显示有用的网络套接字信息。

一段时间以来,netstat 手册页已经指出“此程序已过时。netstat 的替代品是 ss.”,因此这将是一个有用的命令。

幸运的是,许多选项与 netstat 使用的选项相似,但是我们将看到一些差异。

ss 命令是 CentOS 7 Linux 中 iproute 包的一部分,默认安装。

我们将在这里使用的 ss 命令语法如下所示,本质上我们可以指定可选的标志和过滤器。

ss [options] [ FILTER ]

如何使用 ss 命令示例

    1. 列出已建立的连接
      默认情况下,如果我们在没有指定更多选项的情况下运行 ss 命令,它将显示已建立连接的打开的非侦听套接字列表,例如 TCP、UDP 或者 UNIX 套接字。
[jack@onitroad ~]# ss | head -n 5
Netid  State      Recv-Q Send-Q Local Address:Port      Peer Address:Port
u_str  ESTAB      0      0       * 23740                * 23739
u_str  ESTAB      0      0       * 23707                * 23706
u_str  ESTAB      0      0       * 87021                * 88383
u_str  ESTAB      0      0       * 17056                * 17112

在上面的示例中,我限制了输出,在我的服务器上,我通过运行 ss 命令打印了 500 多行,因此我们可能希望将其通过管道传输到诸如 less 之类的内容中以方便阅读,或者在末尾添加其他选项只显示你想要的。

    1. 显示监听套接字
      我们可以使用 -l 选项专门列出当前正在侦听连接的套接字,而不是列出所有套接字。
[jack@onitroad ~]# ss -lt
State       Recv-Q Send-Q  Local Address:Port                Peer Address:Port
LISTEN      0      2                   *:kerberos-adm        *:*
LISTEN      0      128                 *:sunrpc              *:*
LISTEN      0      5                   *:kpasswd             *:*
LISTEN      0      10       192.168.1.14:domain              *:*
LISTEN      0      10          127.0.0.1:domain              *:*
LISTEN      0      5       192.168.122.1:domain              *:*
LISTEN      0      128                 *:ssh                 *:*

在这个例子中,我们还使用了 -t 选项来只列出 TCP。

    1. 显示进程
      我们可以使用 -p 选项打印出拥有套接字的进程或者 PID 号。
[jack@onitroad ~]# ss -pl
Netid  State      Recv-Q Send-Q Local Address:Port     Peer Address:Port
tcp    LISTEN     0      128    :::http                :::*                 users:(("httpd",pid=10522,fd=4),("httpd",pid=10521,fd=4),("httpd",pid=10520,fd=4),("httpd",pid=10519,fd=4),("httpd",pid=10518,fd=4),("httpd",pid=10516,fd=4))
    1. 不要解析服务名称
      默认情况下 ss 将只解析我们之前看到的端口号,例如在下面的行中我们可以看到 192.168.1.14:ssh 其中 ssh 被列为本地端口。
[jack@onitroad ~]# ss
Netid  State      Recv-Q Send-Q Local Address:Port    Peer Address:Port
tcp    ESTAB      0      64     192.168.1.14:ssh      192.168.1.191:57091

但是,如果我们指定 -n 选项,则不会进行此解析,而是会看到端口号而不是服务名称。

[jack@onitroad ~]# ss -n
Netid  State      Recv-Q Send-Q Local Address:Port    Peer Address:Port
tcp    ESTAB      0      0      192.168.1.14:22       192.168.1.191:57091

请注意,现在显示的是 :22 而不是 :ssh,因为我们已禁用主机名和端口的所有名称解析。我们可以检查 /etc/services 文件以查看哪些端口映射到哪些服务的完整列表。

    1. 解析数字地址/端口
      我们也可以做相反的事情,使用 -r 选项解析 IP 地址和端口号。有了这个,我们现在可以看到列出的 192.168.1.14 服务器的主机名。
[jack@onitroad ~]# ss -r
Netid  State      Recv-Q Send-Q Local Address:Port         Peer Address:Port
tcp    ESTAB      0      64     centos7.example.com:ssh    192.168.1.191:57091
    1. IPv4 套接字
      我们可以使用 -4 选项只显示对应于 IPv4 套接字的信息。在下面的示例中,我们还使用 -l 选项列出所有侦听 IPv4 地址的内容。
[jack@onitroad ~]# ss -l4
Netid  State      Recv-Q Send-Q     Local Address:Port        Peer Address:Port
udp    UNCONN     0      0              127.0.0.1:323         *:*
udp    UNCONN     0      0          192.168.122.1:domain      *:*
udp    UNCONN     0      0               *%virbr0:bootps      *:*
udp    UNCONN     0      0                      *:bootpc      *:*
tcp    LISTEN     0      128                    *:sunrpc      *:*
tcp    LISTEN     0      5          192.168.122.1:domain      *:*
tcp    LISTEN     0      128                    *:ssh         *:*
tcp    LISTEN     0      128            127.0.0.1:ipp         *:*
tcp    LISTEN     0      100            127.0.0.1:smtp        *:*
    1. IPv6 套接字
      同样,我们可以使用 -6 选项仅显示与 IPv6 套接字相关的信息。在下面的示例中,我们还使用 -l 选项列出所有侦听 IPv6 地址的内容。
[jack@onitroad ~]# ss -l6
Netid  State      Recv-Q Send-Q     Local Address:Port          Peer Address:Port
udp    UNCONN     0      0                     :::ipv6-icmp     :::*
udp    UNCONN     0      0                     :::22834         :::*
udp    UNCONN     0      0                    ::1:323           :::*
tcp    LISTEN     0      128                   :::sunrpc        :::*
tcp    LISTEN     0      128                   :::http          :::*
tcp    LISTEN     0      128                   :::ssh           :::*
tcp    LISTEN     0      128                  ::1:ipp           :::*
tcp    LISTEN     0      100                  ::1:smtp          :::*
    1. 只显示 TCP相关的
      -t 选项可用于仅显示 TCP 套接字。当与 -l 结合仅打印出侦听套接字时,我们可以看到所有侦听 TCP 的内容。
[jack@onitroad ~]# ss -lt
State      Recv-Q Send-Q      Local Address:Port       Peer Address:Port
LISTEN     0      128                     *:sunrpc     *:*
LISTEN     0      5           192.168.122.1:domain     *:*
LISTEN     0      128                     *:ssh        *:*
LISTEN     0      128             127.0.0.1:ipp        *:*
LISTEN     0      100             127.0.0.1:smtp       *:*
LISTEN     0      128                    :::sunrpc    :::*
LISTEN     0      128                    :::http      :::*
LISTEN     0      128                    :::ssh       :::*
LISTEN     0      128                   ::1:ipp       :::*
LISTEN     0      100                   ::1:smtp      :::*
    1. 只显示UDP相关的
      -u 选项可用于仅显示 UDP 套接字。由于 UDP 是无连接协议,因此仅使用 -u 选项运行将不会显示任何输出。我们可以将其与 -a 或者 -l 选项结合使用以查看所有侦听 UDP 套接字,如下所示。
[jack@onitroad ~]# ss -ul
State       Recv-Q Send-Q  Local Address:Port       Peer Address:Port
UNCONN      0      0                   *:mdns       *:*
UNCONN      0      0                   *:kpasswd    *:*
UNCONN      0      0                   *:839        *:*
UNCONN      0      0                   *:36812      *:*
UNCONN      0      0       192.168.122.1:domain     *:*
UNCONN      0      0        192.168.1.14:domain     *:*
    1. Unix 套接字
      -x 选项只能用于显示 unix 域套接字。
[jack@onitroad ~]# ss -x
Netid  State      Recv-Q Send-Q Local Address:Port           Peer Address:Port
u_str  ESTAB      0      0      @/tmp/.X11-unix/X0 27818     * 27817
u_str  ESTAB      0      0      @/tmp/.X11-unix/X0 26656     * 26655
u_str  ESTAB      0      0       * 28344                     * 26607
u_str  ESTAB      0      0       * 24704                     * 24705
u_str  ESTAB      0      0      @/tmp/.X11-unix/X0 25195     * 24086
u_str  ESTAB      0      0      @/tmp/dbus-CRqRiw6V 28388    * 28693
...
    1. 显示所有信息
      -a 选项显示所有监听和非监听套接字。在 TCP 的情况下,这意味着已建立连接。此选项对于与其他选项组合很有用,例如显示我们可以添加 -a 的所有 UDP 套接字,因为默认情况下仅使用 -u 选项我们看不到太多信息。
[jack@onitroad ~]# ss -u
Recv-Q Send-Q       Local Address:Port           Peer Address:Port
0      0             192.168.1.14:56658          129.250.35.251:ntp
[jack@onitroad ~]# ss -ua
State       Recv-Q Send-Q  Local Address:Port           Peer Address:Port
UNCONN      0      0                   *:mdns           *:*
UNCONN      0      0           127.0.0.1:323            *:*
ESTAB       0      0        192.168.1.14:56658          129.250.35.251:ntp
UNCONN      0      0                   *:21014          *:*
UNCONN      0      0                   *:60009          *:*
UNCONN      0      0       192.168.122.1:domain         *:*
UNCONN      0      0            *%virbr0:bootps         *:*
UNCONN      0      0                   *:bootpc         *:*
UNCONN      0      0                 ::1:323           :::*
UNCONN      0      0                  :::43209         :::*
    1. 显示套接字内存使用情况
      -m 选项可用于显示每个套接字正在使用的内存量。
[jack@onitroad ~]# ss -ltm
State      Recv-Q Send-Q                Local Address:Port       Peer Address:Port
LISTEN     0      128                               *:sunrpc     *:*
  skmem:(r0,rb87380,t0,tb16384,f0,w0,o0,bl0)
LISTEN     0      5                     192.168.122.1:domain     *:*
  skmem:(r0,rb87380,t0,tb16384,f0,w0,o0,bl0)
LISTEN     0      128                               *:ssh        *:*
  skmem:(r0,rb87380,t0,tb16384,f0,w0,o0,bl0)
LISTEN     0      128                       127.0.0.1:ipp        *:*
  skmem:(r0,rb87380,t0,tb16384,f0,w0,o0,bl0)
LISTEN     0      100                       127.0.0.1:smtp       *:*
  skmem:(r0,rb87380,t0,tb16384,f0,w0,o0,bl0)
    1. 显示内部 TCP 信息
      我们可以使用 -i info 选项请求另外的内部 TCP 信息。
[jack@onitroad ~]# ss -lti
State      Recv-Q Send-Q                Local Address:Port                        Peer Address:Port
LISTEN     0      128                               *:sunrpc                                    *:*
  cubic rto:1000 mss:536 cwnd:10 lastsnd:373620 lastrcv:373620 lastack:373620
LISTEN     0      5                     192.168.122.1:domain                                    *:*
  cubic rto:1000 mss:536 cwnd:10 lastsnd:373620 lastrcv:373620 lastack:373620
LISTEN     0      128                               *:ssh                                       *:*
  cubic rto:1000 mss:536 cwnd:10 segs_in:2 lastsnd:373620 lastrcv:373620 lastack:373620
LISTEN     0      128                       127.0.0.1:ipp                                       *:*
  cubic rto:1000 mss:536 cwnd:10 lastsnd:373620 lastrcv:373620 lastack:373620
LISTEN     0      100                       127.0.0.1:smtp                                      *:*
  cubic rto:1000 mss:536 cwnd:10 lastsnd:373620 lastrcv:373620 lastack:373620

在每个侦听套接字下面,我们可以看到其他信息。请注意,-i 选项不适用于 UDP,如果我们改为指定 -u 而不是 -t,则不会出现此另外信息。

    1. 显示摘要
      我们可以使用 -s 选项快速查看统计信息。
[jack@onitroad ~]# ss -s
Total: 1253 (kernel 1721)
TCP:   13 (estab 1, closed 2, orphaned 0, synrecv 0, timewait 0/0), ports 0
Transport Total     IP        IPv6
*   1721      -         
RAW     1         0         1
UDP     9         7         2
TCP     11        6         5
INET    21        13        8
FRAG    0         0         0

这使我们能够快速查看已建立连接的总数、每种类型的套接字的数量以及是否使用 IPv4 或者 IPv6.

    1. 基于状态过滤
      我们可以指定套接字的状态以仅打印出处于此状态的套接字。例如,我们可以指定状态包括已建立、同步发送、同步接收、fin-wait-1、fin-wait-2、时间等待、关闭、关闭等待、最后确认、监听和关闭。以下示例显示了所有已建立的 TCP 连接。为了生成它,我通过 SSH 连接到服务器,并从 Apache 加载了一个网页。然后我们可以看到与 Apache 的连接迅速更改为 time-wait。
[jack@onitroad ~]# ss -t state established
Recv-Q Send-Q               Local Address:Port           Peer Address:Port
0      64                     192.168.1.14:ssh         192.168.1.191:57091
0      0              ::ffff:192.168.1.14:http   ::ffff:192.168.1.191:57373
0      0              ::ffff:192.168.1.14:http   ::ffff:192.168.1.191:57372
[jack@onitroad ~]# ss -t state time-wait
Recv-Q Send-Q               Local Address:Port           Peer Address:Port
0      0              ::ffff:192.168.1.14:http   ::ffff:192.168.1.191:57373
0      0              ::ffff:192.168.1.14:http   ::ffff:192.168.1.191:57372
    1. 基于端口号的过滤器
      也可以进行过滤,列出所有小于(lt)、大于(gt)、等于(eq)、不等于(ne)、小于等于(le)或者大于等于的端口到(ge)。
      例如,以下命令显示端口号 500 或者以下的所有侦听端口。
[jack@onitroad ~]# ss -ltn sport le 500
State       Recv-Q Send-Q    Local Address:Port      Peer Address:Port
LISTEN      0      128                   *:111       *:*
LISTEN      0      5         192.168.122.1:53        *:*
LISTEN      0      128                   *:22        *:*
LISTEN      0      100           127.0.0.1:25        *:*
LISTEN      0      128                  :::111       :::*
LISTEN      0      128                  :::22        :::*
LISTEN      0      100                 ::1:25        :::*

为了进行比较,我们可以执行相反的操作,并使用“gt”查看大于 500 的所有端口

[jack@onitroad ~]# ss -ltn sport gt 500
State       Recv-Q Send-Q    Local Address:Port       Peer Address:Port
LISTEN      0      128           127.0.0.1:631        *:*
LISTEN      0      128                 ::1:631        :::*

我们还可以根据源或者目标端口等项目进行过滤,例如下面我们搜索具有 ssh 源端口(运动)的 TCP 套接字。

[jack@onitroad ~]# ss -t '( sport = :ssh )'
State       Recv-Q Send-Q       Local Address:Port         Peer Address:Port
ESTAB       0      64             192.168.1.14:ssh        192.168.1.191:57091
    1. 显示 SELinux 上下文
      -Z 和 -z 选项可用于显示套接字的 SELinux 安全上下文。在下面的示例中,我们还使用 -t 和 -l 选项仅列出侦听 TCP 套接字,使用 -Z 选项我们还可以查看 SELinux 上下文。
[jack@onitroad ~]# ss -tlZ
State      Recv-Q Send-Q     Local Address:Port     Peer Address:Port
LISTEN     0      128                    *:sunrpc     *:*                users:(("systemd",pid=1,proc_ctx=system_u:system_r:init_t:s0,fd=71))
LISTEN     0      5          192.168.122.1:domain     *:*                users:(("dnsmasq",pid=1810,proc_ctx=system_u:system_r:dnsmasq_t:s0-s0:c0.c1023,fd=6))
LISTEN     0      128                    *:ssh        *:*                users:(("sshd",pid=1173,proc_ctx=system_u:system_r:sshd_t:s0-s0:c0.c1023,fd=3))
LISTEN     0      128            127.0.0.1:ipp        *:*                users:(("cupsd",pid=1145,proc_ctx=system_u:system_r:cupsd_t:s0-s0:c0.c1023,fd=12))
LISTEN     0      100            127.0.0.1:smtp       *:*                users:(("master",pid=1752,proc_ctx=system_u:system_r:postfix_master_t:s0,fd=13))
    1. 显示版本
      -v 选项可用于显示 ss 命令的特定版本信息,在本例中我们看到提供 ss 的 iproute 包的版本。
[jack@onitroad ~]# ss -v
ss utility, iproute2-ss130716
    1. 打印帮助文档
      -h 选项可用于显示有关 ss 命令的更多帮助,如果我们需要一些最常用选项的简短说明,最好将其用作快速参考。请注意,为简洁起见,此处未包含完整输出。
[jack@onitroad ~]# ss -h
Usage: ss [ OPTIONS ]
    1. 显示扩展信息
      我们可以使用 -e 选项来显示扩展的详细信息,如下图我们可以看到添加到每行末尾的扩展信息。
[jack@onitroad ~]# ss -lte
State      Recv-Q Send-Q      Local Address:Port         Peer Address:Port
LISTEN     0      128                     *:sunrpc       *:*                 ino:16090 sk:ffff880000100000 <->
LISTEN     0      5           192.168.122.1:domain       *:*                 ino:23750 sk:ffff880073e70f80 <->
LISTEN     0      128                     *:ssh          *:*                 ino:22789 sk:ffff880073e70000 <->
LISTEN     0      128             127.0.0.1:ipp          *:*                 ino:23091 sk:ffff880073e707c0 <->
LISTEN     0      100             127.0.0.1:smtp         *:*                 ino:24659 sk:ffff880000100f80 <->
    1. 显示定时器信息
      -o 选项可用于显示计时器信息。此信息向我们显示诸如重传计时器值、已发生的重传次数以及已发送的keepalive探测次数等内容。
[jack@onitroad ~]# ss -to
State       Recv-Q Send-Q         Local Address:Port             Peer Address:Port
ESTAB       0      64              192.168.1.14:ssh              192.168.1.191:57091      timer:(on,242ms,0)
ESTAB       0      0        ::ffff:192.168.1.14:http      ::ffff:192.168.1.191:57295      timer:(keepalive,120min,0)
ESTAB       0      0        ::ffff:192.168.1.14:http      ::ffff:192.168.1.191:57296      timer:(keepalive,120min,0)
日期:2020-07-07 20:57:03 来源:oir作者:oir