連接埠是什麼意思?連接埠號的作用、分類與檢視方法
連接埠是傳輸層協議(TCP、UDP)用來區分同一台主機上不同程式的編號,取值 0–65535。IP 位址負責把資料送到哪台主機,連接埠號負責交給主機上的哪個程式:存取網站連的是伺服器的 443 連接埠,SSH 登入連的是 22 連接埠。連接埠的英文是 port,連接埠號是 port number。
連接埠是什麼意思?在網路通訊裡,連接埠(英文 port)是 TCP 和 UDP 用來區分同一台主機上不同程式的編號,是 0 到 65535 之間的一個整數。一台伺服器只有一個或幾個 IP 位址,卻同時跑著網站、SSH、資料庫等多個服務,資料包到達之後要靠連接埠號決定交給誰:發往 203.0.113.10 的 443 連接埠,交給網站程式 nginx;發往 22 連接埠,交給 SSH 服務 sshd。所以常說“IP 找主機,連接埠找程式”。連接埠不是一個看得見的介面,而是寫在每個 TCP、UDP 報文頭裡的一個數字。
連接埠是幹什麼的:IP 找主機,連接埠找程式
打個比方:IP 位址像公司的總機號碼,連接埠號像分機號。總機能把電話接進公司,但要找到具體某個人,還得撥分機號。資料包也一樣,先按 IP 位址送到伺服器,再按連接埠號交給伺服器上的某個程式。
以一台典型的網站伺服器為例,上面的程式和連接埠是這樣分工的:
| 程式 | 協議與連接埠 | 監聽在哪個位址 | 誰能連上 |
|---|---|---|---|
| nginx | TCP 80、443 | 0.0.0.0(本機所有 IPv4 位址) | 任何人,前提是防火牆放行 |
| sshd | TCP 22 | 0.0.0.0 | 任何人,應當用防火牆限制來源 |
| mysqld | TCP 3306 | 127.0.0.1 | 只有本機的程式 |
| chronyd | UDP 323 | 127.0.0.1 | 只有本機的 chronyc 管理命令 |
一個發往 203.0.113.10:443 的資料包到達後,系統按下面的順序處理:
- 網路卡收下資料,IP 層確認目的位址是本機;
- 看 IP 報文頭裡的協議號,6 是 TCP,17 是 UDP,交給對應的協議處理;
- TCP 層讀出目的連接埠 443,找到正在監聽 443 的程式 nginx,把資料交給它;
- 如果沒有程式監聽這個連接埠,TCP 會回一個 RST,客戶端看到的就是“連線被拒絕”;UDP 則通常回一個 ICMP 連接埠不可達。
平時存取網站感覺不到連接埠,是因為瀏覽器替你補上了預設值:http:// 預設 80,https:// 預設 443。服務跑在非預設連接埠上時,就要在位址裡寫出來,例如 http://203.0.113.10:8080/admin,冒號後面的 8080 就是連接埠號。
套接字與五元組:一個連接埠如何同時服務成千上萬個連線
把 IP 位址和連接埠號放在一起,比如 203.0.113.10:443,就確定了網路上的一個通訊端點,叫套接字位址;程式透過作業系統提供的套接字(socket)介面繫結這個位址、收發資料。伺服器上的 nginx 先建立一個監聽套接字守在 443 連接埠,每來一個客戶端,再為這次連線單獨建立一個連線套接字。
一條 TCP 連線由五個要素共同確定,叫五元組:協議、源 IP、源連接埠、目的 IP、目的連接埠。只要其中一項不同,就是另一條連線。同一時刻,四個客戶端連線存取同一個 443 連接埠,互不衝突:
| 協議 | 客戶端(源 IP:源連接埠) | 伺服器(目的 IP:目的連接埠) |
|---|---|---|
| TCP | 198.51.100.7:51544 | 203.0.113.10:443 |
| TCP | 198.51.100.7:51546 | 203.0.113.10:443 |
| TCP | 192.0.2.30:40112 | 203.0.113.10:443 |
| TCP | 192.0.2.30:40113 | 203.0.113.10:443 |
前兩行是同一台電腦開的兩個瀏覽器連線,靠不同的源連接埠區分。客戶端的源連接埠通常不是程式自己挑的,而是作業系統從臨時連接埠範圍裡分配,連線關閉後再回收。所以伺服器一側的連接埠是固定的、事先約定的,客戶端一側的連接埠是臨時的、每次都不一樣。
在伺服器上可以直接看到這種情況:
# 統計當前有多少條已建立的連線正在存取本機的 443 連接埠
ss -Htn state established '( sport = :443 )' | wc -l
# 列出其中幾條,看看對端的 IP 和連接埠
ss -tn state established '( sport = :443 )' | head -5
理解了五元組,防火牆規則就好懂了:入方向放行“目的連接埠 443”,管的是客戶端發來的包;伺服器回給客戶端的包,目的連接埠是客戶端的臨時連接埠,靠防火牆的連線跟蹤自動放行,不需要也不應該去放行一大段高位連接埠。
連接埠號的分類:知名、註冊、動態三段
連接埠號欄位長 16 位,所以範圍是 0–65535,TCP 和 UDP 各有一套,互不相干。IANA 把它分成三段:
| 範圍 | 名稱 | 由誰使用 | 例子 |
|---|---|---|---|
| 0–1023 | 知名連接埠(系統連接埠) | 基礎網路服務,Linux 上普通使用者的程式預設不能監聽 | SSH 22、DNS 53、HTTP 80、HTTPS 443 |
| 1024–49151 | 註冊連接埠 | 各類應用向 IANA 登記的預設連接埠 | MySQL 3306、RDP 3389、Redis 6379 |
| 49152–65535 | 動態連接埠(私有連接埠) | 不分配給固定服務,可用作客戶端的臨時連接埠 | Windows 預設從這一段取臨時連接埠;Linux 預設用 32768–60999 |
這只是約定,不是強制:任何程式都可以監聽任何空閒連接埠,低於 1024 的連接埠只是需要額外許可權。所以看到 3306 開著,並不能斷定那就是 MySQL,要以實際監聽的程序為準;把 SSH 改到 2222,它也照樣是 SSH。
對維運來說,比分類更實用的是知道哪些連接埠該對公網開放、哪些不該:
| 連接埠 | 服務 | 是否對公網開放 |
|---|---|---|
| TCP 80、443 | 網站 | 開放 |
| TCP 22 | SSH | 只對維運 IP 或跳板機開放 |
| TCP 3389 | Windows 遠端桌面 | 只對維運 IP 或跳板機開放 |
| TCP 3306、5432、6379、27017 | MySQL、PostgreSQL、Redis、MongoDB | 不開放,只給本機或內網 |
| UDP 53、TCP 53 | DNS | 只有對外提供解析的 DNS 伺服器開放 |
| UDP 161 | SNMP | 只對監控伺服器開放 |
| UDP 623、TCP 443(BMC) | IPMI 和 BMC 管理介面 | 不開放,只放在管理網 |
連接埠號怎麼檢視:ss -tulnp 與 netstat -ano
Linux 上用 ss 一次列出所有監聽中的 TCP、UDP 連接埠,用 root 執行才能看到每個連接埠屬於哪個程序:
ss -tulnp
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
udp UNCONN 0 0 127.0.0.1:323 0.0.0.0:* users:(("chronyd",pid=712,fd=5))
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=905,fd=3))
tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1320,fd=6))
tcp LISTEN 0 511 0.0.0.0:443 0.0.0.0:* users:(("nginx",pid=1320,fd=7))
tcp LISTEN 0 151 127.0.0.1:3306 0.0.0.0:* users:(("mysqld",pid=1088,fd=21))
tcp LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=905,fd=4))
五個字母分別是:t 看 TCP,u 看 UDP,l 只看監聽狀態,n 顯示數字連接埠而不是服務名,p 顯示程序。讀的時候重點看兩列:
- Local Address:Port:冒號後面是連接埠號,前面是監聽位址。
0.0.0.0和[::]表示本機所有位址,127.0.0.1表示只接受本機連線,外面無論如何都連不上。 - Process:佔用連接埠的程式名和程序號。UDP 沒有連線狀態,顯示為 UNCONN,表示已繫結連接埠、在等資料。
只想知道某個連接埠被誰佔了,加過濾條件即可:ss -lntp 'sport = :80'。老系統沒有 ss 時,用 net-tools 裡的 netstat -tulnp,引數含義相同。
Windows 上用 netstat,-a 顯示全部,-n 顯示數字,-o 顯示程序號:
netstat -ano | findstr :3389
TCP 0.0.0.0:3389 0.0.0.0:0 LISTENING 1132
TCP 203.0.113.20:3389 198.51.100.7:52011 ESTABLISHED 1132
第一行說明 3389 連接埠在所有位址上監聽,第二行是一個已經連進來的遠端桌面會話,最後一列 1132 是程序號。再執行 tasklist /FI "PID eq 1132" 查出程式名;用管理員身份執行 netstat -anb 可以直接顯示程式名。PowerShell 裡也可以寫成 Get-NetTCPConnection -LocalPort 3389。
本機能看到監聽,不代表外面連得上。從另一台機器測試時,Linux 用 nc -zv -w 3 203.0.113.10 443,Windows 用 Test-NetConnection 203.0.113.10 -Port 443。
開放連接埠、防火牆放行、改 SSH 連接埠:連接埠在日常操作裡的意義
日常說的“開放連接埠”,其實是同時滿足三個條件:有程式在一個外部能到達的位址上監聽這個連接埠;本機防火牆放行了這個協議和連接埠;上游的安全組或機房 ACL 也放行了它。少一個都連不上。下面幾種常見操作,換成連接埠的視角來理解:
| 操作 | 在連接埠層面做了什麼 | 命令範例 |
|---|---|---|
| 對外開放 8080 | 程式監聽 0.0.0.0:8080,防火牆允許目的連接埠為 TCP 8080 的入方向包 | firewall-cmd --permanent --add-port=8080/tcp && firewall-cmd --reload,或 ufw allow 8080/tcp |
| Windows 放行連接埠 | 同上,規則寫在 Windows 防火牆裡 | New-NetFirewallRule -DisplayName "Web 8080" -Direction Inbound -Protocol TCP -LocalPort 8080 -Action Allow |
| 關閉一個連接埠 | 讓程式不再監聽:停掉服務,或改成只監聽 127.0.0.1 | systemctl disable --now 服務名 |
| 改 SSH 連接埠 | 讓 sshd 改為監聽另一個號碼,客戶端連線時指定新號碼 | 配置檔案裡的 Port 改為 2222,客戶端用 ssh -p 2222 [email protected] |
| 連接埠對映 | 路由器或防火牆把公網 IP 某連接埠收到的包,轉給內網某台機器的某個連接埠 | 公網 IP:8443 轉到 192.168.1.10:443 |
幾點經驗:
- 防火牆規則必須寫協議。連接埠號在 TCP 和 UDP 裡各算各的,只放行 TCP 53 的 DNS 伺服器,絕大多數走 UDP 的查詢照樣進不來。
- 改 SSH 連接埠要按順序來。先在防火牆上放行新連接埠,再改 sshd 配置並過載,保持當前會話不斷開,另開一個視窗用新連接埠登入成功後,才刪除 22 的放行規則;啟用了 SELinux 的系統還要把新連接埠登記為 SSH 連接埠。順序反了,很容易把自己鎖在門外。
- “Address already in use”就是連接埠被佔了。例如 nginx 啟動時報
bind() to 0.0.0.0:80 failed (98: Address already in use),說明已經有程式在監聽 80,先用ss -lntp 'sport = :80'查出是誰,再決定停掉它還是換連接埠。 - 連接埠對映後,外部看到的連接埠和程式實際監聽的連接埠可以不同。排查時要分清楚,外面存取的是 8443,伺服器上的 nginx 監聽的卻是 443。
在管理系統裡怎麼落地
改連接埠、改防火牆是租用伺服器的客戶最常自己動手、也最容易把自己鎖在外面的操作:SSH 連接埠改了卻沒放行,或者防火牆規則一儲存,遠端連線立刻斷開。這時不必提工單等機房處理,在客戶自助端裡開啟 VNC 控制檯,畫面走 BMC 帶外通道,不依賴伺服器上的任何連接埠,登入進去把配置改回來即可;系統徹底進不去時,還可以進入救援模式修復,不動硬碟資料。
服務商這一側,哪些位址上的連接埠可以對外開放,取決於位址屬於哪個網路。Toplink DCIM 的 IP 位址管理把位址段按公網 IP、IPMI、客戶內網、內網 IP 等型別分別登記,一個位址屬於公網段、客戶內網還是 IPMI 管理段,一查便知,決定哪些連接埠可以對外放行時就有了依據。
常見問題
連接埠和網口是一回事嗎?
不是。網口是看得見的物理介面,比如伺服器背後的 RJ45 電口、交換器面板上的光口;連接埠號是軟體層面的編號,寫在 TCP、UDP 報文頭裡。交換器的“連接埠”通常指物理口,和這裡說的連接埠號是兩個概念。
一個程式可以同時佔用多個連接埠嗎?
可以。nginx 常同時監聽 80 和 443,一些資料庫還會另開管理連接埠。反過來,在同一個 IP 上,同一協議的同一個連接埠同一時間只能被一個程式監聽,除非程式專門開啟了連接埠複用。
怎麼知道自己的伺服器有哪些連接埠暴露在公網上?
ss 只能看到本機在監聽什麼,看不出防火牆和上游 ACL 的效果。可以從外部另一台機器對自己的公網 IP 做一次連接埠掃描,例如 nmap -Pn 203.0.113.10(預設掃常用的 1000 個 TCP 連接埠,加 -p- 掃全部),顯示 open 的才是外面真正連得上的。只掃描自己有權管理的位址。