Linux 系統管理沒有 netstat ,不惆悵! 擁抱 ss ,事半功倍

Linux 系統管理沒有 netstat ,不惆悵! 擁抱 ss ,事半功倍

一 背景

在目前衆多較新的 Linux 發行版中,已經移除了 net-tools 套件,ifconfig、route、netstat、arp 等一系列工具均無法使用。缺少這些工具,在對系統進行管理時,會不會變得舉步維艱呢?

答案是:不會。官方既然刪除了 net-tools 套件,就會有新的替代方案。比如:在 CentOS 7.6 中,官方就使用了 iproute-4.11.0-14.el7.x86_64 替代了 net-tools 相關版本。新的工具 ip 代替了 ifconfig, ss 代替了 netstat。這兩個工具都是系統管理中非常重要的工具。接下來將在 CentOS Linux release 7.6.1810 (Core) 對 ss 工具進行實踐。

二 認識 ss

ss 是 socket statistics 的縮寫。顧名思義,ss 命令可以用來獲取socket 統計信息,它可以顯示與 netstat 類似的內容。但 ss 的優勢在於它能夠顯示更多更詳細的有關TCP和連接狀態的信息,而且比netstat更快速更高效。

當服務器的socket連接數量變得非常大時,無論是使用netstat命令還是 cat /proc/net/tcp,執行速度都會很慢。可能你不會有切身的感受,但請相信我,當服務器維持的連接達到上萬個的時候,使用 netstat 等於浪費生命,而用 ss 纔是最正確的選擇。

天下武功唯快不破。 ss 快的祕訣在於,他利用了TCP協議棧中 tcp_diag. tcp_diag 是一個用於分析統計的模塊,可以獲得 Linux 內核中第一手的信息,這就確保了ss的快捷高效。當然,如果你的系統中沒有 tcp_diag, ss 也可以正常運行,只是效率會變得稍慢,但仍然比 netstat 要快。

說到這裏,大家是不是非常激動了?是不是都想躍躍欲試了?

按照常規 Linux 學習路線,我們先查看一下系統幫助。

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 # 不解析主機名
   -a, --all           display all sockets # 顯示所有的 sockets
   -l, --listening     display listening sockets # 顯示監聽的 sockets
   -o, --options       show timer information # 顯示定時器信息
   -e, --extended      show detailed socket information # 顯示詳細的 socket 信息
   -m, --memory        show socket memory usage # 顯示內存的使用情況
   -p, --processes     show process using 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
   -z, --contexts      display process and socket SELinux security contexts
   -N, --net           switch to the specified network namespace name

   -4, --ipv4          display only IP version 4 sockets # 僅顯示 IPv4 的套接字
   -6, --ipv6          display only IP version 6 sockets # 僅顯示 IPv6 的套接字
   -0, --packet        display PACKET sockets # 顯示 PACKET 套接字
   -t, --tcp           display only TCP sockets # 僅顯示 TCP 套接字
   -S, --sctp          display only SCTP sockets # 僅顯示 SCTP 套接字
   -u, --udp           display only UDP sockets # 僅顯示  UDP 套接字
   -d, --dccp          display only DCCP sockets # 僅顯示 DCCP 套接字
   -w, --raw           display only RAW sockets # 僅顯示  RAW 套接字
   -x, --unix          display only Unix domain sockets # 僅顯示 Unix 套接字
       --vsock         display only vsock sockets
   -f, --family=FAMILY display sockets of type FAMILY
       FAMILY := {inet|inet6|link|unix|netlink|vsock|help} # 顯示 FAMILY 類型的套接字,FAMILY可選  Unix, inet, inet6, link ,  netlink

   -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}

三 操作步驟

3.1 顯示系統內的 TCP 連接

命令:ss -at

結果

State       Recv-Q Send-Q                                        Local Address:Port                                                         Peer Address:Port
LISTEN      0      128                                                       *:ssh                                                                     *:*

3.2 顯示 socket 摘要

命令:ss -s
結果

Total: 558 (kernel 1020)
TCP:   5 (estab 1, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 0

Transport Total     IP        IPv6
*         1020      -         -
RAW       1         0         1
UDP       2         1         1
TCP       5         3         2
INET      8         4         4
FRAG      0         0         0

3.3 顯示監聽的 sockets

命令:ss -l
結果

Netid State      Recv-Q Send-Q                                      Local Address:Port                                                       Peer Address:Port
nl    UNCONN     0      0                                                    rtnl:NetworkManager/13282                                                   *
nl    UNCONN     0      0                                                    rtnl:kernel                                                                 *                                                             *

3.4 顯示進程使用的 sockets

命令:ss -lp
結果

Netid  State      Recv-Q Send-Q Local Address:Port                 Peer Address:Port
nl     UNCONN     0      0      audit:auditd/3760            *
u_dgr  UNCONN     0      0      /var/run/chrony/chronyd.sock 26487                 * 0                     users:(("chronyd",pid=3918,fd=5))
udp    UNCONN     0      0         ::1:323                  :::*                     users:(("chronyd",pid=3918,fd=2))
u_seq  LISTEN     0      128    /run/udev/control 18173                 * 0                     users:(("systemd-udevd",pid=2040,fd=3),("systemd",pid=1,fd=42))

3.5 顯示所有 UDP 監聽的 socket

命令:ss -au
結果

State       Recv-Q Send-Q                                        Local Address:Port                                                         Peer Address:Port
UNCONN      0      0                                                 127.0.0.1:323                                                                     *:*
UNCONN      0      0                                                       ::1:323                                                                    :::*

3.6 顯示 dst IP 爲 172.31.2.25 且狀態爲 established 的 TCP 連接,同時顯示 timer

命令:ss -t -o state established dst 172.31.2.25
結果

Recv-Q Send-Q                                             Local Address:Port                                                              Peer Address:Port
0      64                                                  172.31.2.101:ssh                                                                172.31.2.25:61159                 timer:(on,461ms,0)

3.7 顯示 src IP 爲 172.31.2.101 且狀態爲 established 的 TCP 連接,同時顯示 timer

命令:ss -ato state established src 172.31.2.102
結果

Recv-Q Send-Q Local Address:Port                 Peer Address:Port
0      64     172.31.2.102:ssh                  172.31.2.25:61179                 timer:(on,398ms,0)

state 可以參考以下:

       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}

3.8 匹配遠程地址和端口號

命令:ss dst 172.31.2.25:61895
結果

Netid State      Recv-Q Send-Q                                      Local Address:Port                                                       Peer Address:Port
tcp   ESTAB      0      64                                           172.31.2.100:ssh                                                         172.31.2.25:61895

不指定端口號則匹配所有,查看本地的以此類推。

3.9 顯示所有 IPv4 監聽在 TCP 端口的進程

命令: ss -a4tlp
結果

State      Recv-Q Send-Q Local Address:Port                 Peer Address:Port
LISTEN     0      128        *:ssh                      *:*                     users:(("sshd",pid=4716,fd=3))
LISTEN     0      100    127.0.0.1:smtp                     *:*                     users:(("master",pid=4926,fd=13))

我們很方便的就能從結果中找到相關的有用信息,比如:pid,fd。

四 總結

4.1 ss 是 Linux 中非常有用的工具,在系統管理過程中很有必要掌握。

4.2 擁抱改變,接受現實,用學習來迎接新的挑戰,沒有了 netstat, 我們使用 ss 工具一樣能完成之前的工作。

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