netstat 與 ss:網路連線診斷完全指南 文章首圖

netstat 與 ss:網路連線診斷完全指南

netstat 與 ss:網路連線診斷完全指南

在 Linux 系統管理與網路除錯的日常工作中,即時掌握系統的網路連線狀態是至關重要的技能。無論是排查服務無法連線的問題,還是監控伺服器負載,我們都需要依賴強大的指令列工具。提到這個領域,兩員大將無可避免:netstatss

雖然兩者都能提供相似的網路資訊,但它們的歷史背景、效能表現以及現代 Linux 發行版的支援程度卻大不相同。本文將深入解析這兩款工具的用法,並提供在 Ubuntu 22.04 / Debian 12 上實際可用的操作範例。

傳統王者:netstat 的經典用法

netstat(Network Statistics)是舊世代 Linux 系統中最常見的網路診斷工具,屬於 net-tools 套件的一部分。它雖然功能強大且直覺,但在處理大量連線時效能較差,且已被現代發行版逐漸標記為「棄用」(deprecated)。

安裝與基本檢視

在 Ubuntu 或 Debian 上,若你的系統未預裝 net-tools,可以使用以下指令安裝:

sudo apt update
sudo apt install net-tools

安裝完成後,最經典的用法是列出所有活躍的網路連線:

netstat -tuln

這裡的參數意義如下:

  • -t:顯示 TCP 連線。
  • -u:顯示 UDP 連線。
  • -l:僅顯示處於監聽狀態(Listening)的服務。
  • -n:以數字形式顯示 IP 與埠號,避免 DNS 反查造成的延遲。

執行結果通常會顯示類似以下的輸出:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp6       0      0 :::22                   :::*                    LISTEN
udp        0      0 0.0.0.0:68              0.0.0.0:*

從中我們可以清楚看到 SSH 服務(埠號 22)正在監聽,且狀態為 LISTEN

追蹤特定程序的連線

netstat 的強項在於能結合 -p 參數顯示程序名稱,這對於診斷「誰佔用了某個埠」非常有用:

sudo netstat -tulpn | grep :80

輸出範例:

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1234/nginx

這表示埠號 80 正由 PID 1234 的 nginx 程式佔用。

現代後起之秀:ss 的高效表現

ss(Socket Statistics)是 iproute2 套件的一部分,旨在取代 netstat。它直接從核心空間讀取 Socket 資訊,因此在連線數量龐大時(例如數萬個連線),ss 的速度遠勝於 netstat,且記憶體佔用更少。

基本用法與對比

在大多數現代 Ubuntu 和 Debian 系統中,ss 已預先安裝。其語法與 netstat 高度相似,但參數更為簡潔:

ss -tuln

執行結果與 netstat 類似,但輸出格式更現代化:

State    Recv-Q   Send-Q      Local Address:Port       Peer Address:Port  Process
LISTEN   0        128               0.0.0.0:22              0.0.0.0:*      
LISTEN   0        128                  [::]:22                 [::]:*      

注意,ss 預設會顯示 Process 資訊(若擁有 root 權限),這使得我們無需額外加上 -p 即可看到程序資訊,這是它比 netstat 更友善的地方。

進階查詢:按狀態過濾

ss 強大的地方在於它能輕鬆過濾特定狀態的連線。例如,我們想找出所有處於 ESTABLISHED 狀態的 TCP 連線,並統計數量:

ss -tan state established | wc -l

或者,如果你想查看佔用資源最多的 IP 連線數:

ss -tan | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -10

這段指令會列出連線數最多的前 10 個 IP 地址,對於檢測潛在的 DDoS 攻擊或異常流量非常有效。

常見問題與解決方案

1. 為什麼在 Ubuntu 22.04 上執行 netstat 會報錯?

許多新手在安裝純淨版的 Ubuntu 22.04 後,輸入 netstat 會發現指令不存在。這是因為 Canonical 官方決定在較新的發行版中移除 net-tools,全面轉向 iproute2

解決方案: 如果你必須使用 netstat,請手動安裝:

sudo apt install net-tools

但建議長期使用者直接習慣使用 ss,因為它將是未來的標準。

2. ss 顯示的 State 欄位意義為何?

ss 輸出的 State 欄位代表 Socket 的狀態。常見的狀態包括:

  • LISTEN:服務正在等待連線。
  • ESTABLISHED:連線已建立並正在傳輸資料。
  • TIME_WAIT:連線已關閉,但系統仍在等待最後的 ACK 封包,以防延遲封包干擾。
  • CLOSE-WAIT:遠端已關閉連線,但本地端應用程式尚未關閉 Socket。

若發現大量 CLOSE-WAIT,通常意味著應用程式有資源洩漏(Resource Leak),未正確關閉連線,需要檢查程式碼邏輯。

小結

netstatss 都是 Linux 網路診斷不可或缺的利器。netstat 勝在歷史悠久、語法直覺,適合快速檢視少量連線;而 ss 則以高效能、低資源佔用以及更現代的輸出格式,成為現代系統管理的最佳選擇。

對於 Ubuntu 22.04 與 Debian 12 的使用者而言,建議以 ss 為主,netstat 為輔。掌握這兩者的差異與用法,將能大幅提升你除錯網路問題的效率與專業度。下次遇到連線問題時,不妨試試看 ss -tuln,你會發現它既快速又清晰。