
# 用 Linux `ss` 命令排查網絡連線問題
今次同大家分享一個好實用嘅 Linux 網絡排錯技巧:用 `ss` 命令快速睇清楚部機嘅網絡連線狀態。好多 IT 同事仲用緊舊嘅 `netstat`,其實 `ss` 已經係現代 Linux 嘅標準工具,快好多、資訊又齊。
## 點解要用 ss 而唔用 netstat
`netstat` 係一個好老嘅工具,靠讀 `/proc/net/` 入面嘅文件嚟攞資料,當部機有成萬個 socket 連線嘅時候,佢就會好慢,仲可能卡住。`ss` 直接由 kernel 攞 socket 資訊,速度快好多,格式又易睇。
喺大部分現代發行版(CentOS 7+、Ubuntu 16.04+、Debian 9+)入面,`ss` 已經預設裝好,直接喺 terminal 打 `ss` 就用到。
## 基本用法
最簡單嘅做法,就係乜參數都唔加,直接打:
ss
呢個會列出所有 socket,但通常太多,睇唔曬。所以我哋會加參數篩選。
### 睇所有 TCP 連線
ss -t
`-t` 代表 TCP。想連 UDP 一齊睇,就加埋 `-u`:
ss -tu
### 睇正在監聽嘅 port
呢個係最常用嘅,想知道部機開咗咩服務、聽緊咩 port:
ss -tlnp
參數逐個解:
– `-t`:TCP
– `-l`:只顯示 listening(監聽中)
– `-n`:唔好做 DNS 反查,直接顯示 IP 同 port 數字,快好多
– `-p`:顯示邊個 process 用緊呢個 socket
輸出大概係咁:
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3))
LISTEN 0 128 0.0.0.0:443 0.0.0.0:* users:(("nginx",pid=5678,fd=6))
一眼就知部機開咗 SSH(22)同 nginx(443)。
## 排查連線狀態
想睇所有 TCP 連線嘅狀態,用:
ss -tan
輸出會有 `ESTAB`(已建立)、`TIME-WAIT`、`CLOSE-WAIT`、`SYN-SENT` 等狀態。呢啲狀態對排錯好有用:
– **TIME-WAIT 太多**:通常係部機做 client,開咗好多短連線,等 kernel 回收。正常情況,但如果去到幾萬個,可能要調整 kernel 參數。
– **CLOSE-WAIT 多**:代表對面已經閂咗連線,但你嘅 application 冇閂返,可能係程式 bug,socket 冇 close。
– **SYN-SENT 一堆**:代表部機一直發 SYN 但對方冇回應,可能係 network 不通或者對方 firewall 擋咗。
## 統計資訊
想睇整體統計,用 `-s`:
ss -s
會顯示總共幾多 socket、TCP 幾多、UDP 幾多、各狀態分佈,一眼睇曬部機嘅網絡健康情況。
## 實戰例子:揾出邊個 process 霸住 port 80
假設你想開個 web server,但 port 80 已經俾人用咗,你要揾出係邊個:
ss -tlnp | grep ':80'
輸出會直接話你知係邊個 process、PID 幾多,之後你可以決定 kill 佢定係改自己個 port。
## 小結
`ss` 係 Linux 網絡排錯嘅利器,記住幾個常用組合就得:
– `ss -tlnp` — 睇監聽中嘅 TCP port 同 process
– `ss -tan` — 睇所有 TCP 連線狀態
– `ss -s` — 睇統計
– `ss -tu` — TCP + UDP 一齊睇
🔗 參考資料:NVD NIST 漏洞資料庫
下次部機網絡有問題,唔好再慢慢等 `netstat` 喇,直接 `ss` 啦!



