Oracle

게시글 보기
작성자 유건데이타 등록일 2015-05-15
제목 방화벽(FIREWALL)과 오라클 접속
방화벽(FIREWALL)과 오라클 접속
==============================


Purpose
-------

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

firewall을 통과하기 mts/deciated, unix/windows 각각에 대한 지정 방법은
를 참고하도록 합니다.


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:\temp

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

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
Comment
등록된 코멘트가 없습니다.