Linux 基礎之基礎網絡ss命令

一、ss命令簡述

ss(Socket Statistics)Socket統計;ss命令可以獲取socket統計信息。它的功能和netstat類似。

1. ss命令特性

  • ss比netstat更快速源於在於它能夠顯示更爲詳細的TCP和Socket連接狀態的信息。
  • 當服務器的socket連接數量變得非常大時,無論是使用netstat命令還是直接cat /proc/net/tcp,執行速度都會很慢。
  • ss利用到了TCP協議棧中tcp_diag。tcp_diag是一個用於分析統計的模塊,可以獲得Linux 內核中最新的數據,進而就確保了ss的快速高效。(ss在沒有 tcp_diag,ss也可以正常運行)

2. ss 和 netstat 效率對比

[root@localhost ~]# time netstat -at
real    0m0.038s
user    0m0.008s
sys     0m0.013s

[root@localhost ~]# time ss -at
real    0m0.006s
user    0m0.003s
sys     0m0.003s

從上面的執行效率可以清晰地看到,ss命令的執行速度是netstat的6倍(不同環境可能執行效率不一樣),可以看到ss 命令的執行之快的優勢,體現的尤爲突出。也爲我們的工作解決執行節省時間(即使當服務器效率較低時)。

3.ss 命令的使用格式

ss 命令默認統計所有建立的連接(不包含監聽的端口),包括 tcp, udp, and unix socket 三種類型的連接;

[root@example opt]# ss --help
Usage: ss [ OPTIONS ]
       ss [ OPTIONS ] [ FILTER ]
   -h, --help          this message #幫助信息
   -V, --version       output version information # 版本信息
   -n, --numeric       don't resolve service names  #不解析服務名稱
   -r, --resolve       resolve host names   # 解析主機名,把 IP 解釋爲域名,把端口號解釋爲協議名稱
   -a, --all           display all sockets   #顯示所有Socket
   -l, --listening     display listening sockets #顯示監聽的Socket
   -o, --options       show timer information 
   -e, --extended      show detailed socket information #顯示詳細的Socket信息
   -m, --memory        show socket memory usage #顯示Socket內存使用
   -p, --processes     show process using socket #顯示Socket 使用進程
   -i, --info          show internal TCP information #顯示內部TCP信息
   -s, --summary       show socket usage summary  #顯示socket使用總數
   -b, --bpf           show bpf filter socket information
   -E, --events        continually display sockets as they are destroyed
   -Z, --context       display process SELinux security contexts #顯示進程SELinux 安全山下文
   -z, --contexts      display process and socket SELinux security contexts #顯示進程和Socket 的SELinux 安全山下文
   -N, --net           switch to the specified network namespace name

   -4, --ipv4          display only IP version 4 sockets  #顯示ipv4 的Sockets
   -6, --ipv6          display only IP version 6 sockets  #顯示ipv6 的Sockets
   -0, --packet        display PACKET sockets   #顯示packet 的Sockets
   -t, --tcp           display only TCP sockets  #顯示TCP 協議 的Sockets
   -S, --sctp          display only SCTP sockets  #顯示STCP 的Sockets
   -u, --udp           display only UDP sockets   #顯示UDP 的Sockets
   -d, --dccp          display only DCCP sockets
   -w, --raw           display only RAW sockets
   -x, --unix          display only Unix domain sockets
       --vsock         display only vsock sockets
   -f, --family=FAMILY display sockets of type FAMILY
       FAMILY := {inet|inet6|link|unix|netlink|vsock|help}

   -K, --kill          forcibly close sockets, display what was closed
   -H, --no-header     Suppress header line

   -A, --query=QUERY, --socket=QUERY
       QUERY := {all|inet|tcp|udp|raw|unix|unix_dgram|unix_stream|unix_seqpacket|packet|netlink|vsock_stream|vsock_dgram}[,QUERY]

   -D, --diag=FILE     Dump raw information about TCP sockets to FILE
   -F, --filter=FILE   read filter information from FILE
       FILTER := [ state STATE-FILTER ] [ EXPRESSION ]
       STATE-FILTER := {all|connected|synchronized|bucket|big|TCP-STATES}
         TCP-STATES := {established|syn-sent|syn-recv|fin-wait-{1,2}|time-wait|closed|close-wait|last-ack|listen|closing}
          connected := {established|syn-sent|syn-recv|fin-wait-{1,2}|time-wait|close-wait|last-ack|closing}
       synchronized := {established|syn-recv|fin-wait-{1,2}|time-wait|close-wait|last-ack|closing}
             bucket := {syn-recv|time-wait}
                big := {established|syn-sent|fin-wait-{1,2}|closed|close-wait|last-ack|listen|closing}

二、ss命令實用案例

示例1:顯示TCP連接: ss -atn

[root@localhost ~]# ss -atn  # -a:所有連接 -t:TCP 連接 -n: 不解析名稱
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      128                  127.0.0.1:631                                      *:*
LISTEN      0      100                  127.0.0.1:25                                       *:*
LISTEN      0      128                  127.0.0.1:6010                                     *:* 
LISTEN      0      128                  127.0.0.1:6011                                     *:*

示例2:顯示當前 Sockets 概要信息: ss -s

[root@localhost ~]# ss -s
Total: 653 (kernel 1354)
TCP:   16 (estab 2, closed 1, orphaned 0, synrecv 0, timewait 0/0), ports 0

Transport Total     IP        IPv6
*         1354      -         -
RAW       0         0         0
UDP       8         6         2
TCP       15        9         6
INET      23        15        8
FRAG      0         0         0

示例3:顯示所有TCP的Listen狀態的socket:ss -atl

[root@localhost ~]# ss -alt
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                127.0.0.1:x11-ssh-offset                           *:*
LISTEN      0      128                       :::sunrpc                                  :::*
LISTEN      0      128                       :::ssh                                     :::*
LISTEN      0      128                      ::1:ipp                                     :::*
LISTEN      0      100                      ::1:smtp                                    :::*
LISTEN      0      128                      ::1:x11-ssh-offset                          :::*

示例4:顯示正在監聽的TCP程序的process:ss -altp

[root@localhost ~]# ss -altp
State       Recv-Q Send-Q         Local Address:Port                          Peer Address:Port
LISTEN      0      128                        *:sunrpc                                   *:*                     users:(("rpcbind",pid=6174,fd=4),("systemd",pid=1,fd=47))
LISTEN      0      5              192.168.122.1:domain                                   *:*                     users:(("dnsmasq",pid=7202,fd=6))
LISTEN      0      128                        *:ssh                                      *:*                     users:(("sshd",pid=6798,fd=3))
LISTEN      0      128                127.0.0.1:ipp                                      *:*                     users:(("cupsd",pid=6796,fd=12))
LISTEN      0      100                127.0.0.1:smtp                                     *:*                     users:(("master",pid=7145,fd=13))
LISTEN      0      128                127.0.0.1:x11-ssh-offset                           *:*                     users:(("sshd",pid=13154,fd=9))

示例5:顯示所有established的HTTP連接:ss -o state established ‘( dport = :http or sport = :http )’

[root@localhost ~]# ss -o state established '( dport = :http or sport = :http )'
Netid Recv-Q Send-Q            Local Address:Port                             Peer Address:Port

注意:命令格式,字符之間需要有空格;可以是服務名稱,或端口號,(如:http;80)

示例6:查看ipv4指定過濾規則的socket:ss -4 state FILTER-NAME

FILTER-NAME: Description
established 活躍狀態
syn-sent 發送
syn-recv 接收
fin-wait-1 FIN-WAIT-1狀態
fin-wait-2 FIN-WAIT-2狀態
time-wait 等待關閉
closed 已關閉
close-wait 關閉
last-ack
listen 正在監聽
closing 正在關閉
all 所有以上狀態
connected 除了listen and closed的所有狀態
synchronized 所有已連接的狀態除了syn-sent
bucket 顯示狀態爲maintained as minisockets,如:time-wait和syn-recv.
big 和bucket相反.

查詢處於 FIN-WAIT-1狀態的源端口爲 80或者 443,目標網絡爲 192.168.2/24所有 tcp套接字

[root@localhost ~]# ss -o state fin-wait-1 '( sport = :http or sport = :https )' dst 192.168.2/24
Netid Recv-Q Send-Q            Local Address:Port                             Peer Address:Port

示例 7:查看源端口爲22的socket信息:ss -iom state established ‘( sport = :ssh )’

# -o, --options 顯示時間信息
# -m, --memory 顯示 socket 使用的內存
# -i, --info 顯示更多 TCP 內部的信息
[root@localhost ~]# ss -iom state established '( sport = :ssh )'
Netid Recv-Q Send-Q            Local Address:Port                             Peer Address:Port
tcp   0      48                192.168.2.128:ssh                               192.168.2.1:56434                 timer:(on,238ms,0) # -o
        skmem:(r0,rb369280,t0,tb87040,f1792,w2304,o0,bl0,d0) sack cubic wscale:8,7 rto:240 rtt:39.96/3.157 ato:52 mss:1460 rcvmss:1168 advmss:1460 cwnd:10 bytes_acked:76797 bytes_received:50548 segs_out:1111 segs_in:1874 send 2.9Mbps lastsnd:2 lastrcv:4 lastack:4 pacing_rate 5.8Mbps unacked:1 rcv_rtt:122063 rcv_space:29364  # -m 

示例8 :通過 dst/src/dport/sprot 語法來過濾連接的來源和目標,來源端口和目標端口。

8.1 匹配遠程地址(dst)和端口號(dport):

[root@localhost ~]# ss dst 192.168.5/24 # 查詢源地址爲192.168.5/24網段的socket 數據
Netid State      Recv-Q Send-Q       Local Address:Port                        Peer Address:Port
tcp   ESTAB      0      48           192.168.5.128:ssh                          192.168.5.1:56434
                         192.168.5.1:56434
$ ss dst 192.168.5.120:http # 查詢遠程地址爲192.168.5.120,端口爲80的Socket
$ ss dst 192.168.5.120:443

8.2 匹配本地地址(src)和端口號(sport)

[root@localhost ~]# ss src 192.168.5/24 # 查詢源地址爲192.168.5/24網段的socket 數據
Netid State      Recv-Q Send-Q       Local Address:Port                        Peer Address:Port
tcp   ESTAB      0      48           192.168.5.128:ssh 

8.3 匹配指定端口範圍的socket數據:

格式: ss [dport|sport] Option port

Option 說明
le(<=) 小於等於
ge(>=) 大於等於
lt(<) 小於
gt(>) 大於
eq(==) 等於
ne(!=) 不等於
# 查詢遠端端口號大於50的TCP的Socket
[root@localhost ~]# ss -t dport ge 50 
State       Recv-Q Send-Q         Local Address:Port                          Peer Address:Port
ESTAB       0      48             192.168.5.128:ssh                            192.168.5.1:56434

總結:

由於ss命令的性能出色且功能豐富,可以使用ss 命令替代 netsate命令成爲我們日常查看 socket 相關信息的利器。常見的ss命令使用方式,基本如上,更多的需我們結合自己的能力不斷地在工作中總結。歡迎在留言區與我討論。

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