5.2. Squid

Før du kan køre Squid optimalt, skal Squid installeres, sættes til at give danske fejlmeddelelser, tilrettes til jeres netværk, sikres mod misbrug, sættes til at bruge Sektornets proxy og startes.

5.2.1. Hvilket hardware kræver Squid?

Squid belaster ikke maskinens processor noget videre, til gengæld er mængden af RAM vigtig sammen med harddiskens og netkortets hastighed. Anbefalingen må altså lyde: Brug en ældre maskine med så meget RAM som muligt.

5.2.2. Installation af Squid

Squid kommer som RPM med Redhat (husk at se efter opdateringer).

Hvis du er logget ind på maskinen via konsollen (uden grafik), installeres pakken ved at stille dig i det bibliotek, hvor squid-2.3.STABLE*.i386.rpm ligger og skrive:

[root@gnuskole /root]# rpm -Uvh squid-2.3.STABLE*.i386.rpm

5.2.3. Ændring af sprog i Squid

Som standard skriver Squid sine fejlmeddelelser på engelsk, men sådan behøver det ikke at være. Der er nemlig et sæt danske fejlmeddelelser med i pakken. I biblioteket /etc/squid er der et symbolsk link ved navn errors. Det peger på /usr/lib/squid/errors/English/. Det eneste der skal til for at få dansk sprog er at ændre dette symbolske link til at pege på /usr/usr/lib/squid/errors/Danish/ i stedet.

Desværre slettes linket hver gang man opgraderer Squid, så du lærer nok følgende kommandoer.

Hvis du har åbnet den grafiske brugerflade X, kan du i filmanageren bare gå ind i /etc/squid og /usr/lib/squid/errors/ (så de er åbne i 2 forskellige vinduer), slette /etc/squid/errors, trække /usr/lib/squid/errors/Danish over i /etc/squid/errors, slippe, trykke på link, og så er linket der. Du skal så have ændret dets navn fra Danish til errors. Det gør du ved at højreklikke på linket > vælge indstillinger > ændre navnet til errors (små bogstaver).

Hokus pokus! Squid er dansk.

Hvis du står i konsollen (uden X), kan du også ændre det. Først skal vi have slettet det gamle link. Det gøres sådan:

[root@gnuskole /root]# rm /etc/squid/errors 
rm: remove `/etc/squid/errors'? y

Så skal vi have oprettet et nyt link (skrives i en linie):

[root@gnuskole /root]# ln -s /usr/lib/squid/errors/Danish/ /etc/squid/errors

Det var det! Lad være med at køre den sidste kommando flere gange, da den så laver et link i usr/lib/squid/errors/Danish/. Det gør ikke noget, at det er der, men det er da dumt at have det.

Du kan i øvrigt sagtens ændre på fejlmeddelelserne. De ligger i /usr/lib/squid/errors/Danish/ - og det er jo GNU/Linux du bruger :-) Lad dog være med at slette de variabler, der er (de starter med %).

5.2.4. Tilretning af squid.conf

Squid styres af en enkelt konfigurationsfil: squid.conf. Den ligger i /etc/squid biblioteket, hvis du har installeret Squid fra en af RedHats RPMer. For at få Squid til at køre skal denne tilrettes. Du skal åbne filen i en teksteditor fx Gedit, VI eller Emacs. Det vigtigste er, at teksteditoren IKKE OMBRYDER LANGE LINIER! Ombrydning medfører at Squid ikke virker. Personligt foretrækker jeg Gedit, som startes ved at skrive gedit i en xterm, men du må selv vælge.

squid.conf er meget godt dokumenteret, men det gør den også meget lang og lidt uoverskuelig. Linier, der starter med #, bliver ikke udført, fjern derfor # fra de ting du vil bruge. Squids forfattere anbefaler, at man lader # stå, hvis man vil bruge standardindstillingerne. Jeg vil her gennemgå de ændringer, jeg finder påkrævede, i den rækkefølge de kommer i filen. Jeg foreslår, at man læser den forklaring igennem, der står i squid.conf under de punkter, jeg beskriver.

Jeg har lavet en eksempelfil for Gnu Skole, som findes her. Den er tilrettet efter den Squid.screen der kommer med 2.3-stable2, men de ting vi skal bruge er identiske i 2.3-stable4.

Det første der kan/skal sættes, er den port andre maskiner skal bruge for at kontakte Squid.

# http_port 3128

Du kan ændre dette - og skal så fjerne #, og huske hvad du valgte når du skal til at sætte klienterne op.

På en skole har man ikke flere proxyservere, så det næste, der skal sættes er:

icp_port 0

"0" slår protokollen ICP fra. Dette har ikke noget at gøre noget at gøre med Sektornets proxyserver, da den ikke bruger protokollen ICP, men HTTP (se næste afsnit).

Så skal vi sætte Squid til at hente siderne fra Sektornets proxyserver. Det gøres med følgende linie:

cache_peer www-cache.sektornet.dk parent 3128 7 no-query

Forklaringen på, hvad de enkelte dele betyder, kan findes i screen-filen, men denne linie virker, fordi Sektornets proxyserver bruger HTTP-protokollen på port 3128.

Det næste er kun relevant, hvis I har jeres hjemmeside liggende på en webserver på skolens lokalnet. Hvis i bruger et webhotel, skal linien bare springes over. For at undgå, at Squid spørger Sektornets proxyserver om jeres egne hjemmesider, kan man med et ! bede Squid om at hente sider i et bestemt domæne direkte:

cache_peer_domain www-cache.sektornet.dk !gnuskole.dk

Byt gnuskole.dk ud med jeres domæne: xxx.dk

De næste linier bevirker, at indhold i databaseforespørgsler og cgi-scripts ikke gemmes.

acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY

Dette er en god idé, da fortrolige oplysninger som fx adgangskoder ellers kunne ligge i Squids lager og potentielt læses af uvedkommende. Luk dette sikkerhedshul.

Så kommer vi til en af de vigtige linier. Hvor meget RAM må Squid bruge? Det angives sådan:

cache_mem  48 MB

Hvor højt denne værdi sættes afhænger af hvor meget RAM maskinen har og hvad maskinen i øvrigt bruges til. Sæt den så højt det er muligt, uden at maskinen begynder at "swappe". Prøv dig frem, og dig frem, og vær opmærksom på, at Squid i praksis bruger mere RAM end der står her! Grunden til at cache_mem skal stå højt er, at Squid henter siderne meget hurtigere fra RAM end hvis den skal læse dem på harddisken. Hvis siderne imidlertid er gemt på swap-disken, er man lige vidt - de skal stadig læses på harddisken.

Det næste er ikke helt så vigtigt. Men Squid står til kun at gemme filer under 4 MB. Hvis man ønsker at hæve denne værdi, kan det gøres gøres med:

maximum_object_size 12 MB

Skriv din egen max. værdi. Det ville jo være surt at skulle hente den samme store fil flere gange.

Så kommer der igen noget vigtigt. Du skal beslutte hvor på harddisken Squid skal gemme de dokumenter, den ikke kan have i RAM, hvor meget diskplads Squid må bruge og hvordan filstrukturen skal være:

cache_dir ufs /var/spool/squid 600 16 256

RedHat foreslår, som det ses, at gemme filerne i /var/spool/squid. Hvis du har compileret Squid selv står der noget andet. Du kan ændre biblioteksnavnet, oprette det nye bibliotek og køre ./squid -z , så opretter Squid filerne det nye sted. Efter biblioteksnavnet skal du skrive hvor meget plads Squid maksimalt må bruge til midlertidig opbevaring af filer. Jeg har skrevet 600 (underforstået MB), for så meget plads har jeg sat af til Squid. Hvor meget du sætter af, afhænger af hvor mange maskiner, der bruger din proxyserver. De to sidste tal bestemmer hvor mange filer, der skal oprettes i henholdsvist 1. og 2. niveau. Jeg har ladet tallene være uændrede, det giver plads til 4096 filer.

Enhver ansvarlig serveradministrator har sine log-filer. Det næste er at finde ud af, hvad du vil logge og hvor log-filerne skal ligge. Squid har en lang række muligheder for hvad man kan holde øje med (se selve filen). Jeg foreslår, at du slår følgende 2 til:

cache_access_log /var/log/squid/access.log

Den gemmer oplysninger om alle forespørgsler. Så kan du altid se hvem der har hentet hvad hvornår. Denne fil er god at have i tilfælde af, at der er begået ulovligheder inde fra dit netværk.

cache_log /var/log/squid/cache.log

Den holder øje med hvordan Squid har det, og er god at have i tilfælde af, at Squid ikke virker efter hensigten.

Det næste vi skal i gang med er at forhindre misbrug af Squid udefra.

- Kan det ikke være ligemeget?
- NEJ, ikke hvis det er en cracker der bruger dig til at skjule sit spor!
- Er det svært?
- Lidt, men hold tungen lige i munden så går det.

Vi skal et godt stykke ned i filen og finde afsnittet om ACL.

# ACCESS CONTROLS
# ----------------------------------------------------------------

Det første afsnit slutter med linien:

acl CONNECT method CONNECT

Efter den kan du definere hvilke IP-adresser, der må få adgang til Squid. Heldigvis kan man give hele netværk adgang på en gang ved at bruge den såkaldte netværksadresse. Det er den allerførste adresse i netværket (lige før routerens adresse). Skriv som følger:

acl allowed_hosts src Din netværksadresse/Din subnetmask

Hvis du har flere subnet, fx både et administrativt segment og et undervisningssegment, skriver du bare flere linier under hinanden med de forskellige nets IP-adresser. Nu har du defineret hvilke maskiner der er allowed_hosts.

For at give dine maskiner lov at bruge proxyserveren og udelukke alle andre, skal du bare indsætte 1 linie mere! I det næste afsnit:

#  TAG: http_access

Skal du allersidst indsætte denne linie:

http_access allow allowed_hosts

Så er den potte ude! Var det så svært?

Det næste er at skrive din e-mailadresse:

cache_mgr NØRD@gnuskole.dk

Den dukker op i fejlmeddelelser, så husk at skrive den korrekt.

Det sidste, som måske logisk burde være det første, er at skrive hvilket maskinnavn Squid kører under. Navnet kommer til at optræde i fejlmeddelelser og fillister.

visible_hostname www-cache.gnuskole.dk

Din maskine kan jo sagtens have mange navne fx www.xx.dk, mail.xx.dk og www-cache.xx.dk, og mon ikke dine brugere bliver forvirrede over, at proxyen sender fejlmeddelelser fra mailserveren?!

Der er mange andre ting, der kan ændres i Squid. Og Squid kan tilpasses alle mulige specielle netværk og funktioner. Men for en skole på Sektornet tror jeg dette rækker, sammen med Squids forudindstillinger.

5.2.5. Fjern reklamer med Sleezeball

Mange internettjenester, fx søgemaskinerne Jubii, Altavista og Kvasir, financieres via reklamer. Det kan man mene om hvad man vil, men det har den uheldige konsekvens, at eleverne gang på gang skal sidde og vente på at få downloadet grafikfiler, som de ikke skal bruge til noget. Det spilder undervisningstid og belaster skolens begrænsede båndbredde. Heldigvis er der folk i Linux-samfundet, der har fundet løsninger på dette problem. Programmet Sleezeball er en udvidelse til Squid, der kan sættes til at erstatte billeder fra selvvalgte adresser med en transparent gif-fil på 1x1 pixel. Det kan spare meget nettrafik!

Først skal Sleezeball hentes på http://fredrik.rambris.com/sleezeball/. Den findes oven i købet som RPM. Hent den og installer den med:

[root@gnuskole /root]# rpm -Uvh sleezeball-0.6-1.i386.rpm

Under installationen oprettede RPM'en en fil ved navn /etc/squid/sleezeball.conf. I filen skal du tjekke, at linien

REDIRECT_URL=http://www-cache.gnuskole.dk:3128/squid-internal-static/icons/banner.gif

er korrekt. URL'en frem til :3128 skal være det fulde DNS-navn eller IP-adressen på den server, Squid kører på.

Når du har gjort det skal du ind i /etc/squid/squid.conf for at få Squid til at bruge Sleezeball. Find linien (ved at søge efter den):

#  TAG: redirect_program 

Sæt en ny linie ind, der ser sådan ud:

redirect_program /usr/lib/squid/sleezeball 

og fjern # foran næste tag:

redirect_children 20 

Nu kunne Squid genstartes, og det ville virke, men gå lige ind og tilret de ting, der skal filtreres fra. Indstillingerne findes i filen /etc/squid/sleezeball.definitions. Åbn den i en teksteditor og indsæt de adresser, du vil filtrere fra, som ekstra linier. Personligt har jeg indsat linien:

netgravity.jubii.dk

da det fjerner reklamerne fra Jubii som vores elever bruger meget.

Nu kan Squid genstartes med:

[root@gnuskole /root]# /etc/rc.d/init.d/squid restart

Du kan altid senere tilføje eller slette ting, du vil filtrere fra. Men hver gang du har ændret i /etc/squid/sleezeball.definitions, skal Sleezeball genlæse definitionsfilen. Dette gøres med kommandoen

[root@gnuskole /root]# /usr/sbin/reloadszb

5.2.6. Start af Squid

Nu er der så bare tilbage at starte Squid:

[root@gnuskole /root]# /etc/init.d/squid start
Starting Squid: squid

Hvis der er problemer, så ret i squid.conf og kør:

[root@gnuskole /root]# /etc/init.d/squid restart
Stopping Squid: done
Starting Squid: squid

Denne kommando skal du i det hele taget bruge hver gang du har ændret i squid.conf.

Der kan også være problemer med filrettighederne. Brugeren Squid skal eje filerne i/var/log/squid/ og /var/spool/squid/ (Hvis man bruger Red Hats standardopsætning). Hvis squid ikke ejer disse filer, så kør:

[root@gnuskole /root]# chown squid.squid /var/spool/squid/*
[root@gnuskole /root]# chown squid.squid /var/log/squid/*

Jeg har sommetider været ude for at squid er "løbet fuld" efter at jeg er begyndt at bruge Sleezeball. Jeg har løst det ved at lade Squid genstarte hver nat.

Opret filen /etc/cron.daily/genstartsquid.sh med følgende indhold:

#!/bin/sh
/etc/init.d/squid restart

Gør den eksekverbar med:

[root@gnuskole /root]# chmod ug+x /etc/cron.daily/genstartsquid.sh

5.2.7. Squid som en del af en firewall

En af de gode ting ved Squid er, at den kan bruges til at lade internettrafik passere en firewall, hvis Squid er installeret på firewallmaskinen. En firewall er en computer med 2 netkort: et netkort, der er tilsluttet skolens internens interne netværk, og et, der er tilsluttet skolens internetrouter. Hvordan man sætter denne maskine op til at fungere som firewall, er beskrevet i et andet kapitel (Kapitel 11).

For at få Squid til at indgå i firewallen, skal der kun laves ændringer 2 steder i begyndelsen af squid.conf. Før du starter, skal du være 100% sikker på hvilken IP-adresse det netkort, der vender ind mod dit interne netværk har (dit indgående IP-nummer) og hvilken IP-adresse det netkort, der vender ud mod internettet har (dit udgående IP-nummer).

Har du tjek på det? Godt så lad os komme igang:

Åbn squid.conf i en teksteditor.

Først i filen finder du:

http_port 3128

Her skal du indsætte IP-nummeret på det netkort, der vender ind mod lokalnetværket - altså det indgående IP-nummer:

http_port X.X.X.X:3128

Hvis du har fået lavet en selvstændig DNS registrering af dette netkort hos supportcenteret kan du skrive dette navn i stedet for

http_port intern.gnuskole.dk:3128

Så skal du en lille smule længere ned i filen og finde:

# tcp_outgoing_address 0.0.0.0

Her skal du skrive IP-nummeret på det netkort, der vender ud mod internettet - altså det udgående IP-nummer, og fjerne havelågen #:

tcp_outgoing_address x.x.x.x

Om man også kan bruge et DNS navn her, ved jeg ikke.

Denne opsætning er meget fin, hvis man har alle de maskiner, der skal bruge proxyserveren bag firewallen. Men hvad nu hvis man gerne vil have at administratioinistrationens maskiner også skal kunne bruge denne proxyserver? Hvis der er maskiner udenfor firewallen, der skal bruge proxyserveren, skal man ikke skrive sit indgående IP-nummer, men lade den oprindelige linie stå:

http_port 3128

I dette tilfælde er det dog ekstra vigtigt at sætte

tcp_outgoing_address

, da det interne netværk ellers er åbent gennem proxyserveren!