4.3. Programmi di test/debug pronti per IPv6

Dopo aver preparato il proprio sistema per IPv6, lo si può usare per le comunicazioni di rete. Prima di tutto si dovrebbe imparare come esaminare i pacchetti IPv6 con uno sniffer. Ciò è caldamente raccomandato poiché in caso di problemi può aiutare a fornire una diagnosi molto velocemente.

4.3.1. Ping IPv6

Questo programma è normalmente incluso nel pacchetto iputils. È progettato per semplici test di trasporto: esso invia pacchetti echo-request ICMPv6 ed attende pacchetti echo-replay ICMPv6.

Utilizzo

# ping6 <hostwithipv6address>
# ping6 <ipv6address>
# ping6 [-I <device>] <link-local-ipv6address>
   

Esempio

# ping6 -c 1 ::1 
PING ::1(::1) from ::1 : 56 data bytes 
64 bytes from ::1: icmp_seq=0 hops=64 time=292 usec
--- ::1 ping statistics --- 
1 packets transmitted, 1 packets received, 0% packet loss 
round-trip min/avg/max/mdev = 0.292/0.292/0.292/0.000 ms
   

Suggerimento: ping6 ha bisogno dell'accesso raw al socket e quindi dei permessi di root. In questo modo se gli utenti (non-root) non possono usare ping6 ci possono essere due problemi:

  1. ping6 non è nel path degli utenti (probabilmente perché ping6 di solito si trova in /usr/sbin) -> si aggiunga al path (non molto raccomandato)

  2. ping6 non viene eseguito correttamente, generalmente a causa della mancanza dei permessi di root -> chmod u+s /usr/sbin/ping6

4.3.1.1. Specificare l'interfaccia per il ping IPv6

Usando indirizzi di tipo link-local per un ping IPv6, il kernel non sa attraverso quale dispositivo (fisico o virtuale) deve inviare il pacchetto - ogni dispositivo ha un indirizzo di tipo link-local. Il tentativo darà come risultato il seguente messaggio di errore:

# ping6 fe80::212:34ff:fe12:3456 
connect: Invalid argument
    

In questo caso bisogna specificare anche l'interfaccia come mostrato qui:

# ping6 -I eth0 -c 1 fe80::2e0:18ff:fe90:9205 
PING fe80::212:23ff:fe12:3456(fe80::212:23ff:fe12:3456) from
¬ fe80::212:34ff:fe12:3478 eth0: 56 data bytes 
64 bytes from fe80::212:23ff:fe12:3456: icmp_seq=0 hops=64 time=445 usec
--- fe80::2e0:18ff:fe90:9205 ping statistics --- 
1 packets transmitted, 1 packets received, 0% packet loss round-trip
¬ min/avg/max/mdev = 0.445/0.445/0.445/0.000 ms
    

4.3.1.2. Ping6 verso indirizzi multicast

Un meccanismo interessante per rilevare host attivi IPv6 su di un link consiste nell'effettuare ping6 verso l'indirizzo multicast link-local di tutti i nodi (all-node):

# ping6 -I eth0 ff02::1
PING ff02::1(ff02::1) from fe80:::2ab:cdff:feef:0123 eth0: 56 data bytes
64 bytes from ::1: icmp_seq=1 ttl=64 time=0.104 ms
64 bytes from fe80::212:34ff:fe12:3450: icmp_seq=1 ttl=64 time=0.549 ms (DUP!) 
    

Diversamente da IPv4, dove le risposte ad un ping verso l'indirizzo di broadcast possono essere disabilitate, in IPv6 questa caratteristica non può essere disabilitata se non per mezzo del firewalling locale IPv6.

4.3.2. Traceroute IPv6

Questo programma normalmente è incluso nel pacchetto iputils. È simile al traceroute IPv4. Di seguito è riportato un esempio:

# traceroute6 www.6bone.net 
traceroute to 6bone.net (3ffe:b00:c18:1::10) from 3ffe:ffff:0000:f101::2, 30
¬ hops max, 16 byte packets 
 1 localipv6gateway (3ffe:ffff:0000:f101::1) 1.354 ms 1.566 ms 0.407 ms 
 2 swi6T1-T0.ipv6.switch.ch (3ffe:2000:0:400::1) 90.431 ms 91.956 ms 92.377 ms 
 3 3ffe:2000:0:1::132 (3ffe:2000:0:1::132) 118.945 ms 107.982 ms 114.557 ms 
 4 3ffe:c00:8023:2b::2 (3ffe:c00:8023:2b::2) 968.468 ms 993.392 ms 973.441 ms 
 5 3ffe:2e00:e:c::3 (3ffe:2e00:e:c::3) 507.784 ms 505.549 ms 508.928 ms 
 6 www.6bone.net (3ffe:b00:c18:1::10) 1265.85 ms * 1304.74 ms
   

Nota: diversamente da alcune moderne versioni del traceroute IPv4, le quali possono utilizzare pacchetti echo-request ICMPv4 come pure pacchetti UDP (il default), l'attuale traceroute IPv6 è in grado di inviare soltanto pacchetti UDP. Come probabilmente già si saprà, i pacchetti echo-request ICMP sono più accettati dai firewall o dalle ACL sui router rispetto ai pacchetti UDP.

4.3.3. Tracepath6

Questo programma normalmente è incluso nel pacchetto iputils. È simile a traceroute6 e serve a tracciare il percorso per una data destinazione scoprendo anche il relativo valore di MTU. Di seguito si può vedere un esenpio:

# tracepath6 www.6bone.net 
 1?: [LOCALHOST] pmtu 1480 
 1: 3ffe:401::2c0:33ff:fe02:14 150.705ms 
 2: 3ffe:b00:c18::5 267.864ms 
 3: 3ffe:b00:c18::5 asymm 2 266.145ms pmtu 1280 
 3: 3ffe:3900:5::2 asymm 4 346.632ms 
 4: 3ffe:28ff:ffff:4::3 asymm 5 365.965ms 
 5: 3ffe:1cff:0:ee::2 asymm 4 534.704ms 
 6: 3ffe:3800::1:1 asymm 4 578.126ms !N 
Resume: pmtu 1280
   

4.3.4. Tcpdump IPv6

Su Linux, tcpdump è lo strumento più utilizzato per la cattura dei pacchetti. Di seguito sono riportati alcuni esempi. Il supporto IPv6 è incluso nelle attuali release della versione 3.6.

tcpdump permette l'utilizzo di espressioni per filtrare i pacchetti, minimizzando il numero di quelli indesiderati:

Anche alcune opzioni della linea di comando sono molto utili per catturare e visualizzare una maggior quantià di informazioni relative ad un pacchetto, per lo più interessanti per scavare a fondo nei pacchetti ICMPv6:

4.3.4.1. Ping IPv6 verso l'indirizzo nativo 3ffe:ffff:100:f101::1 su di un link locale

# tcpdump -t -n -i eth0 -s 512 -vv ip6 or proto ipv6 
tcpdump: listening on eth0 
3ffe:ffff:100:f101:2e0:18ff:fe90:9205 > 3ffe:ffff:100:f101::1: icmp6: echo
¬ request (len 64, hlim 64) 
3ffe:ffff:100:f101::1 > 3ffe:ffff:100:f101:2e0:18ff:fe90:9205: icmp6: echo
¬ reply (len 64, hlim 64)
    

4.3.4.2. Ping IPv6 verso 3ffe:ffff:100::1 instradato attraverso un tunnel IPv6-in-IPv4

1.2.3.4 e 5.6.7.8 sono le estremità del tunnel (tutti gli indirizzi sono a puro titolo di esempio)

# tcpdump -t -n -i ppp0 -s 512 -vv ip6 or proto ipv6 
tcpdump: listening on ppp0 
1.2.3.4 > 5.6.7.8: 2002:ffff:f5f8::1 > 3ffe:ffff:100::1: icmp6: echo request
¬ (len 64, hlim 64) (DF) (ttl 64, id 0, len 124) 
5.6.7.8 > 1.2.3.4: 3ffe:ffff:100::1 > 2002:ffff:f5f8::1: icmp6: echo reply (len
¬ 64, hlim 61) (ttl 23, id 29887, len 124) 
1.2.3.4 > 5.6.7.8: 2002:ffff:f5f8::1 > 3ffe:ffff:100::1: icmp6: echo request
¬ (len 64, hlim 64) (DF) (ttl 64, id 0, len 124) 
5.6.7.8 > 1.2.3.4: 3ffe:ffff:100::1 > 2002:ffff:f5f8::1: icmp6: echo reply (len
¬ 64, hlim 61) (ttl 23, id 29919, len 124)