網路與 IP

連接埠是什麼意思?連接埠號的作用、分類與檢視方法

連接埠是傳輸層協議(TCP、UDP)用來區分同一台主機上不同程式的編號,取值 0–65535。IP 位址負責把資料送到哪台主機,連接埠號負責交給主機上的哪個程式:存取網站連的是伺服器的 443 連接埠,SSH 登入連的是 22 連接埠。連接埠的英文是 port,連接埠號是 port number。

作者 頂聯產品團隊發布於 6 分鐘閱讀

連接埠是什麼意思?在網路通訊裡,連接埠(英文 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 的資料包到達後,系統按下面的順序處理:

  1. 網路卡收下資料,IP 層確認目的位址是本機;
  2. 看 IP 報文頭裡的協議號,6 是 TCP,17 是 UDP,交給對應的協議處理;
  3. TCP 層讀出目的連接埠 443,找到正在監聽 443 的程式 nginx,把資料交給它;
  4. 如果沒有程式監聽這個連接埠,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 的才是外面真正連得上的。只掃描自己有權管理的位址。

想看看在你的機房裡怎麼用?

從一次產品示範開始,梳理你的業務鏈路。

查看價格
服務熱線 400-112-2951

讓我們聊聊你的 IDC 業務

掃碼新增企業微信,預約產品示範或申請試用。

Toplink 企業微信二維碼

長按儲存或使用企業微信 / 微信掃描

也可致電
400-112-2951
Telegram
@TopLink88