커널 2.4에서 NAT
(network address translation) 구현 (2)

- 투명 프락시 설정 -

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

 

     

    3월호의 NAT  기사중 투명 프락시 설정에 대한 내용이 빠져 있어 추가한다. 투명프락시는 내부 랜의 윈도우 웹 브라우저에서 프락시 서버 지정을 않아도 강제로 프락시를 사용하게 하는 설정이다. 프락시를 설정하는 경우의 이점은 캐시를 사용하게 하므로 윈도우에서 인터넷 접속속도를 빨리할 수 있다는 점이다.

     

VI. 투명 프락시 구성

     

    1. 커널 설정

    ◇ Networking support
    ◇ Sysctl support
    ◇ Network packet filtering
    ◇ TCP/IP networking
    ◇ Connection tracking (Under ``IP : Netfilter Configuration'' in menuconfig)
    ◇ IP tables support
    ◇ Full NAT
    ◇ REDIRECT target support
    ◇ /proc filesystem support

     

    2. squid 설치

    2.1  컴파일

      1) ./configure --prefix=/usr/local/squid
      2) make
      3) make install

    2.2  /usr/local/squid/etc/squid.conf 수정

      1) ttpd_accel_host virtual
      2) httpd_accel_port 80
      3) httpd_accel_with_proxy on
      4) httpd_accel_uses_host_header on

          #Default configuration:
          http_access allow manager localhost
          http_access deny manager
          http_access deny !Safe_ports
          http_access deny CONNECT !SSL_ports
          http_access deny all

      5) http_access allow all

    2.3  uid nobody 확인

    2.4  gid nogroup 확인

    2.5  /usr/local/squid/cache 디렉토리를 만들고서

      - 디렉토리 소유자 nobody,
        그룹 nogroup, 모드는 2755

      drwxr-sr-x   18 nobody   nogroup      
      4096 Mar   2 11:17 cache

    2.6  squid -z 명령으로 캐시 디렉토리를 초기화한다.
          아래 메시지가 나온다.

      2001/03/02 03:43:53| Creating Swap Directories

      * 만약 아래 메시지가 나오면 디렉토리 소유자나 허가모드가 잘못 되었다.
       

      2001/03/02 03:29:39| Creating Swap Directories
      FATAL: Failed to make swap directory /usr/local/squid/cache: (13) Permission denied
      Squid Cache (Version 2.3.STABLE4): Terminated abnormally.
      CPU Usage: 0.000 seconds = 0.000 user + 0.000 sys
      Maximum Resident Size: 0 KB
      Page faults with physical i/o: 8

     

    2.7  /usr/local/squid/logs 디렉토리를 만들고
          소유자, 허가모드를 위의 cache 디렉토리처럼 준다.

      drwxr-sr-x    2 nobody   nogroup      
      4096 Mar  2 04:16 logs

    2.8  /usr/local/squid/bin/ 에서  RunCache를 실행한다.

      /usr/local/squid/bin/RunCache/usr/local/squid/etc/squid.conf

    2.9  실행 확인

      1) 정상적으로 실행되면 ps ax 명령을 주면 아래 라인이 나온다.

      147 ?   S  0:08 squid -NsY -f /usr/local/squid/etc/squid.conf

      2) /usr/local/squid/squid.out 에 아래 라인이 나온다.

      Startup: Fri Mar  2 11:17:27 KST 2001

      * 아래 에러가 나면 logs 디렉토리를 체크

      Running: squid -sY -f /usr/local/squid/etc/squid.conf >> /usr/local/squid/squid.out 2>&1 : 5회
      RunCache: EXITING DUE TO REPEATED, FREQUENT FAILURES

      정상적으로 실행이 안되면 /usr/local/squid/squid.out 파일에 에러 내용이 기록된다.

    2.10  부팅시 자동실행

      squid는 부팅시 자동으로 실행되야 하므로 데비안의 경우 /etc/rc.boot 디렉토리에(레드햇은 rc.local에) 아래 내용이 들어 가는 스크립트를 만든다. (모드를 755로 해야 한다.)

      dongcom:/etc/rc.boot# cat 20Squid
      #!/bin/bash
      /usr/local/squid/bin/RunCache/usr/local/squid/etc/squid.conf > /dev/null &

      (20Squid는 파일 이름이다.)

       

    3. iptables 설정

    3.1 설정 예

      예를 들어 리눅스 서버의 인터넷 쪽에 연결된 랜카드의 인터페이스 명이 eth0이고 IP 주소가 192.168.1.9, 내부랜은 네트워크 주소가 192.168.2.0 이고 리눅스의 eth1 랜카드에 연결되어 있다면(eth1의 주소는 192.168.2.1) 투명 프락시 설정 명령은 다음과 같다.

      /usr/local/sbin/iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 \
      -j REDIRECT --to-port 3128

      각각의 옵션을 자세히 설명하면

      1) -t nat : 투명 프락시도 패킷의 내용을 변경하는 설정이므로 nat 이다.

      2) -A PREROUTING : 투명 푸락시는 패킷의 내용을 변경하는 작업이 경로를 찾는
          것 보다 우선한다.
          (즉 라우팅보다 우선한다 : pre routing)

      3) -i eth1 : 변경할 패킷이 들어오는 장치를 지정한다. 내부 랜(192.168.2.0)이 eth1에
          연결되어 있고 이 랜에 연결된 다른 윈도우 피시에서 리눅스를 통해 인터넷을
          사용하므로 들어오는 패킷의 장치명은 eth1이다.

      4) -p tcp : 들어오는 패킷 중 tcp 프로토콜만 nat를 적용한다는 뜻이다.
          www (80) 연결은 tcp를 사용한다.

      5) --dport 80 : 들어오는 패킷의 목적지 포트가 80번(www) 인 경우에만 nat를
          적용한다는 뜻이다. 따라서 ftp 나 telnet 는 적용을 안 받는다.

      6) -j REDIRECT : 투명 프락시는 리눅스 내부에서 패킷의 입력 포트 번호를 변경해
          주는 방법이다.

      7) --to-port 3128 : 들어오는 패킷의 목적지 포트 번호를 3128번으로 변경한다는
          뜻이다. 목적지의 IP 주소는 지정하지 않았으므로 모든 인터넷 웹 검색에 대해
          투명프락시가 적용된다.

      3128번 포트는 squid 가 디폴트로 사용하는 포트 번호이다.

      squid.conf 에 아래 내용이 있다.
      (별도로 지정하지 않아도 이 번호를 사용한다.)

      http_port 3128

      이 명령을 설명하면 아래와 같다.

      eth1(내부랜)을 통해 들어오는 패킷 중 프로토콜이 tcp이고 목적지 포트 번호가 80번인 경우는(목적지 주소는 불문) 패킷을 리눅스의 3128번 포트로 넘겨주라는 뜻이다. 그러면 3128번 포트를 감시하고 있는 squid가 대신 패킷의 인터넷의 목적지 주소 사이트를 연결해 해당 페이지를 찾아 원래의 주소로 넘겨준다. 물론 이 과정에서 캐시에 들어 있는지를 먼저 확인한다.(캐시 사용 여부는 squid 설정에 달려 있다. iptables에는 이를 지정하지 않는다.)

      결국 내부 랜의 윈도우 피시에서 프락시 설정을 지정하지 않았는데도 패킷의 경로가 3128번으로 변경되어 강제로 프락시서버(squid)를 사용하게 된 것이다. 즉 윈도우의 웹브라우저에 http proxy 서버의 주소를 192.168.2.1(위의 경우) 포트번호를 3128로 지정한 것과 같은 결과가 나온다. (리눅스에 투명 프락시를 설정하고서 윈도우에서 이렇게 프락시 서버 설정을 해도 문제없다. 단지 불필요한 작업을 한 것뿐이다.)

    3.2 확인

      dongcom:~# iptables -t nat -L
      Chain PREROUTING (policy ACCEPT)
      target   prot opt source        destination
      REDIRECT   tcp  --  anywhere       anywhere      tcp dpt:www redir ports 3128

    3.3 다른 예

      투명 프락시가 설치된 리눅스 서버에 웹서버를 설치해도 상관없다. 그런데 192.168.2.X 네트워크에서 자신의 웹서버 데이터를 접근할 때도 프락시 서버를 경유한다는 것은 아무런 의미가 없다. 웹서버에서 읽을 때는 홈페이지 디렉토리에서 찾고 프락시 서버에서 찾을 때는 프락시서버의 캐시 디렉토리에서 찾는 차이밖에 없다.

      자신의 홈페이지 데이터를 내부 랜에서 수시로 변경하는 경우는 오히려 프락시서버 캐시 디렉토리에서 찾으면 문제가 된다. 캐시가 지워지지 않는 한 변경된 홈페이지 데이터를 볼 수 없기 때문이다. 그래서 내부 랜(192.168.2.X)의 윈도우에서 192.168.2.1 리눅스서버의 변경된 홈페이지 데이터를 즉시 확인해야 한다면 http://192.168.2.1 명령시에는 투명 프락시가 작용하지 않아야 한다. 아래 방법을 사용하면 된다.

      /usr/local/sbin/iptables -t nat -A PREROUTING -i eth1 -p tcp -d ! \
      192.168.2.1 --dport 80 -j REDIRECT --to-port 3128

      * 위의 기본 설정에 -d ! 192.168.2.1 을 추가했다.( ! 과 192.168.2.1 사이에 공백
         필요) 즉 들어오는 패킷의 목적지 주소(검색 사이트)가 192.168.2.1 이면
         투명 프락시를 적용하지 말란 뜻이다.

    3.4 설정 해제

      기존에 설정된 투명 프락시를 해제하려면 아래 명령을 준다. 단 iptables 명령만 해제될 뿐이며 squid 는 계속해서 동작한다. (squid 가 작동해도 iptables에서 포트 방향 변경을 않으면 투명 프락시는 작동하지 않는다.)

       iptables -t nat -F

       

    4.  www 외의 인터넷 연결에 대한 nat 설정

    주의할 것은 투명프락시는 오직 http 즉 www(80) 검색만 해당되고 (port 가 80인 패킷) telnet 이나 ftp 는 적용되지 않으므로 내부랜에서 인터넷의 다른 호스트에 telnet 및 ftp 를 사용하려면 추가로 SNAT를 설정해 주어야 한다. 아래 명령이 필요하다.

    #!/bin/bash
    /usr/local/sbin/iptables -t nat -A POSTROUTING -s 192.168.2.0/24 \
    -o eth0 -j SNAT --to 192.168.1.9

      1) -A POSTROUTING : SNAT 는 라우팅 보다 나중에 행해진다.

      2) -s 192.168.2.0/24 : 192.168.2.0 네트워크 로부터의 패킷에만 SNAT를 적용한다.

      3) -o eth0 : 패킷이 나가는 장치를 지정한다. (eth0가 인터넷에 연결돼 있다.)

      4) -j SNAT : Source NAT 를 말함. 소스 주소(192.168.2.x)를 변경한다는 뜻.

      5) --to 192.168.1.9 : 소스 주소를 192.168.1.9 로 변경하라는 뜻.

    확인 : 이상과 같이 설정했다면 iptables -t nat -L 명령을 주면 아래처럼 나온다.

    Chain POSTROUTING (policy ACCEPT)
    target     prot opt source         destination
    SNAT       all  --  192.168.2.0/24       anywhere           to:192.168.1.9

     

    5. 마지막으로

    네트워크에 대한 지식이 있다면 군더더기에 불과하지만 투명프락시가 작용하려면 인터넷 쪽으로 나가는 패킷이 투명 프락시가 설정되어 있는 리눅스를 통과해야 한다. 통과하지 않는 패킷에 대해서는 포트의 방향을 변경할 방법이 없다. 따라서 투명 프락시를 사용하는 모든 내부 컴퓨터의 디폴트 게이트웨이는 리눅스에 부여된 내부 IP 주소여야 한다.




▲ top

home으로...