【转】Oracle与网络防火墙
DBA在Oracle数据库上线时,一般都会和网络管理员打个交道,可能你需要申请个IP地址、开通防火墙策略,或者做个NAT地址映射。这里记录下部分我的关于网络防火墙的经验:
(1)Client与Oracle listener
首先这里假设Server端的listener使用端口1521。此时Client需要与Server的Oracle建立通讯,如果Client和Server间通过网络防火墙,那么需要开通哪些策略?
a. Oracle配置为Shared Server
首先需要明确一点,Shared Server连接强制要求使用Oracle Net,即使Client和Server在一台机器上,如果不使用Oracle TNS监听器,就无法使用Shared Server。当需要建立Connection时,Listener会分派一个已存在的共享dispatcher进程,同时将需要REDIRECT的进程/端口信息发送给Client。这些dispatcher进程使用的端口是在数据库startup或者调整dispatcher个数时就分派的,默认这些端口由OS随机选择。
b. Oracle配置为Dedicated Server,但是平台为Windows
这里再明确一个概念,如果Client不通过listener访问Server,即Client本地访问Server。那么就不是由Listener通过fork()/exec()调用(UNIX)或进程IPC调用(Windows)来创建Dedicated Server,而是由Client Process自己创建。
Oracle9i及以下版本且在Windows平台上,当connection需求发送至listener时,listener会创建一个Oracle线程(thread),这个线程是会监听在当前IP地址和未使用的随机端口上,之后thread通过IPC通讯将监听地址/端口发送至listener。listener将此REDIRECT地址信息发送给client并建立connection。所以此时,client也和server的随机端口通讯。
但是在Oracle 10gR1以后,Oracle提出direct handoff技术,此时允许listener将connection信息直接pass给local dispatcher或dedicated server process,即此时的connection使用Server的1521端口。
不过这个特性默认为disable,可以修改listener.ora中DIRECT_HANDOFF_TTC_<listener_name>参数实现。
另外从10gR2后,Oracle Net Listener已不会再REDIRECT了,默认行为为direct handoff。当然,这个不包括开头说明的Shared Server。
c. Oracle配置为Dedicated Server,平台为Linux/UNIX
这个是日常生活中我遇到的最多的数据库架构。在这种情况下,Listener默认行为为direct handoff,只需要开通Client到Server的1521端口通讯即可。
另外在Oracle RAC下,需要注意正确设置LOCAL_LISTENER参数,否则的话可能也会导致通讯失败。
When LOCAL_LISTENER is not set at all or is not set correctly, PMON can register both the VIP hostname and the physical hostname with the REMOTE_LISTENER. This is incorrect in RAC but if it does occur, the client can intermittently be routed to a listener endpoint on either of these addresses. If the client is unable to resolve the physical hostname or even the vip hostname, the connection will fail with ORA-12545.
d. Oracle配置DRCP(Database Resident Connection Pooling)
DRCP驻留连接池从Oracle 11g提出,DRCP的工作模式类似数据库连接池,且有别于Shared Server。这里不做展开,不过同Shared Server,DRCP配置后,也存在REDIRECT现象。即connection会选用Server上的随机端口。
(2)Oracle连接与防火墙超时策略
在配置防火墙策略时,有些防火墙会设置client和server间的最大空闲时间规则,此时,如果Oracle的连接长时间无事务操作,那么这个Connection可能被防火墙中断。
所以在Oracle有必要需求时,可以考虑设置DCD(Dead Connection Detection)机制,解决此问题。
DCD用于探测僵死、未断开的会话,一旦Oracle发现,会由PMON进程进行清理。由于DCD机制通过网络探测包(probe packet)定时探测交互,所以此设置也可以用来解决防火墙超时策略问题。
设置方法:
修改服务器端的sqlnet.ora文件,增加以下设置:
SQLNET.EXPIRE_TIME= <# of minutes>
比如我希望探测包每10分钟探测一次,那么就可以这样设置:
SQLNET.EXPIRE_TIME=10