IP 連接埠範圍是多少?0–65535 的三段劃分與常用連接埠
連接埠號是 TCP、UDP 報文頭裡的 16 位欄位,所以 IP 連接埠範圍是 0–65535,共 65536 個。IANA 把它分成三段:0–1023 知名連接埠、1024–49151 註冊連接埠、49152–65535 動態連接埠。連接埠 0 保留不用,TCP 和 UDP 的同號連接埠互不相干;查本機監聽用 ss 或 netstat,查遠端連接埠用 nc、telnet 或 Test-NetConnection。
IP 連接埠範圍是 0–65535。連接埠號寫在 TCP 和 UDP 的報文頭裡,欄位長度 16 位,2¹⁶ = 65536,所以最小是 0、最大是 65535。嚴格地說連接埠屬於傳輸層,IP 報文頭裡並沒有連接埠,“IP 連接埠”是把“IP 位址 + 連接埠”連在一起說的習慣叫法。IANA 按 RFC 6335 把這 65536 個號分成三段:0–1023 知名連接埠(也叫系統連接埠),1024–49151 註冊連接埠(使用者連接埠),49152–65535 動態連接埠(私有連接埠)。下面先講三段的區別和幾個容易誤解的地方,再給常用連接埠表,最後是查本機連接埠和測遠端連接埠的命令。
三段連接埠有什麼區別
| 範圍 | 名稱 | 怎麼分配 | 實際用途 |
|---|---|---|---|
| 0–1023 | 知名連接埠(System Ports) | 須經 IETF 稽核或 IESG 批准,由 IANA 分配 | SSH 22、HTTP 80、HTTPS 443 等基礎服務;Linux 上普通使用者預設不能監聽 |
| 1024–49151 | 註冊連接埠(User Ports) | 廠商或專案向 IANA 申請登記 | MySQL 3306、RDP 3389、Redis 6379 等應用;登記不等於獨佔,任何程式都能用 |
| 49152–65535 | 動態連接埠(Dynamic/Private Ports) | IANA 不分配 | 客戶端發起連線時,由系統臨時分配作源連接埠 |
幾個常被問到的細節:
- 連接埠 0 是保留號,不作為服務連接埠使用。程式呼叫 bind 時把連接埠寫成 0,意思是“讓系統隨便給一個空閒連接埠”,並不是真的用了 0 號連接埠。
- TCP 和 UDP 各有一套 0–65535。TCP 53 和 UDP 53 是兩個不同的連接埠,防火牆要分別放行;DNS 兩個都用,NTP 只用 UDP 123。
- ICMP 沒有連接埠。ping 用的是 ICMP,所以“ping 得通”和“連接埠通不通”沒有必然關係:伺服器禁 ping 時連接埠照樣可能是通的,ping 得通的機器連接埠也可能被防火牆攔著。
- 低於 1024 的連接埠在 Linux 上需要特權。普通使用者啟動的程式監聽 80 連接埠會報 Permission denied,要用 root 啟動、給程式加
CAP_NET_BIND_SERVICE能力,或者調低net.ipv4.ip_unprivileged_port_start(核心 4.11 起提供,預設值 1024)。Windows 沒有這條限制。 - 同一個 IP 上,同一協議的同一連接埠同一時間只能被一個程式監聽,特意開啟連接埠複用的情況除外。伺服器有多個 IP 時,可以在不同 IP 上分別監聽同一個連接埠;程式監聽在 0.0.0.0,表示佔用本機所有 IPv4 位址上的這個連接埠。
系統實際用的臨時連接埠範圍
RFC 6335 建議用 49152–65535 作臨時連接埠,但各系統的預設值並不一樣:
| 系統 | 預設臨時連接埠範圍 | 檢視命令 |
|---|---|---|
| Linux | 32768–60999 | sysctl net.ipv4.ip_local_port_range |
| Windows Vista、Windows Server 2008 及以後的版本 | 49152–65535 | netsh int ipv4 show dynamicport tcp |
Linux 的預設範圍有一大半(32768–49151)落在註冊連接埠段裡,會帶來一個實際問題:如果你把某個服務配在 40000 連接埠,它重啟的那一刻,這個連接埠可能正被某個對外連線臨時佔用,服務就會啟動失敗,而且只是偶爾出現,很難復現。解決辦法是把服務連接埠加入保留列表,系統分配臨時連接埠時會跳過它們(以 root 執行):
sysctl net.ipv4.ip_local_port_range # 檢視,預設是 32768 到 60999
sysctl -w net.ipv4.ip_local_reserved_ports=40000-40010 # 立即生效
echo 'net.ipv4.ip_local_reserved_ports = 40000-40010' > /etc/sysctl.d/90-reserved-ports.conf # 重啟後保持
netsh int ipv4 show dynamicport tcp # Windows:顯示 TCP 臨時連接埠的起點和數量
臨時連接埠範圍也決定了無狀態 ACL 怎麼寫。機房邊界的 ACL 不跟蹤連線狀態時,伺服器主動存取外部(例如下載系統更新)的回包,目的連接埠落在這段臨時連接埠裡,規則裡要放行,否則會出現“對外提供的服務正常,伺服器自己卻上不了網”。Linux 和 Windows 伺服器混在同一個網段時,兩種預設範圍合起來是 32768–65535,按這個區間放行回包。
常用連接埠號一覽
下表是各服務的預設連接埠。服務都可以改連接埠,所以“某個連接埠開著”不代表一定是這個服務,以實際監聽的程序為準。
| 連接埠 | 協議 | 服務 | 說明 |
|---|---|---|---|
| 20、21 | TCP | FTP | 21 是控制連線,20 是主動模式的資料連線;被動模式的資料連線用伺服器指定的高位連接埠 |
| 22 | TCP | SSH、SFTP、SCP | Linux 和網路裝置的遠端登入 |
| 23 | TCP | Telnet | 明文傳輸,交換器上建議關閉 |
| 25 | TCP | SMTP | 郵件伺服器之間投遞,不少雲平台預設封禁出方向的 25 連接埠 |
| 53 | TCP、UDP | DNS | 普通查詢走 UDP,區域傳送和較大的回應走 TCP |
| 67、68 | UDP | DHCP | 67 是服務端,68 是客戶端,PXE 裝機也要用 |
| 69 | UDP | TFTP | PXE 裝機、網路裝置配置備份 |
| 80 | TCP | HTTP | 網頁 |
| 110、995 | TCP | POP3、POP3S | 收信 |
| 123 | UDP | NTP | 時間同步 |
| 143、993 | TCP | IMAP、IMAPS | 收信 |
| 161、162 | UDP | SNMP | 161 接收查詢,162 接收 Trap |
| 179 | TCP | BGP | 路由器之間的 BGP 會話 |
| 443 | TCP、UDP | HTTPS | UDP 443 用於 HTTP/3(QUIC) |
| 445 | TCP | SMB | Windows 檔案共享,不要對公網開放 |
| 465、587 | TCP | SMTP 提交 | 郵件客戶端發信,465 為隱式 TLS |
| 514 | UDP | Syslog | 裝置日誌 |
| 623 | UDP | IPMI | BMC 帶外管理 |
| 873 | TCP | rsync | 檔案同步 |
| 1433 | TCP | SQL Server | 資料庫 |
| 1521 | TCP | Oracle | 資料庫 |
| 2049 | TCP、UDP | NFS | 網路檔案系統 |
| 3306 | TCP | MySQL、MariaDB | 資料庫 |
| 3389 | TCP | RDP | Windows 遠端桌面 |
| 5432 | TCP | PostgreSQL | 資料庫 |
| 5900 | TCP | VNC | 第二個顯示是 5901,依此類推 |
| 6379 | TCP | Redis | 預設不設密碼,只應在內網監聽 |
| 8080、8443 | TCP | 備用 HTTP、HTTPS | 常見於 Java 應用和各類管理後台 |
| 9100 | TCP | node_exporter | Prometheus 採集主機指標 |
| 10050、10051 | TCP | Zabbix | 10050 是 agent,10051 是 server |
| 27017 | TCP | MongoDB | 資料庫 |
看到一個陌生連接埠號,想知道它一般對應什麼服務,可以查本機的服務名資料庫。Linux 用 getent services 3306,輸出 mysql 3306/tcp;Windows 的同名檔案在 C:\Windows\System32\drivers\etc\services。這只是“約定俗成用這個號”的列表,不代表本機真的開著這個服務。
查本機在監聽哪些連接埠
Linux 上一條命令列出所有 TCP、UDP 監聽連接埠和對應程序,用 root 執行才能看到全部程序名:
ss -tulnp
看 Local Address:Port 這一列就能判斷連接埠對誰開放:0.0.0.0:22 和 [::]:22 表示本機所有位址都在監聽,防火牆放行時外部就能連;127.0.0.1:6379 只接受本機連線,外部永遠連不上;10.40.66.12:6789 只在這一個位址上監聽,從伺服器的其他 IP 進來是連不上的。
Windows 有三種查法:
netstat -ano | findstr LISTENING
Get-NetTCPConnection -State Listen | Sort-Object LocalPort | Select-Object LocalAddress, LocalPort, OwningProcess
Get-NetUDPEndpoint | Sort-Object LocalPort | Select-Object LocalAddress, LocalPort, OwningProcess
netstat -ano 的最後一列和 PowerShell 輸出裡的 OwningProcess 都是程序號,再用 Get-Process -Id 程序號 或 tasklist /FI "PID eq 程序號" 查出是哪個程式。UDP 沒有“監聽”狀態,所以第一條命令只列出 TCP,UDP 要用第三條看。
查遠端 IP 的連接埠通不通
測 TCP 連接埠,Linux 和 Windows 各有順手的工具:
nc -zv -w 3 203.0.113.10 443 # -z 只測能否建立連線,-w 3 最多等 3 秒
timeout 3 bash -c '</dev/tcp/203.0.113.10/443' && echo open || echo closed # 沒裝 nc 時用 bash 自帶的功能
telnet 203.0.113.10 443
Test-NetConnection 203.0.113.10 -Port 443 # 看結果裡 TcpTestSucceeded 是 True 還是 False
nc 有 OpenBSD 版、傳統版和 Nmap 附帶的 ncat 等幾種實現,提示文字略有不同,判讀方法一樣。Windows 預設不帶 telnet 客戶端,需要在“啟用或關閉 Windows 功能”裡勾選,所以優先用 Test-NetConnection。
結果怎麼讀,關鍵是分清“立刻被拒絕”和“等了很久超時”:
| 現象 | 含義 | 下一步 |
|---|---|---|
| 成功:nc 顯示 succeeded 或 Connected,telnet 顯示 Connected to,TcpTestSucceeded 為 True | 三次握手完成,連接埠上有程式在監聽 | 網路層沒問題,排查應用本身 |
| 立刻失敗:Connection refused | 包到達了目標主機,但連接埠上沒有程式監聽,或者防火牆用拒絕(REJECT)方式回了 RST 或 ICMP 連接埠不可達 | 在伺服器上用 ss 或 netstat 看服務是否在執行、監聽在哪個位址 |
| 等待後超時:timed out,telnet 一直停在 Trying | 包在路上被丟棄:安全組或防火牆用丟棄(DROP)方式攔截,或者主機不線上、路由不通 | 從近到遠查:伺服器防火牆、安全組或機房 ACL、中間鏈路 |
| 連上後馬上斷開 | 連接埠在監聽,但應用主動關閉了連線,常見於來源 IP 不在白名單、連線數已滿。nc -z 和 Test-NetConnection 遇到這種情況也顯示成功,要用 telnet 或不加 -z 的 nc 連上去才看得出來 |
查服務自身的存取控制和日誌 |
UDP 沒有握手,nc -zvu 發出去沒有回應,既可能是連接埠開著但應用不回包,也可能是被防火牆丟了,結論不可靠;只有收到 ICMP 連接埠不可達,才能確定連接埠沒開。測 UDP 服務要用應用自己的請求:DNS 用 dig @203.0.113.53 example.com,SNMP 用 snmpget -v2c -c 團體名 203.0.113.20 SNMPv2-MIB::sysUpTime.0,IPMI 用 ipmitool -I lanplus -H 位址 -U 使用者 -P 密碼 mc info,收到正常應答才算通。
查一個 IP 開放了哪些連接埠
想知道一台伺服器對外暴露了哪些連接埠,用 nmap 從外部掃一遍,比登入上去看監聽列表更接近攻擊者看到的樣子,因為它把防火牆和安全組的效果也算進去了:
nmap -Pn 203.0.113.10 # 預設掃最常用的 1000 個 TCP 連接埠
nmap -Pn -p- 203.0.113.10 # 掃全部 1–65535
sudo nmap -Pn -sU -p 53,123,161,623 203.0.113.10 # UDP 慢,只掃指定連接埠,需要 root
-Pn 表示不先探測主機是否線上,適合禁 ping 的伺服器。結果裡的 open 是有程式在監聽,closed 是能到達但沒有程式監聽,filtered 是被防火牆丟棄、無法判斷,UDP 常見的 open|filtered 表示沒有收到任何回應。只掃描自己管理或已獲授權的位址:對別人的伺服器做連接埠掃描,可能違反服務商的使用條款和相關法規。
IP 連接埠和交換器連接埠不是一回事
在機房裡,“開連接埠”“關連接埠”至少有三種意思,工單裡說不清楚很容易做錯:
| 說法 | 指的是 | 在哪裡操作 |
|---|---|---|
| TCP/UDP 連接埠,如 3389 | 邏輯編號,標識伺服器上的某個服務 | 系統防火牆、安全組、機房 ACL |
| 交換器連接埠,如 GigabitEthernet0/0/12 | 交換器面板上的物理網口 | 交換器上開啟、關閉,修改 VLAN 和限速 |
| BMC 管理口 | 伺服器上專門接 BMC 的物理網口,BMC 自己再監聽 UDP 623、TCP 443 等連接埠 | 管理網交換器,BMC 的網路和服務設定 |
欠費停機、被攻擊時臨時斷網,關的通常是交換器物理連接埠。Toplink DCIM 的交換器管理按廠商指令集遠端開關連接埠、修改 VLAN、設定進出方向的限速,不用逐台登入交換器敲命令。BMC 那一側的 623、443 和控制檯連接埠,也不必對每個維運人員的電腦放行:部署在各機房的從節點接入管理網、就近連線 BMC,維運人員只存取 DCIM 後台,在瀏覽器裡開啟 IPMI 遠端管理的控制檯即可。
常見問題
連接埠號能超過 65535 嗎?
不能。連接埠欄位只有 16 位,65535 是最大值。配置檔案或防火牆規則裡出現 65536 以上的數字,要麼會被拒絕,要麼是填錯了,應當改正。
一台伺服器最多能有多少個連線,是不是受 65535 限制?
不是。一個連線由協議、源 IP、源連接埠、目的 IP、目的連接埠五項共同確定,服務端監聽一個連接埠就能接受來自不同客戶端的大量連線,上限取決於記憶體和檔案描述符。受連接埠數限制的是主動向外連線的一方:從同一個源 IP 連同一個目標 IP 和連接埠時,可用的源連接埠數就是臨時連接埠範圍的大小。
自己的服務應該用哪個連接埠?
從 1024–49151 裡挑一個不和常用服務衝突的。在 Linux 上還要避開 32768–60999 這段臨時連接埠範圍,或者用 net.ipv4.ip_local_reserved_ports 把它保留下來,否則服務重啟時可能碰上連接埠正被某個對外連線臨時佔用。