In questa serie di tutorial vedremo come installare e avviare un Full Node di Bitcoin su qualsiasi piattaforma ARM compatibile (come Raspberry Pi, Pine64, Odroid, Orange Pi, Banana Pi), utilizzando una distribuzione Linux basata su Debian e la riga di comando.

Questo è l’episodio 1 di 4, dove vedremo quale sistema operativo installare, come mettere in sicurezza il sistema e come migliorare la privacy utilizzando strumenti come Tor e I2P.

Requisiti hardware

Per seguire la guida ci servirà il seguente hardware:

  • Un dispositivo ARM con 4GB+ di RAM (consigliati 8 GB per prestazioni migliori):

    • Esempio: Raspberry Pi 4, Raspberry Pi 5, OrangePi 5 Ultra etc.
  • Alimentatore originale o compatibile con equivalente qualità

  • Un SSD Sata da 2,5" da 1 TB+ (consigliato un SSD da 2 TB)

  • Un adattatore “USB to SATA” con USB 3.0


⚠️ Disclaimer Sebbene questa guida sia concepita per essere compatibile con la stragrande maggioranza dei dispositivi ARM (grazie all’uso di comandi standard Linux universali), per la stesura dei vari passaggi e degli esempi pratici utilizzerò un Raspberry Pi 5.
Se utilizzate hardware differenti (come Orange Pi o RockPi), i comandi rimarranno identici al 99,9%, ma tenete presente che alcuni nomi di periferiche o configurazioni specifiche del bootloader potrebbero variare leggermente.

Installazione del Sistema Operativo

Alla base del nostro Full Node utilizzeremo il sistema operativo Armbian, senza interfaccia utente grafica, questo ci garantirà una migliore stabilità e semplifica la configurazione iniziale.


Flashing del Sistema Operativo

Per flashare il sistema operativo (file .iso) sul nostro disco SATA esterno, utilizzeremo il software Armbian imager.

  • Inseriamo il nostro disco SATA attraverso l’adattatore “USB to SATA”
  • Andiamo sul sito ufficiale di Armbian imager e scarichiamo la versione per il nostro sistema operativo, attendiamo il download, installiamo il programma ed avviamolo, a video vedremo questa schermata:

Schermata iniziale di Armbian Imager

  • Selezioniamo la prima voce (Choose Brand) e cerchiamo la marca del nostro dispositivo (es. Raspberry Pi)
  • Selezioniamo la seconda voce (Choose Board) e cerchiamo il modello (es. Raspberry)
  • Selezioniamo la terza voce (Choose OS) e cerchiamo il SO “Armbian 26.2.1 trixie

💡 Nota: la versione di Armbian potrebbe cambiare nel futuro. Assicuriamoci sempre di selezionare la distro CLI Debian-based più recente.

Armbian debian based, CLI

  • Selezioniamo la quarta voce (Choose storage) e selezioniamo il nostro disco SATA esterno collegato precedentemente, se richiesto facciamo formattare il disco dall’imager.


Primo avvio, collegamento e configurazione

Una volta effettuato il flashing possiamo collegare il nostro disco SATA al dispositivo ARM e alimentarlo. Dopo qualche minuto il sistema sarà avviato e connesso alla rete locale (se collegato via Ethernet). A questo punto dobbiamo andare a trovare l’indirizzo IP assegnato al nostro dispositivo ARM.

Per farlo:

  1. Apriamo il browser sul nostro computer

  2. Inseriamo nella barra degli indirizzi l’indirizzo IP del nostro router (es. 192.168.0.1) ed effettuiamo il login.

  3. Una volta dentro, dobbiamo cercare la una delle seguenti sezioni:

    • Dispositivi connessi
    • Client DHCP
    • Connected Devices
  4. All’interno della lista troveremo tutti i dispositivi collegati alla rete. Il dispositivo ARM potrebbe comparire con nomi come: armbian,raspberrypi, oppure come dispositivo sconosciuto. Accanto al nome troveremo il relativo indirizzo IP (es. 192.168.0.119), che useremo per collegarci via SSH.

Una volta trovato l’indirizzo IP è il momento di accedere al nostro nodo attraverso Secure Shell (SSH):

Per farlo:

  1. Windows:

    • Scaricare PuTTY 64 bit x86 o 32 bit x86 a seconda dell’architettura del sistema operativo.
    • Avviamo PuTTY e selezioniamo (a sinistra) la categoria “Session”, successivamente nella casella “Host Name” digitiamo [email protected] (dove 192.168.x.xxx è l’IP del nostro dispositivo ARM), su “Port” lasciamo 22
    • Clicchiamo su “Open” quando appare il banner “Avviso di sicurezza PuTTy”, premiamo il pulsante “Accept” ed infine digitiamo la password di default 1234
  2. MacOS e Linux:

    • Dal terminale nativo del nostro SO digitiamo il comando: ssh [email protected] (dove 192.168.x.xxx è l’IP del nostro dispositivo ARM), digitiamo la password di default 1234 e confermiamo la connessione.

Al primo accesso, il sistema avvierà una procedura guidata obbligatoria per la messa in sicurezza:

  1. Password di Root: Il sistema ci chiederà immediatamente di creare una nuova password per l’utente amministratore (root). Scegliamo una password complessa.

  2. Creazione Utente Personale: Per motivi di sicurezza, non useremo l’utente root per la gestione quotidiana del nodo. Il sistema ci chiederà di:

    • Scegliere un Username (es. giuseppe).
    • Impostare una Password dedicata per questo utente.
    • Inserire il nostro nome reale (opzionale, possiamo premere Enter per saltare).
  3. Localizzazione e Lingua: Il sistema rileverà automaticamente il nostro fuso orario (es. Europe/Rome), ci verrà chiesto se vogliamo impostare la lingua di sistema in base alla nostra posizione (Set user language based on your location?). Rispondiamo Y (Yes) per l’italiano o N (No) per mantenere l’inglese.

Una volta configurato il tutto ci ritroveremo davanti ad una schermata così:

ATTENZIONE:
Per continuità con gli screenshot e gli esempi di questa guida, utilizzerò l’utente “giuseppe”.
Questo è l’utente creato durante la configurazione iniziale ed è dotato di privilegi di amministrazione (sudo). Ogni volta che vedrete un comando preceduto da sudo, significa che lo stiamo eseguendo con i massimi permessi di sistema.
Ricordate di sostituire “giuseppe” con il nome utente che avete scelto voi durante l’installazione.

Personalizzazione del nome della macchina

Per identificare facilmente il nostro nodo nella rete, cambiamo il nome del dispositivo (hostname). Quindi sul terminale digitiamo:

sudo nano /etc/hostname

Cancelliamo il nome presente e scriviamo quello scelto (es. bitcoin-nodo). Salviamo con CTRL+X, poi Y e Invio. Per evitare rallentamenti con il comando sudo, dobbiamo aggiornare anche il file hosts:

sudo nano /etc/hosts

Cerchiamo la riga che riporta 127.0.1.1 seguita dal vecchio nome e sostituiamolo con quello nuovo. Salviamo il file con CTRL+X, poi Y e Invio.

Per evitare di dover ricordare l’indirizzo IP del nodo (che potrebbe cambiare nel tempo), installeremo un servizio chiamato Avahi. Questo ci permetterà di collegarci al dispositivo semplicemente usando il suo nome seguito da .local (ad esempio: [email protected]). Per farlo digitiamo nel terminale:

sudo apt install avahi-daemon -y

Attendiamo qualche secondo, ad installazione terminata riavviamo il sistema:

sudo reboot

Attendiamo qualche secondo e riproviamo ad effettuare il collegamento, adesso nel campo HOSTNAME inseriamo il nome scelto della macchina (es. bitcoin-nodo) seguito da .local.

Verifica delle prestazioni del disco (SSD)

Per far girare un nodo Bitcoin in modo efficiente, non basta avere molto spazio; è essenziale che la comunicazione tra il dispositivo ARM e l’SSD sia rapida. Un disco lento causerebbe ritardi nella validazione dei blocchi e potenziali blocchi del sistema. Di norma, il primo disco USB collegato viene identificato come /dev/sda. Verifichiamolo elencando i dispositivi di archiviazione:

lsblk -pli

A video riceveremo una risposta simile a questa:

Ora misuriamo la velocità di lettura sequenziale del disco. Utilizzeremo lo strumento hdparm, per prima cosa installiamolo:

sudo apt install hdparm -y

Successivamente digitiamo il seguente comando cambiandosda con il nome del disco se diverso:

sudo hdparm -t --direct /dev/sda

A video riceveremo una risposta simile:

Come interpretare i risultati:

  • Sotto i 50 MB/s: Prestazioni scarse. Probabilmente state usando una MicroSD o un adattatore USB 2.0. La sincronizzazione sarà estremamente lenta.
  • Tra 100 e 150 MB/s: Prestazioni accettabili. Il nodo funzionerà, ma la fase iniziale richiederà pazienza.
  • Sopra i 200 MB/s: Ottimo. State sfruttando correttamente il protocollo USB 3.0 e un buon SSD. Questa è la velocità ideale per un’esperienza fluida.

Cartella dati

Tutti i dati del nostro nodo (la blockchain, i database e le configurazioni) verranno salvati in una cartella dedicata chiamata /data.

Perché?

  • Sicurezza: I dati non si trovano all’interno della cartella home di un utente specifico.
  • Portabilità: È molto più semplice spostare l’intera blockchain su un altro disco in futuro, poiché basterà “montare” il nuovo supporto direttamente in /data.

Creiamo la cartella alla radice del sistema:

sudo mkdir /data

Ed infine dobbiamo assegnare la proprietà di questa cartella al nostro utente, in modo che il software Bitcoin possa scriverci dentro senza restrizioni:

sudo chown giuseppe:giuseppe /data

Ora la cartella è pronta “appartiene” al nostro utente, garantendo che i processi del nodo abbiano i permessi necessari per operare correttamente.


Sicurezza

Un Nodo dev’essere protetto da attacchi esterni per farlo utilizzeremo due strumenti molto potenti, un firewall (UFW) per chiudere le porte non necessarie ed un reverse proxy (Nginx) per crittografare tutte le comunicazioni web.

UFW

Un firewall controlla il tipo di traffico esterno accettato dal computer e quali applicazioni possono inviare dati. Per impostazione predefinita, molte porte di rete sono aperte e in ascolto delle connessioni in entrata. La chiusura delle porte non necessarie può mitigare molte potenziali vulnerabilità del sistema.

Per prima cosa, installiamo “ufw” sul nostro server, quindi nel terminale digitiamo:

sudo apt-get install ufw -y

Ora configuriamolo seguendo questi passaggi, per prima cosa disabilitiamo i log (per evitare di scrivere inutilmente sul disco e preservarne la durata):

sudo ufw logging off

Successivamente permettiamo l’accesso SSH sulla porta 22/tcp:

sudo ufw allow 22/tcp comment 'SSH'

Attiviamo il firewall con il comando:

sudo ufw enable

Ed infine verifichiamo lo stato:

sudo ufw status verbose

A video riceveremo una risposta simile a questa:

NGINX

Molte interfacce che useremo in futuro (come il Block Explorer) trasmettono dati sensibili. Anche se lo useremo solo nella nostra rete di casa, è bene che la comunicazione sia criptata. Useremo Nginx come “Reverse Proxy”, lui si occuperà di creare una connessione sicura (SSL/TLS) verso l’esterno, mentre parlerà “in chiaro” con i servizi interni al nodo.

Per prima cosa installiamo nginx:

sudo apt update && sudo apt install nginx libnginx-mod-stream -y

Verifichiamo che l’installazione sia andata a buon fine digitando il comando:

sudo nginx -v

Creiamo un certificato che cripti la connessione, sarà valido per 10 anni:

sudo openssl req -x509 -nodes -newkey rsa:4096 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt -subj "/CN=localhost" -days 3650

A questo punto puliamo la configurazione nginx esistente e creiamone una nuova:

sudo mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
sudo nano /etc/nginx/nginx.conf

Incolliamo il seguente contenuto:

user www-data;
worker_processes 1;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
  worker_connections 768;
}

stream {
  ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
  ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
  ssl_session_cache shared:SSL:1m;
  ssl_session_timeout 4h;
  ssl_protocols TLSv1.2 TLSv1.3;
  ssl_prefer_server_ciphers on;

  include /etc/nginx/streams-enabled/*.conf;

Creiamo la cartella per i futuri moduli “stream” e rimuoviamo la configurazione di default che non ci serve:

sudo mkdir /etc/nginx/streams-enabled
sudo rm /etc/nginx/sites-available/default /etc/nginx/sites-enabled/default

Adesso verifichiamo che non ci siano errori di sintassi:

sudo nginx -t


Privacy e anonimato

Gestire un nodo Bitcoin a casa ci rende sovrani, ma comunica al mondo (e al tuo fornitore internet) che in quella casa c’è qualcuno che possiede Bitcoin. Utilizzando servizi come iplocation.net, il tuo indirizzo fisico può essere determinato con precisione. Per proteggere la nostra sicurezza fisica e digitale, instraderemo il traffico del nodo attraverso le reti anonime Tor e I2P.

Installazione e configurazione di Tor

TOR, ci consente di anonimizzare il traffico Internet instradandolo attraverso una rete di nodi, nascondendo la nostra posizione e il profilo di utilizzo.

Non useremo la versione nei repository standard (spesso obsoleta), ma quella ufficiale del Tor Project, per prima cosa digitiamo:

sudo apt install apt-transport-https gpg -y

Adesso andiamo ad aggiungere i repository (specifici per ARM64):

sudo nano /etc/apt/sources.list.d/tor.list

Incolliamo il seguente contenuto:

deb [arch=arm64 signed-by=/usr/share/keyrings/tor-archive-keyring.gpg] https://deb.torproject.org/torproject.org trixie main
deb-src [arch=arm64 signed-by=/usr/share/keyrings/tor-archive-keyring.gpg] https://deb.torproject.org/torproject.org trixie main

A questo punto accediamo come utente root temporaneamente per aggiungere la chiave GPG utilizzata per firmare i pacchetti, quindi digitiamo questi 3 comandi da terminale:

sudo su
wget -qO- https://deb.torproject.org/torproject.org/A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc | gpg --dearmor | tee /usr/share/keyrings/tor-archive-keyring.gpg >/dev/null
exit

A questo punto aggiorniamo il repository apt ed installiamo Tor e Tor keyring:

sudo apt update && sudo apt install tor deb.torproject.org-keyring -y

Verifichiamo che tutto sia stato installato correttamente con il comando:

tor --version

Effettuata l’installazione di TOR, provvederemo con la configurazione per Bitcoin Core, affinché comunichi direttamente con il demone per instradare tutto il traffico attraverso la rete Tor. Dobbiamo consentire a Tor di accettare le istruzioni attraverso la sua porta di controllo, con la corretta autenticazione.

Per farlo andiamo a modificare la configurazione Tor, quindi da terminale digitiamo:

sudo nano +56 /etc/tor/torrc --linenumbers

Andiamo ad eliminare il simbolo “#” dalla riga Nr. 56 ControlPort 9051 ed aggiungiamo le seguenti voci in basso:

CookieAuthentication 1
CookieAuthFileGroupReadable 1

Ricarichiamo Tor per rendere effettive le modifiche:

sudo systemctl reload tor

Assicuriamoci che il servizio Tor funzioni e sia in ascolto sulle porte predefinite 9050 E 9051

sudo ss -tulpn | grep tor | grep LISTEN

Il Progetto I2P (Invisible Internet Project)

Mentre Tor è ottimo per uscire verso internet in modo anonimo, I2P è una rete “dentro” internet, perfetta per le connessioni peer-to-peer tra nodi Bitcoin. Useremo i2pd, una versione leggera scritta in C++.

Per prima cosa aggiungiamo il repository:

wget -q -O - https://repo.i2pd.xyz/.help/add_repo | sudo bash -s -

Successivamente installiamo il pacchetto:

sudo apt update && sudo apt install i2pd -y

Verifichiamo che i2pd sia stato installato con successo attraverso il comando:

i2pd --version

Assicuriamoci che che il servizio funzioni e sia in ascolto sulle porte predefinite:

sudo ss -tulpn | grep i2pd


Aggiornamento e manutenzione del Sistema

La sicurezza di un nodo Bitcoin passa prima di tutto dalla solidità del sistema operativo sottostante. È fondamentale mantenere il software sempre aggiornato per proteggersi da vulnerabilità note.

Eseguite il seguente comando per aggiornare l’elenco dei pacchetti e installare le versioni più recenti di tutto il software presente:

sudo apt update && sudo apt full-upgrade -y

Gestione dei servizi (need restart)

Durante il processo di aggiornamento, potrebbe apparire un banner testuale (solitamente su sfondo blu o viola) con il messaggio: “Which services should be restarted?” (Quali servizi devono essere riavviati?).
Questo accade quando vengono aggiornate librerie di sistema utilizzate da processi già in esecuzione. Ecco come comportarsi:

  • Viene mostrato un elenco di servizi contrassegnati da un asterisco [*]. Manteniamo sempre la selezione predefinita e premiamo semplicemente ENTER (Invio) per confermare il riavvio di tutti gli elementi necessari.

Nota finale: Al termine di un aggiornamento corposo, è sempre una buona pratica riavviare l’intera macchina per assicurarsi che tutti i nuovi pacchetti siano caricati correttamente:

sudo reboot