linux ss命令詳解

linux ss命令詳解
1 Star2 Stars3 Stars4 Stars5 Stars 給文章打分!
Loading...

ss 是 Socket Statistics 的縮寫。ss 命令可以用來獲取 socket 統計資訊,它顯示的內容和 netstat 類似。但 ss 的優勢在於它能夠顯示更多更詳細的有關 TCP 和連線狀態的資訊,而且比 netstat 更快。當伺服器的 socket 連線數量變得非常大時,無論是使用 netstat 命令還是直接 cat /proc/net/tcp,執行速度都會很慢。ss 命令利用到了 TCP 協議棧中 tcp_diag。tcp_diag 是一個用於分析統計的模組,可以獲得 Linux 核心中第一手的資訊,因此 ss 命令的效能會好很多。

常用選項

-h, –help 幫助
-V, –version 顯示版本號
-t, –tcp 顯示 TCP 協議的 sockets
-u, –udp 顯示 UDP 協議的 sockets
-x, –unix 顯示 unix domain sockets,與 -f 選項相同
-n, –numeric 不解析服務的名稱,如 “22” 埠不會顯示成 “ssh”
-l, –listening 只顯示處於監聽狀態的埠
-p, –processes 顯示監聽埠的程序(Ubuntu 上需要 sudo)
-a, –all 對 TCP 協議來說,既包含監聽的埠,也包含建立的連線
-r, –resolve 把 IP 解釋為域名,把埠號解釋為協議名稱

常見用例

如果不新增選項 ss 命令預設輸出所有建立的連線(不包含監聽的埠),包括 tcp, udp, and unix socket 三種型別的連線:

檢視主機監聽的埠


$ ss -tnl

通過 -r 選項解析 IP 和埠號


$ ss -tlr

使用 -p 選項檢視監聽埠的程式名稱


$ sudo ss -tlp

最後一列就是執行的程式名稱。還可以通過 grep 繼續過濾:


$ sudo ss -tlp | grep ssh

檢視建立的 TCP 連線

-a –all 對 TCP 協議來說,既包含監聽的埠,也包含建立的連線


$ ss -tna

顯示更多的資訊

-o, –options 顯示時間資訊
-m, –memory 顯示 socket 使用的記憶體
-i, –info 顯示更多 TCP 內部的資訊

顯示概要資訊


$ ss -s

dst/src dport/sport 語法

可以通過 dst/src/dport/sprot 語法來過濾連線的來源和目標,來源埠和目標埠。

匹配遠端地址和埠號


$ ss dst 192.168.1.5
$ ss dst 192.168.119.113:http
$ ss dst 192.168.119.113:443

匹配本地地址和埠號


$ ss src 192.168.119.103
$ ss src 192.168.119.103:http
$ ss src 192.168.119.103:80

將本地或者遠端埠和一個數比較

可以使用下面的語法做埠號的過濾:


$ ss dport OP PORT
$ ss sport OP PORT

OP 可以代表以下任意一個:

<=le小於或等於某個埠號
>=ge大於或等於某個埠號
==eq等於某個埠號
!=ne不等於某個埠號
>gt大於某個埠號
<lt小於某個埠號

下面是一個簡單的 demo(注意,需要對尖括號使用轉義符):


$ ss -tunl sport lt 50
$ ss -tunl sport \< 50

通過 TCP 的狀態進行過濾

ss 命令還可以通過 TCP 連線的狀態程序過濾,支援的 TCP 協議中的狀態有:
established
syn-sent
syn-recv
fin-wait-1
fin-wait-2
time-wait
closed
close-wait
last-ack
listening
closing

除了上面的 TCP 狀態,還可以使用下面這些狀態:

all列出所有的 TCP 狀態。
connected列出除了 listening 和 closing 之外的所有 TCP 狀態。
synchronized列出除了 syn-sent 之外的所有 TCP 狀態。
bucket列出 maintained 的狀態,如:time-wait 和 syn-recv。
big列出和 bucket 相反的狀態。

使用 ipv4 時的過濾語法如下:


$ ss -4 state filter

使用 ipv6 時的過濾語法如下:


$ ss -6 state filter

下面是一個簡單的例子:


$ ss -4 state listening

同時過濾 TCP 的狀態和埠號

(注意下面命令中的轉義符和空格,都是必須的。如果不用轉義符,可以使用單引號)

下面的命令顯示所有狀態為 established 的 ssh 連線:


$ ss -4n state listening

下面的兩種寫法是等價的,要有使用 \ 轉義小括號,要麼使用單引號括起來:


$ ss -4n state listening \( dport = :ssh \)
$ ss -4n state listening '( dport = :ssh )' 

只是最後的結果稍微讓人有些意外,不僅顯示了監聽的埠,也顯示了通過 22 埠建立的連線。

下面我們顯示所有狀態為 Established 的 HTTP 連線:


$ ss -4n state listening \( dport = :ssh \)
$ ss -4n state listening '( dport = :ssh )' 

下面的命令列出所有連線到 22 埠的連線和對 22 埠的監聽:


$ ss state all dport = :22

下面是一個來自 ss man page 的例子,它列舉出處於 FIN-WAIT-1狀態的源埠為 80 或者 443,目標網路為 193.233.7/24 所有 TCP 套接字:


$ ss state fin-wait-1 '( sport = :http or sport = :https )' dst 193.233.7/24 

總結

由於效能出色且功能豐富,ss 命令可以用來替代 netsate 命令成為我們日常檢視 socket 相關資訊的利器。其實拋棄 netstate 命令已經是大勢所趨,有的 Linux 版本預設已經不再內建 netstate 而是內建了 ss 命令。

相關文章

伺服器 最新文章