ATTENZIONE! Con la versione 4 di Squid la sintassi da usare nel file di configurazione per avere un proxy trasparente è cambiata. Vedere il post Squid Transparent Proxy (HTTP+HTTPs) che addirittura implementa un proxy trasparente anche sul protocollo HTTPS.
Con questa configurazione i client non devono impostare il browser per utilizzare il proxy sulla porta 3128, ma automaticamente il firewall Linux intercetta la chiamata verso la porta HTTP di un server esterno e la ridirige verso la porta 3128 del proxy locale.
L'unico inconveniente di questa configurazione è che non funziona per il protocollo HTTPS (ovviamente, altrimenti Squid avrebbe attuato un attacco Man in the middle).
Prima della versione 2.6 la configurazione come proxy trasparente è praticamente un hack che sfrutta le opzioni httpd_accel_ (nate per far lavorare Squid come acceleratore di server httpd, non come cache). Bisogna configurare Squid e aggiungere una regola netfilter.
La configurazione di Squid (/etc/squid/squid.conf
) prevede queste righe aggiuntive:
httpd_accel_host virtual httpd_accel_port 80 httpd_accel_with_proxy on httpd_accel_uses_host_header on
La regola netfilter da impostare è la seguente (supponendo che le richieste dalla rete locale provengano da eth0):
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128
Nelle versioni più recenti c'è un parametro apposito per il funzionamento in modo proxy trasparente, in /etc/squid/squid.conf
si mettono le direttive:
http_port 3128 transparent # NOTE: This directive is not related to caching. The replies # is cached as usual even if you use always_direct. # This directive is required for transparent proxy. always_direct allow all
Questo istruisce Squid a mettersi in ascolto sulla porta indicata e a funzionare come proxy trasparente. Ovviamente la regola netfilter rimane necessaria.
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128
Con le nuove versioni di Squid è necessario definire due porte, una per la funzione di proxy trasparente indicata con l'attributo intercept e una standard per il forward proxy:
http_port 8080 http_port 3128 intercept
Senza questa configurazione si ottiene l'errore che impedisce l'avvio del demone:
ERROR: No forward-proxy ports configured.
Rimane ovviamente necessaria la configurazione netfilter per il redirect automatico sulla porta 3128 dei client.
Se si utilizza il firewall shorewall, la regola netfilter può essere ottenuta con questa riga in /etc/shorewall/rules
:
#ACTION SOURCE DEST PROTO DEST SOURCE ORIGINAL RATE USER/ # PORT PORT(S) DEST LIMIT GROUP REDIRECT loc 3128 tcp www - !192.168.0.10
L'indirizzo 192.168.0.10 in questo caso è il firewall/server proxy stesso, che ospita alcuni siti web il cui accesso non deve passare dal proxy.
L'equivalente ricetta direttamente in iptables sarebbe:
iptables -t nat -I PREROUTING -i eth0 -p tcp -d !192.168.0.10 --dport 3128 -j REDIRECT --to-ports 3128
Se Squid è configurato come proxy trasparente potrebbe essere difficile forzare l'aggiornamento di un documento web.
Per forzare il purge bisogna installare il pacchetto squidclient
ed eseguire:
squidclient -r http://debian.gfoss.it/dists/lenny/Release.gpg