IP Masquerade

    강상민 (lnx2000@kebi.com)/자유기고가

 

 

이 글은 Linux IP Masquerade HOWTO v1.65를 기준으로 작성되었다. 많은 부분을 원문에서 인용하였지만 원문에는 없는 실제로 필요한 부분들을 첨가하여 만들었다. 의문나는 점이 있으면 다음 웹 페이지를 참고 하기 바란다.

 

IP Masquerade란?

    IP Masquerade는 리눅스에서 지원하는 네트워킹의 한 기능이다. 요즘같이 IP가 고갈되어 가는 시대에 활용가치가 높은 네트워킹 기법이라 할 수 있겠다.
    IP Masquerade란 무엇인가? 예를 들어보자. 당신의 사무실에 4대의 컴퓨터가 LAN으로 연결되어 있고 한 대의 컴퓨터만이 인터넷에 연결되어 있다. 오직 한 대만이 공식 IP 주소를 가지고 있으며 나머지는 할당받은 IP가 없다. 나머지 세 대의 컴퓨터는 공식 IP를 할당받지 못한다면 나머지 컴퓨터들은 인터넷에 접속을 못 하는 것인가? 그렇지 않다. 그 해답이 바로 IP Masquerade이다. 간단히 요점만 설명하면 리눅스 호스트에 IP Masquerade 기능을 설정하면 나머지 세 대의 컴퓨터들은 인터넷의 공식적인 접촉을 IP Masquerade 리눅스 호스트의 공식 IP를 이용한다. 마치 자기가 그 IP를 가지고 있는 양 인터넷에서 모든 활동이 이루어진다.

    공식 IP주소를 가지고 있는 하나의 리눅스 호스트가 PPP 또는 이더넷을 통해 인터넷에 연결되어 있다면, 이 리눅스와 연결되어 있는 다른 컴퓨터도 공식적으로 할당된 IP 주소 없이 인터넷에 접속할 수 있다. 이 기능은 많은 상업적 방화벽 또는 네트워크 라우터에서 지원하지만 리눅스에서는 커널 컴파일 및 몇 가지 설정을 통해 쉽게 구현할 수 있다.
    인터넷에 접속되어 있는 다른 컴퓨터들은 나머지 세 대의 컴퓨터에서 나오는 인터넷 접속이 IP Masquerade가 구현된 리눅스 서버에서만 나오는 것으로 인식한다. IP Masquerade는 이러한 기능을 제공하는 것뿐만 아니라 매우 안전한 네트워크 환경도 제공한다. Masquerade로 구성된 시스템 및 내부 LAN의 보안을 깨트리는 것은, 잘 만들어진 방화벽의 보안을 깨트리는 것만큼 매우 어렵다.

    ♣참고

    Masquerade란 영어사전에서 찾아보면 '가면'이라는 뜻을 가지고 있다. 자신은 실제 192.168.0.2란 내부 네트워크 주소를 가지지만 인터넷에 접속할 때는 IP Masquerade 가 구현된 리눅스 호스트의 공식 IP를 이용해 자신은 그 안에 숨어서 접속한다는 뜻이 포함되어 있다.

 

IP Masquerade의 작동 원리

    다음 그림을 보자.

    위 그림에서 Masquerade가 구현된 Linux #1은 SLIP 또는 PPP를 사용하는 모뎀1을 통해 인터넷에 연결되어 있다. 이 리눅스에는 210.94.74.177이라는 공식적으로 할당된 IP가 있다. 또한 이 리눅스는 모뎀 2를 통해 내부의 다른 컴퓨터와 연결되어 있으며 여기에는 192.168.0.1이라는 내부 IP를 임의로 할당해 놓았다. 한 리눅스 호스트에 공식 IP인 210.9.74.177과 내부 네트워크 주소인 192.168.0.1 2개가 할당되어 있다. 컴퓨터 #1은 모뎀 3을 통해 리눅스 #1에 접속한 뒤 모뎀 1을 이용해 210.94.74.177이라는 IP를 가지고 인터넷에 접속을 하게 된다.

    ♣참고 : 컴퓨터 #1은 리눅스를 게이트웨이로 설정해 놓아야 한다.

    외부에서 보면 컴퓨터 #1에서 나오는 모든 패킷이 오로지 리눅스 #1에서 나오는 것으로 인식한다. 그리고 원하는 자료를 보내줄 때도 리눅스 #1로 보내면 리눅스 #1이 알아서 컴퓨터 #1로 전달해 준다.

    전형적인 예제는 다음 그림과 같다.

    요즘은 고속 인터넷 서비스가 발달되어 있어 IP Masquerade가 빛을 발하고 있다. 위의 그림은 세 대의 컴퓨터가 LAN으로 연결되어 있고 리눅스 호스트에는 두 개의 랜카드에 각각 210.94.74.177이라는 IP와 192.168.0.1이라는 네트워크 주소가 할당되어 있다.

    Masquerade-gate 리눅스 컴퓨터는 인터넷에 연결되기 위한 내부 네트워크 내 모든 컴퓨터(A, B, C 박스)의 IP Masquerade 게이트웨이이다. 내부 네트워크 주소는 이러한 경우에 사용하기 위해 RFC-1918에서 할당한 사적 내부 네트워크 주소를 사용하는데 C 클래스의 경우는 192.168.0.0이다. 리눅스 박스는 192.168.0.1이라는 TCP/IP 주소를 가지고 다른 컴퓨터도 각각 할당받는다.(위의 경우 192.168.0.2-4)

    A, B, C box는 TCP/IP를 사용할 수 있는 모든 운영체제에서 운용 가능하다. Masquerade 시스템은 모든 내부에 연결된 컴퓨터들을 담당하며 그것들이 외부로 나갈 때 자신이 나가는 것처럼 행동한다. 그리고 데이터가 외부에서 들어오면 적절한 곳으로 보내기 위해 준비한다. 이렇게 Masquerade가 알아서 처리해 주므로 내부 네트워크는 인터넷에 직접 연결할 수 있고 그들의 데이터가 Masquerade 되었는지도 모른다. 이것을 ‘투명(transparent) 연결’이라고 한다.

 

이더넷 카드 인식시키기

    자 이제부터 실전에 돌입하자. IP Masquerade가 대강 어떤 것이고 언제 유용한 것인지 개념만 파악하고 하나하나 직접 설정해 보자. 위 그림에서 보면 IP Masquerade가 운용될 리눅스는 두 개의 인터페이스가 설정되어야 한다. 하나는 내부 네트워크와 연결할 인터페이스이고 다른 하나는 인터넷에 연결되어 있는 인터페이스이다. 앞에서도 약간 언급하였지만 PPP로 인터넷에 접속을 하면서 IP Masquerade 기능을 구현하고자 하는 사람은 드물 것이다. 당연한 얘기지만 IP Masquerade 기능을 이용하는 컴퓨터가 많으면 많을수록 리눅스 서버에 걸리는 부하는 이루 말할 수 없다. 따라서 어느 정도 인터넷 접속 환경 면이나 서버 자체의 하드웨어 환경이 확보되어야 하다. 여기서는 두 개의 인터페이스가 모두 Ethernet이라고 가정한다. 하나는 외부 전용선과 연결된 것이고(eth0), 나머지는 내부 네트워크와 연결된 것이다(eth1).
    리눅스에서 2개의 Ethernet을 인식시키는 데는 두가지 방법이 있다. 하나는 커널에 직접 적재시키는 경우이고 또 하나는 모듈로 만들어 필요할 때에만 적재시키는 방법이다. 어느 방법을 택할 것인지는 사용자에게 달렸지만 설정하는 방법은 알아두고 넘어가자.

1. 커널 내부에 이더넷 드라이버를 포함시키는 경우

    우리는 기본적으로 이더넷 카드의 기본주소 및 IRQ를 알고 있어야 한다. 옛날 제품인 경우에는 직접 카드 상에서 설정을 해주어야 하지만 요즘 나오는 제품들은 소프트웨어적으로 설정이 가능하다. 설치 디스켓을 집어 넣고 셋업을 시키는 것만으로 카드의 환경설정을 변경할 수가 있다. 우리는 다음 두 이더넷 카드의 환경설정을 전제로 이야기한다.

    eth0 : io=0x300 irq=10 (외부 접속)
    eth1 : io=0x320 irq=12 (내부 접속)

    커널에 내장시키기 위해서는 커널 컴파일시 커널에 포함이 되어야 한다. 다음 장에 나올 커널 컴파일시 옵션에서 이더넷 카드도 컴파일에 포함시키는 것을 잊지 말자.
    우리는 일반적으로 리눅스를 부팅시키기 위해 LILO를 사용한다. LILO에 단순히 ‘linux’라고 입력하는 것만으로는 두 개의 랜카드를 인식시킬 수 없다. 여기에도 두 가지 방법이 있다.

    첫째로 LILO에 입력하여 인식시키는 방법이다. eth0는 부팅시 인식이 되고 eth1이 인식이 안될 경우에 다음과 같이 입력함으로써 알려준다.

      LILO : linux ether=12,0x320,eth1

    ♣참고 : ether= 다음에 띄어쓰기를 하면 안된다.

    두 번째는 /etc/lilo.conf라는 리로 설정화일에 한줄을 추가해 주다.

      append=”ether=12,0x320,eth1”

    필자는 후자를 권하고 싶다. 매번 부팅시 마다 입력한다는 자체에 무리가 있으며 매번 정확하게 입력한다는 보장도 없지 않는가? 또 두 번째 방법에서 초보자가 많이 하는 실수 가운데 하나인 lilo.conf 파일의 설정 변경후 ‘lilo’를 실행해서 그 변경사항을 통보해주는 것을 잊지 말기를...
    올바르게 설정되었다면 커널 부팅시 다음 사항을 발견할 수 있을 것이다.

    ♣참고 : 혹시 부팅시 확인 못하면 dmesg라는 명령을 이용

      NE*000 ethercard probe at 0x300 : 00 00 c0 05 02 ae
      eth0: NE2000 found at 0x300, using IRQ 10
      NE*000 ethercard probe at 0x320 : 00 00 1c 54 18 1a
      eth1: NE2000 found at 0x320, using IRQ 12

    부팅 후에 각 이더넷 카드별로 네트워크 설정을 잡아주어야 한다.

      ifconfig lo 127.0.0.1
      route add -net 127.0.0.0
      ifconfig eth0 210.94.74.177
      route add -net 210.94.74.0
      ifconfig eth1 192.168.0.1
      route add -net 192.168.0.0
      route add default gw 210.94.74.1

    ‘netstat -rn’ 명령어로 라우팅 테이블을 확인해 본다. 라이팅 테이블에서 기본 게이트웨이 주소가 올바르게 설정되었는지 점검한다.

2. 모듈로 사용하는 경우

    모듈로 사용할 경우에도 위의 경우와 마찬가지로 커널 컴파일시 빠트려서는 안된다. 모듈로 사용하는 경우에는 insmod 또는 modprobe 명령으로 직접 모듈을 적재시키거나, kerneld 데몬을 이용해 이더넷 장치를 사용하고자 할 경우 자동적으로 적재되게 설정해 준다. 수동적으로 설정할 경우 다음과 같이 실행해 준다.

      modprobe ne io=0x320 irq=12
      또는
      insmod ne io=0x320 irq=12

 

IP Masquerade에 필요한 사항들

    이제 이더넷 카드가 2개 다 인식 되면 다음을 준비하자. 순서대로 따라하기만 하면 되니까 겁먹지 말고 차근차근 이해하면서 실습해 보자. 우선 다음 사항을 준비한다.

1. 커널 버전 2.0.x의 경우

2. 커널 버전 2.2.x의 경우

      커널 2.2.x 소스
      적재할 수 있는 커널 모듈 (2.1.121 또는 최신버전)
      운영 중인 TCP/IP 네트워크 또는 LAN
      IP Chains (10308 또는 최신버전
    http://www.rustcorp.com/linux/ipchains)

    여기서 모든게 다 준비된 것은 아니다. 이제 남은 것은 커널 컴파일 및 약간의 설정뿐인데 리눅스에서 커널 컴파일을 못하면 한계를 벗어 날 수가 없다. 다음 장에서는 커널 컴파일에 대한 기본 지식이 있다는 전제하에 진행된다. 자신이 없는 사람은 순서대로 따라하기만 해도 좋지만 자신의 실력 향상을 위해 kernel HOWTO를 다시 한번 읽어보기를...

 

IP Masquerade 셋업하기

    만약 구축하고자 하는 네트워크에 귀중한 정보가 있다면 보안의 측면에서 한번 고려해 봐야 한다. IP Masquerade가 인터넷에 연결시키기 위한 게이트웨이가 되는 동시에, 이 게이트웨이를 통해 인터넷상에 있는 누군가가 우리의 내부 네트워크로 접근이 가능해 진다.
    만약 IP Masquerade 기능을 구축했다면, ipfwadm/ ipchains을 방화벽 도구로 사용하기를 권한다.

1. IP Masquerade 지원을 위한 커널 컴파일

    당신의 리눅스 배포판이 다음과 같이 컴파일을 지원하기 위한 요소를 구비하고 있다면

      IPFWADM/IPCHAINS
      IP forwarding
      IP Masqueradeuerading
      IP Firewalling
      기타 등등...

    그리고 Masquerade관련 모듈들이 모두 컴파일 되었다면 커널을 재 컴파일 시키지 않아도 된다. 그렇지 않으면 아래의 내용에 따라 컴파일을 시켜야 한다.

2. 리눅스 커널 2.0.x

    ♣참고 : 여기서부터 필요한 내용은 Kernel-HOWTO를 참고로 한다. 이 부분은 커널 컴파일보다 IP Masquerade  구현에 목적이 있는 만큼, 커널 컴파일 부분은 필요한 부분만 기술한다.

    우선 컴파일할 커널 소스를 준비한다.(커널 버전 2.0.36 또는 그 이상) 커널 소스를 /usr/src/ 디렉토리에 다음과 같은 명령어로 설치한다.

       tar xvzf linux-2.0.x.tar.gz -C /usr/src

    압축이 모두 풀리면 /usr/src/ 디렉토리에 linux라는 심볼릭 링크된 디렉토리가 존재하는지 확인한다. 존재하면 제대로 링크되어 있는지 확인하고, 없으면 다음 명령어로 만들어 준다.

       ln -s /usr/src/linux-2.0.x /usr/src/linux
      (커널 소스는 /usr/src에 위치시키고 난 후 그 디렉토리에 linux라는 디렉토리가 있으면 지운다. 즉, rm -rf linux, 그리고서 tar zxvf linux-xx.tar.gz 명령을 주면 linux라는 디렉토리가 나오고 이안에 커널 소스가 위치한다.

    커널 컴파일을 실시한다.

       cd /usr/src/linux
       make mrproper
       make menuconfig(또는 xconfig 또는 config)

    다음은 커널 컴파일시 IP Masquerade 구현을 위해 최소한 포함되어야 할 항목들이다. 질문에 Yes와 No를 명확히 표시해 준다.

      Prompt for development and/or incomplete code/drivers
                                                                          [Y/n/?]   YES
      Enable loadable module support                      [Y/n/?]   YES
      Networking support                                        [Y/n/?]   YES
      Network firewalls                                            [Y/n/?]   YES
      TCP/IP networking                                          [Y/n/?]   YES
      IP: forwarding/gatewaying                               [Y/n/?]   YES
      IP: syn cookies                                              [Y/n/?]   YES
      IP: firewalling                                                 [Y/n/?]   YES
      IP: firewall packet logging                               [Y/n/?]   YES
      IP: Masquerading                                           [Y/n/?]   YES
      IP: ipautofw Masquerade support                      [Y/n/?]   NO
      IP: ipportfw Masquerade support
          (EXPERIMENTAL)                                         [Y/n/?]   YES
      IP: ICMP Masquerading                                    [Y/n/?]   YES
      IP: loose UDP port managing (EXPERIMENTAL) [Y/n/?] - YES
      IP: always defragment                                     [Y/n/?]   YES
      IP: optimize as router not host                          [Y/n/?]   YES
      IP: Drop source routed frames                          [Y/n/?]   YES
      Dummy net driver support                                [M/n/y/?]   YES
      /proc filesystem support                                  [Y/n/?]   YES

    사용자는 자신의 컴퓨터 환경에 따라 여러 가지 일반적인 사항들을 추가로 설정해 주어야 한다.(예를 들어 자신의 이더넷 카드 설정 등)

      make dep ; make clean ; make zImage

    커널 컴파일이 완료되면 다음과 같이 명령어를 입력해 IP Masquerade 모듈도 컴파일해 준다.

       make modules ; make modules_install

    커널 컴파일과 모듈 컴파일이 모두 완료되면 /etc/rc.d/rc.local이라는 파일에 다음과 같이 몇 줄을 추가해, 매번 부팅시 마다 자동으로 모듈이 적재되어 IP Masquerade가 실행되게 해 준다. 자신이 IP Masquerade를 필요에 따라 실행할 경우에는 아래 몇 줄을 추가해 줄 필요가 없다.

      ......
      # rc.firewall script - Start IPMasquerade and
      # the firewall
      /etc/rc.d/rc.firewall
      ......

3. Linux 2.2.x Kernels

    리눅스 커널 2.2.x도 위에서 설명한 내용과 동일하다. 우선 앞서 설명한 방법대로 커널을 설치하고 linux라는 심볼릭 링크 파일이 제대로 링크되어 있는지 확인하고 없으면 만들어 준다.

       tar xvzf linux-2.2.x.tar.gz -C /usr/src
       ln -s /usr/src/linux-2.2.x /usr/src/linux

    커널 2.2.x에서도 위에서 설정한 것과 같이 컴파일시 포함되어야할 최소한의 옵션이 있다.

      Prompt for development and/or incomplete
          code/drivers                                                     [Y/n/?]   YES
      Enable loadable module support                            [Y/n/?]   YES
      Networking support                                               [Y/n/?]   YES
      Packet socket                                                      [Y/m/n/?]   YES
      Kernel/User netlink socket                                     [Y/n/?]   YES
      Routing messages                                                [Y/n/?]   NO
      Network firewalls                                                  [Y/n/?]   YES
      TCP/IP networking                                                [Y/n/?]   YES
      IP: advanced router                                               [Y/n/?]   NO
      IP: verbose route monitoring                                  [Y/n/?]   YES
      IP: firewalling                                                        [Y/n/?]   YES
      IP: firewall packet netlink device                             [Y/n/?]   YES
      IP: always defragment (required for Masquerading)   [Y/n/?]   YES
      IP: Masquerading                                                  [Y/n/?]   YES
      IP: ICMP Masquerading                                          [Y/n/?]   YES
      IP: Masquerading special modules support               [Y/n/?]   YES
      IP: ipautofw Masquerade support (EXPERIMENTAL)   [N/y/m/?]   NO
      IP: ipportfw Masquerade support (EXPERIMENTAL)    [Y/m/n/?]   YES
      IP: ip fwmark Masquerade-forwarding support
         (EXPERIMENTAL)                                               [Y/m/n/?]   NO
      IP: optimize as router not host                                [Y/n/?]   YES
      IP: GRE tunnels over IP                                          [N/y/m/?]   NO
      IP: TCP syncookie support (not enabled per default) [Y/n/?]   YES
      IP: Drop source routed frames                                [Y/n/?]   YES
      Network device support                                         [Y/n/?]   YES
      Dummy net driver support                                      [M/n/y/?]   YES
      /proc filesystem support                                        [Y/n/?]   YES

    마찬가지로 커널 컴파일 및 모듈 컴파일을 실행하고 /etc/rc.d/rc.local에 다음을 삽입해 부팅시 마다 자동으로 IP Masquerade 모듈을 적재하고 실행되게 설정해 준다.

       make dep ; make clean ; make bzImage
       make modules; make modules_install
       ......
       # rc.firewall script - Start IPMasquerade
       # and the firewall
       /etc/rc.d/rc.firewall
       ......  

 

사적 네트워크에 IP 주소 할당하기

    내부 내트워크에 존재하는 모든 컴퓨터들은 정식으로 할당된 인터넷 주소가 없기 때문에, 인터넷상에 연결된 다른 컴퓨터와 서로 충돌을 일으키지 않는 특별한 주소를 각 컴퓨터마다 할당해야 한다. RFC 1918에는 이런 경우(인터넷에 연결이 안되어 있거나 개인 네트워크인 경우에 사용)에 사용할 3구역으로 구분된 IP가 명시되어 있다.

    Section 3: Private Address Space
    Internet Assigned Numbers Authority(IANA)는 다음과 같은 세 개의 범위를 사설 네트워크에 할당할 IP 주소로 예약해 두었다.

       10.0.0.0    ∼ 10.255.255.255 A 클래스
       172.16.0.0  ∼ 172.31.255.255 B 클래스
       192.168.0.0 ∼ 192.168.255.255 C 클래스

    만약 C 클래스의 주소를 사용한다면 사용자는 192.168.0.1 ∼ 192.168.0.x 사이의 주소를 각 컴퓨터마다 할당해 준다. 여기서 주의할 점이 있다. 192.168.0.1은 일반적으로 내부 게이트웨이나 또는 외부 네트워크로 나가기 위한 Masquerade가 구현된 리눅스 머신에 할당해 준다. 또한 192.168.0.0은 네트워크 주소이고, 192.168.0.255는 브로드캐스트 주소로 사용되므로 내부 컴퓨터 IP 할당시 제외 해야 한다.

 

IP Forwarding 정책 설정

    모든 네트워크 IP 주소, 게이트웨이 및 DNS 주소를 리눅스 Masquerade 서버에 설정해 주어야 한다. 이제 남은 일은 적절한 머신에 적절한 패킷을 FORWARD와 Masquerade 하기 위해 IP firewalling 도구들을 설정하는 것이다. 여기에는 많은 다른 방법들이 있지만 다음은 원문에서 추천하는 방법이다.

1. Linux 2.0.x Kernels

    다음 사항을 포함하는 /etc/rc.d/rc/firewall 파일을 생성한다.
    (앞의 #를 지워야 그 라인이 실행된다)

      # rc.firewall - IPFWADM을 사용하는 커널 2.0.x를
      # 위한 IP Masquerade 셋업

      # 주의 : 필요한 IP Masquerade 기능만 적재
                  아래에 나열되는 모듈은 IP Masquerade 기능에
                  포함되는 모든 모듈이 나열된 것이다.
                  사용자의 구미에 맞게 수정 사용할 것.

      # 최초 모듈 적재를 위해 사용
      /sbin/depmod -a

      # PORT method를 사용하는 FTP 파일 전송 지원
      /sbin/modprobe ip_Masquerade_ftp

      # RealAudio Masquerading 지원 (UDP)
      # 이 기능 없이는 TCP 모드만 지원 (음질감소)
      #/sbin/modprobe ip_Masquerade_raudio

      # IRC DCC 파일 전송 Masquerading 지원
      #/sbin/modprobe ip_Masquerade_irc

      # Quake and QuakeWorld 지원
      # 이 모듈은 리눅스 Masquerade 서버 뒤에 있는 다중
      # 사용자들을 위한 모듈이다.
      # 다른 서버 포트에 Quake II나 Quake I/II를

      # 사용하려면 두 번째 예제를 사용
      # Quake I / QuakeWorld (ports 26000 and 27000)
      # /sbin/modprobe ip_Masquerade_quake
      #
      # Quake I / QuakeWorld / and Quake II
      # (ports 26000, 27000, 27910)
      # /sbin/modprobe ports=ip_Masquerade_quake \
             26000,27000,27910
      # CuSeeme video conferencing software 지원
      #/sbin/modprobe ip_Masquerade_cuseeme

      # VDO-live video conferencing software 지원
      #/sbin/modprobe ip_Masquerade_vdolive

      # 중요 : 레드햇 사용자는 기본값이 아래와 같이 되어 있으므로 IP forwarding이
                  불가능하다. 따라서 /etc/sysconfig/network 파일에서 다음 사항을 반드시
                  변경해야 한다.
      FORWARD_IPV4=false 를
      FORWARD_IPV4=true 으로
      echo “1” > /proc/sys/net/ipv4/ip_forward

      # Dynamic IP users:
      # 만약 당신의 IP 주소가 SLIP, PPP, DHCP를 통해
      # 동적으로 할당된다면 다음 옵션을 사용 가능하게 하라.
      # echo “1” > /proc/sys/net/ipv4/ip_dynaddr

      # Masquerade 설정 자동 해제
      # TCP 세션에 대해 2시간 후 해제 (컴퓨터 시스템의 사용자가 단말기 앞에 앉아 로그인
         하여 사용을 시작한 다음 작업을 끝마칠 때까지의 동안)
      # TCP/IP “FIN” 패킷을 받은 후 10초 후 해제
      # UDP 트래픽에 대해 60초 후 해제
      /sbin/ipfwadm -M -s 7200 10 60

      # 단순히 IP forwarding과 Masquerading 지원
      # 주의 : 다음 내용은 192.168.0.x를 가지는 내부 LAN 주소에 대한 한 예이다.
      # 자신의 내부 LAN 환경에 맞춰 알맞은 네트워크 주소로 변경할 것
      ipfwadm -F -p deny
      ipfwadm -F -a m -S 192.168.0.0/24 -D 0.0.0.0/0

      # DHCP :  ADSL 또는 케이블 모뎀 사용자들처럼 DHCP 또는 BOOTP를 통해 외부 IP 주소를 받는사람들은 다음 사항을 거절 명령 이전에 사용할 필요가 있다. DHCP/BOOTP 서버가 할당할 주소와연결된 것의 이름은 “bootp_client_net_if_name”로 바뀌어야 한다. 이것은 아마 “eth0”, “eth1” 같은 것이다.
      # ipfwadm -I -a accept -S 0/0 68 -D 0/0 67 -W \
           bootp_clients_net_if_name -P udp

    위 예제 파일은 단순한 보기일 뿐이다. 위 예제를 바탕으로 각 사용자는 자신의 환경 설정에 맞게 수정을 해야 한다. (예를 들어 IP 주소를 바꾼다든지 아니면 주석을 해제한다든지)
    /etc/rc.d/rc.firewall 파일이 외부에 노출될 경우 심각한 보안상의 위험을 초래할 수 있으므로 다음과 같이 접근 권한을 변경해 준다.

      chmod 700 /etc/rc.d/rc.firewall

    참고로 rc.firewall 파일을 위와 같이 전체 네트워크를 대상으로 적용할 수도 있지만 몇 개로 국한지어 사용할 수도 있다. 예를 들어 192.168.0.2와 192.168.0.8 호스트만이 인터넷에 접근할 수 있고 나머지 호스트들은 불허할 경우 다음과 같이 수정한다.

      ipfwadm -F -p deny
      ipfwadm -F -a m -S 192.168.0.0/24 -D 0.0.0.0/0
      부분을

      ipfwadm -F -p deny
      ipfwadm -F -a m -S 192.168.0.2/32 -D 0.0.0.0/0
      ipfwadm -F -a m -S 192.168.0.8/32 -D 0.0.0.0/0
      으로

    ※ 주의 : ‘ipfwadm -F -p Masquerade’를 첫 줄에 쓰지 말라. 그렇게 하면 라우팅 테이블을 조정할 수 있는 누군가가 당신의 게이트 웨이를 뚫고 힘들게 구축해 놓은 IP Masquerade를 자신의 것인양 사용할 수 있다.

2. Linux 2.2.x Kernels

    커널 버전 2.1.x와 2.2.x에서 IPFWADM은 더 이상 IP Masquerade 기능 구현을 위한 방화벽 도구가 아니다. 이제 새 커널들은 IPCHAINS를 사용한다.
    위에서 한 것과 동일하게 여기에서도 /etc/rc.d/ rc.firewall이라는 파일을 생성한다. 거의 동일한 부분이 많지만 방금 말한 것처럼 ipfwam이 ipchains로 바뀌었다.

      #!/bin/sh
      # rc.firewall - IPCHAINS를 사용하는 커널 2.1.x와
      # 2.2.x를 위한 IP Masquerade 셋업

      # 주의 : 필요한 IP Masquerade 기능만 적재
                  아래에 나열되는 모듈은 IP Masquerade 기능에 포함되는 모든 모듈이 나열된
                  것이다. 사용자의 구미에 맞게 수정 사용할 것.

      # 최초 모듈 적재를 위해 사용
      /sbin/depmod -a

      # PORT method를 사용하는 FTP 파일 전송 지원
      /sbin/modprobe ip_Masquerade_ftp

      # RealAudio Masquerading 지원 (UDP)
      # 이 기능 없이는 TCP 모드에서만 지원
      #/sbin/modprobe ip_Masquerade_raudio

      # IRC DCC 파일 전송 Masquerading 지원
      #/sbin/modprobe ip_Masquerade_irc

      # Quake and QuakeWorld 지원
      # 이 모듈은 리눅스 Masquerade 서버 뒤에 있는 다중 사용자들을 위한 모듈이다.
      # 다른 서버 포트에 Quake II나 Quake I/II를 사용하려면 두 번째 예제를 사용
      # Quake I / QuakeWorld (ports 26000 and 27000)
      # /sbin/modprobe ip_Masquerade_quake
      #
      # Quake I / QuakeWorld / and Quake II
      # (ports 26000, 27000, 27910)
      # /sbin/modprobe ports=ip_Masquerade_quake \
           26000,27000,27910

      # CuSeeme video conferencing software 지원
      # /sbin/modprobe ip_Masquerade_cuseeme
      # VDO-live video conferencing software
      # /sbin/modprobe ip_Masquerade_vdolive

      # 중요 : 레드햇 사용자는 기본값이 아래와 같이 되어 있으므로
                   IP forwarding이 불가능하다.
      # 따라서 /etc/sysconfig/network 파일에서 다음 사항을 변경해야 한다.
      # FORWARD_IPV4=false 를
      # FORWARD_IPV4=true 으로
      echo “1” > /proc/sys/net/ipv4/ip_forward

      # Dynamic IP users:
      # 만약 당신의 IP 주소가 SLIP, PPP, DHCP를 통해 동적으로 할당된다면
         다음 옵션을 사용 가능하게 하라.
      # echo “1” > /proc/sys/net/ipv4/ip_dynaddr

      # Masquerade 설정 자동 해제
      # TCP 세션에 대해 2시간 후 해제
      # TCP/IP “FIN” 패킷을 받은 후 10초 후 해제
      # UDP 트래픽에 대해 60초 후 해제
      ipchains -M -s 7200 10 60

      # 단순히 IP forwarding과 Masquerading 지원
      # 주의 : 다음 내용은 192.168.0.x를 가지는 내부 LAN 주소에 대한 한 예이다.             자신의 내부 LAN 환경에 맞춰 알맞은 네트워크 주소로 변경할 것

      ipchains -P forward DENY
      ipchains -A forward -s 192.168.0.0/24 -j Masquerade

      # DHCP :  ADSL 또는 케이블 모뎀 사용자들처럼
      # DHCP 또는 BOOTP를 통해 외부 IP 주소를 받는 사람들은 다음 사항을 거절 명령 이전에 사용할 필요가 있다. DHCP/BOOTP 서버가 할당할 주소와 연결된 것의 이름은
      “bootp_client_net_if_name”로 바뀌어야 한다.
      # 이것은 아마 “eth0”, “eth1” 같은 것이다.
      # ipchains -A input -j ACCEPT -w \
      # bootp_clients_net_if_name -s 0/0 68 -d 0/0 67 \
      # -p udp

    커널 2.1.x 또는 2.2.x.도 마찬가지로 일부분을 수정한 뒤 접근 권한을 변경해 준다.

      chomd 700 /etc/rc.d/rc.firewall

    또 위에서 설명한 것처럼 몇몇 호스트에게만 적용하기 위해서 다음사항으로 수정 사용할 수 있다.

      ipchains -P forward deny
      ipchains -A forward -s 192.168.0.2/32 -j Masquerade
      ipchains -A forward -s 192.168.0.8/32 -j Masquerade

 

Microsoft Windows 95 환경 설정하기

    이제부터 Masquerade가 적재된 리눅스 머신에 연결될 각 컴퓨터를 설정할 차례이다. 여기서는 가장 일반적으로 쓰이는 Windows95를 중심으로 설명한다. 자신의 운영체제가 이에 해당되지 않는 사람은 해당 사이트로 이동해서 설정부분만 확인해 본다.

    ① ‘시작 - 설정 - 제어판’을 실행한다.
    ② ‘네트워크’ 아이콘을 클릭한다.
    ③ ‘설치된 네트워크 구성요소‘에 TCP/IP가 있는지 확인한다.
        (없으면 ‘추가’ - ‘프로토콜’ - ‘추가’ - ‘Microsoft’ - ‘TCP/IP’를 클릭해 추가한다.)
    ④ ‘설치된 네트워크 구성요소‘에 ‘TCP/IP’를 선택하고 ‘등록정보’를 클릭한다.
        ‘IP 주소‘ 탭에서 ‘할당된 IP 주소 사용’을 선택하고 IP 주소에 192.168.0.x(1<x<255),
        서브네트 마스크에 255.255.255.0를 입력한다.
    ⑤ ‘게이트웨이’ 탭을 선택하고 ‘새 게이트웨이’란에 192.168.0.1을 입력한 후에 ‘추가버튼’을
        누른다.
    ⑥ ‘DNS 구성’ 탭을 선택하고 ‘DNS 사용’을 선택한 뒤 ‘호스트 이름’란에 컴퓨터 이름을 입력
        한다. ‘도메인’ 란에 공식 도메인 이름을 쓴다. 만 자체 도메인이 없다면 ISP의 도메인을
        기록한다. 이제 리눅스 호스트가 사용하는(일반적으로 /etc/resolve.conf 파일에서 확인할
        수 있다.) 모든 DNS 서버를 추가한다.
    나머지 사항들은 정확하게 모르면 사용하지 말고 그대로 둔다. ‘확인’을 누른 다음 시스템을 재부팅 한다.
    네트워크 연결을 확인하기 위해 리눅스 박스로 ping을 해본다. ‘시작’-’실행’에서 다음을 입력한다.

      ping 192.168.0.

    이 후 도스 명령창에서 응답을 볼 수 없으면 네트워크 상태를 다시 점검해 본다.
    C:\Windows 디렉토리에 HOSTS라는 파일을 생성할 수도 있는데, 만약 이 파일이 존재한다면 DNS 서버를 거치지 않고 직접 호스트이름으로 ping을 실험해 볼 수도 있다.

    ♣참고 : C:\Windows 디렉토리에 hosts.sam이라는 예제 파일이 들어 있다.

 

IP Masquerade 테스트하기

    여기까지 부지런히 쫓아온 사람들은 결실을 거두게 되었다. 모든 사항을 이해하면서 실습에 임하고 있는 사람은 진정 리눅스 정신 ‘Do it yourself’에 입각한 리눅서라고 볼 수 있다.
    이제 마지막으로 실험을 해 보자. 모든 사항은 준비가 완료되었다. 만약 여기서 올바르게 운용이 안된다면 막히는 부분만 다시 돌아가서 살펴보면 수정할 수 있을 것이다.

    모든 설정을 마친 리눅스가 재부팅이 안되었다면 다시 재부팅을 한번 해줌으로써 여러 가지 설정과 /etc/rc.d/rc.firewall 파일을 실행시켜준다. 다음으로 내부 네트워크가 정상적으로 작동하고 있는지 확인을 해본다. 물론 ping 명령을 사용해서 확인해 보면 된다. 자 이제 모든 것이 준비되었으면 다음 사항을 실행한다.

    ① 리눅스 호스트에서 다른 내부 네트워크에 있는 컴퓨터에 ping을 실시해 TCP/IP가 올바르게 작동중인지 확인해 본다.

        ping 192.168.0.2

    ② 리눅스 호스트 자체에서 Masquerade가 구현된 네트워크로 ping을 실시해본다.

    ♣참고 : 이 글 초반에 우리는 eth1을 내부 네트워크 인터페이스로 설정해 두었다.

        ping 192.168.0.1

    ③ 네트워크에 속한 한 호스트에서 리눅스에게 ping을 해본다. (eth1으로 실시한다)

        ping 192.168.0.1

    ④ 역시 이 호스트에서 리눅스의 공식 IP 주소로 ping을 해본다. (eth0으로 실시한다)

        ping 210.94.74.177

    여기까지에서 에러가 발생한다면 다음 사항을 점검해 본다.

    · ifconfig : 인터넷 연결이 활성화 되어 있고 인터넷 접속을 위해 올바른 IP 주소를 가지고 있는지 확인해 본다.

    · netstat -rn : 기본 게이트웨이가 올바르게 설정되어 있는지 확인해 본다.

    · cat /proc/sys/net/ipv4/ip_forward : 만약 1이라고 값이 나오면 리눅스 forwarding이 올바르게 실행 중이다.

    · /sbin/ipfwadm -F -l(커널 2.0.x 사용자)
       /sbin/ipchains -F -L(커널 2.2.x 사용자)
       MAMSQ가 올바르게 실행 중인지 확인해 본다.

    ⑤ 자 이제까지 내부 점검을 마치고 실제 외부의 세계로 실행해 보자. 리눅스 문서화 프로젝트(LDP)의 홈페이지로 ping을 실행해 보자

       ping 152.19.254.81

    만약 이것까지 올바르게 실행된다면 당신이 구현한 IP Masquerade 기능이 올바르게 작동중이라는 것이다.

    ⑥ 역시 외부로 텔넷을 실행해 본다.

        telnet 152.2.254.81

    만약 로그인 메시지를 확인하면 TCP Masquerading
    이 올바르게 작동 중이다.

    ⑦ 이번에는 텔넷을 호스트이름으로 실행해 본다.

        telnet www.metalab.unc.edu

    만약 이것도 올바르게 작동한다면 DNS가 올바르게 작동 중이다.

    ⑧ 마지막으로 웹 브라우저를 실행시키고 WWW 사이트에 접속할 수 있는지 확인하라. 예를 들어 http://www.metalab.unc.edu에 접속을 해서 홈페이지 화면을 볼 수가 있다면 이제 모든 것이 완료되었다.

    축하한다. 이제 모든 것이 잘 작동된다. WWW 사이트가 올바르게 나타난다면 ping, telnet, ssh와 같은 것들도 모두 올바르게 작동된다.

    여기에는 리눅스를 운용하는데 모든 기본적인 사항이 포함되어 있다. 커널 컴파일에서부터 네트워킹 분야까지. 여기에 나와있는 내용을 충분히 소화해 낸다면 자신은 어느 정도 탄탄한 기본실력은 가지고 있다고 봐도 좋다.




▲ top

home으로...