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.
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í.
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
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
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.