Progetto #7 – Proxy Server con Raspberry PI

In questa guida andrò a descrivere i passi da seguire per la realizzazione di un server proxy con Raspberry PI, in particolare con Squid. Il motivo per il quale utilizzarlo, in particolare in ambiente casalingo, è che ci permette di effettuare il caching di tutti i files scaricati via HTTP o FTP. Quindi se stiamo guardando un film in streaming e vogliamo proseguirne la visione da un altro PC o un qualsiasi altro dispositivo connesso alla nostra rete, non avremo problemi, dal momento che sarà già tutto nella cache del nostro server proxy, senza dover riscaricarlo tutto da capo (salvo il caso in cui si utilizzino i protocolli HTTPS/SFTP, non è possibile effettuare il caching delle risorse scaricate tramite essi, in quanto criptate).

Nello specifico ci serviranno:

  • Raspberry PI modello B/B+ (si consiglia il Raspberry PI 2 B, che fornisce prestazioni migliori);
  • Raspbian installato nella scheda SD o micro-SD (a seconda del modello di Raspberry PI che state utilizzando);
  • Squid.

Per prima cosa aggiorniamo la lista dei pacchetti disponibili per il nostro sistema operativo (Raspbian), tramite il comando:

sudo apt-get update

Se siete loggati come utente normale (ad esempio pi), oppure come utente root:

apt-get update

Fatto ciò procediamo all’installazione di Squid, con il comando:

sudo apt-get install squid -y

Oppure come utente root:

apt-get install squid -y

A questo punto dovremo andare a configurare Squid, dal momento che è stato appena installato. Per farlo, assicuriamoci di avere l’editor di testo da terminale, ovvero nano, nello specifico bisognerà modificare il file situato in /etc/squid/squid.conf.

sudo nano /etc/squid/squid.conf

Oppure da root:

nano /etc/squid/squid.conf

Nel caso in cui l’editor di testo nano non sia installato, basterà utilizzare il seguente comando per installarlo:

sudo apt-get install nano -y

Oppure da root:

apt-get install nano -y

Adesso verifichiamo di avere un file di configurazione simile a questo:

acl all src all
acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32
acl localnet src 192.168.0.0/24 # Rete Locale - MODIFICA QUI
acl SSL_ports port 443          # https
acl SSL_ports port 563          # snews
acl SSL_ports port 873          # rsync
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl Safe_ports port 631         # cups
acl Safe_ports port 873         # rsync
acl Safe_ports port 901         # SWAT
acl purge method PURGE
acl CONNECT method CONNECT
http_access allow manager localhost
http_access deny manager
http_access allow purge localhost
http_access deny purge
http_access deny !Safe_ports    # Mettere un cancelletto all'inizio in caso di problemi
http_access deny CONNECT !SSL_ports # Mettere un cancelletto all'inizio in caso di problemi
http_access allow localhost
http_access allow localnet
http_access deny all
icp_access allow localnet
icp_access deny all
http_port 3128 transparent # MODIFICA QUI, se vuoi cambiare la porta sulla quale starà in ascolto
hierarchy_stoplist cgi-bin ?
access_log /var/log/squid/access.log squid
# Caching + durata
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern -i \.(gif|png|jpg|jpeg|ico)$ 10080 100% 43200 override-expire ignore-no-cache override-lastmod reload-into-ims ignore-private ignore-reload
refresh_pattern -i \.(iso|avi|wav|mp3|mp4|mpeg|swf|flv|x-flv)$ 43200 100% 432000 override-expire ignore-no-cache override-lastmod reload-into-ims ignore-private ignore-reload
refresh_pattern -i \.(deb|rpm|exe|zip|tar|tgz|ram|rar|bin|ppt|doc|tiff|cab)$ 10080 100% 43200 override-expire ignore-no-cache override-lastmod reload-into-ims ignore-private
refresh_pattern -i \.index.(html|htm)$ 0 40% 10080
refresh_pattern -i \.(html|htm|css|js)$ 1440 40% 40320
refresh_pattern . 60 100% 14400
dns_nameservers 8.8.4.4 8.8.8.8
acl shoutcast rep_header X-HTTP09-First-Line ^ICY.[0-9]
upgrade_http0.9 deny shoutcast
acl apache rep_header Server ^Apache
broken_vary_encoding allow apache
extension_methods REPORT MERGE MKACTIVITY CHECKOUT
hosts_file /etc/hosts
coredump_dir /var/spool/squid
error_directory /usr/share/squid/errors/Italian # Pagine di errore in Italiano
cache_mgr tuoindirizzo@email.it
cache_mem 256 MB # RAM dedicata al salvataggio della cache, per un accesso più rapido
maximum_object_size_in_memory 4 MB # Non salva in memoria files maggiori di 4 MB
maximum_object_size 5120 MB # File di dimensioni massime nella cache su disco
cache_dir ufs /var/cache/squid 10240 32 512 # 10 GB di cache sulla scheda SD o micro-SD, impiegando il percorso /var/cache/squid
cache_swap_low 87 # Inizia a svuotare la cache quando arriva a 8.7 GB
cache_swap_high 90 # Svuota la cache in maniera più aggressiva quando la soglia è 9 GB
cache_effective_user proxy
cache_effective_group proxy
client_db off # Non effettua le statistiche per i client individuali
auth_param basic program /etc/webmin/squid/squid-auth.pl /etc/webmin/squid/users
positive_dns_ttl 30 seconds
negative_dns_ttl 1 second
minimum_expiry_time 600 seconds

Una volta salvato il file di configurazione, creiamo la cartella dove andrà a finire la cache:

mkdir /var/cache/squid

E assegniamo i permessi all’utente “proxy“, che utilizzerà squid per creare la cache:

chown -R proxy:proxy /var/cache/squid

Nel mio caso Squid accetterà richieste sulla rete 192.168.0.0/24 che normalmente è quella predefinita di ogni router domestico. Se non dovesse accettare richieste, provate con la rete 192.168.1.0/24, utilizzata quasi sempre dai router Telecom Italia e da altri provider. Inoltre, Squid riserverà 10 GB di spazio su disco per il caching degli oggetti e 256 MB di RAM sempre per effettuare il caching delle risorse. È consigliato cambiare questi parametri in base alla propria situazione, nel mio caso avendo una scheda micro-SD da 32 GB, 10 GB per il caching è perfetto.

Ora è arrivato il momento di riavviare Squid con la configurazione appena aggiornata, per farlo:

sudo service squid restart

Oppure da root:

service squid restart

Non ci resta che impostare il nostro browser per utilizzare il server proxy. Su Mozilla Firefox andate nel menù e cliccate su Opzioni. Una volta qua, scegliete la scheda Avanzate:

Configurazione Proxy su Mozilla Firefox - Parte 1

Adesso cliccate su Impostazioni… come indicato in figura. Si aprirà una finestrella. Digitate qua l’IP del Raspberry PI, la porta 3128 (se non la avete modificata nel config) e mettete la spunta su “Utilizza lo stesso proxy per tutti i protocolli” e inserite le eventuali esclusioni per il quale non utilizzare il proxy.

Configurazione Proxy su Mozilla Firefox - Parte 2

Avete concluso! Da adesso navigherete sfruttando il vostro server proxy. La procedura per impostare il proxy è più o meno simile per gli altri browser (Google Chrome rimanderà alle impostazioni di connessione di Internet Explorer). Su Windows 10 ho notato che la rete Wi-Fi tende ad essere scollegata automaticamente, se si imposta il proxy nelle impostazioni di connessione di Internet Explorer (e quindi di sistema). Però è anche vero che ho una configurazione di rete particolare (ho il Raspberry PI collegato direttamente tramite LAN alla scheda di rete del mio PC Desktop e sono anche connessi entrambi via Wi-Fi tramite appositi adattatori).