用 netstat 加 ss 快速揪出邊個食晒你 Server Port:Linux 排障實戰

用 netstat 加 ss 快速揪出邊個食曬你 Server Port:Linux 排障實戰 做 IT 耐咗就知,最令人心煩嘅唔係啲大型架構,而係啲「估你唔到」嘅小問題。例如有個 service 明明已經 restart 咗幾次,個 port 就係一直話「Address already in use」;又或者部機網絡慢到暈,你想睇下有邊個 process 偷偷開咗一大堆連線。呢啲時刻,你手上最得...

用 netstat 加 ss 快速揪出邊個食晒你 Server Port:Linux 排障實戰 - 文章重點速覽 infographic

用 netstat 加 ss 快速揪出邊個食曬你 Server Port:Linux 排障實戰

做 IT 耐咗就知,最令人心煩嘅唔係啲大型架構,而係啲「估你唔到」嘅小問題。例如有個 service 明明已經 restart 咗幾次,個 port 就係一直話「Address already in use」;又或者部機網絡慢到暈,你想睇下有邊個 process 偷偷開咗一大堆連線。呢啲時刻,你手上最得使嘅兩件法寶就係 netstat 同 ss。

今日就用最貼地嘅方式,一步步教你點樣用呢兩個工具,快速揪出邊個 process 食住咗邊個 port,等你可以即刻做決定,唔使再估估下。

點解要識 netstat 同 ss?

簡單講,佢哋就係幫你睇清楚部機「而家開咗邊啲 socket、邊啲 port 有人聽緊、邊個 process 揸住佢」嘅工具。日常排障最常見嘅三個場景:

– Service 起唔到,報「Address already in use」——即係個 port 俾人霸住咗。
– 懷疑有可疑連線或者流量異常——想睇下有咩對外連線。
– 部署完 firewall 想驗證——確認邊啲 port 真係有 listen。

記住一句:ss 係 netstat 嘅現代替代品,快啲、資訊多啲,但如果部舊機得 netstat,你都一樣要識用。

第一步:睇曬所有 listen 緊嘅 port

先由最基本嘅開始。想知部機而家有咩 service 對外開放緊,用呢條:

# 用 netstat(舊式,但到處都有)
netstat -tulnp

用 ss(現代、快好多,推薦)

ss -tulnp

參數解拆:
– -t = TCP、-u = UDP、-l = 只睇 listening、-n = 唔好 resolve hostname(快啲)、-p = 顯示 process 名。

輸出大概係咁:

Proto Recv-Q Send-Q Local Address    Foreign Address   State       PID/Program
tcp   0      0    0.0.0.0:22       0.0.0.0:*         LISTEN      1234/sshd
tcp   0      0    127.0.0.1:3306   0.0.0.0:*         LISTEN      5678/mysqld
tcp   0      0    0.0.0.0:80       0.0.0.0:*         LISTEN      9012/nginx

睇到呢度,你就即刻知:22 係 sshd、3306 係 MySQL、80 係 nginx,清清楚楚。

第二步:揾出係邊個 process 霸住個 port

呢個係最常用嘅排障動作。假設你想行個新 service,佢要用 port 8080,但一啟動就話俾人霸住咗。即刻查:

ss -tulnp | grep :8080

如果輸出係空,即係冇嘢 listen 緊 8080,咁可能係個 service 自己嘅設定問題。如果有輸出,例如:

tcp  LISTEN  0  128  0.0.0.0:8080  0.0.0.0:*  users:(("java",pid=4321,fd=42))

咁你就知係 PID 4321 嘅 java process 揸住咗。想知多啲佢係咩,再查:

ps -fp 4321

或者直接睇佢行緊咩

ls -l /proc/4321/exe

跟住你就可以決定:kill 咗佢,定係改自己個 service 用第二個 port。

第三步:睇所有已建立嘅連線

除咗 listen,你仲要識睇「而家連咗去邊」。呢個對揪可疑流量好有用:

# 所有 TCP 連線,無論係 ESTABLISHED 定 TIME_WAIT
ss -tanp

淨係睇已建立嘅連線

ss -tanp state established

如果想睇有冇 process 異常地開咗大量連線,可以用呢條幫你數下邊個 process 連線最多:

ss -tanp | awk '{print $6}' | sort | uniq -c | sort -rn | head

不過要留意,個 process 名未必次次都出到(尤其係唔係 root 身份行),到時要 sudo 先睇得齊。

第四步:睇連線嘅狀態分佈

呢個對診斷「部機反應慢」特別有用。如果你見到一大堆 TIME_WAIT 或者 SYN_RECV,通常代表有嘢唔妥:

ss -tan | awk 'NR>1 {print $1}' | sort | uniq -c | sort -rn

常見狀態要識:
– ESTAB:正常建立咗嘅連線。
– TIME_WAIT:關閉後等待,太多可能係短連接開得密。
– SYN_RECV:收到 SYN 但未完成 handshake,太多可能係俾人掃描或者 SYN flood。

總結:記住呢幾條就夠

排障唔使背曬所有參數,記住最常用呢幾條:

ss -tulnp          # 睇邊個 port 有人 listen,附 process
ss -tulnp | grep :8080   # 揪出霸住 8080 嘅 process
ss -tanp state established   # 睇所有已建立連線
ss -tan | awk 'NR>1{print $1}' | sort | uniq -c | sort -rn   # 連線狀態分佈

🔗 參考資料:NVD NIST 漏洞資料庫

下次遇到「Address already in use」或者部機連線異常,唔好再盲目 restart,先跑一次 ss -tulnp 睇清楚邊個係兇手,慳返你半個鐘。