logo

English

이곳의 프로그래밍관련 정보와 소스는 마음대로 활용하셔도 좋습니다. 다만 쓰시기 전에 통보 정도는 해주시는 것이 예의 일것 같습니다. 질문이나 오류 수정은 siseong@gmail.com 으로 주세요. 감사합니다.

RPC에 대하여... (2) : RPC 가 사용하는 포트를 바꿔보자

by digipine posted Oct 29, 2017
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print

About RPC... (2)


지난 RPC 이야기에서 RPC는 동적으로 프로토콜과 종점(endpoint)을 선택할 수 있다고 했다. 오늘날 대부분의 RPC 서비스가 TCP/IP 프로토콜을 사용하지만 HTTP 처럼 고정적인 TCP/IP 포트를 사용하지 않는다. 소위 종점 매퍼(endpoint mapper)를 이용하여 사용 가능한 포트들 중에서 임의의 한 포트를 사용하도록 동적 바인딩(dynamic binding) 기법을 사용한다. 이렇게 동적 바인딩을 하기 위해 RPC 클라이언트는 종점 매퍼에게 어떤 포트를 사용해야 하는가 찔러봐야 하는데 이때 종점 매퍼가 사용하는 포트가 135번 포트이다. 고로... RPC 서비스는 항상(반드시 그렇진 않지만 대부분) 135번 포트와 RPC 서비스가 서비스에 사용하는 가변적인 포트를 2개 이상 사용한다는 것이 지난 포스트의 요지가 되겠다.

요번 포스트에서는 RPC 서비스가 사용하는 포트를 임의가 아닌 내가 설정하는 포트들 중에서 하나를 사용하도록 설정하는 방법에 대해 알아보겠다. 왜 그렇게 해야 하냐고? 음... DB 서버에 SQL Server가 설치되어 있다고 가정해 보자. 그리고 웹 서버에서 분산 트랜잭션을 사용하여 DB 서버에 접근해야 한다고 역시 가정해 보자. 그리고 둘 사이에 방화벽이 버티고 있다고 한가지 더 가정해 보자. 방화벽에서 SQL Server에 관련된 포트를 열어 줘야겠지? SQL Server 가 사용한다는 1443 포트만 달랑 열어주면 될까? SQL Server가 분산 트랜잭션에 관여된다는 이야기는 웹 서버와 DB 서버의 DTC가 서로 통신한다는 이야기가 되고 이는 곧 RPC 프토로톨이 사용된다는 얘기이다. 따라서 RPC 가 사용하는 포트 역시 열어줘야 하는데... 1443번 포트에 추가해서 달랑 135번 포트만 열어주면 될까? 아니올시다란 말이다. 그렇담 어떻게 해야 하는가? RPC는 사용 가능한 포트들 중 거의 랜덤하게 포트를 사용할 것인데 어떤 포트를 사용할 줄 알고 방화벽 포트를 열어 줄 것인가?

해결책은 있다. 첫째로 무식하면 용감하다는 말 대로 하면 된다. msdtc.exe가 사용하는 포트를 매번 모니터링 했다(모니터링 하는 방법은 지난 RPC 이야기를 참조해라)가 방화벽 포트를 그때 그때 열어 주면 된다. 이러면 msdtc.exe 프로세스가 재시작하거나 시스템이 리부팅 될 때 마다 방화벽 포트를 바꾸어 주면 되겠다. 정말 멋지고 무식한 방법이 되겠다.

두 번째 방법은... DTC 가 사용하는 포트를 지정해 주고 그 지정한 포트를 방화벽이 열어주면 되지 않겠는가? 요것이 권장하는 방법임은 두말하면 입 아프다.


RPC 가변 포트 지정


RPC가 사용하는 임의의 포트를 지정해주는 방법은 어렵지 않다. Windows NT 시절에는 레지스트리를 직접 수정해 주어야 했지만 (그때는 정말 빡셌다... -_-) 지금은 친절한 UI가 존재 한다. 비록 이름이 엉뚱해서 햇갈리지만...

구성요소 서비스 MMC를 열고 내 컴퓨터를 찾아 등록정보를 지긋이 눌러보자. 내 컴퓨터 등록정보가 나타날 것이다. 이제 기본 프로토콜 탭을 찾아 눌어 보자. 특별히 Windows 2000 이나 Windows 2003 서버에서 이 설정을 손대지 않았다면 '연결 지향 TCP/IP'가 아마 맨 위에 위치해 있을 것이다. '연결 지향 TCP/IP'를 선택하고 '속성...' 버튼을 누른다. 그러면 'COM 인터넷 서비스 속성' 대화상자가 또 나타난다. 이 대화상자에서 포트 범위 값을 지정할 수 있다. (딴거 손대지 말고 포트 범위만 입력하자. 딴거 설명하면 입만 아프고 별 의미도 없다. 정 궁금하면 KB 자료 찾아보길 바란다.)  말로만 하면 절대로 못찾을 터... 캡처 서비스 들어간다...


<< RPC 포트 설정 UI :: 요 UI 안쓸려면 요기에서 지시하는대로 레지스트리 수정하든가... 빡실껄? >>

근데 좀 이상타... RPC 가 사용하는 포트를 지정할 수 있게 해준다면서 웬 구성 요소 서비스(COM+) MMC 에, COM 인터넷 서비스 속성? 요거이 마소의 문제가 되긋다. 분명 이 설정은 모든 RPC 서비스에 영향을 주는 변경 사항임에도 불구하고 UI는 떡하니 COM+ 관련 MMC에 포함되어 있다. 요거 조심해야 할 것이다. 이 설정을 바꾸면 모든 RPC 서비스에 영향을 준다는 것을 명심하자. 실제로 이렇게 속성 값을 바꾸면 레지스트리 키가 하나 추가되는데, 추가되는 위치가 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Rpc\Internet 이다. 바로 RPC의 속성에 기록되는 것이다. 이렇게 애매한 이름이로 애매한 위치에 RPC 포트 설정을 넣어버린 마소는 꼬추 잡고 반성해야 할 것이다.

어찌 되었건 위와 같이 설정하면 RPC 가 사용하는 포트는 40000 번 부터 40010 번 사이에서 결정된다. 이렇게 해놓고 방화벽을 40000번 부터 400010번을 열어 주면 된다. 따라서 방화벽에 열어주어야 할 포트는 1443 번 SQL Server 포트, 135번 RPC 종점 매퍼 포트 그리고 RPC 가변 포트 40000~40010 포트를 열어주면 된다. Windows XP 나 Windows 2003에 기본 포함된 방화벽은 포트의 범위를 열 수 없으므로 조뺑이 치면서 40000 부터 40010까지 반복 노가다를 해야 한다. 쯔읍...

여기서 한가지... Windows 2003 SP1 혹은 Windows XP SP2에 포함된 방화벽을 사용하는 경우의 설정은 좀 더 쉽다. 새로이 추가된 프로그램 포트 설정(해당 프로그램이 사용하는 모든 포트를 방화벽이 허용하는 옵션)과 135번 포트를 열어주면 RPC를 사용할 수 있다. DTC의 경우라면 msdtc.exe 프로그램과 135번 포트를 열어 주면 된다는 얘기이다(관련 KB 자료 링크 혹은 다른 KB 자료 링크). 이러한 설정은 앞서 RPC의 포트 영역 설정을 하지 않아도 무방하다. 하지만 별도의 방화벽 독립 제품이라면 RPC가 사용하는 포트 설정은 필수적인 것이다 (개발 서버 혹은 운영 서버라면 방화벽 서버가 존재할 것이다.)

그리고 이 설정이 끝나면 컴퓨터를 리부팅 해야 한다. 요것이 아픔이 되겠다. 이 설정은 RPC 종점 매퍼를 재시작 해야만 효과가 있는 설정이다. 그래서 RPC 종점 매퍼를 재 시작할려고(사실 재시작 옵션이 존재하지도 않는다) 치면... RPC 종점 매퍼에 의존성이 있는 모든, 십 수개의 핵심적 운영체제 서비스가 재시작 되어야 한다. 이건 거의 재부팅 수준이고... 서비스 들이 성공적으로 재시작한다는 보장도 없으므로... 리부팅을 해야 한다. 운영 중인 서버라면 재부팅이 상당히 부담되겠지만... 심야 작업을 통해서라도 재부팅을 해야 설정이 유효해 짐을 명심하자.

재부팅이 되면 TcpView 유틸리티로 msdtc.exe 프로세스가 어떤 포트를 사용하고 있는지 눈으로 확인하자. 우리가 지정한 포트를 사용하고 있음이 확실할 것이다.


<< 40000~ 40010 번 포트를 RPC에서 사용하도록 설정한 후의 TcpView 상황 >>

위 그림에서 msdtc.exe 프로세스가 40001 번 포트를 사용하고 있음을 확인할 수 있을 것이다. 그리고 lass.exe 프로세스는 Windows 의 보안 관련 서비스 프로세스로서 인증, 권한에 관련된 다양한 서비스를 제공하는 프로세스다. 그리고 이 녀석도 역시 RPC를 사용한다 (보면 몰라? 40000 번 포트 쓰잖아).


왜 포트를 여러 개 지정해야 하는가?


다 좋다... 그런데 왜 포트를 여러 개 설정하고 열어야 할까? 40000번 포트 한 개만 사용하도록 하면 안되나? 보안상의 문제도 있고... 음냐뤼... 지금까지 글을 제대로 읽지 않았다고 볼 수 밖에 없는 질문이다. 이 설정은 모든 RPC 서비스들에 영향을 준다고 했다. 그렇다면 DTC 뿐만 아니라 Windows 기본 인증 서비스, 기타 등등 모든 서비스는 설정된 포트들을 쓸 것 아닌가? DTC가 수행되기 전에 다른 RPC 서비스가 구동되서 달랑 한 개 사용가능한 포트를 써 뿌리면 어떻게 해야 하나? 조지는 것이다. 이 때문에 RPC 서비스를 사용하는 다른 서비스들을 위해 최소 5개 정도의 포트를 열어 두는 것이 좋다. 만약 방화벽을 사이에 두고 DCOM 호출을 한다면 더더욱 설정할 포트의 개수는 늘어난다고 보면 된다. DCOM 역시 하부 프로토콜로 ORPC라는 것을 쓰는데, ORPC도 역시 RPC의 일종이기 때문이다.

DCOM은 언제 쓰느냐고? DCOM은 부지 불식 간에 많이 사용된다. MMC를 열어 다른 컴퓨터를 '관리' 해 본적이 있을 것이다. 이 때 MMC는 원격 컴퓨터의 COM객체를 DCOM에 의해 호출한다. 또, COM+ 의 어플리케이션 설정이 '서버' 이고 이 어플리케이션을 원격 컴퓨터에서 프록시 내보내기를 통해 액세스 한다면 당근 사용되는 것이 DCOM 이기도 하다.

앞서의 화면 캡처에서 inetinfo.exe 프로세스도 40002번 포트를 사용하고 있음을 주의 깊게 살펴보자. 필자가 다른 컴퓨터에서 인터넷 정보 서비스 관리 MMC를 띄워서 이 컴퓨터에 '연결'한 경우이다. 이렇게 IIS 관리자 MMC에서 원격 컴퓨터를 액세스 할 때 DCOM (RPC)을 사용하여 원격 액세스를 수행하며 이 때에 RPC에서 사용한 포트를 하나 사용한다. COM+의 서버 타입의 어플리케이션을 작성하고 '내보내기'를 수행하여 원격에서 호출을 수행해 보자. 역시 설정된 RPC 포트를 사용할 것이다.

그렇다면 몇 개정도의 RPC 포트를 설정해 주는 것이 좋을까? 항상 그렇듯이 정답은 읍다. '그때 그때 달라요'가 되겠다. 테스트 기간에 넉넉하게 많은 포트를 설정해 놓고 사용되는 포트의 개수를 확인하여,  운영 시스템에서 적절한 포트 수를 적용하는 얍삽한 방법을 추천하는 바이다.


DTC가 제대로 작동할까?


자... 이제 RPC의 포트 설정도 했고 방화벽도 적절히 열어 줬으니 DTC를 통해 분산 트랜잭션이 되어야지... DB 서버가 Windows 2000 이라면, 그리고 웹 서버가 Windows 2000이거나 Windows XP SP1 이라면 잘 될 것이다. 하지만 DB 서버가 Windows 2003 이거나 혹은 DB 서버건 웹 서버건 Windows XP SP2를 사용 중이라면 여전히 DTC를 통한 분산 트랜잭션은 제대로 수행되지 않을 가능성이 높다. Windows 2003과 Windows XP SP2 의 강력한 보안은 DTC에 추가적인 RPC 보안 설정을 넣어 놓았으니... 요거이 제대로 설정되지 않으면 DTC는 작동하지 않을 것이다.

 
TAG •

List of Articles
No. Subject Author Date Views
25 RegEnumKeyEx 함수 사용법 digipine 2017.10.29 754
24 [WINCE] Process, Thread API 함수 사용법 digipine 2017.10.29 960
23 [WINCE] 메모리카드 상태 감시 digipine 2017.10.29 327
22 [WINCE] IAT Hooking 방법과 소스 코드 digipine 2017.10.29 659
21 [WINCE] 키보드 및 마우스 메시지 후킹하기 digipine 2017.10.29 809
20 [C#] C#에서 C++ DLL의 Call by Referance out 인수 사용하는 방법 digipine 2017.10.29 1076
19 [C#] Convert char[] to string digipine 2017.10.29 301
18 VS2005 ConvertBSTRToString 에서 LNK2019 에러 대처법 digipine 2017.10.29 192
17 VS2003 이상에서 iostream 구현의 문제점 digipine 2017.10.29 256
16 DLL과 EXE간의 데이타 공유하기 digipine 2017.10.29 837
15 Serialize를 이용한 객체 복사하기 (Copy constructor) digipine 2017.10.29 499
14 세마포어의 개념과 사용법 digipine 2017.10.29 765
13 VC++ 에서 대소문자 변경하는 함수 digipine 2017.10.29 310
12 VC++(MFC)에서 MDB 생성 / 압축 / 연동관리자 digipine 2017.10.29 2654
11 CreateSemaphore Semaphore Manager digipine 2017.10.29 447
10 Mutex, Critical Section Class 만들기 digipine 2017.10.29 392
9 Windows API 멀티 쓰레드 구현법 digipine 2017.10.29 691
8 RPC에 대하여... (3) : RPC 작동을 위한 테스트 방법 digipine 2017.10.29 542
» RPC에 대하여... (2) : RPC 가 사용하는 포트를 바꿔보자 digipine 2017.10.29 1118
6 RPC에 대하여... (1) : RPC 가 사용하는 TCP/IP 포트는 ? digipine 2017.10.29 1295
Board Pagination Prev 1 2 3 Next
/ 3