1.Cele FAQ:
a) poprawna instalacja squida ze źródeł na slackware wraz z łatką na HIT-MISS
b) opis czynności poinstalacyjnych
c) squid.conf - konfigurujemy i oczyszczamy z farfocli
d) logi squida
e) podstawy htb z ujęciem markowania ruchu wychodzącego ze squida
2.Instalacja squida.
a) przygotowanie źródeł
Zapoznajmy się z zawartością strony:
http://sed.pl/~mrk/qos/
Znajdziemy opis działania łatki wraz z elementarnymi przykładami.
Ściągnijmy łatkę:
Kod: Zaznacz cały
cd /usr/src/
wget http://sed.pl/~mrk/qos/squid_hit_miss_mark.patch
Kod: Zaznacz cały
wget http://www.squid-cache.org/Versions/v2/2.5/squid-2.5.STABLE10.tar.gz
Kod: Zaznacz cały
tar zxvf squid-2.5.STABLE10.tar.gz
Kod: Zaznacz cały
cp squid_hit_miss_mark.patch squid-2.5.STABLE10/
cd squid-2.5.STABLE10/
Kod: Zaznacz cały
patch -p1 <squid_hit_miss_mark.patch
b) konfiguracja źródeł oraz kompilacja
Kod: Zaznacz cały
Opcjonalne.
Powinniśmy mieć ustawione odpowiednio zmienne systemowe CFLAGS i CXXFLAGS. Mówią one kompilatorowi o naszej architekturze oraz o innych opcjach kompilacji.
Przykładowo dla athlona 2800+ :
-O2 -march=athlon-xp -pipe -fomit-frame-pointer
Kod: Zaznacz cały
./configure --prefix=/usr --sysconfdir=/etc --mandir=/usr/man -enable-dlmalloc --enable-gnuregex --enable-icmp --enable-delay-pools --enable-useragent-log --enable-referer-log --enable-ssl --enable-default-err-language="Polish" --enable-err-languages="Polish English" --enable-linux-netfilter --disable-ident-lookups --disable-hostname-checks --enable-underscores --enable-auth="digest basic"
--enable-dlmalloc -- kompilacja z alternatywną biblioteką do dynamicznej alokacji pamięci
--enable-gnuregex -- biblioteka pozwalająca tworzyć acl oparte na wyrażeniach regularnych
--enable-icmp -- włączenie obsługi protokołu icmp
--enable-delay-pools -- ograniczanie transferów squidem, osobiście nie używam
--enable-useragent-log -- logowanie rodzaju przeglądarek jakie korzystają z proxy
--enable-ssl -- akceleracja https
--enable-linux-netfilter -- umożliwia ustawienie transparentnego proxy
--disable-ident-lookups -- squid nie będzie wykonywał zapytań ident , które często kończą się zbędnym oczekiwaniem na timeout
--disable-hostname-checks -- squid nie sprawdza nazwy hostów pod względem ogólnej zgodności z normami
--enable-underscores -- normalnie squid nie rozpoznaje nazw hostów ze znakiem "_", ta opcja to naprawia
--enable-auth="..." -- włączenie autoryzacji , można pominąć
Po czystym przejściu configure dajemy:
Kod: Zaznacz cały
make
make install
a) przygotowanie środowiska pracy dla squida
Po pierwsze należy wybrać katalog w którym będziemy trzymać cache. Katalog powinien znajdować sie na partycji na której możemy sobie pozwolić na zajęcie przez niego sporego kawałku miejsca.
Kod: Zaznacz cały
mkdir /var/squid-cache
Kod: Zaznacz cały
useradd -G squid -d /var/squid-cache squid
chown squid:squid /var/squid-cache
chmod 750 /var/squid-cache
Kod: Zaznacz cały
mkdir /var/log/squid
chown squid:root /var/log/squid
chmod 750 /var/log/squid
Kod: Zaznacz cały
chown squid:root /etc/squid.conf
chmod 660 /etc/squid.conf
b) /etc/squid.conf - Konfigurowanie i sprzątanie
Kod: Zaznacz cały
Za każdym razem jak konfiguruje squida czyszczę wszystkie komentarze w /etc/squid.conf. Można to pominąć , jak kto chce :) Dla wygody:
cd /etc/
cp squid.conf squid.conf.orig
A oto przykładowy config:
Kod: Zaznacz cały
#----------ciach--------------
######/etc/squid.conf
#na tym porcie śmiga squid
http_port 8080
#nie należy keszować skryptów cgi-bin
hierarchy_stopcode cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY
#ilość pamięci fizycznej użyta jako cache
cache_mem 64 MB
#na jakim poziomie zapełnienia ma pracować cache dyskowe
cache_swap_low 95
cache_swap_high 98
#maksymalna wielkość pliku w cache
maximum_object_size 60000 KB
#katalog w którym siedzi cache , pierwsza cyfra to wielkość w megabajtach, dalej ilość katalogów pierwszego poziomu, oraz ilosc katalogów drugiego poziomu
cache_dir ufs /var/squid-cache 4096 16 256
#logowanie
cache_access_log /var/log/squid/access.log
cache_log /var/log/squid/cache.log
cache_store_log /var/log/squid/store.log
referer_log /var/log/squid/store.log
#czy logi mają wyglądać jak logi apache
emulate_httpd_log off
pid_filename /var/run/squid.pid
# gdy zapodamy squid -k rotate to nastąpi rotacja logów , squid bedzie trzymał 15 ostatnich rotacji
logfile_rotate 15
#plik hosts, prymitywne rozwiązywanie nazw :)
hosts_file /etc/hosts
# przykładowe reguły odświeżania zawartości cache
refresh_pattern -i (.*jpg$|.*gif$) 0 50% 28800
refresh_pattern -i (.*html$|.*htm|.*shtml) 0 20% 1440
refresh_pattern (http://.*/$) 0 20% 1440
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern . 0 20% 4320
#kontrola dostępu
acl all src 0.0.0.0/0.0.0.0
#poniżej sieć lokalna
acl lan src 10.0.0.0/8
#definicja acl dla cachemgr.cgi
acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8
#acl dla portów na których pracują usługi które squid potrafi przyśpieszać
acl SSL_ports port 443 563
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 563 # https, snews
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports, np. pasywne ftp
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT
#dozwolenie sieci lokalnej na korzystanie z akceleratora
http_access allow lan
#cachemgr.cgi może się łączyć tylko z localhosta
http_access allow manager localhost
http_access deny manager
#odrzucenie połaczeń z nieznanymi portami
http_access deny !Safe_ports
#ograniczenie łączenia poprzez CONNECT tylko do połączeń szyfrowanych
http_access deny CONNECT !SSL_ports
http_access deny all
http_reply_access allow lan
icp_access allow lan
#tu ustawiamy hasło dla cachemgr.cgi , all oznacza pozwolenie na wszystkie akcje
cachemgr_passwd haslo all
#ustawmy adres mailowy który w razie kłopotów z połączeniem ze stroną zostanie wyświetlony wraz z komunikatem o błędzie
cache_mgr nospam_admin@polsl.pl_nospam
#użytkownik i grupa na której działa squid
cache_effective_user squid
cache_effective_group squid
#te opcje umożliwiają transparentne proxy
httpd_accel_port 80
httpd_accel_host virtual
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
#dla archaicznych internet exploderów :P
ie_refresh on
#--------------ciach----------------------
Załóżmy sobie acl'e , zaraz po "#kontrola dostępu"
Kod: Zaznacz cały
acl blok_plikow urlpath_regex "/etc/squid/pliki.acl"
acl blok_reklam url_regex "/etc/squid/reklamy.acl"
Kod: Zaznacz cały
http_access deny blok_plikow
http_access deny blok_reklam
Zawartość pliki.acl
Kod: Zaznacz cały
\.[Zz][Ii][pP]$
\.[Vv][Ii][Vv].*
\.[Ee][Xx][Ee]$
\.[Mm][Pp]3$
\.[Rr][Aa][Rr]$
\.[Aa][Cc][Ee]$
\.[Aa][Ss][Ff]$
\.[Aa][Vv][Ii]$
\.[Mm][Oo][Vv]$
\.[Mm][Pp][Gg]$
\.[Mm][Pp][Ee][Gg]$
\.[Aa][Uu]$
\.[Rr][Aa]$
\.[Aa][Rr][Jj]$
\.[Tt][Aa][Rr]$
\.[Gg][Zz]$
\.[Zz]$
Kod: Zaznacz cały
/adv/.*\.gif$
/[Aa]ds/.*\.gif$
/[Aa]d[Pp]ix/
/[Aa]d[Ss]erver
/[Aa][Dd]/.*\.[GgJj][IiPp][FfGg]$
/[Bb]annerads/
/adbanner.*\.[GgJj][IiPp][FfGg]$
/images/ad/
/reklame/
/RealMedia/ads/.*
^http://www\.submit-it.*
^http://www\.eads.*
^http://ads\.
^http://ad\.
^http://ads02\.
^http://adaver.*\.
^http://adforce\.
adbot\.com
/ads/.*\.gif.*
_ad\..*cgi
/Banners/
/SmartBanner/
/Ads/Media/Images/
^http://static\.wired\.com/advertising/
^http://*\.dejanews\.com/ads/
^http://adfu\.blockstackers\.com/
^http://ads2\.zdnet\.com/adverts
^http://www2\.burstnet\.com/gifs/
^http://www.\.valueclick\.com/cgi-bin/cycle
^http://www\.altavista\.com/av/gifs/ie_horiz\.gif
e) kończymy ze squidem
Troche grzebaniny już za nami.
Ustawmy squidowi rotację logów:
Kod: Zaznacz cały
touch /etc/cron.weekly/squid-rotate
chown root. /etc/cron.weekly/squid-rotate
chmod 700 /etc/cron.weekly/squid-rotate
Kod: Zaznacz cały
#!/bin/sh
squid -k rotate
Kod: Zaznacz cały
squid -z
Kod: Zaznacz cały
squid -k parse
Kod: Zaznacz cały
squid -NX
f) transparentne proxy
Jest to bardzo wygodny sposób żeby zmusić niepokornych użytkowników do korzystania z naszego proxy. Nie cały proces opiera sie o kilka linijek w squid.conf i o przekierowanie na firewallu.
Drobny przypadek akademicki
Załóżmy że na moim routerze który ma dwa interfejsy, eth0 internetowy i eth1 lokalny, pracuje serwer www. Logicznie rzecz biorąc powinno się odwoływać do serwera adresem ip który serwer ma z danej strony z której chcemy się na niego dostać. Nie mam jednak serwera dns który będzie rozwiązywał nazwy na adresy zależnie od tego skąd przyszło zapytanie a jego stawianie mija sie z celem dla małej liczby userów. Także nie chce żeby ruch z mojego lokalnego serwera www był keszowany.
Naturalnie poprawiamy squid.conf.
Następnie dorzucamy sobie regułki do firewalla które będą przekierowywały delikwentów
Oczywiście w łańcuchu INPUT musi być odpowiednia regułka dopuszczająca ruch z lanu na port squida.
Kod: Zaznacz cały
iptables -t nat -N proxy
iptables -t nat -A proxy -d ip_z_eth0 -j RETURN
iptables -t nat -A proxy -d ip_z_eth1 -j RETURN
iptables -t nat -A proxy -j REDIRECT --to-port port_squida
iptables -t nat -A PREROUTING -p tcp --dport 80 -s michal -j proxy
iptables -t nat -A PREROUTING -p tcp --dport 80 -s ziutek -j proxy
Kod: Zaznacz cały
acl bezposrednie dst $ip
always_direct allow bezposrednie
Opisany tutaj problem jest dosyć egzotyczny. Do prostych zastosowań starczy jedna regułka na użytkownika lub nawet na całą podsieć. Te tłumaczą dokładniej zachodzący proces.
4. Gwóźdź programu czyli squid ograniczany przez htb.
Ktoś może zapytać jak można ograniczyć squida, czyli proces lokalny , który de facto ściąga za nas daną treść a potem, bez uczestnictwa procesów routingu, ją przekazuje. Całą tajemnica ograniczania transferów ze squida opiera się o fakt że squid ma wewnętrzny bufor który dla połączenia będącego chybieniem ulega zapełnieniu jeżeli prędkość jego opróżniania nie jest wystarczająca. Gdy wspomniany bufor jest pełny to squid przerywa ściąganie oczekując na jego opróżnienie.
Bardzo ważną rzeczą jest to że kształtując ruch nie mamy wpływu na transfery przychodzące !! Możemy kontrolować tylko to co wysyłamy. Efekt kontroli pasma w obydwu kierunkach uzyskujemy dzięki kształtując ruch wychodzący na interfejsie sieci lokalnej oraz na interfejsie internetowym routera. Opiszę kształtowanie ruchu w kierunku download.
a) założenia
Załóżmy że mamy sieć lokalną pomiędzy serwerem i klientami która jest maskaradowana. Dla uproszczenia przyjmijmy że klient jest tylko jeden. Jeżeli klient ściąga pliki lokalnie lub z cache naszego squida to umożliwiamy mu to z prędkością lanu. Jeżeli natomiast transfer odbywa się z internetu to zostaje ograniczony.
b) ustawiamy htb na interfejsie sieci lokalnej
Czyścimy poprzednie ustawienia :
Kod: Zaznacz cały
tc qdisc del root dev eth1
Kod: Zaznacz cały
tc qdisc add root dev eth1 handle 1: htb
#root jest klasą najwyższą
Kod: Zaznacz cały
#łącze z internetem 1 mbit , łacze lanowe osiąga 62 Mbit
tc class add dev eth1 parent 1: classid 1:10 htb rate 1Mbit ceil 1mbit burst 30k
tc class add dev eth1 parent 1: classid 1:20 htb rate 61Mbit ceil 61Mbit
#parent – rodzić – klasa nadrzędna w stosunku do tej którą definiujemy
#classid – identyfikator nowo utworzonej klasy
#htb – jako algorytmu kolejkowania używamy htb , obecnie najdokładniejsza z kolejek odpowiednich do zastosowań w sieciach lokalnych
#rate – gwarantowane pasmo dla kolejki
#ceil – maksimum pasma , które zostaje pożyczone od kolejek które go nie wykorzystują
#burst – maksymalna ilość danych przechodząca przez kolejkę bez ograniczeń transferu
Kod: Zaznacz cały
tc class add dev eth1 parent 1:10 classid 10:100 htb rate 100kbit ceil 800kbit burst 10k
tc qdisc add dev eth1 parent 10:100 handle 100: sfq perturb 15
# rate i ceil kolejek podrzędnych nie może przekraczać rate i ceila kolejek nadrzędnych w innym wypadku dojdzie do strat pakietów oraz zbędnych opóźnień
# perturb – parametr mówi sfq po ilu sekundach ma zmienić algorytm zarządzenia ruchem pakietów , ustawiono 15 sekund
Kod: Zaznacz cały
tc filter add dev eth1 protocol ip parent 1: handle 1 fw flowid 1:20
tc filter add dev eth1 protocol ip parent 1: handle 2 fw flowid 10:100
#handle X fw – X to znacznik który założymy pakietom pasującym do tej kolejki na firewallu
#flowid mówi do jakiej kolejki mają trafić pakiety pasujące do filtra
Kod: Zaznacz cały
#Trafienia
iptables -t mangle -A POSTROUTING -s $ip_serwera -d $ip_klienta -p tcp –-sport $port_squida -m tos –-tos 0 -j MARK –-set-mark 1
#Chybienia
iptables -t mangle -A POSTROUTING -s $ip_serwera -d $ip_klienta -p tcp –-sport $port_squida -m tos –-tos 8 -j MARK –-set-mark 2
Ponadto użyszkodnik ściąga z internetu oraz z serwera
iptables -t mangle -A POSTROUTING -s ! $ip_serwera -d $ip_klienta -j MARK –-set-mark 2
iptables -t mangle -A POSTROUTING -s $ip_serwera -d $ip_klienta -j MARK –-set-mark 1
Do napisania artykułu zainspirowały mnie moje problemy z łączem oraz dyskusja wywołana artykułem Maiki'ego z której lektury w dużym stopniu skorzystałem. Sam często walczyłem z postawieniem squida który dla początkującego użytkownika nie jest ani trochę przyjazny. Do czasu gdy do kształtowania ruchu w mojej sieci używałem super-auto-shaperów nie interesowały mnie dokładniejsze zagadnienia kontroli ruchu pod linuxem. Gdy moja sieć się rozrosła zrodziła się konieczność postawienia proxy z prawdziwego zdarzenia. Niestety okazało się jednocześnie ,że automagiczne shapery nie dają sobie rady z p2p i wymaganiami efektywnego wykorzystania łącza przy utrzymaniu zdrowych pingów dla graczy. Proponowane w artykule Maiki'ego ograniczanie transferów z proxy poprzez delay pols nie przypadło mi do gustu ponieważ tworzyło rozdźwięk w całym moim zamyśle kontroli pasma. Takie podejście zakłada ograniczanie transferów w dwóch oddzielnych ośrodkach: w squidzie dla www ftp , oraz w kernelowym tc. Stan taki byłby dla mnie całkowicie do zaakceptowania jeżeli dysponowałbym bardzo szybkim łączem. Osobiście uważam ,że w małych sieciach pasmo powinno być przydzielane na każdego użytkownika osobno i to co użytkownik robi z tym pasmem to jest jego sprawa nawet jeżeli w ramach ponoszenia konsekwencji swoich działań mają mu się strony nie otwierać
BTW. Proszę o konstruktywną krytykę, mogłem się jeszcze troche mylić w zawiłej terminologii htb ponieważ zajmuję się tym dopiero od miesiąca Muszę jeszcze dopisać dział o logach squida lecz nie zabieram się za niego dopóki nie dowiem się co sądzicie o całej reszcie
5. Źródła
SQUID:
- Artykuł Maiki'ego wraz z większością komentarzy
- squid-cache.org
- odrobinka http://zlobek.tcz.wroclaw.pl/
- http://aqua.aspd.pwr.wroc.pl/doc/squid/FAQ-6.html
HTB:
- http://lukasz.bromirski.net/docs/transl ... tc-pl.html
- http://logout.pl/ebooks/htb.pdf
- lektura gotowych skryptów do kontroli pasma