transparenter squid unter netbsd 1.6.1

[moR-pH-euS]

Magnum P.I.
Mit diesem How-To wird ein Transparenter Proxy/Squid unter NetBSD 1.6.1-RELEASE
eingerichtet;

Das How-To ist darauf ausgerichtet, das der NetBSD-Server auf dem der Squid
laeuft euer (dsl-)router nach draussen ist;
wenn ihr punkt 4 (auswertung der access.log) auch durchfuehren wollt braucht
ihr noch einen apache oder sonstigen webserver da die auswertung der squid-log
files ein html-file erzeugt;


==================================================
==================================================
===================== TOC ========================

1. Vorraussetzungen

1.1 Software

1.2 Hardware

2. Was ist ein Transparenter Proxy ?

3. Squid

3.1 Installieren des Squids

3.2 Konfigurieren der squid.conf

3.3 Anpassen der Directory-Zugriffsrechte

3.4 Testen des Squids

4. Auswertung der access.log

4.1 Installation von zlib

4.2 Installation von libpng

4.3 Installation von libgd

4.4 Installation von webalizer

5. Erweiterungen fuer die squid.conf

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


1. Vorraussetzungen


1.1 Das brauchen wir an Software:
die versionen die ich benutze waren zu diesem
zeitpunkt die neuesten, was nicht heissen muss das es auch die neuesten sind;
deswegen gebe ich keine absoluten pfade zu den dateien an, sonder nur
zum download-verzeichniss der website da sich die versionen der software oft
aendern und der link dann unbrauchbar ist:

squid-2.5.STABLE3 => unser proxy => http://www.squid-cache.org/Versions/

zlib-1.1.4 => die zlib library, wird von png benoetigt
=> http://www.gzip.org/zlib/

libpng-1.2.5 => die png library => http://www.libpng.org/pub/png/libpng.html

gd-1.8.4.tar => graphic library die dynmaisch images erzeugt, brauchen wir um die logfi
les
des squids auszuwerten => http://www.boutell.com/gd/

webalizer-2.01-10 => tool das aus der acces.log des proxys eine html-datei mit
statistiken und grafiken erstellt => http://www.webalizer.com/download.html


1.2 Hardware:
Das kommt auf die Anzahl der Clients an die gleichzeitig bei euch surfen;
dazu gibt es folgende rechnung mit denen ihr die requests per second rausfinden
koennt die eure festplatte schafft:
requests per second = 1000/10ms
requests per second = 100
d.h. eine festplatte mit einer zugriffszeit von 10ms koennte theoretisch
100 requests in einer sekunde abfertigen (so die theorie);
natuerlich gibt es dann noch den faktor cpu, speicher und den durchsatz
des systems;
mit einem pentium 133 kann man ca. 7 requests per second abarbeiten;
wichtig fuer die performance eines caches ist dabei mehr die groesse des speichers
damit mehr daten im speicher gespeicher werden koennen und festplatten-
durchsatz als cpu-power; multiprozessor systeme sind fuer einen cache
meist nicht sinnvoll, da sie meisst nicht den flaschenhals darstellen;
ein raid-system dagegen kann die performance eines proxys schon
dramatisch steigern;
in meinem lan kommen 4 clients via proxy ohne probleme nach draussen
auf meinem pentium 90 mit 48mb ram und 1gb hd...
natuerlich solltet ihr auch die groesse der festplatte in betracht ziehen;
wenn ihr 500mb fuer den cache des proxys bereitstellt und am tag einen
webtraffic von 10mb verursacht, kann der cache fuer 50tage vorhalten;
die objekte die der cache vorhaelt fliegen dabei in der reihenfolge
wieder raus in der sie reingekommen sind, also chronologisch...


2. was ist ein transparenter proxy ?

transparenter proxy heisst das die clients bzw. user im lan gar nicht mitbekommen das
sie ueber einen proxy ins internet gehen; d.h. es muessen bei den clients keine
einstellungen im browser gemacht werden, da durch eine redirect regel in der
ipnat.conf transparent eine weiterleitung auf den proxy laeuft; das gilt aber in diesem
beispiel nur fuer port 80; den rest an ports und diensten muss man dann mit ipfilter
abfangen bzw. sperren oder oeffnen, je nachdem was der client darf oder nicht;
die daten der requests der clients werden dabei in den cache des proxys geschrieben
und nachdem eine seite im cache gelandet ist, wird sie nur noch vom cache aus
aufgerufen, ausser man aktualisiert sie;


3. Squid

3.1 Installation des Squid

zuerst entpacken wir den squid und gehen in das directory:

#tar xfvz squid-2.5.STABLE3.tar.gz

#cd squid-2.5.STABLE3

nun muessen wir den source kompilieren, installieren und vorher noch configure
ausfuehren (mit ./configure --help seht ihr alle verfuegbaren optionen von configure)

#./configure --enable-ipf-transparent

wichtig ist die option --enable-ipf-transparent, damit wird die ipf unterstuetzung
in den squid mitaufgenommen, was spaeter die vorraussetzung fuer dessen transparenz ist
;

#make all

jetzt wird es anhand von den informationen des configure scripts kompiliert;

#make install

nun werden die kompilierten binaries installiert;

jetzt erstellen wir noch einen user squid und eine gruppe squid unter der der proxy
spaeter lauft;

#useradd -p squid squid

#groupadd squid



3.2 Konfigurieren der squid.conf

wenden wir uns nun, nachdem der squid erfolgreich kompiliert hat, zuerst dem
konfigurations-file des proxy zu; das config file des squid (die squid.conf) findet
ihr jetzt (wenn ihr keinen anderen prefix beim configure angeben habt) unter
/usr/local/squid/etc;
in diesem file legt ihr z.B. fest:,
den port des squids, das logile-format und das wichtigste: die acl's
(access control lists) mit denen ihr erlauben koennt wer nach draussen kommt
oder z.B. den download von .mp3 oder anderen multimedialen inhalten verbieten koennt;
konfigurieren wir erstmal das noetigste um den squid zu starten und gehen dann ins
detail;
die punkte die ich jetzt bespreche kommen auch in dieser reihenfolge in der squid.conf
vor;
zuerst legen wir den port des squid's fest, dabei koennt ihr den default-port (3128)
lassen und ihn lediglich um 8080 erweitern (oder auf sonst einen port > 1024) oder
ihr aendert ihn komplett auf 8080, was ja ein quasi-standard-port fuer proxys
mittlerweile geworden ist:

http_port 8080

dann geben wir noch unsere e-mail an, die bei einem 403-forbidden angezeigt wird

cache_mgr foo@foobar.org

den user aendern wir noch ab auf user sqiud und group squid

cache_effective_user squid
cache_effective_group squid

das machen wir deswegen da squid beim start als root gestartet wird und dann durch
diese option auf den user squid in der gruppe squid wechselt und dadurch nur noch
rechte auf das squid verzeichniss hat;
nun erstellen wir noch eine acl in der squid.conf damit wir nach draussen kommen
ueber den router:

#Recommended minimum configuration:
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
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
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

#eure ip-range darf ueber den proxy surfen
acl NETZ src 192.168.232.0/24

http_access allow NETZ
http_access deny all

wir machen hier erstmal eine einfache acl um zu testen ob der proxy euch
ueberhaupt transparent rauslaesst.


3.3 Anpassen der Directory-Zugriffsrechte

nachdem squid nun installiert ist und in der squid.conf die wichtigsten einstellungen
gemacht wurden fuers erste, muessen wir noch ein paar aenderungen an den zugriffsrechte
n
im squid-directory durchfuehren; da squid ja nun aus sicherheitsgruenden nach dem start
als user squid in der gruppe squid laeuft und nicht als root;

#chown root:wheel /usr/local/squid/

#chmod 755 /usr/local/squid/

#cd /usr/local/squid/bin

#chown root:wheel . && chown root:wheel *

#chmod 755 . *

#cd /usr/local/squid/etc

#chmod 775 .

#chown root:wheel . *

#chown squid:squid /usr/local/squid/var/logs

#chmod 770 /usr/local/squid/var/logs

erstellen wir nun das cache directory

#mkdir /usr/local/squid/cache

und setzen noch die richtigen rechte

#chown squid:squid /usr/local/squid/cache

#chmod 770 /usr/local/squid/cache

nachdem nun die rechte gesetzt sind koennen wir das cache-directory nun mit den ganzen
ordnern die squid braucht fuellen; das wird autmomatisch erzeugt mit

#/usr/local/squid/sbin/squid -z

das dauert dann ein paar minuten bis alle directorys und subdirectorys erstellt wurden;
falls es nicht funktioniert sind die permissions wohl falsch gesetzt im cache directory
;
ueberprueft auch ob /usr/local fuer jeden lesbar und ausfuehrbar ist;
das es quasi so aussieht:

richtig:

cache1:~ # ls -ld /usr/local/
drwxr-xr-x 10 root root 1024 May 1 10:31 /usr/local/

falsch:

cache1:~ # ls -ld /usr/local/
drwxr-x--- 10 root root 1024 May 1 10:31 /usr/local/


3.4 Testen des Squids

nachdem nun hoffentlich alles erfolgreich war koennen wir den squid testen;


#/usr/local/squid/sbin/squid -N -d 1 -D

mit dieser syntax nach dem squid commando bekommt ihr den kompletten output der
normalerweise in die /usr/local/squid/var/logs/cache.log geschrieben wird (wichtig zu
wissen wenn euer squid mal nicht richtig starten sollte, da die fehler weswegen er nicht
startet dann in dieses logfile geschrieben werden)

bei mir sieht das ganze dann so aus:

root@netbsd# /usr/local/squid/sbin/squid -N -d 1 -D
2003/10/30 10:08:42| Starting Squid Cache version 2.5.STABLE3 for i386-unknown-netbsdel
f1.6.1...
2003/10/30 10:08:42| Process ID 26701
2003/10/30 10:08:42| With 1772 file descriptors available
2003/10/30 10:08:42| DNS Socket created at 0.0.0.0, port 64628, FD 4
2003/10/30 10:08:42| Adding nameserver 194.152.64.35 from /etc/resolv.conf
2003/10/30 10:08:42| Unlinkd pipe opened on FD 9
2003/10/30 10:08:42| Swap maxSize 102400 KB, estimated 7876 objects
2003/10/30 10:08:42| Target number of buckets: 393
2003/10/30 10:08:42| Using 8192 Store buckets
2003/10/30 10:08:42| Max Mem size: 8192 KB
2003/10/30 10:08:42| Max Swap size: 102400 KB
2003/10/30 10:08:42| Rebuilding storage in /usr/local/squid/var/cache (DIRTY)
2003/10/30 10:08:42| Using Least Load store dir selection
2003/10/30 10:08:42| Set Current Directory to /usr/local/squid/var/cache
2003/10/30 10:08:42| Loaded Icons.
2003/10/30 10:08:42| Accepting HTTP connections at 0.0.0.0, port 8080, FD 10.
2003/10/30 10:08:42| Accepting ICP messages at 0.0.0.0, port 3130, FD 11.
2003/10/30 10:08:42| WCCP Disabled.
2003/10/30 10:08:42| Ready to serve requests.
2003/10/30 10:08:58| Done scanning /usr/local/squid/var/cache swaplog (0 entries)
2003/10/30 10:08:58| Finished rebuilding storage from disk.
2003/10/30 10:08:58| 0 Entries scanned
2003/10/30 10:08:58| 0 Invalid entries.
2003/10/30 10:08:58| 0 With invalid flags.
2003/10/30 10:08:58| 0 Objects loaded.
2003/10/30 10:08:58| 0 Objects expired.
2003/10/30 10:08:58| 0 Objects cancelled.
2003/10/30 10:08:58| 0 Duplicate URLs purged.
2003/10/30 10:08:58| 0 Swapfile clashes avoided.
2003/10/30 10:08:58| Took 15.9 seconds ( 0.0 objects/sec).
2003/10/30 10:08:58| Beginning Validation Procedure
2003/10/30 10:08:58| Completed Validation Procedure
2003/10/30 10:08:58| Validated 0 Entries
2003/10/30 10:08:58| store_swap_size = 0k
2003/10/30 10:08:59| storeLateRelease: released 0 objects


nachdem der squid nun gestartet ist, machen wir in einem anderen
terminal einen test ob der squid auch wirklich laueft. Dazu benutzen
wir das squidclient programm. gleichzeitig oeffnen wir noch ein terminal
und geben folgendes ein:

#tail -f /usr/local/squid/var/logs/access.log

jetzt wird die access.log datei "live" ausgeben, d.h. sobald etwas hinein-
geschrieben wird, wird es auf der konsole ausgeben;
jetzt geben wir in einem anderen terminal ein:

#/usr/local/squid/bin/squidclient -h 192.168.1.1 -p 8080 http://www.google.de

mit der -h option gebt ihr die ip (oder den dns-namen) eures proxy's an
und mit -p den port (den wir ja in der squid.conf eingestellt haben);
ihr solltet nun auf dem terminal den quelltext von google bekommen.
gleichzeitig sollte ein eintrag, aehnlich diesem

1067506023.233 422 192.168.1.1 TCP_MISS/200 3477 GET http://www.google.de - DIRECT/6
6.102.11.99 text/html

das erste feld gibt dabei die unix-zeit an, hier 1067506023.233

das zweite die zeit in milisekunden fuer den request, also die zeit
zwischen dem accept() und close() des client sockets, hier 422

das dritte feld ist die client-ip, hier 192.168.1.1

das vierte feld stellt dar wie der request behandelt wurde, in diesem fall
TCP_MISS was bedeutet das das objekt nicht im cache war, bei TCP_HIT waere
es im cache gewesen;
zusaetzlich besteht das vierte feld noch aus dem http antwort code der aus
dem http antwort header ausgelesen wird, hier 200

das fuenfte feld ist die groesse, bei tcp ist es die menge an daten die
zum client geschrieben werden, bei udp ist es die groesse des requests
(in bytes), hier 3477

das sechste feld stellt die http-methode dar (also GET, POST etc.), hier GET

Das siebte feld ist die ziel-url die der client anfordert, hier http://www.google.de

das achte feld ist immer das -, ausser man setzt ident_lookup auf on in der
squid.conf, siehe auch RFC 931

das vorletzte feld beschreibt wie und wo das angeforderte objekt geholt wurde,
hier DIRECT
zuzaetzlich erfaehrt man von wo die antwort kam, hier 66.102.11.99

im letzten feld erfaehrt man den content-type des objektes, der auch aus dem
http antwort header ausgelesen wird, hier text/html

nachdem wir nun einen, hoffentlich erfolgreichen, test mit dem squid
hinter uns haben, starten wir ihn nun richtig und konfigurieren ihn noch fertig
zum transparente proxy fuer das lan;
zuerst edititeren wir die /etc/ipnat.conf und haengen folgende zeile an

rdr tlp0 0.0.0.0/0 port 80 -> 127.0.0.1 port 8080

wobei tlp0 das interne interface ist;
das netzwerk muss auch neugestartet werden nach der aenderung in der
/etc/ipnat.conf

# /etc/rc.d/network restart

jetzt starten wir den proxy richtig

#/usr/local/squid/sbin/squid

dann schauen wir ob er auch wirklich laueft

# ps -aux | grep squid
squid 26756 27.3 13.7 4928 5548 ?? D 10:54AM 0:01.34 (squid) (squid)
squid 26757 1.1 1.1 16 444 ?? Ss 10:54AM 0:00.06 (unlinkd) (unlinkd
root 26759 2.0 1.2 160 496 p0 S+ 10:54AM 0:00.05 grep squid
root 26754 0.0 2.3 1780 944 ?? Ss 10:54AM 0:00.03 /usr/local/squid/s

sollte ungefaehr so aussehen...

nun wieder ein

#tail -f /usr/local/squid/var/logs/access.log

in einem terminal laufen lassen
folgende optionen muessen noch auf "on" gesetzt werden:
befinden sich alle ziemlich am ende des config-files

httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on

nachdem wir die optionen in der squid.conf gesetzt haben, noch ein

#/usr/local/squid/sbin/squid -k reconfigure

damit die aenderungen in der squid.conf beruecksichtigt werden.

jetzt geben wir in einem browser bei einem rechner in deinem lan
z.B. www.netbsd.org ein

jetzt sollten alle rechner die laut acl's zugriff auf den proxy haben,
transparent auf localhost:8080 umgeleitet werden was wir anhand der
access.log ja auch auch ueberpruefen koennen.



4. Auswertung der Access.log

In 1.1 habe ich bereits geschrieben wo ihr folgende software pakete bekommt

4.1 Installation von zlib

zuerst entpacken wir das archiv:

morpheus@netbsd# tar xfvz zlib-1.1.4.tar.gz

und wechseln in das verzeichniss

morpheus@netbsd# cd zlib-1.1.4

nun zuerst ein ./configure, dann ein make test, und make install
und schon ist die zlib installiert.

4.2 Installation von libpng

libpng muss im gleichen directory-tree wie zlib entpackt werden;
damit meine ich das es so aussieht:

/home/morpheus/zlib-1.1.4/

und

/home/morpheus/libpng-1.2.5/

also wieder entpacken und in das verzeichniss wechseln; bei libpng
ist das makefile im scripts ordner, da es fuer verschieden bertriebs-
system verschieden makefiles gibt; also kopieren wir das netbsd makefile
in den hauptordner

morpheus@netbsd# cp scripts/makefile.netbsd makefile

nun noch ein make test, dabei ist es wichtig das beim output
PASS (9782 zero samples)
kommt;
und noch ein make install damit die libraries installiert werden;

4.3 Installation von libgd

gd-1.8.4 entpacken, in das verzeichniss wechseln und das Makefile erstmal
editieren:
wir aendern zwei variablen:

INCLUDEDIRS=-I. -I/usr/include/freetype2 -I/usr/include/X11 -I/usr/X11R6/include/X1
1 -I/usr/local/include
auf das aendern:
INCLUDEDIRS=-I. -I/usr/include/freetype2 -I/usr/pkg/include -I/usr/pkg/lib

LIBDIRS=-L. -L/usr/local/lib -L/usr/lib/X11 -L/usr/X11R6/lib
auf das aendern
LIBDIRS=-L. -L/usr/local/lib -L/usr/pkgsrc/graphics/png
/work/libpng-1.2.5/ -L/usr/pkg/lib -L/usr/pkg/include

die variablen muessen immer aus einer zeile bestehen, ansonsten bricht er das
kompilieren ab; dann gd noch kompilieren mit make und installieren mit make install;


4.4 Installation von webalizer

wieder webalizer entpacken und in das verzeichniss wechseln;
dann

morpheus@netbsd# ./configure --with-language=german --with-png=/usr/local/lib

ich musste noch explizit die png-library angeben, da er sie beim configure
nicht gefunden hat; dann noch ein make und make install und webalizer ist
installiert; darueberhinaus hat er noch eine webalizer.conf.sample unter /etc
abgelegt, die wir noch editieren muessen:
es reicht wenn ihr diese drei optionen der webalizer.conf aendert:
(natuerlich muesst ihr noch den namen von webalizer.conf.sample auf webalizer.conf
aendern im /etc verzeichniss)

LogFile /usr/local/squid/var/logs/access_log

LogType squid

OutputDir /usr/local/www/htdocs/webalizer

die anderen optionen sind im config-file alle erklaert; wenn ihr noch mehr
aendern wollt;

nun kopieren wir noch die access.log

cp /usr/local/squid/var/logs/access.log /usr/local/squid/var/logs/access_log

und koennen nun den webalizer starten

morpheus@netbsd# webalizer

jetzt hat er die html-seiten unter /usr/local/www/htdocs/webalizer abgelegt
und koennen uns die statistiken nun in einem browser ansehen;



5. Erweiterungen fuer die squid.conf

hier noch ein paar beispiele die ich noch in mein squid.conf eingefuegt
habe:

#machen domains werden gespert...
acl DOMAIN url_regex "/usr/local/squid/blacklist/blacklists"

in diesem blacklist-file sind domains die ihr sperren koennt;
wenn ihr hier z.B. www.spiegel.de einfuegt kann keiner mehr auf spiegel.de...
eine blacklist-liste bekommt ihr unter http://www.squidguard.org/
squidgard ist ein tool mit dem ihr die squid.conf auch anpassen koennt,
habe ich allerdings noch nie probiert...


#mp3, avi und alles was sonst noch spass macht wird gesperrt... ;-)
acl MULTIMEDIA url_regex -i \.(afx|asf|au|avi|divx|m3u|mov|mp2|mp3|mpeg|mpg|qt|ra|ram|r
m|viv|vivo|vob|vqf|wav|wma|wmv|vbs|shs|pif)($|\?)

innerhalb der acl's koennt ihr auch regular expressions anwenden, so das ihr
damit alle dateiendungen sperren konntet; mit dieser regular expression
werden ziemlich viele mutimedia-erweiterungen gesperrt, d.h. kein online-radio
mp3's, avi's etc. man kann sie nicht mehr herunterladen und abspielen;

das muesst ihr spaeter natuerlich alles noch im config-file angeben das
diese acl's gesperrt werden;

http_access deny DOMAIN
http_access deny MULTIMEDIA


ich hoffe das alles genauso gut funktioniert wie bei mir, bei fehlern und falschen
zusammenhaengen schreibt mir bitte eine e-mail:
mor-ph-eus at bsdforen dot org


quellen:

http://www.netbsd.org

http://squid-docs.sourceforge.net/latest/html/book1.html

http://www.unixcircle.com/ipf/ipf-howto.html

http://www.squidguard.org/

http://www.webalizer.com/faq.html
 
Zuletzt bearbeitet:
Zurück
Oben