Weekend Prosjekt: Oppsett Squid på Linux som et Caching Web Proxy

The Squid proxy-server kan fungere i mange roller – HTTP-akselerator, trafikk filter, nettverkslogger, etc. – men dens primære funksjon er å mellomlagre hyppig etterspurte nettressurs for å spare WAN båndbredde. En gjennomsiktig caching proxy kan fange opp og cache HTTP-trafikk for hele LAN, uten behov for å individuelt konfigurere hver nettleser. Fordi Squid har så mange alternativer, men du trenger for å sette den opp og teste den før du kaster den ut i et produksjonsmiljø – noe som gjør den til en perfekt helg prosjekt.

Den fugleperspektiv

Før du begynner, er det viktig å forstå at Squid kan cache HTTP-trafikk for hele LAN, men som ikke kan transparent cache TLS /SSL-tilkoblinger, IMAP, XMPP, og mange andre typer innhold. I de fleste tilfeller, disse er ikke tilkoblingstypene du vil vil
å cache for hele LAN, men husker det skal også hjelpe deg å unngå kostbare feil ved et uhell blokkerer denne annen trafikk.

Den nøyaktige oppsettet som kreves for ditt LAN vil avhenge av nettverkstopologi. Hvis du allerede har en maskin som fungerer som en gateway-ruter (kanskje til og med DHCP-server), dette er det logiske valget å konfigurere som Squid proxy. Men hvis den maskinen er en laveffekts dedikert router uten diskplass til å bruke som en cache, må du kanskje velge en annen maskin for å være proxy. I så fall må du konfigurere Squid riktig på proxy-maskin, og Selge konfigurere ruteren til å automatisk omdirigere HTTP trafikk fra LAN-klienter til proxy-serveren.

Til slutt, er det svært antydet at du kjører så nylig en versjon av Squid som mulig. Fordi pakken er levert av alle større Linux-distribusjoner, bør du ikke ha problemer med å få eller installere en up-to-date-pakken, men sjekk versjonsnummeret for å være sikker. Den nyeste utgaven er den 3.1.x-serien; versjoner av Squid før 2.6 brukt en betydelig annerledes sett med alternativer

Kjøre Proxy og ruter på samme maskin

Den enklere konfigurasjonen er funnet når Squid kjører på gateway maskinen.; i dette tilfellet alle LAN-klienter er allerede dirigere sin IP-trafikk til maskinen, fordi den er standard rute til resten av Internett. Maskinen kan inspisere pakker teksten, basert på kilde og destinasjon port.

Dermed å cache LAN kundenes trafikk, kan vi bruke Linux iptables pakkefilter å omdirigere HTTP trafikk hørt på LAN nettverksgrensesnittet til blekksprut, og konfigurere Squid å cache og fullmakts disse forespørslene på WAN nettverksgrensesnittet. Hvis eth0 er LAN grensesnitt og eth1 er WAN-grensesnittet, følgende iptables reglene vil utføre port omdirigering:

 iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j OMDIRIGER - -til-port 3128iptables -A INPUT -J GODTA -m state --state NEW, ETABLERT, RELATED -i eth0 -p tcp --dport 3128iptables -A OUTPUT -J GODTA -m state --state NEW, ETABLERT, RELATERT - o eth1 -p tcp --dport 80iptables -A INPUT -J GODTA -m state --state ETABLERT, knyttet -i eth1 -p tcp --Sport 80iptables -A OUTPUT -J GODTA -m state --state ETABLERT, RELATERT - o eth0 -p tcp --Sport 80 

Den første linjen videre LAN trafikk på TCP port 80 til Squid standard lytteporten, 3128. Den andre linjen godtar innkommende trafikk utpekt for port 3128, mens den tredje tillater utgående tilkoblinger på WAN grensesnitt bestemt for port 80 (dvs. ledet til ekstern webserver). Rekkefirer godtar innkommende WAN trafikk fra port 80, og sist men ikke minst, gjør linje five disse tilkoblingene som skal leveres på LAN-grensesnitt.

Den morsomme ting om iptables er at det er ofte mer enn én måte å oppnå det samme. Reglene ovenfor er ganske enkel; men du kan trenge ekstra konfigurasjon. Hvis du har et annet nettverkskort på LAN-siden (som " wlan0 " for en WiFi-kort), duplisere eth1 regler for wlan0 er grei. Men hvis du har flere LAN-grensesnitt (som ville være forventet på en ruter med innebygd Ethernet-svitsj), filtrere innkommende pakker av kilden IP-adresse er en bedre idé. Du kan gjøre det med iptables tl nat -A PREROUTING -s 192.168.1.0/24 -p tcp --dport 80 -j REDIRECT --to-port 3128 for å filtrere alle klienter i 192.168.1.x blokken.

For å konfigurere Squid selv, åpner opp sin konfigurasjonsfil /etc/squid/squid.conf. Først må du stille visible_hostname parameter til maskinens vertsnavn; uten denne Squid vil ikke starte. Deretter kan du se på http_access linje; det kan bli satt til å nekte alt. Du kan endre det slik at alt for testformål (eller hvis du bare stole på alle som noen gang vil være på nettverket), men for bedre sikkerhet bør du konsultere Squid dokumentasjon om å sette opp mer finkornet tilgangskontroll.
< p> Til slutt, er det på tide å gjøre det mulig gjennomsiktig caching. Nær toppen av squid.conf fil, vil du se en http_port linje, som som nevnt ovenfor er satt til port 3128 som standard. Slik slår du på gjennomsiktig caching, alt du trenger å gjøre er å legge ordet snappe til denne linjen. Deretter starter eller omstarter Squid fra kommandolinjen med tjenesten blekksprut restart.

Dette bør gi deg en fungerende cache, men du bør også lese squid.conf in-line dokumentasjon for å få et inntrykk av hvordan noen av de andre alternativene kan påvirke ytelsen. Spesielt bruker Squid /var /spool /squid /katalog som standard for bufret objekt lagring. Jo mindre plass du har tilgjengelig i /var /, jo verre ytelsen vil være, som objekter utløper før fra cache. På samme måte ønsker du å velge en fornuftig verdi for maximum_object_size og maximum_object_size_in_memory.

Kjøre Proxy og ruter på forskjellige maskiner

Hvis Squid tjenesten er ikke anbefale å kjøre på gateway maskin (og dermed på standard rute for IP-trafikk), så oppsettet blir mer komplisert på routing side. Du bør sette opp Squid serveren selv som før; bruke skjærings flagget i squid.conf.

På LAN standard router, men du må bruke et annet sett med iptables regler. Planen er å skrive LAN trafikk på vei mot en TCP 80 destinasjon port til Squid server, mindre
at trafikken stammer fra Squid serveren selv. På den måten Squid kan fortsatt gjøre forbindelser til omverdenen.

Som tilfellet var før, er det flere måter å gjøre dette med Linux pakkefiltrering funksjonalitet. En tilnærming som i eksempelet ovenfor (ved hjelp av " nat " tabell) kan se slik ut, på ruteren:

 iptables -t nat -A PREROUTING -i eth0 -s! 192.168.1.101 -p tcp --dport 80 -j DNAT --to 192.168.1.101:3128iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -d 192.168.1.100 j SNAT --to 192.168. 1.1iptables -A FORWARD -s 192.168.1.0/24 -d 192.168.1.101 -i eth0 -o eth0 -m state --state NEW, ETABLERT, RELATERT -p tcp --dport 3128 -j ACCEPTiptables -A FORWARD -d 192.168 .1.0 /24 -s 192.168.1.101 -i eth0 -o eth0 -m state --state ETABLERT, RELATERT -p tcp --Sport 3128 -J GODTA 

Her er eth0 igjen LAN-grensesnitt og eth1 WAN-grensesnittet . Squid kjører på 192.168.1.101, mens 192.168.1.1 er LAN inngangsport ruter. Linje én omdirigeringer HTTP-trafikk ikke ("! &Quot;) fra Squid serveren til Squid server på sin standard port 3128. Linje to tar omdirigert trafikken på vei ut
og utfører kilde Network Address Translation, slik at pakkene ser ut til å ha oppstått på selve ruteren. Linjer tre og fire bare fortelle ruteren til å tillate trafikk å passere uendret mellom Squid tjeneren og LAN-klienter.

En helt annen tilnærming er foreslått på den offisielle Squid prosjektet wiki, utnytte Linux iproute2 verktøyet. I denne metoden, kan du definere en spesiell rute for din proxy trafikken i /etc /iproute2 /rt_tables, for eksempel 222 squidtraffic, deretter definerer ruten med ip regel legge fwmark to bord squidtraffic; ip route add standard via 192.168.1.101 tabellen squidtraffic

Du deretter sette opp en iptables regel som ". Marks " LAN HTTP-trafikk med brannmur mark # 2 (valgt i ip regelen kommandoen, selve nummeret er et vilkårlig utvalg):

 iptables -t mangle -A PREROUTING -p tcp --dport 80 -s 192.168.1.101 -J ACCEPTiptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 80 -j MARK --set-mark 2iptables -t mangle -A PREROUTING -m mark --mark to j GODTA 

En fordel denne tilnærmingen er at den ikke er avhengig av Network Address Translation, så hvis du ikke bruker NAT, trenger du ikke å starte. På den annen side, betyr det delt konfigurasjonen opp i flere deler, som kan være forvirrende når du besøker konfigurasjonen åtte måneder senere, etter å ha glemt detaljene.

Gjør det Vedvarende, og litt ekstra Credit

Uansett hvilken tilnærming du tar, for å gjøre endringene overleve en omstart må du lagre iptables (og /eller ip) kommandoer i et skript som blir henrettet når nettverkskort er brakt opp av oppstartsprosessen. Hvordan best å gjøre som varierer litt etter fordeling. Ubuntu og Fedora, for eksempel bruke oppkomling, slik at du kan lagre skriptet med et meningsfullt navn i /etc /init /, selv om du må konfigureres det i henhold til oppkomlingen spesifikke regler. Opensuse og Debian-brukere kan bruke en mer tradisjonell skallskript format og lagre den i /etc/init.d/.

For en helt annen tilnærming til caching proxy problem, bør du vurdere å se på Web Cache Communication Protocol ( WCCP), som også støttes av Squid. WCCP ble utviklet av Cisco for bruk i store distribusjoner (med klynger av cacher og rutere), men for komplekse nettverk, kan det være enklere å vedlikeholde at flere uavhengige rutere hver med et annet sett med iptables regler.

Til slutt Hvis du allerede kjører Squid hell med en annen pakkefiltrering oppsett, vurdere å dele med andre lesere her. Mange av reglene avhenge sterkt på nettverket topologi og den versjonen av Squid blir brukt, så hvem vet – ditt eksempel kan hjelpe noen som arbeider på å støtte en lignende konfigurasjon. Dermed spare dem båndbredden som kreves for å jakte den ned på egenhånd. Anmeldelser