ByteScope

常見連接埠對照

這個連接埠上跑什麼、該不該對外開,以及現在是誰占著它。

檔案不會離開你的瀏覽器 — 全部在本機處理。

從卡住的那個連接埠開始查。每一頁都會寫清楚上面跑的是什麼服務、該不該讓外網連得到,以及 macOS、Linux、Windows 各自要下哪一行指令,才能問出是誰占著它。

依分類篩選
連接埠服務傳輸協定上面跑什麼
21FTPTCPFTP 的控制連線——指令和三位數的回應碼走的是這個連接埠,檔案本身則走另一條連線,而那條用的連接埠沒有人告訴過你的防火牆。
22SSHTCPsshd 監聽的連接埠。後面掛著 `scp`、`rsync`、走 SSH 的 `git`、各種通道,還有 SFTP——所以這裡被拒絕一次,會同時弄壞五件不同的事。
23TelnetTCP明文的遠端終端機連接埠。交換器、IP 攝影機和開發板到現在還是把它當出廠管理介面——也是不小心開出去、幾分鐘內就被掃描器找上的那一個。
25SMTPTCP伺服器對伺服器的郵件轉送連接埠——你的應用程式幾乎永遠不該撥它,而它在雲端 VM 上逾時,是供應商擋掉了,不是郵件伺服器掛了。
53DNSTCP/UDP名稱解析的連接埠,UDP 和 TCP 都用——而在多數現代 Linux 桌面上它早就被 systemd-resolved 占走了,這就是你的 dnsmasq 或 Pi-hole 起不來的原因。
80HTTPTCP純文字 HTTP 的連接埠。現在它多半只負責轉去 443——但把它關掉,憑證就續不了約;而以一般使用者身分綁它,伺服器根本啟動不了。
443HTTPSTCP/UDPHTTPS 的連接埠——而且自從 HTTP/3 之後它也是一個 UDP 連接埠,所以只查 TCP 會讓你以為沒人在聽,實際上一半的流量正被好好服務著。
3306MySQLTCPMySQL、MariaDB、Percona 用來聽傳統用戶端協定的連接埠,也是驅動程式回報「連不上」時指的那一個。
3389RDPTCP/UDPWindows 上的遠端桌面監聽者——服務起不來時它已經被占走,而用戶端只是一直轉圈時,封包正被安靜地丟掉。
5432PostgreSQLTCPPostgreSQL 叢集監聽的地方——而當 psql 說連不上,原因不是它只綁回送位址、就是第二個叢集占著,再不然就是被 pg_hba.conf 擋下來。
5900VNCTCPVNC 講的 RFB 協定的基準連接埠——也是為什麼檢視器死都連不上,而伺服器好端端地坐在 5901。
6379RedisTCPRedis 伺服器聽 RESP 的連接埠——你的用戶端說連不到的那一個,也是暴露在外的快取幾個小時內就會被找到的那一個。
8080HTTP alternateTCP80 被占走時,開發伺服器、Tomcat 或代理伺服器會改抓的那個連接埠;也是你需要它的時候,早就有人占著的那一個。
8443HTTPS alternate非 IANA 指派TCP443 的非特權雙胞胎:一般使用者也綁得起來的 TLS 連接埠,也是 Tomcat 和多數設備管理主控台會伸手去拿的那個號碼。
27017MongoDBTCPmongod 和 mongos 預設監聽的地方——也是驅動程式會安靜地花上三十秒選不到伺服器的那個連接埠。

關於這個工具

為「連接埠就是問題本身」的那一刻而寫 幾乎沒有人是出於好奇去查一個連接埠號碼。會查,是因為服務起不來、程式連不上,或是掃描結果冒出一個沒人記得開過的東西在那邊聽。所以這裡每一頁都先給你能解開卡點的東西——macOS、Linux、Windows 上直接點名是哪個行程占著它的那行指令——之後才談那個服務本身是做什麼的。

三行指令,三個坑 「這個連接埠是誰的」在每個系統上的問法都不一樣,而且每一種都有坑。macOS 的 lsof 不加 sudo 只看得到你自己的行程,所以由 Docker 或系統帳號啟動的服務會像不存在一樣。Linux 的 ss 也是同樣道理,所有者那一欄會是空的。Windows 的 netstat 習慣接 findstr,而它比對的是子字串,所以查 :3306:33060 也會一起命中。每一頁除了指令本身,也會寫清楚輸出要怎麼讀。

是指派,還是大家習慣這樣用 連接埠號碼的官方意義只有一個依據:IANA 的 Service Name and Transport Protocol Port Number Registry。很多天天在用的組合其實沒有登記,也有登記了但實務上沒人理的。所以每一頁都會分清楚是哪一種,不把兩者混為一談。範圍也是同一份登記表訂的:0-1023 是系統埠,在 Unix 系統上要有特權才綁得起來;1024-49151 是使用者埠;49152-65535 是動態埠,留給連線發起端臨時挑選。不過作業系統不一定照辦,Linux 預設的臨時埠範圍是 32768-60999。

常見問題

怎麼查出是什麼東西在用這個連接埠?

macOS 用 sudo lsof -nP -iTCP:8080 -sTCP:LISTEN,Linux 用 sudo ss -tlnp 'sport = :8080',Windows 用 netstat -ano | findstr :8080 拿到 PID,再用 tasklist /FI "PID eq <pid>" 換成名字。三種都會一併印出它綁在哪個位址上,所以「別台機器連不連得到」這個下一個問題也順便回答了。

連接埠被占用了,怎麼放出來?

先用上面的指令看清楚持有者是誰,因為答案十之八九是「剛才那個服務還沒真的停掉」,好好停比直接砍安全。如果過一兩分鐘它自己就空出來,那其實根本沒人占著:連線還開著就被關掉的 socket 會停在 TIME_WAIT,沒設 SO_REUSEADDR 的程式就得等計時器跑完才綁得上。Windows 還有一種情況是明明沒人在聽卻還是綁不起來,那是 Hyper-V、WSL2 或 Docker 開機時預留了一段連接埠,用 netsh interface ipv4 show excludedportrange protocol=tcp 可以列出來。

連接埠號碼會決定講什麼協定嗎?

不會。連接埠號碼只是核心用來把封包送到某個 socket 的 16 位元標籤,沒有任何機制強迫上面要講什麼。443 上完全可以擺一個不講 TLS 的東西,而 8080 上的 Web 伺服器就是一台號碼比較特別的普通 HTTP 伺服器。慣例值得知道,是因為它告訴你那裡「大概」是什麼;要確認實際是什麼,nmap -sV 會去讀真正的回應,而不是相信號碼。

哪些連接埠可以放心對外開?

原則上是那些一開始就是為了面對惡意網路而設計的:443 的 HTTPS,以及關掉密碼登入的 22 SSH。真正出事的通常是資料庫:3306、5432、6379、27017 都有認證沒錯,但把它們對外開,等於把那道認證擺到整個網際網路面前,而新出現的服務幾個小時內就會被掃描器找到。這類服務走內網、VPN 或 SSH 通道進去才是正解;真的非得可路由不可,至少在防火牆上限制來源位址。

well-known、已登記、動態連接埠差在哪?

這是 IANA 登記表訂的三個範圍。0-1023 的系統埠就是所謂的 well-known,在 Unix 系統上要 root 或明確授予的權限才綁得起來——這正是為什麼一大堆軟體預設用 8080 而不是 80。1024-49151 的使用者埠可以申請登記。49152-65535 的動態埠留給用戶端在對外連線時臨時挑的來源埠,本來就不打算登記給任何服務。