Oracle 9i 真正生效的網路存取控制文件是 $ORACLE_HOME/network/admin/sqlnet.ora(非舊版 protocol.ora)。透過 TCP/IP 協議的「有效節點檢查」功能,可在監聽器層面直接攔截非授權 IP,零代碼改動、效能影響極小。
# 啟用節點檢查
TCP.VALIDNODE_CHECKING = YES
# 白名單:僅允許列表內 IP 連接(優先級高於黑名單)
TCP.INVITED_NODES = (192.168.1.10, 192.168.1.20, 10.0.0.0/24)
# 黑名單:明確拒絕列表內 IP(白名單存在時忽略)
TCP.EXCLUDED_NODES = (192.168.1.100, 172.16.0.0/16)
10.0.0.0/24)、主機名(解析後生效)。lsnrctl reload
或
lsnrctl stop
lsnrctl start
| 坑點 | 後果 | 正確做法 |
|---|---|---|
| 未將資料庫服務器自身 IP 加入白名單 | lsnrctl start/stop/status 全部失敗(本機連接被攔截) | 白名單必含 127.0.0.1、本機真實 IP、VIP、SCAN IP |
| 修改後未 reload 監聽器 | 配置不生效 | 執行 lsnrctl reload 即時生效 |
| 混用舊版 protocol.ora | 9i/10g/11g/12c/19c 均不讀取 protocol.ora | 只改 sqlnet.ora |
| 非 TCP/IP 協議(IPC, SDP, InfiniBand) | 本機制僅對 TCP/IP 生效 | 確認 listener.ora 使用 PROTOCOL=TCP |
# 允許的 IP
tnsping ORCL
sqlplus scott/tiger@ORCL
# 被拒絕的 IP
tnsping ORCL
# TNS-12537: TNS:connection closed
# 或 ORA-12537: Network Session: End of file
sqlnet.ora 屬於「應用層攔截」,建議同時在 OS 防火牆(iptables/firewalld/Windows 防火牆)部署「網路層攔截」:
TCP.INVITED_NODES 使用主機名、通配符、CIDR。SECURE_CONTROL_ 參數加強安全,配合 CLASS_OF_SECURE_CONNECTION 實現更細粒度控制。sqlnet.ora 需同步配置,SCAN Listener 同樣受控。修改 sqlnet.ora 啟用 TCP.VALIDNODE_CHECKING,配合 INVITED_NODES/EXCLUDED_NODES,是 Oracle 資料庫「最快、最省、最透明」的 IP 存取控制手段。牢記白名單含本機 IP、改完必 reload、僅限 TCP/IP三鐵律,即可安心上線。