[Oracle]방화벽(FIREWALL)과 오라클 접속

2004. 12. 7. 08:49일 이야기

참조 : http://otn.oracle.co.kr/index.html

No. 12248

방화벽(FIREWALL)과 오라클 접속
==============================

Purpose
-------
방화벽을 통한 오라클 접속과 port redirection에 대해 알아 봅니다.


Explanation
-----------

오라클 접속과 방화벽
--------------------
client가 sqlplus를 통해서 (sqlplus userid/password@alias) 접속을 하면 명시한 alias이름을 tnsnames.ora 파일 또는 names server 에서 찾게 됩니다.
그런다음 db에 대한 address를 얻어 server로 접속을 하려고 하게 됩니다. db에 있는 listener에 접속을 하게 되고 platform과 init.ora 설정에 따른 port redirection이 일어 나게 됩니다. OS는 OS로 부터 free port를 얻어 리스터를 통해 new port를 할당 받았음을 client에게 보내게 됩니다. 그러면 client는 새로운 port로 db에 접속을 시도하게 됩니다.

만일 client와 server사이에 firewall이 있어 port redirection이 일어나게 되면 원격지에 있는 oracle client는 db로의 접속에 실패하게 될 수 있습니다. firewall이 port를 막아 ora-12203 또는 ora-12535가 발생하게 됩니다. client의 접속은 Windows OS의 port redirection 때문에 실패하게 되는 것입니다. Port redirection은 ora 설정파일에 설정되지 않은 port를 사용해서 db에 접속하게 되도록 하는 것입니다.
UNIX장비에서 Oracle MTS(address port를 init ora 파일에 설정하지 않은), Oracle SSL, NT장비의 Oracle은 port redirection을 일으킵니다.

level 16으로 client trace file을 만들어 봄으로써 이 문제가 방화벽 문제인지 알 수 있습니다.
client쪽 slqnet.ora 파일에 다음을 추가해 주십시요.

trace_level_client = 16
trace_file_client = client
trace_directory_client = < trace 파일이 생성될 디렉토리 > ie: c: emp

sqlnet.ora 파일을 저장하고 sqlplus로 접속을 시도해서 에러를 발생 시키십시요. 그러면 trace file이 만들어 질 것입니다.
여기 그렇게 만든 trace file의 일부분이 있습니다.

listener로 보내진 최초의 packets은 1521port로 보내짐을 trace 파일을 통해 알 수 있습니다.


niotns: Calling address: (DESCRIPTION=(ADDRESS_LIST=(ADDRESS=
(PROTOCOL=TCP)
(HOST=server1)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=v815.world)
(CID=(PROGRAM=D:V815BINSQLPLUSW.EXE)(HOST=server1)(USER=system))))
nladget: entry
nladget: exit
nscall: entry
nscall: connecting...
nsc2addr: entry
nttbnd2addr: entry
nttbnd2addr: port resolved to 1521

listener로 부터 받은 packet은 client에게 1729 port를 사용하라고 명령하고 있습니다.

nscon: recving a packet
nsprecv: entry
nsbal: entry
nsbgetfl: entry
nsbgetfl: normal exit
nsmal: entry
nsmal: 44 bytes at 0xb892d0
nsmal: normal exit
nsbal: normal exit
nsprecv: reading from transport...
nttrd: entry
nttrd: socket 232 had bytes read=64
nttrd: exit
nsprecv: 64 bytes from transport
nsprecv: tlen=64, plen=64, type=5
nsprecv: packet dump
nsprecv:00 40 00 00 05 00 00 00 |.@......|
nsprecv:00 36 28 41 44 44 52 45 |.6(ADDRE|
nsprecv:53 53 3D 28 50 52 4F 54 |SS=(PROT|
nsprecv:4F 43 4F 4C 3D 74 63 70 |OCOL=tcp|
nsprecv:29 28 48 4F 53 54 3D 31 |)(HOST=1|
nsprecv:33 38 2E 32 2E 32 31 33 |38.2.213|
nsprecv:2E 36 31 29 28 50 4F 52 |.61)(POR|
nsprecv:54 3D 31 37 32 39 29 29 |T=1729))| <- 바뀐 port
nsprecv: normal exit
nscon: got NSPTRD packet
nscon: got 54 bytes connect data
nscon: exit (0)

client는 1729 port를 통해 접속을 하려 합니다.

nscall: connecting...
nsc2addr: entry
nttbnd2addr: entry
nttbnd2addr: port resolved to 1729
nttbnd2addr: using host IP address: 138.2.213.61
nttbnd2addr: exit
nsc2addr: normal exit

먼저 client는 1521 port로 packets을 보내게 되고 server로 부터 새로운 port할당을 내용으로 하는 packets을 받게 됩니다.
그러면 이번에 client는 이 다른 port로 packets을 전송하게 됩니다.
이 부분에서 접속이 실패하고 있음을 trade파일이 보여 주고 있습니다.

client에 할당되는 port는 os에서 다른 software나 hardware에서 사용하지 않는 port중에서 임으로 정해서 할당하는 port이며 수정이 불가능 합니다.

일단 접속 실패가 firewall문제임이 밝혀질 경우, 다음으로 할 일은 이 문제를 어떤 방법으로 해결할 것인가를 결정하는 일입니다.

Oracle과 firewall이 정상적으로 동작하는 경우 다음과 같은 몇가지 해결 방법이 있습니다.


해결 방법: Firewall Vendor
첫번째 해결 방법은 firewall를 만든 회사에게 OS port redirection을 하는 오라클 접속을 허락도록 upgrade를 할 수 있는지를 문의해 보는 것입니다.
만일 firewall software가 upgrade가 가능할 경우 이것이 최상의 방법입니다.

해결 방법: Connection Manager
두번째 해결 방법은 oracle net8이상의 버젼을 사용할 경우 connection manager (cman)를 설치하여 client가 firewall을 통해 접속할 수 있도록 하는 것입니다. Connection Manager는 bin디렉토리 아래에 있는 실행파일이며 client와 server사이에 있는 firewall을 통해 접속을 할 수 있도록 합니다. Connection Manager는 listener와 비슷합니다. Connection Manager는 cman.ora 파일안의 있는 주소를 읽어 실행되며 들어오는 접속에 대한 대기 상태로 있게 됩니다. 일반적으로 port는 1610 또는 1630 을 사용합니다.
Connection Manager는 listener와 비슷하게 시작되며 listening 상태에 들어 가게 됩니다.
client쪽 tnsnames.ora 파일에는 다음과 같은 설정이 필요하게 됩니다.


cmantest =
(description =
(address_list =
(address = <- 처음 주소는 cman의 것입니다

(protocol=tcp)
(host=hostname or ip of cman)
(port=1610)
)
(address= <- 두번째 주소는 listener의 것입니다
(protocol=tcp)
(host=hostname or ip of listener)
(port=1521)
)
)
(connect_data = (sid = sidname))
(source_route = yes) <-이것은 clietn가 cman을 사용하며
) 위의 두 주소들을 사용하
게 됨을
의미합니다.


client가 connection manager에 접속을 하게 되면 cman은 client가 가져온 두번째 주소를 cache에서 찾게 됩니다. 두번째 주소는 listener가 실행 되고 있는 컴퓨터의 주소를 가리킵니다. cman은 그 주소를 사용해서 client를 listener쪽으로 돌려 주어 db에 접속을 하도록 합니다.

이 문서에서는 connection manager의 설정에 관한 내용은 언급하지 않겠습니다.
자세한 내용은 metalink의 여러 문서들을 참고하시기 바랍니다.
(참고 2077721.6)

해결 방법: Use_Shared_Socket
세번째 해결 방법은 NT server를 사용하는 경우 registry에 use_shared_socket = true를 추가 하는 방법입니다. (참고 124140.1)

ORACLE을 어떻게 설치하여 사용 하느냐에 따라 달라진다.
a. 한 시스템에서 단 하나의 ORACLE home을 사용한다면
- 7.3.4, 8.0.4 또는 8.0.5 중 하나를 사용하는 경우 다음에 설정
HKEY_Local_machinesoftwareoracle
- 8.1.5, 8.1.6 또는 8.1.7 중 하나를 사용하는 경우 다음에 설정
HKEY_Local_machinesoftwareoraclehome<#>
b. 한 시스템에서 여러개의 ORACLE home을 사용한다면
- 7.3.4, 8.0.5가 다른 ORACLE_HOME에 설치되는 경우
설치된 순서에 따라 제일 먼저 설치된 버젼의 경우에는 항상
HKEY_Local_machinesoftwareoracle 에 설정하면 되고
두번째 설치된 버전의 경우
HKEY_Local_machinesoftwareoraclehome<#>

- 8.1.5, 8.1.6또는 8.1.7

항상 HKEY_Local_machinesoftwareoraclehome# 을 체크 합니다.

이 설정은 OS가 1521 port를 공유해서 사용하도록 하며 따라서 client는 1521 port만을 사용하게 되어 port redirection이 일어나지 않게 됩니다.
이 옵션의 단점은 모든 접속이 listener의 port를 사용하게 되기때문에 만일 listener가 stop이나 start되면 모든 접속이 영향을 받게 된다는 점입니다.

해결방법: 환경변수에 설정하는 경우
a. Windows NT :
제어판 -> 시스템을 선택하게 되면 시스템등록정보 윈도우가 뜨고 시스템
환경설정 원도우에서 환경 Tab을 선택한 후 시스템 변수(S)중 변수(V)에
USE_SHARED_SOCKET 를 값(L)에 TRUE를 설정한다.
b. Windows 2000 :
제어판 -> 시스템을 선택하게 되면 시스템등록정보 윈도우가 뜨고 시스템
환경설정 원도우에서 고급 Tab을 선택한 후 시스템 변수(S)에서 마우스
클릭후 새로만들기 버튼을 누른 후 변수이름(N)에 USE_SHARED_SOCKET 를
변수값(V)에 TRUE를 설정한다.


UNIX장비에서는 만일 Multi Threaded Server (MTS)를 사용하는 경우라면 문제가 있을 수 있습니다. MTS dispatchers가 NT에서처럼 접속하는 port 를 redirect하기 때문입니다.

해결 방법: MTS 포트 설정
위 문제를 해결하기 위해서는 init.ora파일에 mts parameter를 설정할때 port를 명시해야 합니다.(참고 1016349.102)
이렇게 하면 dispatcher가 명시된 port만을 사용하게 됩니다.
물론 명시된 port들은 firewall에서 열려 있어야 합니다.
다음 예에서 port를 2450과 3125로 설정하고 있습니다.
이 방법은 NT에서도 가능합니다.

예)
mts_listener_address="(ADDRESS=(PROTOCOL=TCP)
(HOST=HOSTNAME or IP ADDRESS)(PORT=1521))"
mts_dispatchers="(ADDRESS=(PARTIAL=TRUE)(PROTOCOL=TCP)
(HOST=IP ADDRESS)(PORT=5000))(DISPATCHERS=1)"
mts_dispatchers="(ADDRESS=(PARTIAL=TRUE)(PROTOCOL=TCP)
(HOST=IP ADDRESS)(PORT=5100))(DISPATCHERS=1)"
mts_dispatchers="(ADDRESS=(PARTIAL=TRUE)(PROTOCOL=TCP)
(HOST=IP ADDRESS)(PORT=5200))(DISPATCHERS=1)"
mts_max_dispatchers=10
mts_servers=2
mts_max_servers=5

SSL
SSL을 사용하면 port redirection이 일어나게 됩니다.
해결할 수 있는 방법은 init.ora 파일에 port를 명시해서 MTS를 사용 하거나 cman.ora파일에 port를 명시해서 Connection Manager를 사용하시면 됩니다.

Reference Documment
---------------------
Note.125021.1