Parental control con Raspberry Pi, Squid, SquidGuard e DNSMasq.

By | 30 gennaio 2017

In questa guida vedremo come configurare una Raspberry Pi come sistema di parental control (controllo genitoriale) utilizzando i software Squid e SquidGuard così da bloccare in automatico l’accesso ad alcuni siti non adatti ai più piccoli. Useremo inoltre Dnsmasq per attivare in maniera definitiva, anche senza essere autenticati ai relativi servizi, l’opzione Safesearch di Google e Ricerca sicura di Bing, in modo da filtrare le ricerche effettuate sui due siti ed eliminare gran parte dei risultati non adatti ai minori.

Prima di cominciare

Quello qui presentato non è altro che uno dei tanto accorgimenti tecnologici che possono essere utilizzati per proteggere i più piccoli dai rischi della Rete: può dare una mano, ma non salvaguarda al 100% dai pericoli che si possono incontrare in Internet. La presenza di un adulto e l’educazione all’uso del Web rimangono sempre le opzioni migliori per proteggere i bambini durante l’utilizzo di Internet.

Prerequisiti

  • Una scheda Raspberry Pi con già installata una qualsiasi distribuzione supportata (nel mio caso ho utilizzato Raspbian Jessie Lite) e con tutte le operazioni di post-installazione effettuate (espansione file-system, cambio nome host,cambio password, abilitazione ssh, impostazione locale, ecc.)
  • L’ IP Range della LAN deve essere del tipo 192.168.1.0/24: se così non fosse è necessario riadattare ogni comando/parametro che fa riferimento alla local network presente nella guida.

Programmi utilizzati

Principali

  • Squid: software libero con funzionalità di proxy/web-cache.
  • SquidGuard: plugin per Squid che permette di effettuare filtri, redirect e controlli di accesso.
  • Dnsmasq: fornisce un servizio di cache DNS, di server DHCP ed altro. In questa guida utilizzeremo le sue funzionalità DNS per attivare l’opzione SafeSearch di Google e Bing.

Opzionali

  • nginx: webserver leggero ad alte prestazioni.
  • Proxy SwitchySharp: Proxy Switchy è un’estensione per Google Chrome che permette di impostare diversi profili di connessione e navigare tramite proxy.

Parte 1 – Configurazione Raspbian Lite

Aggiorniamo il sistema:

sudo apt-get update && sudo apt-get upgrade -y

Se presente un’interfaccia Wlan (come ad esempio su Raspberry Pi 3) possiamo configurarla ora aggiungendo le seguenti righe alla fine del file /etc/wpa_supplicant/wpa_supplicant.conf (ovviamente è necessario inserire le informazioni corrette per la propria WiFi):

network={
    ssid="ESSID rete"
    psk="password"
}

Impostiamo il sistema in modo da assegnare un IP statico all’interfaccia di rete eth0 e/o wlan0 modificando il file /etc/dhcpcd.conf ed aggiungendo le seguenti righe:

interface eth0

static ip_address=192.168.1.155/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1

interface wlan0

static ip_address=192.168.1.156/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1

Gli indirizzi IP vanno sistemati in accordo con la propria configurazione di rete.

Parte 2 – Dnsmasq

Installiamo Dnsmasq:

sudo apt-get install dnsmasq

Fermiamo il servizio che dovrebbe essersi avviato in automatico al termine dell’installazione:

sudo service dnsmasq stop

Creiamo un nuovo file di configurazione:

sudo nano /etc/dnsmasq.d/safesearch.conf

Inseriamo nel file appena creato quanto segue:

# interfaccia dove dnsmasq erogherà i suoi servizi
interface=eth0
# disabilitiamo le funzionalità di serve DHCP sull'interfaccia specificata
no-dhcp-interface=eth0

domain-needed
bogus-priv
min-port=4096
cache-size=1000
no-resolv

# i server utilizzati per la risoluzione dei domini
server=127.0.0.1
server=8.8.8.8
server=8.8.4.4

#
# Forziamo Google e Bing ad utilizzare la modalità  Safesearch
#

# Bing: https://help.bingads.microsoft.com/apex/index/18/de-US/10003
# Bing (strict.bing.com.)
address=/www.bing.com/204.79.197.220


# Google: https://support.google.com/websearch/answer/186669?hl=en
# Supported Domains: https://www.google.com/supported_domains
# Google (forcesafesearch.google.com.)
address=/google.com/216.239.38.120
address=/google.ad/216.239.38.120
address=/google.ae/216.239.38.120
address=/google.com.af/216.239.38.120
address=/google.com.ag/216.239.38.120
address=/google.com.ai/216.239.38.120
address=/google.al/216.239.38.120
address=/google.am/216.239.38.120
address=/google.co.ao/216.239.38.120
address=/google.com.ar/216.239.38.120
address=/google.as/216.239.38.120
address=/google.at/216.239.38.120
address=/google.com.au/216.239.38.120
address=/google.az/216.239.38.120
address=/google.ba/216.239.38.120
address=/google.com.bd/216.239.38.120
address=/google.be/216.239.38.120
address=/google.bf/216.239.38.120
address=/google.bg/216.239.38.120
address=/google.com.bh/216.239.38.120
address=/google.bi/216.239.38.120
address=/google.bj/216.239.38.120
address=/google.com.bn/216.239.38.120
address=/google.com.bo/216.239.38.120
address=/google.com.br/216.239.38.120
address=/google.bs/216.239.38.120
address=/google.bt/216.239.38.120
address=/google.co.bw/216.239.38.120
address=/google.by/216.239.38.120
address=/google.com.bz/216.239.38.120
address=/google.ca/216.239.38.120
address=/google.cd/216.239.38.120
address=/google.cf/216.239.38.120
address=/google.cg/216.239.38.120
address=/google.ch/216.239.38.120
address=/google.ci/216.239.38.120
address=/google.co.ck/216.239.38.120
address=/google.cl/216.239.38.120
address=/google.cm/216.239.38.120
address=/google.cn/216.239.38.120
address=/google.com.co/216.239.38.120
address=/google.co.cr/216.239.38.120
address=/google.com.cu/216.239.38.120
address=/google.cv/216.239.38.120
address=/google.com.cy/216.239.38.120
address=/google.cz/216.239.38.120
address=/google.de/216.239.38.120
address=/google.dj/216.239.38.120
address=/google.dk/216.239.38.120
address=/google.dm/216.239.38.120
address=/google.com.do/216.239.38.120
address=/google.dz/216.239.38.120
address=/google.com.ec/216.239.38.120
address=/google.ee/216.239.38.120
address=/google.com.eg/216.239.38.120
address=/google.es/216.239.38.120
address=/google.com.et/216.239.38.120
address=/google.fi/216.239.38.120
address=/google.com.fj/216.239.38.120
address=/google.fm/216.239.38.120
address=/google.fr/216.239.38.120
address=/google.ga/216.239.38.120
address=/google.ge/216.239.38.120
address=/google.gg/216.239.38.120
address=/google.com.gh/216.239.38.120
address=/google.com.gi/216.239.38.120
address=/google.gl/216.239.38.120
address=/google.gm/216.239.38.120
address=/google.gp/216.239.38.120
address=/google.gr/216.239.38.120
address=/google.com.gt/216.239.38.120
address=/google.gy/216.239.38.120
address=/google.com.hk/216.239.38.120
address=/google.hn/216.239.38.120
address=/google.hr/216.239.38.120
address=/google.ht/216.239.38.120
address=/google.hu/216.239.38.120
address=/google.co.id/216.239.38.120
address=/google.ie/216.239.38.120
address=/google.co.il/216.239.38.120
address=/google.im/216.239.38.120
address=/google.co.in/216.239.38.120
address=/google.iq/216.239.38.120
address=/google.is/216.239.38.120
address=/google.it/216.239.38.120
address=/google.je/216.239.38.120
address=/google.com.jm/216.239.38.120
address=/google.jo/216.239.38.120
address=/google.co.jp/216.239.38.120
address=/google.co.ke/216.239.38.120
address=/google.com.kh/216.239.38.120
address=/google.ki/216.239.38.120
address=/google.kg/216.239.38.120
address=/google.co.kr/216.239.38.120
address=/google.com.kw/216.239.38.120
address=/google.kz/216.239.38.120
address=/google.la/216.239.38.120
address=/google.com.lb/216.239.38.120
address=/google.li/216.239.38.120
address=/google.lk/216.239.38.120
address=/google.co.ls/216.239.38.120
address=/google.lt/216.239.38.120
address=/google.lu/216.239.38.120
address=/google.lv/216.239.38.120
address=/google.com.ly/216.239.38.120
address=/google.co.ma/216.239.38.120
address=/google.md/216.239.38.120
address=/google.me/216.239.38.120
address=/google.mg/216.239.38.120
address=/google.mk/216.239.38.120
address=/google.ml/216.239.38.120
address=/google.com.mm/216.239.38.120
address=/google.mn/216.239.38.120
address=/google.ms/216.239.38.120
address=/google.com.mt/216.239.38.120
address=/google.mu/216.239.38.120
address=/google.mv/216.239.38.120
address=/google.mw/216.239.38.120
address=/google.com.mx/216.239.38.120
address=/google.com.my/216.239.38.120
address=/google.co.mz/216.239.38.120
address=/google.com.na/216.239.38.120
address=/google.com.nf/216.239.38.120
address=/google.com.ng/216.239.38.120
address=/google.com.ni/216.239.38.120
address=/google.ne/216.239.38.120
address=/google.nl/216.239.38.120
address=/google.no/216.239.38.120
address=/google.com.np/216.239.38.120
address=/google.nr/216.239.38.120
address=/google.nu/216.239.38.120
address=/google.co.nz/216.239.38.120
address=/google.com.om/216.239.38.120
address=/google.com.pa/216.239.38.120
address=/google.com.pe/216.239.38.120
address=/google.com.pg/216.239.38.120
address=/google.com.ph/216.239.38.120
address=/google.com.pk/216.239.38.120
address=/google.pl/216.239.38.120
address=/google.pn/216.239.38.120
address=/google.com.pr/216.239.38.120
address=/google.ps/216.239.38.120
address=/google.pt/216.239.38.120
address=/google.com.py/216.239.38.120
address=/google.com.qa/216.239.38.120
address=/google.ro/216.239.38.120
address=/google.ru/216.239.38.120
address=/google.rw/216.239.38.120
address=/google.com.sa/216.239.38.120
address=/google.com.sb/216.239.38.120
address=/google.sc/216.239.38.120
address=/google.se/216.239.38.120
address=/google.com.sg/216.239.38.120
address=/google.sh/216.239.38.120
address=/google.si/216.239.38.120
address=/google.sk/216.239.38.120
address=/google.com.sl/216.239.38.120
address=/google.sn/216.239.38.120
address=/google.so/216.239.38.120
address=/google.sm/216.239.38.120
address=/google.sr/216.239.38.120
address=/google.st/216.239.38.120
address=/google.com.sv/216.239.38.120
address=/google.td/216.239.38.120
address=/google.tg/216.239.38.120
address=/google.co.th/216.239.38.120
address=/google.com.tj/216.239.38.120
address=/google.tk/216.239.38.120
address=/google.tl/216.239.38.120
address=/google.tm/216.239.38.120
address=/google.tn/216.239.38.120
address=/google.to/216.239.38.120
address=/google.com.tr/216.239.38.120
address=/google.tt/216.239.38.120
address=/google.com.tw/216.239.38.120
address=/google.co.tz/216.239.38.120
address=/google.com.ua/216.239.38.120
address=/google.co.ug/216.239.38.120
address=/google.co.uk/216.239.38.120
address=/google.com.uy/216.239.38.120
address=/google.co.uz/216.239.38.120
address=/google.com.vc/216.239.38.120
address=/google.co.ve/216.239.38.120
address=/google.vg/216.239.38.120
address=/google.co.vi/216.239.38.120
address=/google.com.vn/216.239.38.120
address=/google.vu/216.239.38.120
address=/google.ws/216.239.38.120
address=/google.rs/216.239.38.120
address=/google.co.za/216.239.38.120
address=/google.co.zm/216.239.38.120
address=/google.co.zw/216.239.38.120
address=/google.cat/216.239.38.120

# Youtube (restrictmoderate.youtube.com.)
#address=/www.youtube.com/216.239.38.119
#address=/m.youtube.com/216.239.38.119
#address=/youtubei.googleapis.com/216.239.38.119
#address=/youtube.googleapis.com/216.239.38.119
#address=/www.youtube-nocookie.com/216.239.38.119

# Youtube (restrict.youtube.com.)
address=/www.youtube.com/216.239.38.120
address=/m.youtube.com/216.239.38.120
address=/youtubei.googleapis.com/216.239.38.120
address=/youtube.googleapis.com/216.239.38.120
address=/www.youtube-nocookie.com/216.239.38.120

# logging
# decommentando log-queries otteniamo che i log del di dnsmaq vengano registarti in /var/log/daemon.log 
#log-facility=/var/log/dnsmasq.log
#log-queries

Con questa cofigurazione Dnsmasq intercetterà tutte le chiamate a Google, Bing e Youtube e le reindirizzerà ai relativi IP dei vari servizi con Safesearch abilitato (e non disabilitabile) di default.

Riavviamo Dnsmasq:

sudo service dnsmasq start

Ora impostiamo il Server DNS di uno dei nostri device sull’IP dell’interfaccia specificata nel file di configurazione di Dnsmasq e proviamo ad effettuare una qualsiasi ricerca su Google o Bing: dovremmo notare che Safesearch/Ricerca sicura è permanentemente attivato e non disattivabile anche in modalità anonima (per Google è segnalato in alto a destra).

safesearch

Attenzione: con le operazioni sopra riportate abbiamo abilitato l’opzione Safesearch/Ricerca sicura solamente per i domini di Google, Bing e Youtube. Altri motori di ricerca quali Yahoo, Ask, Duckduckgo, ecc. rimarranno perfettamente accessibili. Sarebbe possibile abilitare la relativa opzione di ricerca sicura per la maggior parte di questi servizi, ma per facilitare la gestione ho preferito disabilitare del tutto l’accesso a questi domini utilizzando le opzioni dello Squid Proxy come più sotto riportato.

Parte 3 – Squid e SquidGuard

Squid

Installiamo i due programmi:

apt-get install -y squid3 squidguard

Squid e SquidGuard gireranno con i privilegi dell’utente proxy che dovrebbe essere già presente nel nostro sistema.

Salviamo la configurazione originale di Squid:

cp /etc/squid3/squid.conf /etc/squid3/squid.conf.origin

Sfoltiamo i commenti dal file di configurazione per renderlo più leggibile:

cat /etc/squid3/squid.conf.origin | egrep -v -e '^[[:blank:]]*#|^$
' > /etc/squid3/squid.conf

Dovremmo aver ridotto il contenuto del file da oltre 7500 righe a poco più di 20:

acl SSL_ports port 443
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 CONNECT method CONNECT
#http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
http_access allow localhost
http_access deny all
http_port 3128
coredump_dir /var/spool/squid3
refresh_pattern ^ftp:		1440	20%	10080
refresh_pattern ^gopher:	1440	0%	1440
refresh_pattern -i (/cgi-bin/|\?) 0	0%	0
refresh_pattern .		0	20%	4320

Questa configurazione, così com’è, blocca di default tutte le connessioni verso l’esterno. Quindi apriamo il file con nano:

sudo nano /etc/squid3/squid.conf

Aggiungiamo la nostra rete locale alla fine delle dichiarazioni ACL (sistemate l’IP per adattarlo alla vostra rete):

acl Safe_ports port 777		# multiling http
acl MyNetwork src 192.168.1.0/24
acl CONNECT method CONNECT

Ora permettiamo l’acceso al proxy a tutte le macchine della nostra rete locale utilizzando l’id MyNetwork indicato nella precedente opzione ACL:

http_access allow localhost
http_access allow MyNetwork
http_access deny all

Infine aggiungiamo l’opzione forwarded_for per mascherare il proxy durante la navigazione Internet (il proxy non aggiungerà le proprie generalità negli header HTTP):

forwarded_for off

Salviamo ed usciamo da nano. Torneremo dopo a completare la configurazione di Squid.

SquidGuard

Spostiamoci in /home/pi/ e scarichiamo la blacklist che andremo ad utilizzare con SquidGuard:

wget http://dsi.ut-capitole.fr/blacklists/download/blacklists.tar.gz

La blacklist dell’università di Tolosa è solamente una delle tante che è possibile utilizzare; per maggiori info: http://www.squidguard.org/blacklists.html

È il momento di decomprimere la blacklist:

tar -xzvf blacklists.tar.gz

Spostiamola nella directory opportuna:

sudo mv blacklists /var/lib/squidguard/db/

Assegniamo i diritti dell’utente/gruppo proxy ai file della blacklist, così che SquidGuard possa utilizzarla:

chown -R proxy: /var/lib/squidguard/db/

Salviamo il file di configurazione originale di SquidGuard (non si sa mai…):

sudo cp /etc/squidguard/squidGuard.conf /etc/squidguard/squidGuard.conf.origin

Apriamo il file con sudo nano /etc/squidguard/squidGuard.conf, cancelliamone il contenuto e sostituiamolo con il seguente:

#
# CONFIG FILE FOR SQUIDGUARD
#

dbhome /var/lib/squidguard/db
logdir /var/log/squid3

# Dichiarazione filtri
dest adult {
        domainlist blacklists/adult/domains
        urllist blacklists/adult/urls
        expressionlist blacklists/adult/very_restrictive_expression
}
dest publicite {
        domainlist blacklists/publicite/domains
        urllist blacklists/publicite/urls
}
dest agressif {
        domainlist blacklists/aggressive/domains
        urllist blacklists/aggressive/urls
}

# autorizzazioni
acl {
  default {
        pass !adult !publicite !agressif all
        redirect  http://www.google.it/
  }
}

Salvate ed uscite da nano.

SquidGuard è un plugin di Squid che permette di filtrare le risorse accessibili in Rete, effettuare redirect e controlli di accesso. Il file di configurazione utilizza una sintassi specifica: la configurazione qui utilizzata impedisce l’accesso ai siti con contenuti per adulti, con pubblicità o contenuti violenti oltre ad effettuare il redirect del client ad una pagina a piacere (in questo caso, http:google.it, ma è possibile specificare anche pagine di un webserver interno, così da personalizzarne l’output come ho indicato poco più sotto in una delle sezioni facoltative). Per approfondire l’argomento rimando alla guida presente sul sito ufficiale.

A questo punto dobbiamo generare la base dati che verrà utilizzata da SquidGuard a partire dal file di configurazione che abbiamo utilizzato:

sudo squidGuard -C all

L’operazione può richiedere alcuni minuti. Una volta finita senza errori, dobbiamo modificare i diritti sui file appena generati, assegnandone la proprietà all’utente proxy:

sudo chown -R proxy: /var/lib/squidguard/db/

N.B.: le ultime due operazioni sono da ripetersi ogni volta che modificheremo il file di configurazione di SquidGuard!

Infine modifichiamo nuovamente con nano il file di configurazione di Squid aggiungendo questa linea alla fine del file /etc/squid3/squid.conf:

url_rewrite_program /usr/bin/squidGuard -c /etc/squidguard/squidGuard.conf

Questa opzione farà in modo che SquidGuard venga caricato all’avvio di Squid.

Parte 4 (finale) – Proviamo Squid

Facciamo ripartire il nostro proxy:

sudo service squid restart

Spostiamoci su un qualsiasi dispositivo della nostra rete e modifichiamone la configurazione del browser in modo da utilizzare il proxy appena configurato. Immettiamo come Nome proxy l’indirizzo IP della Raspberry P, come Porta la 3128 e selezioniamo l’opzione “Utilizza lo stesso proxy per tutti i protocolli“.

Proxy Settings Firefox

In Firefox le impostazioni dle proxy si trovano in “Menu->Preferenze->Avanzate->Rete”

Proviamo il proxy andando su un sito sicuramente presente nella nostra blacklist (un qualsiasi sito a contenuto pornografico): se il proxy funzionerà come previsto la pagina non dovrebbe venire visualizzata, ma dovremmo venire reindirizzati all’homepage di Google, come specificato nell’opzione redirect http://www.google.it del file di configurazione di Squid.

La configurazione del nostro proxy personale finisce qui, ma di seguito ho riportato alcune operazioni facoltative per personalizzare ancora di più l’installazione.

Buon divertimento! 🙂

Operazioni facoltative

Disabilitare l’accesso ad alcuni siti da Squid

E’ possibile disabilitare completamente l’accesso ad alcuni siti utilizzando le direttive acl e http_access nel file di configurazione di Squid.

Per farlo creiamo un file chiamato noaccess.acl in /etc/squid3/:

sudo nano /etc/squid3/noaccess.acl

Al’interno del file copiamo le seguenti informazioni:

.yahoo.com
.duckduckgo.com
.ask.com
.goodsearch.com
.virgilio.it
.lycos.com
.lygo.com
.hotbot.com
.ixquick.com
.qwant.com

Questa è una lista di alcuni (più o meno) noti motori di ricerca alternativi a Google e Bing.

Salviamo il file appena creato ed apriamo il file di configurazione di Squid con sudo nano /etc/squid3/squid.conf ed aggiungiamo le seguenti opzioni:

acl bad_url dstdomain "/etc/squid3/bad-sites.acl"
http_access deny bad_url

Attenzione: le direttive acl e http_access devono essere inserite nelle rispettive sezioni del file di configurazione altrimenti Squid ci segnalerà un errore; ecco un estratto del mio file di conf con le due opzioni evidenziate in grassetto ed inserite esattamente a cavallo delle due sezioni:

acl Safe_ports port 777		# multiling http
acl LocalNet src 192.168.1.0/24
acl CONNECT method CONNECT

acl bad_url dstdomain "/etc/squid3/bad-sites.acl"
http_access deny bad_url

# http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager

Riavviamo Squid consudo service squid3 restart e proviamo a navigare su uno dei siti bloccati.

Tu non puoi passare!

Gestione automatica degli aggiornamenti della blacklist di SquidGuard

Le blacklist che si possono utilizzare con SquidGuard non sono statiche, ma vengono aggiornate costantemente. È quindi opportuno aggiornare anche la blacklist che abbiamo installato nella nostra Raspberry pi. Ecco uno script che, tramite un opportuno crontab, può farlo in automatico al posto nostro.

Diventate root, spostatevi in /root e create il file update-blacklist.sh con nano:

sudo su
cd /root
nano update-blacklist

Copiate il seguente script all’interno del file:

#!/bin/sh

PATH=/usr/sbin:/usr/bin:/sbin:/bin
cd /var/lib/squidguard/db
rm -rf blacklists
wget -nv http://dsi.ut-capitole.fr/blacklists/download/blacklists.tar.gz
tar -zxf blacklists.tar.gz
rm blacklists.tar.gz
squidGuard -C all
chown -R proxy:proxy /var/lib/squidguard/db/
service squid3 restart

Ora eseguiamo crontab -e e copiamo alla fine del file la seguente regola:

0 1 * * * /root/update-blacklist.sh 2>&1 | /usr/bin/logger -t update_squidguard_blacklist

Salvate, uscite dall’editor.

Il crontab così installato scaricherà per noi la blacklist alle ore 01.00 di ogni giorno ed effettuerà le operazioni del caso per creare la base dati da essere utilizzata con SquidGuard.

Utilizzare una pagina personale per l’opzione redirect di SquidGuard

no porn

E’ possibile utilizzare una pagina personale per il redirect di SquidGuard. Per farlo è necessario installare un webserver ed effettuare un minimo di configurazione. Tra le varie soluzioni possibili ho scelto di utilizzare nginx, ma è possibile utilizzare qualsiasi webserver disponibile per Raspbian Jessie, tra cui Apache e Lighttpd.

Installiamo il nginx e le estensioni necessarie per la gestione delle pagine php:

sudo apt-get install nginx php5-fpm

Configuriamo nginx per gestire le nostre pagine:

cd /etc/nginx
sudo nano sites-enabled/default

Cerchiamo la linea seguente:

index index.html index.htm index.nginx-debian.html;

e sostituiamola con questa:

index index.html index.htm index.php;

Ora attiviamo php-fpm (l’interprete PHP). Cerchiamo la seguente sezione:

#location ~ \.php$ {
 # include snippets/fastcgi-php.conf;
 #
 # # With php5-cgi alone:
 # fastcgi_pass 127.0.0.1:9000;
 # # With php5-fpm:
 # fastcgi_pass unix:/var/run/php5-fpm.sock;
 #}

e modifichiamola in modo da ottenere il risultato seguente:

location ~ \.php$ {
		include snippets/fastcgi-php.conf;
		fastcgi_pass unix:/var/run/php5-fpm.sock;
	}

Modifichiamo i permessi della directory /var/www/html:

sudo chown -R www-data:www-data /var/www/html/
 sudo chmod -R 770 /var/www/html/

Spostiamoci nella dir suddetta e creiamo un file info.php per verificare che tutto funzioni bene:

cd /var/www/html/
sudo nano index.php

con il seguente contenuto:

<?php phpinfo(); ?>

Infine facciamo ripartire nginx:

sudo service nginx restart

Ora da un qualsiasi browser ubicato nella vostra rete navigate verso l’IP della Rapsberry Pi e dovreste ottenere una pagina con le informazioni di PHP, simile a quella sotto riportata.

php info

Nel caso il browser restituisse “Error 403: Forbidden” sarà probabilmente necessario impostare i permessi corretti alla directory /var/www, quindi:

chown www-data:www-data /var/www
 chmod 744 /var/www

Ora è possibile creare la pagina di blocco personalizzata che possiamo poi utilizzare in Squid/SquidGuard. Di seguito l codice HTML di quella che utilizzo nella mia installazione:

<html>
        <head>
                <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
                <style>
                img {
                   max-width: 100%;
                   height: auto;
                   margin-top: 20px;
                   margin-left: auto;
                   margin-right: auto;
                   display: block;
                }
                h1 {
                   text-align: center;
                }
                p {
                   font-family: "Courier New", Courier, monospace;
                   text-align: center;
                   font-weight: bold;
                }
                </style>

        </head>
        <body>
                <img src="http://ip.raspberry/stop.png"/>
                <h1>
                        Il sito <?php echo htmlspecialchars($_GET["url"]); ?> non è autorizzato.
                </h1>
                <hr/>
                <p>Source : <?php echo htmlspecialchars($_GET["address"]); ?></p>
                <p>Target : <?php echo htmlspecialchars($_GET["target"]); ?></p>
                <p>URL : <?php echo htmlspecialchars($_GET["url"]); ?></p>
        </body>
</html>

Quindi creiamo un file in /var/www/html chiamato block.html:

sudo nano /var/www/html/block.html

e copiamoci il contenuto visto prima.

Torniamo al nostro file di configurazione di SquidGuard:

sudo nano /etc/squidguard/

E verso la fine del file modifichiamo la linea di redirect in questo modo:

redirect  http://192.168.1.155/block.php?address=%a&target=%t&url=%u

(indicate l’ip della vostra raspberry)

%a, %t e %u sono variabili di SquidGuard che verranno popolate al momento del redirect con i valori opportuni. Per maggiori info riferirsi alla documentazione ufficiale di SquidGuard.

La configurazione è finita, quindi salviamo e proviamo la nostra pagina di redirect personalizzata semplicemente navigando verso un sito proibito da un qualsiasi browser che è stato configurato per l’utilizzo del proxy.

Utilizzare un file PAC per la configurazione automatica del proxy

Se si hanno diversi device da mettere sotto proxy, può essere utile ricorrere all’utilizzo di un file PAC per configurare automaticamente i parametri del proxy. E’ necessario avere un webserver configurato (vedi il precedente capitolo).

Creiamo quindi un file chiamato proxy.pac nella directory /var/www/html:

sudo nano /var/www/html/proxy.pac

Il contenuto del file deve essere una semplice funzione javascript tipo la seguente:

function FindProxyForURL(url, host) {

    // Disabilita il proxy per i siti che seguono
    if (dnsDomainIs(host, ".agar.io") ||
        shExpMatch(host, "(*.agar.io|agar.io)"))
    return "DIRECT";

    // disabilita il proxy per tutti gli host della localnetwork
    if (isInNet(dnsResolve(host), "192.168.1.0",  "255.255.0.0") ||
        isInNet(dnsResolve(host), "127.0.0.0", "255.255.255.0"))
    return "DIRECT";    

    // REGOLE DI DEFAULT: abilita il proxy per tutto il resto.
    return "PROXY 192.168.1.155:3128";

    }

Ovviamente il tutto deve essere adattato alle proprie esigenze. L’esempio qui sopra rende possibile disabilitare il proxy nel caso si navighi tra gli host della rete interna oppure nel sito http://agar.io (un videogioco online che male digerisce la presenza di un proxy), mentre abilita il proxy per tutto il resto.

Salviamo ed usciamo da nano.

Ora è necessario modificare il file /etc/nginx/mime.type ed aggiungere alla fine la linea che segue:

application/x-ns-proxy-autoconfig .pac;

E facciamo ripartire nginx con sudo service nginx restart.

Infine impostiamo un qualsiasi browser presente nei nostri device per utilizzare il file .pac appena creato, inserendone il percorso come http://ip.raspberry/proxy.pac

Non sarà necessario effettuare nessuna altra configurazione sul device. Inoltre eventuali modifiche al file proxy.pac, verranno apportate automaticamente a tutti i device configurati in tale modo.

Per maggiori informazioni sull’utilizzo dei file PAC: PAC file best practices.

N.B. in caso di malfunzionamento del webserver, il file proxy.pac non sarà letto dai device dove è stato configurato e questo, nelle più comuni installazioni, può portare a fare si che gli utenti dei device potranno accedere ad internet senza la protezione del proxy. Attenzione quindi a valutarne bene il suo utilizzo.

Usare l’estensione Proxy SwitchySharp per gestire i proxy sotto Chrome

In alcune situazioni può essere utile passare in automatico o tramite un semplice click da un proxy ad un altro, oppure impostare regole per siti particolari in maniera semplice e flessibile. Ho trovato utile usare l’estensione Proxy SwitchSharp nel Chromebook utilizzato da mia figlia, così da impostare al volo regole particolari per certi siti che non funzionano bene in presenza del proxy Squid.

Una volta installata, richiamiamo l’estensione dal menu di Chrome e posizioniamoci nella scheda Proxy Profiles. Aggiugniamo un nuovo profilo, selezioniamo Manual Configuration ed aggiungiamo l’ip e la porta del proxy Squid. Infine abilitiamo “Use the same proxy for all protocols“. Fare riferimento all’immagine per i dettagli.

Ora spostiamoci nella scheda Switch Rules, abilitiamo l’opzione Enable Switch Rules ed aggiungiamo una nuova regola. Diamo un nome alla regola (nell’esempio è chiamata whitelist) ed aggiungiamo, separate da virgole, le URL per le quali desideriamo che il proxy non intervenga (in questo caso ho inserito un solo sito, il solito agar.io) utilizzando il carattere jolly asterisco per comprendere tutti i sottodomini dell’url specificato. Poi in Pattern Type selezioniamo Wildcard ed infine in Proxy Profile selezioniamo Direct Connection.

In questo modo avremo creato una regola che farà in modo che il proxy venga bypassato per il sito agar.io e tutti i suoi sottodomini, mentre per gli altri siti verranno intercettati normalmente da Squid.

Ovviamente quella appena vista è un semplice esempio di utilizzo molto basilare di Proxy SwitchSharp: è possibile creare regole molto complesse tramite regex, utilizzare diversi proxy, ecc. Tramite la sua interfaccia è inoltre possibile esportare con un semplice click le regole create in formato proxy.pac che sarà poi possibile utilizzare come visto poco sopra.

3 thoughts on “Parental control con Raspberry Pi, Squid, SquidGuard e DNSMasq.

  1. Pingback: Raspberry Pi: server ebook con Calibre e COPS - rbnet.it

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *