
用 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 睇清楚邊個係兇手,慳返你半個鐘。


