Transparante Proxy

From Frotmail Projects
Jump to navigation Jump to search

Situatie

We willen het uitgaande verkeer door een Squid proxy trekken om zo onze gebruikte brandbreedte te optimaliseren.

Probleem

Om het verkeer door Squid te laten afhandelen zonder alle clients hiervoor in te moeten stellen dienen we met IPTables te stoeien. Deze dient het HTTP verkeer te onderscheppen en om te leiden via Squid.

Oplossing

Er zijn 3 bekende methoden om HTTP verkeer om te leiden, hier volgt een voorbeeld van alle 3

Methode 1

Deze methode is alleen geschikt voor situaties waarin de proxy op de router draait. Het redirect de pakketjes naar de lokale poort 8080.

iptables -t nat -A PREROUTING -p tcp -i eth1 --dport 80 -d ! NETWORK/24 \
         -j REDIRECT --to-port 8080

Alle pakketjes die geforward gaan worden, binnenkomen op eth1, met als doel poort 80, met de afzender in het lokale netwerk. Worden geredirect naar lokaal poort 8080. Hierna gaat squid verder de request afhandelen.

Methode 2

Deze methode past alle pakketjes aan, eenmaal aangekomen bij de router wordt de afzender van de pakketjes aangepast naar het ip van de router zodat die het antwoord ontvangt. Als dit niet zou gebeuren zou de client een reaktie krijgen van een ander ip als waar het zijn vraag heeft achter gelaten. Een nadeel van deze methode is dat alle log-entries op de proxy het ip van de router zal bevatten (als ‘afzender’)

iptables -t nat -A PREROUTING -i eth1 -s ! PROXY-IP -p tcp --dport 80 \
         -j DNAT --to PROXY-IP:8080
iptables -t nat -A POSTROUTING -o eth1 -s NETWORK/24 -d PROXY-IP \
         -j SNAT --to ROUTER-IP
iptables -A FORWARD -s NETWORK/24 -d PROXY-IP -i eth0 -o eth1 -p tcp \
         --dport 8080 -j ACCEPT

Alle pakketjes die niet van de proxy zelf komen met als doel een poort 80 dienen ge-nat te worden naar de proxy Deze pakketjes moeten worden aangepast zodat de afzender het ip van de router wordt (zodat de terugweg gevonden kan worden En tenslotte geven we nog expliciet toestemming voor deze forwarding acties.

Methode 3

De laatste methode heeft niet het nadeel van bovenstaande methode; de log zal gewoon de correcte ip’s van de clients bevatten. Het nadeel aan deze methode is dat je een extra marking en ip routing tabel nodig hebt. Ook dien je bij deze methode ook een iptables regel op de proxy toe te voegen. Op de router:

iptables -t mangle -A PREROUTING -j ACCEPT -p tcp --dport 80 -s PROXY-IP
iptables -t mangle -A PREROUTING -j MARK --set-mark 300 -p tcp --dport 80
ip rule add fwmark 300 table 190
ip route add default via PROXY-IP dev eth1 table 190

Alle pakketjes naar poort 80 vanaf de proxy worden zonder pardon geaccepteerd. Andere pakketjes naar poort 80 worden gemarkeerd met marking 300 Alle pakketjes met marking 300 worden via routing tabel 190 afgehandeld Alle pakketjes in routing tabel 190 gaan via de squid (als default gateway)

Op de proxy:

iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT \
         --to-port 8080

Alle pakketjes die binnen komen voor poort 80 worden geredirect naar poort 8080 lokaal. Dit is eigenlijk hetzelfde als bij Methode 1 behalve dat hier dus de pakketjes op de router doorgeroute worden naar de proxy.