通过Oracle数据库访问控制功能(Database access control)
简单来说通过在sqlnet.ora文件中设置如下参数来实现
TCP.VALIDNODE_CHECKING控制是否打开数据库访问控制功能。
TCP.EXCLUDED_NODES 黑名单拒绝访问的IP
TCP.INVITED_NODES 白名单允许访问的IP
举例:
TCP.VALIDNODE_CHECKING = YES
TCP.EXCLUDED_NODES= (138.3.33.33)
TCP.INVITED_NODES=(138.4.44.44, hammer)
被拒绝的提示如: ORA-12537: TNS:connection closed
注意:
修改sqlnet.ora文件中的IP列表后都需要重启监听才能生效。
(原文是: Any changes to the values requires the TNS listener to be stopped and restarted.
但通过测试单机情况下lsnrctl reload同样可以生效。
测试11G R2 RAC环境下lsnrctl reload不但不会使得更新内容生效,而且还将已经注册到监听中的服务清掉,导致数据库无法连接。因此rac环境下不能使用lsnrctl reload命令,必须重启监听。
另外,11G R2 RAC上有两种监听,本地监听和SCAN监听,想让控制列表的生效,必须重启对应的监听,如果修改控制列表后,grid用户下(注意11g rac对监听的启停必须用grid用户,无论是lsnrctl还是srvctl) lsnrctl stop - lsnrctl start 来重启了本地监听,那只有通过vip和本地public IP发起的数据库访问才会应用控制列表的更新内容,对于通过SCAN IP发起的访问并不应用更新内容,同样如果lsnrctl stop listener_scan1 - lsnrctl start listener_scan1 重启scan监听,则值对scan ip发起的访问适用更新后的访问控制列表。
因此对于实际的生产可能同时存在适用VIP和使用SCAN IP访问的情况,因此需要所有监听全部重启,
srvctl [stop|start] listener -n [rac1|rac2|...]
srvctl [stop|start] scan_listener
并且对于RAC要记得修改所有节点的sqlnet.ora文件。)
启动监听是sqlnet.ora中TCP.INVITED_NODES中的域名和IP必须是可以解析的,但并不一定要可以连接,否则监听无法启动成功,提示TNS-12560: TNS:protocol adapter error。
经过测试TCP.EXCLUDED_NODES中的ip或者域名如果不能解析并不影响监听的启动。
所谓的不能解析如 IP写成了 192.168.1922.11 ,或者写了个域名 xxfdfd 但是无法解析成IP地址的情况。
TCP.INVITED_NODES的优先级高于TCP.EXCLUDED_NODES,即当一个IP同时出现在拒绝和允许列表里,那该IP允许访问。
TCP.INVITED_NODES、TCP.EXCLUDED_NODES每项的IP列表格式都只能写一行不能换行。
数据库服务器自己的IP地址建议加到INVITED_NODES列表中,对于RAC环境则把public ip、vip、scan ip都加到INVITED_NODES列表中。
对于11G rac环境,该控制功能要设置在GRID_HOME/network/admin中的sqlnet.ora中,而不是Oracle HOME中。
参考
http://docs.oracle.com/cd/E11882_01/network.112/e41945/profile.htm#NETAG091
Note 462933.1 What is TCP_VALIDNODE_CHECKING and How to Use It
RAC: TCP.VALIDNODE_CHECKING Failing after Listener Reload (文档 ID 2109789.1)
Listener Fails to Start Using TCP.VALIDNODE_CHECKING: TNS-12532 TNS:Invalid Argument (文档 ID 287500.1)