ss 指令:查看 Linux 連接埠與程序,並與 netstat 比較

測試環境Debian 系列Debian 12iproute2 6.1.0一般使用者帳號2026-11-04 確認
網路指令ss位置/usr/bin/ss

在 Linux 伺服器上,哪些連接埠開著、誰正連線中,可以用 ss 指令查看。ss 是 iproute2 中取代 netstat 的通訊端查詢工具。在 Debian 12 伺服器上用 ss 查詢監聽中(LISTEN)的連接埠與連線後確認,使用一般帳號時,即使加上 -p,其他帳號啟動的程式名稱也不會出現在 Process 欄。

以下輸出是在英文 locale 下執行的結果。伺服器與對方的位址以範例位址表示。

1️⃣ ss 指令基本用法與輸出欄位

不加選項執行 ss 時,監聽中的連接埠不會列出,只會顯示已建立連線的通訊端。在測試伺服器上,最前面幾行全是伺服器內程式彼此溝通用的 Unix 通訊端(u_str、u_dgr)。

ss | head -n 5
Netid 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 -t
State 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 -tn
State 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:443

Recv-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 -tln
State  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 -tl
State  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 -uln
State  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 -tulpn
Netid 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 -tlnp
State  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/fd
ls: 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 = :8000
State  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 = :443
State  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 欄會如何隨帳號改變,可以在下方圖表中切換帳號比較。

🧭 ss -p 與帳號:Process 欄被填入的條件
說明圖解
👤 帳號
$# ss -tlnp
監聽中的通訊端程序資訊Process 欄
0.0.0.0:22LISTEN
➜
/proc/812/fd擁有者: root
➜
其他帳號的程序:無法讀取root:可讀取所有程序Process 欄空白users:(("sshd",pid=812,fd=3))
127.0.0.1:8080LISTEN
➜
/proc/2100/fd擁有者: root
➜
其他帳號的程序:無法讀取root:可讀取所有程序Process 欄空白users:(("app",pid=2100,fd=3))
127.0.0.1:8000LISTEN
➜
/proc/343015/fd擁有者: user
➜
我帳號的程序:可讀取root:可讀取所有程序users:(("python3",pid=343015,fd=3))
一般帳號無法讀取其他帳號啟動之程序的 /proc 資訊,因此那些行的 Process 欄是空的,只有用自己帳號啟動的 python3 那一行會被填入。
root 可以讀取所有程序的資訊,所以每個監聽中通訊端的程式名稱與 pid 都會輸出到 Process 欄。

4️⃣ ss 狀態與連接埠篩選選項

  • ↪️ state, dport, sport

即使查看過開啟的連接埠,現在是誰連到那些連接埠,還是要另外篩選。ss 會在選項後面加上篩選條件,只留下需要的行。

在 state 後面寫上狀態名稱,就只會留下該狀態的通訊端。[ss -tn state established] 的輸出沒有 State 欄,從 Recv-Q 欄開始。

ss -tn state established
Recv-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 = :443
State 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 = :22
State  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:51114

TIME-WAIT 是連線中斷後會暫時留下的狀態。預設輸出不會顯示,必須用 [state time-wait] 另外挑出才看得到。

ss -tn state time-wait
Recv-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 foo
ss: 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] 的輸出比較。

ss 指令模擬器iproute2 6.1.0
[root@server work]#
這是只在瀏覽器內運作的一般帳號(user)畫面,可用 ↑↓ 叫出先前輸入的指令。

5️⃣ ss 通訊端摘要(-s)

-s 會以各種類的數量摘要取代通訊端清單輸出。依 man 頁面所述,它不是逐一計算清單,而是從多種統計資料彙整數字。

ss -s
Total: 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         0

TCP 那一行的 estab 是目前已建立的連線數,所以可以和同一時間用 [state established] 輸出的行數對照。

ss -tn state established | wc -l
10

輸出 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 -tln
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
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                  :::*                    LISTEN

ss 則把狀態放在最前面,IPv6 位址用方括號包起來,寫成 [::]:22。

ss -tln
State  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 -tlnss -tln監聽中的 TCP 連接埠,以號碼顯示
netstat -tulpnss -tulpn監聽中的 TCP 與 UDP 連接埠及程式
netstat -tanss -tan所有 TCP 通訊端,以號碼顯示
netstat -rip route路由表
netstat -iip -s link網路介面統計
取代 netstat -r 與 netstat -i 的 ip 指令,寫在 net-tools 的 netstat(8) man 頁面 NOTES 中。

🔢 FAQ & 推薦內容

加上 -4 只留下 IPv4 通訊端,加上 -6 只留下 IPv6 通訊端。[ss -t4ln] 中以 [::] 開頭的行被排除,[ss -t6ln] 中以 0.0.0.0 與 127.0.0.1 開頭的行被排除。

在 src 後面寫上位址,就只會留下該位址的監聽中通訊端。[ss -tln src 127.0.0.1] 只輸出了無法從伺服器外部連線的 127.0.0.1 連接埠。

加上 -H 就只會輸出通訊端行,沒有標題列。像 [ss -H -tln | wc -l] 這樣計算行數時,標題列那一行不會被一起算進去。

🧭 網路指令推薦內容 文章 13・參考 3
🗂️ 網路指令
📄 ip 指令 📄 netstat · ifconfig 指令 📄 nmtui 指令 📄 ss 指令
📄 SSH 指令 📄 rsync 指令 📄 wget 指令 📄 rz · sz 指令
📄 host 指令 📄 nslookup 指令
📄 iptables 指令 📄 firewall-cmd 指令 📄 certbot 指令

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

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Prove your humanity: 9   +   10   =