使用cman(Connection Manager)穿越防火牆訪問oracle

comebackdog發表於2011-09-28

環境:
Red Hat Enterprise Linux Server release 5 64位
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
狀況:
杭州系統網路改造新增FW後,限制DB伺服器的從外網直接訪問,外網地址對映了1521埠到內網資料庫1521監聽埠訪問。
運維人員使用pl/sql訪問資料庫出現問題:
1 連線上伺服器後,停一會,再斷開,然後plsql工具就卡主了,停一會,報異常。
2 連線上伺服器後,停一會,再查詢表,也是會非常卡,停好長時間後才會查出資料來,但有時也報上面的異常。
3 在執行for upate ,更新資料,執行提交時,卡主,然後報 1中的異常,然後再連線上去,再執行for update ,就查不出資料來,像是表被鎖住了
在網路改造前,資料庫是有公網地址用iptables防火牆限制訪問,對部分IP開發1521埠訪問,一直沒有這樣的問題,連線查詢更新,斷開連線,都很流暢 。
以下為oracle異常錯誤
ORA-03113 end-of-file on communication channel error
判斷:
查詢谷歌,發現oracle的連線機制問題:
監聽預設1521埠,客戶端連線到1521埠,監聽會將庫戶請求轉給資料庫並由作業系統分配一個新的埠(大於1024)返回給客戶端,
客戶端使用新的埠連線資料庫,防火牆是對新的埠沒有相應的策略(因為埠不是固定的)所以拒絕了連線。
oracle有個網路連線管理工具Oracle Connection Manager具有使客戶端穿透防火牆訪問資料庫的功能。
決策:
使用cman結局客戶端穿越防火牆訪問資料庫的問題
cman 就是Oracle Connection Manager 是oracle的一個元件,cman接受來自客戶端的請求,並將請求發給資料庫監聽(預設1521埠),資料庫監聽會返回給cman一個新的資料庫
連線埠,cman連線這個新的資料庫埠,並將這個新的埠的通訊透過自己的埠(1610)返回給客戶端,客戶端透過cman的代理完成對資料庫的訪問,避免了因為新的資料庫連線埠
不被防火牆接受而不能正常訪問。
客戶端 -----firewall----&gt CMAN --------&gt DB server(listener)
             (1610)                             (1521)
客戶端               (1610)                            (xxxx)
操作:
1、安裝cman
整個安裝過程可在資料庫開啟是進行
重新執行oracle的安裝程式,選擇高階模式安裝,選擇coustm方式選擇元件,找到cman元件選擇安裝。
因為還有一個oracle的補丁
重新執行oracle補丁安裝程式,選擇cman元件安裝補丁。
2、配置:
安裝好cman後需要配置cman.ora檔案
預設在/u01/app/oracle/product/10.2.0/network/admin/samples下有一個cman.ora模板檔案
簡單配置如下:
cman_alfred =
(configuration=
 
  (address=(protocol=tcp)(host=alfred)(port=1610))
  (parameter_list =
    (aso_authentication_filter=off)
    (connection_statistics=yes)
    (log_directory=/u01/app/oracle/product/10.2.0/network/log)
    (log_level=off)
    (max_connections=256)
    (idle_timeout=0)
    (inbound_connect_timeout=0)
    (session_timeout=0)
    (outbound_connect_timeout=0)
    (max_gateway_processes=16)
    (min_gateway_processes=2)
    (remote_admin=on)
    (trace_directory=)
    (trace_level=off)
    (trace_timestamp=off)
    (trace_filelen=1000)
    (trace_fileno=1)
    (max_cmctl_sessions=4)
    (event_group=init_and_term,memory_ops)
  )
  (rule_list=
    (rule=
       (src=*)(dst=*)(srv=*)(act=accept)
       (action_list=(aut=off)(moct=0)(mct=0)(mit=0)(conn_stats=on))
    )
 )
  )
)

主要配置一下引數
(address=(protocol=tcp)(host=alfred)(port=1610))指定伺服器(主機名請與監聽配置檔案裡一致)及cman埠
(log_directory=/u01/app/oracle/product/10.2.0/network/log)指定cman執行日誌
3、啟動cman
[oracle@alfred admin]$ cmctl
CMCTL for Linux: Version 10.2.0.4.0 - Production on 23-9月 -2011 20:19:54
Copyright (c) 1996, 2007, Oracle.  All rights reserved.
Welcome to CMCTL, type "help" for information.
help會給你命令提示
CMCTL> help
The following operations are available
An asterisk (*) denotes a modifier or extended command:
administer      close*          exit            quit           
reload          resume*         save_passwd     set*           
show*           shutdown        sleep           startup        
suspend*       
開始進入管理介面
CMCTL> administer
Current instance CMAN_alfred is not yet started
Connections refer to (address=(protocol=tcp)(host=alfred)(port=1610)).
The command completed successfully.
啟動cman
CMCTL:CMAN_alfred> startup
Starting Oracle Connection Manager instance CMAN_alfred. Please wait...
TNS-04077: WARNING: No password set for the Oracle Connection Manager instance.
CMAN for Linux: Version 10.2.0.4.0 - Production
Status of the Instance
----------------------
Instance name             CMAN_alfred
Version                   CMAN for Linux: Version 10.2.0.4.0 - Production
Start date                23-9月 -2011 20:20:08
Uptime                    0 days 0 hr. 0 min. 9 sec
Num of gateways started   2
Average Load level        0
Log Level                 OFF
Trace Level               OFF
Instance Config file      /u01/app/oracle/product/10.2.0/network/admin/cman.ora
Instance Log directory    /u01/app/oracle/product/10.2.0/network/log
Instance Trace directory 
The command completed successfully.
CMCTL:CMAN_alfred> quit
啟動成功,報警是為沒有設定密碼,暫時可忽略。
4、檢查
檢查1610埠是否啟動
[oracle@alfred admin]$ netstat -anp |grep 1610
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 0.0.0.0:1610                0.0.0.0:*                   LISTEN      12881/tnslsnr      
啟動成功
5、配置客戶端TNS
根據你的主機情況如下例項。
TEST =
  (DESCRIPTION =
  (ADDRESS_LIST =
  (ADDRESS = (PROTOCOL = TCP)(HOST = 20.20.20.20)(PORT = 1610))
  (ADDRESS = (PROTOCOL = TCP)(HOST = 20.20.20.20)(PORT = 1521))
   )
  (CONNECT_DATA =
  (SERVER = DEDICATED)
  (SERVICE_NAME = zjcsc)
  )
  (SOURCE_ROUTE = yes)
  )
其實就是多了兩個配置
(ADDRESS = (PROTOCOL = TCP)(HOST = 20.20.20.20)(PORT = 1610))cman的連線埠
(SOURCE_ROUTE = yes)  這個配置要有,原因待查啊。
 
6、防火牆設定
開啟防火牆1610埠,關閉1521埠
7、pl/sql連線測試
客戶端使用pl/sql連線test,失敗。
報ORA-12564: TNS:connection refused錯誤
8、排除問題
檢查cman.ora配置無問題,啟動防火牆1521埠,允許20.20.20.20的1521被訪問,則可以正常連上,但正常情況下客戶端只要連線cman就可以正常連線資料庫的。
 
注意客戶端tnsname.ora檔案以下地方:
 (ADDRESS = (PROTOCOL = TCP)(HOST = 20.20.20.20)(PORT = 1610)) 該配置是表示cman所在的伺服器
 (ADDRESS = (PROTOCOL = TCP)(HOST = 20.20.20.20)(PORT = 1521)) 該被指是表示資料庫所在伺服器
 
IP:20.20.20.20是對外提供的訪問的外網IP,對20.20.20.20的1610埠對映的是內網資料庫伺服器192.168.10.11的1610埠,
20.20.20.20的1521埠對映的是內網資料庫伺服器192.168.10.11的1521埠,實際上我們再這樣配置的時候出現了問題,客戶端連線透過cman
連線資料庫會報ORA-12564: TNS:connection refused錯誤,開啟trace開關檢查trace日誌發現,客戶端連線到cman後cman將請求轉發給資料庫監聽
的時候出錯,因為訪問不了20.20.20.20的1521埠(對於該IP我們只開放了1610埠,1521埠不能訪問)所以造成資料庫連線失敗。解決辦法有2個:
1、修改TNS配置
(ADDRESS = (PROTOCOL = TCP)(HOST = 20.20.20.20)(PORT = 1610)) 該配置是表示cman所在的伺服器不變
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) 該被指是表示資料庫所在伺服器,將此地址配置成localhost或127.0.0.1
即透過本機內部網路訪問(不會受到防火牆的阻隔),讓cman能夠透過這個地址正常的將客戶端請求傳送給資料庫的監聽1521埠
2、修改防火牆配置
開啟對20.20.20.20這個地址的1521埠的訪問,讓cman可以講客戶端的請求傳送給20.20.20.20的1521監聽埠。
推薦第一種

以上講到的開啟trace配置部分如下
(parameter_list =
    (aso_authentication_filter=off)
    (connection_statistics=yes)
    (log_directory=/u01/app/oracle/product/10.2.0/network/log)
    (log_level=off)
    (max_connections=256)
    (idle_timeout=0)
    (inbound_connect_timeout=0)
    (session_timeout=0)
    (outbound_connect_timeout=0)
    (max_gateway_processes=16)
    (min_gateway_processes=2)
    (remote_admin=on)
    #(trace_directory=)
    (trace_directory=/u01/app/oracle/product/10.2.0/network/trace)
    (trace_level=USER)
    (trace_timestamp=on)
    (trace_filelen=1000)
    (trace_fileno=1)
    (max_cmctl_sessions=4)
    (event_group=init_and_term,memory_ops)
  )
排除完故障後請恢復原cman.ora配置,關閉trace開關。
 
 
 
9、遇到的錯誤
 
 
 
a
CMADMIN for Linux: Version 10.2.0.4.0 - Production on 23-9月 -2011 19:21:02
Copyright (c) 1996, 2007, Oracle.  All rights reserved.
(LOG_RECORD=(TIMESTAMP=23-9月 -2011 19:21:02)(EVENT=CMAN.ORA not present))
b
CMADMIN for Linux: Version 10.2.0.4.0 - Production on 23-9月 -2011 18:59:24
Copyright (c) 1996, 2007, Oracle.  All rights reserved.
(LOG_RECORD=(TIMESTAMP=23-9月 -2011 18:59:24)(EVENT=CMAN.ORA contains no rule for local CMCTL connection)(Add (rule=(src=hz-ctc5)(dst=127.0.0.1)(srv=cmon)(act=accept)) in rule_list)
這些設定都db伺服器的主機名有關請使用全主機名,並按照以上示例準確配置就沒問題

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/20575781/viewspace-708453/,如需轉載,請註明出處,否則將追究法律責任。

相關文章