Po raz pierwszy opublikowano 2012-01-10.
Instalacja serwera proxy w sieci lokalnej pozwala:
przyspieszyć dostęp do Internetu dzięki lokalnemu zapisywaniu i późniejszemu udostępnianiu z pamięci podręcznej często żądanych zasobów (stron, obrazów, arkuszy CSS);
skonfigurować blokowanie reklam (lub innej niepożądanej treści) w jednym miejscu, jednocześnie dla wszystkich użytkowników sieci lokalnej.
Przezroczysty serwer proxy HTTP nazywa się tak dlatego, że wszyscy klienci łączący się z zewnętrznymi serwerami WWW z sieci wewnętrznej przechodzą przez niego automatycznie, bez wprowadzania żadnych zmian w swoich ustawieniach (bez jawnego wskazywania serwera proxy we wszystkich używanych programach, z których część może w ogóle nie obsługiwać proxy).
Przyjrzyjmy się, jak zapewnić tę bardzo wygodną przezroczystość jednocześnie dla IPv4 i IPv6.
W poniższych przykładach zakłada się:
używasz routera opartego na GNU/Linux;
zainstalowany jest na nim serwer proxy Squid 3.1+ (opis instalacji i konfiguracji Squid wykracza poza zakres tego artykułu);
w systemie operacyjnym używane jest jądro Linux w wersji 2.6.37+ oraz pakiet iptables 1.4.10+;
wewnętrzny interfejs routera to eth0.
IPv4
Połączenia IPv4 są przekierowywane na serwer proxy za pomocą mechanizmu NAT. Wygląda to dość prosto:
iptables
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8084
Dodaj tę linię do już używanego przez Ciebie skryptu iptables.
Squid
Po stronie Squid należy dodać do pliku /etc/squid3/squid.conf:
http_port 8084 transparent
Można użyć dowolnego innego portu według własnego wyboru, ważne tylko, aby nie był zajęty przez nic innego i był taki sam zarówno w regule iptables, jak i w konfiguracji Squid.
IPv6
Ponieważ NAT nie istnieje w ip6tables, przezroczysty serwer proxy dla IPv6 jest realizowany nieco inną metodą. Konfiguracja wygląda nieco bardziej skomplikowanie, jednak dzięki braku konieczności stosowania NAT, osiąga się ważną zaletę: choć połączenia przechodzą przez serwer proxy, zdalny serwer WWW jako adres klienta widzi adres IPv6 końcowej maszyny, a nie adres serwera proxy.
iproute & ip6tables
#!/bin/sh
# === Usuwanie poprzednich ustawień (jeśli istniały) ===========
ip -6 route flush table 64
ip -6 rule del from all fwmark 0x6
ip6tables -t mangle -F
ip6tables -t mangle -X DIVERT
# === Wprowadzenie nowej konfiguracji =====================
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
Wartości table 64 i fwmark 0x6 zostały wybrane tutaj dowolnie; jeśli w Twoim systemie są już używane wielokrotne tabele routingu oraz reguły zapory sieciowej używające znaczników (np. w celu zapewnienia działania wielu połączeń WAN), upewnij się, że ten skrypt nie koliduje z już istniejącymi ustawieniami.
Squid
W pliku /etc/squid3/squid.conf należy dodać:
http_port 8086 tproxy
Tak jak w powyżej opisanym procesie konfiguracji dla IPv4, port można wybrać również inny.
Zastosowanie ustawień
Aby zastosować zmiany wprowadzone w pliku squid.conf, wystarczy poinformować Squida o konieczności ponownego odczytania tego pliku; na przykład w dystrybucjach opartych na Debianie wystarczy wykonać polecenie /etc/init.d/squid3 reload.
Ustawienia ip/iptables/ip6tables zaczynają obowiązywać natychmiast po wykonaniu odpowiednich komend. Aby były one stosowane przy każdym uruchomieniu systemu, dodaj je do swojego skryptu zapory sieciowej (w używanym przeze mnie arno-iptables-firewall użytkowe dodatki można wpisywać w pliku /etc/arno-iptables-firewall/custom-rules) lub po prostu dodaj je do /etc/rc.local.
Sprawdzenie
Z dowolnego komputera w sieci lokalnej (ale nie z samego serwera) wykonaj:
curl -I4 http://version6.ru/
curl -I6 http://version6.ru/
W obu przypadkach w wyjściu curla powinny pojawić się linie:
X-Cache: MISS from twójproxy
X-Cache-Lookup: MISS from twójproxy:port
Jeśli ich nie ma lub połączenie nie zostaje nawiązane, oznacza to, że coś zostało skonfigurowane niepoprawnie. W przypadku, gdy nie uda się tego poprawnie skonfigurować, dołącz do naszego kanału IRC, być może ktoś będzie w stanie pomóc.
