ss 指令:查看 Linux 連接埠與程序,並與 netstat 比較
在 Linux 伺服器上,哪些連接埠開著、誰正連線中,可以用 ss 指令查看。ss 是 iproute2 中取代 netstat 的通訊端查詢工具。在 Debian 12 伺服器上用 ss 查詢監聽中(LISTEN)的連接埠與連線後確認,使用一般帳號時,即使加上 -p,其他帳號啟動的程式名稱也不會出現在 Process 欄。
以下輸出是在英文 locale 下執行的結果。伺服器與對方的位址以範例位址表示。
1️⃣ ss 指令基本用法與輸出欄位
不加選項執行 ss 時,監聽中的連接埠不會列出,只會顯示已建立連線的通訊端。在測試伺服器上,最前面幾行全是伺服器內程式彼此溝通用的 Unix 通訊端(u_str、u_dgr)。
ss | head -n 5Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
u_str ESTAB 0 0 * 1013903 * 1013904
u_dgr ESTAB 0 0 * 1013960 * 13394
u_str ESTAB 0 0 * 1013907 * 1013908
u_str ESTAB 0 0 * 46066198 * 46066199所以只想看 TCP 連線時,要加上 -t。Unix 通訊端會被排除,連接埠的位置會顯示 ssh、https 等服務名稱,而不是號碼。
ss -tState Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 203.0.113.10:ssh 198.51.100.7:51114
ESTAB 0 0 203.0.113.10:26676 192.0.2.15:https
ESTAB 0 0 203.0.113.10:29714 192.0.2.16:https同時加上 -n,連接埠號碼就會照原樣顯示,不會換成服務名稱。
ss -tnState Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 203.0.113.10:22 198.51.100.7:51114
ESTAB 0 0 203.0.113.10:26676 192.0.2.15:443
ESTAB 0 0 203.0.113.10:29714 192.0.2.16:443Recv-Q 與 Send-Q 這兩欄的意思會隨通訊端狀態而不同。在連線中的通訊端,Recv-Q 是已收到但程式尚未讀取的位元組數,Send-Q 是已送出但對方尚未確認收到的位元組數。
在監聽中的通訊端,Recv-Q 表示佇列中累積的連線數,Send-Q 表示佇列的最大大小。這兩欄的意思出自 net-tools 的 netstat(8) man 頁面說明。
2️⃣ 查看 Linux 連接埠(-tln、-uln、-tulpn)
不加選項的輸出不會列出等待連線的連接埠,所以要查看開啟的連接埠時,要加上只挑出監聽中通訊端的 -l。[ss -tln] 會以號碼輸出監聽中的 TCP 連接埠。
ss -tlnState Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
LISTEN 0 511 0.0.0.0:443 0.0.0.0:*
LISTEN 0 511 127.0.0.1:8080 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 511 [::]:80 [::]:*
LISTEN 0 511 [::]:443 [::]:*Local Address 為 0.0.0.0 時,會接受連到伺服器所有 IPv4 位址的連線;若為 127.0.0.1,則只能從伺服器內部連線。[::] 代表 IPv6 的所有位址,因此 22、80、443 號連接埠在 IPv4 與 IPv6 兩邊都是開著的。
拿掉 -n,連接埠號碼就會換成服務名稱。8080 號會顯示為 http-alt。
ss -tlState Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 128 0.0.0.0:ssh 0.0.0.0:*
LISTEN 0 511 0.0.0.0:http 0.0.0.0:*
LISTEN 0 511 0.0.0.0:https 0.0.0.0:*
LISTEN 0 511 127.0.0.1:http-alt 0.0.0.0:*
LISTEN 0 128 [::]:ssh [::]:*
LISTEN 0 511 [::]:http [::]:*
LISTEN 0 511 [::]:https [::]:*UDP 不建立連線,所以連監聽中的通訊端也沒有 LISTEN 狀態。[ss -uln] 輸出的狀態欄全都是 UNCONN。68 號(bootpc)是 DHCP 用戶端,123 號(ntp)是時間同步用的連接埠。
ss -ulnState Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
UNCONN 0 0 0.0.0.0:68 0.0.0.0:*
UNCONN 0 0 203.0.113.10:123 0.0.0.0:*
UNCONN 0 0 127.0.0.1:123 0.0.0.0:*
UNCONN 0 0 0.0.0.0:123 0.0.0.0:*
UNCONN 0 0 [::1]:123 [::]:*
UNCONN 0 0 [::]:123 [::]:*想一次看 TCP 與 UDP,就像 [ss -tulpn] 這樣把選項合在一起。種類有兩種以上時,最前面會多一個 Netid 欄。
ss -tulpnNetid State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
udp UNCONN 0 0 0.0.0.0:68 0.0.0.0:*
udp UNCONN 0 0 203.0.113.10:123 0.0.0.0:*
udp UNCONN 0 0 127.0.0.1:123 0.0.0.0:*
udp UNCONN 0 0 0.0.0.0:123 0.0.0.0:*
udp UNCONN 0 0 [::1]:123 [::]:*
udp UNCONN 0 0 [::]:123 [::]:*
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
tcp LISTEN 0 511 0.0.0.0:443 0.0.0.0:*
tcp LISTEN 0 511 127.0.0.1:8080 0.0.0.0:*
tcp LISTEN 0 128 [::]:22 [::]:*
tcp LISTEN 0 511 [::]:80 [::]:*
tcp LISTEN 0 511 [::]:443 [::]:*3️⃣ 用 ss 指令查看程序(-p)
-p 是把使用通訊端的程式輸出到 Process 欄的選項。但在測試伺服器的一般帳號執行 [ss -tlnp] 後,Process 欄如下方所示是空的,看起來像選項沒有作用。
ss -tlnpState Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
LISTEN 0 511 0.0.0.0:443 0.0.0.0:*
LISTEN 0 511 127.0.0.1:8080 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 511 [::]:80 [::]:*
LISTEN 0 511 [::]:443 [::]:*ss 會讀取 /proc 底下每個程序的 fd 資料夾,找出使用通訊端的程序。一般帳號無法開啟其他帳號啟動之程序的 fd 資料夾,所以該程式的名稱不會填入欄位。用一般帳號開啟 root 啟動的 1 號程序資料夾,會出現權限錯誤。
ls /proc/1/fdls: cannot open directory '/proc/1/fd': Permission denied用自己帳號啟動的程式,即使是一般帳號也會出現在 Process 欄。這是在 127.0.0.1 的 8000 號連接埠啟動 python3 的簡易網頁伺服器確認的。
python3 -m http.server 8000 --bind 127.0.0.1 &啟動後,加上 [sport = :8000] 只查詢 8000 號連接埠那一行。
ss -tlnp sport = :8000State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 5 127.0.0.1:8000 0.0.0.0:* users:(("python3",pid=343015,fd=3))users 後面的括號裡依序是程式名稱、pid 與檔案描述符號碼(fd)。
確認完畢後,用 [kill %1] 關掉簡易網頁伺服器。關掉後再執行一次 [ss -tln sport = :8000],只會剩下標題列,不會出現 8000 號那一行。
用 root 帳號執行時,可以讀取所有程序的資訊,所以 Process 欄會被填入。一個連接埠上若有多個程序一起監聽,users 括號裡就會依程序數列出相應的項目。下方 root 輸出中的程式名稱與 pid 為範例值。
ss -tlnp sport = :443State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 511 0.0.0.0:443 0.0.0.0:* users:(("app",pid=2101,fd=6),("app",pid=2100,fd=6))
LISTEN 0 511 [::]:443 [::]:* users:(("app",pid=2101,fd=7),("app",pid=2100,fd=7))要以連接埠號碼找出程式時,也可以使用 lsof 指令的 [lsof -i :443] 寫法。
Process 欄會如何隨帳號改變,可以在下方圖表中切換帳號比較。
4️⃣ ss 狀態與連接埠篩選選項
即使查看過開啟的連接埠,現在是誰連到那些連接埠,還是要另外篩選。ss 會在選項後面加上篩選條件,只留下需要的行。
在 state 後面寫上狀態名稱,就只會留下該狀態的通訊端。[ss -tn state established] 的輸出沒有 State 欄,從 Recv-Q 欄開始。
ss -tn state establishedRecv-Q Send-Q Local Address:Port Peer Address:Port Process
0 0 203.0.113.10:22 198.51.100.7:51114
0 0 203.0.113.10:26676 192.0.2.15:443
0 0 203.0.113.10:29714 192.0.2.16:443連接埠用 dport(對方的連接埠)與 sport(自己這端的連接埠)篩選。從伺服器連到外部 https 伺服器的連線,用 [dport = :443] 挑出。
ss -tn dport = :443State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
ESTAB 0 0 203.0.113.10:26676 192.0.2.15:443
ESTAB 0 0 203.0.113.10:29714 192.0.2.16:443把 sport 與 -l 一起使用,就能只確認該連接埠是否正在監聽。
ss -tln sport = :22State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*多個條件用括號與 or 組合,再用單引號包起來,避免 shell 先解讀括號。下面是依照 man 頁面範例只挑出 ssh 連線的結果。
ss -tn state established '( dport = :ssh or sport = :ssh )'Recv-Q Send-Q Local Address:Port Peer Address:Port Process
0 0 203.0.113.10:22 198.51.100.7:51114TIME-WAIT 是連線中斷後會暫時留下的狀態。預設輸出不會顯示,必須用 [state time-wait] 另外挑出才看得到。
ss -tn state time-waitRecv-Q Send-Q Local Address:Port Peer Address:PortProcess
0 0 127.0.0.1:28750 127.0.0.1:80
0 0 127.0.0.1:57698 127.0.0.1:8080
0 0 [::1]:31936 [::1]:80狀態名稱寫錯時,指令只會留下一行 [wrong state name] 錯誤就立刻結束。下面是故意輸入 foo 的結果。可用的名稱可以在 [ss -h] 輸出的 TCP-STATES 那一行確認。
ss -tn state fooss: wrong state name: foo📌 主要選項:本文實際執行的結果
| 選項 | 作用 | 本文看到的結果 | |
|---|---|---|---|
| -t | 只輸出 TCP 通訊端 | Unix 通訊端被排除,連接埠位置顯示 ssh、https 等服務名稱 | |
| -n | 不換成服務名稱,以連接埠號碼輸出 | 在 ss -tn 中,ssh 顯示為 22,https 顯示為 443 | |
| -l | 只輸出監聽中(LISTEN)的通訊端 | ss -tln 會列出 22、80、443 號等監聽中的連接埠 | |
| -u | 只輸出 UDP 通訊端 | ss -uln 的狀態欄全為 UNCONN | |
| -p | 把使用通訊端的程式輸出到 Process 欄 | 一般帳號只會顯示我帳號啟動的 python3 名稱與 pid,其他帳號的程式為空白 | |
| -s | 以各種類的數量摘要取代通訊端清單 | TCP 那一行的 estab 9 與 state established 輸出扣掉標題列後的 9 行相同 | |
| -4 | 只輸出 IPv4 通訊端 | ss -t4ln 中以 [::] 開頭的行被排除 | |
| -6 | 只輸出 IPv6 通訊端 | ss -t6ln 中以 0.0.0.0 與 127.0.0.1 開頭的行被排除 | |
| -H | 不含標題列,只輸出通訊端行 | ss -H -tln | wc -l 的行數不含標題列 | |
| state 狀態 | 只留下該狀態的通訊端 | state established 的輸出沒有 State 欄,從 Recv-Q 開始;不存在的名稱會出現 [wrong state name: foo] | |
| dport = :連接埠 | 以對方的連接埠篩選 | dport = :443 篩出兩行連到外部 https 伺服器的連線 | |
| sport = :連接埠 | 以自己這端的連接埠篩選 | 與 -l 一起使用的 sport = :22 篩出 IPv4 與 IPv6 的 22 號監聽兩行 | |
| src 位址 | 只留下該位址的通訊端 | ss -tln src 127.0.0.1 只列出只接受伺服器內部連線的 127.0.0.1 連接埠 |
📎 其他選項:依官方手冊
| 選項 | 作用 | |
|---|---|---|
| -a, --all | 同時輸出監聽中與連線中的通訊端 | |
| -r, --resolve | 把位址與連接埠號碼解析成名稱輸出 | |
| -e, --extended | 輸出每個通訊端的 uid、inode 等詳細資訊 | |
| -o, --options | 輸出 TCP 重傳、keepalive 等計時器資訊 | |
| -m, --memory | 輸出通訊端使用的記憶體 | |
| -i, --info | 輸出 TCP 內部資訊(rtt、cwnd 等) | |
| -x, --unix | 只輸出 Unix 網域通訊端 | |
| -w, --raw | 只輸出 RAW 通訊端 | |
| -f 類型 | 依 unix、inet、inet6、link、netlink 等通訊端類型挑選 | |
| -Q, --no-queues | 不含 Recv-Q 與 Send-Q 欄輸出 | |
| -K, --kill | 強制關閉符合篩選條件的通訊端,核心不支援的通訊端會略過 | |
| -E, --events | 持續輸出正在關閉的通訊端 | |
| -V, --version | 輸出版本資訊 |
🔲 ss 指令模擬器
在下方模擬器中,可以親自輸入目前介紹過的選項與篩選條件,並與 [netstat -tln] 的輸出比較。
5️⃣ ss 通訊端摘要(-s)
-s 會以各種類的數量摘要取代通訊端清單輸出。依 man 頁面所述,它不是逐一計算清單,而是從多種統計資料彙整數字。
ss -sTotal: 340
TCP: 48 (estab 9, closed 15, orphaned 0, timewait 13)
Transport Total IP IPv6
RAW 0 0 0
UDP 8 4 4
TCP 33 25 8
INET 41 29 12
FRAG 0 0 0TCP 那一行的 estab 是目前已建立的連線數,所以可以和同一時間用 [state established] 輸出的行數對照。
ss -tn state established | wc -l10輸出 10 行扣掉 1 行標題列是 9 行,與 -s 的 estab 9 相同。timewait 13 是必須用 [state time-wait] 挑出才看得到的 TIME-WAIT 通訊端數量。
6️⃣ ss 指令與 netstat 比較
netstat所在的 net-tools 套件,其 man 頁面把 netstat 寫成幾乎已不再使用的程式(mostly obsolete),並建議改用 ss。不過,依 netstat 輸出格式寫成的指令碼,改用 ss 後因欄位順序與位址寫法不同,無法直接讀取。
在同一台伺服器上用兩個指令輸出監聽中的 TCP 連接埠,netstat 把狀態放在最後,IPv6 位址寫成 :::22。
netstat -tlnActive 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
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 :::80 :::* LISTEN
tcp6 0 0 :::443 :::* LISTENss 則把狀態放在最前面,IPv6 位址用方括號包起來,寫成 [::]:22。
ss -tlnState Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
LISTEN 0 511 0.0.0.0:443 0.0.0.0:*
LISTEN 0 511 127.0.0.1:8080 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 511 [::]:80 [::]:*
LISTEN 0 511 [::]:443 [::]:*常用的 netstat 選項改用 ss 與 ip 指令時,對照如下。
| netstat | 替代指令 / 查看內容 |
|---|---|
| netstat -tln | ss -tln監聽中的 TCP 連接埠,以號碼顯示 |
| netstat -tulpn | ss -tulpn監聽中的 TCP 與 UDP 連接埠及程式 |
| netstat -tan | ss -tan所有 TCP 通訊端,以號碼顯示 |
| netstat -r | ip route路由表 |
| netstat -i | ip -s link網路介面統計 |
🔢 FAQ & 推薦內容






ℹ️ 聯盟行銷說明
本站內容包含聯盟行銷連結。訪客透過這些連結購買商品或服務時,本站會從賣家獲得佣金。在這個過程中,購買者支付的金額(遇到活動折扣時金額會降低↓)並不會因此提高。刊登的價格、折扣與庫存資訊以撰寫當時為準,可能與實際情況不同,購買前請向賣家做最後確認。商品的挑選與評價依本站自訂的標準撰寫,是否支付佣金不會影響介紹順序或評價內容。



