套接字统计 (ss) 命令与 netstat 类似,因为它用于显示有用的网络套接字信息。
一段时间以来,netstat 手册页已经指出“此程序已过时。netstat 的替代品是 ss.”,因此这将是一个有用的命令。
幸运的是,许多选项与 netstat 使用的选项相似,但是我们将看到一些差异。
ss 命令是 CentOS 7 Linux 中 iproute 包的一部分,默认安装。
我们将在这里使用的 ss 命令语法如下所示,本质上我们可以指定可选的标志和过滤器。
ss [options] [ FILTER ]
如何使用 ss 命令示例
- 列出已建立的连接
默认情况下,如果我们在没有指定更多选项的情况下运行 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 之类的内容中以方便阅读,或者在末尾添加其他选项只显示你想要的。
- 显示监听套接字
我们可以使用 -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。
- 显示进程
我们可以使用 -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))
- 不要解析服务名称
默认情况下 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 文件以查看哪些端口映射到哪些服务的完整列表。
- 解析数字地址/端口
我们也可以做相反的事情,使用 -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
- IPv4 套接字
我们可以使用 -4 选项只显示对应于 IPv4 套接字的信息。在下面的示例中,我们还使用 -l 选项列出所有侦听 IPv4 地址的内容。
- 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 *:*
- IPv6 套接字
同样,我们可以使用 -6 选项仅显示与 IPv6 套接字相关的信息。在下面的示例中,我们还使用 -l 选项列出所有侦听 IPv6 地址的内容。
- 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 :::*
- 只显示 TCP相关的
-t 选项可用于仅显示 TCP 套接字。当与 -l 结合仅打印出侦听套接字时,我们可以看到所有侦听 TCP 的内容。
- 只显示 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 :::*
- 只显示UDP相关的
-u 选项可用于仅显示 UDP 套接字。由于 UDP 是无连接协议,因此仅使用 -u 选项运行将不会显示任何输出。我们可以将其与 -a 或者 -l 选项结合使用以查看所有侦听 UDP 套接字,如下所示。
- 只显示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 *:*
- Unix 套接字
-x 选项只能用于显示 unix 域套接字。
- 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 ...
- 显示所有信息
-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 :::*
- 显示套接字内存使用情况
-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)
- 显示内部 TCP 信息
我们可以使用 -i info 选项请求另外的内部 TCP 信息。
- 显示内部 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,则不会出现此另外信息。
- 显示摘要
我们可以使用 -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.
- 基于状态过滤
我们可以指定套接字的状态以仅打印出处于此状态的套接字。例如,我们可以指定状态包括已建立、同步发送、同步接收、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
- 基于端口号的过滤器
也可以进行过滤,列出所有小于(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
- 显示 SELinux 上下文
-Z 和 -z 选项可用于显示套接字的 SELinux 安全上下文。在下面的示例中,我们还使用 -t 和 -l 选项仅列出侦听 TCP 套接字,使用 -Z 选项我们还可以查看 SELinux 上下文。
- 显示 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))
- 显示版本
-v 选项可用于显示 ss 命令的特定版本信息,在本例中我们看到提供 ss 的 iproute 包的版本。
- 显示版本
[jack@onitroad ~]# ss -v ss utility, iproute2-ss130716
- 打印帮助文档
-h 选项可用于显示有关 ss 命令的更多帮助,如果我们需要一些最常用选项的简短说明,最好将其用作快速参考。请注意,为简洁起见,此处未包含完整输出。
- 打印帮助文档
[jack@onitroad ~]# ss -h Usage: ss [ OPTIONS ]
- 显示扩展信息
我们可以使用 -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 <->
- 显示定时器信息
-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)