ss命令Linux網絡狀態工具

ss是Socket Statistics的縮寫。顧名思義,ss命令可以用來獲取socket統計信息,它可以顯示和netstat類似的內容。但ss的優勢在於它能夠顯示更多更詳細的有關TCP和連接狀態的信息,而且比netstat更快速更高效。ss命令是CentOS 7,Ubuntu16.04以後的版本中iproute2軟件包的一部分,默認已經安裝。
當服務器的socket連接數量變得非常大時,無論是使用netstat命令還是直接cat /proc/net/tcp,執行速度都會很慢。可能你不會有切身的感受,但請相信我,當服務器維持的連接達到上萬個的時候,使用netstat等於浪費 生命,而用ss纔是節省時間。
天下武功唯快不破。ss快的祕訣在於,它利用到了TCP協議棧中tcp_diag。tcp_diag是一個用於分析統計的模塊,可以獲得Linux 內核中第一手的信息,這就確保了ss的快捷高效。當然,如果你的系統中沒有tcp_diag,ss也可以正常運行,只是效率會變得稍慢。(但仍然比 netstat要快。)

一.命令格式:

ss [參數]
ss [參數] [過濾]

命令功能:
ss(Socket Statistics的縮寫)命令可以用來獲取 socket統計信息,此命令輸出的結果類似於 netstat輸出的內容,但它能顯示更多更詳細的 TCP連接狀態的信息,且比 netstat 更快速高效。它使用了 TCP協議棧中 tcp_diag(是一個用於分析統計的模塊),能直接從獲得第一手內核信息,這就使得 ss命令快捷高效。在沒有 tcp_diag,ss也可以正常運行。

命令參數:
----------------------------------------------------------------------
-h, --help 幫助信息
-V, --version 程序版本信息
-n, --numeric 不解析服務名稱
-r, --resolve 解析主機名
-a, --all 顯示所有套接字(sockets)
-l, --listening 顯示監聽狀態的套接字(sockets)
-o, --options 顯示計時器信息
-e, --extended 顯示詳細的套接字(sockets)信息
-m, --memory 顯示套接字(socket)的內存使用情況
-p, --processes 顯示使用套接字(socket)的進程
-i, --info 顯示 TCP內部信息
-s, --summary 顯示套接字(socket)使用概況
-4, --ipv4 僅顯示IPv4的套接字(sockets)
-6, --ipv6 僅顯示IPv6的套接字(sockets)
-0, --packet 顯示 PACKET 套接字(socket)
-t, --tcp 僅顯示 TCP套接字(sockets)
-u, --udp 僅顯示 UCP套接字(sockets)
-d, --dccp 僅顯示 DCCP套接字(sockets)
-w, --raw 僅顯示 RAW套接字(sockets)
-x, --unix 僅顯示 Unix套接字(sockets)
-f, --family=FAMILY 顯示 FAMILY類型的套接字(sockets),FAMILY可選,支持 unix, inet, inet6, link, netlink
-A, --query=QUERY, --socket=QUERY

QUERY := {all|inet|tcp|udp|raw|unix|packet|netlink}[,QUERY]

-D, --diag=FILE 將原始TCP套接字(sockets)信息轉儲到文件
-F, --filter=FILE 從文件中都去過濾器信息

二、下面我講解如何使用ss命令查看各種信息。具體使用語法如下:

1.列出已建立的連接

默認情況下,如果我們運行ss命令而沒有指定其他選項,它將顯示所有已建立連接的打開的非偵聽套接字的列表,例如TCP,UDP或UNIX套接字。

[root@renwolecom ~]# ss | head -n 5
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
u_str ESTAB 0 0 * 19098 * 18222
u_str ESTAB 0 0 * 19441 * 19440
u_str ESTAB 0 0 * 19440 * 19441
u_str ESTAB 0 0 * 19396 * 19397
2.顯示監聽套接字

我們可以使用-l選項專門列出當前正在偵聽連接的套接字,而不是列出所有的套接字。

[root@renwolecom ~]# ss -lt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:http *:*
LISTEN 0 100 127.0.0.1:smtp *:*
LISTEN 0 128 *:entexthigh *:*
LISTEN 0 128 172.28.204.62:zabbix-trapper *:*
LISTEN 0 128 127.0.0.1:cslistener *:*
LISTEN 0 80 :::mysql :::*
LISTEN 0 100 ::1:smtp :::*
LISTEN 0 128 :::entexthigh :::*
在這個示例中,我們還使用-t選項只列出TCP,稍後將對此進行詳細說明。在後面的例子中,你會看到我將結合多種選擇,以快速過濾掉,從而達到我們的目的。

3.顯示進程

我們可以用-p選項打印出擁有套接字的進程或PID號。

[root@renwolecom ~]# 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的完整輸出打印出超過500行到標準輸出。所以我只列出一條結果,由此我們可以看到服務器上運行的各種Apache進程ID。

4.不解析服務名稱

默認情況下,ss只會解析端口號,例如在下面的行中,我們可以看到172.28.204.62:mysql,其中mysql被列爲本地端口。

[root@renwolecom ~]# ss
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp ESTAB 0 0 ::ffff:172.28.204.62:mysql ::ffff:172.28.204.62:38920
tcp ESTAB 0 0 ::ffff:172.28.204.62:mysql ::ffff:172.28.204.62:51598
tcp ESTAB 0 0 ::ffff:172.28.204.62:mysql ::ffff:172.28.204.62:51434
tcp ESTAB 0 0 ::ffff:172.28.204.62:mysql ::ffff:172.28.204.62:36360
但是,如果我們指定-n選項,看到的是端口號而不是服務名稱。

[root@renwolecom ~]# ss -n
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp ESTAB 0 0 ::ffff:172.28.204.62:3306 ::ffff:172.28.204.62:38920
tcp ESTAB 0 0 ::ffff:172.28.204.62:3306 ::ffff:172.28.204.62:51598
tcp ESTAB 0 0 ::ffff:172.28.204.62:3306 ::ffff:172.28.204.62:51434
tcp ESTAB 0 0 ::ffff:172.28.204.62:3306 ::ffff:172.28.204.62:36360
現在顯示3306,而非mysql,因爲禁用了主機名和端口的所有名稱解析。另外你還可以查看/etc/services得到所有服務對應的端口列表。

5.解析數字地址/端口

用-r選項可以解析IP地址和端口號。用此方法可以列出172.28.204.62服務器的主機名。

[root@renwolecom ~]# ss -rNetid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp ESTAB 0 0 renwolecom:mysql renwolecom:48134
6.IPv4套接字

我們可以通過-4選項只顯示與IPv4套接字對應的信息。在下面的例子中,我們還使用-l選項列出了在IPv4地址上監聽的所有內容。

[root@renwolecom ~]# ss -l4
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp LISTEN 0 128 *:http *:*
tcp LISTEN 0 100 127.0.0.1:smtp *:*
tcp LISTEN 0 128 *:entexthigh *:*
tcp LISTEN 0 128 172.28.204.62:zabbix-trapper *:*
tcp LISTEN 0 128 127.0.0.1:cslistener *:*
7.IPv6套接字

同樣,我們可以使用-6選項只顯示與IPv6套接字相關信息。在下面的例子中,我們還使用-l選項列出了在IPv6地址上監聽的所有內容。

[root@renwolecom ~]# ss -l6
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
udp UNCONN 0 0 :::ipv6-icmp :::*
udp UNCONN 0 0 :::ipv6-icmp :::*
udp UNCONN 0 0 :::21581 :::*
tcp LISTEN 0 80 :::mysql :::*
tcp LISTEN 0 100 ::1:smtp :::*
tcp LISTEN 0 128 :::entexthigh :::*
8.只顯示TCP

-t選項只顯示TCP套接字。當與-l結合只打印出監聽套接字時,我們可以看到所有在TCP上偵聽的內容。

[root@renwolecom ~]# ss -lt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:http *:*
LISTEN 0 100 127.0.0.1:smtp *:*
LISTEN 0 128 *:entexthigh *:*
LISTEN 0 128 172.28.204.62:zabbix-trapper *:*
LISTEN 0 128 127.0.0.1:cslistener *:*
LISTEN 0 80 :::mysql :::*
LISTEN 0 100 ::1:smtp :::*
LISTEN 0 128 :::entexthigh :::*
9.顯示UDP

-u選項可用於僅顯示UDP套接字。由於UDP是一種無連接的協議,因此只運行-u選項將不顯示輸出,我們可以將它與-a或-l選項結合使用,來查看所有偵聽UDP套接字,如下所示:

[root@renwolecom ~]# ss -ul
State Recv-Q Send-Q Local Address:Port Peer Address:Port
UNCONN 0 0 *:sunwebadmins *:*
UNCONN 0 0 *:etlservicemgr *:*
UNCONN 0 0 *:dynamid *:*
UNCONN 0 0 *:9003 *:*
UNCONN 0 0 *:9004 *:*
UNCONN 0 0 127.0.0.1:terabase *:*
UNCONN 0 0 *:56803 *:*
10. Unix套接字

-x選項只能用來顯示unix域套接字。

[root@renwolecom ~]# ss -x
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
u_str ESTAB 0 0 /tmp/zabbix_server_preprocessing.sock 23555 * 21093
u_str ESTAB 0 0 /tmp/zabbix_server_ipmi.sock 20155 * 19009
u_str ESTAB 0 0 /tmp/zabbix_server_preprocessing.sock 19354 * 22573
u_str ESTAB 0 0 /tmp/zabbix_server_preprocessing.sock 21844 * 19375
...
11.顯示所有信息

-a選項顯示所有的監聽和非監聽套接字,在TCP的情況下,這意味着已建立的連接。這個選項與其他的組合很有用,例如可以添加-a選項顯示所有的UDP套接字,默認情況下只有-u選項我們看不到多少信息。

[root@renwolecom ~]# ss -u
Recv-Q Send-Q Local Address:Port Peer Address:Port
0 0 172.28.204.66:36371 8.8.8.8:domain
[root@renwolecom ~]# ss -ua
State Recv-Q Send-Q Local Address:Port Peer Address:Port
UNCONN 0 0 *:sunwebadmins *:*
UNCONN 0 0 *:etlservicemgr *:*
UNCONN 0 0 *:dynamid *:*
UNCONN 0 0 *:9003 *:*
UNCONN 0 0 *:9004 *:*
UNCONN 0 0 127.0.0.1:terabase *:*
UNCONN 0 0 *:56803 *:*
ESTAB 0 0 172.28.204.66:36371 8.8.8.8:domain
12.顯示套接字內存使用情況

-m選項可用於顯示每個套接字使用的內存量。

[root@renwolecom ~]# ss -ltm
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:http *:*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)
LISTEN 0 128 *:entexthigh *:*skmem:(r0,rb87380,t0,tb16384,f0,w0,o0,bl0)
LISTEN 0 128 172.28.204.62:zabbix-trapper *:*skmem:(r0,rb87380,t0,tb16384,f0,w0,o0,bl0)
LISTEN 0 128 127.0.0.1:cslistener *:*skmem:(r0,rb87380,t0,tb16384,f0,w0,o0,bl0)
LISTEN 0 80 :::mysql :::*skmem:(r0,rb87380,t0,tb16384,f0,w0,o0,bl0)
LISTEN 0 100 ::1:smtp :::*skmem:(r0,rb87380,t0,tb16384,f0,w0,o0,bl0)
LISTEN 0 128 :::entexthigh :::*skmem:(r0,rb87380,t0,tb16384,f0,w0,o0,bl0)
13.顯示TCP內部信息

我們可以使用-i選項請求額外的內部TCP信息。

[root@renwolecom ~]# ss -lti
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:chimera-hwm *:* bbr cwnd:10
LISTEN 0 128 *:etlservicemgr *:* bbr cwnd:10
LISTEN 0 128 172.28.204.66:27017 *:* bbr cwnd:10
LISTEN 0 128 127.0.0.1:27017 *:* bbr cwnd:10
LISTEN 0 128 *:dynamid *:* bbr cwnd:10
LISTEN 0 128 *:9003 *:* bbr cwnd:10
LISTEN 0 128 *:9004 *:* bbr cwnd:10
LISTEN 0 128 *:http *:* bbr cwnd:10
LISTEN 0 128 *:ssh *:* bbr cwnd:10
LISTEN 0 100 127.0.0.1:smtp *:* bbr cwnd:10
LISTEN 0 128 *:sunwebadmins *:* bbr cwnd:10
LISTEN 0 128 :::ssh :::* bbr cwnd:10
在每個偵聽套接字下面,我們可以看到更多信息。注意:-i選項不適用於UDP,如果您指定-u,而非-t,則不會顯示這些額外的信息。

14.顯示統計信息

我們可以使用-s選項快速查看統計數據。

[root@renwolecom ~]# ss -s
Total: 798 (kernel 1122)
TCP: 192 (estab 99, closed 81, orphaned 0, synrecv 0, timewait 1/0), ports 0

Transport Total IP IPv6
* 1122 - -
RAW 1 0 1
UDP 0 0 0
TCP 111 59 52
INET 112 59 53
FRAG 0 0 0
這使我們能夠快速看到已建立連接的總數,及各種類型的套接字的計數和IPv4或IPv6的使用情況。

15.基於狀態的過濾器

我們可以指定一個套接字的狀態,只打印這個狀態下的套接字。例如,我們可以指定包括已建立, established, syn-sent, syn-recv, fin-wait-1, fin-wait-2, time-wait, closed, closed-wait, last-ack監聽和關閉等狀態。以下示例顯示了所有建立的TCP連接。爲了生成這個,我通過SSH連接到了服務器,並從Apache加載了一個網頁。然後我們可以看到與Apache的連接迅速轉變爲等待時間。

[root@renwolecom ~]# ss -t state established
Recv-Q Send-Q Local Address:Port Peer Address:Port
0 52 172.28.204.67:ssh 123.125.71.38:49518
0 0 ::ffff:172.28.204.67:http ::ffff:123.125.71.38:49237
[root@renwolecom ~]# ss -t state established
Recv-Q Send-Q Local Address:Port Peer Address:Port
0 0 172.28.204.67:ssh 103.240.143.126:55682
0 52 172.28.204.67:ssh 123.125.71.38:49518
0 0 ::ffff:172.28.204.67:http ::ffff:123.125.71.38:49262
16.根據端口號進行過濾

可以通過過濾還可以列出小於(lt),大於(gt),等於(eq),不等於(ne),小於或等於(le),或大於或等於(ge)的所有端口。

例如,以下命令顯示端口號爲500或以下的所有偵聽端口:

[root@renwolecom ~]# ss -ltn sport le 500
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:80 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 100 ::1:25 :::*
爲了進行比較,我們可以執行相反的操作,並查看大於500的所有端口:

[root@renwolecom ~]# ss -ltn sport gt 500
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:12002 *:*
LISTEN 0 128 172.28.204.62:10051 *:*
LISTEN 0 128 127.0.0.1:9000 *:*
LISTEN 0 80 :::3306 :::*
LISTEN 0 128 :::12002 :::*
我們還可以根據源或目標端口等項進行篩選,例如,我們搜索具有SSH源端口運行的TCP套接字:

[root@renwolecom ~]# ss -t '( sport = :ssh )'
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 172.28.204.66:ssh 123.125.71.38:50140
17.顯示SELinux上下文

-Z與-z選項可用於顯示套接字的SELinux安全上下文。 在下面的例子中,我們使用-t和-l選項來列出偵聽的TCP套接字,使用-Z選項我們也可以看到SELinux的上下文。

[root@renwolecom ~]# 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 172.28.204.62: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))
18.顯示版本號

-v選項可用於顯示ss命令的特定版本信息,在這種情況下,我們可以看到提供ss的iproute包的版本。

[root@renwolecom ~]# ss -v
ss utility, iproute2-ss130716
19.顯示幫助文檔信息

-h選項可用於顯示有關ss命令的進一步的幫助,如果需要對最常用的一些選項進行簡短說明,則可以將其用作快速參考。 請注意:這裏並未輸入完整列表。

[root@renwolecom ~]# ss -h
Usage: ss [ OPTIONS ]
20.顯示擴展信息

我們可以使用-e選項來顯示擴展的詳細信息,如下所示,我們可以看到附加到每條行尾的擴展信息。

[root@renwolecom ~]# ss -lte
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:sunrpc *:* ino:16090 sk:ffff880000100000 <->
LISTEN 0 5 172.28.204.62: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 <->
21.顯示計時器信息

-o選項可用於顯示計時器信息。該信息向我們展示了諸如重新傳輸計時器值、已經發生的重新傳輸的數量以及已發送的keepalive探測的數量。

[root@renwolecom ~]# ss -to
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 52 172.28.204.67:ssh 123.125.71.38:49518timer:(on,406ms,0)
LAST-ACK 0 1 172.28.204.67:ssh 103.240.143.126:49603timer:(on,246ms,0)
總結:

現在你應該對ss有了初步的認識。如果你想使用ss命令快速檢查有關套接字的各種信息,建議你查閱ss的相關手冊。

 

參考:

https://blog.51cto.com/net881004/2166100

https://blog.51cto.com/shunsheng/1770421

https://www.cnblogs.com/peida/archive/2013/03/11/2953420.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章