使用cman(Connection Manager)穿越防火牆訪問oracle
環境:
Red Hat Enterprise Linux Server release 5 64位
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
狀況:
杭州系統網路改造新增FW後,限制DB伺服器的從外網直接訪問,外網地址對映了1521埠到內網資料庫1521監聽埠訪問。
杭州系統網路改造新增FW後,限制DB伺服器的從外網直接訪問,外網地址對映了1521埠到內網資料庫1521監聽埠訪問。
運維人員使用pl/sql訪問資料庫出現問題:
1 連線上伺服器後,停一會,再斷開,然後plsql工具就卡主了,停一會,報異常。
2 連線上伺服器後,停一會,再查詢表,也是會非常卡,停好長時間後才會查出資料來,但有時也報上面的異常。
3 在執行for upate ,更新資料,執行提交時,卡主,然後報 1中的異常,然後再連線上去,再執行for update ,就查不出資料來,像是表被鎖住了
2 連線上伺服器後,停一會,再查詢表,也是會非常卡,停好長時間後才會查出資料來,但有時也報上面的異常。
3 在執行for upate ,更新資料,執行提交時,卡主,然後報 1中的異常,然後再連線上去,再執行for update ,就查不出資料來,像是表被鎖住了
在網路改造前,資料庫是有公網地址用iptables防火牆限制訪問,對部分IP開發1521埠訪問,一直沒有這樣的問題,連線查詢更新,斷開連線,都很流暢 。
以下為oracle異常錯誤
以下為oracle異常錯誤
ORA-03113 end-of-file on communication channel error
判斷:
查詢谷歌,發現oracle的連線機制問題:
監聽預設1521埠,客戶端連線到1521埠,監聽會將庫戶請求轉給資料庫並由作業系統分配一個新的埠(大於1024)返回給客戶端,
客戶端使用新的埠連線資料庫,防火牆是對新的埠沒有相應的策略(因為埠不是固定的)所以拒絕了連線。
監聽預設1521埠,客戶端連線到1521埠,監聽會將庫戶請求轉給資料庫並由作業系統分配一個新的埠(大於1024)返回給客戶端,
客戶端使用新的埠連線資料庫,防火牆是對新的埠沒有相應的策略(因為埠不是固定的)所以拒絕了連線。
oracle有個網路連線管理工具Oracle Connection Manager具有使客戶端穿透防火牆訪問資料庫的功能。
決策:
使用cman結局客戶端穿越防火牆訪問資料庫的問題
使用cman結局客戶端穿越防火牆訪問資料庫的問題
cman 就是Oracle Connection Manager 是oracle的一個元件,cman接受來自客戶端的請求,並將請求發給資料庫監聽(預設1521埠),資料庫監聽會返回給cman一個新的資料庫
連線埠,cman連線這個新的資料庫埠,並將這個新的埠的通訊透過自己的埠(1610)返回給客戶端,客戶端透過cman的代理完成對資料庫的訪問,避免了因為新的資料庫連線埠
不被防火牆接受而不能正常訪問。
連線埠,cman連線這個新的資料庫埠,並將這個新的埠的通訊透過自己的埠(1610)返回給客戶端,客戶端透過cman的代理完成對資料庫的訪問,避免了因為新的資料庫連線埠
不被防火牆接受而不能正常訪問。
客戶端 -----firewall----> CMAN --------> DB server(listener)
(1610) (1521)
客戶端 (1610) (xxxx)
(1610) (1521)
客戶端 (1610) (xxxx)
操作:
1、安裝cman
整個安裝過程可在資料庫開啟是進行
整個安裝過程可在資料庫開啟是進行
重新執行oracle的安裝程式,選擇高階模式安裝,選擇coustm方式選擇元件,找到cman元件選擇安裝。
因為還有一個oracle的補丁
重新執行oracle補丁安裝程式,選擇cman元件安裝補丁。
因為還有一個oracle的補丁
重新執行oracle補丁安裝程式,選擇cman元件安裝補丁。
2、配置:
安裝好cman後需要配置cman.ora檔案
預設在/u01/app/oracle/product/10.2.0/network/admin/samples下有一個cman.ora模板檔案
安裝好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))
)
)
)
)
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
[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:
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*
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
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
檢查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)
)
(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埠
(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錯誤
報ORA-12564: TNS:connection refused錯誤
8、排除問題
檢查cman.ora配置無問題,啟動防火牆1521埠,允許20.20.20.20的1521被訪問,則可以正常連上,但正常情況下客戶端只要連線cman就可以正常連線資料庫的。
注意客戶端tnsname.ora檔案以下地方:
注意客戶端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監聽埠。
(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)
)
(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
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何配置MTS以穿越防火牆連線oracle防火牆Oracle
- 使用Tor繞過防火牆進行遠端匿名訪問防火牆
- Linux 防火牆只允許指定IP 埠訪問Linux防火牆
- hadoop不能互相訪問和linux防火牆守護程式HadoopLinux防火牆
- 在Ubuntu上配置SSH訪問並關閉防火牆Ubuntu防火牆
- 防火牆雙出口環境下私網使用者通過NAPT訪問Internet防火牆APT
- Linux 防火牆配置使用Linux防火牆
- Mac有防火牆嗎?關於Mac防火牆常見的問題解答Mac防火牆
- WAb防火牆與傳統防火牆防火牆
- wampserver搭建站點 允許訪問通過防火牆的設定方法Server防火牆
- 防火牆防火牆
- linux防火牆使用以及配置Linux防火牆
- 使用centos7的wall防火牆可能存在失效問題CentOS防火牆
- 防火牆入侵於檢測——————3、思科 PIX 防火牆和 ASA 防火牆產品線防火牆
- iptables防火牆防火牆
- 防火牆配置防火牆
- 防火牆iptables防火牆
- 防火牆(firewall)防火牆
- Ubuntu 下使用 UFW 設定防火牆Ubuntu防火牆
- 修改防火牆規則,開放 Linux 的 3306 埠,外部訪問 MySQL 資料庫防火牆LinuxMySql資料庫
- win10系統下防火牆阻止程式訪問網路連線的方法Win10防火牆
- linux下mysql開啟遠端訪問許可權及防火牆開放3306埠LinuxMySql訪問許可權防火牆
- CentOS 7.0防火牆CentOS防火牆
- Linux防火牆命令Linux防火牆
- CentOS 防火牆操作CentOS防火牆
- Linux配置防火牆Linux防火牆
- 防火牆部署案例防火牆
- 防火牆介紹防火牆
- LINUX 防火牆 firewalldLinux防火牆
- docker上面部署nginx-waf 防火牆“modsecurity”,使用CRS規則,搭建WEB應用防火牆DockerNginx防火牆Web
- ubuntu 關閉防火牆命令 ubuntu怎樣關閉防火牆Ubuntu防火牆
- 配置Ingress支援HTTPS訪問(二):使用cert-manager申請證書HTTP
- 防火牆 搜尋 釋出 防火牆是什麼?怎麼理解?防火牆
- 使用防火牆讓你的 Linux 更加強大防火牆Linux
- Oracle外網訪問Oracle
- Oracle 訪問路徑Oracle
- linux 7 防火牆操作Linux防火牆
- Firewalld防火牆基礎防火牆
- 資料庫防火牆資料庫防火牆