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

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

ATTENZIONE: secondo la versione di Squid presente nei vostri repository, il file di configurazione del programma potrà trovarsi in /etc/squid3/squid.conf (come riportato in questa guida) oppure in /etc/squid/squid.conf

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/noaccess.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/noaccess.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.

32 commenti su “Parental control con Raspberry Pi, Squid, SquidGuard e DNSMasq.”

  1. Ciao.
    GRAZIE per il tuo lavoro, era proprio quello che stavo cercando.
    Non riesco a capire COME INTEGRARE questa guida col fatto che io vorrei:

    – Il mio Raspi è collegato via LAN al MODEM ed usa la LAN per navigare.
    – Voglio usare il WiFi del Raspi solo per COLLEGARE il tablet dei bambini al raspi ed accedere ad internet (Quindi impostare il Raspi come router/access point WiFi??)
    – Far FILTRARE al Raspi il collegamento WiFi a siti non adatti con il metodo da te suggerito!

    Grazie1000 in anticipo

    Rispondi
    • Ciao Fabio, se hai seguito la guida basta che sul tablet, che immagino sia già collegato al tuo router, imposti il proxy come indicato al punto 4. Ma magari non ho capito bene la tua richiesta?

      Rispondi
      • Ciao,
        io voglio che il tablet si connetta via WiFi al WiFi del RASPI. Quindi Iil raspi esegua i vari filtri ed acceda a internet attraverso il suo solegamento LAN al Modem.

        Sono riuscito con Raspbian STRETCH 9 LITE con questa guida:
        https://www.raspberrypi.org/documentation/configuration/wireless/access-point.md#internet-sharing

        Ho installato i pacchetti: hostapd dnsmasq bridge-utils squid squidguard.
        e settando i files:/etc/dhcpcd.conf, /etc/dnsmasq.conf, /etc/hostapd/hostapd.conf, /etc/default/hostapd, /etc/sysctl.conf, /etc/network/interfaces.
        la navigazione fin qui funziona completamente ma è libera!

        Ho seguito la TUA GUIDA, ma nel mio caso, non dovrei mettere il tuo contenuto del file “/etc/dnsmasq.d/safesearch.conf” nel mio file: “/etc/dnsmasq.conf” perchè i parametri :
        interface=eth0
        no-dhcp-interface=eth0
        domain-needed
        bogus-priv
        min-port=4096
        cache-size=1000
        no-resolv
        server=127.0.0.1
        server=8.8.8.8
        server=8.8.4.4

        nel mio caso sono settati indnsmasq.conf ed in modo diverso, non vorrei che diano problemi.!!

        Rispondi
          • OK, scusami ancora, l’ultima domanda:
            Ma con tua configurazione, il Raspi fa da AccessPoint WiFi???
            Perchè sono settati gli IP FISSI sia della LAN che del WiFi in /etc/dhcpcd.conf ???
            Come è connesso il Raspi al MODEM??? via WIFI??
            Infatti le tue impostazioni del Proxi si riferiscono all’ IP della LAN del Raspi!!!!

          • Scusami il ritardo nelle risposte, ma in questi giorni ho un po’ da fare (per modo di dire… mare e montagna 🙂 )

            La Raspberry in questo caso non fa da access point in quanto non fornisce alcuna connettività di rete, ma funge da “semplice” Server DNS/Proxy.

            La mia scheda Raspberry è connessa al router sia via LAN che WLAN, ma solo per comodità. Puoi connetterla come vuoi. Anche solo LAN o WLAN (in effetti è conveniente disabilitare la WLAN se non è indispensabile).

            I dispositivi che vuoi proteggere li colleghi normalmente al tuo Router casalingo, ma:
            – come DNS metti l’IP della Raspberry cosi’ che Dnsmasq possa funzionare da server DNS ed “attivare” il safesearch (come spiegato verso la fine della Parte 2 dell’articolo).
            – come Proxy inserisci lo stesso IP della Raspberry e la porta 3128 (che è la porta di default di Squid), come indicato nello step “Parte 4 (finale) – Proviamo Squid” dell’articolo.

            Se hai configurato il tutto come da guida vedrai che tutto il traffico del dispositivo sarà filtrato come spiegato nell’articolo.

            Se invece vuoi utilizzare la Raspberry come access point, non so aiutarti perché non ho mai integrato queste due soluzioni.

          • Roberto, grazie per il chiarimento.
            Credo che SE avrai voglia di fare una guida per questa soluzione, sia più semplice, sicura ed affidabile per i bambini, (e forse, NON serve neppure il PROXY da settare in ogni device):

            – USIAMO il Raspi come Access Point SOLO PER i device che vogliamo proteggere e filtrare!
            – Dobbiamo fare che TUTTO QUELLO che passa dall’AccessPoint WiFi del Raspi sarà filtrato! (come le guide per usarlo come TOR/VPN filtro)
            – Il raspi è collegato al Modem/Internet via sua LAN.

            Sono più o meno riuscito a fare questo, nel senso che con Raspi in Access Point impostando in BRIDGE come la guida ufficiale qui:
            https://www.raspberrypi.org/documentation/configuration/wireless/access-point.md#internet-sharing

            e usando la tua guida, la parte di FILTRI con SquidGuard e blacklist dei siti FUNZIONA!!!! Impostando il proxy però.
            Mentre la parte di safesearch.conf NO!

            Il mio è solo un suggerimento, Non mi aspetto nulla visto che so che queste cose rubano molto tempo al “resto”
            Ti saluto e ti ringrazio comunque per il tuo lavoro!

          • Prima di tutto, grazie per i complimenti Fabio.
            Quello che vuoi realizzare è un Transparent Proxy. Con un po’ di ricerca trovi qualche tutorial in rete. Per quanto mi riguarda non ti posso garantire niente, ma magari tra qualche giorno un’occhiata ce la butto 😉
            In bocca al lupo!

  2. Ciao, non ho capito una cosa… Ma se io vado ad effettuare questo metodo, dovro’ impostare a tutti i computer i proxy, o lo fara’ in automatico tramite router? Funzionerebbe anche con i dispositivi mobili? Potresti spiegarmi meglio? Ciaooo! Bella Guida

    Rispondi
    • Ciao Ilario. Devi configurare l’utilizzo del proxy sui dispositivi dove vuoi utilizzarlo. Funziona anche sui dispositivi mobili, purché sotto la stessa LAN del proxy.

      Rispondi
      • Quindi dovro’ comunque impostare il proxy a mano su tutti i dispositivi… Non e’ possibile fare che il proxy lavori nella rete e quindi vada a bloccare automaticamente i siti senza impostare nulla dai dispositivi?

        Rispondi
  3. Ciao! Intanto ti faccio i complimenti per l’articolo dettagliato e perfettamente descritto. Oramai sono giunto alla fine della guida, precisamente nel punto in cui bisogna riavviare squid a seguito della creazione del file “noaccess.acl”. Una volta modificato il file squid.conf (stando attento a modificare la directory da “/squid3/” a “/squid/”), seguito dell’esecuzione del comando per riavviare squid mi trovo questo errore:
    Job for squid.service failed because of unavailable resources or another system error.
    See “systemctl status squid.service” and “journalctl -xe” for details.

    Data la mia inesperienza non ho la più pallida idea di che errore sia… ho provato a googlarlo ma non ci ho capito un tubo ^^’
    Qualche consiglio?

    Rispondi
    • Ciao Simone,
      grazie per i complimenti, che fanno sempre piacere 😉

      Prima di configurare la blacklist (opzionale) su squid con “noaccess.acl”, hai provato se squid+squidguard funzionano?

      Rispondi
      • Grazie per la risposta velocissima!
        Ho percorso a ritroso le operazioni della parte della guida che mostra come bloccare determinati siti web in modo da tornare alla parte 4 della guida (ho eliminato il file noaccess.acl e modificato il file squid.config). Eseguendo il comando “sudo service squid restart” l’errore è sempre lo stesso, ossia:

        Job for squid.service failed because of unavailable resources or another system error.
        See “systemctl status squid.service” and “journalctl -xe” for details.

        Rispondi
  4. ciao, non c’è un errore nella parte
    acl bad_url dstdomain “/etc/squid3/bad-sites.acl”
    http_access deny bad_url

    al posto di bad-sites.acl non dovremmo mettere il file appena creato noaccess.acl?
    Poi adesso il path di squid3 non è piu */squid3/* bensi */squid/*

    cmq gran lavoro

    Rispondi
    • Corretto!
      Grazie ancora.

      Per la path hai ancora ragione: nelle ultime release il pacchetto squid3 è stato sostituito da squid ed ora il primo è presente solo come Transitional package. Tutte le occorrenze di /etc/squid3 nella mia guida devono essere sostituite con /etc/squid/.

      Rispondi
      • Lieto di essere stato utile ora il problema che ho. Ho installato tutto e il proxy funziona solo per i files in noaccess.acl, mentre un noto sito porno passa indisturbato. Che posso fare? Sono niubbo eh

        Rispondi

Lascia un commento

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.