H.323 (NetMeeting) IP masquerade 모듈 설치

필자 : 배철수 / 리눅스월드 발행인

 

     

    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를 참고 하기 바란다.

 

1. 지나가는 말

    얼마 전에 필자가 리눅스랩의 리눅스 서버에 H.323(Netmeeting) 디렉터리 서버(directory server)를 설치했다. (주소는 ils.linuxlab.co.kr 이다.) 리눅스 월드 독자들이 정기구독이나 기타 문의가 있을 때 Netmeeting을 사용해서 리눅스랩에 통화함으로써 전화비를 절약하게 하기 위해서 였다.

    요즘 대부분의 독자들이 ADSL이나 케이블모뎀을 사용하므로 전화를 사용하지 않고 H.323(NetMeeting)을 사용해서 연결하면 음성전화뿐 아니라 문자 및 칠판 기능으로도 의사 전달이 가능하므로 경제적이면서 정확한 커뮤니케이션이 가능해서 이다.

    H.323(Netmeeting) 디렉터리 서버가 무엇인지 궁금해 하는 사람을 위해 디렉터리 서버에 대해 설명한다. 보다 자세한 사항을 알려면 http://www.linuxlab.co.kr/netmeeting.htm 을 참고 하기 바란다.

    Netmeeting 디렉터리 서버란 NetMeeting을 사용하는 사람들이 모여서 대화할 상대방을 찾는 장소이다. 하이텔의 대화방과 같은 곳이다. NetMeeting 프로그램에서는 상대의 주소(IP Address)를 알면 직접 연결이 가능하나 ADSL이나 케이블모뎀처럼 유동 IP를 사용하는 경우는 상대의 주소가 수시로 변경되므로 상대를 직접 연결하려면 그때마다 상대에게 변경된 IP주소를 물어 보아야 하는 불편함이 있다.

    비록 상대가 고정 IP를 사용한다 해도 상대가 지금 호출을 받을 준비가 되어 있는지를 알 수 없다. 즉 상대가 피시를 켜서 Netmeeting 프로그램을 가동해서 호출을 받을 준비가 되어 있는지도 알 수 없다. 이 경우에 디렉터리 서버를 사용하면 상대가 지금 호출을 받을 준비가 돼 있는지를 알 수 있다. 디렉터리 서버에 연결이 가능한 상대의 이름, 전자우편주소 등이 표시되기 때문이다. 물론 여기에 나오는 이름, 전자우편 주소는 Netmeeting 사용자가 마음대로 지정할 수 있으므로 익명성은 보장된다.

    그 외에도 디렉터리 서버를 사용하면 여러 가지 주제를 정해 놓고 여러 명이 동시에 토론이나 대화를 진행할 수도 있다.

    잠시 주제가 다른 곳으로 흘러갔는데 필자가 설치한 디렉터리 서버를 테스트하기 위해 리눅스랩 사무실 옆의 컴퓨터 학원 윈도우 PC에서 필자의 사무실 윈도우 PC로 Netmeeting 연결을 시도했는데 에러가 났다. 이유는 간단했다. 그 학원의 윈도우 피시는 모두 사설 IP를 사용하고 있기 때문이었다. 공인 IP 한 개를 리눅스에서 NAT(IP masq)를 사용해 내부 랜의 모든 윈도우 피시에서 공유하고 있기 때문이었다. 그 리눅스 서버는 필자가 설치했었다.

    IP 공유를 구현하는 방법은 여러 가지가 있다. 윈도우98로도 가능하고 IP 공유기도 나와 있다. 그러나 리눅스 NAT 게이트웨이가 다른 어느 방법보다 거의 대부분의 인터넷 기능을 제한없이 사용할 수 있다고 주위의 모든 사람들에게 이야기하곤 했는데 리눅스 NAT 게이트웨이 내부 랜에서 외부의 다른 윈도우 PC와 Netmeeting을 연결할 수 없다는 건 리눅스 체면 문제가 아닌가?

    그래서 이를 해결하려고 리눅스 뉴스그룹에서 검색을 시작했다. (필자가 어떤 문제를 해결할 때 가장 먼저 시작하는 단계이다.) comp.os.linux.networking에 이미 이에 관한 글이 많이 올라와 있었다. 그 동안은 필자가 Netmeeting에 대해 관심이 없어서 지나쳤던 것이다. 이 글을 쓰는 데 필요한 자료나 사이트는 모두 이 뉴스 그룹에서 발견했다.

    필자가 확인해 보지는 않았으나 윈98이나 공유기를 사용하는 내부 랜에서는 외부 인터넷 사용자와의  Netmeeting 연결 문제를 해결하지 못하고 있으리라고 확신한다.(어떤 IP 공유 기법을 사용하든 내부 랜의 윈도우 사이에서는 물론 Netmeeting 연결이 가능하다.)

 

2. Netmeeting(h.323) 이란

    Netmeeting 프로그램은 인터넷을 이용하는 화상회의(전화) 프로그램이다. 피시에 마이크와 스피커(또는 헤드셋)만 있으면 NetMeeting을 사용할 수 있다. 카메라는 없어도 된다.(마이크는 카메라에 있는 경우가 많다.) NetMeeting에는 키보드로 대화하는 기능도 있으며 화면에 그림을 그려 보여 줄 수도 있다(white board). 리눅스용 NetMeeting 프로그램은 openH323이라 불리는데 윈도우 Netmeeting 프로그램과 비슷한 기능을 갖고 있다. OpenH323 프로그램 홈페이지는 http://www.openh323.org 이다.

     

3. 참고 사이트/ 자료

    - http://www.coritel.it/coritel/ip/sofia/nat/nat2/ nat2.htm

    Netmeeting용 ip masq 커널 모듈 개발 홈페이지다. 필히 방문하기 바란다.

            <그림 1>

    - 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이 사용하는 포트 및 방화벽 내에서의 사용에 대한 자료가 있다.

 

4. 제약/ 사전지식

    이 글의 내용은 리눅스 커널 2.2를 사용하는 경우에만 해당된다. 2.4에는 적용되지 않는다. 배포본은 무관하다.
    이 글은 데비안 2.2를 사용하는 시스템에서 테스트했다. 다른 배포본의 경우에는 일부 설정 파일의 위치가 약간 다를 뿐이므로 이 글을 참고해서 설정하는게 어렵지 않을 것이다.

    게이트웨이에 Netmeeting 모듈을 추가하려면 커널을 컴파일해서 변경해야 한다. 그러나 이 글에서는 커널 컴파일에 대한 기본 절차 외의 다른 부분은 설명하지 않는다. 범위가 너무 넓기 때문이다. 자세한 사항은 2000년 12월호의 커널 컴파일 글을 참고 하기 바란다.

    커널을 컴파일하지 않고 컴파일된 커널과 모듈을 다운 받아서 사용이 가능하다고 하나 여기서는 설명하지 않는다. 이 방법은 사용자의 환경에 따라서는 작동하지 않을 수도 있기 때문이다. 이 방법을 사용하려면 <그림 1>의 사이트를 참고 하기 바란다.

    또 NAT 게이트웨이와 방화벽은 그 개념이 다르다. 따라서 리눅스를 NAT 게이트웨이가 아닌 방화벽으로만 사용한다면 이 글은 해당되지 않는다.

 

5. 리눅스 게이트웨이의 환경

    이 글에서 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를 사용할 경우도 마찬가지다. 이에 대한 사항도 다른 글을 참고 하기 바란다.

 

6. 작업 순서

    Netmeeting 사용을 위해서는 ip masq 모듈을 올리는 점에서는 기존의 real audio나 ftp 모듈을 올리는 것과 같다. 단지 이 모듈은 아직 2.2 커널 소스에 들어 있지 않으므로 2.2 커널을 패치해서 모듈을 만들어야 하는 것이 다르다. 커널은 두 군데를 패치하는데 ip_masq_h323.o 란 커널 모듈을 만들어 주기 위한 패치와 또 port forwarding 설정(인터넷에서 내부랜의 netmeeting 을 호출하는 경우)도 필요하다.

     

    6.1  Netmeeting 모듈 만들기

    1) ip_masq_h323.c 소스 파일 받기

       http://www.coritel.it/coritel/ip/sofia/nat/nat2/nat2.htm 에서 받을 수 있다.

    2) 모듈 생성 절차

       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)

     

    6.2  IP Masquerade 에서 ip_masq_h323 모듈 적재 순서

    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 모듈을 적재한다. 여러 개의 모듈이 필요하다. 아래와 같다.

            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 인 사람이 필자이다.(그런데 필자도 현재는 윈도우 netmeeting 을 사용한다. 리눅스용 h.323 프로그램을 아직 설치하지 못했다.)

     

7. 포트 포워딩(port forwarding) 설정

    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);


    이 추가된 부분이다.(185번 라인 부근)

     

    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 서버를 많이 이용하기 바란다.




▲ top

home으로...