TCP.VALIDNODE_CHECKING用于监听层IP访问控制,需配合TCP.INVITED_NODES或TCP.EXCLUDED_NODES生效,仅对TCP连接有效,配置后须reload监听器且IP写法须严格精确匹配或CIDR格式。
sqlnet.ora 里用 TCP.VALIDNODE_CHECKING 控制 IP 访问
oracle 数据库本身不直接在监听层做 ip 白名单/黑名单,得靠 sqlnet.ora 配合 tcp.validnode_checking 实现。这个参数一开,oracle 监听器(tnslsnr)就会在连接建立初期检查客户端 ip,不满足规则的直接拒绝,连认证环节都进不去。
关键点:它只对通过 TCP/IP 连接的客户端生效,对本地连接(如 sqlplus / as sysdba)或 IPC 协议无效;且必须配合 TCP.INVITED_NODES 或 TCP.EXCLUDED_NODES 才起作用。
-
TCP.VALIDNODE_CHECKING = YES是开关,不设或设为NO就完全不检查 - 白名单模式:设
TCP.INVITED_NODES = (host1, host2, 192.168.1.0/24),只允许列表里的主机或网段 - 黑名单模式:设
TCP.EXCLUDED_NODES = (10.0.0.5, 172.16.0.0/16),其余全放行 - 两个列表不能同时配置,否则监听器启动失败,报错:
ORA-00119: invalid specification for system parameter
IP 写法必须严格,否则规则不生效
很多人配完没效果,八成是 IP 或主机名写错了。监听器不解析 DNS,也不自动补全子网掩码,所有地址都按字面精确匹配或前缀匹配处理。
常见错误现象:tnsping 成功但连接被拒、日志里出现 WARNING: inbound connection timed out (ORA-3136)(其实是被静默丢弃)、listener.log 中无明确拒绝记录(默认不记,需开 trace)。
- 单 IP 写法:用完整 IPv4 地址,如
192.168.5.100,不能写192.168.5.*或192.168.5.0/24(后者仅在带 CIDR 格式时才支持) - 网段写法:必须用 CIDR,如
10.20.30.0/24,不支持10.20.30.0/255.255.255.0或10.20.30.* - 主机名:必须是客户端发起连接时使用的 hostname(即
hostname命令输出或/etc/hosts中定义的),不是 DNS 反查结果;建议优先用 IP,避免 DNS 不稳定导致误拦 - localhost 和 127.0.0.1 默认不包含在白名单中,如需本地连接,必须显式加入
修改后必须 reload 监听器,不能只重启数据库
改完 sqlnet.ora 不生效?大概率是忘了通知监听器重新加载配置。数据库实例重启对它完全没影响,因为监听器是独立进程。
使用场景:生产环境不能停服务,只能热重载;若用 lsnrctl stop 再 start,会导致短时连接中断,客户端可能报 ORA-12541: TNS:no listener。
- 执行
lsnrctl reload—— 安全,监听器保持运行,新连接按新规则校验 - 验证是否生效:看
listener.log是否有Valid node checking is enabled行(首次 reload 后出现) - 调试技巧:临时开启监听器 trace:
lsnrctl set trc_level 16,然后查$ORACLE_HOME/network/trace/listener.trc,搜索node validation关键字 - 注意路径:
sqlnet.ora必须放在$ORACLE_HOME/network/admin/下,且监听器启动时读取的是该路径下的文件,不是当前目录或/etc
和防火墙、DB 层权限的关系别搞混
有人以为配了 TCP.INVITED_NODES 就高枕无忧,其实它只是第一道筛子。真正复杂的情况往往卡在这几处:
- 防火墙(如 iptables、云安全组)如果先拦了 1521 端口,
sqlnet.ora根本没机会执行 —— 先确认 telnet 或 nc 能通端口 - Oracle 用户权限(如
CREATE SESSION)控制的是登录后的操作,和 IP 检查无关;两者叠加时,IP 不在白名单会直接断连,根本不会走到权限校验 - RAC 环境下,每个节点的
sqlnet.ora都要单独配置,且监听器名可能不同(如LISTENER_SCAN不走这个配置,它用的是 SCAN VIP 的网络策略) - Oracle 12c 及以后版本,
TCP.VALIDNODE_CHECKING对 SSL 连接仍有效,但若用了 Oracle Wallet 或 TLS 重定向,需额外确认证书 CN 是否与白名单匹配(一般不用管,除非做了双向认证)
最常被忽略的:开发测试时用笔记本直连,IP 是 DHCP 分配的,下次重启就变了,白名单失效却不自知。这类环境建议关掉校验,或用固定 IP + DHCP 预留。

















