SSD Nodes Learn
指南 Matt Connor作者: Matt Connor · 已更新 2026-07-24

什麼是 Port?Linux 服務如何監聽埠號與 ss 指令用法

本文解釋 Port 的定義與 TCP/UDP 差異,並教學如何使用 ss 指令檢查 Linux 服務的監聽狀態。了解 0-65535 埠號範圍,並學會辨識 Local Address 欄位中的 0.0.0.0 與 127.0.0.1 差異。

埠 (Port) 的實際定義

埠是一個數字,讓單一伺服器能同時執行多種服務,且不會混淆流量。您的 VPS 只有一個 IP 位址,但可能同時執行 Web Server、SSH Server 與資料庫。當封包到達時,作業系統需要判斷該封包屬於哪項服務,埠號即是答案。Web 流量傳送至 port 443,SSH 傳送至 port 22。IP 位址負責將封包送達您的伺服器,而埠號則負責將封包送達伺服器上的正確程式。

埠是一個 16-bit 的數字:16 bits 可提供 0 到 65535,其中 0 為保留號碼,因此實際使用的埠號範圍為 1 到 65535。低於 1024 的埠稱為「周知埠 (well-known ports)」,開啟時需要 root 權限,這也是標準服務所在的原因:SSH 為 22、HTTP 為 80、HTTPS 為 443、DNS 為 53。1024 以上的埠則可供一般程式使用。

埠分為兩種類型:TCP 與 UDP,兩者中相同的數字是獨立的。TCP 是大多數服務使用的連線導向協定,例如 SSH、HTTP 與資料庫。UDP 是無連線協定,用於 DNS 與某些 VPN。當您設定防火牆時,通常需要指定協定,例如 22/tcp

Listening 代表程式正在等待埠號連線

想要接收連線的程式會要求核心 (kernel) 在特定埠上進行「監聽 (listen)」。從該時刻起,該埠在機器上即為開啟狀態,且在防火牆允許的情況下,程式會回應所有到達該埠的請求。若沒有程式在監聽,該埠會直接拒絕連線。因此,任何安全性檢查的第一步都是:有哪些程式在監聽,以及監聽位置在哪。

用來回答此問題的指令是 ss

sudo ss -tlnp

參數意義如下:TCP (t)、僅限監聽中的 socket (l)、使用數字格式埠號 (n,因此您會看到 22 而非 ssh),以及擁有該連線的進程 (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 欄位才是關鍵

請仔細閱讀每個埠前面的位址,因為它決定了誰可以存取該服務。您會經常看到以下三種情況。

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。如果服務從不監聽公用位址,攻擊者就無法接觸到它。

Listening 不等於可存取 (Reachable)

區分這點可以避免許多混淆。埠在機器上是開啟的(代表有程式在監聽)與該埠從外部可存取(代表防火牆允許)是兩回事。遠端用戶端要建立連線,這兩者必須同時成立。

因此存在兩層控制:您透過設定每個服務的綁定位址 (bind address) 來決定哪些程式在監聽;您透過防火牆來決定外部世界可以存取哪些內容。運作良好的伺服器會同時使用這兩者:服務僅綁定在必要的位置,且防火牆預設拒絕所有未經明確允許的連線。使用 ss 查看監聽狀態是第一步;決定防火牆允許哪些連線則是第二步,詳見 firewalls 101 with UFW

這裡有一個容易被忽略的細節:IPv4 與 IPv6 是分開的,若防火牆僅涵蓋 IPv4,則 [::] 服務在 IPv6 上仍是開啟的。該特定陷阱請參閱專文:the IPv6 firewall trap

FAQ

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

針對 TCP 請執行 sudo ss -tlnp,針對 UDP 請執行 sudo ss -ulnp。這會列出所有監聽中的 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 Server 與資料庫)皆使用 TCP。UDP 是無連線的,用於 DNS 與某些 VPN。在 TCP 與 UDP 中相同的數字是不同的埠,因此 53/tcp53/udp 是不同的。撰寫防火牆規則時,您需要指定協定,例如 22/tcp