Squid
Sisukord
- 1 Sissejuhatus
- 2 Paigaldamine
- 3 Veebivahendaja seadistamine
- 4 Veebivahendaja kasutamine
- 5 Logi
- 6 Veebivahendaja kasutamine kiirendina
- 7 Veebivahendaja kasutamine vahelthaaravas režhiimis
- 8 Veebivahendaja kasutamine vanema ja naabriga
- 9 Piirangud
- 10 Monitooring
- 11 Squidi kasutaja autentimine
- 12 Mitme Squid eksemplari kasutamine
- 13 FTP vahendamine
- 14 Kasutaja autentimine Kerberosega
- 15 Märkused
- 16 Lingid
Sissejuhatus
Üldiselt saab teenuste kasutamise puhul klient pöörduda kas otse teenust pakkuva serveri poole või kasutada vahendajat (ingl. k. proxy), mis pöördub teenuse poole kliendi eest. Kusjuures vahendaja võib kasutada omakorda mõne teise vahendaja abi. Vahendajate kasutamine on populaarne lisaks veebile (HTTP) veel näiteks eposti (SMTP) ja nimeteenuse (DNS) puhul.
Vahendaja kasutamisel ilmnevad sellised aspektid
- klient ei pea pääsema TCP/IP ühenduse mõttes otse teenust pakkuvale serverile juurde, mis võib osutuda oluliseks turvalisuse seisukohast
- vahendajal on võimalus vaheladustada (ingl. k. to cache) serverilt saadavaid vastuseid ja neid nö korduvkasutada kliendile vastust esitades, mis võib osutuda oluliseks jõudluse seisukohast
- teenust pakkuva serveri jaoks jääb klient anonüümseks
- vahendaja saab kontrollida, milliste teenust pakkuvate serveritega klient suhtleb
- klient saab oma tegevuse ära sooritada vaatamata teenust pakkuva serveri parasjagu töökorrasolekule, nt eposti puhul vahendaja võtab kliendilt kirja vastu ning saadab edasi siis kui teenust pakkuv server on valmis seda vastu võtma
Vahendamist saab teha mitmel tasemel, kui seda tehakse teenust pakkuva protokolli tasemel, siis nimetatakse selle tegevuse sooritajat rakendustaseme vahendajaks (ingl. k. application proxy).
Tarvkvara Squid on HTTP protokolli kasutavate teenuste rakendustaseme vahendaja, asudes loogiliselt brauseri ja veebiserveri vahel. Tavaliselt on Squid realiseeritud eraldi serverina ehk teenusena, mille kasutamine tuleb brauseris seadistada.
Üldiselt kasutatakse vahendamist, eriti just vahendamisega kaasnevat andmete vaheladustamise võimalust seoses HTTP teenustega ohtrasti, lisaks Squidile brauser sisemiselt vaheladustab andmeid ning samuti veebiserver oma töö käigus. Veel üldisemalt vaadeldes on vaheladustamine (ingl. k. cacheing) arvutustehnika puhul üks oluline jõudluse tõstmise instrument, nt protsessorite puhul kasutatakse samuti mitme tasemelist cache'i, kõvakettakontrollerite puhul ning osa operatsioonisüsteemi mälust, mis pole nö aktiivses kasutuses on suures osas kasutuses failisüsteemi cache'ina.
Paigaldamine
Tänapäeval esineb tarkvara Squid viimane stabiilne versioon 2.6.x reeglina operatsioonisüsteemi paketihaldusvahendite abil paigaldataval kujul. Nt Debian GNU/Linux 4.0 puhul toimub paigaldamine käsuga
bash# apt-get install squid
Paigaldamisel moodustatakse spetsiaalne süsteemi kasutaja ja grupp ning vaheladustatud andmete hoidmiseks nn cache_dir kataloog, Debiani puhul /var/spool/squid. Programmi seadistused on kirjas failis /etc/squid/squid.conf.
Veebivahendaja seadistamine
Squidi saab kasutada veebivahendajana mitmel pisut erineval moel. Käesolevas punktis esitame kuidas kasutada Squidi kõige tavapärasemas rollis, kus Squid
- töötab iseseisva teenusena aadressil 192.168.10.11:3128
- vahendab ja vaheladustab kliendi päringuid HTTP serveritele
- Squidi kasutamine on piiratud kliendi ip aadressi järgi, teenindatakse ainult localhosti ning 192.168.10.0/24 võrgus asuvaid kliente
Nii seadistatud Squidist võiks olla kasu kohtvõrku teenindava veebivajandajana, langeb välisliikuse maht ning kasutajad saavad vastused kätte kiiremini. Võit kiiruses tekib tänu sellele, et kui üks kohtvõrgu arvuti on mingit veebikohta külastanud, siis Squidi vahelaos küll ei salvestata ära nn .php faili, küll aga taustapildid, .css failid jms ning kui järgmine kohtvõrgu arvuti esitab päringu samale veebilehele, siis võiks ta saada kõik vastused peale .php faili juba kohalikust Squidist.
Selleks tarbeks sobib kasutada näiteks sellise sisuga squid.conf seadistusfaili
cache_dir ufs /var/spool/squid 384 16 256 http_port 192.168.10.11:3128 icp_port 0 acl all src 0.0.0.0/0.0.0.0 acl localhost src 127.0.0.1/255.255.255.255 acl kohtvork src 192.168.10.0/255.255.255.0 acl SSL_ports port 443 # https acl SSL_ports port 563 # snews acl SSL_ports port 873 # rsync acl Safe_ports port 80 # http acl Safe_ports port 21 # ftp acl Safe_ports port 443 # https acl Safe_ports port 70 # gopher acl Safe_ports port 210 # wais acl Safe_ports port 1025-65535 # unregistered ports 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 Safe_ports port 631 # cups acl Safe_ports port 873 # rsync acl Safe_ports port 901 # SWAT acl CONNECT method CONNECT http_access deny !Safe_ports http_access deny CONNECT !SSL_ports http_access allow localhost http_access allow kohtvork http_access deny all access_log /var/log/squid/access.log squid emulate_httpd_log on useragent_log /var/log/squid/useragent.log referer_log /var/log/squid/referer.log acl QUERY urlpath_regex cgi-bin \? cache deny QUERY
Seadistusfailis kasutatud direktiivide selgitused
- cache_dir - näitab, millised kataloogis asuvad vaheladustatud andmed
- http_port - millisel soketil Squid teenust pakub
- icp_port - Squid ei tee teiste veebivahendajatega koostööd (ei kuula pordil 3130)
- acl (access control list) - omistab nimed erinevatele väärtustele
- cache, http_access - lubab ja keelab pärigute teenindamist
- *_log - logifailide asukohad ja omadused
Squidist päringute läbisaamist kontrollitakse peamiselt acl ja http_access direktiividega. http_access direktiivide esinemise järjekord on oluline, rakendub esimesena klappinud reegel.
Töötava programmi seadistusfailis tehtud muudatuste kehtestamiseks tuleb öelda
bash# /etc/init.d/squid reload
Veebivahendaja kasutamine
Veebivahendaja kasutamiseks on tarvis programm käivitada öeldes
bash# /etc/init.d/squid start
Selles, kuidas programm käivitus annab märku cache.log logifail. Squidi kasutamiseks tuleb brauseris näidata veebivahendaja asukoht, nt Firefoxi moodi programmis toimub see valides menüüst
Edit -> Preferences -> Advanced -> Network -> Settings
Pildil toodud juhtumil kasutab brauser kõigi http ja https aadresside poole pöördumiseks, mis ei asu 192.168.12.0/24 võrgus või ei sisalda domeeninimes looma.aed aadressil 192.168.10.11:3128 asuvat veebivahendajat.
Logi
Veebivahendaja tööd saab jälgida access.log logifaili uurides, nt on näha kuidas aadressil 192.168.10.37 asuv klient päringuid esitab
# tail -f /var/log/squid/access.log 1202047619.603 690 192.168.10.37 TCP_MISS/200 25900 GET http://kuutorvaja.eenet.ee/wiki/Squid - DIRECT/193.40.0.10 text/html 1202047619.962 181 192.168.10.37 TCP_MISS/200 18690 GET http://kuutorvaja.eenet.ee/mw-1.9.3/images/b/bd/Squid-1.gif - DIRECT/193.40.0.10 image/gif
kus väljadel on selline tähendus
time elapsed remotehost code/status bytes method URL rfc931 peerstatus/peerhost type
kus
- time - aeg
- elapsed - päringu teenidamiseks kulunud aeg (millisekundites)
- remotehost -
- code/status -
- bytes - päringu vastuse maht baitides
- method - HTTP päringu meetod
- URL rfc931 -
- peerstatus/peerhost -
- type -
Squid logib access.log faili sissekande peale päringule vastuse saamist.
https päringute kohta esinevad logis sellised sissekanded
1244925877.680 5488 192.168.10.10 TCP_MISS/200 61953 CONNECT www.eesti.ee:443 - DIRECT/192.168.102.38 - 1244925883.922 11261 192.168.10.10 TCP_MISS/200 12971 CONNECT www.eesti.ee:443 - DIRECT/192.168.102.38 - 1244925884.055 11394 192.168.10.10 TCP_MISS/200 17899 CONNECT www.eesti.ee:443 - DIRECT/192.168.102.38 -
Logitud nn UNIXi kellaaja teisendamiseks traditsioonilisse formaati sobib kasutada sellist järgnevust
$ cat squid-access.log | /usr/bin/perl -pe 's/\d+/localtime $&/e;'
Veebivahendaja kasutamine kiirendina
Kui tavaliselt asub Squid pigem lähemal brauserile kui veebiserverile, siis osutub, et üks oluline Squidi kasutusjuht näeb ette justnimelt veebivahendaja paigutamise vahetult veebiserveri ette. Kliendid pöörduvad 'enda meelest' veebiserveri poole, aga tegelikult teenindab neid vastaval pordil Squid, mis vastab klientidele ise päringuid ja vajadusel vahendab päringuid enda taga töötavale veebiserverile. Squidi ülesandeks on sellisel juhul
- veebiserverilt koormuse vähendamine võttes reeglina enda peale staatiliste päringute teenindamise
- kontrollida veebiserverile jõudvaid päringuid, nt meetodite (POST, GET), lähte ip aadressid vms suhtes
- mitme Squidi kasutamisel saaks korralada iseenesest ka koormusjaotusega tegeleva lülituse, kui konkreetsel juhul peaks see pudelikaela leevendama
- üks Squid asub mitme veebiserveri ees
Niisugust asjakorraldust nimetatakse kiirendavas rezhiimis töötavaks veebivahendajaks (ingl. k. httpd-accelerator või reverse proxy).
Eeldades, et veebiserver töötab aadressil 192.168.10.15:80 võiks sellist Squidi (viimaste 2.x ja 3.x seeria versioonide süntaks) seadistusfaili kasutades pakkuda veebilist teenust aadressil 192.168.10.11:80
cache_dir ufs /var/spool/squid 384 16 256 http_port 192.168.10.11:80 defaultsite=www.loomaaed.tartu.ee vhost icp_port 0 cache_peer 192.168.10.15 parent 80 0 no-query originserver name=loomaaed login=PASS acl sites_loomaaed dstdomain www.loomaaed.tartu.ee loomaaed.tartu.ee cache_peer_access loomaaed allow sites_loomaaed acl all src 0.0.0.0/0.0.0.0 acl localhost src 127.0.0.1/255.255.255.255 acl Safe_ports port 80 # http http_access deny !Safe_ports http_access allow all access_log /var/log/squid/access.log squid emulate_httpd_log on useragent_log /var/log/squid/useragent.log referer_log /var/log/squid/referer.log
kus olulisematel parameetritel on järgmine tähendus
- http_port - kiirendatud teenuse aadress
- cache_peer - defineerib kiirendatava veebiserveri kasutades aadressi ja porti ning seostab selle nimega 'loomaaed', seda nime kasutatakse mujal Squidi seadistusfailis; parameetri taga kasutatud 'login=PASS' tõttu töötab brauseri jaoks veebiserveri basic_auth autentimine kui veebiserver peaks seda kasutama
- acl sites_loomaaed - defineerub 'sites_loomaaed' nimelise access control listi dstdomain järgi, kiirendatavate domeeninimede väärtusteks on www.loomaaed.tartu.ee ja loomaaed.tartu.ee
- cache_peer_access loomaaed allow sites_loomaaed - ütleb, et 'loomaaed' nimelisele kiirendatavale veebiserverile tuleb vahendada aclis 'sites_loomaaed' näidatud veebikohtadele tehtud päringuid ja ainult neid (vajalik, et Squid ei töötaks nn avatud vahendajana (ingl. k. open proxy)
- kui http_port parameetri järel on erinev port kui nn realserveril, siis tuleb 2.7 versiooni puhul kasutada samal real lisaks 'vport=realserveripordinumber'
Kiirendina töötava vahendaja juures on vahel abiks teha URL'i ümberkirjutust, näiteks teenindada päringuid lisaks aadressil http://www.zoopark.tartu.ee/, selleks tuleb lisada seadistusfaili rida
url_rewrite_program /etc/squid/redirector
ning moodustada sarnase sisuga fail /etc/squid/redirector
#!/usr/bin/perl $|=1; while (<>) { s@http://www.zoopark.tartu.ee@http://www.loomaaed.tartu.ee@; print; }
ning öelda
bash# chmod 0755 /etc/squid/redirector
Seejuures esitatakse brauseri kasutaja jaoks aadressireal järkuvalt domeeninime www.zoopark.tartu.ee.
Lisaks asendusele saab saata kliendile vastuseid, nt ümbersuunamiseks 302 koodiga
#!/usr/bin/perl $|=1; while (<>) { if ($_ =~ /^http:\/\/loomaaed\.tartu\.ee/) { print "302:http://www.loomaaed.tartu.ee/\n"; } elsif ($_ =~ /^http:\/\/zoo\.tartu\.ee/) { print "302:http://www.loomaaed.tartu.ee/\n"; } else { s@http://www.loomaaed.tartu.ee@http://www.loomaaed.tartu.ee@; print; } }
Asenduse ja 302 teate erinevus seisneb selles, et esimesel juhul näeb brauseri aadressreal aadressi http://www.zoopark.tartu.ee/ ja teisel juhul http://www.loomaaed.tartu.ee/.
Kiirendava Squidi saab seada käima ka nii, et kliente teenindatakse HTTPS protokolli kasutades https:// järgnevusega algaval aadressil. Selleks on tarvis sertifikaati ning kasutada seadistusfailis sellist rida
https_port 192.168.10.11:443 cert=/etc/squid/www.loomaaed.tartu.ee.pem defaultsite=www.loomaaed.tartu.ee vhost
kusjuures sertifikaadis on faili alguses privaatne võti, seejärele veebikoha sertifikaat ja edasi ahel järjest edasi kuni PKI juursertifikaadini.
Veebivahendaja kasutamine vahelthaaravas režhiimis
Vahelthaarav veebivahendaja (ingl. k. intercepting proxy, transparent proxy) töötab sarnaselt kui tavalinegi veebivahendaja, nt kohtvõrgu kasutajate jaoks, aga selle erinevusega, et kasutajate jaoks toimub selle kasutamine nähtamatult. Sel juhul seadistatakse kohtvõrgu tulemüür nii, et kasutajad ei saa otse pöörduda internetti 80 pordi poole ja selle asemel suunatakse 80 pordi liiklus TCP/IP vahenditega edasi Squidile, mis töötab aadressil 192.168.10.254:3128, näiteks OpenBSD tulemüüris sellise rdr direktiiviga
rdr on $int_if proto tcp from 192.168.10.0/24 to any port 80 -> 192.168.10.254 port 3128
Squid võib, aga ei pea töötama samas tulemüüris.
Näiteks võiks kasutada vahelhaaravas Squidis sarnast seadistusfaili nagu ülal punktis http://kuutorvaja.eenet.ee/wiki/Squid#Veebivahendaja_seadistamine ainult antud juhul tuleb lisada http_port reale juurde 'transparent'
http_port 192.168.10.254:3128 transparent
Kusjuures, sedasi seadistatud Squidi saab jätkuvalt kasutada ka aadressil 192.168.10.254:3128 asuvat vahendajat kasutama seadistatud brauser. Arusaadavalt võiks sellise asjakorralduse kohta mõnes muus kontekstis teisiti öelda, nt ühenduste kaaperdamine (ingl. k. connection hijacking).
Veebivahendaja kasutamine vanema ja naabriga
Siin on veel selline moment, et mitu squid serverit võivad teha omavahel koostööd.
Üks võimalus on see, et määrata oma squidile parent (vanem) - siis on nii, et päringud, mis ei sisaldu enda kohalikus andmebaasis, saadetakse parent squidile (see asub tavaliselt teises - suuremas, paremas masinas) ning too vaatab kust saab.
Teine võimalus on määrata oma squidile sibling (naaber) - siis on nii, et naabrid peavad efektiivselt ühte suurt andmebaasi mitme peale. Ja kui päring esitatakse ning kohalik squid ei leia oma andmebaasist vastust, siis kõigepealt külastab ta naabreid ja seejärel parent'i.
Ainus konf fail, millega saab ja on vaja tegeleda, on squid.conf, minul on ta selline:
root@masin# egrep ^[^#] squid.conf
http_port 3128 icp_port 3130 cache_peer cache.tartu.eenet.ee parent 3128 3130 no-query cache_peer_domain cache.tartu.eenet.ee !.ee acl QUERY urlpath_regex cgi-bin \? no_cache deny QUERY cache_mem 8 MB acl manager proto cache_object acl localhost src 127.0.0.1/255.255.255.255 acl sub1 src 192.168.1.0/255.255.255.0 acl sub2 src 192.168.2.0/255.255.255.0 acl kopka src 193.40.xxx.xxx/255.255.255.255 http_access allow manager localhost http_access allow manager kopka http_access allow sub1 http_access allow sub2 http_access allow kopka icp_access allow sub1 icp_access allow sub2 icp_access allow kopka
Lühidalt kokkuvõttes realiseerib see konfiguratsioon järgmist:
- kuulatakse porte 3128 ja 3130 - vanemaks on cache.tartu.eenet.ee vastavate portidega, kusjuures mitte saata ICP (???) päringuid talle - küsida kõike peale .ee domainide - acl access list: määrab masinad ja alamvõrgud, kes meie squidi kasutada saavad ja annab neile õigused - samuti selle, kust monitoringut teha saab
Piirangud
acl abil saab defineerida faile, kuhu saab kirjutada näiteks sõnu, mille esinemisel veebis veeb blokeeritakse. Näiteks
acl porn url_regex "/usr/local/etc/squid/porn.block.txt" acl notporn url_regex "/usr/local/etc/squid/porn.unblock.txt" acl badlang url_regex "/usr/local/etc/squid/badlang.block.txt"
ja siis vastavalt
http_access allow notporn all http_access deny porn all http_access deny badlang all
Failidesse võib kirjutada järgnevalt
.t100.com .mp3 .mpeg morpheus napster .mpg
Nagu näha, keelata saab nii domeene, faililaiendeid, kui ka üksikuid tekstilõike sisaldavaid lehti.
Juhul kui on soov kasutada squidi vaid veebi piiramiseks ja mitte cacheda faile kettale võib seadistusfaili kirjutada cache_dir null /tmp
Lisaks on võimalik korraldada, et näidatud URI'dele pääseb ligi vaid näidatud ip aadressidelt.
Parameetri http_access järele võib kirjutada ka mitme acl nimed, sel juhul rakendatakse seda juhul, kui päring rahuldab kõigi acl tingimusi, st acl'id omavahel and'itakse kokku (nn loogiline korrutamine).
Monitooring
Kaval on panna tööle ka kaasapandud cgi script squidi töö jälgimiseks (nt. selleks, et jälgida kuidas nn. hitte tuleb - see on protsent läbi squidi esitatud päringutest, mida ta oma kohalikust andmebaasist rahuldada sai). See eeldab, et samas masinas on apache või mõni muu sarnane webserver installeeritud.
Squidi kasutaja autentimine
Kui soovida Squidi kasutajamist piirata Squidi kasutajanime ja parooli omavate kasutajatega, tuleb lisada seadistusfaili (NB! süntaks on viimasel ajal muutunud, toodud näide kehtib uuemate 2.6.x versioonide puhul)
auth_param basic program /usr/lib/squid/ncsa_auth /etc/squid/ncsa.passwd acl kasutajad proxy_auth REQUIRED auth_param basic children 5 auth_param basic realm Tartu loomaaed auth_param basic credentialsttl 1 week ... http_access allow kasutajad
Kusjuures paroolifaili sisu moodustatakse traditsioonilise nn basic_auth paroolifaili tekitamise programmiga htpasswd. Squidi access.log failis salvestatakse iga päringu juures päringu teinud kasutaja kasutajanimi.
Mitme Squid eksemplari kasutamine
Kui sama operatsioonisüsteemi eksemplari sees on vajadus kasutada mitut Squid protsessi (nt ühte kiirendavas ja teist nö traditsioonilises päripidises režiimis), siis tuleb seadistusfailide abil tagada, et kumbki kasutaks eraldi selliseid ressursse
- vaheladustatud andmete kataloog - cache_dir
- logi - cache_log, cache_store_log, access_log, useragent_log, referef_log jt
- pid fail - pid_filename
Nt sobiks juhuks kui teine Squid protsess on traditsiooniline päripidine Squid kasutamiseks selline seadistusfail /etc/squid/squid-cache.conf
cache_dir ufs /var/spool/squid-cache 384 16 256 http_port 192.168.10.11:3128 icp_port 0 acl all src 0.0.0.0/0.0.0.0 acl localhost src 127.0.0.1/255.255.255.255 acl kohtvork src 192.168.10.0/255.255.255.0 acl SSL_ports port 443 # https acl SSL_ports port 563 # snews acl SSL_ports port 873 # rsync acl Safe_ports port 80 # http acl Safe_ports port 21 # ftp acl Safe_ports port 443 # https acl Safe_ports port 70 # gopher acl Safe_ports port 210 # wais acl Safe_ports port 1025-65535 # unregistered ports 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 Safe_ports port 631 # cups acl Safe_ports port 873 # rsync acl Safe_ports port 901 # SWAT acl CONNECT method CONNECT http_access deny !Safe_ports http_access deny CONNECT !SSL_ports http_access allow localhost http_access allow kohtvork http_access deny all access_log /var/log/squid-cache/access.log squid emulate_httpd_log on useragent_log /var/log/squid-cache/useragent.log referer_log /var/log/squid-cache/referer.log cache_log /var/log/squid-cache/cache.log cache_store_log /var/log/squid-cache/store.log pid_filename /var/run/squid-cache.pid acl QUERY urlpath_regex cgi-bin \? cache deny QUERY
Lisaks tuleks sobivalt kohendada käivitusskripti /etc/init.d/squid, nt selliselt
# diff /etc/init.d/squid* 145,147d144 < < squid -f /etc/squid/squid-cache.conf < 156,158d152 < < squid -k shutdown -f /etc/squid/squid-cache.conf
FTP vahendamine
TODO
Kasutaja autentimine Kerberosega
Kerberose kasutaja autentimiseks peab olema kasutada Kerberose infrastruktuur, nt selline nagu kirjeldatud tekstis MIT Kerberose kasutamine Debianiga.
Sarnaselt veebiserverilt tuleb moodustada Squid serverisse teenuse keytab osapoolele HTTP/hostname, nt öeldes Squid serveris
# kadmin -p priit/admin -q "addprinc -randkey HTTP/squid.loomaaed" # kadmin -p priit/admin -q "ktadd -k /etc/squid3/krb5.keytab HTTP/squid.loomaaed" # chown proxy /etc/squid3/krb5.keytab
Squid seadistusfailis /etc/squid3/squid.conf sobib kasutada nt sellist seadistust
auth_param negotiate program /usr/lib/squid3/negotiate_kerb_auth auth_param negotiate children 10 auth_param negotiate keep_alive on ... acl auth proxy_auth REQUIRED ... http_access allow auth
Tulemusena saab Kerberose piletiga kasutaja Firefox brauseriga kasutada veebi.
Kasulikud lisamaterjalid
Märkused
- kui on vajadus nn cache_dir kataloogistruktuuri tekitada, tuleb öelda
# squid -z
- Selleks, et nt päringu keha sisaldavad GET'id töötaksid sobib kasutada parameetrit request_entities
request_entities = on