当前位置:首页 > PHP教程 > PHP总结归纳

Oracle与防火墙设置

oracle与防火墙设置 要访问防火墙后的windows oracle数据库,仅仅通过简单的打开固定tcp端口的方式是不行的。 这个问题的根本原因是windows oracle数据库的bt设计(unix/linux无此问题)。 一、oracle的网络通信端口原理 oracle数据库的网络访问采用了一个很bt

  oracle与防火墙设置

  要访问防火墙后的windows oracle数据库,仅仅通过简单的打开固定tcp端口的方式是不行的。

  这个问题的根本原因是windows oracle数据库的bt设计(unix/linux无此问题)。

  一、oracle的网络通信端口原理

  oracle数据库的网络访问采用了一个很bt的工作模式,其大概流程如下:

  1)oracle server上的oracle net listener进程持续监听一个固定的tcp端口(缺省是1521);

  2)client向server上的net listener端口发起连接请求;

  3)listenr收到client的请求之后,建立与client的连接,并通知server新建一个数据库连接的服务进程(以下简称p),该进程会随机选择一个没有被使用的tcp端口并绑定,然后将端口号通知listener;

  4)listenr将p绑定的端口号转发给client;

  5)client收到p的端口号后,终止与listener的连接,然后通过p的绑定端口直接连接p;

  到第5步,连接才最终完成,之后client就可以访问数据库了。

  从上面的工作流程可以知道,在这种工作模式下,client实际最终连接的oracle server端口是随机的。

  所以根本无法在防火墙上预先设定固定的tcp端口来使oracle server可以被访问。

  据说oracle这么做也是不得已的,因为早期windows nt的tcp/ip部分有bug,直接使用公用端口连接会有问题,所以oracle才搞出这么个天才的设计。

  不过,nt4sp3之后不就没这个bug了吗,为啥到oracle 11g了还在用这个bt模式呢? 当然啦,,现在网络安全性问题这么严重,如果真的无法使用防火墙,windows版的oracle数据库岂不是要卖不出去了吗?

  oracle公司当然不会那么白痴,从oracle 8i开始,windows版的oracle也可以使用正常的工作模式了,只不过默认仍是使用bt工作模式罢了。

  只有windows平台上的9i及以下版本的oracle才会有这个问题。oracle在linux以及unix平台下,多个进程间可以对端口进行复用,oracle server process仍然使用的是跟监听进程一个端口(1521),客户端只连接了一次,并没有进行第二次连接,与上面描述的流程相比已经发生了变化。

  在windows平台上,10g及以上版本的数据库,也同样利用端口复用,避免了这样的问题。实际上10g就是默认use_shared_socket为true。

  二、在防火墙中设置程序例外

在oracle的bt模式下,其实可通过在防火墙中设置oracle程序例外来穿越防火墙。

  三、在防火墙中设置端口例外

  在windows注册表的 (homedir是你机器上安装的oracle数据库的instance名称)中添加一个字符串键值,名称为use_shared_socket,值为true(注意大小写),然后重启oracle instance或直接重启windows就ok了。

  这样,你只要再在防火墙上打开oracle的监听端口(缺省为1521),就可以在防火墙外访问oracle了!

  需要在mts模式下(共享模式) oracle默认是专用模式。

  经试验发现,如果不在init文件中设参数的话,oracle仍然会要求一个随机端口和1521端口来共同通讯,只是这个随机端口,并不随客户端会话和登 录的变化而变化,在没有重启服务器时,是固定的。 (试验发现,在专用模式下,每次连接,oracle服务器会按+1方式,提供一个非1521的端口。) 所以,还需要在init.ora文件的最后加上一条参数:

  mts_dispatchers="(address=(protocol=tcp)(host=myoradb)(port=1521))(dispatchers=1)"

.syntaxhighlighter{padding-top:20px;padding-bottom:20px;}
【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:)!