Configurare Pi-Hole per la Privacy e Performance
Puoi configurare il PiHole in molti modi, questa guida incentrerà l’attenzione sulla privacy e le performance.
Requisiti
Ho già trattato in questi meandri cosè Pi-Hole e cosa ti occorre per poterlo far funziona (puoi trovare il tutto qui.)
Iniziamo
Flash su una micro sd card (assicuratevi che sia vuota) il Rasbian Lite. Ci sono numerosi modi anche per questo e soprattutto i software, sta a voi quindi scegliete il vostro metodo preferito (Etcher, Raspberry Pi Imager, dd, etc.) quando completato questo processo, create l’ssh file sulla partizione di boot della mini sd card con il comando:
1
touch ssh
o da Windows PowerShell:
1
$Null | Out-File .\ssh
o tasto destro del mouse Nuovo > Documento di Testo, rinominatelo ssh e rimuovete l’estensione .txt.
Inserite la vostra Micro SD Card nel vostro Pi e accendetelo. Trovate l’ip assegnato nella vostra rete e autenticatevi in SSH. Eseguite nella shell:
1
sudo raspi-config
per configurare la localizzazione, Fuso Orario, GPU memory split (per quello che ci occorre in questo caso è possibile diminuirla e portarla a 8MB), e espandere i file system. Configurate anche l’hostname. Consiglio di non configurare il wi-fi e collegarlo tramite un cavo ethernet alla rete.
dopo il reboot aggiornate il sistema.
1
sudo apt-get update && sudo apt-get upgrade -y
Installate dnsutils
1
sudo apt install dnsutils
Installate git
1
sudo apt install git
Configurate ora il sistema per un IP statico nel seguente .conf:
/etc/dhcpcd.conf
Decommentare i valori seguenti al “Example static IP configuration” è configurate con i vostri. Come indirizzi DNS impostate quelli usati dai voi, ma questo saranno usati per la ricerca da parte del sistema di pacchetti, git, etc.
Salvate e riavviate. Autenticatevi e verificate l’ip statico configurato e il DNS.
Configurate l’NTP (Network Time Protocol). Controllate la configurazione corrente sul sistema:
1
timedatectl status
per modificare/controllare le configurazioni:
/etc/systemd/timesyncd.conf
Commentate l’ultima riga e configurate i time servers. è possibile usare quello di cloudflare time.cloudflare.com come NTP e come failback, se non dovesse essere disponibile quest’ultimo, quello del sistema debian.pool.ntp.org. se vuoi saperne di più riguardo il time service offerto da CloudFlare, c’è una pagine al seguente indirizzo: blog cloudflare
Uscite e salvate il file.
assicuratevi che il servizio del time synchronize è abilitato:
1
sudo timedatectl set-ntp true
Installata il pacchetto degli unattended upgrades se desiderate automatizzare l’update dove girerà il nostro pi-hole:
1
sudo apt install unattended-upgrades
Controllare il file di configurazione:
/etc/apt/apt.conf.d/50unattended-upgrades
magari vorrete modificare/correggere dei parametri, raccomando di decommentare e cambiare il parametro “Unattended-Upgrade::Remove-Unused-Dependencies” a “true”.
Uscite e salvate il file.
Create il file per definire gli upgrade periodici:
1
sudo vi /etc/apt/apt.conf.d/02periodic
Dovrebbe essere vuoto, copiate il seguente come contenuto:
1
2
3
4
5
6
APT::Periodic::Enable “1”;
APT::Periodic::Update-Package-Lists “1”;
APT::Periodic::Download-Upgradeable-Packages “1”;
APT::Periodic::Unattended-Upgrade “1”;
APT::Periodic::AutocleanInterval “1”;
APT::Periodic::Verbose “2”;
salvate il file.
Per Controllare i unattended upgrades potete eseguire il seguente comando anche come debug per la vostra configurazione:
1
sudo unattended-upgrades -d
Cambiate la password di default per il vostro utente Pi e cercate di salvarla in un posto sicuro magari nel vostro password manager.
1
passwd
Create un Nuovo Utente
1
sudo adduser <username>
e aggiungetelo nel gruppo sudo.
1
sudo adduser <username> sudo
è probabile che hai bisogno di aggiungere il nuovo utente al gruppo video per alcune applicazioni di monitoring, quindi aggiungetelo al gruppo.
1
sudo adduser <username> video
Uscite e autenticatevi con il nuovo user. Verificate che il sudo funzioni e bloccate l’utente di default Pi:
1
sudo passwd –l pi
Modificate il file di configurazione dell’SSH.
/etc/ssh/sshd_config
Decommentate questa entry:
PermitRootLogin no
e la seguente, suggerendo di mettere a 3 i tentativi di autenticazione massime:
MaxAuthTries 3
Raccomando di creare delle Authentication key pair, (qui come crearla) una volta create, potete cambiare la seguente entry a no:
PasswordAuthentication no
Salvate e uscite e fate ripartire il servizio ssh:
1
sudo service ssh restart
Installate ora Fail2Ban.
Fail2Ban e Firewall
1
sudo apt install fail2ban
Fail2ban bloccherà ogni tentativo malevolo (definito con delle particolari regole chiamate jail) effettuate esclusivamente su determinate porte, in questo caso bloccherà ogni login fallito dopo 5 tentativi per 10 minuti sulla porta ssh. (i tempi di ban sono definiti sempre nelle jail)
Fail2Ban installato dal repository provvede sicurezza esclusivamente al protocollo IPv4. Prossimamente cercherò di approfondire l’argomento anche aggiungendo qualcosa per il supporto IPv6. Fail2ban bloccherà l’ip dove è trovata l’eccezione definita nelle jails ed esclusivamente su quella porta e NON su tutta la macchina e le altre porte.
il file di configurazione di fail2ban è il seguente:
/etc/fail2ban/jail.conf
Ogni cambiamento di configurazione apportato necessita del riavvio del servizio:
1
sudo service fail2ban restart
Installate il firewall.
Cercate di non chiudervi fuori dal server abilitandolo senza prima dichiarare le policy che ci permetteranno di passare.
Installate il pacchetto ufw:
1
sudo apt install ufw
e definite e personalizzate le vostre policy, qui un esempio di quelle necessarie al nostro caso:
1
2
3
4
sudo ufw allow 80
sudo ufw allow 443
sudo ufw allow 53
sudo ufw allow 22
Consiglio di dichiarare la porta SSH con regole restrittive, esempio accedere dalla porta 22/ssh esclusivamente da un altro vostro dispositivo sulla rete locale:
1
sudo ufw allow from 192.168.1.120 proto tcp to any port 22
Abilitate il firewall:
1
sudo ufw enable
per vedere le regole attive, eseguite il seguente comando:
1
sudo ufw status verbose
Log2ram
Log2ram è stato creato per il Raspberry Pi. Dato che quest’ultimo si avvale di micro SD card per lo storage, dove il continuo scrivere dei log crea parecchio IOPS (operazioni di input/output) cosa che può degradare con il tempo la nostra SD card. Log2ram crea una directory /var/log/ virtuale in memoria e la sincronizza periodicamente sullo storage fisico. Questo Riduce IOPS sulla micro SD Card, l’unica complicanza è che i log sono stoccati in memoria e non vengono scritti su disco (quindi a causa di un reboot ad esempio) può rendere più difficile il rintracciare vari problemi o azioni di debug da analizzare. è consigliato usarla su questa configurazione per il PiHole perchè saremo comunque avvisati di ogni possibile segnalazione.
Installate log2ram.
1
2
3
4
echo "deb [signed-by=/usr/share/keyrings/azlux-archive-keyring.gpg] http://packages.azlux.fr/debian/ bookworm main" | sudo tee /etc/apt/sources.list.d/azlux.list
sudo wget -O /usr/share/keyrings/azlux-archive-keyring.gpg https://azlux.fr/repo.gpg
sudo apt update
sudo apt install log2ram
Reboot.
1
sudo reboot
Configurate log2ram:
/etc/log2ram.conf
impostate il size a 100MB e il LOG_DISK_SIZE a 200M. Uscite, salvate e restart del servizio log2ram.
1
sudo service log2ram restart
Controllare che log2ram sta girando.
1
df -h
Installate e configurate Pi-Hole
Ora che il nostro Raspbian è configurato e messo in sicurezza potete trovare il necessario per configurare il pihole qui.
Migliorare la sicurezza di Pi-Hole
Adesso abbiamo un Pi-Hole funzionante sulla nostra rete, ma con blocchi minimi (ricordatevi di aggiungere nuove blocklist oltre a quelle presenti e configurate di default) e che manda la ricerca dei DNS al servizio scelto nelle configurazioni. Ora possiamo configurare il nostro upstream DNS provider, ma questo cambierà esclusivamente a chi ci affidiano per la ricerca dei DNS. E se noi non ci fidassimo di nessuno? Possiamo installare quindi Unbound e risolvere i DNS noi stessi usando dei root servers che ricorsivamente risolvono i nomi DNS. Info maggiori e dettagliate su come funziona potete trovarle nelle guide del pihole. In pratica Unbound cercherà una query DNS chiedendo ai TLD (Top-level domain) servers un DNS in maniera ricorsiva. Tra i benifici in primis maggior sicurezza; non hai bisogno di affidarti ad un provider upstream per il tuo traffico DNS. L’inconveniente sarà sicuro la performance per le ricerche iniziali. PiHole e Unbound possono tutte e due essere configurati con dei caching, che aiuterà a risolvere la sotto sequenza di ricerca.
Installate Unbound.
1
sudo apt install unbound
per i root hints eseguite:
1
wget https://www.internic.net/domain/named.root -qO- | sudo tee /var/lib/unbound/root.hints
Create la configurazione per Pi-Hole:
/etc/unbound/unbound.conf.d/pi-hole.conf
Copiate nel file la configurazione di seguito. Questa è differente da quella presente nella documentazione del PiHole. Include anche le conffigurazioni di caching che miglioreranno le performance spiegate poco sopra.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
server:
# If no logfile is specified, syslog is used
# logfile: "/var/log/unbound/unbound.log"
verbosity: 0
interface: 127.0.0.1
port: 5335
do-ip4: yes
do-udp: yes
do-tcp: yes
# May be set to yes if you have IPv6 connectivity
do-ip6: no
# You want to leave this to no unless you have *native* IPv6. With 6to4 and
# Terredo tunnels your web browser should favor IPv4 for the same reasons
prefer-ip6: no
# Use this only when you downloaded the list of primary root servers!
# If you use the default dns-root-data package, unbound will find it automatically
root-hints: "/var/lib/unbound/root.hints"
# Trust glue only if it is within the server's authority
harden-glue: yes
# Require DNSSEC data for trust-anchored zones, if such data is absent, the zone becomes BOGUS
harden-dnssec-stripped: yes
# Don't use Capitalization randomization as it known to cause DNSSEC issues sometimes
# see https://discourse.pi-hole.net/t/unbound-stubby-or-dnscrypt-proxy/9378 for further details
use-caps-for-id: no
# Reduce EDNS reassembly buffer size.
# Suggested by the unbound man page to reduce fragmentation reassembly problems
edns-buffer-size: 1472
# Perform prefetching of close to expired message cache entries
# This only applies to domains that have been frequently queried
prefetch: yes
cache-min-ttl: 0
serve-expired: yes
msg-cache-size: 128m
rrset-cache-size: 256m
# One thread should be sufficient, can be increased on beefy machines. In reality for most users running on small networks or on a single machine, it should be unnecessary to seek performance enhancement by increasing num-threads above 1.
num-threads: 1
# Ensure kernel buffer is large enough to not lose messages in traffic spikes
so-rcvbuf: 1m
# Ensure privacy of local IP ranges
private-address: 192.168.0.0/16
private-address: 169.254.0.0/16
private-address: 172.16.0.0/12
private-address: 10.0.0.0/8
private-address: fd00::/8
private-address: fe80::/10
Restart Unbound:
1
sudo service unbound restart
Testate Unbound
1
dig pi-hole.net @127.0.0.1 -p 5335
OPZIONALE Configuriamo ora qualche job schedulato su cron per tenere il server aggiornato, incluso Pi-Hole e Unbound.
1
sudo crontab –e
Copia le seguenti schedulazioni:
1
2
30 2 * * SUN pihole -up
05 01 15 */3 * wget -O /var/lib/unbound/root.hints https://www.internic.net/domain/named.root
Uscite e Salvate
Il Team di PiHole NON raccomanda l’aggiornamento via job cron (pihole -up). Fate attenzione che con le attuale configurazioni il vostro attuale DNS server (pihole) si aggiornerà ogni Domenica via cron, cercate di rimanere aggiornati per quanto riguarda le future patch notes dei rilasci se avete intenzione di configurarlo in questa maniera. Se ci sarà una Major Release e volete far verificare ad altri prima di aggiornare, commentate nel crontab la prima riga usando un #
Autenticatevi sulla vostra admin page http://pi.hole/admin da browser, con la password precedentemente configurata. Navigate nei Settings, e cliccate sul tab DNS. Togliete la spunta a Google (se in precedenza durante la configurazione l’avevate scelto come DNS provider) e mettere la spunta su custom e inserire 127.0.0.1#5335. cliccate save per far puntare Pihole ad Unbound.
le performance sulle ricerche iniziali saranno lente ma miglioreranno rapidamente grazie al caching del PiHole e alle cache impostate su Unbound.
Qualè il Vantaggio?
Una volta che tutto è configurato, avrai un Server DNS sicuro e privato, veloce e robusto sulla tua rete locale, oltre ad avere le tue informazione DNS più private e non dovrai affidarti a nessun servizio di terzi per il tuo traffico DNS.