sqlnet.ora无法限制“特定IP访问特定用户”,因TCP.VALIDNODE_CHECKING仅在连接初期校验源IP,不涉及用户名;必须设为YES才生效,且只对TCP连接有效,需配合INVITED_NODES或EXCLUDED_NODES之一使用,禁用本地IP会导致监听管理失败。

不能靠 sqlnet.ora 限制“特定 IP 访问特定用户”——它压根看不到用户名。 它只在 TCP 连接建立初期检查源 IP,此时 Oracle 还没收到任何认证信息。想实现“scott 用户禁止从 192.168.5.100 登录,但 hr 可以”,sqlnet.ora 天然做不到。
配置 tcp.validnode_checking 是前提
这个参数是总开关,不设为 YES,后面所有 IP 规则都无效。它默认是 OFF 或未定义,必须显式启用:
-
tcp.validnode_checking = YES—— 必须写全大写YES,小写yes在部分版本中不识别 - 不加这行,或设为
NO,整个 IP 控制逻辑完全不触发 - 该设置只对 TCP/IP 连接生效;本地连接(如
sqlplus / as sysdba)和 IPC 协议不受影响
tcp.invited_nodes 和 tcp.excluded_nodes 不能共存
监听器启动时会校验这两个参数,同时存在直接报 ORA-00119 错误,监听起不来:
- 白名单模式:只保留
tcp.invited_nodes = (192.168.5.200, 10.0.0.0/24),其他一概拒绝 - 黑名单模式:只保留
tcp.excluded_nodes = (192.168.5.100, 172.16.0.0/12),其余全放行 - 网段必须用 CIDR 格式(如
192.168.5.0/24),不支持192.168.5.*或192.168.5.0/255.255.255.0 - 主机名写法要严格匹配客户端发起连接时使用的 hostname(不是 DNS 反查结果),建议优先用 IP
本机 IP 必须显式加入白名单
监听器自身管理操作(如 lsnrctl status、lsnrctl reload)会通过本机 IP 回连监听器。如果没加,会报 TNS-12560 或连接超时,导致无法 reload/stop:
- 不能写
localhost或127.0.0.1—— 监听器不解析 hosts 或 DNS,也不做 loopback 映射 - 必须写真实网卡 IP,比如
192.168.5.50(查ip addr或ifconfig确认) - 多网卡环境要列全所有可能被用于管理的 IP,漏一个就可能卡住运维
- 改完后必须执行
lsnrctl reload,不是重启数据库,也不是lsnrctl stop && start
验证失败时先看监听日志和客户端错误码
规则不生效或误拦,往往不是配置错,而是现象判断偏差:
- 客户端报
ORA-12547: TNS:lost contact或ORA-3136: inbound connection timed out→ 很可能是被静默丢弃,不是认证失败 -
listener.log默认不记拒绝事件,需临时开启 trace:lsnrctl set trc_level 16(级别 16 记网络层拒绝) -
tnsping成功不代表能连库 —— 它只测监听端口通不通,不走validnode_checking流程 - 云环境或有 SLB/F5/NAT 时,
sqlnet.ora拦的是前端设备 IP,不是真实客户端 IP,这点极易被忽略


















