- 工信部備案號 滇ICP備05000110號-1
- 滇公安備案 滇53010302000111
- 增值電信業務經營許可證 B1.B2-20181647、滇B1.B2-20190004
- 云南互聯網協會理事單位
- 安全聯盟認證網站身份V標記
- 域名注冊服務機構許可:滇D3-20230001
- 代理域名注冊服務機構:新網數碼
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 三種類型的連接:
[root@XR ~]# ss |head -n 5
Netid | 網絡標識符 |
State | 每個服務的連接狀態 |
Recv-Q | 接收socket(套接字)隊列中的數據量,以字節為單位 |
Send-Q | 發送socket(套接字)隊列中的數據量,以字節為單位 |
Local Address | 運行本地的計算機地址 |
Port | 服務端口 |
Peer Address | 對等端口 |
查看主機監聽的端口
[root@XR ~]# ss -tnl
通過 -r 選項解析 IP 和端口號
[root@XR ~]# ss -tlr
使用 -p 選項查看監聽端口的程序名稱
[root@XR ~]# ss -tlp
最后一列就是運行的程序名稱。還可以通過 grep 繼續過濾:
[root@XR ~]# ss -tlp | grep ssh
查看建立的 TCP 連接
-a --all 對 TCP 協議來說,既包含監聽的端口,也包含建立的連接
[root@XR ~]# ss -tna
顯示更多的信息
-o, --options 顯示時間信息
-m, --memory 顯示 socket 使用的內存
-i, --info 顯示更多 TCP 內部的信息
[root@XR ~]# ss -imo
由于信息較多,這里只顯示內存部分,括號內從左到右分別代表:
接收報文分配的內存
接收報文可分配的內存
發送報文分配的內存
發送報文可分配的內存
socket使用的緩存
為將要發送的報文分配的內存
保存socket選項使用的內存
連接隊列使用的內存
顯示概要信息
ss -s 是一個非常有用的命令。它可以按網絡傳輸類型顯示總體統計信息,我們不妨來測試一下:
[root@XR ~]# ss -s
RAW Socket 原始套接字。允許直接發送和接收 IP 數據包,無需滿足特定的傳輸協議,用于 namp 等安全應用。
TCP 傳輸控制協議。是我們網絡連接當中的主要連接協議。
UDP 用戶數據報協議。類似于 TCP 但沒有錯誤檢查。
INET 包含上述項。( INET4 和 INET6 可以通過一些 ss 命令單獨查看)。
FRAG 可以理解為碎片的意思。
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
下面是一個簡單的例子:
[root@XR ~]# ss -4 state listening
同時過濾 TCP 的狀態和端口號
(注意下面命令中的轉義符和空格,都是必須的。如果不用轉義符,可以使用單引號)
下面的命令顯示所有狀態為 established 的 ssh 連接:
[root@XR ~]# ss -4n state listening
下面的兩種寫法是等價的,要有使用 \\ 轉義小括號,要么使用單引號括起來:
ss -4n state listening \\( dport = :ssh \\)
ss -4n state listening '( dport = :ssh )'
只是最后的結果稍微讓人有些意外,不僅顯示了監聽的端口,也顯示了通過 22 端口建立的連接。
下面我們顯示所有狀態為 Established 的 HTTP 連接:
[root@XR ~]# ss state established '( sport = :http or dport = :http )'
總結
由于性能出色且功能豐富,ss 命令可以用來替代 netsate 命令成為我們日常查看 socket 相關信息的利器。其實拋棄 netstate 命令已經是大勢所趨,有的 Linux 版本默認已經不再內置 netstate 而是內置了 ss 命令。
提交成功!非常感謝您的反饋,我們會繼續努力做到更好!
這條文檔是否有幫助解決問題?
售前咨詢
售后咨詢
備案咨詢
二維碼
TOP