SSD Nodes Learn Hosting plans →
指南 Matt Connor作者: Matt Connor · 已更新 2026-08-30

Linux Port 與服務監聽:用 ss 查詢

了解 Port 如何將流量分配給 Linux 服務,並用 ss -tlnp 查看監聽中的程式、Port 與 Local Address,分辨僅本機或公開監聽。

Port 的實際用途

Port 是一組數字,可讓同一台伺服器同時執行多個服務,避免不同服務的網路流量混在一起。您的 VPS 只有一個 IP 位址,但可以同時執行 web server、SSH server 和資料庫。封包抵達時,作業系統需要知道封包要交給哪個服務。Port number 就是用來識別目標的資訊。Web 流量會傳送到 port 443,SSH 會傳送到 port 22。IP 位址負責將封包送到伺服器,port 則負責將封包交給該伺服器上的正確程式。

Port 是 16-bit number:16 bits 可表示 0 到 65535,而 0 已保留,因此實務上使用的 port 範圍是 1 到 65535。低於 1024 的 port 稱為「well-known」port,開啟這些 port 需要 root 權限,因此標準服務通常使用這個範圍:22 用於 SSH、80 用於 HTTP、443 用於 HTTPS、53 用於 DNS。高於 1024 的 port 可供一般程式使用。

Port 分為 TCP 和 UDP 兩種。兩者使用相同的 port number 時,彼此仍是獨立的。TCP 是大多數服務使用的 connection-based protocol,例如 SSH、HTTP 和資料庫。UDP 不需要建立連線,常用於 DNS 和部分 VPN。設定防火牆時,通常需要指定使用哪一種協定,例如 22/tcp

監聽表示程式正在等待連接

需要接收連接的程式會要求核心在某個連接埠上「監聽」。從這一刻起,該連接埠會在電腦上開啟,程式會回應抵達該處的所有連線,但仍受防火牆規則限制。沒有程式監聽的連接埠只會拒絕連線。因此,任何安全性檢查的第一個問題都是:目前有哪些程式在監聽,以及監聽在哪裡。

用來回答這個問題的命令是 ss

sudo ss -tlnp

這些旗標分別表示 TCP(t)、僅顯示監聽中的 socket(l)、使用數字格式顯示連接埠(n,因此會看到 22,而不是 ssh),以及顯示擁有該 socket 的程序(p)。典型結果如下:

State   Recv-Q  Local Address:Port   Process
LISTEN  0       0.0.0.0:22           sshd
LISTEN  0       127.0.0.1:5432       postgres
LISTEN  0       [::]:80              nginx

Process 欄會告訴你每個連接埠由哪個程式擁有。你可以藉此找出不小心留下執行中的程式。

Local Address 欄位才是重點

請仔細查看每個連接埠前的位址,因為它決定哪些對象可以連線到該服務。以下是最常見的 3 種情況。

0.0.0.0:22 表示在這台機器擁有的所有 IPv4 位址上監聽,包括公開位址。只要防火牆允許,該服務就能透過 IPv4 從網際網路連線。

[::]:80 對 IPv6 的意義相同:在所有 IPv6 位址上監聽,包括公開位址。許多程式預設會繫結至此,而在 Linux 中,:: socket 通常也會接受 IPv4 連線。

127.0.0.1:5432 表示「僅在 loopback 上監聽」。127.0.0.1 是機器用來與自身通訊的位址,無法從其他位置路由到此處。繫結至此位址的服務只能由同一台伺服器存取,永遠無法從網際網路連線,不受防火牆設定影響。上方的 Postgres 列就是透過這種設定確保安全。

實務規則很明確:只有自有應用程式會使用的資料庫、快取或管理面板,應繫結至 127.0.0.1,而不是 0.0.0.0。如果服務從未在公開位址上監聽,攻擊者就沒有可連線的入口。

監聽不等於可連線

還有一個區別可以避免許多混淆。主機上的埠已開啟,也就是某個程式正在監聽,與外部是否能連線到該埠並不相同;後者取決於防火牆是否允許流量通過。遠端用戶端必須同時滿足這兩個條件才能建立連線。從用戶端觀察時,這兩種失敗也有不同表現:連線遭拒表示沒有程式正在監聽;連線卡住後逾時,通常表示防火牆丟棄了封包,這正是 這兩個 SSH 錯誤所表示的情況

因此,這裡有兩層控制。您可以設定每項服務的繫結位址,決定哪些位址接受監聽。您也可以設定防火牆,決定外部網路可以連線到哪些服務。管理完善的伺服器會同時使用這兩種控制:服務只繫結到必要的位址,防火牆則拒絕所有未明確允許的流量。使用 ss 查看正在監聽的服務是第一步;決定防火牆允許哪些連線是第二步,詳見 UFW 防火牆入門

這裡還有一個容易造成問題的細節。IPv4 與 IPv6 是分開的。如果防火牆只涵蓋 IPv4,[::] 服務就可能在 IPv6 上保持開放。這個特定陷阱另有專文說明:IPv6 防火牆陷阱

FAQ

如何查看 Linux 伺服器上開放了哪些埠?

執行 sudo ss -tlnp 查看 TCP,或執行 sudo ss -ulnp 查看 UDP。該指令會列出所有監聽中的 socket、埠號、繫結的本機位址,以及擁有該 socket 的程序。查看 Local Address 欄位:0.0.0.0[::] 表示服務已暴露於網路,127.0.0.1 則表示服務只在本機監聽。

0.0.0.0 和 127.0.0.1 有何差異?

0.0.0.0 表示「監聽所有 IPv4 位址」,包括公開位址,因此服務可從網路存取。127.0.0.1 是 loopback 位址,供機器與自身通訊。它無法從其他位置路由到達,因此繫結至該位址的服務只能在本機存取。請將內部服務繫結至 127.0.0.1,確保服務不會暴露於網路。

服務要正常運作,是否需要在防火牆開放埠?

只有必須由其他機器存取的服務才需要。繫結至 127.0.0.1 的服務不需要防火牆規則,因為外部來源無法存取該服務。使用 0.0.0.0[::] 的服務需要防火牆規則來允許網路流量;在新增規則前,預設應拒絕該流量。

TCP 埠和 UDP 埠有何差異?

TCP 以連線為基礎,SSH、Web 伺服器與資料庫等大多數服務都使用 TCP。UDP 不建立連線,DNS 與部分 VPN 使用 UDP。TCP 和 UDP 中相同的數字代表不同的埠,因此 53/tcp53/udp 是不同的埠。撰寫防火牆規則時,必須指定通訊協定,例如 22/tcp