다음 이전 차례

6. IP 와 이더넷 관련 정보

이 부분은 이더넷과 IP 에 관련된 정보를 다룰 것이다. 여기의 소 분류들은 그것들이 소위 ``특정 기술에 대한'' 부분에서 가장 흥미있는 것들이라 생각했기 때문에 나누었다. LAN을 사용하는 사람은 누구나 이 부분들에서 얻을 것이 있을 것이다.

6.1 Ethernet

이더넷 장치의 이름은 `eth0', `eth1', `eth2' 등이다. 커널에 의해 처음 발견되는 카드가 `eth0'을 부여받고 나머지는 발견되는 순서대로 하나씩 부여받는다.

기본적으로 커널은 하나의 이더넷 장치만을 찾으며 다른 장치를 찾기 위해선 직접 특정 명령을 커널에 내려줘야 한다.

리눅스 상에서 이더넷 카드를 작동하도록 하는 법을 알고 싶으면 Ethernet-HOWTO를 참조하라.

커널이 이더넷 카드를 지원하도록 알맞게 만들어진 후에는 카드 설정은 쉽다.

보통 여러분은 아래와 같은 것을 쓴며 대부분의 배포본은 이더넷 카드를 지원하도록 설정을 했다면 이를 이미 해준다.

        root# ifconfig eth0 192.168.0.1 netmask 255.255.255.0 up
        root# route add -net 192.168.0.0 netmask 255.255.255.0 eth0
        

대부분의 이더넷 드라이버들은 Donald Becker, becker@CESDIS.gsfc.nasa.gov에 의해 만들어졌다.

6.2 EQL - multiple line traffic equaliser

EQL 장치 이름은 `eql'이다. 표준 커널 소스로는 머신당 한개의 EQL 장치를 가질 수 있다. EQL은 PPP나 slip, plip같은 point-to-point 다중 연결을 한 개의 논리적인 tcp/ip 연결로 사용할 수 있도록 해준다. 보통은 하나의 고속 연결을 만드는 것보다 저속의 다중 연결을 사용하는 편이 비용이 싸다.

Kernel Compile Options:

        Network device support  --->
            [*] Network device support
            <*> EQL (serial line load balancing) support
        

이 기술을 사용하기 위해선 연결의 반대편에 있는 머신도 EQL을 지원해야 한다. 리눅스와 Livingstone Portmasters, 새로운 dial-in 서버들은 호환 가능한 기능을 지원한다.

EQL을 설정하기 위해선 metalab.unc.edu 에서 얻을 수 있는 eql 툴들이 필요할 것이다.

설정은 매우 직설적이다. eql 인터페이스의 설정으로 시작한다. eql 인터페이스는 다른 네트웍 장치들과 비슷하다. ifconfig를 이용하여 IP 주소와 mtu를 설정하며 아래와 같다.

        root# ifconfig eql 192.168.10.1 mtu 1006
        

그다음 여러분이 사용할 각 줄들을 직접 시작할 필요가 있다. 이는 point-to-point 네트웍 장치의 경우와 마찬가지이다. 연결을 시작하는 방법은 연결의 종류에 따라 다르며 자세한 사항은 문서의 해당 부분을 참조하여라.

마지막으로 serial 연결을 EQL 장치와 연결시켜야 한다. 이는 `enslaving'이라 불리며 아래와 같은 eql_enslave 명령으로 수행된다.

        root# eql_enslave eql sl0 28800
        root# eql_enslave eql ppp0 14400
        

eql_enslave에 넘겨주는 `estimated speed' 매개변수는 직접은 아무 것도 하지 않는다. 이는 EQL 드라이버가 장치가 받을 데이타그램의 할당을 결정하며 이 값을 가지고 연결들의 밸런스를 조정할 수 있다.

연결을 EQL 장치로부터 떼어내기 위해선 아래처럼 eql_emancipate 명령을 쓴다.

        root# eql_emancipate eql sl0
        

다른 point-to-point 연결처럼 라우팅을 추가해주는데 실제 직렬 장치 대신 eql 장치를 라우터가 참조하는 것이 다르다. 보통 아래처럼 쓴다.

        root# route add default eql
        

EQL 드라이버는 Simon Jones, simon@ncm.com 에 의해 개발되었다.

6.3 IP Accounting (for Linux-2.0)

리눅스 커널의 IP accounting 기능은 네트웍을 사용하는 자료들을 모아서 분석할 수 있도록 해준다. 모아진 자료들은 초기화 이후 누적된 패킷과 바이트의 수들로 이루어진다. 사용 목적에 따라 이들을 분류할 수 있는 다양한 규칙들을 사용할 수 있다. 이 옵션은 이전의 ipfwadm 기반의 방화벽 기능이 ``ipfwchains''로 대체되면서 커널 2.1.102때부터 빠졌다.

Kernel Compile Options:

        Networking options  --->
            [*] IP: accounting
        

IP accounting을 설정하기 위해선 커널을 컴파일하여 설치한 후 ipfwadm 명령을 사용해야 한다. 선택한 accounting 정보를 자세히 분류하는 많은 방법들이 있다. 여기에선 유용하게 사용할 수 있는 간단한 예제를 골랐으며 더 자세한 정보를 위해선 ipfwadm 맨 페이지를 읽어보길 바란다.

시나리오: 여러분은 PPP 연결을 통해 인터넷에 연결된 이더넷 네트웍을 가지고 있다. 이더넷 상에서 많은 서비스를 하는 머신을 가지고 있으며 전체적인 tcp, udp 트래픽 뿐 아니라 ftp나 www 등의 각 서비스에 의한 트래픽도 알고 싶다.

여러분은 아래의 쉘 스크립트 처럼 보이는 명령들을 사용해야 한다.

        #!/bin/sh
        #
        # Flush the accounting rules
        ipfwadm -A -f
        #
        # Set shortcuts
        localnet=44.136.8.96/29
        any=0/0
        # Add rules for local ethernet segment
        ipfwadm -A in  -a -P tcp -D $localnet ftp-data
        ipfwadm -A out -a -P tcp -S $localnet ftp-data
        ipfwadm -A in  -a -P tcp -D $localnet www
        ipfwadm -A out -a -P tcp -S $localnet www
        ipfwadm -A in  -a -P tcp -D $localnet
        ipfwadm -A out -a -P tcp -S $localnet
        ipfwadm -A in  -a -P udp -D $localnet
        ipfwadm -A out -a -P udp -S $localnet
        #
        # Rules for default
        ipfwadm -A in  -a -P tcp -D $any ftp-data
        ipfwadm -A out -a -P tcp -S $any ftp-data
        ipfwadm -A in  -a -P tcp -D $any www
        ipfwadm -A out -a -P tcp -S $any www
        ipfwadm -A in  -a -P tcp -D $any
        ipfwadm -A out -a -P tcp -S $any
        ipfwadm -A in  -a -P udp -D $any
        ipfwadm -A out -a -P udp -S $any
        #
        # List the rules
        ipfwadm -A -l -n
        #
        

``ftp-data''와 ``www' 같은 이름들은 /etc/services 안의 줄들을 가리킨다. 마지막 명령은 각 Accounting 규칙들과 모아진 결과를 출력한다.

IP accounting을 분석할 때 주의해야 할 것은 적용되는 모든 규칙의 결과가 합해진다는 것이다. 따라서 원하는 값을 얻기 위해선 적절한 산술 연산이 필요하다. 예를 들어 ftp도 www도 아닌 자료의 양을 알길 원한다면 각 결과들을 모든 포트에 적용되는 결과에서 뺄 것이다.

root# ipfwadm -A -l -n
IP accounting rules
 pkts bytes dir prot source               destination          ports
    0     0 in  tcp  0.0.0.0/0            44.136.8.96/29       * -> 20
    0     0 out tcp  44.136.8.96/29       0.0.0.0/0            20 -> *
   10  1166 in  tcp  0.0.0.0/0            44.136.8.96/29       * -> 80
   10   572 out tcp  44.136.8.96/29       0.0.0.0/0            80 -> *
  252 10943 in  tcp  0.0.0.0/0            44.136.8.96/29       * -> *
  231 18831 out tcp  44.136.8.96/29       0.0.0.0/0             * -> *
    0     0 in  udp  0.0.0.0/0            44.136.8.96/29       * -> *
    0     0 out udp  44.136.8.96/29       0.0.0.0/0            * -> *
    0     0 in  tcp  0.0.0.0/0            0.0.0.0/0            * -> 20
    0     0 out tcp  0.0.0.0/0            0.0.0.0/0            20 -> *
   10  1166 in  tcp  0.0.0.0/0            0.0.0.0/0            * -> 80
   10   572 out tcp  0.0.0.0/0            0.0.0.0/0            80 -> *
  253 10983 in  tcp  0.0.0.0/0            0.0.0.0/0            * -> *
  231 18831 out tcp  0.0.0.0/0            0.0.0.0/0            * -> *
    0     0 in  udp  0.0.0.0/0            0.0.0.0/0            * -> *
    0     0 out udp  0.0.0.0/0            0.0.0.0/0            * -> *

6.4 IP Accounting (for Linux-2.2)

새 accounting 코드는 ``IP Firewall Chains''를 통해 구현된다. IP chains 홈페이지를 보면 더 많은 정보를 얻을 수 있다. 무엇보다도 여러분의 필터를 설정하기 위해선 ipfwadm 대신에 ipchains를 사용하게 될 것이다. (최신 커널 소스의 Documentation/Changes로부터)

6.5 IP Aliasing

한 네트웍 장치에 둘 이상의 IP 주소를 부여할 수 있는 프로그램들이 있으며 이는 꽤 유용하다. ISP (Internet Service Provider)들은 종종 사용자들에게 특화된 World Wide Web과 ftp를 제공하기 위해 이 기능을 사용한다. 여러분은 여기에 나온 것보다 더 많은 정보를 ``IP-Alias mini-HOWTO''에서 얻을 수 있다.

Kernel Compile Options:

        Networking options  --->
            ....
            [*] Network aliasing
            ....
            <*> IP: aliasing support
        

커널을 IP_Alias 지원과 함께 컴파일해서 설치한 다음엔 설정은 매우 간단하다. alias들은 실제 네트웍 장치와 연관된 가상의 네트웍 장치들에 추가된다. 이 장치들에는 단순한 명명법이 쓰이는데 <devname>:<virtual dev num> 과 같은 식으로 예를 들어 eth0:0, ppp0:10 등이다. 이 ifname:number 장치는 주 인터페이스가 설정된 후에만 설정될 수 있다는 것을 명심해라.

예를 들어 여러분이 두 개의 서로 다른 IP 서브네트웍을 동시에 지원하는 이더넷 네트웍을 가지고 있고 여러분의 머신이 양 쪽을 모두 직접 접근할 수 있도록 하고 싶다면 다음과 같이 해주면 된다.

        root# ifconfig eth0 192.168.1.1 netmask 255.255.255.0 up
        root# route add -net 192.168.1.0 netmask 255.255.255.0 eth0

        root# ifconfig eth0:0 192.168.10.1 netmask 255.255.255.0 up
        root# route add -net 192.168.10.0 netmask 255.255.255.0 eth0:0
        

alias를 지우기 위해선 단순히 이름 뒤에 `-'를 붙여주면 된다.

        root# ifconfig eth0:0- 0
        

alias에 관련된 모든 route 정보들도 자동으로 지워질 것이다.

6.6 IP Firewall (for Linux-2.0)

IP Firewall과 방화벽 문제는 Firewall-HOWTO에서 좀 더 깊게 다뤄질 것이다. IP Firewalling은 여러분이 지정한 IP 주소로 가는 혹은 그 주소에서 오는 데이타그램들을 걸러내거나 통과시킴으로써 허가되지 않은 네트웍 접근으로부터 여러분의 머신을 보호할 수 있도록 해준다. 세 개의 다른 규칙 등급이 적용되는데 incoming filtering과 outgoing filtering, forwarding filtering이다. Incoming rule은 네트웍 장치가 받아들이는 데이타그램에 적용되며 Outgoing rule은 네트웍 장치를 통해 나가는 데이타그램에, Forwarding rule은 받아들여지긴 하나 이 머신으로 오지 않은, 다시말해 이 머신을 거쳐 다른 곳으로 가는 데이타그램에 적용된다.

Kernel Compile Options:

        Networking options  --->
            [*] Network firewalls
            ....
            [*] IP: forwarding/gatewaying
            ....
            [*] IP: firewalling
            [ ] IP: firewall packet logging
        

IP firewall 규칙들의 설정은 ipfwadm 명령을 사용하여 이루어진다. 앞에서 언급한 것처럼 나는 보안 전문가가 아니며 따라서 보안이 여러분에게 중요한 문제라면 내가 간단한 예제를 보여주는 것과는 별도로 여러분 스스로 규칙들을 공부하고 개발해야 한다.

IP firewall을 쓰는 대부분의 경우는 아마도 리눅스 머신을 라우터나 방화벽의 게이트웨이(gateway)로 사용하여 여러분의 로칼 네트웍을 외부의 허가되지 않은 접근으로부터 보호하고자 하는 경우일 것이다.

아래의 설정은 Arnt Gulbrandsen, <agulbra@troll.no>의 도움에 기반하고 있다.

아래의 예제는 밑의 그림에 나온 것처럼 리눅스 firewall/router 머신 위에 방화벽을 설정했을 경우이다.

-                                   -
 \                                  | 172.16.37.0
  \                                 |   /255.255.255.0
   \                 ---------      |
    |  172.16.174.30 | Linux |      |
NET =================|  f/w  |------|    ..37.19
    |    PPP         | router|      |  --------
   /                 ---------      |--| Mail |
  /                                 |  | /DNS |
 /                                  |  --------
-                                   -

아래 명령들은 보통 rc 파일 안에 들어가서 시스템이 부팅될 때마다 자동으로 시작되도록 되어있다. 보안을 최대로 하기 위해선 인터페이스가 설정된 후에, 그러나 방화벽 머신이 리부팅되는 동안 누군가 접근 권한을 얻는 것을 막기 위해 인터페이스가 실제로 작동되기 이전에 아래 명령들이 실행되야 한다.

        #!/bin/sh

        # Flush the 'Forwarding' rules table
        # Change the default policy to 'accept'
        #
        /sbin/ipfwadm -F -f
        /sbin/ipfwadm -F -p accept
        #
        # .. and for 'Incoming'
        #
        /sbin/ipfwadm -I -f
        /sbin/ipfwadm -I -p accept

        # First off, seal off the PPP interface
        # I'd love to use '-a deny' instead of '-a reject -y' but then it
        # would be impossible to originate connections on that interface too.
        # The -o causes all rejected datagrams to be logged. This trades
        # disk space against knowledge of an attack of configuration error.
        #
        /sbin/ipfwadm -I -a reject -y -o -P tcp -S 0/0 -D 172.16.174.30

        # Throw away certain kinds of obviously forged packets right away:
        # Nothing should come from multicast/anycast/broadcast addresses
        #
        /sbin/ipfwadm -F -a deny -o -S 224.0/3 -D 172.16.37.0/24
        #
        # and nothing coming from the loopback network should ever be
        # seen on a wire
        #
        /sbin/ipfwadm -F -a deny -o -S 127.0/8 -D 172.16.37.0/24
        
        # accept incoming SMTP and DNS connections, but only
        # to the Mail/Name Server
        #
        /sbin/ipfwadm -F -a accept -P tcp -S 0/0 -D 172.16.37.19 25 53
        #
        # DNS uses UDP as well as TCP, so allow that too
        # for questions to our name server
        #
        /sbin/ipfwadm -F -a accept -P udp -S 0/0 -D 172.16.37.19 53
        #
        # but not "answers" coming to dangerous ports like NFS and
        # Larry McVoy's NFS extension.  If you run squid, add its port here.
        #
        /sbin/ipfwadm -F -a deny -o -P udp -S 0/0 53 \
                -D 172.16.37.0/24 2049 2050
        
        # answers to other user ports are okay
        #
        /sbin/ipfwadm -F -a accept -P udp -S 0/0 53 \
                -D 172.16.37.0/24 53 1024:65535
        
        # Reject incoming connections to identd
        # We use 'reject' here so that the connecting host is told
        # straight away not to bother continuing, otherwise we'd experience
        # delays while ident timed out.
        #
        /sbin/ipfwadm -F -a reject -o -P tcp -S 0/0 -D 172.16.37.0/24 113

        # Accept some common service connections from the 192.168.64 and
        # 192.168.65 networks, they are friends that we trust.
        #
        /sbin/ipfwadm -F -a accept -P tcp -S 192.168.64.0/23 \
                -D 172.16.37.0/24 20:23
        
        # accept and pass through anything originating inside
        #
        /sbin/ipfwadm -F -a accept -P tcp -S 172.16.37.0/24 -D 0/0
        
        # deny most other incoming TCP connections and log them
        # (append 1:1023 if you have problems with ftp not working)
        #
        /sbin/ipfwadm -F -a deny -o -y -P tcp -S 0/0 -D 172.16.37.0/24
        
        # ... for UDP too
        #
        /sbin/ipfwadm -F -a deny -o -P udp -S 0/0 -D 172.16.37.0/24
        

좋은 방화벽 설정은 복잡하다. 이 예제는 여러분에게 어느 정도의 시작점만을 보여준다. ipfwadm 메뉴얼 페이지가 이 툴을 사용하는 데에 도움이 될 것이다. 방화벽을 설정하고자 한다면 믿을만한 곳에 물어보고 많은 충고를 받아라. 또한 외부에서 여러분의 설정을 검사하도록 해라.

6.7 IP Firewall (for Linux-2.2)

새로운 방화벽 코드가 ``IP Firewall Chains''를 통해 구현된다. 더 많은 정보를 위해선 IP chains 홈페이지를 보라. 지금 여러분의 필터를 설정하기 위해선 ipfwadm 대신 ipchains를 사용해야 한다는 것을 알아야 한다. (최신 커널의 Documentation/Changes 참조)

우리도 이 내용이 최신과 거리가 멀다는 것을 알고 있으며 좀 더 최신 내용을 다루기 위해 현재 작업중이다. 아마 1999년 8월의 새 버젼에선 다뤄질 것이다. (역자주: 현재 번역중인 이 문서가 1999년 8월 버젼이다-_-;)

6.8 IPIP Encapsulation

왜 여러분은 IP 데이타그램 내에 IP 데이타그램을 집어넣기를 원하나? 이런 방식을 이전에 본 적이 없다면 이상한 것으로 보일 것이다. Mobile-IP와 IP-Multicast가 이 방식이 사용되는 흔한 예이다. 또한 잘 알려져 있진 않지만 이 방식을 제일 많이 쓰는 곳은 Amateur Radio이다.

Kernel Compile Options:

        Networking options  --->
            [*] TCP/IP networking
            [*] IP: forwarding/gatewaying
            ....
            <*> IP: tunneling
        

IP tunnel 장치는 `tunl0', `tunl1' 등으로 불린다.

일반적인 IP 라우팅 규칙은 IP 네트웍이 네트웍 주소와 네트웍 마스크로 이루어져 있도록 요구한다. 이는 한 라우팅 엔트리를 통해 일련의 연속된 주소들이 모두 라우팅되도록 해준다. 이는 매우 편리하지만 여러분이 네트웍의 특정 부분에 연결되어 있는 동안 특정 IP 주소만을 사용해야 한다는 것을 의미한다. 대부분의 경우 문제가 없으나 여러분의 mobile netizen이라면 계속 한 장소에 접속되어 있을 순 없을 것이다. IP/IP encapsulation (IP tunneling)은 여러분의 IP 주소로 오도록 되어 있는 데이타그램이 한 번 더 쌓여져서 다른 IP 주소로 돌려지도록 하므로써 제한을 극복할 수 있게 해준다. 만약 여러분이 다른 IP 네트웍에서 작업을 할 예정이라면 원래 네트웍의 머신이 여러분의 IP 주소로 오는 데이타그램을 받아서 임시로 현재 사용하는 주소로 돌려주도록 설정할 수 있다.

A tunneled network configuration.

 192.168.1/24                          192.168.2/24

     -                                     -
     |      ppp0 =            ppp0 =       |
     |  aaa.bbb.ccc.ddd  fff.ggg.hhh.iii   |
     |                                     |
     |   /-----\                 /-----\   |
     |   |     |       //        |     |   |
     |---|  A  |------//---------|  B  |---|
     |   |     |     //          |     |   |
     |   \-----/                 \-----/   |
     |                                     |
     -                                     -

이 그림은 IPIP encapsulation을 쓰는 다른 마땅한 이유, 가상 개별 네트워킹을 나타낸다. 이 예제는 여러분이 기본적인 다이얼업 인터넷 연결을 가진 두 머신을 가지고 있다고 가정한다. 각 호스트는 한 개의 IP 주소를 부여받았다. 이 머신들 뒤에는 예약된 IP 네트웍 주소로 설정된 로칼 네트웍이 존재한다. 네트웍 라우터로 인터넷에 연결되는 것처럼 A 네트웍에 있는 호스트들이 B 네트웍 위의 호스트들에 접속할 수 있도록 하길 원한다고 해보자. IPIP encapsulation이 이를 가능하게 해준다. 주의할 것은 encapsulation이 A와 B 네트웍 상의 호스트들이 인터넷 상에서 서로 통신할 수 있도록 하는 문제를 해결하는 것이 아니며 여전히 이를 위해선 IP Masquerade 같은 기법을 사용해야 한다는 것이다. encapsulation은 보통 라우터로써의 머신 기능에 의해 구현된다.

리눅스 라우터 `A'는 아래와 같은 스크립트로 설정될 것이다.

        #!/bin/sh
        PATH=/sbin:/usr/sbin
        mask=255.255.255.0
        remotegw=fff.ggg.hhh.iii
        #
        # Ethernet configuration
        ifconfig eth0 192.168.1.1 netmask $mask up
        route add -net 192.168.1.0 netmask $mask eth0
        #
        # ppp0 configuration (start ppp link, set default route)
        pppd
        route add default ppp0
        #
        # Tunnel device configuration
        ifconfig tunl0 192.168.1.1 up
        route add -net 192.168.2.0 netmask $mask gw $remotegw tunl0
        

리눅스 라우터 `B'는 아래와 같은 스크립트로 설정될 것이다.

        #!/bin/sh
        PATH=/sbin:/usr/sbin
        mask=255.255.255.0
        remotegw=aaa.bbb.ccc.ddd
        #
        # Ethernet configuration
        ifconfig eth0 192.168.2.1 netmask $mask up
        route add -net 192.168.2.0 netmask $mask eth0
        #
        # ppp0 configuration (start ppp link, set default route)
        pppd
        route add default ppp0
        #
        # Tunnel device configuration
        ifconfig tunl0 192.168.2.1 up
        route add -net 192.168.1.0 netmask $mask gw $remotegw tunl0
        

명령:

        route add -net 192.168.1.0 netmask $mask gw $remotegw tunl0
        

이는 `192.168.1.0/24로 향하는 데이타그램들을 IPIP 캡슐화 데이타그램 속에 넣어서 aaa.bbb.ccc.ddd'의 주소로 보낸다'는 것을 뜻한다.

설정은 양 측에서 일치해야 한다. tunnel 장치는 라우팅시에 자신이 라우팅하도록 받은 데이타그램을 집어넣을 IP 데이타그램의 목적지로 `gw'를 사용한다. 그 머신 역시 IPIP 데이타그램을 decapsulate하는 법을 알아야 하며 다시말해 tunnel 장치가 설정되어 있어야 한다.

A tunneled host configuration.

라우팅 하는 것이 전체 네트웍일 필욘 없으며 단 하나의 IP 주소만을 라우팅할 수 있다. 이럴 경우 `원격' 머신의 tunl 장치는 머신의 IP 주소로 성절해야 하며 A 쪽에선 tunnel 장치를 통한 네트웍 라우팅 보다는 호스트 라우팅(그리고 Proxy Arp)를 사용해야 한다. 이에 맞도록 설정을 조정해서 알맞게 다시 그려보자. 이제 우리는 완전히 인터넷에 연결되어 있고 호스트 `A'에 의해 지원되는 원격 네트웍의 일부인 것처럼 작동하려는 호스트 `B'를 가지고 있다.

 192.168.1/24

     -
     |      ppp0 =                ppp0 =
     |  aaa.bbb.ccc.ddd      fff.ggg.hhh.iii
     |
     |   /-----\                 /-----\
     |   |     |       //        |     |
     |---|  A  |------//---------|  B  |
     |   |     |     //          |     |
     |   \-----/                 \-----/
     |                      also: 192.168.1.12
     -

리눅스 라우터 `A'는 다음과 같이 설정된다.

        #!/bin/sh
        PATH=/sbin:/usr/sbin
        mask=255.255.255.0
        remotegw=fff.ggg.hhh.iii
        #
        # Ethernet configuration
        ifconfig eth0 192.168.1.1 netmask $mask up
        route add -net 192.168.1.0 netmask $mask eth0
        #
        # ppp0 configuration (start ppp link, set default route)
        pppd
        route add default ppp0
        #
        # Tunnel device configuration
        ifconfig tunl0 192.168.1.1 up
        route add -host 192.168.1.12 gw $remotegw tunl0
        #
        # Proxy ARP for the remote host
        arp -s 192.168.1.12 xx:xx:xx:xx:xx:xx pub
        

리눅스 호스트 `B'는 다음과 같이 설정된다.

        #!/bin/sh
        PATH=/sbin:/usr/sbin
        mask=255.255.255.0
        remotegw=aaa.bbb.ccc.ddd 
        #
        # ppp0 configuration (start ppp link, set default route)
        pppd
        route add default ppp0
        #
        # Tunnel device configuration
        ifconfig tunl0 192.168.1.12 up
        route add -net 192.168.1.0 netmask $mask gw $remotegwtunl0
        

이런 종류의 설정은 Mobile-IP 분야에서 더욱 전형적이다. 이 분야에서는 하나의 호스트가 인터넷 내부를 돌아다니면서도 내내 하나의 IP 주소를 사용하고자 한다. 실제로 이를 다루는 것에 대한 더 많은 정보를 원한다면 Mobile-IP 부분을 참고하라.

6.9 IP Masquerade

많은 사람들은 인터넷에 접속하기 위해 단순한 다이얼업 계정을 가지고 있을 뿐이다. 이런 종류의 설정을 쓰는 거의 모든 사람들은 ISP (Internet Service Provider) 로부터 단지 하나의 IP 주소만을 할당받는다. 이는 단 하나의 호스트가 네트웍에 접속할 경운 일반적으로 충분하다. IP Masquerade는 여러 호스트들이 다이얼업 연결을 하는 머신처럼 보이도록 하므로써 한 IP 주소를 여러 머신들이 쓸 수 있도록 하는 일종의 트릭이다. (역자주: masquerade는 가장 무도회, 가장하다. 의 뜻이다.) 한 작은 제한점은 masquerade 기능을 한 방향으로만 작동한다는 것이다. 다시 말해 이 기능을 사용하는 호스트는 접속을 하도록 요청을 할 수는 있지만 원격 호스트로부터의 접속을 받아들이지는 못한다는 것이다. talk같은 일부 네트웍 서비스는 작동하지 않으며 ftp같은 서비스들은 수동 (PASV) 모드로 작동하도록 설정되어야 한다는 것을 의미한다. 운이 좋게도 WWW나 irc, telnet 같은 대부분의 네트웍 서비스는 잘 작동한다.

Kernel Compile Options:

        Code maturity level options  --->
            [*] Prompt for development and/or incomplete code/drivers
        Networking options  --->
            [*] Network firewalls
            ....
            [*] TCP/IP networking
            [*] IP: forwarding/gatewaying
            ....
            [*] IP: masquerading (EXPERIMENTAL)
        

보통 여러분은 리눅스 머신에 단독(standalone) 머신일 때처럼 slip이나 ppp 연결을 지원하도록 만든다. 이에 추가로 예약된 네트웍 주소로 설정이 된 이더넷 같은 또 다른 네트웍 장치를 가지고 있을 것이다. masquerade 될 호스트들은 이 두 번째 네트웍 상에 존재한다. 각각의 이 호스트들은 위 리눅스 머신의 이더넷 포트 주소를 기본 gateway나 라우터로 설정한다.

전형적인 설정은 아래처럼 보인다.

-                                   -
 \                                  | 192.168.1.0
  \                                 |   /255.255.255.0
   \                 ---------      |
    |                | Linux | .1.1 |
NET =================| masq  |------|
    |    PPP/slip    | router|      |  --------
   /                 ---------      |--| host |
  /                                 |  |      |
 /                                  |  --------
-                                   -

IPFWADM을 이용한 Masquerading

이 설정에 가장 적절한 명령은 아래와 같다.

        # Network route for ethernet
        route add -net 192.168.1.0 netmask 255.255.255.0 eth0
        #
        # Default route to the rest of the internet.
        route add default ppp0
        #
        # Cause all hosts on the 192.168.1/24 network to be masqueraded.
        ipfwadm -F -a m -S 192.168.1.0/24 -D 0.0.0.0/0 
        

IPCHAINS을 이용한 Masquerading

IPFWADM을 쓰는 경우와 비슷하나 명령 구조가 바뀌었다.

        # Network route for ethernet
        route add -net 192.168.1.0 netmask 255.255.255.0 eth0
        #
        # Default route to the rest of the internet.
        route add default ppp0
        #
        # Cause all hosts on the 192.168.1/24 network to be masqueraded.
        ipchains -A forward -s 192.168.1.0/24 -j MASQ
        

여러분은 IP Masquerade Resource Page로부터 Linux IP Masquerade에 대한 더 많은 정보를 얻을 수 있다. 또한 masquerading에 대한 매우 자세한 문서로 ``IP-Masquerade mini-HOWTO''가 있다(여기에는 다른 OS들을 Linux masquerade 서버와 함께 작동하도록 설정하는 법도 나와있다).

6.10 IP Transparent Proxy

ip transparent proxy는 다른 머신을 향하는 서비스나 서버를 이 머신의 그 서비스들로 돌릴 수 있도록 해주는 기능이다. 일반적으로 이 기능은 리눅스 머신을 라우터로 쓰는 동시에 proxy 서버로 쓰는 곳에서 유용하다. 여러분은 각 서비스들로 오는 모든 연결들을 로칼 proxy 서버로 돌릴 수 있다.

Kernel Compile Options:

        Code maturity level options  --->
                [*] Prompt for development and/or incomplete code/drivers
        Networking options  --->
                [*] Network firewalls
                ....
                [*] TCP/IP networking
                ....
                [*] IP: firewalling
                ....
                [*] IP: transparent proxy support (EXPERIMENTAL)
        

transparent proxy 특징의 설정은 ipfwadm 명령을 사용해서 한다.

쓸만한 예가 아래에 있다.

        root# ipfwadm -I -a accept -D 0/0 telnet -r 2323
        

이 예는 어떤 호스트의 telnet 포트(23)에 들어오는 연결들을 모두 이 호스트의 2323 포트로 돌려준다. 만약 그 포트에서 서비스를 돌리고 있다면 이를 telnet 연결로 돌리거나 log를 남기거나 혹은 원하는 무엇이든 할 수 있다.

더욱 흥미있는 예는 모든 http 연결들을 local cache를 통하도록 돌리는 것이다. 그러나 proxy 서버가 사용하는 protocol은 보통의 http와는 다르다. 클라이언트가 http를 이용할 경운 www.server.com:80에 연결되어 /path/page를 요청하지만 local cache에 연결될 때는 proxy.local.domain:8080에 접속해서 www.server.com/path/page를 요청한다.

http 요청을 local proxy를 통해 걸러내기 위해선 transproxy라는 작은 서버를 삽입해서 그 프로토콜을 받아들일 필요가 있다 (이는 웹에서 쉽게 구할 수 있다). 이 transproxy를 8081 포트에서 돌도록 결정한 다음 아래 명령을 내린다.

        root# ipfwadm -I -a accept -D 0/0 80 -r 8081
        

그러면 transproxy 프로그램은 외부 서버로 가는 모든 연결을 받은 후 프로토콜간의 상이점을 보정한 후 local proxy로 그 연결들을 보낼 것이다.

6.11 IPv6

여러분이 막 IP 네트워킹을 이해하기 시작하는 순간 규칙이 변형되었다. IPv6는 Internet Protocol의 version 6에 대한 줄임말이다. IPv6는 할당할 IP 주소의 부족 문제를 극복하기 위해 개발되었다. IPv6 주소는 16바이트(128비트)를 사용한다. IPv6는 많은 다른 수정 사항들을 포함하는데 그 중엔 IPv4 네트웍 보다 IPv6 네트웍을 다루기 쉽도록 하는 단순화도 있다.

리눅스는 이미 완전하지는 않지만 작동은 하는 IPv6를 2.2.* 버젼의 커널들에서 구현해 놨다.

여러분이 이 새로운 인터넷 기술을 경험해 보고 싶거나 필요하다면 www.terra.net에서 구할 수 있는 IPv6-FAQ를 읽어보라.

6.12 Mobile IP

"IP mobility"라는 말은 한 호스트가 IP 주소의 변화나 연결 중단 없이 인터넷의 한 지점에서 다른 지점으로 연결을 이동시킬 수 있는 능력을 말한다. 일반적으로 IP 호스트가 연결 지점을 바꾸는 경우 IP 주소도 바꿔야만 한다. IP Mobility는 mobile 호스트에 고정 IP 주소를 할당하고 이 주소로 오는 데이타그램들을 실제 사용되는 IP 주소로 돌리는 자동 라우팅과 함께 IP encapsulation (tunneling)을 사용하여 이 문제를 극복한다.

리눅스에서 완전한 IP mobility 도구를 제공하기 위한 프로젝트가 진행중이다. 이 프로젝트와 도구들의 상태는 Linux Mobile IP Home Page에서 볼 수 있다.

6.13 Multicast

IP Multicast는 다른 IP 네트웍 상의 많은 IP 호스트들이 그들에게 동시에 보내지는 IP 데이타그램을 받도록 해준다. 이 기술은 오디오와 비디오 전송 등의 인터넷을 통한 방송을 위해 개발되었다.

Kernel Compile Options:

Networking options  --->
        [*] TCP/IP networking
        ....
        [*] IP: multicasting

약간의 도구와 작은 네트웍 설정이 필요하다. 리눅스 상에서의 Multicast 지원에 대한 추가 정보는 Multicast-HOWTO를 보라.

6.14 NAT - Network Address Translation

IP Network Address Translation 기능은 리눅스 IP Masquerade 기능의 훨씬 표준화된 기술이다. RFC-1631에 보다 자세히 기술되어 있다. NAT는 IP-Masquerade가 지원하지 못하는 기능들을 제공하며 이는 NAT가 방화벽이 있는 라우터나 보다 큰 규모의 환경에 더 적합하도록 해준다.

Linux 2.0.29 커널에 대한 NAT 구현의 알파 버젼이 Michael.Hasenstein, Michael.Hasenstein@informatik.tu-chemnitz.de에 의해 개발되어 왔다. Michael의 문서와 구현은 Linux IP Network Address Web Page 에서 구할 수 있다.

새로운 Linux 2.2.x 커널들은 몇몇 NAT의 기능을 라우팅 알고리즘에 포함하고 있다.

6.15 Traffic Shaper - 변환 가능한 대역폭

traffic shaper는 새 인터페이스 장치를 만드는 드라이버이다. 그 장치들은 사용자의 정의에 따라 트래픽이 제한될 수 있고 실제 전송에 있어선 실제의 네트웍 장치에 의존하면서 네트웍 트래픽을 밖으로 내보내는 장치로 쓰일 수 있다.

shaper는 Linux-2.1.15에서 소개되었고 Linux-2.0.36으로 거꾸로 적용되었다 (shaper 장치의 제작자이며 Linux-2.0를 관리하는 Alan Cox가 배포한 2.0.36-pre-patch-2에 포함되어 있다).

traffic shaper는 모듈로만 컴파일될 수 있으며 shapecfg 프로그램으로 아래와 같은 방식으로 설정된다.

        shapecfg attach shaper0 eth1
        shapecfg speed shaper0 64000
        

shaper 장치는 패킷들이 라우팅 테이블에 따라 shaper를 통과하는 경우에 밖으로 나가는 트래픽의 대역폭만을 조절할 수 있다. 따라서 ``출발지 주소에 의한 라우팅'' 기능은 리눅스 라우터를 사용하는 특정 호스트들의 전반적인 대역폭을 제한하는 데 도움을 준다.

Linux-2.2는 이미 그런 라우팅을 지원하며 Linux-2.0에서 이 기능이 필요하다면 ftp.invlogic.com에서 Mike McLagan이 만든 패치를 점검해 보라. shaper에 대한 더 많은 정보는 Documentationnetworking/shaper.txt에서 얻을 수 있다.

들어오는 패킷에 대한 shaping을 시험해 보고 싶다면 ftp.systemy.it로부터 새 버젼인 rshaper-1.01를 시도해 볼 수 있다.

6.16 Linux-2.2에서의 라우팅

Linux의 최신 버젼인 2.2는 라우팅 정책에 있어 많은 유연성을 제공한다. 불행히도 여러분은 이 하우투 문서의 다음 버젼을 기다리거나 커널 소스를 읽으러 가야한다.


다음 이전 차례