誤區:以為只有 1521
許多 DBA 以為開放防火牆 1521 即可連線。實測:tnsping 通、但 Net Manager/應用連線失敗。根因:Oracle 連線分兩階段,涉及兩個埠。
連線建立雙埠機制
- Client → Listener (固定埠 1521):** 客戶端向 Listener 發起連線請求。
- Listener → Spawn Server Process:** Listener 依
listener.ora/tnsnames.ora 找到目標 Instance,啟動專用/共用伺服器進程。
- Listener → Return Random Port:** 新啟動的 Server Process 監聽一個**作業系統動態分配的隨機高埠** (如 34,567),Listener 將此埠號回傳給 Client。
- Client → Direct Connect Random Port:** Client 直接與該隨機埠建立資料傳輸通道,**後續完全繞過 Listener**,即使 Listener 停止,現有連線不受影響。
防火牆攔截了隨機埠,導致連線失敗。
驗證隨機埠
OS 層執行 netstat -ano 可見 Oracle 進程監聽大量非 1521 的 ESTABLISHED 連線。
徹底解決:Windows Shared Socket (共享套接字)
Windows Sockets 2 (Winsock2) 支援 Shared Socket:允許 Listener 與 Server Process 共用同一 Socket (埠 1521),消除隨機埠。
註冊表設定步驟
- 開啟
regedit,定位 HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0 (單一 Home) 或 HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\HOMEx (多 Home,x 為編號)。
- 新建字串值 (REG_SZ):**名稱**
USE_SHARED_SOCKET,**數值** TRUE。
- 必須重啟 Instance (資料庫服務)**,僅重啟 Listener 無效。
效果驗證
- 設定後,
netstat -ano 僅見 1521 埠建立所有連線。
- 防火牆僅需開放 1521 單一埠,安全與維護雙贏。
- 適用於 Windows 專用伺服器/共用伺服器架構。
補充說明
- Linux/Unix 無 Shared Socket 機制,通常採用 Connection Manager (CMAN) 或固定
LOCAL_LISTENER + DISPATCHERS 參數指定埠範圍,再於防火牆開放該範圍。
- 12c+ 多租戶 (CDB/PDB) 架構下,Listener 處理 Service Name 導向,共享 Socket 仍生效。