[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [volume] [parte]


Capitolo 255.   Utilizzo di IPv6

Per usare IPv6 può essere necessario aggiornare o sostituire alcuni pacchetti di programmi di servizio per la gestione della rete. Purtroppo, diventa difficile indicare il nome dei pacchetti applicativi da utilizzare, dal momento che le varie distribuzioni GNU si comportano in maniera differente. In generale, si deve tenere presente che se un programma per la gestione della rete non funziona come dovrebbe con IPv6, può darsi che si debba aggiornare il pacchetto, oppure che questo vada sostituito con un altro che fornisce le stesse funzionalità

Si osservi che gli esempi mostrati nel capitolo fanno riferimento a un sistema GNU/Linux.

255.1   kernel Linux

Il kernel Linux deve essere predisposto per la gestione dei protocolli IPv6 (sezione 72.2.14).

Se la gestione di IPv6 viene inserita in un modulo, per abilitarla occorre attivare il modulo relativo, per esempio attraverso il comando seguente che potrebbe essere inserito all'interno degli script della procedura di inizializzazione del sistema:

/sbin/modprobe ipv6

Per verificare che il kernel in funzione sia in grado di gestire i protocolli IPv6, si può controllare che esista il file virtuale /proc/net/if_inet6, il quale ha lo scopo di elencare le interfacce di rete e i loro indirizzi IPv6. Nel caso degli esempi che vengono mostrati nelle sezioni successive, si potrebbe vedere quanto segue:

cat /proc/net/if_inet6[Invio]

00000000000000000000000000000001 01 80 10 80       lo
fe8000000000000002a024fffe774997 04 0a 20 80     eth0

Nel caso l'elaboratore debba fungere da router, è necessario abilitare la funzionalità di attraversamento dei pacchetti con il comando seguente:

Inoltre, è bene ricordare di abilitare l'attraversamento dei pacchetti IPv6 nel router locale, cosa che si dovrebbe ottenere con il comando seguente:

echo 1 > /proc/sys/net/ipv6/conf/all/forwarding[Invio]

255.2   Preparazione dei file di configurazione

Per poter fare qualunque cosa con IPv6, è necessario che il file /etc/protocols risulti corretto anche per le finalità di questo protocollo. In particolare, è importante che appaiano le righe seguenti:

ipv6            41      IPv6            # IPv6
ipv6-route      43      IPv6-Route      # Routing Header for IPv6
ipv6-frag       44      IPv6-Frag       # Fragment Header for IPv6
ipv6-crypt      50      IPv6-Crypt      # Encryption Header for IPv6
ipv6-auth       51      IPv6-Auth       # Authentication Header for IPv6
icmpv6          58      IPv6-ICMP       # ICMP for IPv6
ipv6-nonxt      59      IPv6-NoNxt      # No Next Header for IPv6
ipv6-opts       60      IPv6-Opts       # Destination Options for IPv6

Mancando queste indicazioni, lo stesso eco ICMP (Ping) non può funzionare, perché non si trova la definizione del protocollo ICMPv6 (corrispondente al nome icmpv6 nell'esempio mostrato).

255.3   Attivazione di IPv6 e definizione degli indirizzi link-local

Come già accennato, per poter gestire IPv6 occorre un kernel adatto. Quando tutto è pronto, vengono fissati automaticamente l'indirizzo locale di loopback e gli indirizzi link-local. Lo si può osservare con Ifconfig:

ifconfig[Invio]

eth0      Link encap:Ethernet  HWaddr 00:A0:24:77:49:97  
          inet addr:192.168.1.1  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::2a0:24ff:fe77:4997/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:101 errors:1 dropped:1 overruns:0 frame:1
          TX packets:68 errors:0 dropped:0 overruns:0 carrier:1
          collisions:0 txqueuelen:100 
          Interrupt:12 Base address:0xff80 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:3924  Metric:1
          RX packets:24 errors:0 dropped:0 overruns:0 frame:0
          TX packets:24 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 

In alternativa, con Iproute:

ip address show dev lo[Invio]

1: lo: <LOOPBACK,UP> mtu 16436 qdisc noqueue 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 

ip address show dev eth0[Invio]

3: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 100
    link/ether 00:a0:24:77:49:97 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.1/24 brd 192.168.1.255 scope global eth0
    inet6 fe80::2a0:24ff:fe77:4997/64 scope link 

Secondo la filosofia di IPv6, questi indirizzi devono avere già il loro instradamento naturale, di conseguenza sono già pronti per essere usati. Si può verificare con una delle varie versioni modificate di Ping, (1) in grado di usare il protocollo ICMPv6:

ping6 ::1[Invio]

Oppure:

ping6 fe80::2a0:24ff:fe77:4997[Invio]

In entrambi i casi, si dovrebbe osservare l'eco regolarmente. Se si ha la possibilità di predisporre anche un altro elaboratore, connesso alla stessa rete fisica, si può osservare che l'eco ICMPv6 dovrebbe funzionare correttamente anche verso quel nodo, pur senza avere dichiarato l'instradamento.(2)

Naturalmente, si può usare anche Traceroute, (3) che comunque diventa più utile in seguito, quando si inseriscono dei router nel transito dei pacchetti:

traceroute6 fe80::2a0:24ff:fe77:4997[Invio]

Oppure:

tracepath6 fe80::2a0:24ff:fe77:4997[Invio]

Per verificare le regole di instradamento, anche se queste non sono state inserite attraverso un comando apposito, si può utilizzare route nel modo seguente (il risultato che si ottiene deriva dagli esempi già visti):

route -A inet6[Invio]

Kernel IPv6 routing table
Destination                     Next Hop    Flags Metric Ref    Use Iface
::1/128                         ::          U     0      4        0 lo      
fe80::2a0:24ff:fe77:4997/128    ::          U     0      236      1 lo      
fe80::/64                       ::          UA    256    0        0 eth0    
ff00::/8                        ::          UA    256    0        0 eth0    
::/0                            ::          UDA   256    0        0 eth0    

Anche in questo caso si può usare in alternativa Iproute, benché restituisca un esito differente:

ip -6 route show[Invio]

fe80::/64 dev eth0  proto kernel  metric 256  mtu 1500 advmss 1440
ff00::/8 dev eth0  proto kernel  metric 256  mtu 1500 advmss 1440
default dev eth0  proto kernel  metric 256  mtu 1500 advmss 1440
unreachable default dev lo  metric -1  error -101

255.4   Definizione degli indirizzi site-local

Gli indirizzi site-local devono essere dichiarati esplicitamente, anche se per questo si potrebbe usare Radvd, in modo da utilizzare automaticamente l'identificatore EUI-64, come descritto nella sezione 255.6.(4) Continuando a fare riferimento allo stesso identificatore EUI-64 usato nella sezione precedente, considerando che la configurazione link-local sia già avvenuta, si può usare Ifconfig nel modo seguente:

ifconfig eth0 inet6 add fec0:0:0:1:2a0:24ff:fe77:4997/64[Invio]

Oppure, con Iproute:

ip -6 address add fec0:0:0:1:2a0:24ff:fe77:4997/64 dev eth0 \
  \scope site
[Invio]

In questo caso, si nota la scelta di identificare la rete fisica a cui si connette l'interfaccia con il numero 116 (fec0:0:0:1:...). Si può verificare il risultato e si osservi il fatto che si sommano assieme le informazioni dei vari indirizzi, con l'indicazione dell'ambito a cui si riferiscono (scope):

ifconfig eth0[Invio]

eth0      Link encap:Ethernet  HWaddr 00:A0:24:77:49:97
          inet addr:192.168.1.1  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fec0::1:2a0:24ff:fe77:4997/64 Scope:Site
          inet6 addr: fe80::2a0:24ff:fe77:4997/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:31711 errors:0 dropped:0 overruns:0 frame:0
          TX packets:65557 errors:0 dropped:0 overruns:0 carrier:0
          collisions:7 txqueuelen:100 
          Interrupt:11 Base address:0x300 

ip address show dev eth0[Invio]

3: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 100
    link/ether 00:50:ba:71:d9:c1 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.1/24 brd 192.168.1.255 scope global eth0
    inet6 fec0:0:0:1:2a0:24ff:fe77:4997/64 scope site
    inet6 fe80::250:baff:fe71:d9c1/64 scope link

Anche con gli indirizzi site-local non è necessario dichiarare esplicitamente l'instradamento, basta indicare correttamente la lunghezza del prefisso nel momento in cui vengono assegnati alle interfacce.

route -A inet6[Invio]

In base agli esempi visti fino a questo punto, si dovrebbe osservare qualcosa come l'esempio seguente:

Kernel IPv6 routing table
Destination                     Next Hop    Flags Metric Ref    Use Iface
::1/128                         ::          U     0      4        0 lo      
fe80::2a0:24ff:fe77:4997/128    ::          U     0      236      1 lo      
fe80::/64                       ::          UA    256    0        0 eth0    
fec0::1:2a0:24ff:fe77:4997/128  ::          U     0      7        0 lo      
fec0:0:0:1::/64                 ::          UA    256    0        0 eth0    
ff00::/8                        ::          UA    256    0        0 eth0    
::/0                            ::          UDA   256    0        0 eth0    

In alternativa, con Iproute:

ip -6 route show[Invio]

fe80::/64 dev eth0  proto kernel  metric 256  mtu 1500 advmss 1440
fec0:0:0:1::/64 dev eth0  proto kernel  metric 256  mtu 1500 advmss 1440
ff00::/8 dev eth0  proto kernel  metric 256  mtu 1500 advmss 1440
default dev eth0  proto kernel  metric 256  mtu 1500 advmss 1440
unreachable default dev lo  metric -1  error -101

255.5   Instradamento manuale

L'instradamento dei pacchetti IPv6 dovrebbe essere configurato prevalentemente in modo automatico. Eventualmente si può usare route specificando che si tratta di indirizzi IPv6:

route -A inet6 add indirizzo_ipv6/lunghezza_prefisso dev interfaccia

Per esempio, se per qualche motivo fosse necessario stabilire in modo manuale l'instradamento della sottorete fec0:0:0:1::/64 (site-local), attraverso l'interfaccia eth0, si potrebbe usare il comando seguente:

route -A inet6 add fec0:0:0:1::/64 dev eth0[Invio]

Intuitivamente, per rimuovere una regola di instradamento nel modo appena visto, basta sostituire la parola chiave add con del. L'esempio seguente elimina la regola di instradamento che serve a dirigere il traffico per la sottorete fec0:0:0:1::/64 attraverso l'interfaccia eth0:

route -A inet6 del fec0:0:0:1::/64 dev eth0[Invio]

Naturalmente, la stessa cosa si può ottenere con Iproute. Per aggiungere l'instradamento:

ip -6 route add to unicast fec0:0:0:1::/64 dev eth0[Invio]

Per togliere l'instradamento:

ip -6 route del to unicast fec0:0:0:1::/64[Invio]

A parte l'uso dei comandi mostrati per la definizione degli instradamenti a livello di collegamento, che in generale è perfettamente inutile, perché ciò risulta implicito nella definizione degli indirizzi delle interfacce, diventa importante la definizione di un instradamento attraverso un router. Il meccanismo è lo stesso usato per IPv4, con la differenza che si fa riferimento a indirizzi IPv6. Per esempio, per indicare che il router raggiungibile all'indirizzo fec0:0:0:1::fffe permette di raggiungere la rete fec0:0:0:2::/64, si può usare uno dei due comandi seguenti:

route -A inet6 add fec0:0:0:2::/64 gw fec0:0:0:1::fffe[Invio]

ip -6 route add to unicast fec0:0:0:2::/64 scope site \
  \via fec0:0:0:1::fffe
[Invio]

Ecco cosa si ottiene:

route -A inet6[Invio]

...
fec0:0:0:2::/64       fec0:0:0:1::fffe           UG    1      0        0 eth0
...

ip -6 route show[Invio]

...
fec0:0:0:2::/64 via fec0:0:0:1::fffe dev eth0  metric 1  mtu 1500 advmss 1440
...

255.6   Configurazione e instradamento automatici

Quando si utilizzano indirizzi globali (attualmente solo quelli che hanno il prefisso di formato 0012), oppure anche validi solo nell'ambito del sito, si può fare in modo che i vari nodi configurino automaticamente le loro interfacce, con l'aiuto di router che «pubblicizzano» le informazioni sugli indirizzi da usare. A questo proposito, con GNU/Linux si può utilizzare Radvd.

Radvd, (5) corrispondente al demone radvd, è un Router advertiser daemon, cioè un programma che si occupa di stare in attesa delle richieste (router solicitation) da parte dei nodi delle sottoreti connesse fisicamente al router in cui questo si trova a funzionare. A queste richieste risponde (router advertisement) fornendo l'indicazione del prefisso da usare per gli indirizzi di quel collegamento di rete (link).

L'unico impegno sta nella configurazione di Radvd attraverso il suo file di configurazione, che dovrebbe essere /etc/radvd.conf. All'interno di questo file si indicano i prefissi da usare per ogni collegamento di rete (vengono indicate le interfacce attraverso cui «pubblicizzarli»). Si osservi l'esempio seguente:

interface eth0
{
    AdvSendAdvert on;
    prefix 3ffe:ffff:0011:0002::0/64
    {
        AdvOnLink on;
        AdvAutonomous on;
    };
};

Viene stabilito che nel collegamento di rete corrispondente all'interfaccia eth0, venga pubblicizzato il prefisso 3ffe:ffff:11:2::0/64, che in pratica corrisponde a un indirizzo unicast globale aggregabile, fissato per gli esperimenti nella fase di transizione verso IPv6 e documentato dall'RFC 2471.(6)

Con questa informazione, tutti i nodi che risultano connessi allo stesso collegamento di rete, ricevendo questa informazione, configurano le loro interfacce di rete utilizzando l'identificatore EUI-64 e aggiungono la regola di instradamento relativa. Quello che si vede sotto è l'esempio di un'interfaccia di rete già configurata con gli indirizzi link-local e site-local, avente un indirizzo globale ottenuto attraverso Radvd.

eth0      Link encap:Ethernet  HWaddr 00:A0:24:77:49:97
          inet addr:192.168.1.1  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: 3ffe:ffff:11:2:2a0:24ff:fe77:4997/64 Scope:Global
          inet6 addr: fec0::1:2a0:24ff:fe77:4997/64 Scope:Site
          inet6 addr: fe80::2a0:24ff:fe77:4997/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:31711 errors:0 dropped:0 overruns:0 frame:0
          TX packets:65557 errors:0 dropped:0 overruns:0 carrier:0
          collisions:7 txqueuelen:100 
          Interrupt:11 Base address:0x300 

Per avviare il demone radvd non c'è bisogno di opzioni particolari; eventualmente può essere conveniente accertarsi di fargli leggere il file di configurazione corretto:

radvd -C /etc/radvd.conf[Invio]

In questo modo, si vuole indicare precisamente che il file di configurazione è /etc/radvd.conf.

Riquadro 255.17. Incompatibilità tra l'attribuzione automatica degli indirizzi e il ruolo di router.

Per motivi di sicurezza, il kernel Linux non utilizza le informazioni pubblicizzate da Radvd se è abilitato il forwarding, ovvero l'attraversamento dei pacchetti tra interfacce diverse, dal momento che ciò consentirebbe la programmazione remota del proprio elaboratore come router. Pertanto, gli elaboratori che devono configurare automaticamente le proprie interfacce di rete in base alle notizie diramate da Radvd devono essere preparati con un comando simile a quello seguente, dove l'interfaccia è quella per la quale si vuole consentire la configurazione automatica:

echo 0 > /proc/sys/net/ipv6/conf/interfaccia/forwarding[Invio]

Per la stessa ragione, può essere necessario abilitare l'uso di questo meccanismo, anche attraverso un'altra voce:

echo 1 > /proc/sys/net/ipv6/conf/interfaccia/accept_ra[Invio]

Per approfondire l'uso e la configurazione di Radvd, si consultino le pagine di manuale radvd(8) e radvd.conf(5).

255.7   Tunnel 6to4

La realizzazione di un tunnel 6to4 è abbastanza semplice con l'aiuto di Iproute. Si fa riferimento a un esempio già apparso nella sezione 254.9, in cui l'indirizzo globale IPv4 è 1.2.3.4, che in modo molto semplice si traduce nell'indirizzo IPv6 2002:0102:0304::1.

tunnel 6to4

Stante questa situazione, la prima cosa da fare è definire una «interfaccia-tunnel», a cui viene dato il nome di t6to4 (il nome viene attribuito in modo libero):

ip tunnel add name t6to4 mode sit remote any local 1.2.3.4[Invio]

Intuitivamente, si comprende che remote any indica che la parte finale del tunnel non ha un indirizzo ben preciso (anycast). Con il comando seguente si può controllare di avere realizzato il tunnel correttamente:

ip tunnel show name t6to4[Invio]

t6to4: ipv6/ip  remote any  local 1.2.3.4  ttl inherit 

Il tunnel si traduce localmente in un'interfaccia di rete virtuale, denominata t6to4, che deve essere attivata espressamente:

ip link set dev t6to4 up[Invio]

Si può verificare lo stato di questa interfaccia con il comando seguente:

ip link show dev t6to4[Invio]

9: t6to4@NONE: <NOARP,UP> mtu 1480 qdisc noqueue 
    link/sit 1.2.3.4 brd 0.0.0.0

Una volta creata l'interfaccia virtuale, gli si deve attribuire l'indirizzo IPv6:

ip -6 address add local 2002:0102:0304::1/64 scope global \
  \dev t6to4
[Invio]

Si può osservare che l'interfaccia virtuale del tunnel contiene anche l'indirizzo IP ::1.2.3.4:

ip -6 address show dev t6to4[Invio]

9: t6to4@NONE: <NOARP,UP> mtu 1480 qdisc noqueue 
    inet6 2002:102:304::1/64 scope global 
    inet6 ::1.2.3.4/128 scope global 

Infine, è necessario definire l'instradamento per tutti gli indirizzi unicast globali aggregabili, che si differenziano per iniziare con 0012, pari a 216, attraverso il router «virtuale» ::192.88.99.1 (virtuale nel senso che il router reale viene determinato automaticamente):

ip -6 route add to 2000::/3 via ::192.88.99.1 dev t6to4 metric 1[Invio]

Per verificare, si può restringere il campo di azione alla sola destinazione desiderata:

ip -6 route show to 2000::/3[Invio]

2000::/3 via ::192.88.99.1 dev t6to4  metric 1  mtu 1480 advmss 1420

Da questo momento, la rete IPv6 pubblica è accessibile, anche se i tempi di risposta sono maggiori del solito, a causa del tunnel. Se si conoscono degli indirizzi IPv6 della rete pubblica, si può tentare di usare Ping o Traceroute per verificare; diversamente, è necessario disporre già di un sistema di risoluzione dei nomi in grado di consultare anche quelli abbinati a IPv6.

Per eliminare il tunnel, si procede in senso inverso: cancellando l'instradamento; disattivando l'interfaccia virtuale del tunnel; eliminando il tunnel. Ecco come:

ip -6 route flush dev t6to4[Invio]

ip link set dev t6to4 down[Invio]

ip tunnel del name t6to4[Invio]

255.7.1   Inserire la rete locale in un tunnel 6to4

Se si dispone di un indirizzo IPv4 statico, è abbastanza semplice configurare l'elaboratore connesso alla rete esterna come router per collegare anche la propria rete locale. Per questo è necessario prima organizzare meglio l'indirizzo IPv6 ottenuto da IPv4. Per cominciare, nell'ipotesi di voler utilizzare anche delle sottoreti locali (cosa che comunque non viene mostrata qui), conviene utilizzare il campo SLA. Per esempio, si vuole individuare la rete locale con il numero 000716, che viene usato nel campo SLA. La figura 255.23 rappresenta sinteticamente tutto ciò che si intende spiegare.

Figura 255.23. Esempio sintetico di una rete locale che comunica con la rete esterna IPv6 attraverso un tunnel 6to4.

rete locale colletata a 6bone

Come si vede dalla figura, il router locale è collegato alla rete esterna attraverso l'interfaccia eth0, che si suppone disponga dell'indirizzo IPv4 statico 1.2.3.4, mentre la rete locale è connessa dal lato dell'interfaccia eth1. Sull'interfaccia eth0 viene creato il tunnel, come è già stato mostrato, avendo cura di usare come maschera di rete 48 bit, in modo da inserire anche il campo SLA nell'identificatore di interfaccia. Si procede in pratica nel modo seguente:

ip tunnel add name t6to4 mode sit remote any local 1.2.3.4[Invio]

ip link set dev t6to4 up[Invio]

ip -6 address add local 2002:0102:0304::1/48 scope global \
  \dev t6to4
[Invio]

ip -6 route add to 2000::/3 via ::192.88.99.1 dev t6to4 metric 1[Invio]

Fino a questo punto è tutto normale, tranne per il fatto di avere indicato un prefisso di soli 48 bit per l'indirizzo attribuito all'interfaccia virtuale del tunnel. La fase successiva richiede l'attribuzione di indirizzi appartenenti alla rete 2002:0102:0304:7:* (ovvero 2002:0102:0304:7::/64). Per ottenere questo risultato, il router locale deve ospitare Radvd, in funzione, con la configurazione seguente:

interface eth1
{
    AdvSendAdvert on;
    prefix 2002:0102:0304:7::/64
    {
        AdvOnLink on;
        AdvAutonomous on;
    };
};

I nodi della rete locale ricevono un indirizzo IPv6 del tipo 2002:0102:0304:7:x:x:x:x/64, dove ogni x rappresenta 16 bit ottenuti dall'identificatore EUI-64; inoltre ottengono l'instradamento predefinito verso il router locale, anche se solo per mezzo di un indirizzo di tipo link-local.

Tuttavia, questo non basta, perché il fatto di avere già attribuito all'interfaccia virtuale del tunnel l'indirizzo 2002:0102:0304::1/48, potrebbe impedire a Radvd di assegnare all'interfaccia eth1 del router locale un indirizzo appartenente alla rete 2002:0102:0304:7:*; inoltre, il fatto stesso che il nodo sia un router, impedisce l'attribuzione automatica dell'indirizzo (si veda la nota nel riquadro 255.17). Pertanto, è bene intervenire manualmente con un indirizzo che comunque non possa entrare in conflitto; per esempio:

ip -6 address add local 2002:0102:0304:7::1/64 scope global \
  \dev eth1
[Invio]

Inoltre, è bene ricordare di abilitare l'attraversamento dei pacchetti IPv6 nel router locale, cosa che si dovrebbe ottenere con il comando seguente:

echo 1 > /proc/sys/net/ipv6/conf/all/forwarding[Invio]

Figura 255.25. Situazione virtuale dopo la configurazione e l'instradamento attraverso il tunnel.

rete locale colletata a 6bone

255.7.2   Utilizzare un tunnel 6to4 con una connessione PPP

L'uso e la configurazione del protocollo PPP è descritto nel capitolo 280. Per attivare un tunnel 6to4 attraverso un collegamento punto-punto, con il protocollo PPP, conviene intervenire negli script /etc/ppp/ip-up e /etc/ppp/ip-down, dal momento che il primo viene avviato dal demone pppd quando è attiva la connessione, mentre il secondo viene avviato al termine della connessione. Pertanto, è sufficiente aggiungere nello /etc/ppp/ip-up il codice necessario per attivare il tunnel, mentre in /etc/ppp/ip-down quello che serve per disattivarlo.

In condizioni normali, conviene scrivere degli script separati, facendo in modo che questi siano avviati correttamente da quelli gestiti da pppd (ammesso che la propria distribuzione non organizzi già le cose in tal senso).

Anche senza utilizzare direttamente le informazioni che sarebbero disponibili all'interno dello script /etc/ppp/ip-up, le istruzioni necessarie a individuare l'indirizzo IPv4 ottenuto e ad attivare il tunnel sono quelle seguenti:

#!/bin/sh
#
# Estrae l'indirizzo IPv4 associato all'interfaccia ppp0 e lo mette
# nella variabile di ambiente IPV4_ADDR.
#
TEMP=`ifconfig ppp0 | grep "inet addr"`
TEMP=`echo $TEMP | sed s/inet.addr://`
TEMP=`echo $TEMP | sed s/P-t-P.*$//`
IPV4_ADDR=$TEMP
#
# Trasforma l'indirizzo IPv4 in IPv6, mettendo il risultato nella variabile
# di ambiente IPV6_ADDR.
#
TEMP=`echo $IPV4_ADDR | tr "." " "`
TEMP=`printf "%02x%02x:%02x%02x" $TEMP`
IPV6_ADDR=2002:$TEMP:7::1
#
# Crea e attiva il tunnel.
#
ip tunnel add name t6to4 mode sit remote any local $IPV4_ADDR
ip link set dev t6to4 up
ip -6 address add $IPV6_ADDR/48 dev t6to4
ip -6 route add to 2000::/3 via ::192.88.99.1 dev t6to4 metric 1

Per annullare il tunnel, la procedura è molto più semplice:

#!/bin/sh
#
# Disattiva ed elimina il tunnel
#
ip -6 route flush dev t6to4
ip link set dev t6to4 down
ip tunnel del name t6to4

Se si vuole gestire anche una rete locale, pur avendo solo un indirizzo IPv4 dinamico, si deve fare in modo di configurare dinamicamente anche Radvd. In questo caso, la rete locale è collegata all'interfaccia eth0 del router locale. Ecco come si potrebbe estendere lo script già visto per instaurare il tunnel:

#!/bin/sh
#
# Estrae l'indirizzo IPv4 associato all'interfaccia ppp0 e lo mette
# nella variabile di ambiente IPV4_ADDR.
#
TEMP=`ifconfig ppp0 | grep "inet addr"`
TEMP=`echo $TEMP | sed s/inet.addr://`
TEMP=`echo $TEMP | sed s/P-t-P.*$//`
IPV4_ADDR=$TEMP
#
# Trasforma l'indirizzo IPv4 in due indirizzi IPv6, mettendo i risultati
# nelle variabili di ambiente IPV6_ADDR_1 e IPV6_ADDR_2.
#
TEMP=`echo $IPV4_ADDR | tr "." " "`
TEMP=`printf "%02x%02x:%02x%02x" $TEMP`
IPV6_ADDR_1=2002:$TEMP:7::1
IPV6_ADDR_2=2002:$TEMP:7::2
#
# Crea e attiva il tunnel.
#
ip tunnel add name t6to4 mode sit remote any local $IPV4_ADDR
ip link set dev t6to4 up
ip -6 address add $IPV6_ADDR_1/48 dev t6to4
ip -6 route add to 2000::/3 via ::192.88.99.1 dev t6to4 metric 1
#
# Ricrea il file di configurazione di Radvd.
#
echo                                             > /etc/radvd.conf
echo interface eth0                             >> /etc/radvd.conf
echo \{                                         >> /etc/radvd.conf
echo   AdvSendAdvert on\;                       >> /etc/radvd.conf
echo   MaxRtrAdvInterval 30\;                   >> /etc/radvd.conf
echo   prefix $IPV6_ADDR_2/64                   >> /etc/radvd.conf
echo   \{                                       >> /etc/radvd.conf
echo       AdvOnLink on\;                       >> /etc/radvd.conf
echo       AdvAutonomous on\;                   >> /etc/radvd.conf
echo       AdvValidLifetime 120\;               >> /etc/radvd.conf
echo       AdvPreferredLifetime 60\;            >> /etc/radvd.conf
echo   \}\;                                     >> /etc/radvd.conf
echo \}\;                                       >> /etc/radvd.conf
/etc/init.d/radvd stop
/etc/init.d/radvd start
#
# Aggiunge l'interfaccia verso la rete locale.
#
ip -6 address add local $IPV6_ADDR_2/64 scope global dev eth0
#
# Abilita l'attraversamento dei pacchetti IPv6.
#
echo 1 > /proc/sys/net/ipv6/conf/all/forwarding

A parte tutto, si può osservare che la configurazione di Radvd richiede l'indicazione esplicita di scadenze ravvicinate, data la dinamicità della risorsa (si tratta evidentemente delle direttive che appaiono nell'esempio per la prima volta).

Per eliminare il tunnel e l'instradamento locale, si può procedere a ritroso con lo script seguente:

#!/bin/sh
#
# Disattiva ed elimina il tunnel.
#
ip -6 route flush dev t6to4
ip link set dev t6to4 down
ip tunnel del name t6to4
#
# Elimina l'indirizzo dato all'interfaccia collegata alla rete locale.
#
ip -6 address flush to 2002::/16
#
# Disattiva Radvd (salvo esigenze diverse).
#
/etc/init.d/radvd stop

255.7.3   Utilizzare un tunnel 6to4 attraverso un router NAT

Quando ci si trova in una rete con indirizzi IPv4 privati e si accede all'esterno attraverso un router NAT che non è predisposto per la gestione di IPv6 attraverso un tunnel 6to4, diventa un po' difficile la realizzazione di un tunnel di questo tipo.

Figura 255.30. Rete locale con indirizzi IPv4 privati, che accede alla rete esterna attraverso un router che non riconosce i tunnel 6to4.

rete locale colletata a 6bone attraverso un router-NAT normale

La figura 255.30 cerca di descrivere questa situazione: un router NAT si interpone tra una rete locale con indirizzi 192.168.1.* e la rete esterna (si tratta probabilmente di un router ADSL); l'indirizzo IPv4 esterno del router è 1.2.3.4; nella rete locale privata si adibisce un nodo particolare a router IPv6, con lo scopo di realizzare un tunnel 6to4 che riesca ad attraversare il router IPv4.

Prima di poter spiegare come si realizza il tunnel in questo caso, è necessario comprendere come si comporta il router IPv4. I pacchetti del tunnel hanno il numero di protocollo 41, come si può leggere nel file /etc/protocols di un sistema Unix comune:

ip      0       IP              # internet protocol, pseudo protocol number
icmp    1       ICMP            # internet control message protocol
igmp    2       IGMP            # Internet Group Management
...
tcp     6       TCP             # transmission control protocol
...
udp     17      UDP             # user datagram protocol
...
ipv6    41      IPv6            # Internet Protocol, version 6
...

Il router NAT più comune, alle prese con questo protocollo, si limita a sostituire l'indirizzo IPv4 di origine con il proprio (in questo caso con l'indirizzo 1.2.3.4), ma generalmente non è in grado di dirigere correttamente il flusso di ritorno al nodo corretto (in questo caso è quello corrispondente all'indirizzo privato 192.168.1.1).

Per prima cosa, è necessario programmare il router NAT in modo da rinviare tutti i pacchetti provenienti dalla rete esterna, che non vengono riconosciuti appartenere a comunicazioni attivate dall'interno, verso il nodo che deve svolgere il ruolo di router IPv6; in questo caso verso l'indirizzo 192.168.1.1. In pratica, si deve fare in modo che tutti i pacchetti provenienti dall'esterno, che il router NAT si limiterebbe a rifiutare, vadano verso il router IPv6. A titolo di esempio viene mostrata la configurazione di un router ADSL con software Conexant, alla voce {Misc configuration} nella figura 255.32.

Figura 255.32. Configurazione della «zona demilitarizzata», ovvero «DMZ», con un router ADSL con software Conexant.

router-conexant-hasbani-dmz

Questa procedura è necessaria per procedere; tuttavia, non si deve dimenticare il fatto che in questo modo si espone il router IPv6 agli attacchi provenienti dalla rete esterna, pertanto deve essere controllato in qualche modo l'ingresso di tali pacchetti.

Una volta sistemate queste cose, nel nodo che deve svolgere il ruolo di router IPv6 si possono dare gli stessi comandi già descritti in precedenza, con l'eccezione del primo, che deve fare riferimento all'indirizzo IPv4 privato:

ip tunnel add name t6to4 mode sit remote any local 192.168.1.1[Invio]

Per completezza vengono ripetuti tutti i passaggi, tenendo conto che l'indirizzo IPv4 esterno del router NAT è 1.2.3.4, pertanto gli indirizzi IPv6 che si ottengono appartengono alla rete 2002:0102:0304::/48:

ip tunnel add name t6to4 mode sit remote any local 192.168.1.1[Invio]

ip link set dev t6to4 up[Invio]

ip -6 address add local 2002:0102:0304::1/48 scope global \
  \dev t6to4
[Invio]

ip -6 route add to 2000::/3 via ::192.88.99.1 dev t6to4 metric 1[Invio]

Si osservi anche che in questo caso il router IPv6 dispone di una sola interfaccia di rete: eth0. Pertanto, se si suppone, come già fatto in precedenza, di voler usare indirizzi nella rete 2002:0102:0304:7::/64 nella rete locale, si potrebbe assegnare manualmente un indirizzo del genere a tale interfaccia:

ip -6 address add local 2002:0102:0304:7::1/64 scope global \
  \dev eth0
[Invio]

Infine, anche in questo caso occorre ricordare di abilitare l'attraversamento dei pacchetti IPv6 nel router IPv6, con il comando seguente:

echo 1 > /proc/sys/net/ipv6/conf/all/forwarding[Invio]

Per quanto riguarda Radvd, la configurazione è la stessa già vista in precedenza, riferita all'interfaccia eth0:

interface eth0
{
    AdvSendAdvert on;
    prefix 2002:0102:0304:7::/64
    {
        AdvOnLink on;
        AdvAutonomous on;
    };
};

Da quanto esposto fino a questo punto, si possono comprendere due limiti di questo sistema: solo un nodo interno alla rete privata può creare un tunnel 6to4 e questo richiede anche la configurazione appropriata del router NAT, per ottenere tutti i pacchetti che altrimenti verrebbero scartati (inserendo anche un problema di sicurezza nella configurazione del nodo in questione); inoltre l'indirizzo IPv4 pubblico del router NAT deve essere statico.

Se non si dispone di un indirizzo IPv4 statico, diventa necessario costruire uno script che sia in grado di leggere l'indirizzo IPv4 ottenuto dal router creando al volo tutta la configurazione necessaria, in modo simile a quanto già visto a proposito delle connessioni PPP attraverso la linea commutata comune. Viene mostrato un esempio basato su un router ADSL con software Conexant, che offre l'informazione cercata accedendo alla pagina http://192.168.1.254/doc/home.htm (si intende che l'indirizzo 192.168.1.254 sia quello dell'interfaccia del router rivolta verso la rete privata). Per accedere a questa si deve fornire un nominativo utente (user) e una parola d'ordine (password) e per scaricarla si può usare Wget in questo modo:

wget http://user:password@192.168.1.254/doc/home.htm[Invio]

Della pagina ottenuta conta una riga sola:

<TR><TD>80.117.113.124</TD><TD>255.0.0.0</TD><TD>00:D0:41:01:1B:F7</TD></TR>

In questo caso esiste un modo semplice per individuarla, facendo riferimento all'indirizzo fisico, ovvero l'indirizzo Ethernet:

grep "00:D0:41:01:1B:F7" home.htm > riga[Invio]

Infine, si può estrarre l'indirizzo con Sed:

cat riga | sed "s/^<TR><TD>//" | sed "s/<\/TD><TD>.*//"[Invio]

Viene proposto uno script completo, che estrae le informazioni e configura il tunnel 6to4.

#!/bin/sh
#
# Estrae l'indirizzo IPv4 associato all'interfaccia esterna del router
# Conexant, utilizzando l'utenza "user" e la parola d'ordine "password",
# conoscendo l'indirizzo MAC esterno del router.
#
TEMP=`wget --output-document=- http://user:password@192.168.1.254/doc/home.htm\
        | grep "00:D0:41:01:1B:F7"`
TEMP=`echo $TEMP | sed "s/^<TR><TD>//"`
TEMP=`echo $TEMP | sed "s/<\/TD><TD>.*//"`
IPV4_ADDR=$TEMP
#
# Trasforma l'indirizzo IPv4 in due indirizzi IPv6, mettendo i risultati
# nelle variabili di ambiente IPV6_ADDR_1 e IPV6_ADDR_2.
#
TEMP=`echo $IPV4_ADDR | tr "." " "`
TEMP=`printf "%02x%02x:%02x%02x" $TEMP`
IPV6_ADDR_1=2002:$TEMP:7::1
IPV6_ADDR_2=2002:$TEMP:7::2
#
# Annulla la configurazione IPv6 precedente.
#
ip -6 route flush dev t6to4
ip link set dev t6to4 down
ip tunnel del name t6to4
ip -6 address flush to 2002::/16
ip -6 address del local 2002::/16 dev eth0
#
# Crea e attiva il tunnel.
#
ip tunnel add name t6to4 mode sit remote any local 192.168.1.1
ip link set dev t6to4 up
ip -6 address add $IPV6_ADDR_1/48 dev t6to4
ip -6 route add to 2000::/3 via ::192.88.99.1 dev t6to4 metric 1
#
# Ricrea il file di configurazione di Radvd.
#
echo                                             > /etc/radvd.conf
echo interface eth0                             >> /etc/radvd.conf
echo \{                                         >> /etc/radvd.conf
echo   AdvSendAdvert on\;                       >> /etc/radvd.conf
echo   MaxRtrAdvInterval 30\;                   >> /etc/radvd.conf
echo   prefix $IPV6_ADDR_2/64                   >> /etc/radvd.conf
echo   \{                                       >> /etc/radvd.conf
echo       AdvOnLink on\;                       >> /etc/radvd.conf
echo       AdvAutonomous on\;                   >> /etc/radvd.conf
echo       AdvValidLifetime 120\;               >> /etc/radvd.conf
echo       AdvPreferredLifetime 60\;            >> /etc/radvd.conf
echo   \}\;                                     >> /etc/radvd.conf
echo \}\;                                       >> /etc/radvd.conf
/etc/init.d/radvd stop
/etc/init.d/radvd start
#
# Aggiunge l'interfaccia verso la rete locale.
#
ip -6 address add local $IPV6_ADDR_2/64 scope global dev eth0
#
# Abilita l'attraversamento dei pacchetti IPv6.
#
echo 1 > /proc/sys/net/ipv6/conf/all/forwarding

Una volta verificato il funzionamento dello script, se ne può comandare l'avvio a intervalli regolari attraverso il sistema Cron (capitolo 95).

Si tenga in considerazione che in questa sezione non sono stati analizzati i problemi di sicurezza che si creano dirigendo i pacchetti IPv4 non meglio identificati verso il router IPv6. (capitolo 349).

La sezione 348.5 descrive in modo più chiaro il principio di funzionamento di un NAT.

255.8   Caratteristiche del tunnel per il filtro dei pacchetti IPv4

I pacchetti IPv4 utilizzati per realizzare un tunnel che contiene IPv6, sono contrassegnati dal numero di protocollo 41, che nel file /etc/protocols dovrebbe apparire indicato nel modo seguente:

...
tcp     6       TCP             # transmission control protocol
...
udp     17      UDP             # user datagram protocol
...
ipv6    41      IPv6            # Internet Protocol, version 6
...

Quando si configura un firewall, ma si utilizza un tunnel di questo tipo, occorre ricordare di consentire il traffico IPv4 con il protocollo 41. Quando si utilizza Iptables per questo scopo, si potrebbero usare dei comandi come quelli seguenti quando il tunnel viene attivato all'interno del firewall stesso:

iptables -t filter -A INPUT -p ipv6 -s 0/0 -d 0/0 -j ACCEPT[Invio]

iptables -t filter -A OUTPUT -p ipv6 -s 0/0 -d 0/0 -j ACCEPT[Invio]

Se invece il tunnel viene attivato in un altro elaboratore, che si trova a dover attraversare il firewall:

iptables -t filter -A FORWARD -p ipv6 -s 0/0 -d 0/0 -j ACCEPT[Invio]

255.9   Altri programmi affini

255.10   Riferimenti

Appunti di informatica libera 2007.02 --- Copyright © 2000-2007 Daniele Giacomini -- <daniele (ad) swlibero·org>


1) Iputils   UCB BSD e GNU GPL

2) Per usare Ping come utente comune occorre che il suo eseguibile appartenga all'utente root e abbia il bit SUID attivo (SUID-root). È probabile che questo permesso debba essere assegnato manualmente.

3) Iputils   UCB BSD e GNU GPL

4) Eventualmente, il procedimento manuale può servire per assegnare indirizzi di comodo, che ignorano l'identificatore EUI-64.

5) Radvd   software libero con licenza speciale

6) Tutti gli indirizzi 3ffe::/16 appartengono a questo gruppo di prova, ma in generale vanno usati in base ad accordi presi con altri nodi che utilizzano IPv6.

7) WWW6to4   GNU GPL


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome utilizzo_di_ipv6.htm

[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico]

Valid ISO-HTML!

CSS validator!