Linux IPv6 HOWTO (it)Peter Bieringer pb at bieringer.de L'obiettivo di questo HOWTO è quello di rispondere alle domande, sia di base che avanzate, sull'implementazione di IPv6 sul sistema operativo Linux. Questo HOWTO fornirà al lettore informazioni sufficienti per installare, configurare ed usare applicazioni che utilizzano IPv6 su macchine Linux. Traduzione a cura di Michele Ferritto (m.ferritto--at--virgilio.it) e revisione a cura di Daniele Masini (d.masini--at--tiscali.it). _______________________________________________________________________ Sommario 1. Generale 1.1. Copyright, licenza d'uso e altro 1.2. Categoria 1.3. Versione, Storia e Da Fare 1.4. Traduzioni 1.5. Informazioni tecniche 1.6. Prefazione 1.7. Termini utilizzati, glossario e abbreviazioni 1.8. Requisiti per usare questo HOWTO 2. Fondamenti 2.1. Cosa è IPv6? 2.2. Storia di IPv6 su Linux 2.3. Che aspetto hanno gli indirizzi IPv6? 2.4. FAQ (Fondamentali) 3. Tipi di indirizzi 3.1. Indirizzi senza un prefisso speciale 3.2. Parte rete, detta anche prefisso 3.3. Tipi di indirizzo (parte host) 3.4. Lunghezze del prefisso per il routing 4. Verificare se il sistema è pronto per IPv6 4.1. Kernel pronto per IPv6 4.2. Strumenti di configurazione di rete pronti per IPv6 4.3. Programmi di test/debug pronti per IPv6 4.4. Programmi pronti per IPv6 4.5. Programmi client pronti per IPv6 (selezione) 4.6. Programmi server IPv6 4.7. FAQ (verificare se il sistema è pronto per IPv6) 5. Configurazione delle interfacce 5.1. I vari dispositivi di rete 5.2. Attivazione/disattivazione delle interfacce 6. Configurazione degli indirizzi IPv6 6.1. Visualizzare gli indirizzi IPv6 esistenti 6.2. Aggiungere un indirizzo IPv6 6.3. Rimuovere un indirizzo IPv6 7. Configurazione di instradamenti IPv6 standard 7.1. Visualizzare gli instradamenti IPv6 esistenti 7.2. Aggiungere un instradamento IPv6 attraverso un gateway 7.3. Rimuovere un instradamento IPv6 attraverso un gateway 7.4. Aggiungere un instradamento IPv6 attraverso un'interfaccia 7.5. Rimuovere un instradamento IPv6 attraverso un'interfaccia 7.6. FAQ per gli instradamenti IPv6 8. Scoperta del vicinato (Neighbor Discovery) 8.1. Visualizzare i vicini usando "ip" 8.2. Manipolare la tabella relativa ai vicini utilizzando "ip" 9. Configurare tunnel IPv6-in-IPv4 9.1. Tipi di tunnel 9.2. Visualizzare i tunnel esistenti 9.3. Configurazione di un tunnel punto-punto 9.4. Configurazione di tunnel 6to4 10. Configurare tunnel IPv4-in-IPv6 11. Impostazioni del kernel nel filesystem /proc 11.1. Come accedere al filesystem /proc 11.2. Voci in /proc/sys/net/ipv6/ 11.3. Voci relative a IPv6 in /proc/sys/net/ipv4/ 11.4. Voci relative a IPv6 in /proc/net/ 12. Interfaccia netlink al kernel 13. Debug di rete 13.1. Server socket binding 13.2. Esempi di dump dei pacchetti di tcpdump 14. Supporto per la configurazione persistente di IPv6 nelle distribuzioni Linux 14.1. Red Hat Linux ed i "cloni" 14.2. SuSE Linux 14.3. Debian Linux 15. Configurazione automatica e mobilità 15.1. configurazione automatica stateless 15.2. configurazione automatica stateful con l'utilizzo del Router Advertisement Daemon (radvd) 15.3. Dynamic Host Configuration Protocol v6 (DHCPv6) 15.4. Mobilità 16. Firewalling 16.1. Firewalling utilizzando netfilter6 16.2. Preparazione 16.3. Utilizzo 17. Sicurezza 17.1. Sicurezza del nodo 17.2. Limitazioni di accesso 17.3. Verifica sicurezza di IPv6 18. Cifratura ed autenticazione 18.1. Supporto nel kernel 18.2. Utilizzo 19. Qualità del servizio (QoS) 20. Suggerimenti per demoni abilitati IPv6 20.1. Berkeley Internet Name Daemon BIND (named) 20.2. Internet super daemon (xinetd) 20.3. Server Web Apache2 (httpd2) 20.4. Router Advertisement Daemon (radvd) 20.5. tcp_wrapper 20.6. vsftpd 20.7. proftpd 20.8. Altri Demoni 21. Programmazione (uso delle API) 22. Interoperabilità 23. Ulteriori informazioni e URL 23.1. Libri stampati, articoli, riviste online (misto) 23.2. Conferenze, Incontri, Summit 23.3. Informazione online 23.4. Infrastruttura IPv6 23.5. Mailing list 23.6. Strumenti on line 23.7. Addestramento, Seminari 23.8. 'La Scoperta On line' ... 24. Storico delle revisioni / Ringraziamenti / La Fine 24.1. Storico delle revisioni 24.2. Ringraziamenti 24.3. La Fine _________________________________________________________________ Capitolo 1. Generale Informazioni sulle traduzioni disponibili possono essere trovate nella sezione Traduzioni. _________________________________________________________________ 1.1. Copyright, licenza d'uso e altro 1.1.1. Copyright Written and Copyright (C) 2001-2004 by Peter Bieringer _________________________________________________________________ 1.1.2. Licenza d'uso This Linux IPv6 HOWTO is published under GNU GPL version 2: The Linux IPv6 HOWTO, a guide how to configure and use IPv6 on Linux systems. Copyright (C) 2001-2004 Peter Bieringer This documentation is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. _________________________________________________________________ 1.1.3. A proposito dell'autore 1.1.3.1. Storia Internet/IPv6 dell'autore * 1993: Sono entrato in contatto con Internet utilizzando client e-mail e news basati su console (per esempio si cerchi "e91abier" su groups.google.com, sono io). * 1996: Ho ricevuto una richiesta per progettare un corso su IPv6, comprendente un seminario con il sistema operativo Linux. * 1997: Ho iniziato a scrivere una guida su come installare, configurare e usare IPv6 sui sistemi Linux, chiamata IPv6 &Linux - HowTo (si veda IPv6 &Linux - HowTo/History per maggiori informazioni). * 2001: Ho iniziato a scrivere questo nuovo Linux IPv6 HOWTO. _________________________________________________________________ 1.1.3.2. Contatti L'autore può essere contattato via e-mail presso e anche tramite la sua homepage. Attualmente egli vive a Monaco [zona settentrionale di Schwabing] / Bavaria / Germania (sud) / Europa (centrale) / Terra (superfice/continente). _________________________________________________________________ 1.2. Categoria Questo HOWTO dovrebbe essere elencato nella categoria "Networking/Protocols". _________________________________________________________________ 1.3. Versione, Storia e Da Fare 1.3.1. Versione La versione attuale è indicata all'inizio del documento. Per altre versioni/traduzioni disponibili, si veda anche http://www.bieringer.de/linux/IPv6/. _________________________________________________________________ 1.3.2. Storia 1.3.2.1. Storia principale 30-11-2001: Inizio del progetto del nuovo HOWTO. 02-02-2002: Molto del contenuto completato, primo rilascio pubblico del capitolo 1 (versione 0.10). 14-01-2002: Più completo, qualche revisione, rilascio pubblico dell'intero documento (versione 0.14). 16-08-2002: Procede la traduzione in Polacco 31-10-2002: Disponibile la traduzione in Cinese (si veda Traduzioni per maggiori dettagli) 10-11-2002: Procede la traduzione in Tedesco 10-02-2003: Disponibile la traduzione in Tedesco 09-04-2003: Procede la traduzione in Francese 09-05-2003: Disponibile la traduzione in Francese 15-08-2003: Procede la traduzione in Spagnolo 16-10-2003: Procede la traduzione in Italiano 12-03-2004: Disponibile la traduzione in Italiano 18-06-2004: Procede la traduzione in Greco 29-08-2004: La traduzione in Spagnolo è sospesa _________________________________________________________________ 1.3.2.2. Storia completa Si veda lo Storico delle Revisioni alla fine di questo documento. _________________________________________________________________ 1.3.3. Da Fare * Riempimento dei contenuti mancanti * Terminare controllo grammaticale _________________________________________________________________ 1.4. Traduzioni Le traduzioni devono sempre contenere l'URL, il numero di versione e il copyright del documento originale (ma anche quelli della traduzione). Si prega di non tradurre il changelog originale, non è molto utile. Sembra che la frequenza delle modifiche al documento sia inferiore ad una volta al mese. A partire dalla versione 0.27 inoltre sembra che la maggior parte dei contenuti ai quali ho contribuito, sia stata scritta. Le traduzioni devono sempre essere effettuate a partire dalla versione inglese. _________________________________________________________________ 1.4.1. Traduzioni disponibili 1.4.1.1. Italiano La traduzione in Italiano, a cura di Michele Ferritto, è stata aggiornata il 4 settembre 2004 ed è relativa alla versione 0.47 del documento originale. Detta traduzione è disponibile presso il sito web dell'Italian Linux Documentation Project. Il traduttore può essere contattato all'indirizzo m.ferritto@toglimi.virgilio.it. _________________________________________________________________ 1.4.1.1.1. Altre traduzioni Per informazioni sulle altre traduzioni disponibili si veda il documento originale presso il TLDP. _________________________________________________________________ 1.5. Informazioni tecniche 1.5.1. Sorgente originale di questo HOWTO Questo HOWTO e' stato scritto con LyX versione 1.2.0 su di un sistema Red Hat Linux 7.3 con template SGML (libro DocBook). È disponibile presso TLDP-CVS / users / Peter-Bieringer per contributi. _________________________________________________________________ 1.5.1.1. Wrapping delle linee di codice Il wrapping delle linee di codice è ottenuto utilizzando l'applicazione "lyxcodelinewrapper.pl", creata dall'autore, che è possibile scaricare dal CVS per i propri scopi: TLDP-CVS / users / Peter-Bieringer. _________________________________________________________________ 1.5.1.2. Generazione dello SGML L'output SGML è stato generato utilizzando le funzioni di esportazione di LyX. Si sono resi necessari anche alcuni aggiustamenti per ottenere un codice SGML corretto (per i programmi Perl si veda anche TLDP-CVS / users / Peter-Bieringer): * L'esportazione delle tabelle di LyX non crea correttamente i tag "colspan" - strumento per risolvere: "sgmllyxtabletagfix.pl" (risolto a partire da LyX 1.2.0). * LyX a volte usa speciali entità per le virgolette (a destra ed a sinistra), invece di quelle normali, che ancora esistono nello HTML generato. Qualche browser non riesce a comprenderle correttamente (ad esempio Opera 6 TP 2 o Konqueror) - strumento per risolvere: "sgmllyxquotefix.pl". _________________________________________________________________ 1.5.2. Riferimenti on-line alla versione HTML di questo HOWTO (collegamenti/anchors) 1.5.2.1. Pagina indice Master Di solito, un riferimento alla pagina indice master è raccomandato. _________________________________________________________________ 1.5.2.2. Pagine dedicate Poiché le pagine HTML vengono generate da un file SGML, i nomi dei file risultanti sono praticamente casuali. Tuttavia, alcune pagine sono etichettate in LyX, dando come risultato nomi statici. Queste etichette sono utili come riferimento e non dovrebbero essere modificate in futuro. Se pensate che abbia dimenticato qualche tag, per favore fatemelo sapere così da poterlo aggiungere. _________________________________________________________________ 1.6. Prefazione Alcune cose prima di tutto: _________________________________________________________________ 1.6.1. Quante versioni di HOWTO su Linux & IPv6 ci sono in giro? Inclusa questa, ci sono tre (3) documenti HOWTO disponibili. Scusate se sono troppi ;-) _________________________________________________________________ 1.6.1.1. Linux IPv6 FAQ/HOWTO (obsoleto) Il primo documento relativo a IPv6 fu scritto da Eric Osborne e chiamato Linux IPv6 FAQ/HOWTO (per favore lo si usi solo per riferimenti storici). L'ultima versione è stata la 3.2.1 rilasciata il 14 Luglio 1997. Se qualcuno fosse a conoscenza della data relativa alla prima stesura di tale HOWTO, mi mandi una e-mail (è un'informazione necessaria per la "storia"). _________________________________________________________________ 1.6.1.2. IPv6 & Linux - HowTo (mantenuto) Esiste una seconda versione chiamata IPv6 &Linux - HowTo scritta da me (Peter Bieringer) in HTML puro. Ha visto la luce nell'Aprile del 1997 e la prima versione in inglese è stata pubblicata nel Giugno del 1997. Continuerò a mantenerla anche se si dissolverà lentamente (ma non del tutto) in favore del Linux IPv6 HOWTO che state leggendo. _________________________________________________________________ 1.6.1.3. Linux IPv6 HOWTO (questo documento) Poiché IPv6 &Linux - HowTo è scritto in puro HTML, non è del tutto compatibile con The Linux Documentation Project (TLDP), il sottoscritto (Peter Bieringer) verso la fine del Novembre 2001, ha ricevuto una richiesta per riscrivere lo IPv6 &Linux - HowTo in SGML. Comunque, a causa della dismissione dell'HOWTO Future of IPv6 &Linux - HowTo e del fatto che IPv6 sta divenendo uno standard sempre più utilizzato, ho deciso di scrivere un nuovo documento sulle questioni di base e avanzate che rimaranno importanti per i prossimi anni. Maggiori contenuti dinamici e qualche dettaglio avanzato si potranno trovare nel secondo HOWTO (IPv6 &Linux - HowTo). _________________________________________________________________ 1.7. Termini utilizzati, glossario e abbreviazioni 1.7.1. Relativi alla rete Base 10 Conosciuto sistema numerico decimale, nel quale ogni valore viene rappresentato con le cifre da 0 a 9. Base 16 Utilizzato solitamente nei linguaggi di programmazione a basso ed alto livello, conosciuto anche come sistema numerico esadecimale, nel quale ogni valore viene rappresentato con le cifre da 0 a 9 ed i caratteri da A a F (senza distinzione tra maiuscole e minuscole). Base 85 Sistema di rappresentazione di ogni valore con 85 differenti numeri e caratteri; esso porta a sequenze di cifre più corte - mai visto prima. Bit La più piccola unità di immagazzinamento dati, acceso/vero (1) o spento/falso (0). Byte Principalmente un insieme di 8 (ma non necessariamente - si vedano i sistemi più vecchi) bit. Dispositivo In questo caso, hardware per la connessione di rete, si veda anche NIC. Dual homed host Un dual homed host è un nodo (sistema) con due interfacce di rete (fisiche o virtuali) su due differenti collegamenti che non inoltra nessun pacchetto tra le interfacce. Host Generalmente un single homed host su di un collegamento. Normalmente ha solo una interfaccia di rete attiva, per esempio Ethernet o PPP. Interfaccia Essenzialmente lo stesso di "dispositivo", si veda anche NIC. Intestazione IP (IP Header) Intestazione di un pacchetto IP (ogni pacchetto di rete ha un'intestazione, il cui tipo dipende dal livello di rete). Link (collegamento) Il link è il meccanismo di comunicazione dei pacchetti di rete di livello 2 OSI; esempi sono Ethernet, Token Ring, PPP, SLIP, ATM, ISDN, Frame Relay, ... Nodo Un nodo è un host o un router. Ottetto Un insieme di 8 bit, attualmente è analogo al "byte". Porta Informazione necessaria al dispatcher TCP/UDP (livello 4 OSI) per il trasporto delle informazioni agli strati superiori. Protocollo Ogni livello di rete contiene di solito un campo protocollo per facilitare le operazioni di recapito delle informazioni trasportate al livello superiore come per esempio il livello 2 (MAC) e 3 (IP). Router Un router è un nodo con 2 o più interfacce di rete (fisiche o virtuali) capace di inoltrare pacchetti tra le interfacce. Socket Un socket IP è definito dal legame tra l'indirizzo IP del mittente (sorgente), l'indirizzo IP di destinazione e le relative Porte (binding). Stack Un insieme di livelli di rete. Maschera di sottorete (Subnet mask) Le reti IP usano maschere di bit per separare le reti locali da quelle remote. Tunnel Un tunnel è tipicamente una connessione punto-punto nella quale i pacchetti scambiati contengono al loro interno pacchetti di un altro protocollo, come per esempio in un tunnel IPv6-in-IPv4. _________________________________________________________________ 1.7.1.1. Abbreviazioni ACL Access Control List. API Application Programming Interface. ASIC Application Specified Integrated Circuit. BSD Berkeley Software Distribution. CAN-Bus Controller Area Network Bus (physical bus system). ISP Internet Service Provider KAME Progetto - uno sforzo congiunto di sei società giapponesi per fornire al pubblico uno stack IPv6 e IPsec (sia per IPv4 che per IPv6) libero, per varianti BSD www.kame.net. LIR Local Internet Registry NIC Network Interface Card. RFC Request For Comments - Insieme di note tecniche e organizzative che riguardano Internet. USAGI UniverSAl playGround for Ipv6 Project - lavori per mettere in produzione uno stack IPv6 di qualità per il sistema Linux. _________________________________________________________________ 1.7.2. Informazioni relative al testo 1.7.2.1. Carattere di collegamento tra più righe di codice Il carattere speciale "¬" viene usato per segnalare che la linea di codice corrente fa parte di quella precedente, ma è rappresentata fisicamente su una riga diversa per una migliore visualizzazione nei file PDF e PS. _________________________________________________________________ 1.7.2.2. Segnaposto Negli esempi generici a volte si può trovare la seguente dicitura: Per l'uso concreto nella propria riga di comando o in uno script, tale dicitura deve essere sostituita con il contenuto opportuno (rimuovendo < e > naturalmente); in questo caso il risultato potrebbe essere, per esempio 1.2.3.4 _________________________________________________________________ 1.7.2.3. Comandi nella shell Comandi eseguiti da utenti non-root iniziano con il carattere $, ad esempio $ whoami Comandi eseguiti come utente root iniziano con il carattere #, ad esempio # whoami _________________________________________________________________ 1.8. Requisiti per usare questo HOWTO 1.8.1. Prerequisti personali 1.8.1.1. Esperienza con gli strumenti Unix Si dovrebbe avere familiarità con i principali strumenti Unix, ad esempio grep, awk, find, ... e conoscere le relative opzioni di comando più comuni. _________________________________________________________________ 1.8.1.2. Conoscenza della teoria delle reti Si dovrebbe essere a conoscenza di livelli, protocolli, indirizzi, cavi, plug, ecc. Se si è nuovi in questo campo, qui c'è un buon punto di partenza: linuxports/howto/intro_to_networking. _________________________________________________________________ 1.8.1.3. Esperienza con la configurazione di IPv4 Si deve avere necessariamente avuto qualche esperienza nella configurazione di IPv4, altrimenti sarà dura capire cosa sta veramente succedendo. _________________________________________________________________ 1.8.1.4. Esperienza con il Domain Name System (DNS) Bisogna anche comprendere cosa è il Domain Name System (DNS), cosa fornisce e come va usato. _________________________________________________________________ 1.8.1.5. Esperienza con le strategie di network debugging È necessario almeno capire come usare tcpdump e cosa può mostrare. Diversamente, il network debugging risulterà molto ostico. _________________________________________________________________ 1.8.2. Hardware compatibile con il sistema operativo Linux Sicuramente si vorranno fare esperimenti con del vero hardware e non semplicemente leggere questo HOWTO addormentandosi qua e là. ;-7) _________________________________________________________________ Capitolo 2. Fondamenti 2.1. Cosa è IPv6? IPv6 è un nuovo protocollo di livello 3 OSI (si veda linuxports/howto/intro_to_networking/ISO - OSI Model) il quale soppianterà IPv4 (conosciuto anche come IP). IPv4 fu progettato molto tempo fa (RFC 760 / Internet Protocol del Gennaio 1980) e fin dal principio, ci sono state molte richieste per più indirizzi e migliori risorse. L'ultima RFC è RFC 2460 / Internet Protocol Version 6 Specification. I cambiamenti più importanti di IPv6 sono la riprogettazione dell'intestazione (header), incluso l'aumento della dimensione degli indirizzi da 32 a 128 bit. Poichè il livello 3 OSI è responsabile del trasporto dal mittente al destinatario (end-to-end) dei pacchetti tramite l'instradamento (routing) basato sugli indirizzi, esso deve includere i nuovi indirizzi IPv6 (sorgente e destinazione) come IPv4. Per maggiori informazioni sulla storia di IPv6 si dia uno sguardo alle vecchie RFC relative elencate ad esempio presso Guida IPv6 SWITCH / Riferimenti. _________________________________________________________________ 2.2. Storia di IPv6 su Linux Gli anni 1992, 1993 e 1994 della storia di IPv6 sono trattati (in generale) dal seguente documento: IPv6 o IPng (IP next generation). Da fare: miglior time-line, maggiori contenuti... _________________________________________________________________ 2.2.1. Inizio Il primo codice relativo a IPv6 fu aggiunto al kernel Linux 2.1.8 nel Novembre 1996 da Pedro Roque. Era basato sull'API BSD: diff -u --recursive --new-file v2.1.7/linux/include/linux/in6.h ¬ linux/include/linux/in6.h --- v2.1.7/linux/include/linux/in6.h Thu Jan 1 02:00:00 1970 +++ linux/include/linux/in6.h Sun Nov 3 11:04:42 1996 @@ -0,0 +1,99 @@ +/* + * Types and definitions for AF_INET6 + * Linux INET6 implementation + * + * Authors: + * Pedro Roque <******> + * + * Source: + * IPv6 Program Interfaces for BSD Systems + * Le linee mostrate sono state copiate dalla patch-2.1.8 (l'indirizzo e-mail è stato nascosto nel copia&incolla). _________________________________________________________________ 2.2.2. Nel mezzo A causa della mancanza di manodopera, l'implementazione di IPv6 nel kernel non è riuscita a seguire le stesure discusse o i nuovi RFC rilasciati. Nell'Ottobre 2000, in Giappone è stato avviato un progetto chiamato USAGI, il cui intento è quello di implementare tutto il supporto IPv6 mancante o sorpassato in Linux. Questo tiene traccia delle implementazioni IPv6 su FreeBSD realizzate dal progetto KAME. Di volta in volta essi creano delle istantanee rispetto agli attuali sorgenti "vanilla" del kernel di Linux. _________________________________________________________________ 2.2.3. Attuale Sfortunatamente, la patch USAGI è così grande che gli attuali manutentori del networking di Linux non riescono ad includerla nei sorgenti di produzione del kernel della serie 2.4.x. Pertanto questa serie di kernel manca di alcune (molte) estensioni e inoltre non è conforme a tutte le attuali discussioni e RFC (si veda Statuto del gruppo di lavoro IP Versione 6 (ipv6)). Questo causa qualche problema di interoperabilità con gli altri sistemi operativi. _________________________________________________________________ 2.2.4. Futuro USAGI sta ora facendo uso della nuova serie di kernel di sviluppo 2.5.x per inserirvi tutte le attuali estensioni. Con buone speranze i kernel della serie 2.6.x conterranno una reale implementazione di IPv6 aggiornata. _________________________________________________________________ 2.3. Che aspetto hanno gli indirizzi IPv6? Come precedentemente accennato, gli indirizzi IPv6 sono lunghi 128 bit. Questa quantità di bit genera numeri decimali molto grandi che possono avere fino a 39 cifre: 2^128-1: 340282366920938463463374607431768211455 Tali numeri non sono indirizzi che possono effettivamente essere agevolmente memorizzati. Lo schema dell'indirizzo IPv6 è un insieme di bit (esattamente come IPv4, ma spesso di ciò non si è consapevoli). Pertanto una migliore notazione per così grandi numeri è l'esadecimale. In esadecimale, 4 bit (anche conosciuto come "nibble") sono rappresentati da un numero o un carattere da 0 a 9 e da A a F (10-15). Questo formato riduce la lunghezza dell'indirizzo IPv6 a 32 caratteri. 2^128-1: 0xffffffffffffffffffffffffffffffff Questa rappresentazione non è ancora molto conveniente (possibile confusione o perdita di singole cifre esadecimali), così i progettisti di IPv6 hanno scelto un formato esadecimale con i due punti come separatori dopo ogni blocco di 16 bit. Inoltre, l'iniziale "0x" (l'indicatore usato nei linguaggi di programmazione per valori esadecimali) viene rimosso: 2^128-1: ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff Un esempio di indirizzo utilizzabile (si vedano i tipi di indirizzo più avanti) è: 3ffe:ffff:0100:f101:0210:a4ff:fee3:9566 Per semplificare, lo zero iniziale di ogni blocco di 16 bit può essere omesso: 3ffe:ffff:0100:f101:0210:a4ff:fee3:9566 -> ¬ 3ffe:ffff:100:f101:210:a4ff:fee3:9566 Una sequenza di 16 blocchi di bit contenenti solo zeri può essere rimpiazzata con "::". Ma non più di una alla volta, altrimenti non è più una rappresentazione unica. 3ffe:ffff:100:f101:0:0:0:1 -> 3ffe:ffff:100:f101::1 La riduzione più grande si può apprezzare con l'indirizzo IPv6 relativo a localhost: 0000:0000:0000:0000:0000:0000:0000:0001 -> ::1 Esiste anche una rappresentazione (codificata in base 85) cosidetta compatta definita RFC 1924 / A Compact Representation of IPv6 Addresses (pubblicata il 1 Aprile 1996), mai vista da nessuna parte, probabilmente un pesce d'Aprile, ma di seguito è riportato un esempio: # ipv6calc --addr_to_base85 3ffe:ffff:0100:f101:0210:a4ff:fee3:9566 Itu&-ZQ82s>J%s99FJXT Info: ipv6calc è un programma per calcolare e convertire indirizzi IPv6 nei vari formati e può essere trovato qui: ipv6calc homepage (Mirror). _________________________________________________________________ 2.4. FAQ (Fondamentali) 2.4.1. Perchè il nome del successore di IPv4 è IPv6 e non IPv5? In ogni intestazione IP, i primi 4 bit sono riservati per la versione del protocollo. Così teoricamente sono possibili numeri di protocollo da 0 a 15: * 4: già utilizzato per IPv4 * 5: riservato per lo Stream Protocol (STP, RFC 1819 / Internet Stream Protocol Version 2) (il quale non è mai stato veramente reso pubblico) Il successivo numero libero è 6. Per cui è nato IPv6! _________________________________________________________________ 2.4.2. Indirizzi IPv6: perché un così grande numero di bit? Durante la progettazione di IPv4, si pensò che 32 bit fossero sufficienti per il mondo. Guardando al passato, 32 bit sono stati sufficienti fino ad ora e può darsi che basteranno per qualche altro anno. Comunque, 32 bit non bastano per fornire in futuro, ad ogni dispositivo di rete un indirizzo globale. Si pensi ai telefoni mobili, alle auto (inclusi i dispositivi sulle loro CAN-bus), ai tostapane, ai frigoriferi, agli interruttori della luce, e cosi via ... Per questo i progettisti hanno scelto 128 bit, 4 volte più lungo e 2^96 volte superiore rispetto all'IPv4 di oggi. La dimensione effettivamente utilizzabile è comunque inferiore rispetto a quello che sembra. Questo perché nello schema degli indirizzi attualmente definito, 64 bit sono usati per gli identificatori di interfaccia e gli altri 64 bit sono usati per l'instradamento. Assumendo gli attuali stretti livelli di aggregazione (/48, /32, ...) è persino possibile esaurire lo spazio, ma speriamo non nel prossimo futuro. Per maggiori informazioni si vedano anche RFC 1715 / The H Ratio for Address Assignment Efficiency e RFC 3194 / The Host-Density Ratio for Address Assignment Efficiency. _________________________________________________________________ 2.4.3. Indirizzi IPv6: Perché un così piccolo numero di bit per un nuovo progetto? Al momento ci sono (forse) alcune persone (conosco solo Jim Fleming...) su Internet che stanno pensando a IPv8 e IPv16, il loro progetto è ancora lontano dall'essere accettato e implementato. Nel frattempo 128 bit sono stati la migliore scelta per l'overhead dell'intestazione e il trasporto dati. Consideriamo la minima Maximum Transfer Unit (MTU) in IPv4 (576 ottetti) e in IPv6 (1280 ottetti), la lunghezza dell'intestazione di IPv4 è 20 ottetti (minima, può arrivare a 60 ottetti con le opzioni) quella di IPv6 è 48 ottetti (fissa). Questa è il 3.4 % della MTU di IPv4 e il 3.8 % della MTU di IPv6. Ciò significa che l'overhead dell'intestazione è quasi uguale. Più bit per gli indirizzi richiedono intestazioni più grandi e quindi maggiore overhead. Si consideri anche che la massima MTU su normali link (come Ethernet attualmente) è di 1500 ottetti (in casi particolari 9k ottetti utilizzando frame "Jumbo"). In definitiva, non sarebbe strutturalmente appropriato se il 10 % o 20 % dei dati trasportati in un pacchetto di livello 3 fosse usato per gli indirizzi e non per il payload. _________________________________________________________________ Capitolo 3. Tipi di indirizzi Come in IPv4, gli indirizzi IPv6 possono essere divisi in parte rete e parte host utilizzando le maschere di sottorete (subnet mask). IPv4 ha dimostrato che in certi casi può essere utile assegnare più di un indirizzo ad una singola interfaccia, ognuno per un differente scopo (alias, multi-cast). Per rimanere estensibile in futuro, IPv6 va oltre e permette l'assegnazione di più di un indirizzo IPv6 ad una stessa interfaccia. Non ci sono attualmente limiti definiti da una RFC se non nell'implementazione dello stack IPv6 (per prevenire attacchi DoS). Utilizzando un grande numero di bit per gli indirizzi, IPv6 definisce dei tipi basandosi sul valore di alcuni bit iniziali, che speriamo non verranno cambiati in futuro (diversamente dall'attuale IPv4 e la storia delle classi A, B, e C). Inoltre il numero di bit è separato in una parte rete (i 64 bit più significativi) e in una parte host (i 64 bit meno significativi) per facilitare l'auto configurazione. A tal proposito, una valida URL per mostrare in dettaglio un dato indirizzo IPv6 è il Laboratorio Avanzato Gestione di Rete / Oracolo indirizzo IPv6. _________________________________________________________________ 3.1. Indirizzi senza un prefisso speciale 3.1.1. Indirizzo localhost È uno speciale indirizzo per l'interfaccia di loopback, simile al "127.0.0.1"di IPv4. Con IPv6 l'indirizzo localhost è: 0000:0000:0000:0000:0000:0000:0000:0001 o compresso: ::1 I pacchetti con questo indirizzo come sorgente o destinazione non devono mai uscire dall'host che li invia. _________________________________________________________________ 3.1.2. Indirizzo non specificato Questo è un indirizzo speciale come "any" o "0.0.0.0" in IPv4 . Per IPv6 è: 0000:0000:0000:0000:0000:0000:0000:0000 o: :: Questi indirizzi sono principalmente usati/visti nel socket binding (per ogni indirizzo IPv6) o nelle tabelle di instradamento. Nota: Questo tipo di indirizzo non può essere usato come destinazione. _________________________________________________________________ 3.1.3. Indirizzo IPv6 con indirizzo IPv4 incorporato Ci sono due tipi di indirizzi IPv6 che possono contenere un indirizzo IPv4. _________________________________________________________________ 3.1.3.1. Indirizzo IPv6 mappato IPv4 Gli indirizzi compatibili IPv6 solo IPv4 sono a volte utilizzati/visualizzati per socket creati da un demone abilitato IPv6, ma relativo ad un indirizzo IPv4. questi indirizzi sono definiti con un prefisso speciale di lunghezza 96 (a.b.c.d è l'indirizzo IPv4): 0:0:0:0:0:ffff:a.b.c.d/96 o nel formato compresso ::ffff:a.b.c.d/96 Per esempio, l'indirizzo IPv4 1.2.3.4 è rappresentato così: ::ffff:1.2.3.4 _________________________________________________________________ 3.1.3.2. Indirizzo IPv6 compatibile IPv4 Utilizzato per il tunneling automatico (RFC 2893 / Transition Mechanisms for IPv6 Hosts and Routers), che sta per essere rimpiazzato da tunneling 6to4. 0:0:0:0:0:0:a.b.c.d/96 o nel formato compresso ::a.b.c.d/96 _________________________________________________________________ 3.2. Parte rete, detta anche prefisso I progettisti hanno definito alcuni tipi di indirizzo e ne hanno lasciati parecchi per future definizioni, attualmente sconosciute. RFC 2373 [Luglio 1998] / IP Version 6 Addressing Architecture definisce l'attuale schema di indirizzamento anche se c'è già una nuova bozza disponibile: draft-ietf-ipngwg-addr-arch-*.txt. Si dia ora uno sguardo ai differenti tipi di prefisso (e quindi tipi di indirizzo): _________________________________________________________________ 3.2.1. Indirizzo link locale Sono particolari indirizzi, validi soltanto nel link di un interfaccia. Usando questo indirizzo come destinazione, il pacchetto non attraverserà mai un router. È usato per comunicazioni link quali: * c'è qualcun'altro su questo link? * c'è qualcuno con un particolare indirizzo (per esempio per la ricerca di un router)? Essi iniziano con (dove "x" è qualsiasi carattere esadecimale, normalmente "0") fe8x: <- attualmente l'unico utilizzato. fe9x: feax: febx: Un indirizzo con questo prefisso si trova su ogni interfaccia abilitata IPv6 dopo una configurazione automatica stateless (che è il caso classico). _________________________________________________________________ 3.2.2. Indirizzo di tipo sito locale Questi sono indirizzi simili a quelli specificati dalla RFC 1918 / Address Allocation for Private Internets, oggi utilizzati da IPv4, con il vantaggio che chiunque usi questo tipo di indirizzo ha la possibilità di utilizzare 16 bit per gestire fino a 65536 sottoreti. È analogo alla 10.0.0.0/8 di IPv4. Un altro vantaggio: poiché è possibile assegnare più di un indirizzo ad un'interfaccia IPv6, si può anche assegnare tale indirizzo locale in aggiunta ad uno globale. Questo tipo di indirizzo inizia con: fecx: <- il più comunemente usato. fedx: feex: fefx: (dove "x" è qualsiasi carattere esadecimale, normalmente "0") Si noti che ci sono dibattiti sul fatto di dismettere questo tipo di indirizzi poiché esistono diversi problemi. Per maggiori dettagli si veda draft-ietf-ipv6-deprecate-site-local-XY.txt. A mio modesto parere, questo tipo di indirizzi sono ancora una buona scelta per prove di laboratorio. _________________________________________________________________ 3.2.3. Indirizzo di tipo globale "(Aggregatable) global unicast" Attualmente, c'è un unico indirizzo di tipo globale definito (il primo progetto, chiamato "provider based" fu cestinato alcuni anni fà RFC 1884 / IP Version 6 Addressing Architecture [obsoleto], se ne possono trovare alcune tracce nei più vecchi sorgenti del kernel Linux). Inizia con (le x sono caratteri esadecimali) 2xxx: 3xxx: Nota: il prefisso "aggregabile" (aggregatable) è stato depennato dalle bozze attuali. Ci sono alcuni ulteriori sottotipi definiti, come di seguito riportato: _________________________________________________________________ 3.2.3.1. Indirizzi 6bone di test Questi sono i primi indirizzi globali che sono stati definiti ed utilizzati. Iniziano con 3ffe: Esempio: 3ffe:ffff:100:f102::1 Un particolare indirizzo 6bone di test che non sarà mai globalmente unico, inizia con 3ffe:ffff: ed è generalmente mostrato negli esempi, perché se venissero mostrati indirizzi reali, sarebbe possibile per qualcuno fare un copia & incolla sui suoi file di configurazione. In questo modo si potrebbe causare inavvertitamente la duplicazione di un indirizzo globalmente unico. Ciò potrebbe causare seri problemi all'host originale (per esempio potrebbe ricevere pacchetti di risposta per richieste che non sono mai state inviate da esso). Tuttavia è possibile richiedere uno di questi prefissi, si veda Come far parte del 6bone. Anche alcuni tunnel brokers distribuiscono prefissi di indirizzi 6bone di test. _________________________________________________________________ 3.2.3.2. Indirizzi 6to4 Questi indirizzi, pensati per uno speciale meccanismo di tunneling [RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds e RFC 2893 / Transition Mechanisms for IPv6 Hosts and Routers], codificano un dato indirizzo IPv4 ed una possibile sottorete. Essi iniziano con 2002: Per esempio, per rappresentare 192.168.1.1/5: 2002:c0a8:0101:5::1 Un semplice comando di shell può aiutare a generarli a partire da indirizzi IPv4: ipv4="1.2.3.4"; sla="5"; printf "2002:%02x%02x:%02x%02x:%04x::1" `echo $ipv4 | tr "." " "` $sla Si veda anche tunneling con il 6to4 e informazioni sui relay router 6to4. _________________________________________________________________ 3.2.3.3. Assegnato dal provider per routing gerarchico Questi indirizzi sono delegati agli Internet service provider (ISP) ed iniziano con 2001: I prefissi ai maggiori ISP (proprietari di backbone, anche detti LIR) sono delegati dai local registries ed attualmente assegnano prefissi di lunghezza 35. Ogni ISP minore, può ottenere un prefisso di lunghezza 48. _________________________________________________________________ 3.2.3.4. Indirizzi riservati per esempi e documentazione Attualmente, due intervalli di indirizzi sono riservati per esempi e documentazione: 3ffe:ffff::/32 2001:0DB8::/32 EXAMPLENET-WF Questi intervalli di indirizzi dovrebbero essere filtrati in base agli indirizzi di provenienza e possibilmente NON dovrebbero essere instradati sui router di confine verso Internet. _________________________________________________________________ 3.2.4. Indirizzi multicast Gli indirizzi multicast sono usati per servizi ad essi relativi. Essi iniziano sempre con (xy è il valore dell'ambito di applicabilità - scope) ffxy: Si suddividono in ambiti di applicabilità (scope) e tipi: _________________________________________________________________ 3.2.4.1. Multicast scope L'ambito di applicabilità multicast (multicast scope) è un parametro che specifica la distanza massima che può percorrere un pacchetto a partire dall'entità che lo invia. Attualmente, vengono definite le seguenti regioni (ambiti di applicabilità): * ffx1: node-local, i pacchetti non lasciano mai il nodo. * ffx2: link-local, i pacchetti non sono mai inoltrati dai router, in questo modo non lasciano mai il link specificato. * ffx5: site-local, i pacchetti non lasciano mai il sito. * ffx8: organization-local, i pacchetti non lasciano mai l'organizzazione (non così facile da implementare, la gestione deve essere effettuata dal protocollo di instradamento). * ffxe: global scope. * gli altri sono riservati. _________________________________________________________________ 3.2.4.2. Tipi multicast Ci sono numerosi tipi già definiti/riservati (si veda RFC 2373 / IP Version 6 Addressing Architecture per i dettagli). Alcuni esempi sono: * Indirizzo di tutti i nodi: ID = 1h, indirizza tutti gli host sul nodo locale (ff01:0:0:0:0:0:0:1) o sul link connesso (ff02:0:0:0:0:0:0:1). * Indirizzo di tutti i router: ID = 2h, indirizza tutti i router sul nodo locale (ff01:0:0:0:0:0:0:2), sul link connesso (ff02:0:0:0:0:0:0:2), o sul sito locale (ff05:0:0:0:0:0:0:2). _________________________________________________________________ 3.2.4.3. Indirizzo multicast link-local nodo sollecitato Speciale indirizzo multicast utilizzato come destinazione nella scoperta del vicinato, perché a differenza di IPv4, ARP non esiste più in IPv6. Un esempio di questo indirizzo somiglia a ff02::1:ff00:1234 Il prefisso utilizzato mostra che questo è un indirizzo multicast link-local. Il suffisso viene generato dall'indirizzo di destinazione. In questo esempio, un pacchetto dovrebbe essere inviato all'indirizzo "fe80::1234" ma lo stack di rete non conosce l'attuale indirizzo di livello 2 (MAC). I 104 bit più significativi vengono rimpiazzati con "ff02:0:0:0:0:1:ff00::/104" ed i 24 bit meno significativi vengono lasciati inalterati. Questo indirizzo viene quindi usato `on-link' per trovare il corrispondente nodo che deve inviare una risposta contenente il suo indirizzo di livello 2 (MAC). _________________________________________________________________ 3.2.5. Indirizzi anycast Gli indirizzi anycast sono indirizzi speciali e vengono utilizzati per trattare cose come il server DNS più vicino, il server DHCP più vicino o simili gruppi dinamici. Questi vengono presi dallo spazio degli indirizzi unicast (aggregatable global o site-local per il momento). Il meccanismo anycast (dal punto di vista del client) sarà gestito dai protocolli di routing dinamici. Nota: gli indirizzi anycast non possono essere usati come indirizzo del mittente, ma sono validi soltanto come indirizzi di destinazione. _________________________________________________________________ 3.2.5.1. Indirizzo anycast subnet-router Un semplice esempio di un indirizzo anycast è il tipo subnet-router. Assumendo che un nodo abbia il seguente indirizzo globale IPv6: 3ffe:ffff:100:f101:210:a4ff:fee3:9566/64 <- Indirizzo del nodo L'indirizzo anycast subnet-router sarà creato svuotando completamente il suffisso (i 64 bit meno significativi): 3ffe:ffff:100:f101::/64 <- indirizzo anycast subnet-router _________________________________________________________________ 3.3. Tipi di indirizzo (parte host) Per problemi di configurazione automatica e mobilità è stato deciso di usare, nella maggior parte degli attuali tipi, i 64 bit meno significativi come parte host dell'indirizzo. Quindi ogni singola sottorete può possedere un grande numero di indirizzi. Questa parte host può essere considerata in maniera diversa: _________________________________________________________________ 3.3.1. Generata automaticamente (anche detta stateless) Con la configurazione automatica, la parte host dell'indirizzo viene calcolata convertendo, con il metodo EUI-64, l'indirizzo MAC di un interfaccia (se disponibile) in un indirizzo IPv6 unico. Se nessun indirizzo MAC è disponibile per questo dispositivo (come accade ad esempio con le periferiche virtuali), viene usato qualcos'altro (come l'indirizzo IPv4 o l'indirizzo MAC di una interfaccia fisica). Si consideri ancora il primo esempio 3ffe:ffff:100:f101:210:a4ff:fee3:9566 qui 210:a4ff:fee3:9566 è la parte host generata a partire dall'indirizzo MAC della scheda di rete 00:10:A4:E3:95:66 utilizzando il Tutorial IEEE EUI-64 sviluppato per gli identificatori EUI-48. _________________________________________________________________ 3.3.1.1. Problemi di Privacy con gli indirizzi generati automaticamente ed una soluzione Poiché la parte host viene "calcolata automaticamente" è globalmente unica (a meno che un produttore di schede di rete usi lo stesso indirizzo MAC per più di una NIC) è possibile effettuare il tracciamento del client quando non viene utilizzato alcun proxy. Ciò è un problema noto ed è stata definita una soluzione: la privacy extension, descritta in RFC 3041 / Privacy Extensions for Stateless Address Autoconfiguration in IPv6 (c'è anche già una nuova bozza disponibile: draft-ietf-ipngwg-temp-addresses-*.txt). Utilizzando un valore casuale ed uno statico viene generato di volta in volta un nuovo suffisso. Nota: ciò è ragionevole soltanto per comunicazioni uscenti da client, ma non è utile nel caso di server noti. _________________________________________________________________ 3.3.2. Impostata manualmente Per i server probabilmente è più facile ricordare semplici indirizzi e anche questo può essere agevolato. È possibile assegnare un indirizzo IPv6 addizionale ad un'interfaccia, per esempio 3ffe:ffff:100:f101::1 Per i suffissi manuali come "::1" mostrato nell'esempio precedente, è richiesto che il settimo bit più significativo sia impostato a 0 (il bit universale/locale degli identificatori generati automaticamente). Anche altre combinazioni di bit (altrimenti non scelte) sono riservate per indirizzi anycast. _________________________________________________________________ 3.4. Lunghezze del prefisso per il routing Nella prima fase della progettazione fu pianificato di usare un approccio al routing completamente gerarchico per ridurre al massimo la dimensione delle tabelle di routing. Il motivo di questo approccio fu il numero delle attuali voci di routing di IPv4 nei router principali (> 104.000 nel Maggio 2001), riducendo la necessità di memoria nei router hardware (basati su ASIC "Application Specified Integrated Circuit") per memorizzare la tabella di routing ed incrementare la velocità (un numero di voci inferiore consente ricerche più veloci). Il punto di vista attuale è che il routing debba essere sviluppato in maniera gerarchica principalmente per reti con un solo service provider. Con più di un ISP ciò non è possibile e si è soggetti ad una questione chiamata multi-homing (informazioni sul multi-homing: Procider-Internal Aggregation based on Geography to Support Multihoming in IPv6; GAPI: A Geographically Aggregatable Provider Independent Address Space to Support Multihoming in IPv6; Extension Header for Site-Multi-homing support; IPv6 Multihoming Solutions). _________________________________________________________________ 3.4.1. Lunghezze del prefisso ("maschera di rete" - netmask) Come per IPv4, è il percorso della rete instradabile affinché il routing abbia luogo. Poiché la notazione standard per indicare la maschera di rete con 128 bit non è agevole, i progettisti hanno utilizzato lo schema IPv4 Classless Inter Domain Routing (CIDR, RFC 1519 / Classless Inter-Domain Routing) che indica il numero di bit dell'indirizzo IP da utilizzare nelil'instradamento . Tale notazione è anche detta notazione "slash". Un esempio: 3ffe:ffff:100:1:2:3:4:5/48 Questa notazione verrà espansa in: * Rete: 3ffe:ffff:0100:0000:0000:0000:0000:0000 * Maschera di rete: ffff:ffff:ffff:0000:0000:0000:0000:0000 _________________________________________________________________ 3.4.2. Corrispondenza con una route In circostanze normali (senza QoS) una ricerca in una tabella di instradamento dà come risultato la route con il numero di bit dell'indirizzo più significativo, cioè viene scelta la prima route che ha la lunghezza del prefisso più grande corrispondente a quella dell'indirizzo di destinazione considerato. Per esempio, se una tabella di instradamento mostra le seguenti voci (la lista non è completa): 3ffe:ffff:100::/48 :: U 1 0 0 sit1 2000::/3 ::192.88.99.1 UG 1 0 0 tun6to4 I seguenti indirizzi di destinazione dei pacchetti IPv6 saranno instradati attraverso i dispositivi elencati 3ffe:ffff:100:1:2:3:4:5/48 -> instradato attraverso il dispositivo sit1 3ffe:ffff:200:1:2:3:4:5/48 -> instradato attraverso il dispositivo tun6to4 _________________________________________________________________ Capitolo 4. Verificare se il sistema è pronto per IPv6 Prima di poter cominciare a usare IPv6 su di un host Linux, bisogna verificare se il sistema è pronto per IPv6. Potrebbe essere necessario effettuare qualche operazione per abilitarlo. _________________________________________________________________ 4.1. Kernel pronto per IPv6 Le moderne ditribuzioni Linux già contengono kernel pronti per IPv6; la funzionalità IPv6 è generalmente compilata come modulo ma è possibile che questo non venga caricato automaticamente all'avvio del sistema. Si veda la pagina IPv6+Linux-Status-Distribution per le informazioni più aggiornate. Nota: non si dovrebbero più usare i kernel della serie 2.2.x perché non sono più aggiornati per IPv6. _________________________________________________________________ 4.1.1. Controllare il supporto IPv6 nel kernel corrente Per controllare se il kernel corrente supporta IPv6, si dia un occhiata al proprio filesystem /proc. Deve esistere la seguente voce: /proc/net/if_inet6 Un semplice test automatico potrebbe essere: # test -f /proc/net/if_inet6 && echo "Running kernel is IPv6 ready" Se esso fallisce è ovvio che il modulo IPv6 non è stato caricato. _________________________________________________________________ 4.1.2. Provare a caricare il modulo IPv6 Si può provare a caricare il modulo IPv6 eseguendo # modprobe ipv6 Se tale comando ha successo, questo modulo dovrebbe essere caricato; lo si può controllare con il seguente comando: # lsmod |grep -w 'ipv6' && echo "IPv6 module successfully loaded" Il comando precedente dovrebbe quindi funzionare con successo. Nota: lo scaricamento del modulo non è attualmente supportato e può causare, in alcune circostanze, il crash del kernel. _________________________________________________________________ 4.1.2.1. Caricamento automatico del modulo IPv6 È possibile caricare automaticamente il modulo IPv6 su richiesta. Basta aggiungere la seguente linea nel file di configurazione del loader dei moduli del kernel (normalmente /etc/modules.conf o /etc/conf.modules): alias net-pf-10 ipv6 # carica automaticamente su richiesta il modulo IPv6 È anche possibile disabilitare il caricamento automatico del modulo usando la seguente linea alias net-pf-10 off # disabilita il caricamento automatico del modulo IPv6 Nota addizionale: nei kernel più recenti (serie 2.5 e successive), il meccanismo del caricatore dei moduli è stato modificato. Il nuovo file di configurazione è /etc/modprobe.conf invece di /etc/modules.conf, ma è comunque disponibile uno script per la traduzione. Per ulteriori dettagli si veda module-init-tool. _________________________________________________________________ 4.1.3. Compilare il kernel con le funzionalità IPv6 Se entrambe le operazioni precedenti avessero esito negativo e il kernel considerato non avesse il supporto IPv6, si hanno le seguenti possibilità: * Aggiornare la propria distribuzione con una versione avente il supporto IPv6 incluso (raccomandato per i principianti), si veda IPv6+Linux-Status-Distribution * Compilare un nuovo kernel "vanilla" (facile, se si conoscono le opzioni necessarie) * Ricompilare i sorgenti del kernel della propria distribuzione Linux (a volte non così facile) * Compilare un kernel con le estensioni USAGI Se si decide di compilare un kernel, si dovrebbero avere precedenti esperienze in questa operazione e si dovrebbe leggere il Linux Kernel HOWTO. Un confronto abbastana aggiornato tra il kernel puro (vanilla) e quello con le estensioni USAGI è disponibile su IPv6+Linux-Status-Kernel. _________________________________________________________________ 4.1.3.1. Compilazione di un kernel "vanilla" Consigli più dettagliati sulla compilazione di un kernel con IPv6 possono essere reperiti, per esempio, su IPv6-HOWTO-2#kernel. Nota: quando possibile si dovrebbero usare kernel della serie 2.4.x o superiori, poiché il supporto IPv6, nella serie 2.2.x non è così aggiornato e necessita di alcune patch per ICMPv6 e per il supporto 6to4 (che si possono trovare su kernel series 2.2.x IPv6 patches). _________________________________________________________________ 4.1.3.2. Compilazione del kernel con le estensioni USAGI Come per il kernel vanilla, questa operazione è raccomandata solo agli utenti esperti che abbiano già familiarità con IPv6 e la compilazione del kernel. Si veda anche il progetto USAGI / FAQ e Ottenere il miglior supporto IPv6 con Linux (Articolo) (Mirror). _________________________________________________________________ 4.1.4. Dispositivi di rete pronti per IPv6 Non tutti i dispositivi di rete esistenti hanno già (o avranno mai) la capacità di trasportare pacchetti IPv6. Lo stato attuale è reperibile presso IPv6+Linux-status-kernel.html#transport. Una questione importante è che a causa della struttura dei livelli di rete nell'implementazione del kernel, un pacchetto IPv6 non viene effettivamente riconosciuto dal suo numero di intestazione IP (6 invece di 4) ma piuttosto dal numero di protocollo di trasporto di livello 2. Pertanto ogni protocollo di trasporto che non usa tale numero di protocollo, non può inviare pacchetti IPv6. Nota: il pacchetto viene comunque trasportato sul collegamento, ma dal lato ricevente il recapito non funziona (come si può vedere, per esempio, con tcpdump). _________________________________________________________________ 4.1.4.1. Collegamenti che non saranno mai "idonei IPv6" * Serial Line IP (SLIP, RFC 1055 / SLIP), attualmente dovrebbe essere più correttamente detto SLIPv4, dispositivo chiamato: slX * Parallel Line IP (PLIP), simile a SLIP, nome del dispositivo: plipX * ISDN con incapsulazione rawip, nome del dispositivo: isdnX _________________________________________________________________ 4.1.4.2. Collegamenti attualmente conosciuti come "idonei IPv6 ma non supportati" * ISDN con incapsulazione syncppp, nome del dispositivo: ipppX (edizione di progetto dell'ipppd, sarà assorbito nel più generale livello PPP nel kernel serie 2.5.x). _________________________________________________________________ 4.2. Strumenti di configurazione di rete pronti per IPv6 Anche se si sta usando un kernel con IPv6, non si andrà molto lontano se non si hanno strumenti per la configurazione. Esistono diversi pacchetti che possono farlo. _________________________________________________________________ 4.2.1. Pacchetto net-tools Il pacchetto net-tools include alcuni strumenti come ifconfig e route, che permettono di configurare IPv6 su di un interfaccia. Si guardi all'output di ifconfig -? o route -?, se viene mostrato qualcosa come IPv6 o inet6 allora il programma è predisposto IPv6. Il controllo per ifconfig può essere effettuato tramite: # /sbin/ifconfig -? 2>& 1|grep -qw 'inet6' && echo "utility 'ifconfig' is IPv6- ready" Analogamente per route: # /sbin/route -? 2>& 1|grep -qw 'inet6' && echo "utility 'route' is IPv6-ready" _________________________________________________________________ 4.2.2. Pacchetto iproute Alexey N. Kuznetsov (attualmente un manutentore del codice di networking di Linux) ha creato un set di strumenti che configurano la rete attraverso il dispositivo netlink. Usando questi strumenti si hanno maggiori funzionalità rispetto a quelle fornite da net-tools ma non sono documentati granché e non sono indicati per i deboli di cuore. # /sbin/ip 2>&1 |grep -qw 'inet6' && echo "utility 'ip' is IPv6-ready" Se il programma /sbin/ip non viene trovato, si raccomanda caldamente di installare iproute. * Lo si può prendere dalla propria distribuzione Linux (se lo contiene) * Si può scaricare il tar-ball e ricompilarlo: Sorgente originale FTP e mirror (mancante) * È possibile cercare il pacchetto RPM appropriato presso RPMfind/iproute (talvolta è raccomandata la ricompilazione del pacchetto SRPMS) _________________________________________________________________ 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 # ping6 # ping6 [-I ] 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: * icmp6: filtra il traffico nativo ICMPv6 * ip6: filtra il traffico nativo IPv6 (ICMPv6 incluso) * proto ipv6: filtra il traffico tunnel IPv6-in-IPv4 * not port ssh: sopprime la visualizzazione dei pacchetti SSH durante l'esecuzione di tcpdump in una sessione SSH remota 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: * "-s 512": aumenta la lunghezza della cattura di un pacchetto a 512 byte * "-vv": output veramente verboso * "-n": non fa la risoluzione dei nomi (indirizzo->nome), utile se la risoluzione DNS inversa non funziona bene _________________________________________________________________ 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) _________________________________________________________________ 4.4. Programmi pronti per IPv6 Le attuali distribuzioni già contengono i più importanti client e server abilitati per IPv6. Si veda prima di tutto su IPv6+Linux-Status-Distribution. Si può anche vedere IPv6 &Linux - Stato attuale - Applicazioni per controllare se il programma di interesse è già stato portato a IPv6 ed è utilizzabile con Linux. Per i programmi di uso comune ci sono alcuni suggerimenti disponibili presso IPv6 &Linux - HowTo - Part 3 e IPv6 &Linux - HowTo - Part 4. _________________________________________________________________ 4.5. Programmi client pronti per IPv6 (selezione) Per far girare i test mostrati di seguito, è necessario che il sistema sia abilitato per IPv6 ed alcuni esempi mostrano indirizzi che sono raggiungibili solo se è disponibile una connessione al 6bone. _________________________________________________________________ 4.5.1. Controllare il DNS per risolvere indirizzi IPv6 A causa di aggiornamenti di sicurezza negli ultimi anni, ogni server Domain Name System (DNS) deve far girare software più recente che è in grado di gestire l'indirizzamento (intermedio) IPv6 di tipo AAAA (il più recente, chiamato A6 non è ancora di uso comune al momento poiché è supportato solo a partire da BIND9 o superiori e il supporto del dominio radice IP6.ARPA non esiste). Un semplice test per vedere se il sistema utilizzato può risolvere indirizzi IPV6 è # host -t AAAA www.join.uni-muenster.de e dovrebbe mostrare qualcosa del tipo: www.join.uni-muenster.de. is an alias for ns.join.uni-muenster.de. ns.join.uni-muenster.de. has AAAA address 3ffe:400:10:100:201:2ff:feb5:3806 _________________________________________________________________ 4.5.2. Client telnet pronti per IPv6 Client telnet per IPv6 sono disponibili. Un semplice test può essere fatto con $ telnet 3ffe:400:100::1 80 Trying 3ffe:400:100::1... Connected to 3ffe:400:100::1. Escape character is '^]'. HEAD / HTTP/1.0 HTTP/1.1 200 OK Date: Sun, 16 Dec 2001 16:07:21 GMT Server: Apache/2.0.28 (Unix) Last-Modified: Wed, 01 Aug 2001 21:34:42 GMT ETag: "3f02-a4d-b1b3e080" Accept-Ranges: bytes Content-Length: 2637 Connection: close Content-Type: text/html; charset=ISO-8859-1 Connection closed by foreign host. Se il client non gestisce l'indirizzo IPv6 e visualizza qualcosa del tipo "cannot resolve hostname" allora non è abilitato per IPv6. _________________________________________________________________ 4.5.3. Client ssh per IPv6 4.5.3.1. openssh Le attuali versioni di openssh sono abilitate per IPv6. A seconda della configurazione pre-compilazione ci sono due comportamenti. * --without-ipv4-default: il client tenta prima automaticamente una connessione IPv6 e se non funziona prova con IPv4 * --with-ipv4-default: la connessione di default è IPv4, la connessione IPv6 deve essere forzata come mostra il seguente esempio $ ssh -6 ::1 user@::1's password: ****** [user@ipv6host user]$ Se il client non accetta l'opzione "-6" allora non è abilitato per IPv6, come la maggior parte dei pacchetti ssh versione 1. _________________________________________________________________ 4.5.3.2. ssh.com Anche il client e il server SSH di SSH.com sono predisposti per IPv6 e sono gratutiti per tutte le macchine Linux e FreeBSD indifferentemente per uso personale o commerciale. _________________________________________________________________ 4.5.4. Browser web per IPv6 L'attuale stato dei browser web abilitati per IPv6 è reperibile presso IPv6+Linux-status-apps.html#HTTP. La maggior parte di questi hanno dei problemi che non sono stati ancora risolti 1. Se si usa un proxy impostato soltanto per IPv4, le richieste IPv6 verranno inviate ma il proxy non riuscirà a comprenderle e quindi si avrà un errore. Soluzione: aggiornare il software del proxy (si veda più avanti). 2. Le impostazioni automatiche per il proxy (*.pac) non possono essere estese per gestire le richieste IPv6 in modo diverso da IPv4 (per esempio non usare il proxy) a causa della loro natura (sono in Java-script e cablati nel sorgente, come si può vedere nel codice sorgente di Maxilla). Inoltre le vecchie versioni dei browser non sono in grado di interpretare le URL codificate con indirizzi IPv6 come http://[3ffe:400:100::1]/ (questa URL funziona solo con un browser abilitato per IPv6!). Un rapido test consiste nel provare l'URL sopra mostrata con il browser, senza utilizzare nessun proxy. _________________________________________________________________ 4.5.4.1. URL per provare Un buon punto di partenza per navigare con IPv6 è http://www.kame.net/. Se la tartaruga presente sulla pagina è animata, la connessione avviene tramite IPv6, altrimenti la tartaruga è immobile. _________________________________________________________________ 4.6. Programmi server IPv6 In questa parte dell'HOWTO sono menzionati problemi più specifici dei client. Quindi suggerimenti per i server abilitati per IPv6 come sshd, httpd, telnetd, ecc.. sono mostrati più avanti in Suggerimenti per demoni IPv6. _________________________________________________________________ 4.7. FAQ (verificare se il sistema è pronto per IPv6) 4.7.1. Utilizzo degli strumenti 4.7.1.1. D: Non riesco a fare ping6 a indirizzi link-local Messaggio di errore: "connect: Invalid argument" Il kernel non sa quale link fisico o virtuale si vuole usare per inviare pacchetti ICMPv6. Qindi viene visualizzato questo messaggio di errore. Soluzione: Specificare l'interfaccia: "ping6 -I eth0 fe80::2e0:18ff:fe90:9205", si veda anche utilizzo del programma ping6. _________________________________________________________________ 4.7.1.2. D: Non posso fare ping6 o traceroute6 come utente (non root) Messaggio di errore: "icmp socket: Operation not permitted" Questi strumenti creano particolari pacchetti ICMPv6 e li inviano. Ciò viene fatto utilizzando nel kernel i socket raw, però questi possono essere utilizzati solo dall'utente "root". Perciò gli utenti normali ottengono tali messaggi di errore. Soluzione: se è effettivamente necessario che tutti gli utenti possano usare questi strumenti, si può aggiungere il bit "suid" per mezzo del comando "chmod u+s /path/to/program", si veda anche utilizzo del programma ping6. Se non tutti gli utenti devono utilizzarli, si può cambiare il gruppo proprietario dei programmi, impostandolo per esempio a "wheel". Quindi si aggiungano gli utenti privilegiati a tale gruppo e si rimuova il bit di esecuzione per tutti gli altri utenti con il comando "chmod o-rwx /path/to/program". Oppure si può configurare "sudo" per abilitare la propria policy di sicurezza. _________________________________________________________________ Capitolo 5. Configurazione delle interfacce 5.1. I vari dispositivi di rete Su un nodo ci possono esssere differenti dispositivi di rete, che si possono raggruppare nlle seguenti classi * Fisici, come eth0, tr0 * Virtuali, come ppp0, tun0, tap0, sit0, isdn0, ippp0 _________________________________________________________________ 5.1.1. Dispositivi fisici Le interfacce fisiche come Ethernet o Token-Ring sono quelle classiche e non richiedono trattamenti particolari. _________________________________________________________________ 5.1.2. Dispositivi virtuali Le interfacce virtuali hanno sempre bisogno di un particolare supporto. _________________________________________________________________ 5.1.2.1. Interfacce tunnel IPv6-in-IPv4 Queste interfacce sono normalmente chiamate sitx. Il nome sit è un'abbreviazione per Simple Internet Transition. Questo tipo di dispositivo ha la capacità di incapsulare pacchetti IPv6 all'interno di pacchetti IPv4 e di inviarli all'estremo opposto di un tunnel. sit0 ha un significato speciale e non può essere usata per tunnel dedicati. _________________________________________________________________ 5.1.2.2. Interfacce PPP Le interfacce PPP prendono la loro capacità IPv6 da un demone PPP abilitato per IPv6. _________________________________________________________________ 5.1.2.3. Interfacce ISDN HDLC La capacità IPv6 per l'HDLC con incapsulamento IP è già inclusa nel kernel. _________________________________________________________________ 5.1.2.4. Interfacce ISDN PPP Le interfacce ISDN PPP (ippp) presenti nel kernel, non sono abilitate per IPv6. Inoltre l'abilitazione non è stata pianificata poiché nel kernel 2.5.+ esse saranno rimpiazzate da un più generico livello di interfaccia ppp. _________________________________________________________________ 5.1.2.5. SLIP + PLIP Come menzionato precedentemente, queste interfacce non supportano il trasporto IPv6 (l'invio è OK ma la consegna al destinatario non funziona). _________________________________________________________________ 5.1.2.6. Dispositivo ether-tap I dispositivi ether-tap sono abilitati per IPv6 ed inoltre supportano la configurazione stateless. Per il loro utilizzo è necessario il caricamento preventivo del modulo "ethertap". _________________________________________________________________ 5.1.2.7. Dispositivi tun Non ancora provati personalmente. _________________________________________________________________ 5.1.2.8. ATM 01/2002: Non sono attualmente supportati dai kernel vanilla, ma soltanto dalle estensioni USAGI. _________________________________________________________________ 5.1.2.9. Altre Ho per caso dimenticato qualche interfaccia?... _________________________________________________________________ 5.2. Attivazione/disattivazione delle interfacce Possono essere usati due metodi per attivare/disattivare le interfacce. _________________________________________________________________ 5.2.1. Uso di "ip" Utilizzo: # ip link set dev up # ip link set dev down Esempio: # ip link set dev eth0 up # ip link set dev eth0 down _________________________________________________________________ 5.2.2. Uso di "ifconfig" Utilizzo: # /sbin/ifconfig up # /sbin/ifconfig down Esempio: # /sbin/ifconfig eth0 up # /sbin/ifconfig eth0 down _________________________________________________________________ Capitolo 6. Configurazione degli indirizzi IPv6 Esistono vari modi per configurare un indirizzo IPv6 su di un'interfaccia. Si può usare "ifconfig" o "ip". _________________________________________________________________ 6.1. Visualizzare gli indirizzi IPv6 esistenti Prima di tutto si deve controllare se e quali indirizzi IPv6 sono già configurati (forse automaticamente durante una configurazione automatica stateless). _________________________________________________________________ 6.1.1. Uso di "ip" Utilizzo: # /sbin/ip -6 addr show dev Esempio per un host con configurazione statica: # /sbin/ip -6 addr show dev eth0 2: eth0: Esempio (l'output è stato filtrato con grep per mostrare solo gli indirizzi IPv6). Qui si possono vedere differenti indirizzi IPv6 con differenti scope. # /sbin/ifconfig eth0 |grep "inet6 addr:" inet6 addr: fe80::210:a4ff:fee3:9566/10 Scope:Link inet6 addr: 3ffe:ffff:0:f101::1/64 Scope:Global inet6 addr: fec0:0:0:f101::1/64 Scope:Site _________________________________________________________________ 6.2. Aggiungere un indirizzo IPv6 L'aggiunta di un indirizzo IPv6 è simile al meccanismo degli indirizzi "IP ALIAS" nelle interfacce Linux IPv4. _________________________________________________________________ 6.2.1. Uso di "ip" Utilizzo: # /sbin/ip -6 addr add / dev Esempio: # /sbin/ip -6 addr add 3ffe:ffff:0:f101::1/64 dev eth0 _________________________________________________________________ 6.2.2. Uso di "ifconfig" Utilizzo: # /sbin/ifconfig inet6 add / Esempio: # /sbin/ifconfig eth0 inet6 add 3ffe:ffff:0:f101::1/64 _________________________________________________________________ 6.3. Rimuovere un indirizzo IPv6 Spesso non è necessario. Si faccia attenzione con la rimozione di indirizzi IPv6 non esistenti: a volte, usando vecchi kernel, può risultarne un crash. _________________________________________________________________ 6.3.1. Uso di "ip" Utilizzo: # /sbin/ip -6 addr del / dev Esempio: # /sbin/ip -6 addr del 3ffe:ffff:0:f101::1/64 dev eth0 _________________________________________________________________ 6.3.2. Uso di "ifconfig" Utilizzo: # /sbin/ifconfig inet6 del / Esempio: # /sbin/ifconfig eth0 inet6 del 3ffe:ffff:0:f101::1/64 _________________________________________________________________ Capitolo 7. Configurazione di instradamenti IPv6 standard Se si vuole lasciare il proprio link ed inviare pacchetti nel vasto mondo di Internet IPv6, si ha bisogno dell'instradamento (routing). Se c'è già un router abilitato per IPv6 sul proprio link, è possibile aggiungere instradamenti IPv6. _________________________________________________________________ 7.1. Visualizzare gli instradamenti IPv6 esistenti Per prima cosa bisogna controllare quali e quanti indirizzi IPv6 sono già configurati (forse automaticamente durante la configurazione automatica). _________________________________________________________________ 7.1.1. Uso di "ip" Utilizzo: # /sbin/ip -6 route show [dev ] Esempio: # /sbin/ip -6 route show dev eth0 3ffe:ffff:0:f101::/64 proto kernel metric 256 mtu 1500 advmss 1440 fe80::/10 proto kernel metric 256 mtu 1500 advmss 1440 ff00::/8 proto kernel metric 256 mtu 1500 advmss 1440 default proto kernel metric 256 mtu 1500 advmss 1440 _________________________________________________________________ 7.1.2. Uso di "route" Utilizzo: # /sbin/route -A inet6 Esempio (l'otput è filtrato per l'interfaccia eth0). Qui si possono vedere differenti instradamenti IPv6 per i vari indirizzi su di una singola interfaccia. # /sbin/route -A inet6 |grep -w "eth0" 3ffe:ffff:0:f101 ::/64 :: UA 256 0 0 eth0 <- Instradamento di interfaccia glob al ¬ address fe80::/10 :: UA 256 0 0 eth0 <- Instradamento di interfaccia link -local ¬ address ff00::/8 :: UA 256 0 0 eth0 <- Instradamento di interfaccia all multicast ¬ addresses ::/0 :: UDA 256 0 0 eth0 <- Instradamento automatico di defau lt _________________________________________________________________ 7.2. Aggiungere un instradamento IPv6 attraverso un gateway Per lo più necessario per raggiungere l'esterno utilizzando un router abilitato IPv6 sul proprio link. _________________________________________________________________ 7.2.1. Uso di "ip" Utilizzo: # /sbin/ip -6 route add / via ¬ [dev ] Esempio: # /sbin/ip -6 route add 2000::/3 via 3ffe:ffff:0:f101::1 _________________________________________________________________ 7.2.2. Uso di "route" Utilizzo: # /sbin/route -A inet6 add / gw ¬ [dev ] Se l'indirizzo IPv6 è di tipo link-local può essere necessario specificare anche il dispositivo. L'esempio seguente mostra l'aggiunta di un instradamento per tutti gli indirizzi globali (2000::/3) attraverso il gateway 3ffe:ffff:0:f101::1 # /sbin/route -A inet6 add 2000::/3 gw 3ffe:ffff:0:f101::1 _________________________________________________________________ 7.3. Rimuovere un instradamento IPv6 attraverso un gateway Non capita spesso di farlo manualmente, la maggior parte delle volte viene fatto tramite script di configurazione in fase di arresto (del sistema o dell'interfaccia). _________________________________________________________________ 7.3.1. Uso di "ip" Utilizzo: # /sbin/ip -6 route del / via ¬ [dev ] Esempio: # /sbin/ip -6 route del 2000::/3 via 3ffe:ffff:0:f101::1 _________________________________________________________________ 7.3.2. Uso di "route" Utilizzo: # /sbin/route -A inet6 del / [dev ] Esempio per rimuovere l'instradamento precedentemente aggiunto: # /sbin/route -A inet6 del 2000::/3 gw 3ffe:ffff:0:f101::1 _________________________________________________________________ 7.4. Aggiungere un instradamento IPv6 attraverso un'interfaccia Molto spesso non è necessario. Talvolta può esserlo in caso di link punto-punto dedicati. _________________________________________________________________ 7.4.1. Uso di "ip" Utilizzo: # /sbin/ip -6 route add / dev ¬ metric 1 Esempio: # /sbin/ip -6 route add 2000::/3 dev eth0 metric 1 La metrica "1" è utilizzata per compatibilità con la metrica usata dal router, poiché la metrica di default, utilizzando "ip", è "1024". _________________________________________________________________ 7.4.2. Uso di "route" Utilizzo: # /sbin/route -A inet6 add / dev Esempio: # /sbin/route -A inet6 add 2000::/3 dev eth0 _________________________________________________________________ 7.5. Rimuovere un instradamento IPv6 attraverso un'interfaccia Molto spesso non è necessario effettuare tale operazione manualmente. È utilizzata negli script di configurazione in fase di shutdown. _________________________________________________________________ 7.5.1. Uso di "ip" Utilizzo: # /sbin/ip -6 route del / dev Esempio: # /sbin/ip -6 route del 2000::/3 dev eth0 _________________________________________________________________ 7.5.2. Uso di "route" Utilizzo: # /sbin/route -A inet6 del / dev Esempio: # /sbin/route -A inet6 del 2000::/3 dev eth0 _________________________________________________________________ 7.6. FAQ per gli instradamenti IPv6 7.6.1. Supporto di un instradamento IPv6 di default Un'idea di base di IPv6 è stato l'instradamento gerarchico, per cui c'è bisogno di meno voci di instradamento nei router. Esistono alcuni problemi nei kernel Linux attuali: _________________________________________________________________ 7.6.1.1. Client (non viene instradato nessun pacchetto!) Il client può configurare un instradamento di default come il prefisso "::/0", può anche acquisire tale instradamento tramite la configurazione automatica, per esempio utilizzando radvd sul link come mostra il seguente esempio: # ip -6 route show | grep ^default default via fe80::212:34ff:fe12:3450 dev eth0 proto kernel metric 1024 expires ¬ 29sec mtu 1500 advmss 1440 _________________________________________________________________ 7.6.1.2. I router nel caso di inoltro di pacchetti I convenzionali kernel Linux (almeno <= 2.4.17) non supportano gli instradamenti di default. Lo si può impostare, ma la ricerca dell'instradamento fallisce nel momento in cui il pacchetto dovrebbe essere inoltrato (normale funzionamento di un router). Perciò, al momento, il "default routing" può essere configurato soltanto utilizzando l'attuale prefisso global address "2000::/3". Il progetto USAGI già, per mezzo di un particolare accorgimento, è in grado di supportarlo nelle sue estensioni. Nota: sui router di confine si abbia cura di configurare il default routing senza il filtraggio degli indirizzi, altrimenti il traffico multicast o site-local non desiderato potrebbe venire inoltrato. _________________________________________________________________ Capitolo 8. Scoperta del vicinato (Neighbor Discovery) La scoperta del vicinato è il successore IPv6 dell'ARP (Address Resolution Protocol) di IPv4. Si possono recuperare informazioni sull'attuale vicinato ed in più si possono creare e cancellare voci. Il kernel tiene traccia dei vicini scoperti con successo (come l'ARP in IPv4). Si può indagare all'interno della tabella relativa ai vicini scoperti utilizzando "ip". _________________________________________________________________ 8.1. Visualizzare i vicini usando "ip" Con il seguente comando si possono visualizzare i vicini IPv6 memorizzati nell'apposita tabella (scoperti o impostati manualmente) # ip -6 neigh show [dev ] Il seguente esempio mostra un vicino, costituito da un router raggiungibile # ip -6 neigh show fe80::201:23ff:fe45:6789 dev eth0 lladdr 00:01:23:45:67:89 router nud reachable _________________________________________________________________ 8.2. Manipolare la tabella relativa ai vicini utilizzando "ip" 8.2.1. Aggiungere una voce manualmente Con il seguente comando si può aggiungere manualmente una voce: # ip -6 neigh add lladdr dev Esempio: # ip -6 neigh add fec0::1 lladdr 02:01:02:03:04:05 dev eth0 _________________________________________________________________ 8.2.2. Cancellare una voce manualmente Come si aggiunge, una voce si può anche cancellare: # ip -6 neigh del lladdr dev Esempio: # ip -6 neigh del fec0::1 lladdr 02:01:02:03:04:05 dev eth0 _________________________________________________________________ 8.2.3. Configurazioni più avanzate Lo strumento "ip" è poco documentato, ma molto potente. Si veda l'"help" on line per maggiori dettagli: # ip -6 neigh help Usage: ip neigh { add | del | change | replace } { ADDR [ lladdr LLADDR ] [ nud { permanent | noarp | stale | reachable } ] | proxy ADDR } [ dev DEV ] ip neigh {show|flush} [ to PREFIX ] [ dev DEV ] [ nud STATE ] Sembra che alcune opzioni siano solo per IPv4... se potete contribuire con informazioni sui flag e l'uso avanzato, siete pregati di inviarmele. _________________________________________________________________ Capitolo 9. Configurare tunnel IPv6-in-IPv4 Se si vuole uscire dal proprio link e non si hanno reti IPv6 nei dintorni, si necessita del tunneling IPv6-in-IPv4 per raggiungere l'intero mondo Internet-IPv6. Ci sono alcuni tipi di meccanismi di tunnel ed alcune possibilità per configurarli. _________________________________________________________________ 9.1. Tipi di tunnel Esiste più di una possibilità per inviare pacchetti IPv6 su link IPv4. _________________________________________________________________ 9.1.1. Tunneling statico punto-punto: 6bone Questo è un tipo di tunnel dedicato verso un estremo esterno, il quale è a conoscenza della vostra rete IPv6 (per l'instradamento di ritorno) e dell'indirizzo IPv4 del vostro estremo del tunnel come definito in RFC 2893 / Transition Mechanisms for IPv6 Hosts and Routers. Requisiti: * L'indirizzo IPv4 del proprio estremo del tunnel deve essere statico, globalmente unico (pubblico) e raggiungibile dall'altro estremo (esterno) del tunnel * Si deve avere un prefisso globale IPv6 assegnato (si veda il 6bone registry) * L'estremo esterno di un tunnel deve essere in grado di instradare il vostro prefisso IPv6 al vostro estremo del tunnel (il più delle volte è richiesta una configurazione manuale sull'estremo esterno) _________________________________________________________________ 9.1.2. Tunneling automatico Il tunneling automatico avviene quando un nodo si connette direttamente ad un altro nodo dopo averne prima ottenuto il relativo indirizzo IPv4. _________________________________________________________________ 9.1.3. Tunneling 6to4 Il tunneling 6to4 (RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds) utilizza un semplice meccanismo per creare un tunnel in maniera automatica. Ogni nodo con un indirizzo IPv4 globalmente unico, può essere un estremo di un tunnel 6to4 (se nessu firewall IPv4 ne vieta il traffico). Il tunneling 6to4 non è generalmente uno-a-uno. Questo caso di tunneling può essere suddiviso in upstream e downstream. Inoltre, uno speciale indirizzo IPv6 indica che il nodo in questione utilizza il tunneling 6to4 per connettersi alla rete IPv6 pubblica. _________________________________________________________________ 9.1.3.1. Generazione di un prefisso 6to4 L'indirizzo 6to4 viene definito dal seguente schema (preso da RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds): | 3+13 | 32 | 16 | 64 bits | +---+------+-----------+--------+--------------------------------+ | FP+TLA | V4ADDR | SLA ID | Interface ID | | 0x2002 | | | | +---+------+-----------+--------+--------------------------------+ Il campo formato da FP e TLA (16 bit) ha il valore 0x2002. V4ADDR è l'indirizzo IPv4 globalmente unico del nodo (in notazione esadecimale). SLA ID è l'identificatore della sottorete (65536 sottoreti locali possibili) ed è utilizzabile per rappresentare la propria struttura di rete locale. Per i gateway questo prefisso viene generato normalmente usando uno SLA ID "0000" ed il suffisso "::1" (non è un obbligo, può essere anche di tipo arbitrario con ambito di applicazione locale) quindi l'indirizzo viene assegnato all'interfaccia del tunnel 6to4. Da notare che Microsoft Windows utilizza anche V4ADDR per il suffisso. _________________________________________________________________ 9.1.3.2. Tunneling upstream 6to4 Il nodo deve sapere a quale estremo esterno del tunnel devono essere inviati i suoi pacchetti IPv6 incapsulati in IPv4. Nei "primi" giorni del tunneling 6to4, vennero definiti dei router dedicati in grado di accettare upstream, si veda informazioni 6to4 di NSayer per un elenco dei router. Oggigiorno, i router upstream possono essere trovati automaticamente, utilizzando l'indirizzo anycast 192.88.99.1. Dietro le quinte, i protocolli di routing sono in grado di gestire tale meccanismo, si veda RFC 3068 / An Anycast Prefix for 6to4 Relay Routers per i dettagli. _________________________________________________________________ 9.1.3.3. Tunneling downstream 6to4 Il downstream (da 6bone -> il proprio nodo abilitato 6to4) non è esattamente fissato e può variare dipendentemente dall'host esterno al quale i pacchetti vengono inviati. Esistono due possibilità: * L'host esterno usa il 6to4 e rispedisce indietro i pacchetti direttamente al vostro nodo (si veda in basso) * L'host esterno rispedisce indietro i pacchetti verso la rete pubblica IPv6 dipendentemente dall'instradamento dinamico, un relay router crea un tunnel automatico verso il vostro nodo. _________________________________________________________________ 9.1.3.4. Possibile traffico 6to4 * da 6to4 a 6to4: è di solito in un tunnel diretto tra i due host abilitati al 6to4 * da 6to4 ad un non 6to4: è inviato tramite tunneling upstream * da non 6to4 a 6to4: è inviato tramite tunneling downstream _________________________________________________________________ 9.2. Visualizzare i tunnel esistenti 9.2.1. Uso di "ip" Utilizzo: # /sbin/ip -6 tunnel show [] Esempio: # /sbin/ip -6 tunnel show sit0: ipv6/ip remote any local any ttl 64 nopmtudisc sit1: ipv6/ip remote 195.226.187.50 local any ttl 64 _________________________________________________________________ 9.2.2. Uso di "route" Utilizzo: # /sbin/route -A inet6 Esempio (l'output è stato filtrato per mostrare solo i tunnel attraverso l'interfaccia virtuale sit0): # /sbin/route -A inet6 | grep "\Wsit0\W*$" ::/96 :: U 256 2 0 sit0 2002::/16 :: UA 256 0 0 sit0 2000::/3 ::193.113.58.75 UG 1 0 0 sit0 fe80::/10 :: UA 256 0 0 sit0 ff00::/8 :: UA 256 0 0 sit0 _________________________________________________________________ 9.3. Configurazione di un tunnel punto-punto Ci sono 3 possibilità per aggiungere o rimuovere un tunnel punto-punto. Una buona fonte di informazioni aggiuntive sulla configurazione di tunnel con "ip" è Configurare i tunnel con iproute2 (articolo) (Mirror). _________________________________________________________________ 9.3.1. Aggiungere un tunnel punto-punto 9.3.1.1. Uso di "ip" Un metodo comune, attualmente utilizzato per minime quantità di tunnel. Utilizzo per creare un device tunnel (deve essere specificato anche un TTL poiché il valore di default è 0). # /sbin/ip tunnel add mode sit ttl remote ¬ local Utilizzo (esempio generico per tre tunnel): # /sbin/ip tunnel add sit1 mode sit ttl remote ¬ local # /sbin/ip link set dev sit1 up # /sbin/ip -6 route add dev sit1 metric 1 # /sbin/ip tunnel add sit2 mode sit ttl ¬ local # /sbin/ip link set dev sit2 up # /sbin/ip -6 route add dev sit2 metric 1 # /sbin/ip tunnel add sit3 mode sit ttl ¬ local # /sbin/ip link set dev sit3 up # /sbin/ip -6 route add dev sit3 metric 1 _________________________________________________________________ 9.3.1.2. Uso di "ifconfig" e "route" (disapprovato) Questo non è un sistema molto raccomandato per aggiungere un tunnel, poiché è un po' strano. Nessun problema se se ne aggiunge soltanto uno, ma volendone configurare più di uno, è piuttosto difficile chiudere il primo lasciando funzionare gli altri. Utilizzo (esempio generico per tre tunnel): # /sbin/ifconfig sit0 up # /sbin/ifconfig sit0 tunnel # /sbin/ifconfig sit1 up # /sbin/route -A inet6 add dev sit1 # /sbin/ifconfig sit0 tunnel # /sbin/ifconfig sit2 up # /sbin/route -A inet6 add dev sit2 # /sbin/ifconfig sit0 tunnel # /sbin/ifconfig sit3 up # /sbin/route -A inet6 add dev sit3 Importante: NON USARE QUESTO SISTEMA, poiché questa configurazione abilita implicitamente il "tunneling automatico" da qualunque macchina collegata ad Internet, ciò rappresenta un rischio, e non dovrebbe essere permesso. _________________________________________________________________ 9.3.1.3. Uso del solo "route" È anche possibile configurare tunnel con lo stile Non Broadcast Multiple Access (NBMA), un modo facile per aggiungere più tunnel contemporaneamente, ma nessuno dei tunnel può essere numerato (caratteristica non richiesta). Utilizzo (esempio generico per tre tunnel): # /sbin/ifconfig sit0 up # /sbin/route -A inet6 add gw ¬ :: dev sit0 # /sbin/route -A inet6 add gw ¬ :: dev sit0 # /sbin/route -A inet6 add gw ¬ :: dev sit0 Importante: NON USARE QUESTO SISTEMA, poiché questa configurazione abilita implicitamente il "tunneling automatico" da qualunque macchina connessa ad Internet, ciò rappresenta un rischio, e non dovrebbe essere permesso. _________________________________________________________________ 9.3.2. Rimozione di tunnel punto-punto Generalmente non è così necessario farlo manualmente, ma viene utilizzato negli script per lo shutdown pulito o il restart della configurazione IPv6. _________________________________________________________________ 9.3.2.1. Uso di "ip" Utilizzo per la rimozione di un device tunnel: # /sbin/ip tunnel del Utilizzo (esempio generico per tre tunnel): # /sbin/ip -6 route del dev sit1 # /sbin/ip link set sit1 down # /sbin/ip tunnel del sit1 # /sbin/ip -6 route del dev sit2 # /sbin/ip link set sit2 down # /sbin/ip tunnel del sit2 # /sbin/ip -6 route del dev sit3 # /sbin/ip link set sit3 down # /sbin/ip tunnel del sit3 _________________________________________________________________ 9.3.2.2. Uso di "ifconfig" e "route" (disapprovato poiché non molto simpatico) Non solo è strana la creazione ma anche lo shutdown... bisogna rimuovere i tunnel in ordine inverso, cioè l'ultimo creato và rimosso per primo. Utilizzo (esempio generico per 3 tunnel): # /sbin/route -A inet6 del dev sit3 # /sbin/ifconfig sit3 down # /sbin/route -A inet6 del dev sit2 # /sbin/ifconfig sit2 down # /sbin/route -A inet6 del dev sit1 # /sbin/ifconfig sit1 down # /sbin/ifconfig sit0 down _________________________________________________________________ 9.3.2.3. Uso di "route" È come la normale rimozione di instradamenti IPv6. Utilizzo (esempio generico per tre tunnel): # /sbin/route -A inet6 del gw ¬ :: dev sit0 # /sbin/route -A inet6 del gw ¬ :: dev sit0 # /sbin/route -A inet6 del gw ¬ :: dev sit0 # /sbin/ifconfig sit0 down _________________________________________________________________ 9.3.3. Tunnel punto-punto numerati A volte si rende necessario configurare un tunnel punto-punto con indirizzi IPv6 come si fa attualmente in IPv4. Ciò è possibile soltanto con il primo metodo di configurazione del tunnel (ifconfig+route - disapprovato) e con il terzo (ip+route). In questi casi si può aggiungere l'indirizzo IPv6 all'interfaccia del tunnel, come mostrato nella configurazione dell'interfaccia. _________________________________________________________________ 9.4. Configurazione di tunnel 6to4 Si faccia attenzione al fatto che il supporto per i tunnel 6to4 non è presente sui kernel vanilla della serie 2.2.x (si veda Controllo del sistema/kernel per maggiori informazioni). Si noti anche che la lunghezza del prefisso per un indirizzo 6to4 è 16 poiché da un punto di vista della rete, tutti gli host abilitati 6to4 sono sullo stesso livello 2. _________________________________________________________________ 9.4.1. Aggiugere un tunnel 6to4 Prima di tutto si deve calcolare il proprio prefisso 6to4, usando il proprio indirizzo locale IPv4 instradabile (pubblico) (se l'host non ha questo indirizzo IPv4 pubblico, in casi speciali è possibile fare il NAT sui gateway di confine): Assumendo che il proprio indirizzo IPv4 sia 1.2.3.4 il prefisso 6to4 generato sarà 2002:0102:0304:: I gateway 6to4 locali dovrebbero sempre avere il suffisso "::1", perciò il proprio indirizzo locale 6to4 sarà 2002:0102:0304::1 Si usi per esempio il seguente comando per la generazione automatica: ipv4="1.2.3.4"; printf "2002:%02x%02x:%02x%02x::1" `echo $ipv4 | tr "." " "` Attualmente ci sono due modi per configurare un tunneling 6to4. _________________________________________________________________ 9.4.1.1. Uso di "ip" e di un dispositivo tunnel dedicato Questo è attualmente il modo raccomandato (deve essere specificato un TTL poiché il valore di default è 0). Creare un nuovo dispositivo tunnel # /sbin/ip tunnel add tun6to4 mode sit ttl remote any local Attivare l'interfaccia # /sbin/ip link set dev tun6to4 up Aggiungere un indirizzo locale 6to4 all'interfaccia (nota: è importante la lunghezza 16 del prefisso!) # /sbin/ip -6 addr add /16 dev tun6to4 Aggiungere un instradamento (di default) alla rete IPv6 globale utilizzando gli indirizzi anycast IPv4 all-6to4-routers # /sbin/ip -6 route add 2000::/3 via ::192.88.99.1 dev tun6to4 metric 1 È stato segnalato che alcune versioni di "ip" (per es. SuSE Linux 9.0) non supportano come gateway indirizzi IPv6 compatibili IPv4, in questo caso deve essere usato il relativo indirizzo IPv6: # /sbin/ip -6 route add 2000::/3 via 2002:c058:6301::1 dev tun6to4 metric 1 _________________________________________________________________ 9.4.1.2. Uso di "ifconfig" e "route" e di un generico dispositivo tunnel "sit0" (disapprovato) Questo è disapprovato poiché l'uso del dispositivo tunnel generico sit0 non permette di specificare il filtraggio per dispositivo. Attivare l'interfaccia generica tunnel sit0 # /sbin/ifconfig sit0 up Aggiungere l'indirizzo locale 6to4 all'interfaccia # /sbin/ifconfig sit0 add /16 Aggiungere l'instradamento (di default) alla rete IPv6 globale utilizzando l'indirizzo IPv4 anycast all-6to4-relays # /sbin/route -A inet6 add 2000::/3 gw ::192.88.99.1 dev sit0 _________________________________________________________________ 9.4.2. Rimuovere un tunnel 6to4 9.4.2.1. Uso di "ip" e di un dispositivo tunnel dedicato Rimuovere tutti gli instradamenti attraverso questo dispositivo tunnel dedicato # /sbin/ip -6 route flush dev tun6to4 Disabilitare l'interfaccia # /sbin/ip link set dev tun6to4 down Rimuovere il dispositivo tunnel creato # /sbin/ip tunnel del tun6to4 _________________________________________________________________ 9.4.2.2. Uso di "ifconfig" e "route" ed un dispositivo tunnel generico "sit0" (disapprovato) Rimuovere l'instradamento (di default) attraverso l'interfaccia del tunnel 6to4 # /sbin/route -A inet6 del 2000::/3 gw ::192.88.99.1 dev sit0 Rimuovere l'indirizzo locale 6to4 dall'interfaccia # /sbin/ifconfig sit0 del /16 Disabilitare il dispositivo tunnel generico (si faccia attenzione a questo, potrebbe essere ancora in uso...) # /sbin/ifconfig sit0 down _________________________________________________________________ Capitolo 10. Configurare tunnel IPv4-in-IPv6 Sarà riempito in futuro. Per il momento, questi tunnel sono principalmente usati in ambienti di test ma sembra che attualmente manchi il supporto per Linux (03/2004). Nel frattempo per maggiori informazioni: RFC 2473 / Generic Packet Tunneling in IPv6 Specification. _________________________________________________________________ Capitolo 11. Impostazioni del kernel nel filesystem /proc Nota: l'origine di questa sezione è essenzialmente il file "ip-sysctl.txt" che è incluso negli attuali sorgenti del kernel nella directory "Documentation/networking". Ringraziamenti a Pekka Savola per il mantenimento della parte relativa a IPv6 in questo file. Inoltre è stato fatto un parziale copia &incolla del testo in questo documento. _________________________________________________________________ 11.1. Come accedere al filesystem /proc 11.1.1. Uso di "cat" e "echo" L'utilizzo di "cat" e "echo" è il modo più semplice per accedere al filesystem /proc, sono richiesti però anche alcuni requisiti * Il filesystem /proc deve essere abilitato nel kernel, significa cioè che durante la compilazione deve essere selezionata la seguente opzione CONFIG_PROC_FS=y * Il filesistem /proc deve essere prima montato e ciò può essere verificato utilizzando # mount | grep "type proc" none on /proc type proc (rw) * Si necessita del permesso di lettura ed a volte anche di scrittura (di solito solo root) al filesystem /proc Di solito, solo le voci in /proc/sys/* sono scrivibili, le altre sono in lettura e servono solo per il recupero di informazioni. _________________________________________________________________ 11.1.1.1. Recuperare un valore Il valore di una voce può essere recuperato utilizzando "cat": # cat /proc/sys/net/ipv6/conf/all/forwarding 0 _________________________________________________________________ 11.1.1.2. Impostazione di un valore Un nuovo valore può essere impostato (se la relativa voce è scrivibile) utilizzando "echo": # echo "1" >/proc/sys/net/ipv6/conf/all/forwarding _________________________________________________________________ 11.1.2. Uso di "sysctl" L'utilizzo del programma "sysctl" è un metodo moderno per accedere agli switch del kernel. Si può usare anche nel caso in cui il filesystem /proc non sia montato. Si ha però accesso solo a /proc/sys/*! Il programma "sysctl" è incluso nel pacchetto "procps" (su sistemi Red Hat Linux). * L'interfaccia sysctl deve essere abilitata nel kernel, in fase di compilazione deve cioè essere selezionata l'opzione seguente CONFIG_SYSCTL=y _________________________________________________________________ 11.1.2.1. Recupero di un valore Il valore di una voce può essere recuperato con: # sysctl net.ipv6.conf.all.forwarding net.ipv6.conf.all.forwarding = 0 _________________________________________________________________ 11.1.2.2. Impostazione di un valore Un nuovo valore può essere impostato (se la relativa voce è scrivibile) con: # sysctl -w net.ipv6.conf.all.forwarding=1 net.ipv6.conf.all.forwarding = 1 Nota: Non usare spazi prima e dopo del segno "=" quando si impostano valori. Inoltre, nel caso di valori multipli sulla stessa riga è necessario racchiuderli tra virgolette, come per esempio # sysctl -w net.ipv4.ip_local_port_range="32768 61000" net.ipv4.ip_local_port_range = 32768 61000 _________________________________________________________________ 11.1.2.3. Supplementi Nota: in giro ci sono versioni di sysctl che visualizzano "/" invece di "." Per maggiori dettagli si dia un'occhiata alla pagina man di sysctl. Suggerimento: per cercare velocemente nelle impostazioni, utilizzare l'opzione "-a" (mostra tutte le voci) assieme a "grep". _________________________________________________________________ 11.1.3. Valori trovati nel filesystem /proc Esistono vari formati (tipi di dati) dei valori nel filesystem /proc: * BOOLEANO: semplicemente uno "0" (falso) o un "1" (vero) * INTERO: un valore intero che può anche essere senza segno (unsigned) * righe più sofisticate, con diversi valori: a volte viene anche visualizzata una riga di intestazione, in caso contrario si dia uno sguardo ai sorgenti del kernel per avere informazioni sul significato di ogni valore... _________________________________________________________________ 11.2. Voci in /proc/sys/net/ipv6/ 11.2.1. conf/default/* Cambia le impostazioni di default specifiche di un'interfaccia. _________________________________________________________________ 11.2.2. conf/all/* Cambia tutte le impostazioni specifiche di un'interfaccia. Un'eccezione: "conf/all/forwarding" ha un significato diverso. _________________________________________________________________ 11.2.2.1. conf/all/forwarding * Tipo: BOOLEANO Questo abilita l'inoltro globale IPv6 tra tutte le interfacce. Con IPv6 non si può controllare l'inoltro per dispositivo, ma comunque tale controllo può essere effettuato utilizzando il set di regole netfilter-IPv6 (controllato con ip6tables) e specificando i dispositivi di input e di output (si veda Firewalling/Netfilter6 per maggiori dettagli). In IPv4 ciò è gestito in maniera diversa poiché si può controllare l'inoltro per dispositivo (la decisione viene presa sull'interfaccia dove il pacchetto arriva). Inoltre configura tutte le impostazioni 'inoltro' Host/Router dell'interfaccia col valore specificato. Si veda successivamente per i dettagli. Ci si referisce a questo come inoltro globale (global forwarding). Se questo valore è 0, l'inoltro IPv6 non è abilitato: i pacchetti non lasceranno mai un'interfaccia, né fisica né logica, come per esempio i tunnel. _________________________________________________________________ 11.2.3. conf/interface/* Cambia le impostazioni particolari per interfaccia. Il comportamento per certe impostazioni è diverso a seconda se l'inoltro locale è abilitato o meno. _________________________________________________________________ 11.2.3.1. accept_ra * Tipo: BOOLEANO * Funzionalità di default: abilitato se l'inoltro locale è disabilitato. Disabilitato in caso contrario. Accetta gli avvisi router (Router Advertisements) e configura automaticamente l'interfaccia con i dati ricevuti. _________________________________________________________________ 11.2.3.2. accept_redirects * Tipo: BOOLEANO * Funzionalità di default: abilitato se l'inoltro locale è disabilitato. Disabilitato in caso contrario. Accetta i redirect inviati da un router IPv6. _________________________________________________________________ 11.2.3.3. autoconf * Tipo: BOOLEANO * Default: VERO Configura indirizzi link-local (si veda anche Tipi di indirizzo) usando indirizzi hardware di livello 2 (L2). Per esempio questo genera automaticamente un indirizzo come "fe80::201:23ff:fe45:6789" su di un'interfaccia con un indirizzo L2-MAC. _________________________________________________________________ 11.2.3.4. dad_transmits * Tipo: INTERO * Default: 1 Il numero totale di segnali di tipo Duplicate Address Detection da inviare. _________________________________________________________________ 11.2.3.5. forwarding * Tipo: BOOLEANO * Default: FALSO se l'inoltro globale è disabilitato (default), altrimenti VERO Configura il comportamento da Host/Router specifico per interfaccia. Nota: Si raccomanda di impostare la stessa configurazione su tutte le interfacce; gli scenari misti router/host sono piuttosto insoliti. * Valore FALSO: Per default, viene assunto il comportamento Host. Questo significa: 1. Il flag IsRouter non è impostato negli avvisi di vicinato (Neighbour Advertisements). 2. Le sollecitazioni router (Router Solicitation) vengono inviate quando necessario. 3. Se accept_ra è VERO (default), vengono accettati gli avvisi router (e viene fatta la configurazione automatica). 4. Se accept_redirects è VERO (default), vengono accettati i redirect. * Valore VERO: Se l'inoltro locale è abilitato, viene assunto il comportamento come router. Questo significa esattamente l'inverso rispetto a quanto detto prima: 1. Il flag IsRouter è impostato negli avvisi di vicinato. 2. Le sollecitazioni router non vengono inviate. 3. Gli avvisi router vengono ignorati. 4. I redirect vengono ignorati. _________________________________________________________________ 11.2.3.6. hop_limit * Tipo: INTERO * Default: 64 Il limite massimo di salti (hop) di default. _________________________________________________________________ 11.2.3.7. mtu * Tipo: INTERO * Default: 1280 (minimo richiesto per IPv6) La Maximum Transfer Unit di default. _________________________________________________________________ 11.2.3.8. router_solicitation_delay * Tipo: INTERO * Default: 1 Secondi da attendere dopo l'attivazione dell'interfaccia prima di inviare sollecitazioni router. _________________________________________________________________ 11.2.3.9. router_solicitation_interval * Tipo: INTERO * Default: 4 Secondi di attesa tra una sollecitazione router e la successiva. _________________________________________________________________ 11.2.3.10. router_solicitations * Tipo: INTERO * Default: 3 Numero di sollecitazioni router da inviare prima di desumere l'assenza di router. _________________________________________________________________ 11.2.4. neigh/default/* Cambia le impostazioni di default per la rilevazione di vicinato per alcuni speciali intervalli globali e valori di soglia: _________________________________________________________________ 11.2.4.1. gc_thresh1 * Tipo: INTERO * Default: 128 Da completare con maggiori dettagli. _________________________________________________________________ 11.2.4.2. gc_thresh2 * Tipo: INTERO * Default: 512 Da completare con maggiori dettagli. _________________________________________________________________ 11.2.4.3. gc_thresh3 * Tipo: INTERO * Default: 1024 Parametro per impostare la dimensione della tabella relativa ai vicini. Si aumenti questo valore nel caso in cui si abbiano molte interfacce e problemi con gli instradamenti che cominciano a funzionare ed a fallire misteriosamente, oppure nel caso che facendo funzionare lo Zebra (demone di routing) si abbia: ZEBRA: netlink-listen error: No buffer space available, type=RTM_NEWROUTE(24), seq=426, pid=0 _________________________________________________________________ 11.2.4.4. gc_interval * Tipo: INTERO * Default: 30 Da completare con maggiori dettagli. _________________________________________________________________ 11.2.5. neigh/interface/* Cambia delle impostazioni particolari, per interfaccia, per la rilevazione del vicinato. _________________________________________________________________ 11.2.5.1. anycast_delay * Tipo: INTERO * Default: 100 Da completare con maggiori dettagli. _________________________________________________________________ 11.2.5.2. gc_stale_time * Tipo: INTERO * Default: 60 Da completare con maggiori dettagli. _________________________________________________________________ 11.2.5.3. proxy_qlen * Tipo: INTERO * Default: 64 Da completare con maggiori dettagli. _________________________________________________________________ 11.2.5.4. unres_qlen * Tipo: INTERO * Default: 3 Da completare con maggiori dettagli. _________________________________________________________________ 11.2.5.5. app_solicit * Tipo: INTERO * Default: 0 Da completare con maggiori dettagli. _________________________________________________________________ 11.2.5.6. locktime * Tipo: INTERO * Default: 0 Da completare con maggiori dettagli. _________________________________________________________________ 11.2.5.7. retrans_time * Tipo: INTERO * Default: 100 Da completare con maggiori dettagli. _________________________________________________________________ 11.2.5.8. base_reachable_time * Tipo: INTERO * Default: 30 Da completare con maggiori dettagli. _________________________________________________________________ 11.2.5.9. mcast_solicit * Tipo: INTERO * Default: 3 Da completare con maggiori dettagli. _________________________________________________________________ 11.2.5.10. ucast_solicit * Tipo: INTERO * Default: 3 Da completare con maggiori dettagli. _________________________________________________________________ 11.2.5.11. delay_first_probe_time * Tipo: INTERO * Default: 5 Da completare con maggiori dettagli. _________________________________________________________________ 11.2.5.12. proxy_delay * Tipo: INTERO * Default: 80 Da completare con maggiori dettagli. _________________________________________________________________ 11.2.6. route/* Cambia le impostazioni globali per l'instradamento. _________________________________________________________________ 11.2.6.1. flush Rimosso dalle recenti release del kernel - da completare con maggiori dettagli. _________________________________________________________________ 11.2.6.2. gc_interval * Tipo: INTERO * Default: 30 Da completare con maggiori dettagli. _________________________________________________________________ 11.2.6.3. gc_thresh * Tipo: INTERO * Default: 1024 Da completare con maggiori dettagli. _________________________________________________________________ 11.2.6.4. mtu_expires * Tipo: INTERO * Default: 600 Da completare con maggiori dettagli. _________________________________________________________________ 11.2.6.5. gc_elasticity * Tipo: INTERO * Default: 0 Da completare con maggiori dettagli. _________________________________________________________________ 11.2.6.6. gc_min_interval * Tipo: INTERO * Default: 5 Da completare con maggiori dettagli. _________________________________________________________________ 11.2.6.7. gc_timeout * Tipo: INTERO * Default: 60 Da completare con maggiori dettagli. _________________________________________________________________ 11.2.6.8. min_adv_mss * Tipo: INTERO * Default: 12 Da completare con maggiori dettagli. _________________________________________________________________ 11.2.6.9. max_size * Tipo: INTERO * Default: 4096 Da completare con maggiori dettagli. _________________________________________________________________ 11.3. Voci relative a IPv6 in /proc/sys/net/ipv4/ Al momento (e fino a quando IPv4 non sarà convertito in un modulo del kernel indipendente) alcune opzioni qui presenti vengono utilizzate anche per IPv6. _________________________________________________________________ 11.3.1. ip_* 11.3.1.1. ip_local_port_range Questa impostazione è usata anche da IPv6. _________________________________________________________________ 11.3.2. tcp_* Queste impostazioni sono usate anche da IPv6. _________________________________________________________________ 11.3.3. icmp_* Queste impostazioni non vengono utilizzate da IPv6. Per abilitare il limite sul flusso (rate limiting) dei messaggi ICMPv6 (vivamente raccomandato a causa della possibilità di tempeste di ICMPv6) devono essere usate le regole netfilter-v6. _________________________________________________________________ 11.3.4. altre Sconosciute, ma probabilmente non usate da IPv6. _________________________________________________________________ 11.4. Voci relative a IPv6 in /proc/net/ In /proc/net ci sono diversi valori disponibili in sola lettura. Tali informazioni non possono essere ricavate usando "sysctl", quindi si usi per esempio "cat". _________________________________________________________________ 11.4.1. if_inet6 * Tipo: Una riga per ogni indirizzo, che contiene più valori Tutti gli indirizzi IPv6 configurati, vengono visualizzati in un formato speciale. L'esempio mostra solo quello dell'interfaccia di loopback. Il significato è indicato di seguito (si veda "net/ipv6/addrconf.c" per maggiori dettagli). # cat /proc/net/if_inet6 00000000000000000000000000000001 01 80 10 80 lo +------------------------------+ ++ ++ ++ ++ ++ | | | | | | 1 2 3 4 5 6 1. Indirizzo IPv6 rappresentato con 32 caratteri esadecimali senza i due punti come separatore 2. Numero dispositivo netlink (indice di interfaccia) in esadecimale (si veda anche "ip addr") 3. Lunghezza del prefisso in esadecimale 4. Valore dell'ambito di applicazione (scope value) (si vedano i sorgenti del kernel "include/net/ipv6.h" e "net/ipv6/addrconf.c" per maggiori dettagli) 5. Flag dell'interfaccia (si veda "include/linux/rtnetlink.h" e "net/ipv6/addrconf.c" per maggiori dettagli) 6. Nome del dispositivo _________________________________________________________________ 11.4.2. ipv6_route * Tipo: Una riga per ogni instradamento, che contiene più valori Tutti gli instradamenti IPv6 configurati vengono visualizzati in un formato speciale. L'esempio riguarda solo l'interfaccia di loopback. Il significato viene indicato di seguito (si veda "net/ipv6/route.c" per maggiori dettagli). # cat /proc/net/ipv6_route 00000000000000000000000000000000 00 00000000000000000000000000000000 00 +------------------------------+ ++ +------------------------------+ ++ | | | | 1 2 3 4 ¬ 00000000000000000000000000000000 ffffffff 00000001 00000001 00200200 lo ¬ +------------------------------+ +------+ +------+ +------+ +------+ ++ ¬ | | | | | | ¬ 5 6 7 8 9 10 1. Rete IPv6 di destinazione rappresentata con 32 caratteri esadecimali senza i due punti come separatore 2. Lunghezza del prefisso IPv6 di destinazione in esadecimale 3. Rete IPv6 mittente (source) rappresentata con 32 caratteri esadecimali senza i due punti come separatore 4. Lunghezza del prefisso IPv6 mittente (source) in esadecimale 5. L'hop IPv6 successivo rappresentato con 32 caratteri esadecimali senza i due punti come separatore 6. Metrica in esadecimale 7. Contatore di riferimento 8. Contatore di uso 9. Flag 10. Nome del dispositivo _________________________________________________________________ 11.4.3. sockstat6 * Tipo: Una riga per protocollo, con descrizione e valore Statistiche sui socket IPv6 usati. Esempio: # cat /proc/net/sockstat6 TCP6: inuse 7 UDP6: inuse 2 RAW6: inuse 1 FRAG6: inuse 0 memory 0 _________________________________________________________________ 11.4.4. tcp6 Da completare. _________________________________________________________________ 11.4.5. udp6 Da completare. _________________________________________________________________ 11.4.6. igmp6 Da completare. _________________________________________________________________ 11.4.7. raw6 Da completare. _________________________________________________________________ 11.4.8. ip6_flowlabel Da completare. _________________________________________________________________ 11.4.9. rt6_stats Da completare. _________________________________________________________________ 11.4.10. snmp6 * Tipo: Una riga per la descrizione SNMP e il valore Statistiche SNMP, possono essere recuperate tramite il server SNMP e la relativa tabella MIB con software di gestione di rete. _________________________________________________________________ 11.4.11. ip6_tables_names Tabelle netfilter6 disponibili. _________________________________________________________________ Capitolo 12. Interfaccia netlink al kernel Da completare... Non ho esperienza con questo... _________________________________________________________________ Capitolo 13. Debug di rete 13.1. Server socket binding 13.1.1. Uso di "netstat" per il controllo del server socket binding È sempre interessante vedere quali socket server sono attivi in un dato momento su di un nodo. L'uso di "netstat" è una scorciatoia per ottenere tali informazioni: Opzioni utilizzate: -nlptu Esempio: # netstat -nlptu Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State ¬ PID/Program name tcp 0 0 0.0.0.0:32768 0.0.0.0:* LISTEN ¬ 1258/rpc.statd tcp 0 0 0.0.0.0:32769 0.0.0.0:* LISTEN ¬ 1502/rpc.mountd tcp 0 0 0.0.0.0:515 0.0.0.0:* LISTEN ¬ 22433/lpd Waiting tcp 0 0 1.2.3.1:139 0.0.0.0:* LISTEN ¬ 1746/smbd tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN ¬ 1230/portmap tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN ¬ 3551/X tcp 0 0 1.2.3.1:8081 0.0.0.0:* LISTEN ¬ 18735/junkbuster tcp 0 0 1.2.3.1:3128 0.0.0.0:* LISTEN ¬ 18822/(squid) tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN ¬ 30734/named tcp 0 0 ::ffff:1.2.3.1:993 :::* LISTEN ¬ 6742/xinetd-ipv6 tcp 0 0 :::13 :::* LISTEN ¬ 6742/xinetd-ipv6 tcp 0 0 ::ffff:1.2.3.1:143 :::* LISTEN ¬ 6742/xinetd-ipv6 tcp 0 0 :::53 :::* LISTEN ¬ 30734/named tcp 0 0 :::22 :::* LISTEN ¬ 1410/sshd tcp 0 0 :::6010 :::* LISTEN ¬ 13237/sshd udp 0 0 0.0.0.0:32768 0.0.0.0:* ¬ 1258/rpc.statd udp 0 0 0.0.0.0:2049 0.0.0.0:* ¬ - udp 0 0 0.0.0.0:32770 0.0.0.0:* ¬ 1502/rpc.mountd udp 0 0 0.0.0.0:32771 0.0.0.0:* ¬ - udp 0 0 1.2.3.1:137 0.0.0.0:* ¬ 1751/nmbd udp 0 0 0.0.0.0:137 0.0.0.0:* ¬ 1751/nmbd udp 0 0 1.2.3.1:138 0.0.0.0:* ¬ 1751/nmbd udp 0 0 0.0.0.0:138 0.0.0.0:* ¬ 1751/nmbd udp 0 0 0.0.0.0:33044 0.0.0.0:* ¬ 30734/named udp 0 0 1.2.3.1:53 0.0.0.0:* ¬ 30734/named udp 0 0 127.0.0.1:53 0.0.0.0:* ¬ 30734/named udp 0 0 0.0.0.0:67 0.0.0.0:* ¬ 1530/dhcpd udp 0 0 0.0.0.0:67 0.0.0.0:* ¬ 1530/dhcpd udp 0 0 0.0.0.0:32858 0.0.0.0:* ¬ 18822/(squid) udp 0 0 0.0.0.0:4827 0.0.0.0:* ¬ 18822/(squid) udp 0 0 0.0.0.0:111 0.0.0.0:* ¬ 1230/portmap udp 0 0 :::53 :::* ¬ 30734/named _________________________________________________________________ 13.2. Esempi di dump dei pacchetti di tcpdump Qui vengono mostrati alcuni esempi di pacchetti catturati, probabilmente utili per il proprio debugging... ...maggiori contenuti prossimamente... _________________________________________________________________ 13.2.1. Scoperta del router 13.2.1.1. Avviso di router (Router advertisement) 15:43:49.484751 fe80::212:34ff:fe12:3450 > ff02::1: icmp6: router ¬ advertisement(chlim=64, router_ltime=30, reachable_time=0, ¬ retrans_time=0)(prefix info: AR valid_ltime=30, preffered_ltime=20, ¬ prefix=2002:0102:0304:1::/64)(prefix info: LAR valid_ltime=2592000, ¬ preffered_ltime=604800, prefix=3ffe:ffff:0:1::/64)(src lladdr: ¬ 0:12:34:12:34:50) (len 88, hlim 255) Il router con indirizzo link-local "fe80::212:34ff:fe12:3450" invia un avviso all'indirizzo multicast all-node-on-link "ff02::1" contenente due prefissi "2002:0102:0304:1::/64" (durata 30 s) e "3ffe:ffff:0:1::/64" (durata 2592000 s) con inclusi i suoi indirizzi di livello 2 (MAC) "0:12:34:12:34:50". _________________________________________________________________ 13.2.1.2. Sollecitazione di router (Router solicitation) 15:44:21.152646 fe80::212:34ff:fe12:3456 > ff02::2: icmp6: router solicitation ¬ (src lladdr: 0:12:34:12:34:56) (len 16, hlim 255) Il nodo con indirizzo link-local "fe80::212:34ff:fe12:3456" ed indirizzo di livello 2 (MAC) "0:12:34:12:34:56" sta cercando un router on-link, quindi invia questa sollecitazione all'indirizzo multicast all-router-on-link "ff02::2". _________________________________________________________________ 13.2.2. Scoperta del vicinato 13.2.2.1. Sollecitazione di scoperta del vicinato per rilevamento di indirizzi duplicati I seguenti pacchetti sono inviati da un nodo con indirizzo di livello 2 (MAC) "0:12:34:12:34:56" durante la configurazione automatica, per controllare se un potenziale indirizzo è utilizzato o meno da un altro nodo sul link, inviandoli all'indirizzo multicast link-local solicited node. * Il nodo vuole configurare il suo indirizzo link-local "fe80::212:34ff:fe12:3456" e controlla la presenza di duplicati 15:44:17.712338 :: > ff02::1:ff12:3456: icmp6: neighbor sol: who has ¬ fe80::212:34ff:fe12:3456(src lladdr: 0:12:34:12:34:56) (len 32, hlim 255) * Il nodo vuole configurare il suo indirizzo globale "2002:0102:0304:1:212:34ff:fe12:3456" (dopo aver ricevuto l'avviso precedentemente mostrato) e controlla ora la presenza di duplicati 15:44:21.905596 :: > ff02::1:ff12:3456: icmp6: neighbor sol: who has ¬ 2002:0102:0304:1:212:34ff:fe12:3456(src lladdr: 0:12:34:12:34:56) (len 32, ¬ hlim 255) * Il nodo vuole configurare il suo indirizzo globale "3ffe:ffff:0:1:212:34ff:fe12:3456" (dopo aver ricevuto l'avviso precedentemente mostrato) e controlla ora la presenza di duplicati 15:44:22.304028 :: > ff02::1:ff12:3456: icmp6: neighbor sol: who has ¬ 3ffe:ffff:0:1:212:34ff:fe12:3456(src lladdr: 0:12:34:12:34:56) (len 32, hlim ¬ 255) _________________________________________________________________ 13.2.2.2. Sollecitazione di scoperta del vicinato per la ricerca di host o gateway * Il nodo vuole inviare pacchetti a "3ffe:ffff:0:1::10" ma non ha l'indirizzo di livello 2 (MAC) a