TommyBlue.it

IPv6 in pochi passi con ALIX e SixXS

Come ormai saprete (1 - 2) ho un debole per gli embedded ALIX di PcEngines. In questo caso userò una scheda 2d13 con RTC, indispensabile perché se il vostro orologio non è sincronizzato con quello del broker IPv4-IPv6 (±30 secondi) non avrete la connessione IPv6!

Come da tradizione il sistema operativo è Debian Voyage, ma tutta la procedura può comunque essere applicata ad una qualsiasi macchina con installato un os Debian-based (a meno di qualche piccola modifica). Per altri sistemi operativi guardate la wiki di SixXS.

SixXS

Il primo passo è, per l'appunto, quello di registrarsi su SixXS e richiedere un account. La registrazione, prima di essere accettata, deve essere verificata manualmente quindi probabilmente potrebbe passare qualche giorno (nel mio caso ci sono voluti pochi minuti).

Una volta ottenuti i dati di accesso bisogna richiedere un tunnel. In questa guida coprirò la configurazione di un tunnel heartbeat con Aiccu. Anche la richiesta del tunnel richiede approvazione, quindi in attesa possiamo configurare il sistema (una volta approvato il tunnel basta inserirne il nome in /etc/aiccu.conf e gli ip in /etc/network/interfaces).

AICCU

Come premesso il sistema deve avere l'ora corretta con uno scarto massimo di 30 secondi, altrimenti AICCU non stabilisce la connessione. Nel più semplice dei casi per farlo basta installare il pacchetto ntp. AICCU logga in /var/log/syslog, ecco il tipico errore per problemi di sincronizzazione:

~# cat /var/log/syslog | grep aiccu

Apr 28 08:50:19 voyage aiccu[1731]: sock_getline() : "200 Client Identity accepted"
Apr 28 08:50:19 voyage aiccu[1731]: sock_printf()  : "get unixtime"
Apr 28 08:50:19 voyage aiccu[1731]: sock_getline() : "200 1312374039"
Apr 28 08:50:19 voyage aiccu[1731]: The clock is off by 355469420 seconds, use NTP to sync it!
Apr 28 08:50:19 voyage aiccu[1731]: sock_printf()  : "QUIT Aborting: Clock is off by 355469420 seconds "
Apr 28 08:50:19 voyage aiccu[1731]: Couldn't retrieve first tunnel for the above reason, aborting

Una volta sincronizzato l’orario si può procedere installando il pacchetto aiccu . All’installazione vi verranno chiesti i dati di accesso a SixXS. Oltre a questo ho scommentato soltanto due righe in /etc/aiccu.conf, riporto tutto il file:


username MY_USERNAME
password MY_PASSWORD
protocol tic
server tic.sixxs.net
ipv6_interface sixxs
tunnel_id MY_TUNNEL
verbose false
daemonize true
automatic true
requiretls false
makebeats true

Basta adattare le variabili username, password e tunnel_id (tutti dati che vi devono essere dati da SixXS) e il gioco è fatto. Molte informazioni le potete trovare anche nella wiki di SixXS: http://www.sixxs.net/wiki/Aiccu

Interfaccia di rete

Quando il tunnel ci verrà  attivato potremo configurare l'interfaccia, nello specifico inserendo questa configurazione in /etc/network/interfaces (utilizzando i dati che abbiamo ottenuto):

auto sixxs
iface sixxs inet6 v4tunnel
address MY_IPV6_IP
netmask 64
endpoint 213.254.12.34
ttl 64
up ip link set mtu 1280 dev sixxs
up ip route add default via MY_IPV6_GATEWAY dev sixxs

L’IPv4 dell’endpoint è quello italiano, ad ogni modo nella mail di conferma attivazione del tunnel c’è scritto tutto. Il vostro indirizzo IP e quello del gateway differiscono soltanto per l’ultima cifra: :1 per il gateway e :2 per il vostro IP.

Test IPv6

Terminati questi passaggi il nostro IPv6 dovrebbe essere pronto. Riavviamo AICCU e la rete (/etc/init.d/networking restart) e testiamo il tutto pingando (occhio, ci vuole ping6) il gateway IPv6. Per ulteriore prova si può visitare  la home page di SixXS dove un blocchetto verde ci accoglierà  con un festante "You've got IPv6!". Se siete a terminale e volete testare qualche sito in IPv6 fate attenzione che lynx supporta IPv6 mentre links2 no.

Subnet, routing e assegnazione IP

Ora che abbiamo un IPv6 e lo usiamo per navigare da un pc, è giunto il momento di ottenere una subnet /48 per poter assegnare un IPv6 ad ogni nostro apparato (ovvero ai nostri 1.208.925.819.614.629.500.000.000 apparati).

Come al solito il primo passo è richiedere a SixXS una subnet. Una volta ottenuta la rete /48, seguendo la guida nella wiki di Sixxs, andiamo a configurare una /64 per la nostra rete. Assegniamo staticamente uno di questi indirizzi in /etc/network/interfaces:


iface eth0 inet6 static
address MY_IP_FROM_SUBNET
netmask 64

Riavviata la rete, il nostro ALIX avrà  un secondo IPv6 (oltre a quello del tunnel). Per permettere il routing e l’advertising degli indirizzi ip usiamo radvd: non si tratta di un DHCPv6 (al momento non esiste un DHCPv6 veramente funzionante) ma di un router IPv6 che periodicamente invia pacchetti multicast di Router Advertisement per permettere l’autoconfigurazione degli apparati di rete utilizzando gli ip della nostra subnet. Dopo aver installato il pacchetto radvd bisogna creare il file /etc/radvd.conf con il seguente contenuto:


interface eth0{
  AdvSendAdvert on;
  prefix MY_IP_FROM_SUBNET/64
  {
    AdvOnLink on;
    AdvAutonomous on;
    AdvRouterAddr on;
  };
};

Avviamo radvd e abilitiamo il forwarding:


echo "net.ipv6.conf.all.forwarding=1" >> /etc/sysctl.conf
echo "net.ipv6.conf.default.forwarding=1" >> /etc/sysctl.conf
sysctl -p

Se tutto è andato come doveva le macchine nella vostra rete dovrebbero ottenere un indirizzo IPv6 (parlo di Mac e Linux, per Windows arrangiatevi.. :) e navigare IPv6. Provate ad aprire il sito SixXS per averne conferma:

Firewall IPv6

Una cosa che ben presto si capisce di IPv6 è che le tanto odiate NAT in certi casi facevano comodo. Uno di questi è che un IP privato era privato. Con IPv6 quasi tutto è pubblico e quindi un firewall è indispensabile.

Ho scritto un breve script per ip6tables prendendo spunto dalla wiki si SixXS, dopo averlo personalizzato (dovete settare qualche IP) basta metterlo in /etc/init.d e aggiungerlo al runlevel di default (update-rc.d firewall-ipv6 defaults):


#! /bin/bash

### BEGIN INIT INFO
# Provides:             firewall-ipv6
# Required-Start:       $remote_fs $syslog
# Required-Stop:        $remote_fs $syslog
# Default-Start:        2 3 4 5
# Default-Stop:         0 1 6
# Short-Description:    IPTables-based IPv6 firewall
### END INIT INFO

set -e

# /etc/init.d/firewall-ipv6: start and stop the ip6tables firewall

IP6="/sbin/ip6tables"

# L'indirizzo IP di questa macchina
THIS_HOST="2001:1418:AAAA:AAAA::2"

# La subnet assegnata da SixXS
SUBNET_PREFIX="2001:1418:BBBB::/48"

stop_firewall() {
# First, delete all:
$IP6 -F
$IP6 -X

$IP6 -P INPUT   ACCEPT
$IP6 -P FORWARD ACCEPT
$IP6 -P OUTPUT  ACCEPT
}

start_firewall() {
stop_firewall

# Allow anything on the local link
$IP6 -A INPUT  -i lo -j ACCEPT
$IP6 -A OUTPUT -o lo -j ACCEPT

# Allow anything out on the internet
$IP6 -A OUTPUT -o sixxs -j ACCEPT

# Allow the localnet access us:
$IP6 -A INPUT    -i eth0   -j ACCEPT
$IP6 -A OUTPUT   -o eth0   -j ACCEPT

# Filter all packets that have RH0 headers:
$IP6 -A INPUT -m rt --rt-type 0 -j DROP
$IP6 -A FORWARD -m rt --rt-type 0 -j DROP
$IP6 -A OUTPUT -m rt --rt-type 0 -j DROP

# Allow Link-Local addresses
$IP6 -A INPUT -s fe80::/10 -j ACCEPT
$IP6 -A OUTPUT -s fe80::/10 -j ACCEPT

# Allow multicast
$IP6 -A INPUT -s ff00::/8 -j ACCEPT
$IP6 -A OUTPUT -s ff00::/8 -j ACCEPT

# Allow ICMPv6 everywhere
$IP6 -I INPUT  -p icmpv6 -j ACCEPT
$IP6 -I OUTPUT -p icmpv6 -j ACCEPT
$IP6 -I FORWARD -p icmpv6 -j ACCEPT

# Allow forwarding
$IP6 -A FORWARD -m state --state NEW -i eth0 -o sixxs -s $SUBNET_PREFIX -j ACCEPT
$IP6 -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# SSH verso questa macchina
$IP6 -A INPUT -i sixxs -p tcp -d $THIS_HOST --dport 22 -j ACCEPT

# Accesso a macchine della rete
#$IP6 -A FORWARD -i sixxs -p tcp -d $IP_DA_RAGGIUNGERE --dport $PORTA_DA_RAGGIUNGERE -j ACCEPT

# Set the default policy
$IP6 -P INPUT   DROP
$IP6 -P FORWARD DROP
$IP6 -P OUTPUT  ACCEPT
}

test -x $IP6 || exit 0

set -e

case "$1" in
start)
echo -e "Starting Firewall"
stop_firewall
start_firewall
;;
stop)
echo -e "Stopping Firewall"
stop_firewall
;;
restart)
echo -e "Restarting Firewall"
stop_firewall
start_firewall
;;
*)
N=/etc/init.d/$NAME
echo "Usage: $N {start|stop|restart}" >&2
exit 1
;;
esac

exit 0

Per essere sicuri che il firewall funzioni si può usare questa applicazione web: http://ipv6.chappell-family.com/ipv6tcptest/. Se tutto va bene il risultato dovrebbe essere questo: