Crmgo Blog

Nastavení transparentního HTTP proxy s podporou IPv4 a IPv6

Nastavení transparentního HTTP proxy s podporou IPv4 a IPv6

Poprvé publikováno 2012-01-10. Nasazení proxy serveru v lokální síti umožňuje: zrychlit přístup k Internetu díky lokálnímu ukládání a následnému sdílení často požadovaných zdrojů (stránek, obrázků, CSS) z mezipaměti; nastavit blokování reklam (nebo jiného nežádoucího obsahu) na jednom místě, okamžitě pro všechny uživatele…

Nastavení transparentního HTTP proxy s podporou IPv4 a IPv6

Poprvé publikováno 2012-01-10.
Nastavení proxy serveru v lokální síti umožňuje:
urychlit přístup k Internetu díky lokálnímu ukládání a následnému sdílení často požadovaných zdrojů (stránek, obrázků, CSS) z mezipaměti;
centralizovaně nastavit blokování reklam (nebo jiného nežádoucího obsahu) pro všechny uživatele lokální sítě najednou.
Transparentní HTTP proxy se nazývá tak proto, že všichni klienti přistupující z vnitřní sítě k externím webovým serverům procházejí přes ni automaticky, aniž by museli měnit nastavení na své straně (aniž by explicitně zadávali proxy ve všech používaných aplikacích, z nichž některé mohou proxy vůbec nepodporovat).
Podívejme se nyní, jak zajistit tuto velmi pohodlnou transparentnost současně pro IPv4 i IPv6.
V následujících příkladech se předpokládá:
používáte router založený na GNU/Linux;
na něm je nainstalován proxy server Squid 3.1+ (popis instalace a nastavení Squidu přesahuje rámec tohoto článku);
v operačním systému je použito jádro Linux verze 2.6.37+ a balíček iptables 1.4.10+;
vnitřní rozhraní routeru se jmenuje eth0.
IPv4

Připojení IPv4 jsou přes mechanismus NAT přesměrována na proxy. Vypadá to poměrně jednoduše:
iptables
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8084
Přidejte tento řádek do vašeho již používaného skriptu iptables.
Squid
Na straně Squidu je třeba přidat do /etc/squid3/squid.conf:
http_port 8084 transparent
Port můžete použít jakýkoliv jiný podle vašeho výběru, důležité je, aby nebyl obsazen ničím jiným a aby byl stejný jak v pravidle iptables, tak v konfiguraci Squidu.
IPv6

Poněvadž ip6tables nepodporuje NAT, transparentní proxy pro IPv6 se realizuje trochu jiným způsobem. Nastavení vypadá o něco složitěji, avšak díky absenci nutnosti používat NAT dosahujeme důležité výhody: ačkoli spojení procházejí přes proxy, vzdálený webový server jako adresu klienta vidí IPv6 adresu koncového počítače, nikoliv adresu proxy.
iproute & ip6tables
#!/bin/sh

# === Odstranění předchozí konfigurace (pokud existovala) ===========

ip -6 route flush table 64
ip -6 rule del from all fwmark 0x6
ip6tables -t mangle -F
ip6tables -t mangle -X DIVERT

# === Vložení nové konfigurace =====================

ip -6 route add local default dev lo table 64
ip -6 rule add from all fwmark 0x6 lookup 64

ip6tables -t mangle -N DIVERT
ip6tables -t mangle -A DIVERT -j MARK --set-mark 6
ip6tables -t mangle -A DIVERT -j ACCEPT

ip6tables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
ip6tables -t mangle -A PREROUTING -p tcp -i eth0 --dport 80 -j TPROXY --tproxy-mark 0x6 --on-port 8086
Hodnoty table 64 a fwmark 0x6 jsou zde vybrány libovolně; pokud ve vašem systému již používáte více tabulek směrování a pravidla firewallu využívající značky (například pro zajištění fungování více WAN připojení), ujistěte se, že tento skript nebude konfliktovat s vašimi již existujícími nastaveními.
Squid
Do /etc/squid3/squid.conf je třeba přidat:
http_port 8086 tproxy
Stejně jako v popsaném procesu nastavení pro IPv4 můžete zvolit i jiný port.
Aplikace nastavení

Aby se projevily změny provedené v souboru squid.conf, stačí Squidu nařídit, aby tento soubor znovu načtl; například v distribucích založených na Debianu k tomu stačí spustit příkaz /etc/init.d/squid3 reload.
Nastavení ip/iptables/ip6tables se projeví ihned po provedení příslušných příkazů. Aby se uplatňovala při každém spuštění systému, přidejte je do skriptu vašeho firewallu (v používáném arno-iptables-firewall lze uživatelská rozšíření zapsat do /etc/arno-iptables-firewall/custom-rules), nebo je jednoduše přidejte do /etc/rc.local.
Ověření

Z libovolného počítače v lokální síti (ale ne ze samotného serveru) spusťte:
curl -I4 http://version6.ru/
curl -I6 http://version6.ru/
V obou případech by se ve výstupu curlu měly objevit řádky:
X-Cache: MISS from vášproxy
X-Cache-Lookup: MISS from vášproxy:port
Pokud se neobjevují nebo se nedaří navázat spojení, znamená to, že něco není nastaveno správně. Pokud se vám to nepodaří nastavit, navštivte náš kanál IRC, možná vám někdo pomůže.

Poznámka: příspěvek mohl vzniknout s pomocí AI a lidskou redakcí. Odpovědný: Dmytro Lomaka, Kaltenkirchen.