Table of Contents

Squid HTTP proxy

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.

Configurazione come proxy trasparente

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

Versioni precedenti alla 2.6

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

Versione 2.6

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

Versione 3 e 4

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.

Transparent proxy con Shorewall

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

Rimuovere una pagina dalla cache

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