1. 程式人生 > >oracle伺服器防火牆設定

oracle伺服器防火牆設定

忙乎了將近三週,終於搞定了。從一開始懷疑是網路的問題,後來覺得不是,可能是應用的問題,發現很可能是資料庫的問題,最後真相大白又回到原點,原來是網路防火牆在搗鬼。行為非常詭異,怎麼想也想不明白,我都沒多少信心準備放棄了,沒想到原因竟然如此簡單。
  
  事情是這樣的,我們開發的系統需要保持和Oracle資料庫的持續連線,如果因為網路或者其它原因非正常斷開的話,必須重新啟動應用程式,否則將會出錯無法使用。在測試環境執行很穩定,一搬到機房機架上就出現奇怪的現象,第二天早上來看伺服器,所有的資料庫連線都斷掉了,有時候白天也斷,而且一個應用斷的次數特別頻繁,其它應用白天不怎麼斷。因為我們的應用伺服器網段是192.168.x.x,而資料庫伺服器在10.x.x.x網段,剛開始我懷疑是中間的路由器有這種問題,如果網路持續一段時間沒有流量自動把網路斷開。並且和網管說了這事,他說不可能有這種問題。因為我們以前做過另外一個系統也存在這種問題,好像是這個原因,不過後來怎麼解決的不是很清楚了。找知情人士瞭解後原來是資料庫網絡卡的原因,從應用伺服器ping資料庫伺服器一個晚上有幾次丟包現象,換資料庫伺服器網絡卡就沒事了。
  
  於是我們用ping -t server-IP > ping.txt 來檢查網路是否有丟包現象,持續幾個晚上都沒有一次丟包的,網路狀況非常好。我檢查網絡卡屬性的電源屬性卡上有一個複選框是否允許計算機閒置時關閉該裝置,預設是選中的。於是我懷疑是網絡卡被計算機關掉了,於是所有連線均斷開了,但是白天之斷開一個解釋不同啊。應用程式有問題?為什麼測試環境中沒發現問題?有可能是某一塊資料有問題,他們測試時亂調圖碰到雷區了,於是我檢查所有的資料,沒有那種問題。真是讓人費解,而且我持續ping,網絡卡也不可能被關閉的啊。
  
  有可能是某個埠關閉了,於是我們寫了一個小程式,開啟一個數據庫連線,每隔一定時間查一下資料庫,保持埠是開啟的。問題依舊存在,這個小程式的連線沒斷,其它的全斷了。
  
  是什麼原因呢?其實現在想起來問題已經很明朗了,但是當時就是不明白怎麼回事。而且那天老是打電話過來,連線又斷了,上午斷兩次,下午又斷了兩次。一整天我們都沒想出什麼好辦法,怎麼會這麼變態,為什麼會只斷掉一個?我當時懷疑是我們應用程式有點問題,在絞盡腦汁想辦法怎麼檢測應用程式的錯誤。
  
  為了檢測斷開的規律,我寫了兩個觸發器,使用者登陸時網一個表中插入一條記錄,登出是把登出時間填入表中。後來發現根本一點用也沒有,非正常退出時根本不會觸發LOGOFF事件,白忙乎了!
  
  下班了,騎車回家,突然想到一個辦法,定時啟用連線,保持活動狀態看它還斷不斷。很多好的想法都是在我離開辦公室回家的路上想出來了,在辦公室怎麼想也想不出來,離開辦公室就想出了。第二天馬上行動,果真有效,連線沒有再斷過。但是這樣不是個辦法,為什麼連線一段時間不活動就會被殺掉了呢?在我們的應用程式中看不到原因,只是說連線丟失,在sqlplus中提示說end-of-file communication channel。
  
  今天一整天我都在網上狂找相關內容,oracle connection lost, oracle session lost,oracle session timeout等等,看到也有人碰到類似我這種情況的人,但是沒有好的辦法。我把Oracle net service得文件翻了一遍,看到sqlnet.ora有一個關於超時的引數SQLNET.EXPIRE_TIME簡直如獲至寶,後來發現原來沒用。伺服器端自動殺掉客戶端程序的情況還可以通過Profile來實現,限制IDLE_TIME,但是我檢查資料庫根本沒有相關的設定。
  
  好不容易找到一溜很長的帖子,也是關於我這種問題的,最後他說解決了是防火牆的問題。但是以前我印象中防火牆只是針對埠的,怎麼會保持某些活動連線,殺掉不活動的連線呢?後來我去網上查了查防火前的有關原理,好象它能處理到TCP/IP連線一級,也就是可以只斷開某一個不活動的連線。但我還是不很確定,但是我知道在資料庫伺服器和應用伺服器之間有防火牆,把機器搬過去的那天,能ping通資料庫伺服器,但是不能連資料庫,後來網管把Oracle資料庫的兩個埠開啟就可以了。
  
  我們找到網管,他說是有這種問題,防火牆就是這樣的,如果一個連線長時間不活動就會自動殺掉的。如果不這樣的話,防火牆的記憶體很快會用完,還說我們違背了TCP/IP的設計原則。但是沒辦法,我們的應用程式需要持續而穩定資料庫連線,只能把我們的應用伺服器放到防火牆後面去。於是他把我們的伺服器跳了線,變成一個網段的,從此不再有連線斷開的問題了。終於徹底解決這個問題,長舒一口氣!!!
  
  以上是我在網上搜到的一篇文章,和我的遭遇如出一轍。前段時間想把這個過程寫下來,但一直沒來的及寫,今天搜到了,把它正好貼過來。
   不過還應該記錄的是:        windows平臺下僅開一個埠讓Oracle穿過防火牆
  很多人問這個問題,查了大量資料,也沒有找到真正完全解決的,經過多次試驗終於成功實現。建議版主此貼加精。
  
  Oracle客戶端連線伺服器,首先去找1521監聽埠,伺服器的1521監聽埠再向server process程序發出請求,並返回一個隨機埠,返回給客戶端,客戶端再來連線這個埠。
  
  這樣就給伺服器上的防火牆設定帶來了麻煩,這個埠是隨機的,如何開放。
  
  windows 平臺上的這個問題成了一大難題,很多論壇都有人問,但很少有人能解決。 unix平臺不用擔心,系統自動會解決這個問題.
  
  Matalink上提供了三種解決辦法,實際上USE_SHARED_SOCKET 是最有效最方便的。
  
  但經過無數次實現,仍然沒有成功,最後終於發現是Oracle 8.1.7的bug
  
  需要打補丁,升級到Oracle 8.1.7.1.2
  不同版本,登錄檔位置不一樣
  - Oracle 8.1.6 for NT/2k \\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME<#> (# is your desired homedir)
  - Oracle 8.1.7.0.0 for NT/2k Doesn't work in Oracle 8.1.7.0.0 for NT/2k
  - Oracle 8.1.7.1.2 for NT/2k \\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE
  
  需要在MTS模式下(共享模式)Oracle預設是專用模式。
  
  經試驗發現,如果不在init檔案中設引數的話,Oracle仍然會要求一個隨機埠和1521埠來共同通訊,只是這個隨機埠,並不隨客戶端會話和登入的變化而變化,在沒有重啟伺服器時,是固定的。
  
  (試驗發現,在專用模式下,每次連線,oracle伺服器會按+1方式,提供一個非1521的埠。)
  
  所以,還需要在init.ora檔案的最後加上一條引數:
  
  mts_dispatchers="(address=(protocol=tcp)(host=myoradb)(port=1521))(dispatchers=1)"
  
  這樣才真正實現只用一個埠,穿過防火牆。
Oracle uses dynamic ports under windows NT because of a bug in windows, so oracle can't use shared sockets. This bug got fixed with service pack 3 I think. By default, oracle uses the dynamic ports without caring which service pack is installed. There is a registry setting to force oracle to use shared sockets. The parameter is (what a surprise!) USE_SHARED_SOCKET in LOCAL_MACHINE\Software\Oracle\HomeX where X is your desired homedir. This parameter should be set to TRUE. There's a whitepaper from oracle for this too, somewhere on their site. Anyway, this parameter doesnt work for 8.1.7 Some users reported that it worked with 8.1.6.3, but 8.1.7 termiates every conection immediately...
  
  Contributed by Arne Brutschy (
[email protected]
) on July 5, 2001.
  
  Actually, I want to establish a replication system in my local machine.. for replicating objects(tables) from remote database to a local database... what data security option i must take in to account. I request you to give me the detail description like which protocal must be used and what parameter must be set in init.ora file,sqlnet.ora and listener.ora file and what other steps to be taken... I would be very thankful to you ... if you kindly describe the things...actually i want to maintain the data privacy which happens between remote and local database while replication take place.. any one can trap the net and extract the data ... so i need to stop that.
  
  I would be very thankful to you ... this is a request.. please mail me on the address [email protected]
  
  regards p.v.raju
  
  Contributed by pvraju ([email protected]) on October 8, 2001.
  
  Modify Windows registry.
  
  USE_SHARED_SOCKET = TRUE
  
  - Oracle 8.1.6 for NT/2k \\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME<#> (# is your desired homedir)
  
  - Oracle 8.1.7.0.0 for NT/2k Doesn't work in Oracle 8.1.7.0.0 for NT/2k
  
  - Oracle 8.1.7.1.2 for NT/2k \\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE