Personal Computer/misc

IP forwarding

tolkien 2007. 12. 28. 11:05
NAT 를 linux 에서 - Rukikuki?!님의 글

개발중인 단말에서 RealTimeClock이 틀어지는 문제가 발생.
이에 대한 debugging을 하다보니 RTC register를 이용해서 조정해주어야 할 필요를 느낌.
얼마나 조정을 해야 하는지 확인하기 위해서는 ntp나 rdate가 필요.
그럴려면? 단말에서 외부 time server에 접속할 필요가 있슴.
desktop pc에 time server 설정하게 귀찮고 해서 ip forwarding하기로 결정.
간단히 개념 및 사용법 갈무리.

III. NAT에 대한 이해

    iptables를 정확히 사용하려면 iptables에서 정의하는 NAT의 개념을 알아야 한다.

    1. NAT 사용 예

    아래 그림을 기준으로 설명한다. 아래 그림에서 리눅스C에는 두 개의 랜카드가 설치되어 있고 인터넷 쪽의 랜카드(eth0) 에는 공인 IP(고정) 가 부여되어 있다.(211.217.xxx.yyy) 두번째 랜카드에는 내부어드레스(192.168.1.1)가 부여되어 있고 내부 랜(192.168.1.0/24)에 연결되어 있다.

         <그림 1>

      1) 여러 대의 피시에서 한 개의 IP를 공유하여 인터넷을 사용

      adsl 이나 케이블모뎀으로 인터넷을 연결하는 경우 보통은 1개의 IP 주소를 받는다. (여러 개를 받을 수 있는 서비스가 있으나 비용이 많이 든다.) 이때 한 개의 IP주소를 여러 대의 피시에서 공유하여 인터넷을 사용하려 할 경우 NAT가 사용된다.  우리가 IP Masquerade라 불러왔다. 그림 1] 에서 윈도우A, 윈도우B 두 대의 피시에서 리눅스C의 공인 IP(211.217.xxx.yyy)를 공유해서 인터넷을 사용하게 설정하는 경우이다.

      2) 한 개의 IP 주소(도메인네임)에 여러 대의 서버를 연결하는 경우

      부하분산을 위해 한 개의 도메인네임(FQDN)에 대해 여러 대의 서버를 운영하는 경우도 NAT를 사용한다.  즉 www.linuxlab.co.kr 도메인 한 개에 웹서버, 메일서버, FTP 서버를 따로 운영하는 경우이다. 부하평준화(load balance) 기능도 구현이 가능하다. 즉 www.linuxlab.co.kr 도메인에 대한 웹서비스를 여러 대의 서버가 담당하게 하는 경우이다. 2.2에서는 port forwarding이라 불리웠다.

      (커널 2.2에서 port forwarding 사용법은 리눅스 월드 2000년 3월호에 있다.)

      그림 1] 에서 윈도우C에서 bae@www.linuxlab.co.kr로 메일을 보내면 메일은 192.168.1.10 서버로 전달되고 웹을 검색하면(http://www.linuxlab.co.kr) 192.168.1.11 서버가 응답하게 설정하는 것이다.

      3) 투명 프락시

      학원에서 인터넷 강의를 하는 경우는 동일 네트워크에 연결된 여러 대의 피시에서 동시에 같은 사이트를 연결한다. 이 경우 프락시 서버를 설치하면 모든 피시는 우선 프락시 서버에서 방문하려는 사이트의 페이지가 있는지를 확인하고 여기에 없을 경우는 프락시서버에서 해당 사이트를 연결해 페이지를 가져다 피시에게 준다.

      프락시 서버를 사용하려면 피시의 웹브라우저에 프락시서버를 지정해 주어야 한다. 그런데 투명프락시의 경우는 클라이언트 피시의 웹브라우저에 프락시서버를 지정할 필요가 없다.

      리눅스에 투명프락시를 설정하면 리눅스를 통과하는 패킷은 자동으로 리눅스에 설치된 프락시서버 프로그램(예: squid)으로 연결된다.(리눅스를 각 피시의 디폴트게이트로 지정하면 모든 패킷은 리눅스를 통과한다.) 예전에는 리다이렉션이라고 불리웠다.

      그림 1]에서 윈도우A에서 www.debian.org의 페이지를 검색하면 리눅스C에 설치된 프락시서버프로그램(squid)이 www.debian.org를 연결해 대신 데이터를 가져다 윈도우A에 넘겨주는 설정이다. 이 글에서는 투명프락시 설정은 설명하지 않는다. Transparent Proxy with Squid mini-HOWTO를 참고 하라.

    2. iptables에서 NAT 의 분류

    iptables에서는 크게 두 부류의 NAT로 분류한다. 위의 1) 의 경우를 SNAT(Source NAT) 위의 2) , 3)의 경우는 DNAT(Destination NAT) 라 분류한다.

    SNAT는 패킷의 소스 어드레스를 변경한다는 의미이다. 즉 내부 어드레스인 192.168.1.100 윈도우A 에서 www.debian.org 리눅스서버를 연결하면 debian 서버에서 볼 때 패킷의 소스가 192.168.1.100이 아닌 211.217.xxx.yyy로 나타나기 때문이다.

    SNAT는 라우팅(경로) 결정 이후에 이루어진다.(post-routing) 패킷의 목적지 주소는 이미 정해져 있으므로(www.debian.org) 라우팅 경로는 결정되어 있고 패킷의 소스 주소가 리눅스를 떠나기 직전에 변경된다.(192.168.1.100 -> 211.217.xxx.yyy)

    DNAT는 이와는 반대다. 리눅스C에서 패킷의 목적지 주소를 변경한다. 윈도우C에서 bae@www.linuxlab.co.kr 주소로 메일을 보내면 리눅스C에 도착한 패킷의 목적지가 리눅스 B의 주소로 변경된다. 즉 패킷의 목적지 주소가 먼저 변경되고(211.217.xxx.yyy -> 192.168.1.10) 그 변경된 주소에 의거하여 새로운 라우팅 경로가 찾아진다. 즉 DNAT는 라우팅 이전 단계에서 작용한다.(pre-routing)

    post-routing와 pre-routing 은 무척 혼동된다. 즉 내가 왼쪽이라 하면 상대에서 나를 볼 때는 오른쪽이다. 결국 NAT 가 routing 보다 전에 작용하느냐 후냐의 구분으로 보면 된다. (iptables 파라메터 지정에서 이 둘을 혼동하면 에러가 난다.)


IV. IPTABLES 설정

    1. Source NAT 는 아래와 같이 지정한다.(기존의 IP Masquerade를 말함.)

    iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4

    iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4-1.2.3.6
    iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to 1.2.3.4:1-1023

    -t -A 는 위의 글(2)을 읽으면 이해가 되리라고 본다. -o 는 패킷을 보내는 인터페이스 장치이다. SNAT 에서는 패킷을 내 보내는 장치(랜카드)를 지정할 수 있다.  --to 는 나가는 패킷에 부여할  소스 주소이다. IP 공유라면 --to 는 인터넷 쪽의 공인 IP 를 지정하면 된다.(지정 않아도 상관없다.)
     

    주의]

    리눅스에 NAT를 설치하는 경우 리눅스는  게이트웨이로 작용하므로 IP Forwarding이
    필요하다.
    아래 명령을 포함하는 스크립트를 /etc/rc.boot/ 디렉토리에 넣는다.(데비안)

    #!/bin/bash
    echo “IP forwarding setting..”
    echo “1” > /proc/sys/net/ipv4/ip_forward

    IP forwarding 이 활성화되었는지를 확인하려면 아래 명령을 준다.

    churlsu:/etc/rc.boot# cat /proc/sys/net/ipv4/ip_forward
    1

    값이 1이면 활성화(enable) 되어 있다.


    1.1 실제 사용 예

      1) 한국통신 ADSL을 리눅스에 연결해 인터넷을 공유(IP MASQUERADING)하는
          경우의 설정은 아래와 같다.(라이트나 프리미엄처럼 유동 IP를 받는 서비스의
          경우에만 해당한다.)

          iptables  -t  nat  -A  POSTROUTING  -o  ppp0  -j  MASQUERADE

      2) 그림1] 에서 리눅스C의 eth0에 부여된 IP(고정)를 윈도우 A,B에서 공유하여
          인터넷을 사용하게 설정하려면 아래와 같다. 전용선 또는 ADSL My IP, Multi IP
          사용시에 해당한다.

          iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to
          211.217.xxx.yyy

          * -s 192.168.1.0/24는 지정 않아도 된다.

      3) 그림 1] 에서 리눅스 C의 eth0가 케이블모뎀에 연결되어 있다면 아래처럼
          지정한다.(유동 IP)

          iptables  -t  nat  -A  POSTROUTING  -o  eth0  -j  MASQUERADE

    1.2 확인

      - iptables 설정 내용을 확인하려면 아래 명령을 준다.

         iptables -t nat -L

      - 192.168.1.0 네트워크에서 211.217.xxx.yyy 공인 IP를 공유하도록 설정한 경우
         (위의 1.1의 2) 의 출력
       

      Chain PREROUTING (policy ACCEPT)
      target     prot opt source               destination

      Chain POSTROUTING (policy ACCEPT)
      target     prot opt source             destination
      SNAT       all  --  192.168.1.0/24  anywhere       to:211.217.xxx.yyy

      Chain OUTPUT (policy ACCEPT)
      target     prot opt source            destination


    2. DNAT

    DNAT 는 부하분산이나 평준화에만 사용하는게 아니다. 간단한 방화벽으로도 꽤 유용하다. 즉 위의 리눅스C에 DNAT를 설정하여 웹서버와 메일서버를 내부 주소인 리눅스 A와 B에서 서비스 하도록 지정하고 인터넷에서 다른 연결은 리눅스C로 지정하면 리눅스 C가 간단한 방화벽 구실을 담당한다.

    2.1 사용 예

    -  그림1]에서 처럼 윈도우C에서 www.linuxlab.co.kr 의 홈페이지를 검색하려 할 때 이를
        리눅스A에서 담당하게 하려면 아래처럼 설정한다.

        iptables -A PREROUTING -t nat -p tcp  -d 211.217.xxx.yyy  --dport 80 -j DNAT --to  192.168.1.11:80

      1)  -A PREROUTING  : DNAT 는 먼저 목적지 주소를 변경하고(211.217.xxx.yyy를
           192.168.1.11로) 다음에 라우팅이 이루어진다.

      2)  -t nat  : 부하분산도 nat 기능이다.

      3)  -p tcp  : 웹(www)은 tcp 를 사용한다.

      4)  -d 211.217.xxx.yyy  --dport 80 : 들어오는 패킷의 목적지 주소가
           211.217.xxx.yyy 이고 포트번호가 www(80번) 인 경우만 이 규칙을 적용한다.

      5)  -j DNAT : destination Nat

      6)  --to  192.168.1.11:80 : 패킷의 목적지 주소를 192.168.1.11 포트번호를 80번으로
          설정하라는 뜻. 따라서 192.168.1.11 서버에는 80번 포트에서 웹서버 프로그램이
          가동 되야 한다.

    - 메일서버를 리눅스B (192.168.1.10)로 설정하려면 아래처럼 지정한다.

    iptables -A PREROUTING -t nat -p tcp  -d 211.217.xxx.yyy  --dport 25 -j DNAT --to  192.168.1.10:25

    - DNS 서버를 192.168.1.10으로 변경하려면 아래처럼 지정한다.

    iptables -A PREROUTING -t nat -p udp  -d 211.217.xxx.yyy  --dport 53 -j DNAT --to  192.168.1.10:53

    주의]  DNS 는 udp 를 사용한다.