Tunnel IPv6 di HE via Raspberry Pi

Era un po’ che non tiravo fuori la mia fissa con IPv6…

Dopo oltre due mesi di trasferta per finire l’infrastruttura di una nave, eccomi tornato alla carica con IPv6.

Dopo aver creato un tunnel con HE, ho ripescato dalle mia cianfrusaglie un Raspberry Pi 2 modello B V1.1 da usare come router IPv6.

Con questo modello di Raspberry bisogna portare un po’ di pazienza durante le operazioni di boot del sistema operativo. Allo stesso modo, quando si apre una sessione ssh dopo qualche ora o giorni dall’ultimo collegamento è normale che impieghi qualche secondo a rilasciare il prompt.

Ci sono alcune guide in giro per configurare un tunnel con HE su questa piattaforma, molte però si riferiscono a vecchie versione di Raspbian. Questa guida fa riferimento all ultima versione disponibile nel momento della prima redazione di questo articolo, Raspbian GNU/Linux 11 bullseye.

Benché questa guida faccia riferimento a Windows, potrebbe essere utile avere a disposizione un sistema operativo capace di montare nativamente le partizioni ext3 nel caso in cui si commetta qualche errore di configurazione della rete. In alternativa si può collegare il Raspberry ad un monitor HDMI e ad una tastiera USB oppure si può usare l’interfaccia seriale con il cavo apposito.

Installare PiOS con il Pi Imager su una MicroSD da almeno 4 Gb; al termine estrarre la schedina e riconnetterla per far rileggere a Windows la partizione di boot (ignorare eventuali errori di partizione non leggibile o partizione da correggere).

Windows monterà la partizione boot della MicroSD; per riconoscerla, è quella che contiene il file start.elf nella root. In questa stessa directory creare un file vuoto ssh senza estensioni per dire al sistema operativo di attivare il server ssh.

Estrarre la schedina dal PC, inserirla nel Raspberry e connettere il dispositivo alla LAN e all’alimentazione; dopo circa 10-15 secondi dal boot del Raspberry, si dovrebbe vedere un host raspberrypi nel server DHCP. Il primo boot richiede un po’ di tempo prima che il server ssh sia disponibile.

Collegarsi via ssh con utente pi e password raspberry. Aggiornare il sistema con i comandi sudo apt update e quindi sudo apt full-upgrade, al termine riavviare il Raspberry per verificare che tutto sia in ordine.

Gran parte dei comandi devono essere eseguiti con privilegi di root, anteponendo sudo al comando, da qui in poi viene data per scontata questa informazione. Per evitare di continuare ad anteporre sudo, si può eseguire sudo -i

Eseguire raspi-config e modificare questi parametri:

  • 8 -> Update
  • 1 -> S5 -> B1 per disabilitare l’interfaccia grafica
  • 1 -> S3 e modificare la password di default
  • 1 – >S4 e modificare il nome del host
  • 5 ->L2 e impostare la time zone
  • 6 ->A1 per espandere il file system di root se la MicroSD è più grossa di 4 Gb

Dal momento che quando andrà online il tunnel non ci sarà ancora un firewall attivo e il sistema avrà un IPv6 pubblico, è meglio mettere in sicurezza il server ssh. Editare /etc/ssh/sshd_config togliere il commento da AddressFamily e sostituire any con inet per forzare ssh ad ascoltare solamente connessioni IPv4.

Collegarsi a HE con il proprio account per la gestione del tunnel creato, selezionare Example Configurations e quindi Debian/Ubuntu. Copiare il testo che appare e incollarlo in nuovo file /etc/network/interfaces.d/he-ipv6

HE utilizza il vostro IP pubblico come parametro local, spesso è necessario sostituire l’IP pubblico con l’IPv4 che assegnerete in maniera statica al Raspberry come indicato nel passo successivo.

Creare un file /etc/network/interfaces.d/eth0 che conterrà i parametri di configurazione IP della scheda di rete. Ipotizzando che il Raspberry abbia un IPv4 in LAN 172.16.0.6 con gateway 254 e ipotizzando che il blocco di HE sia 2001:db8:badd:ecaf::/64 il contenuto del file sarà

auto eth0
    iface eth0 inet static
    address 172.16.0.6
    gateway 172.16.0.254
    netmask 24
    dns-nameserver 9.9.9.9 
    dns-nameserver 1.1.1.1

iface eth0 inet6 static
    address 2001:db8:badd:ecaf::1
    netmask 64

Il Raspberry avrà quindi IPv6 2001:db8:badd:ecaf::1

Per disabilitare il DHCP del Raspberry eseguire systemctl stop dhcpcd.service && systemctl disable dhcpcd.service

Editare /etc/sysctl.conf e togliere il commento dalla riga net.ipv6.conf.all.forwarding=1 per abilitare il routing a livello di IPv6.

A questo punto è possibile riavviare il Raspberry, se avete fatto tutto giusto dopo un minuto circa potreste essere in grado di accedere nuovamente via ssh.

Si può provare se il tunnel IPv6 è attivo con il comando ping6 ipv6.google.com

Possiamo assegnare un IPv6 ad un altro host della LAN, una macchina Windows potrebbe avere questa configurazione:

HE vi ha passato 264 indirizzi, potete sbizzarrirvi con quello che volete.

È molto importante che il firewall di Windows sia attivo perché questa operazione assegna in IPv6 pubblico al sistema.

Una volta configurato IPv6, potete aprire un browser e visitare la pagina di test di Google, questo sito di test, oppure questo sito.

Non includo qui le istruzioni per assegnare automaticamente gli IPv6 in LAN perché eventuali host in rete potrebbero smettere di funzionare correttamente. Durante i test è meglio controllare chi esce in IPv6.

A questo punto ci dobbiamo proteggere con un po’ di regole di firewall. Creare un file /etc/ip6tables.up.rules con questo contenuto senza renderlo eseguibile

#!/bin/sh
#
# Regole di firewall IPv6
#

# Definizioni delle variabili di configurazione
IP6TABLES='/sbin/ip6tables'
WAN_IF='he-ipv6'
LAN_IF='eth0'

# Partiamo da un ambiente pulito
$IP6TABLES -F INPUT
$IP6TABLES -F OUTPUT
$IP6TABLES -F FORWARD
$IP6TABLES -F
$IP6TABLES -X

# Regola generica di drop per tutto il traffico
$IP6TABLES -P INPUT DROP
$IP6TABLES -P OUTPUT DROP
$IP6TABLES -P FORWARD DROP

# Scarto i pacchetti che hanno Routing Type 0
$IP6TABLES -A INPUT -m rt --rt-type 0 -j DROP
$IP6TABLES -A FORWARD -m rt --rt-type 0 -j DROP
$IP6TABLES -A OUTPUT -m rt --rt-type 0 -j DROP

# Permetto tutto il traffico sul loopback
$IP6TABLES -A INPUT  -i lo -j ACCEPT
$IP6TABLES -A OUTPUT -o lo -j ACCEPT

# Permetto tutto il traffico verso Internet
$IP6TABLES -A OUTPUT -o $WAN_IF -j ACCEPT

# Permetto tutto il traffico in ingresso con flag Established e related
$IP6TABLES -A INPUT -i $WAN_IF -m state --state ESTABLISHED,RELATED -j ACCEPT

# Permetto alla LAN di accedere al Raspberry
$IP6TABLES -A INPUT -i $LAN_IF -j ACCEPT
$IP6TABLES -A OUTPUT -o $LAN_IF -j ACCEPT

# Permetto il traffico sul link local
$IP6TABLES -A INPUT -s fe80::/10 -j ACCEPT
$IP6TABLES -A OUTPUT -s fe80::/10 -j ACCEPT

# Permetto il traffico multicast
$IP6TABLES -A INPUT -d ff00::/8 -j ACCEPT
$IP6TABLES -A OUTPUT -d ff00::/8 -j ACCEPT

# Regole un po' paranoiche, ma ci sta
#$IP6TABLES -I INPUT -i $WAN_IF -p tcp --syn -j DROP
#$IP6TABLES -I FORWARD -i $WAN_IF -p tcp --syn -j DROP
#$IP6TABLES -I INPUT -i $WAN_IF -p udp  -j DROP
#$IP6TABLES -I FORWARD -i $WAN_IF -p udp  -j DROP

# Regole per permettere i pacchetti ICMPv6
$IP6TABLES -N AllowICMPs
# Destination unreachable
$IP6TABLES -A AllowICMPs -p icmpv6 --icmpv6-type 1 -j ACCEPT
# Packet too big
$IP6TABLES -A AllowICMPs -p icmpv6 --icmpv6-type 2 -j ACCEPT
# Time exceeded
$IP6TABLES -A AllowICMPs -p icmpv6 --icmpv6-type 3 -j ACCEPT
# Parameter problem
$IP6TABLES -A AllowICMPs -p icmpv6 --icmpv6-type 4 -j ACCEPT
# Echo Request, con protezione contro il flooding
$IP6TABLES -A AllowICMPs -p icmpv6 --icmpv6-type 128 -m limit --limit 5/sec --limit-burst 10 -j ACCEPT
# Echo Reply
$IP6TABLES -A AllowICMPs -p icmpv6 --icmpv6-type 129 -j ACCEPT

# Permetto ICMPv6
$IP6TABLES -A INPUT -p icmpv6 -j AllowICMPs
$IP6TABLES -A FORWARD -p icmpv6 -j AllowICMPs
$IP6TABLES -A OUTPUT -p icmpv6 -j AllowICMPs

# Permetto il trafico routato dalla LAN
$IP6TABLES -A FORWARD -m state --state NEW -i $LAN_IF -o $WAN_IF  -j ACCEPT
$IP6TABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

Rendere eseguibile il file, eseguire lo script e provare ad accedere ai siti di test IPv6 con un browser da un host differente dal Raspberry. Allo stesso modo, provare a chiudere la sessione ssh con il Raspberry e riaprirne una nuova. Insomma fate tutte le prove del caso per evitare che una partenza dello script all avvio vi chiuda fuori dal Raspberry.

Una volta che si è soddisfatti aggiungere questa riga in fondo a /etc/network/interfaces.d/eth0

up /etc/ip6tables.up.rules

e riavviare il Raspberry.

Buon divertimento con IPv6.

Autore: Luigi Rosa

Consulente IT, sviluppatore, SysAdmin, cazzaro, e, ovviamente, geek.

Un commento su “Tunnel IPv6 di HE via Raspberry Pi”

Spazio per un commento

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