이 글은 <http://ils.linuxlab.co.kr/ip_masq_h323.htm>에 최신 버전이 있읍니다.
NAT(IP Masq)가 설치된 리눅스 게이트웨이 내부 랜에 연결된 윈도우 PC에서 M$의 Netmeeting (V3.1) 사용을 가능하게 하기 위한 IP masquerade 모듈 올리기 및 기타 설정을 설명한다. 내부 랜의 리눅스 호스트에서 H.323 프로그램을 사용하는 경우도 마찬가지다.즉 인터넷에 연결된 공인 IP를 사용하는 PC 에서 H.323(Netmeeting) 사용자가 리눅스 게이트웨이 내부 랜에 연결된 사설 IP를 사용하는 윈도우 PC의 Netmeeting 사용자를 호출할 수 있고 그 반대도 가능하게 하는게 이 글의 목적이다. Netmeeting 의 기본 기능 즉 비디오 전송, 음성 전화, 문자 채팅, 칠판 기능 등도 이상 없이 사용할 수 있어야 함은 물론이다.
H.323은 인터넷에서 화상, 음성, 데이터를 동시에 전송하는 프로토콜이다. 리눅스용 h.323 프로그램은 OpenH323 (http://www.openh323.org) 에서 현재 개발중이며 베타버전이 나와 있다. 자세한 사항은 Netmeeting HOWTO를 참고하기 바란다.
얼마 전에 필자가 리눅스랩의 리눅스 서버에 H.323(Netmeeting) 디렉터리 서버(directory server)를 설치했다. (주소는 http://ils.linuxlab.co.kr 이다.) 리눅스랩의 거래처에서 Netmeeting을 사용해서 리눅스랩과 통화하면 전화비가 전혀 들지 않기 때문이다.
요즘 전국 대부분의 가정이나 기업에 ADSL이나 케이블모뎀이 보급되어 있으므로 전화를 사용하지 않고 H.323(NetMeeting) 을 사용해서 연결하면 음성전화 뿐 아니라 문자 및 칠판 기능으로도 의사 전달이 가능하므로 경제적이면서 정확한 커뮤니케이션이 가능해서 이다.
H.323(Netmeeting) 디렉터리 서버가 무엇인지 궁금해 하는 사람을 위해 디렉터리 서버에 대해 설명한다. 보다 자세한 사항을 알려면 http://ils.linuxlab.co.kr 을 참고하기 바란다.
Netmeeting 디렉터리 서버란 NetMeeting을 사용하는 사람들이 모여서 대화할 상대방을 찾는 장소이다. 하이텔의 대화방과 같은 곳이다. NetMeeting 프로그램에서는 상대의 주소(IP Address)를 알면 직접 연결이 가능하나 ADSL 이나 케이블모뎀 처럼 유동 IP를 사용하는 경우는 상대의 주소가 수시로 변경되므로 상대를 직접 연결하려면 그때마다 상대에게 변경된 IP주소를 물어 보아야 하는 불편함이 있다.
비록 상대가 고정 IP를 사용한다 해도 상대가 지금 호출을 받을 준비가 되어 있는지를 알 수 없다. 즉 상대가 피시를 켜서 Netmeeting 프로그램을 가동해서 호출을 받을 준비가 되어 있는지도 알 수 없다. 이 경우에 디렉터리 서버를 사용하면 상대가 지금 호출을 받을 준비가 돼 있는지를 알 수 있다. 디렉터리 서버에 연결이 가능한 상대의 이름, 전자우편주소 등이 표시되기 때문이다. 물론 여기에 나오는 이름, 전자우편 주소는 Netmeeting 사용자가 마음대로 지정할 수 있으므로 익명성은 보장된다.
(디렉터리 서버는 연결하는 상대의 IP 주소만 알려준다. 호출 및 데이타 전송은 두 PC 간에 직접 이루어 진다.)
그 외에도 디렉터리 서버를 사용하면 여러 가지 주제를 정해 놓고 여러 명이 동시에 토론이나 대화를 진행 할 수 도 있다.
잠시 주제가 다른 곳으로 흘러갔는데 필자가 설치한 디렉터리 서버를 테스트 하기 위해 리눅스랩 사무실 옆의 컴퓨터 학원 윈도우 PC에서 필자의 사무실 윈도우 PC로 Netmeeting 연결을 시도했는데 에러가 났다. 이유는 간단했다. 그 학원의 윈도우 피시는 모두 사설 IP를 사용하고 있기 때문이었다. 공인 IP 한 개를 리눅스에서 NAT(IP masq)를 사용해 내부 랜의 모든 윈도우 피시에서 공유하고 있기 때문이었다. 그 리눅스 서버는 필자가 직접 설치 했었다.
IP 공유를 구현하는 방법은 여러 가지가 있다. 윈도우98로도 가능하고 IP 공유기도 나와 있다. 그러나 리눅스 NAT 게이트웨이가 다른 어느 방법보다 거의 대부분의 인터넷 기능을 제한없이 사용할 수 있다고 주위의 모든 사람들에게 이야기하곤 했는데 리눅스 NAT 게이트웨이 내부 랜에서 외부의 다른 윈도우 PC와 Netmeeting을 연결할 수 없다는 건 리눅스 체면 문제가 아닌가? 그래서 이를 해결하려고 리눅스 뉴스그룹에서 검색을 시작했다. (필자가 어떤 문제를 해결할 때 가장 먼저 시작하는 단계이다.) comp.os.linux.networking 에 이미 이에 관한 글이 많이 올라와 있었다. 그 동안은 필자가 Netmeeting에 대해 관심이 없어서 지나쳤던 것이다. 이 글을 쓰는 데 필요한 자료나 사이트는 모두 이 뉴스 그룹에서 발견했다.
필자가 확인해 보지는 않았으나 윈98이나 공유기를 사용하는 내부 랜에서는 외부 인터넷 사용자와의 Netmeeting 연결 문제를 해결하지 못하고 있으리라고 확신한다.(어떤 IP 공유 기법을 사용 하든 내부 랜의 윈도우 사이에서는 물론 Netmeeting 연결이 가능하다.)
Netmeeting 프로그램은 인터넷을 이용하는 화상회의(전화) 프로그램이다. 피시에 마이크와 스피커(또는 헤드셋)만 있으면 NetMeeting 을 사용할 수 있다. 카메라는 없어도 된다. (마이크는 카메라에 있는 경우가 많다.) 윈도우용 NetMeeting 에는 키보드로 대화하는 기능도 있으며 화면에 그림을 그려 보여 줄 수도 있다(white board). 리눅스용 NetMeeting 프로그램은 openH323 이라 불리는데 윈도우 Netmeeting 프로그램과 비슷한 기능을 갖고 있다. OpenH323 프로그램 홈페이지는 http://www.openh323.org 이다.
http://www.coritel.it/coritel/ip/sofia/nat/nat2/nat2.htm
Netmeeting 용 ip masq 커널 모듈 개발 홈페이지다. 필히 방문하기 바란다.
- http://www.coritel.it/coritel/ip/sofia/nat/nat2/faq.txt
- Linux Firewall and M$ Windows Netmeeting Mini-mini-mini-howto
by C.E. Lopes (lopes@berbee.com)
이 글은 Netmeeting 사용을 위한 게이트웨이 설정 작업을 매우 체계적이고 상세히 설명하고 있다. 필자의 글도 거의 이 글의 설명 순서를 따르고 있다. comp.os.linux.networking에서 찾았다.
- linux netmeeting howto
리눅스용 Netmeeting 프로그램인 OpenH323 프로그램 설치, Netmeeting 디렉터리 서버 설치에 관한 하우투이다.
http://www.microsoft.com/windows/NetMeeting/Corp/reskit/Chapter4/default.asp
Netmeeting 이 사용하는 포트 및 방화벽 내에서의 사용에 대한 자료가 있다.
이 글의 내용은 리눅스 커널 2.2를 사용하는 경우에만 해당된다. 2.4에는 적용되지 않는다. 배포본은 무관하다. 단 이 글은 데비안 2.2를 사용하는 시스템을 대상으로 설명 했다. 다른 배포본의 경우에는 일부 설정 파일의 위치가 약간 다를 뿐이므로 이 글을 참고해서 설정하는게 어렵지 않을 것이다.
게이트웨이에 Netmeeting 모듈을 추가하려면 커널을 컴파일해서 변경해야 한다. 그러나 이 글에서는 커널 컴파일에 대한 기본 절차 외의 다른 부분은 설명하지 않는다. 범위가 너무 넓기 때문이다. 자세한 사항은 2000년 12월호의 커널 컴파일 글을 참고하기 바란다.
커널을 컴파일하지 않고 컴파일된 커널과 모듈을 다운 받아서 사용이 가능하다고 하나 여기서는 설명하지 않는다. 이 방법은 사용자의 환경에 따라서는 작동하지 않을 수도 있기 때문이다. 이 방법을 사용하려면 <그림 1>의 사이트를 참고하기 바란다.
또 NAT 게이트웨이와 방화벽은 그 개념이 다르다. 따라서 리눅스를 NAT 게이트웨이가 아닌 방화벽으로만 사용한다면 이 글은 해당되지 않는다.
이 글에서 NAT가 설정된 리눅스 게이트웨이의 네트워크 구성은 아래와 같다.
랜카드는 두 개가 꼽혀 있고 eth0는 인터넷에 연결되어 있다. 인터넷 주소는 공인/고정 IP(211.217.X.Y) 이다. 내부 랜은 eth1에 연결되어 있고 IP 주소는 192.168.2.1, 네트워크 주소는 192.168.2.0/24 이다. 즉 서브네트마스크가 255.255.255.0이다.
dongcom:~# netstat -nr Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface 192.168.2.1 0.0.0.0 255.255.255.255 UH 0 0 0 eth1 127.0.0.1 0.0.0.0 255.255.255.255 UH 0 0 0 lo 211.217.X.Y 0.0.0.0 255.255.255.255 UH 0 0 0 eth0 211.217.X.Z 0.0.0.0 255.255.255.248 U 0 0 0 eth0 192.168.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 0.0.0.0 211.217.X.W 0.0.0.0 UG 0 0 0 eth0(이 글은 실제 사이트에서 필자가 테스트한 내용을 그대로 적었으므로 w,x,y,z 은 보안상 필자가 감추었다.)
eth0의 인터넷 주소가 고정 IP 일 필요는 없다. 케이블 모뎀이나 ADSL을 사용하는 유동 IP의 경우에도 이 글은 적용된다. IP 지정 부분만 달라질 뿐이다. 또 내부 랜(192.168.2.0)의 윈도우 PC에 리눅스에서 DHCP로 IP 주소를 할당 하는 경우에도 이 글은 적용된다. 그러나 DHCP를 사용해서 IP를 할당하는 방법은 여기서 설명하지 않는다. (2000년 7월호의 DHCP 서버 설치 글을 참고하기 바란다.)
커널을 컴파일할 때 eth0의 인터넷 연결 방법(고정 IP, 다이얼업 PPP, 케이블모뎀, ADSL) 등에 따라 옵션 선택이 달라진다. eth1의 내부 랜에 DHCP를 사용할 경우도 마찬가지다. 이에대한 사항도 다른 글을 참고하기 바란다.
Netmeeting 사용을 위해서는 ip masq 모듈을 올리는 점에서는 기존의 real audio나 ftp 모듈을 올리는 것과 같다. 단지 이 모듈은 아직 2.2 커널 소스에 들어 있지 않으므로 2.2 커널을 패치해서 모듈을 만들어야 하는 것이 다르다. 커널은 두 군데를 패치하는데 ip_masq_h323.o 란 커널 모듈을 만들어 주기 위한 패치와 또 port forwarding 설정(인터넷에서 내부랜의 netmeeting 을 호출하는 경우)도 필요하다.
http://www.coritel.it/coritel/ip/sofia/nat/nat2/nat2.htm 에서 받을 수 있다.
a. 2.2.18 커널 소스가 /usr/src/linux 디렉터리에 설치되어 있어야 한다.
b. ip_masq_h323.c 파일을 /usr/src/linux/net/ipv4 에 넣는다.
c. /usr/src/linux/net/ipv4/Makefile을 수정한다. 95번째 라인을 아래처럼 수정 한다.
원본) M_OBJS += ip_masq_ftp.o ip_masq_irc.o ip_masq_raudio.o ip_masq_quake.o
수정) M_OBJS += ip_masq_ftp.o ip_masq_irc.o ip_masq_raudio.o ip_masq_quake.o ip_masq_h323.o
d. cd /usr/src/linux
아래서부터는 약간 달라진다.
사용 중인 커널에 아래 옵션이 포함된 경우는(아래 옵션을 넣어 컴파일한 경우는) 커널 컴파일은 필요 없다.(대부분의 배포본에 포함된 기본 커널에는 아래 옵션이 들어 있다.) 즉 아래 단계 "e"는 필요 없다. 아래 옵션을 포함하지 않은 커널의 경우는 아래의 "e" 를 거친다.
[*] Enable loadable module support
e. make dep, make clean, make bzImage 까지 진행해서 새로운 커널을 만든다.
f. make modules , make modules_install 명령을 실행한다.
g. /lib/modules/2.2.18/ipv4/에 아래 파일이 들어 있는지 확인한다.
-rw-r--r-- 1 root root 10520 Apr 8 00:28 ip_masq_h323.o
h. 단계 "e"를 거쳤다면 커널을 변경하고 리부팅한다.(즉 커널에 모듈 사용 옵션이 잇어야 모듈 적재가 가능하다.)
아래는 모듈이 정상적으로 적재 되는지를 확인하는 절차다.
i. insmod ip_masq_h323 명령을 실행한다.
- 아래처럼 메시지가 나온다.
Using /lib/modules/2.2.18/ipv4/ip_masq_h323.o
- lsmod 명령을 주면 아래 라인이 있어야 한다.(다른 내용도 들어 있다.)
ip_masq_h323 7160 0 (unused)
IP masquerading 은 따로 설명하지 않는다.
1) 커널에 ip masq 지원을 추가한다. 모듈로 올리든가 컴파일한다. 2) ipchains rule 을 설정 /sbin/ipchains -P forward DENY /sbin/ipchains -A forward -s 192.168.2.0/24 -j MASQ 3) ip masq 모듈을 적재한다. 여러 개의 모듈이 필요하다. 아래와 같다. lsmod 명령으로 본 것이다. 필히 ip_masq_h323 부분이 나와야 한다.) ip_masq_h323 7160 0 (unused) ip_masq_vdolive 1432 0 (unused) ip_masq_ftp 2552 0 ip_masq_raudio 3064 0 (unused)데비안의 경우는 /etc/modules 에 모듈을 넣는다.
이상으로 설정은 끝났다. Netmeeting에서 디렉터리 서버를 ils.linuxlab.co.kr 로 지정해서 필자를 호출할 수 있는지 테스트해 보기 바란다. 디렉터리 서버에 메일주소가 bae@linuxlab.co.kr 인 사람이 필자이다.
*. 커널 2.2.18 용 ip_masq_h323 모듈 다운 받기 및 적재
커널에 모듈 지원이 포함돼 있다면 커널 2.2.18 버전 h.323 모듈을 다운 받아 설치하기 바란다.
ip_masq_h323 모듈을 사용하면 내부 랜에 연결된 윈도우에서 외부 인터넷의 Netmeeting 호스트를 호출하는 경우에는 화상통신이 가능하다. 그러나 인터넷 상의 netmeeting 호스트가 내부 랜의 윈도우 netmeeting을 호출하는 것은 안된다. 내부 랜의 모든 윈도우는 사설 IP를 사용하고 있으므로 공인 IP에서 사설 IP를 연결하는 것은 TCP/IP 네트워킹에서 허락하지 않기 때문이다.
그러나 포트포워딩을 사용해서 인터넷에서 NAT가 설치된 리눅스의 공인 IP를 호출하면 내부 랜의 특정 윈도우 PC로 그 호출이 전달되게(호출을 받을 수 있게) 설정할 수는 있다.(즉 한 대의 윈도우에서만 호출을 받을 수 있다. 내부 랜에서 인터넷상의 netmeeting을 호출하는것은 위의 ip_masq_h323 이 담당하므로 여러 대가 동시에 가능하다.)
포트포워딩을 설정하려면 netmeeting 이 사용하는 포트번호를 알아야 한다. 아래와 같다.
Port Function Outbound Connection
------ ----------------------------- -------------------------
389 Internet Locator Service (ILS) TCP
522 User Location Service TCP
1503 T.120 TCP
1720 H.323 call setup TCP
1731 Audio call control TCP
Dynamic H.323 call control TCP
Dynamic H.323 streaming Real-Time Transfer Protocol
(RTP) over UDP
------------------------------------------------------------------
포트포워딩은 상당히 중요한 개념이다. 사설 IP를 사용하는 내부 랜에 연결된 서버를 인터넷에서 연결하는 경우나 Diablo, starcraft, dialpad 등를 NAT(IP Masq) 게이트웨이가 설치된 내부 랜에서 사용할 때 필요하다. 포트포워딩은 IP Masquerade와 함께만 설정이 가능하다. 별도로는 작동이 안된다.
커널 2.2에서 포트포워딩을 사용하려면 ipmasqadm 프로그램이 필요하다. 커널에도 추가로 모듈을 올리거나 컴파일해 해야 한다. 이에 대한 자세한 글은 2000년 3월호 리눅스 월드에 썼다. 커널 2.4에서는 NAT와 포트포워딩이 iptables 한 개로 통합되었다.
Netmeeting 호출을 위한 포트포워딩 설정은 필자도 아직 테스트하지 못했다. 위의 h323 모듈 사이트의 글을 인용하면 아래와 같다. (커널 2.2 사용의 경우만 해당하나 2.4에서도 사용 할 수 있다. 단 ipchain 모듈이 필요하다.)
1) 커널 설정
포트포워딩을 하려면 ip masquerading 설정을 위한 옵션 외에 추가로 아래 선택이 필요하다.(모듈로도 가능하다.)
[*] IP: masquerading special modules support (NEW) <*> IP: ipportfw masq support (EXPERIMENTAL) (NEW)
2) ipmasqadm 프로그램 설치
ipmasqm 프로그램이 없으면 소스를 다운 받아 컴파일한다.
*. 컴파일 전에 리눅스 커널 소스가 /usr/src/linux에 있어야 한다.
- tar zxvf ipmasqadm-0.4.2.tar.gz - cd ipmasqadm-0.4.2 - Makefile 을 수정함.
20번 라인의 @test -f $(KSRC)/include/linux/ip_masq.h 라인을 @test -f /usr/src/linux/include/linux/ip_masq.h 으로 수정
- make - make install
ipmasqadm은 /usr/sbin에 위치함.
이상은 포트포워딩에 필요한 기본절차이다.(모든 포트포워딩에 공통적으로 필요하다.) 아래는 netmeeting에만 해당된다.
3) 커널 소스 수정(/usr/src/linux/net/ipv4/ip_masq_app.c 파일)
이 부분은 h323 모듈 FAQ에 있다.
struct ip_masq_app * ip_masq_bind_app(struct ip_masq *ms)
{
struct ip_masq_app * mapp;
if (ms->protocol != IPPROTO_TCP && ms->protocol != IPPROTO_UDP)
return NULL;
mapp = ip_masq_app_get(ms->protocol, ms->dport);
#if 0000
/* #ifdef CONFIG_IP_MASQUERADE_IPAUTOFW */
if (mapp == NULL)
mapp = ip_masq_app_get(ms->protocol, ms->sport);
/* #endif */
#endif
if (mapp == NULL)
/*
* paolo 24/10/2000
*/
mapp = ip_masq_app_get(ms->protocol, ms->mport);
if (mapp != NULL) {
/*
* don't allow binding if already bound
*/
if (ms->app != NULL) {
IP_MASQ_ERR("ip_masq_bind_app() called for
already bound object.\n");
return ms->app;
}
ms->app = mapp;
if (mapp->masq_init_1) mapp->masq_init_1(mapp, ms);
ip_masq_app_bind_chg(mapp, +1);
}
return mapp;
}
-----------------------------------------------
if (mapp == NULL)
mapp = ip_masq_app_get(ms->protocol, ms->mport);
---------------------------------------------
이 추가된 부분이다.
4) 커널을 다시 컴파일하고 설치한다. 커널 소스를 수정했기 때문이다. 즉 lilo.conf에 새 커널을 등록한다.(일부 배포본은 이미 이 패치가 들어 있다고 한다.)
5) ipmasqadm 설정 및 자동실행
부팅시 아래 명령이 자동으로 실행되야 한다. 물론 ip masq를 위한 ipchains 명령도 같이 실행되야 한다.
/usr/sbin/ipmasqadm portfw -f /usr/sbin/ipmasqadm portfw -a -P tcp -L Linux-IP 1720 -R Window-IP 1720 /usr/sbin/ipmasqadm portfw -a -P tcp -L Linux-IP 1503 -R Window-IP 1503 *. Linux-IP는 NAT가 설치된 리눅스 게이트웨이의 인터넷쪽 주소 *. Window-IP는 내부랜에 연결된 호출을 받는 윈도우 피시 주소6) 유동 IP를 사용하는 경우의 문제 리눅스 게이트웨이가 케이블모뎀이나 ADSL 같은 유동 IP를 사용하는 경우는 위의 Linux-IP를 어떻게 지정하는가?
ADSL 에는 간단한 방법이 있다. /etc/ppp/ip-up 스크립트를 사용하면 자신의 IP를 쉽게 알 수 있다. 즉 ip-up 스크립트에서 ipmasqadm을 실행하면 된다. 방법은 여러분이 스스로 알아내기 바란다.
케이블모뎀은 DHCP를 사용하므로 이 방법이 안통한다. 자신의 IP를 알아내는 여러 가지 방법이 가능하다.
아래 방법이 가능할 것 같다.
Linux_IP=`ifconfig eth0 | grep inet | awk '{ print $2 }' | cut -d: -f2 | cut -d' ' -f1`
이상으로 내부랜에서 netmeeting 사용을 위한 설정을 마친다.
ils.linuxlab.co.kr 디렉터리 서버 접속자 보기
아래는 210.118.23.50 피시에서 211.217.77.243 을 호출(디렉터리 서버를 경유)한 경우의 포트 사용을 추적한 것이다. 넷미팅 연결 과정 파악에 도음이 될것 같다.
211.217.77.243:1720 = 6 406 -PA- eth1 210.118.23.50:1060 = 0 0 ---- eth1 211.217.77.243:1142 = 11 1115 --A- eth1 210.118.23.50:1061 = 0 0 ---- eth1 210.118.23.50:1052 = 1 40 RESET eth1 207.46.197.102:80 = 0 0 ---- eth1 211.217.77.243:1503 = 27 1423 --A- eth1 210.118.23.50:1064 = 0 0 ---- eth1 211.217.77.243:1503 = 37 2881 -PA- eth1 210.118.23.50:1065 = 0 0 ---- eth1 211.217.77.243:1503 = 9 476 --A- eth1 210.118.23.50:1066 = 0 0 ---- eth1
호출을 받는 측(211.217.77.243)의 1503, 1720 두 포트가 사용되는 것을 보여 준다. 따라서 NAT 게이트웨이에서 이 두 포트를 내부의 사설 IP로 포트 포워딩해야 호출이 전달된다. 그러나 이것 만으로 음성 및 비디오 수신이 되는 게 아니다.
*. 공유기에서 DMZ를 설정하면 음성 및 비디오 송수신이 된다고 하나 DMZ를 설정할 경우에는 한 대만 비디오/음성 송수신이 된다.
Happy Linuxing!
글쓴이 : 배철수 <bae@linuxlab.co.kr>