Uživatelské nástroje

Nástroje pro tento web


Squid v transparentním módu

Ukázali jsme si, jak nastavit squid. Toto nastavení ale má jeden drobný problém. Vyžaduje nastavení v každém prohlížeči. To může být u více prohlížečů zbytečně mnoho práce. Navíc, ochuzené prohlížeče na tabletech a telefonech často ani možnost proxy nastavit neposkytují. Je však možné nastavit squid jako takzvanou transparentní proxy. Jednoduše si průchozí spojení ukradne.

Nevýhody

Než začneme, je třeba zmínit, že tento přístup má několik nevýhod.

První z nich je morální hledisko. V případě, kdy si uživatel nastavil prohlížeč, aby použil proxy, dělá tak vědomě. V tomto nastavení mu proxy může do komunikace nahlížet bez jeho vědomí. Pokud se jedná o domácí síť, kde jsou všichni uživatelé informováni, problém není. V případě veřejných míst a veřejných sítí je však tato věc značně diskutabilní.

Druhým problémem je čistě technická otázka. Přestože se mód proxy jmenuje transparentní, komunikaci mění. Pokud by se všechny webové aplikace chovaly dle standardu HTTP, k žádným problémům by nedocházelo. V praxi se ovšem vyskytují stránky, které se k proxy chovají nekorektně a například zobrazují zastaralý, již nacachovaný obsah, nebo mohou ukázat nacachovaná data některého jiného uživatele. V případě proxy nastavené v prohlížeči lze buď proxy na chvíli vypnout, nebo prohlížeč požádat o plné obnovení (obvykle CTRL+F5). Toto však u transparentní proxy nejde, protože o ní prohlížeč neví.

Nastavení

Na straně squidu je třeba povolit některý další port, který bude mít speciální mód intercept. Je lepší přidat nový port, jednak proto, aby bylo možné prohlížeče nakonfigurovat explicitně a vyhnout se tak některým problémům s transparentní proxy, jednak proto že některé funkce u portu v módu intercept nelze použít nebo jsou problematické. Do /etc/squid/squid.conf tedy přidáme:

http_port 3129 intercept

Novější verze squid podporují i podobný mód, nazvaný tproxy. Ten je v mnohých ohledech lepší, než intercept. Bohužel, na OpenWRT v tomto módu squid neumí pracovat ‒ ze zatím nezjištěných důvodů spojení na takovém portu okamžitě zavírá.

Tato část však pouze instruuje squid, že má přijímat spojení, která mu nepatří. Nyní ale potřebujeme zařídit, aby se k němu tato spojení dostala. K tomu použijeme firewall.

Za předpokladu, že všechna síťová připojení do domácí sítě končí v bridgi br-lan (výchozí nastavení), a výše použitý port je 3192, budou příkazy na přesměrování vypadat následovně:

iptables -t nat -I PREROUTING -i br-lan -p tcp --dport 80 -j REDIRECT --to-port 3129
ip6tables -t nat -I PREROUTING -i br-lan -p tcp --dport 80 -j REDIRECT --to-port 3129

Tyto příkazy uložíme do souboru, například do /etc/squid/redirect. Přidáme spuštění příkazů do /etc/config/firewall

config include
  option path /etc/squid/redirect
  option reload 0

Nyní restartujte jak squid, tak firewall.

/etc/init.d/squid restart
/etc/init.d/firewall restart

Transparentní cachování https provozu

Zde se podíváme na kombinaci transparentní cache z tohoto návodu a návodu na cachování https. Samozřejmě, kombinace má nevýhody obou přístupů. Navíc je trochu sporné, jestli je k něčemu dobrá. Sice není třeba nastavit proxy server, ale je nutné instalovat certifikát do prohlížeče, takže se to bez úprav na každém klientovi stejně neobejde. Taktéž, návštěvě nedáváme na výběr, jestli využije služeb proxy, nebo dá přednost soukromí a do spojení si nenechá nahlížet.

Předpokládejme, že oba módy jednotlivě jsme již nastavili a otestovali. To mimo jiné znamená, že máme v prohlížeči nainstalovanou autoritu.

Jednoduše otevřeme další port, na kterém bude jak modifikátor intercept, tak ssl-bump. Tento port ovšem bude deklarován direktivou https_port, neboť komunikace z prohlížeče do proxy běží rovnou přes šifrované spojení. To také znamená, že nemůžeme použít stejný port, jako pro nešifrovanou komunikaci.

https_port 3130 intercept ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/etc/squid/ssl_cert/authority.pem

Obdobně jako u portu 80, přesměrujeme i port 443, který se používá pro https (přidat na konec souboru s pravidly, /etc/squid/redirect):

iptables -t nat -I PREROUTING -i br-lan -p tcp --dport 443 -j REDIRECT --to-port 3130
ip6tables -t nat -I PREROUTING -i br-lan -p tcp --dport 443 -j REDIRECT --to-port 3130

A obě služby restartujeme.

/etc/init.d/squid restart
/etc/init.d/firewall restart

Přesměrování jen některých klientů

Někdy se může hodit přesměrovávat jen některé klienty skrz proxy. Například je možné přesměrovat jen telefony, které nedovolují nastavit proxy a počítače nastavit ručně. Nebo naopak přesměrovat všechny klienty s výjimkou těch, které nepodporují nainstalování vlastního certifikátu. Taková nastavení jsou samozřejmě možná a nejjednodušeji se jich dosáhne úpravou firewallu.

Pro jemnější nastavení firewallu se hodí mít nějakou zkušenost s iptables.

V předchozích případech jsme pravidla na přesměrování přidávali na začátek chainu nejvyšší úrovně PREROUTING. Nyní si vytvoříme vlastní chain, na jehož konci přesměrujeme potřebné porty do proxy. To nám umožní jednoduše do daného chainu poslat jen některé množiny klientů a naopak z něj předčasně vyhodit klienty-výjimky.

Všechny příklady zde patří do souboru s pravidly pro firewall (/etc/squid/redirect). Ty nahrazují jednodušší příklady výše.

Napřed vytvoříme chain pro přesměrování:

iptables -t nat -N squid
ip6tables -t nat -N squid

Nyní do něj pošleme některé klienty (zde z rozsahu 192.168.1.128-192.168.1.255 a 2001:db8:2::/48). Samozřejmě je možné mít více pravidel, která posílají do chainu squid různé množiny klientů:

iptables -t nat -I PREROUTING -i br-lan -s 192.168.1.128/25 -j squid
ip6tables -t nat -I PREROUTING -i br-lan -s 2001:db8:2::/48 -j squid

Dále, jeden z počítačů z tohoto chainu „vystoupí předčasně“, aby se přesměrování vyhnul.

iptables -t nat -A squid -s 192.168.1.222 -j RETURN
ip6tables -t nat -A squid -s 2001:db8:2::2222 -j RETURN

Případně můžeme filtrovat i podle MAC adresy, což nám pomůže, pokud si zařízení nastavuje různé IPv6 adresy (v anonymním módu). Taktéž, ty jsou stejné pro IPv4 i IPv6.

iptables -t nat -I PREROUTING -i br-lan -m mac --mac-source 00:11:22:33:44:55 -j squid
ip6tables -t nat -I PREROUTING -i br-lan -m mac --mac-source 00:11:22:33:44:55 -j squid

A nakonec, všem zbylým počítačům přesměrujeme port 80 do proxy:

iptables -t nat -A squid -p tcp --dport 80 -j REDIRECT --to-port 3029
ip6tables -t nat -A squid -p tcp --dport 80 -j REDIRECT --to-port 3029

Zatímco v předchozích příkladech jsme přidávali na začátek PREROUTING pomocí -I, zde přidáváme na konec squid pomocí -A. Na relativním pořadí pravidel uvnitř jednoho chainu záleží, vykonávají se od začátku.