오래전 이야기/Squid

Delay Pool 설정

리눅스 엔지니어였던 2008. 12. 6. 17:16

3.1. 지연풀 특징을 갖는 스퀴드 설치하기

앞에 언급했듯이 스퀴드는 다운로드 대역폭을 제어할 수 있도록 하는 지연풀이라는 특징을 갖고 있다. 그러나 불행히도 대부분의 배포판에서 스퀴드는 이 특징없이 설치된다.

그래서 스퀴드가 이미 설치되어 있다면 이를 설치제거한 후 밑에 설명된 방식으로 지연풀 기능이 작동하도록 다시 설치해야 한다.

  1. 스퀴드 프록시에서 최대 성능을 얻기 위해서는 /cache/ 라는 캐시 전용 파티션을 생성하는 것이 가장 좋은데 그 크기는 필요에 따라 대략 300 MB 정도여야 한다.

    독립된 파티션 생성 방법을 모른다면 주 파티션에 /cache/ 디렉토리를 생성할 수 있지만 스퀴드 성능은 약간 저하될 수 있다.

  2. 안전한 'squid' 사용자를 추가한다:

    # useradd -d /cache/ -r -s /dev/null squid >/dev/null 2>&1

    루트를 포함해 어느 누구도 squid 로 로그인할 수 없다.

  3. 스퀴드 소스를 http://www.squid-cache.org 에서 다운로드받는다.

    이 하우투 문서 작성할 때의 최신 버전은 Squid 2.4 stable 1 이었다:

    http://www.squid-cache.org/Versions/v2/2.4/squid-2.4.STABLE1-src.tar.gz

  4. /var/tmp 디렉토리에 압축을 푼다:

  5. # tar xzpf squid-2.4.STABLE1-src.tar.gz

  6. 스퀴드 컴파일 (모든 옵션은 동일 라인) 및 설치를 한다:

    # ./configure --prefix=/opt/squid --exec-prefix=/opt/squid --enable-delay-pools --enable-cache-digests --enable-poll --disable-ident-lookups --enable-truncate --enable-removal-policies

    # make all

    # make install

3.2. 지연풀 특징을 사용할 수 있도록 스퀴드 설정하기

  1. squid.conf 파일을 설정해라 (/opt/squid/etc/ 디렉토리 (또는 다른 디렉토리) 에 위치할 수 있다):

    #squid.conf 
    #이 파일의 각 옵션은 원본 squid.conf 파일 및
    #http://www.visolve.com/squidman/Configuration%20Guide.html 에
    #상세히 설명되어 있다

    #
    #스퀴드가 요청을 듣는 포트
    http_port 8080
    icp_port 3130
    #cgi-bins 은 캐시되지 않을 것이다
    acl QUERY urlpath_regex cgi-bin \?
    no_cache deny QUERY
    #스퀴드가 사용할 메모리. 그렇지만 스퀴드는 이 이상을 사용할 것이다
    cache_mem 16 MB
    #250 은 스퀴드가 디스크 공간 중 250 MB 사용할 것임을 의미한다
    cache_dir ufs /cache 250 16 256
    redirect_rewrites_host_header off
    cache_replacement_policy GDSF
    acl localnet src 192.168.1.0/255.255.255.0
    acl localhost src 127.0.0.1/255.255.255.255
    acl Safe_ports port 80 443 210 119 70 20 21 1025-65535
    acl CONNECT method CONNECT
    acl all src 0.0.0.0/0.0.0.0
    http_access allow localnet
    http_access allow localhost
    http_access deny !Safe_ports
    http_access deny CONNECT
    http_access deny all
    maximum_object_size 3000 KB
    store_avg_object_size 50 KB

    #랜 사용자들은 모두 리눅스에서 Mozilla 를 사용하는 것처럼 외부 서버들에 보여질 것이다
    anonymize_headers deny User-Agent
    fake_user_agent Mozilla/5.0 (X11; U; Linux 2.4.4 i686)

    #연결을 더욱 더 빠르게 하기 위해 밑의 라인과 비슷한 라인을 놓는다.
    #가장 가까이 있는 서버를 변경하는 것을 잊지 마라.
    #ping, traceroute 등을 비교 평가해라
    #cache_peer w3cache.icm.edu.pl parent 8080 3130 no-digest default

    #이는 캐시 관리자를 사용하길 원할 때 유용하다
    #cachemgr.cgi 를 www 서버의 cgi-bin 디렉토리로 복사해라
    cache_mgr your@email
    cachemgr_passwd secret_password all

    #스퀴드는 다음의 사용자 이름으로 작동한다
    cache_effective_user squid
    cache_effective_group squid

    log_icp_queries off
    buffered_logs on


    #####DELAY POOLS
    #이는 스퀴드를 이용해 들어오는 트래픽을 결정하는 가장 중요한 부분이다
    #세부적인 설명은 squid.conf 파일 또는 http://www.squid-cache.org 의 문서들을 보라

    #로컬 네트워크에서 다운로드를 제한하길 원하지 않는다
    acl magic_words1 url_regex -i 192.168

    #다음 유형 파일들의 다운로드를 제한하길 원한다
    #한 라인에 모두 열거한다
    acl magic_words2 url_regex -i ftp .exe .mp3 .vqf .tar.gz .gz .rpm .zip .rar .avi .mpeg .mpe .mpg .qt .ram .rm .iso .raw .wav
    #.html, .gif, .jpg 와 유사한 파일들은 일반적으로 대역폭을 많이 소비하지 않기 때문에
    #다운로드에 제한을 두지 않는다

    #2개의 다른 지연풀을 갖는다
    delay_pools 2

    #첫번째 지연풀
    #로컬 트래픽을 지연하길 원하지 않는다
    #3가지 풀 클래스가 있다; 여기서는 단지 두번째 클래스만 다룰 것이다
    delay_class 1 2

    #-1/-1 은 제한이 없음을 의미한다
    delay_parameters 1 -1/-1 -1/-1

    #magic_words1: 192.168
    delay_access 1 allow magic_words1

    #두번째 지연풀
    #magic_words2 에 언급된 파일들의 다운로드를 제한하길 원한다
    delay_class 2 2

    #숫자들은 바이트 단위인데 스퀴드가 시작/중지 비트를 고려하지 않음을 유념해야 한다
    #5000/150000 은 전체 네트워크에 대한 값들이다
    #5000/120000 단일 IP 대한 값들이다
    #다운로드된 파일들이 150000 바이트를 초과 (두배 또는 세배 이상이라도) 한 후에는
    #대략 5000 bytes/s 속도로 계속해서 다운로드할 것이다

    delay_parameters 2 5000/150000 5000/120000
    delay_access 2 allow magic_words2

    #EOF

    모든 것을 설정한 후 /opt/squid/cache 디렉토리내의 모든 것들이 사용자 'squid' 에 속하는지 확인해야 한다.

    # chown -R squid:squid /opt/squid/

    # chown -R squid:squid /cache/

    or

    # chown -R squid.squid /opt/squid/

    # chown -R squid.squid /cache/

    이제 스퀴드를 작동할 준비가 되어 있는데 처음 이를 구동할 때는 캐시 디렉토리를 생성해야 한다:

    # /opt/squid/usr/bin/squid -z

    스퀴드를 작동해서 모든 것이 작동하는지 검사하는데 이를 위한 좋은 도구는 IPTraf 이다; 이는 http://freshmeat.net 에서 찾을 수 있다. 웹 브라우저에 적절한 프록시를 설정했는지 확인해라 (예, 192.168.1.1, port 8080):

    # /opt/squid/usr/bin/squid

    모든 것이 작동하고 있다면 /opt/squid/usr/bin/squid 라인을 초기화 스크립트의 마지막에 추가하는데 보통 이 스크립트는 /etc/rc.d/rc.local 일 것이다.

    스퀴드에서 다른 유용한 옵션들로는 다음이 있을 수 있다:

    # /opt/squid/usr/bin/squid -k reconfigure (이는 squid.conf 파일을 변경한 경우 스퀴드를 재설정한다)

    # /opt/squid/usr/bin/squid -help :) 자명하다

    cachemgr.cgi 을 www 웹 서버의 cgi-bin 디렉토리에 복사할 수 있다.

3.3. 남아있는 문제 해결

스퀴드를 설치해 지연풀을 사용하도록 설정하였다. 틀림없이 어느 누구도 특히 영리한 랜 사용자들은 제한받기를 원하지 않는데 그들은 자신들이 좋아하는 mp3 파일들을 약간 더 빠르게 다운로드하기 위해 제한을 피할려고 할 것이다 (따라서 난처하게 한다).

저자는 사용자들이 IRC, ICQ, 이메일 등을 사용할 수 있도록 랜에 IP-매스쿼레이드를 사용하고 있다고 가정한다. 좋다 그러나 랜 사용자들이 웹 페이지에 접속해 ftp 를 사용하기 위해서 지연풀 기능이 있는 스퀴드를 사용할 것인지를 확신해야 한다.

이러한 문제점들의 대부분은 리눅스 2.2.x 커널의 ipchains 또는 리눅스 2.4.x 커널의 iptables 을 사용해 해결할 수 있다.

3.3.1. 리눅스 2.2.x 커널 (ipchains)

어느 누구도 프록시 서버를 속여 이를 사용하려고 하지 않을 것임을 확신해야 하는데 공개 프록시는 보통 3128 과 8080 포트에서 작동한다:

/sbin/ipchains -A input -s ! 192.168.1.1 -d ! 192.168.1.1 3128 -p TCP -j REJECT

/sbin/ipchains -A input -s ! 192.168.1.1 -d ! 192.168.1.1 8080 -p TCP -j REJECT

또한 어느 누구도 프록시 서버를 속여 웹 페이지를 다운로드하기 위해 직접적으로 인터넷 (IP-masquerade) 에 연결하려고 하지 않을 것임을 확신해야 한다:

/sbin/ipchains -A input -s ! 192.168.1.1 -d ! 192.168.1.1 http -p TCP -j REDIRECT 8080

/sbin/ipchains -A input -s ! 192.168.1.1 -d ! 192.168.1.1 https -p TCP -j REDIRECT 8080

모든 것이 작동하고 있다면 이 라인들을 초기화 스크립트의 마지막에 추가하는데 보통 이 스크립트는 /etc/rc.d/rc.local 일 것이다.

랜 사용자들에게 스퀴드 사용을 강요하기 위해 ftp 트래픽 (포트 20 과 21) 을 막아야 한다고 생각할 수 있지만 적어도 다음 두가지 이유로 인해 좋은 생각은 아니다:

  • 스퀴드는 실제 ftp 프록시가 아닌 ftp 를 지원하는 http 프록시로 ftp 에서 다운로드하거나 ftp 에 업로드할 수 있지만 원격 ftp 서버상의 파일들을 제거하거나 이름을 변경할 수 없다.

    포트 20 과 21 을 막는 경우 원격 ftp 서버상의 파일들을 제거하거나 이름을 변경할 수 없다.

  • IE5.5 는 버그를 갖고 있다 (적어도 저자의 것은 그렇다) -- ftp 디렉토리를 검색하기 위해 프록시를 사용하지 않으며 대신 IP 매스쿼레이드를 통해 직접적으로 연결한다.

    포트 20 과 21 을 막는 경우 IE5.5 를 사용해 ftp 디렉토리를 브라우징할 수 없다.

이 때문에 다른 방법을 사용하여 과도한 ftp 다운로드를 막을 것인데 이는 4 장에서 다룰 것이다.

3.3.2. 리눅스 2.4.x 커널 (iptables)

어느 누구도 프록시 서버를 속여 이를 사용하려고 하지 않을 것임을 확신해야 하는데 공개 프록시는 보통 3128 과 8080 포트에서 작동한다:

/sbin/iptables -A FORWARD -s ! 192.168.1.1 -d ! 192.168.1.1 --dport 3128 -p TCP -j DROP

/sbin/iptables -A FORWARD -s ! 192.168.1.1 -d ! 192.168.1.1 --dport 8080 -p TCP -j DROP

또한 어느 누구도 프록시 서버를 속여 웹 페이지를 다운로드하기 위해 직접적으로 인터넷 (IP-masquerade) 에 연결하려고 하지 않을 것임을 확신해야 한다:

/sbin/iptables -A FORWARD -s ! 192.168.1.1 -d ! 192.168.1.1 --dport 80 -p TCP -j DROP

/sbin/iptables -A FORWARD -s ! 192.168.1.1 -d ! 192.168.1.1 --dport 443 -p TCP -j DROP

모든 것이 작동하고 있다면 이 라인들을 초기화 스크립트의 마지막에 추가하는데 보통 이 스크립트는 /etc/rc.d/rc.local 일 것이다.

랜 사용자들에게 스퀴드 사용을 강요하기 위해 ftp 트래픽 (포트 20 과 21) 을 막아야 한다고 생각할 수 있지만 적어도 다음 두가지 이유로 인해 좋은 생각은 아니다:

  • 스퀴드는 실제 ftp 프록시가 아닌 ftp 를 지원하는 http 프록시로 ftp 에서 다운로드하거나 ftp 에 업로드할 수 있지만 원격 ftp 서버상의 파일들을 제거하거나 이름을 변경할 수 없다.

    포트 20 과 21 을 막는 경우 원격 ftp 서버상의 파일들을 제거하거나 이름을 변경할 수 없다.

  • IE5.5 는 버그를 갖고 있다 (적어도 저자의 것은 그렇다) -- ftp 디렉토리를 검색하기 위해 프록시를 사용하지 않으며 대신 IP 매스쿼레이드를 통해 직접적으로 연결한다.

    포트 20 과 21 을 막는 경우 IE5.5 를 사용해 ftp 디렉토리를 브라우징할 수 없다.

==============================

<출처: http://unix.co.kr/HOWTO/Bandwidth-Limiting-HOWTO/install.html >