Il tunneling è un protocollo di comunicazione che consente agli utenti di accedere ad un servizio non supportato direttamente dalla propria rete o di fornirne uno. Con tale tecnologia è possibile utilizzare ad esempio IPv6 all'interno delle reti che supportano unicamente il vecchio IPv4. Non di rado le aziende sfruttano i servizi di tunneling per offrire servizi Web che se accessibili da una normale connessione sarebbero insicuri ed esposti a diverse minacce di sicurezza. Questo è possibile perché il tunneling prevede il reincapsulamento del traffico di rete sfruttando una forma di crittografia. Esistono diversi modi per implementare un servizio di tunneling. Nella guida di oggi parleremo di come attivarne uno all'interno con Raspberry Pi.
Questa piccola ma potente board ARM può essere infatti configurata per fornire un servizio di tunneling. Essendo poi di dimensioni ridotte è possibile collocarla dove si preferisce, magari anche agganciata dietro un mobiletto, cosi da non dare fastidio. Senza contare che, dovendo essere alimentata da un caricatore per device mobile, i suoi consumi energetici sono minimi e può essere lasciata attiva anche h24 senza impattare sulle spese energetiche.
L'hardware necessario per il progetto
Per tale configurazione non sono necessari acquisti costosi né bisogna dotarsi di add-on hardware speciali. Il tunneling viene infatti impostato via software. Meglio optare per Raspberry Pi 4 model B con 8GB di RAM, e dotarsi di mouse, tastiera, cavo ethernet cat 6 e di un display con cavo HDMI annesso.
Installazione del sistema operativo Raspberry Pi OS
In tale tutorial adotteremo come sistema operativo di riferimento Raspberry Pi OS, ovvero la distribuzione Linux dedicata alla board ARM. Per realizzare il media d'installazione ci affideremo invece a Raspberry Pi Imager, l'imaging tool realizzato dai developer dalla Raspberry Pi Foundation.
A questo punto eseguiamo il download di Raspberry Pi OS, poi quello di Raspberry Pi Imager e successivamente avviamo tale utility. Il suo funzionamento è davvero lineare. Con "Choose OS" si seleziona il file ISO della distribuzione, da "Choose Storage" impostiamo invece la microSD da utilizzare ed infine avviamo il processo di flash cliccando su "Write".
Dopo che il programma ha terminato il processo spostiamo la microSD dal computer al Raspberry Pi e connettiamo il device alla corrente per eseguire l'avvio del wizard d'installazione del sistema operativo. Ovviamente per il primo setting connettiamo anche mouse, tastiera e display.
Installazione e configurazione del Cloudflare Tunnel
Terminata l'installazione di Raspberry Pi OS posizioniamoci all'interno del Desktop e apriamo una finestra del terminale. Per questa guida opteremo per il servizio di tunneling offerto da Cloudflare. Andiamo quindi ad installare il software necessario con APT:
sudo apt install curl lsb-release
Ora aggiungiamo il repository di Cloudflare:
curl -L https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-archive-keyring.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/cloudflare-archive-keyring.gpg] https://pkg.cloudflare.com/cloudflared $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/cloudflared.list
sudo apt update
E successivamente installiamo il pacchetto per il tunneling:
sudo apt install cloudflared
Passiamo quindi al login con le nostre credenziali dei servizi Cloudflare:
cloudflared tunnel login
Dopo l'ultimo comando bash dovrebbe essere restituito un messaggio del genere:
Please open the following URL and log in with your Cloudflare account: https://dash.cloudflare.com/argotunnel?callback=https%3A%2F%2Flogin.cloudflareaccess.org%2F123356789 Leave cloudflared running to download the cert automatically.
Dobbiamo poi usare il browser per connetterci tramite il link riportato dal programma ed eseguire il login usando username e password con cui ci siamo registrati sul sito di Cloudflare. Dopo aver inserito i dati richiesti nella pagina Web nella shell dovrebbe comparire tale messaggio:
You have successfully logged in. If you wish to copy your credentials to a server, they have been saved to: /home/pi/.cloudflared/cert.pem
Ora possiamo procedere alla fase di creazione del tunneling:
cloudflared tunnel create tunnelingditest
Se l'operazione è andata bene dovremmo visualizzare tale messaggio:
2023-06-01T04:54:54Z INF Added CNAME DOMAINNAME which will route to this tunnel tunnelID=123356789
Configurare il forwarding su Raspberry Pi
Ora che il tunneling è operativo dobbiamo fare in modo che Raspberry Pi lo sfrutti a dovere:
cloudflared tunnel run --url localhost:80 tunnelingditest
Con il commando appena scritto in bash abbiamo indicato al sistema di sfruttare il nostro tunneling, chiamato tunnelingditest, sulla porta 80
usata dai Web server HTTP. Non appena il servizio si attiva dovremmo poter vedere questo output nella shell:
2023-06-01T09:34:40Z INF Starting tunnel tunnelID=123456789
Il tunneling è quindi operativo e possiamo chiuderlo con la combinazione di tasti CTRL+C per poi passare alla configurazione del Web server, come Apache o NGINX, in modo tale che l'accesso venga eseguito sempre tramite il tunneling.
Impostare il tunneling per l'esecuzione al boot
Ora che il servizio è stato configurato a dovere possiamo impostarlo perché si attivi al boot del device. Per farlo dobbiamo modificare tale file:
sudo nano ~/.cloudflared/config.yml
con questi parametri
tunnel: [tunnelingditest]
credentials-file: /home/pi/.cloudflared/550e8400-e29b-41d4-a716-446655440000.json
ingress:
- hostname: iltuohostname.com
service: http://localhost:80
- service: http_status:404
Salviamo le modifiche con CTRL+O e chiudiamo il file con CTRL+X. Ricordiamoci di modificare la stringa alfanumerica finale con il nostro UUID. Inoltre nella path abbiamo lasciato il nome utente "pi", che è quello usato di base da Raspberry Pi OS. Quindi se stiamo utilizzando un utente diverso dobbiamo modificare la voce con la dicitura corretta.
In questo esempio abbiamo scelto di utilizzare come prima la porta 80
ma possiamo impostare il tutto su un'altra porta. Ecco una configurazione per HTTPS:
tunnel: [tunnelingditest]
credentials-file: /home/pi/.cloudflared/550e8400-e29b-41d4-a716-446655440000.json
ingress:
- hostname: iltuohostname.com
service: https://localhost:8080
- service: https_status:404
oppure con SSH:
tunnel: [tunnelingditest]
credentials-file: /home/pi/.cloudflared/550e8400-e29b-41d4-a716-446655440000.json
ingress:
- hostname: iltuohostname.com
service: ssh://localhost:22
Adesso lanciamo i seguenti comandi da terminale per rendere effettiva la configurazione:
sudo cloudflared --config ~/.cloudflared/config.yml service install
sudo systemctl enable cloudflared
sudo systemctl start cloudflared
Abbiamo così indicato a Raspberry Pi OS di eseguire sempre il demone cloudflared
al boot con i setting del tunneling inseriti in precedenza.