Squid

Allikas: Kuutõrvaja

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

Squid-1.gif

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

Lingid

https://wiki.itcollege.ee/index.php/Squid_transparent_proxy