From 6c4f76e7c94f840029696823a27dbaf873e313ce Mon Sep 17 00:00:00 2001 From: Serge Victor Date: Sun, 8 Jan 2017 10:16:21 +0700 Subject: [PATCH] IPv6 howto moved to https://github.com/tLDP/Linux-IPv6 --- LDP/users/Peter-Bieringer/.cvsignore | 0 .../Peter-Bieringer/Linux+IPv6-HOWTO.de.html | 19310 ---------- .../Peter-Bieringer/Linux+IPv6-HOWTO.de.lyx | 23915 ------------ .../Peter-Bieringer/Linux+IPv6-HOWTO.de.pdf | Bin 533958 -> 0 bytes .../Peter-Bieringer/Linux+IPv6-HOWTO.de.sgml | 3450 -- .../Peter-Bieringer/Linux+IPv6-HOWTO.fr.html | 17785 --------- .../Peter-Bieringer/Linux+IPv6-HOWTO.fr.lyx | 21639 ----------- .../Peter-Bieringer/Linux+IPv6-HOWTO.fr.pdf | Bin 522194 -> 0 bytes .../Peter-Bieringer/Linux+IPv6-HOWTO.fr.sgml | 2962 -- .../Peter-Bieringer/Linux+IPv6-HOWTO.html | 22306 ----------- .../Peter-Bieringer/Linux+IPv6-HOWTO.lyx | 31055 --------------- .../Peter-Bieringer/Linux+IPv6-HOWTO.pdf | Bin 598702 -> 0 bytes .../Linux+IPv6-HOWTO.pt_BR.html | 20753 ---------- .../Linux+IPv6-HOWTO.pt_BR.lyx | 31492 ---------------- .../Linux+IPv6-HOWTO.pt_BR.pdf | Bin 588712 -> 0 bytes .../Linux+IPv6-HOWTO.pt_BR.sgml | 5007 --- .../Peter-Bieringer/Linux+IPv6-HOWTO.sgml | 5307 --- LDP/users/Peter-Bieringer/check_urls.pl | 397 - LDP/users/Peter-Bieringer/copytohowtodir.sh | 35 - LDP/users/Peter-Bieringer/generate-all.sh | 11 - LDP/users/Peter-Bieringer/generate-en-de.sh | 11 - LDP/users/Peter-Bieringer/generate.sh | 345 - LDP/users/Peter-Bieringer/info.txt | 30 - LDP/users/Peter-Bieringer/ldp.dsl | 351 - .../Peter-Bieringer/lyxcodelinewrapper.pl | 173 - LDP/users/Peter-Bieringer/make.sh | 335 - LDP/users/Peter-Bieringer/runsgmlfix.sh | 47 - LDP/users/Peter-Bieringer/sgmllyxquotefix.pl | 48 - .../Peter-Bieringer/sgmllyxtabletagfix.pl | 45 - 29 files changed, 206809 deletions(-) delete mode 100644 LDP/users/Peter-Bieringer/.cvsignore delete mode 100644 LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.de.html delete mode 100644 LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.de.lyx delete mode 100644 LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.de.pdf delete mode 100644 LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.de.sgml delete mode 100644 LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.fr.html delete mode 100644 LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.fr.lyx delete mode 100644 LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.fr.pdf delete mode 100644 LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.fr.sgml delete mode 100644 LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.html delete mode 100644 LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.lyx delete mode 100644 LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.pdf delete mode 100644 LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.pt_BR.html delete mode 100644 LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.pt_BR.lyx delete mode 100644 LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.pt_BR.pdf delete mode 100644 LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.pt_BR.sgml delete mode 100644 LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.sgml delete mode 100755 LDP/users/Peter-Bieringer/check_urls.pl delete mode 100755 LDP/users/Peter-Bieringer/copytohowtodir.sh delete mode 100755 LDP/users/Peter-Bieringer/generate-all.sh delete mode 100755 LDP/users/Peter-Bieringer/generate-en-de.sh delete mode 100755 LDP/users/Peter-Bieringer/generate.sh delete mode 100644 LDP/users/Peter-Bieringer/info.txt delete mode 100644 LDP/users/Peter-Bieringer/ldp.dsl delete mode 100755 LDP/users/Peter-Bieringer/lyxcodelinewrapper.pl delete mode 100755 LDP/users/Peter-Bieringer/make.sh delete mode 100755 LDP/users/Peter-Bieringer/runsgmlfix.sh delete mode 100755 LDP/users/Peter-Bieringer/sgmllyxquotefix.pl delete mode 100755 LDP/users/Peter-Bieringer/sgmllyxtabletagfix.pl diff --git a/LDP/users/Peter-Bieringer/.cvsignore b/LDP/users/Peter-Bieringer/.cvsignore deleted file mode 100644 index e69de29b..00000000 diff --git a/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.de.html b/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.de.html deleted file mode 100644 index e533f969..00000000 --- a/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.de.html +++ /dev/null @@ -1,19310 +0,0 @@ - -Linux IPv6 HOWTO (de)

Linux IPv6 HOWTO (de)

Peter Bieringer

pb at bieringer dot de

Versionsgeschichte
Version 0.67.de.1wip2015-08-18Geändert durch: PB
Version 0.66.de.12014-05-15Geändert durch: PB
Version 0.65.de.12009-12-13Geändert durch: PB
Version 0.64.de.12009-06-11Geändert durch: PB
Version 0.61.de.12007-10-06Geändert durch: PB

Das Ziel des Linux IPv6 HOWTO ist die Beantwortung von Basis- und Experten-Fragen zum Thema IPv6 mit Linux-Betriebssystemen. Dieses HOWTO will dem Leser genug Informationen bereitstellen, um IPv6-Anwendungen auf Linux Computer installieren, konfigurieren und anwenden zu können. Zwischen-Versionen sind auf mirrors.bieringer.de oder mirrors.deepspace6.net verfügbar. Änderungen sind in der Revisionshistorie aufgelistet.


Inhaltsverzeichnis
1. Allgemein
1.1. Copyright, Lizenz und anderes
1.2. Kategorie
1.3. Version, Werdegang und Unerledigtes
1.4. Übersetzungen
1.5. Technisches
1.6. Vorwort
1.7. Verwendete Begriffe, Glossar und Abkürzungen
1.8. Grundvoraussetzung für die Verwendung dieses HOWTOs
2. Grundlagen
2.1. Was ist IPv6?
2.2. Geschichte von IPv6 & Linux
2.3. Wie sehen IPv6 Adressen aus?
2.4. FAQ (Grundlagen)
3. Adress-Typen
3.1. Adressen ohne speziellen Präfix
3.2. Netzteil der Adresse (Präfix)
3.3. Adress-Typen (Host-Teil)
3.4. Präfixlängen für das Routing
4. IPv6 System-Check
4.1. IPv6 kompatibler Kernel
4.2. IPv6 kompatible Tools zur Netzwerkkonfiguration
4.3. IPv6 Test/Debug-Programme
4.4. IPv6 kompatible Programme
4.5. IPv6 kompatible Client-Programme (Auswahl)
4.6. IPv6 kompatible Server
4.7. FAQ (IPv6 Systemcheck)
5. Interface-Konfiguration
5.1. Unterschiedliche Netzwerk-Geräte
5.2. Interfaces ein/aus-schalten
6. IPv6 Adressen konfigurieren
6.1. Bestehende IPv6 Adressen anzeigen
6.2. Hinzufügen einer IPv6 Adresse
6.3. IPv6 Adressen entfernen
6.4. Automatische IPv6-Adress-Konfiguration
6.5. Aktivieren der Privacy Extension
7. Konfiguration normaler IPv6-Routen
7.1. Bestehende IPv6-Routen anzeigen
7.2. Eine IPv6-Route über ein Gateway hinzufügen
7.3. Eine IPv6-Route über ein Gateway entfernen
7.4. Eine IPv6-Route über ein Interface hinzufügen
7.5. Eine IPv6-Route über ein Interface entfernen
7.6. FAQ für IPv6-Routen
8. Neighbor Discovery
8.1. Netzwerkumgebung mit “ip” anzeigen
8.2. Tabelle der Netzwerkumgebung mit “ip” editieren
9. Konfiguration eines IPv6-in-IPv4 Tunnels
9.1. Tunnelarten
9.2. Bestehende Tunnel anzeigen
9.3. Einrichtung eines Punkt-zu-Punkt Tunnels
9.4. Einrichtung von 6to4 Tunnel
10. Konfiguration eines IPv4-in-IPv6 Tunnels
10.1. Anzeigen von existierenden Tunnels
10.2. Konfiguration eines Punkt-zu-Punkt Tunnels
10.3. Löschen von Punkt-zu-Punkt-Tunnels
11. Kernel-Einstellungen im /proc-Dateisystem
11.1. Zugriff auf das /proc-Dateisystem
11.2. Einträge in /proc/sys/net/ipv6/
11.3. IPv6 relevante Einträge in /proc/sys/net/ipv4/
11.4. IPv6 relevante Einträge in /proc/net/
12. Netlink-Interface zum Kernel
13. Adress-Auflösung
14. Netzwerk-Fehlersuche
14.1. Server Socket-Anbindung
14.2. tcpdump-Beispiele
15. Unterstützung einer ständigen IPv6-Konfiguration in Linux Distributionen
15.1. Red Hat Linux und “Klone”
15.2. SuSE Linux
15.3. Debian Linux
16. Automatische Konfiguration
16.1. Stateless Auto-Konfiguration (out-of-the-box)
16.2. Stateless Auto-Konfiguration unter Verwendung des Router Advertisement Daemon (radvd)
16.3. Dynamic Host Configuration Protocol v6 (DHCPv6)
17. Mobilität
17.1. Allgemeines
18. Firewall-Funktionalität
18.1. Firewall-Funktionalität mit netfilter6
18.2. Vorbereitung
18.3. Verwendung
18.4. Network Address Translation (NAT) mit netfilter6
18.5. Firewall-Setup mit nftables
19. Sicherheit
19.1. Sicherheit des Knoten
19.2. Zugangsbeschränkungen
19.3. IPv6 Sicherheitsüberwachung
20. Verschlüsselung und Authentifizierung
20.1. Nutzungsarten von Verschlüsselung und Authentifizierung
20.2. Unterstützung im Kernel (ESP und AH)
20.3. Automatischer Schlüssel-Austausch (IKE)
20.4. Anmerkungen:
21. Quality of Service (QoS)
21.1. General
21.2. Linux QoS mit “tc”
22. Hinweise zu IPv6 kompatiblen Daemons
22.1. Berkeley Internet Name Domain (BIND) daemon “named”
22.2. Internet super daemon (xinetd)
22.3. Webserver Apache2 (httpd2)
22.4. Router Advertisement Daemon (radvd)
22.5. Dynamic Host Configuration v6 Server (dhcp6s)
22.6. ISC Dynamic Host Configuration Server (dhcpd)
22.7. DHCP Server Dibbler
22.8. tcp_wrapper
22.9. vsftpd
22.10. proftpd
22.11. Andere Daemons
23. Programmierung
23.1. Programmierung mit Nutzung der C-API
23.2. Andere Programmiersprachen
24. Interoperabilität
25. Weitere Informationen und URLs
25.1. Gedruckte Bücher, Artikel, Onlinerezensionen
25.2. Konferenzen und Meetings
25.3. Online-Informationen
25.4. IPv6 Infrastruktur
25.5. Mailinglisten
25.6. Online-Werkzeuge
25.7. Trainings, Seminare
25.8. 'Die Online Entdeckung' ...
26. Versions-Überblick / Danksagung / Zum Schluss
26.1. Versions-Überblick
26.2. Danksagung
26.3. Zum Schluss

Kapitel 1. Allgemein

Informationen über verfügbare Übersetzungen finden Sie im Abschnitt Übersetzungen.


1.1. Copyright, Lizenz und anderes

1.1.1. Copyright

Verfasst von und urheberrechtlich geschützt durch Peter Bieringer © 2001-2014.

Deutsche Übersetzung:

Verfasst von und urheberrechtlich geschützt durch Georg Käfer © 2002-2003, weitergeführt von Peter Bieringer © 2004-2014.


1.1.2. Lizenz

Dieses Linux IPv6 HOWTO wird unter der GNU GPL Version 2 herausgegeben:

Dieses Linux IPv6 HOWTO ist ein Handbuch zur Anwendung und Konfiguration von IPv6 auf Linux-Systemen.

Copyright © 2001-2014 Peter Bieringer -Deutsche Übersetzung Copyright © 2002-2003 Georg Käfer, weitergeführt von Peter Bieringer © 2004-2013.

Diese Dokumentation ist freie Software; Sie können diese unter den Bedingungen der GNU General Public License, wie von der Free Software Foundation publiziert, entweder unter Version 2 oder optional jede höhere Version redistribuieren und/oder modifizieren.

Dieses Programm wird in der Hoffnung verteilt, dass es für Sie nutzvoll ist, jedoch OHNE JEDWEDER GEWÄHRLEISTUNG; sogar ohne der implizierten Gewährleistung der MARKTFÄHIGKEIT oder der FÄHIGKEIT ZU EINEM BESONDEREN ZWECK bzw. VORSATZ. Weitere Details finden Sie in der GNU General Public License.

Zusammen mit diesem Dokument sollten Sie eine Kopie der GNU General Public License erhalten haben; Wenn dem nicht so ist, können Sie sich an folgende Adresse wenden: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA.


1.1.3. Über den Autor

1.1.3.1. Internet/IPv6 Background des Autors

  • 1993: In Kontakt mit dem Internet getreten, kennenlernen von konsolenbasierte E-Mail- und News-Client-Programme (z.B.: suchen Sie nach “e91abier” auf groups.google.com, das ist der Autor).

  • 1996: Anfrage zur Gestaltung eines IPv6 Kurses inklusive eines Workshops zum Thema Linux Betriebssystem bekommen.

  • 1997: Schreiben einer Anleitung, wie man IPv6 auf Linux Systemen installieren, konfigurieren und anwenden kann, genannt IPv6 & Linux - HowTo (siehe unter IPv6 & Linux - HowTo/History).

  • 2001: Begonnen, dieses neue Linux IPv6 HOWTO zu schreiben.


1.1.3.2. Ansprechpartner

Der Autor kann via E-Mail <pb at bieringer dot de> und auch über seine homepage kontaktiert werden.

Der Autor lebt zurzeit in München / Bayern / (Süd-)Deutschland / (Mittel-)Europa / Erde (Festland).


1.2. Kategorie

Dieses HOWTO sollte in der Kategorie “Networking/Protocols” aufgelistet werden.


1.3. Version, Werdegang und Unerledigtes

1.3.1. Version

Die aktuelle Versionsnummer finden Sie auf der Titelseite.

Für andere verfügbare Versionen/Übersetzungen siehe auch http://www.bieringer.de/linux/IPv6/.


1.3.2. Werdegang

1.3.2.1. Eckpunkte

2001-11-30: Beginn mit der Neukonzeption dieses HOWTOs.

2002-01-02: Viel Inhalt eingearbeitet, erste Version des Kapitels 1 veröffentlicht (Version 0.10).

2002-01-14: Weitere Vervollständigung und Überprüfung des Inhalts, öffentliche Freigabe des kompletten Dokuments (Version 0.14).

2002-08-16: Polnische Übersetzung ist in Arbeit.

2002-10-31: Chinesische Übersetzung ist verfügbar.

2002-11-10: Deutsche Übersetzung ist in Arbeit.

2003-02-10: Deutsche Übersetzung ist verfügbar.

2003-04-09: Französische Übersetzung ist in Arbeit.

2003-05-09: Französische Übersetzung ist verfügbar

2003-10-16: Italienische Übersetzung ist in Arbeit.

2004-03-12: Italienische Übersetzung ist verfügbar

2004-06-18: Griechische Übersetzung ist in Arbeit

2005-07-25: Türkische Übersetzung ist verfügbar

2007-03-28: Portugiesisch-Brasilianische Übersetzung ist in Arbeit

2008-07-30: Spanische Übersetzung ist verfügbar (aber noch nicht abgeschlossen)

2011-05-09: Portugiesisch-Brasilianische Übersetzung ist wieder in Arbeit


1.3.2.2. Vollständiger Werdegang

Am Ende dieses Dokumentes finden Sie die Historie der Änderungen.


1.3.3. Unerledigtes

  • Fehlenden Inhalt ergänzen

  • Grammatik-Überprüfung beenden


1.4. Übersetzungen

Übersetzungen müssen den URL, die Versionsnummer und das Copyright des Originaldokuments enthalten (aber auch die Daten zu ihrer Übersetzung). Bitte übersetzen Sie nicht das Original-Changelog, das wäre nicht sehr sinnvoll. Es sieht aus, als wäre die Änderungsfrequenz dieses Dokumentes überwiegend geringer als einmal pro Monat. Seit Version 0.27 scheint der Hauptteil des vom Autor beigesteuerten Inhaltes geschrieben zu sein. Übersetzungen müssen immer das englische Original als Quelle benutzen.


1.4.1. Diverse Sprachen

Notiz: eine Übersicht mit URLs ist zu finden unter http://www.bieringer.de/linux/IPv6/.


1.4.1.1. Deutsch

Mit 2002-11-10 wurde von Georg Käfer <gkaefer at gmx dot at> die Deutsche Übersetzung begonnen und am 10.02.2003 erstmals publiziert. Grundlage der Übersetzung ist die CVS-Version 1.53 der Lyx-Datei, aus der das Linux IPv6 HOWTO Version 0.39.2 erstellt wurde.

Mit Sicherheit werden in dieser Übersetzung noch so manche 'Hoppalas' und auch 'grausige' Rechtschreibfehler zu finden sein. Sorry! Ebenfalls fällt es nicht immer leicht, zu entscheiden, ob ein Terminus überhaupt übersetzt werden soll, bzw. ob die Beibehaltung des englischen Originalwortes nicht zielführender wäre...

Neue deutsche Rechtschreibung: es wurde eine konservative Übersetzung angewandt, d.h. nicht alle möglichen Änderungen der Neuen deutschen Rechtschreibung wurden durchgeführt, sondern nur die notwendigen Änderungen.

Die URL für diese deutsche Übersetzung ist: http://mirrors.deepspace6.net/Linux+IPv6-HOWTO-de/


1.4.1.2. Andere Sprachen

Informationen über Übersetzungen in andere Sprachen finden Sie hier im Originaldokument: TLDP / Linux+IPv6-HOWTO / Übersetzungen.


1.5. Technisches

1.5.1. Originalquelle dieses HOWTOs

Die originale englische Version dieses HOWTOs wurde mit LyX Version 1.6.1 auf einem Fedora 10 Linux System mit SGML-Template (DocBook book) erstellt. Alle Dateien sind unter github / tLDP / LDP / users / Peter-Bieringer verfügbar.

Auch die deutsche Version wurde mit LyX erstellt und befindet sich ebenfalls im angegebenen CVS-Verzeichnis.


1.5.1.1. Zeilenumbruch in Code-Beispielen

Der Zeilenumbruch wird mit Hilfe eines selbst geschriebenen Tools “lyxcodelinewrapper.pl” erstellt; Sie finden das Skript am CVS unter: TLDP-CVS / users / Peter-Bieringer.


1.5.1.2. SGML Erzeugung

SGML wird mit Hilfe der Exportfunktion in LyX generiert.

Um korrekten SGML Code zu erstellen, müssen einige Korrekturen gemacht werden. Die entsprechenden Perl Skripts finden Sie unter TLDP-CVS / users / Peter-Bieringer:

  • Der Export von Lyx-Tabellen erstellt keine korrekten “colspan” Tags. Tool für die Korrektur: “sgmllyxtabletagfix.pl” (behoben seit LyX Version 1.2.0)

  • LyX verwendet manchmal , anstelle der normalen, spezielle Links-/Rechts-Formatierungen für Zitate, die dann auch im generierten HTML Code ausgegeben werden. Einige Browser können das Ergebnis nicht besonders schön darstellen (bekannt sind: Opera TP2 oder Konqueror). Tool für die Korrektur: “sgmllyxquotefix.pl”


1.5.2. Online-Verweise auf die HTML Version dieses HOWTOs (Links / Anchors)

1.5.2.1. Hauptindexseite

Im Allgemeinen wird ein Verweis auf die Hauptindexseite empfohlen.


1.5.2.2. Seitennamen

Da die HTML-Seiten aus einer SGML-Datei erstellt werden, werden einige HTML-Dateinamen ziemlich zufällig gewählt. Manche Seiten sind jedoch in LyX mit Tags gekennzeichnet, woraus statische Namen resultieren. Diese sollten der besseren Referenz wegen zukünftig nicht geändert werden.

Bitte lassen Sie es wissen, wenn Sie glauben, dass ein Tag vergessen wurde.


1.6. Vorwort

Einiges vorab:


1.6.1. Wie viele IPv6 & Linux bezogene HOWTOs gibt es?

Inklusive diesem gibt es drei (3) HOWTO-Dokumente. Pardon, wenn das zu viele sind ;-)


1.6.1.1. Linux Ipv6 FAQ/HOWTO (veraltet)

Das erste IPv6 bezogene Dokument wurde von Eric Osborne geschrieben und heißt Linux IPv6 FAQ/HOWTO (bitte benutzen Sie den Text nur im historischen Kontext). Die neueste Version 3.2.1 wurde am 14.Juli 1997 veröffentlicht.

Bitte um Ihre Mithilfe: Wenn jemand das Erstellungsdatum der Erstversion dieses HOWTOs kennen sollte, senden Sie mir Bitte ein E-Mail (Die Information wird im Abschnitt “Werdegang” eingearbeitet).


1.6.1.2. IPv6 & Linux - HowTo (gewartet)

Ein zweites Dokument (IPv6 & Linux - HowTo) wurde vom selben Autor (Peter Bieringer) geschrieben und liegt im HTML-Format vor. Begonnen wurde mit dem Schreiben im April 1997 und die erste englische Version wurde im Juni 1997 veröffentlicht. Das Dokument wird weiterhin betreut, es wird aber langsam (jedoch nicht komplett) in das Linux IPv6 HOWTO - das Sie gerade lesen - eingearbeitet.


1.6.1.3. Linux IPv6 HOWTO (dieses Dokument)

Da das IPv6 & Linux - HowTo in HTML geschrieben wurde, war es nicht wirklich mit dem The Linux Documentation Project (TLDP) kompatibel. Der Autor (Peter Bieringer) bekam Ende Nov. 2001 die Anfrage, das IPv6 & Linux - HowTo in SGML zu konvertieren. Er entschied sich auf Grund dieser Diskontinuität (Future of IPv6 & Linux - HowTo) und der Tatsache, dass IPv6 mehr und mehr zum Standard wird, zum Schreiben eines neuen Dokuments. Im zweiten HOWTO (IPv6 & Linux - HowTo) wird auch weiterhin dynamischer Inhalt sowie weiterführender Inhalt zu finden sein.


1.7. Verwendete Begriffe, Glossar und Abkürzungen

1.7.1. Netzwerkbegriffe

Base 10

Dezimales Zahlensystem, das die Zahlen 0-9 beinhaltet.

Base 16

Generell in Programmiersprachen verwendetes hexedezimales Zahlensystem, das die Zahlen 0-9 und die Buchstaben A-F beinhaltet (Groß/Kleinschreibung möglich).

Base 85

85 verschiedene Zahlen/Buchstaben umfasst dieses Zahlensystem und ermöglicht dadurch kürzere Zeichenketten - aber niemals in der Praxis gesehen.

Bit

Kleinste Speichereinheit mit dem Wert ein/wahr (1) oder aus/falsch (0)

Byte

Meistens eine Menge von 8 bits (aber kein Muss - siehe ältere Computer Systeme)

Device

Netzwerkgerät, siehe auch NIC

Dual homed host

Ein Dual homed host ist ein Node mit zwei (physischen oder virtuellen) Schnittstellen auf zwei unterschiedlichen Links. Datenpakete können zwischen den zwei Verbindungen nicht weitergeleitet werden.

Host

Im Regelfall handelt es sich um einen Rechner mit einen Link sowie einer aktiven Netzwerk-Schnittstelle, z.B. Ethernet oder (aber nicht und) PPP.

Interface

Ident mit “device”, siehe auch NIC.

IP Header

Kopf eines IP-Paketes (jedes Netzwerk-Paket hat einen header, die Form des headers ist abhängig von der Netzwerkschicht).

Link

Ein Link ist eine Schicht 2 Netzwerk-Transportmedium für Pakete; Beispiele sind Ethernet, Token Ring, PPP, SLIP, ATM, ISDN, Frame Relay,...

Node

Ein Node (=Knoten) ist ein Host oder ein Router.

Octet

Sammlung von acht (8) realen bits, vergleichbar mit “byte”.

Port

Information für den TCP/UDP dispatcher (Schicht 4), mit dessen Hilfe Informationen auf höhere Schichten transportiert werden.

Protocol

Jede Netzwerkschicht enthält meistens ein Protokoll-Feld damit die Übergabe transportierter Informationen an höhere Netzwerkschichten erleichtert wird. Beispiele hierfür: Schicht 2 (MAC) und 3 (IP).

Router

Ein Router ist ein Knoten mit zwei (2) oder mehr (physischen oder virtuellen) Schnittstellen, der Datenpakete zwischen den Schnittstellen versenden kann.

Socket

Ein IP socket wird durch Quell- und Zieladresse, den Ports (und der Verbindung) definiert.

Stack

Ein Stack setzt sich aus Netzwerkschichten zusammen.

Subnetmask

IP Netzwerke verwenden Bitmasken um lokale von entfernten Netzwerken zu trennen.

Tunnel

Ein Tunnel ist typischerweise eine Punkt-zu-Punkt-Verbindung, über die Datenpakete eines anderen Protokolls ausgetauscht werden. Beispiel: IPv6-in-IPv4 Tunnel.


1.7.1.1. Abkürzungen

ACL

Access Control List - Zugriffsliste)

API

Application Programming Interface - Schnittstellen in Programmen zwischen den Applikationen

ASIC

Application Specified Integrated Circuit - Applikationsspezifischer integrierter Schaltkreis

BSD

Berkeley Software Distribution

CAN-Bus

Controller Area Network Bus (physical bus system)

ISP

Internet Service Provider

KAME

Ein Projekt und gemeinsame Anstrengung von sechs (6) Firmen in Japan mit dem Ziel, einen freien IPv6 und IPsec Stack für BSD Derivate der Öffentlichkeit zur Verfügung zu stellen www.kame.net.

LIR

Local Internet Registry - Lokale Internet Registratur

NIC

Network Interface Controller - Netzwerk[schnittstellen]karte, kurz Netzwerkkarte

RFC

Request For Comments - eine Sammlung von technischen und organisatorischen Dokumenten zum Thema Internet.

USAGI

UniverSAl playGround for Ipv6 Project - dieses Projekt will für das Linux System einen IPv6 Protokoll stack mit Produktionsqualität ausliefern.


1.7.2. In diesem Dokument verwendete Syntax

1.7.2.1. Zeilenumbruchs-Zeichen bei langen Codebeispielen

Das spezielle Zeichen “¬” zeigt in den Beispielen an, dass die Zeile umgebrochen wurde. Dies wurde für eine korrekte Darstellung des Textes in den PDF- und PS-Versionen benötigt.


1.7.2.2. Platzhalter

In allgemeinen Beispielen können Sie öfters lesen:

<myipaddress>

In Skripts oder an Ihrer Kommandozeile müssen Sie die < und > weglassen und den Text mit dem entsprechenden Inhalt ersetzen. Das Beispiel hier z.B. könnte sein:

1.2.3.4

1.7.2.3. Shell-Kommandos

Kommandos, die nicht als Root-Benutzer ausgeführt werden, beginnen mit $, z.B.

$ whoami

Befehle, die mit Root-Rechten ausgeführt werden, beginnen mit #, z.B.

# whoami

1.8. Grundvoraussetzung für die Verwendung dieses HOWTOs

1.8.1. Persönliche Anforderungen

1.8.1.1. Erfahrung mit Unix Tools

Sie sollten mit den gängigsten Unix Tools wie grep, awk, find, etc. und deren Kommandozeilen-Optionen vertraut sein.


1.8.1.2. Erfahrung mit Netzwerktheorie

Sie sollten das Schichtmodell und die einzelnen Schichten, Protokolle, Adressarten, Kabelsorten, Stecker etc. kennen. Wenn das Neuland für Sie sein sollte, finden Sie hier einen guten Ausgangspunkt: http://www.rigacci.org/docs/biblio/online/intro_to_networking/book1.htm


1.8.1.3. Erfahrung mit der Konfiguration von IPv4 Netzen

Sie sollten definitiv Erfahrung mit der Konfiguration von IPv4 Netzwerken haben, andernfalls werden Sie dem Text nur schwer folgen können.


1.8.1.4. Erfahrung mit dem Domain Name System (DNS)

Sie sollten ebenfalls das Domain Name System (DNS) verstehen und damit umgehen können.


1.8.1.5. Routine im Umgang mit Strategien zur Netzwerk-Fehlersuche

Sie sollten zumindest mit tcpdump umgehen und den Output des Programms interpretieren können. Andernfalls wird die Netzwerk-Fehlersuche für Sie schwierig.


1.8.2. Linux kompatible Hardware

Sicherlich wollen Sie mit realer Hardware experimentieren und nicht darüber an dieser Stelle lesen und an der einen oder anderen Stelle einschlummern. ;-7)


Kapitel 2. Grundlagen

2.1. Was ist IPv6?

IPv6 ist ein neues Schicht 3 Vermittlungsprotokoll und es wird IPv4 (auch als IP bekannt) ablösen. IPv4 wurde vor langer Zeit entworfen (RFC 760 / Internet Protocol vom Januar 1980). Seitdem wurden viele Adressen vergeben und Erweiterungen angeregt. Die aktuelle RFC ist RFC 2460 / Internet Protocol Version 6 Specification. Hauptänderungen in IPv6 sind das neue Design des Headers sowie die Erweiterung der Adresslänge von 32 bits auf 128 bits. Die Schicht 3 ist für den Transport der Pakete von Endpunkt-zu-Endpunkt mittels adressbasierten Paket-Routings zuständig, und wie bei IPv4 müssen bei IPv6 die Adressen (Quell- und Zieladresse) inkludiert sein.

Für weitere Informationen zur IPv6 Geschichte siehe die älteren RFCs z.B. SWITCH IPv6 Pilot / References.


2.2. Geschichte von IPv6 & Linux

Die Jahre 1992, 1993 und 1994 der allgemeinen IPv6 Geschichte können Sie in folgendem Dokument nachlesen: IPv6 or IPng (IP next generation).

Zu erledigen: Bessere Chronologie, mehr Inhalt


2.2.1. Anfang

Der erste IPv6 Netzwerk Code wurde dem Linux Kernel 2.1.8 im November 1996 durch Pedro Roque hinzugefügt. Er basierte auf dem BSD API:

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 
-+ * <draft-ietf-ipngwg-bsd-api-05.txt>

Diese Zeilen entstammen dem patch-2.1.8 (die E-Mail-Adresse wurde hier beim Copy & Paste absichtlich gelöscht).


2.2.2. Übergangszeit

Aufgrund fehlender Arbeitskraft konnte die IPv6-Kernel-Implementierung nicht mit den Drafts oder neu freigegebenen RFCs Schritt halten. Im Oktober 2000 wurde in Japan das USAGI Projekt gestartet. Das Ziel war, die fehlende bzw. bereits veraltete IPv6 Funktionalität in Linux zu implementieren. Dabei richtete man sich nach der aktuellen FreeBSD Implementierung von IPv6, die durch das KAME project umgesetzt wurde. Von Zeit zu Zeit wurden im Vergleich zu den aktuellen Standard Linux-Kernel-Quellen ein Auszug erstellt.

Bis zum Start der Entwicklungs-Kernel Serie 2.5.x, der USAGI Patch war so groß, das er von den Linux-Netzwerkcode-Maintainers nicht komplett für die Einbindung in die Produktions-Kernel Serie 2.4.x eingebunden werden konnte.

Während der Entwicklung in der Serie 2.5.x hat USAGI versucht, so viel wie möglich ihrer Erweiterungen darin zu integrieren.


2.2.3. Heute

Viele der von USAGI und anderen lang entwickelten IPv6-bezogenen Patches sind bereits in der Vanilla Kernel Serie 2.6.x integriert.


2.2.4. Zukunft

USAGI und andere arbeiten weiterhin an der Implementierung von neuen Features wie Mobility und anderen. Von Zeit zu Zeit werden neue Erweiterungs-Patches veröffentlicht, wie auch die Integration in die Vanilla Kernel Serie 2.6.x vorangetrieben.


2.3. Wie sehen IPv6 Adressen aus?

Wie gesagt, IPv6 Adressen sind 128 bit lang. Diese bit-Anzahl kann sehr hohe dezimale Zahlen mit bis zu 39 Ziffern ergeben:

2^128-1: 340282366920938463463374607431768211455

Solche Zahlen sind nicht wirklich Adressen, die auswendig gelernt werden können. Die IPv6 Adressdarstellung ist bitweise orientiert (wie bei IPv4, aber das wird nicht oft bedacht). Eine bessere Schreibweise ist deshalb die hexadezimale Darstellung. Dabei werden 4 bits (auch ”nibble” genannt) durch die Zeichen 0-9 und a-f (10-15) dargestellt, wodurch die Länge auf 32 Zeichen reduziert wird.

2^128-1: 0xffffffffffffffffffffffffffffffff

Diese Darstellung ist ebenfalls nicht sehr angenehm (mögliche Verwechslung oder Verlust einzelner hexadezimaler Ziffern), so dass die IPv6 Designer das hexadezimales Format mit einem Doppelpunkt als Trennzeichen nach jedem 16 bit Block erweiterten. Ferner wird das führende ”0x” (ein in Programmiersprachen verwendetes Identifizierungsmerkmal für hexadezimale Werte) entfernt:

2^128-1: ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff

Eine gültige Adresse (s.u. Adress-Typen) ist z.B.:

2001:0db8:0100:f101:0210:a4ff:fee3:9566

Der Vereinfachung halber können führende Nullen jedes 16 bit-Blocks weggelassen werden:

2001:0db8:0100:f101:0210:a4ff:fee3:9566  -> 
-¬ 2001:0db8:100:f101:210:a4ff:fee3:9566

Eine Sequenz von 16 bit-Blöcken, die nur Nullen enthaltet, kann durch ein “::“ ersetzt werden. Diese Komprimierung kann aber nicht öfters als einmal durchgeführt werden

2001:0db8:100:f101:0:0:0:1  ->  2001:0db8:100:f101::1

Die höchstmögliche Reduktion sieht man bei der IPv6 Localhost Adresse:

0000:0000:0000:0000:0000:0000:0000:0001  ->  ::1

Es gibt auch eine so genannte kompakte Darstellung (base 85 codiert) RFC 1924 / A Compact Representation of IPv6 Addresses (publiziert am 1. April 1996). Diese Notation wurde allerdings nie in der Praxis gesehen und ist wahrscheinlich ein Aprilscherz. Ein Beispiel:

# ipv6calc --addr_to_base85 2001:0db8:0100:f101:0210:a4ff:fee3:9566 
-Itu&-ZQ82s>J%s99FJXT

Info: ipv6calc ist ein IPv6 Adressen-Format-Umrechner und Konvertierungsprogramm und ist hier zu finden: ipv6calc homepage (Mirror)


2.4. FAQ (Grundlagen)

2.4.1. Warum wird der Nachfolger von IPv4 nun IPv6 und nicht IPv5 genannt?

In jedem IP-Header werden die ersten 4 Bits für die Protokollversion reserviert. So sind theoretisch die Protokollnummern 0 bis 15 möglich:

So war die nächste freie Zahl 6. IPv6 war geboren!


2.4.2. IPv6 Adressen: Warum ist die Anzahl der Bits so groß?

Bei der Entwicklung von IPv4 dachte man, dass 32 Bits für die Welt ausreichend wären. Blickt man zurück, so waren bis heute 32 bits ausreichend. Vielleicht ist dies auch noch für ein paar Jahre so. Jedoch werden 32 bits nicht ausreichen, um in der Zukunft jedes Netzwerkgerät mit einer globalen Adresse ausstatten zu können. Denken Sie an Mobiltelefone, Autos (mit elektronischen Geräten an einem CAN Bus), Toaster, Kühlschränken, Lichtschalter usw.

Die IPv6 Designer haben 128 Bit gewählt, 4-mal mehr als im heutigen IPv4.

Aber die benutzbare Größe ist kleiner als es erscheinen mag, da in dem gegenwärtig definierten Adress-Schema 64 Bits für die Schnittstellen-Identifizierung verwendet werden. Die zweiten 64 Bit werden für das Routing verwendet. Die derzeitigen Aggregation-Levels (= Größe der zugeteilten IP-Blöcke) vorausgesetzt (/48, /32,...), ist eine Verknappung der Adressen weiterhin denkbar. Aber mit Sicherheit nicht in naher Zukunft.

Weitere Informationen finden Sie unter RFC 1715 / The H Ratio for Address Assignment Efficiency und RFC 3194 / The Host-Density Ratio for Address Assignment Efficiency.


2.4.3. IPv6 Adressen: Warum ist die Bit-Anzahl bei einem neuen Design so klein?

Es gibt (wahrscheinlich) eine Gruppe (bekannt ist nur Jim Fleming...) von Personen am Internet, die über IPv8 und IPv16 nachdenken. Für diese Designs gibt es aber keine hohe Akzeptanz und auch keine Kernel-Implementierungen. 128 bits sind die beste Wahl bezogen auf Header-Overhead und dem Datentransport. Denken Sie an die minimalste Maximum Transfer Unit (MTU) in IPv4 (575 octets) und in IPv6 (1280 octets), die Header-Länge in IPv4 (20 octets Minimum, kann bis zu 60 octets mit IPv4 Optionen ansteigen) und in IPv6 sind es 40 octets (fixer Wert). Dies ist 3.4 % der minimalen MTU in IPv4 und 3.1 % der minimalen MTU in IPv6. Dies bedeutet, dass der Overhead beim Header fast identisch ist. Mehr bits für die Adressierung würden größere Header und deshalb mehr Overhead erfordern. Bedenken Sie auch die maximale MTU von 1500 octets (in speziellen Fällen bei Jumbo-Paketen bis zu 9k octets) bei normalen Verbindungen (z.B. Ethernet). Letztlich wäre es kein korrektes Design, wenn 10 % oder 20 % der transportierten Daten in einem Schicht 3-Paket für Adressen und nicht für die ”Nutzlast” benötigt würden.


Kapitel 3. Adress-Typen

Wie bei IPv4 können IPv6-Adressen mittels Subnetzmasken (subnet masks) in einen Netz- und einen Host-Teil unterteilt werden.

Bei IPv4 hat sich gezeigt, dass es manchmal von Nutzen wäre, einem Interface mehr als eine IP-Adresse zuweisen zu können, je nach Bedarf und Zweck (aliases, multicast etc.). Um in Zukunft flexibler bleiben zu können, geht man bei IPv6 weiter und erlaubt pro Interface mehr als eine zugewiesene IP-Adresse. Derzeit sind durch die RFCs kein Limit gesetzt, wohl aber in der Implementierung des IPv6 Stacks (um DoS Attacken vorzubeugen).

Neben der großen Bit-Anzahl für Adressen definiert IPv6 basierend auf einigen vorangestellten Bits verschiedene Adress-Typen. Diese werden hoffentlich in der Zukunft niemals aufgehoben (zum Unterschied zu IPv4 heute und die Entwicklung der class A, B und C Netze).

Zur Unterstützung einer automatischen Konfiguration wird die Bitanzahl in einen Netzwerk-Teil (vordere 64 Bits) und einen Hostteil (hintere 64 Bits).


3.1. Adressen ohne speziellen Präfix

3.1.1. Localhost Adresse

Dies ist eine spezielle Adresse für das Loopback Interface, vergleichbar zur “127.0.0.1” bei IPv4. Bei IPv6 lautet die localhost Adresse:

0000:0000:0000:0000:0000:0000:0000:0001 

bzw. komprimiert:

::1

Pakete mit dieser Quell- bzw. Ziel-Adresse sollten niemals den sendenden Host verlassen.


3.1.2. Unspezifische Adresse

Dies ist eine spezielle Adresse vergleichbar mit “any” oder “0.0.0.0” bei IPv4. In IPv6 lautet sie:

0000:0000:0000:0000:0000:0000:0000:0000 

oder:

::

Diese Adresse wird meistens in Routing-Tabellen und beim “socket binding” (zu jeder IPv6 Adresse) angewendet bzw. gesehen.

Beachten: Die Unspezifizierte Adresse kann nicht als Ziel-Adresse verwendet werden.


3.1.3. IPv6 Adressen mit eingebetteter IPv4 Adresse

Es gibt zwei Adressen-Typen, die IPv4 Adressen enthalten können.


3.1.3.1. IPv4 Adressen in IPv6 Format

IPv4-only IPv6-kompatible Adressen kommen manchmal bei IPv6 kompatiblen Daemon zur Anwendung, die allerdings ausschließlich an IPv4 Adressen gebunden sind.

Diese Adressen sind mit einer speziellen Präfixlänge von 96 definiert (a.b.c.d. ist die IPv4 Adresse):

0:0:0:0:0:ffff:a.b.c.d/96

oder in komprimiertem Format:

::ffff:a.b.c.d/96

Die IPv4 Adresse 1.2.3.4. z.B. sieht wie folgt aus:

::ffff:1.2.3.4

3.1.3.2. IPv4 kompatible IPv6 Adressen

Dieser Adress-Typ wurde für das automatische Tunneln (RFC 2893 / Transition Mechanisms for IPv6 Hosts and Routers) verwendet, welches aber durch das 6to4 tunneling ersetzt wurde.

0:0:0:0:0:0:a.b.c.d/96

oder in komprimierter Form:

::a.b.c.d/96

3.2. Netzteil der Adresse (Präfix)

Es wurden einige Adress-Typen definiert und zugleich blieb für zukünftige Anforderungen ausreichend Raum für weitere Definitionen. In RFC 4291 / IP Version 6 Addressing Architecture wird das aktuelle Adress-Schema definiert.

Lassen Sie uns nun einen Blick auf die verschiedenen Präfixe (und somit auf die Adress-Arten) werfen::


3.2.1. Link-lokaler Adress-Typ

Es handelt sich um spezielle Adressen, die ausschließlich auf einem Link eines Interfaces gültig sind. Wird diese Adresse als Zieladresse verwendet, so kann das Paket niemals einen Router passieren. Die Adresse wird bei der Link-Kommunikation eingesetzt, z.B.:

  • Ist noch jemand anderer auf diesem Link?

  • Ist jemand mit einer speziellen Adresse hier (z.B. Suche nach einem Router)?

Die Adresse beginnt mit (wobei “x” für ein hexadezimales Zeichen steht, im Normalfall “0”)

fe8x:  <- zurzeit als einziger in Benutzung
-fe9x:
-feax:
-febx:

Eine Adresse mit diesem Präfix gibt es an jedem IPv6 fähigen Interface nach einer stateless automatischen Konfiguration (dies ist der Regelfall).


3.2.2. Site-lokaler Adress-Typ

Diese Adressen sind vergleichbar zu den RFC 1918 / Address Allocation for Private Internets im heutigen IPv4. Eine Neuerung und Vorteil hierbei ist, vergleichbar zum 10.0.0.0/8 im IPv4, die Nutzbarkeit von 16 bits bzw. ein Maximum von 65536 Subnetzen.

Ein weiterer Vorteil: Da man bei IPv6 mehr als eine Adresse an ein Interface binden kann, ist auch die Zuweisung einer site-local Adresse zusätzlich zu einer globalen Adresse möglich.

Die Adresse beginnt mit:

fecx:  <- meistens genutzt.
-fedx:
-feex:
-fefx:

(“x” ist ein hexadezimales Zeichen, normalerweise “0”)

Dieser Adresstyp ist nun abgekündigt RFC 3879 / Deprecating Site Local Addresses und sollte nicht mehr verwendet werden. Für Tests im Labor sind solche Adressen meineserachtens aber immer noch eine gute Wahl.


3.2.3. Unique Local IPv6 Unicast Adressen

Weil die schon früh definierten site-local Adressen nicht eindeutig sind, kann dies zu großen Problemen führen, wenn z.B. einst unabhängige Netzwerke später zusammengeschlossen werden (Überlappung von Subnetzen). Aufgrund dessen und anderer Gründe wurde ein neuer Adresstyp definiert, genant RFC 4193 / Unique Local IPv6 Unicast Addresses.

Die Adresse beginnt mit:

fcxx:
-fdxx:  <- zurzeit als einziger in Benutzung

Ein Teil des Präfix (40 Bits) werden pseudozufällig generiert. Es ist sehr unwahrscheinlich, daß zwei generierte Präfixe identisch sind.

Ein Beispiel für einen Präfix (generiert mit Hilfe des web-basierten Werkzeugs: Goebel Consult / createLULA):

fd0f:8b72:ac90::/48

3.2.4. Globaler Adress-Typ ("Aggregatable global unicast")

Heute gibt es ist per Definition eine globale Adress-Art (Das erste Design, ''Provider based'' genannt, wurde bereits vor einigen Jahren wieder aufgegeben RFC 1884 / IP Version 6 Addressing Architecture [obsolete]. Einige Überbleibsel hiervon sind in älteren Linux Kernelquellen noch zu finden.

Die Adresse beginnt mit (x sind hexadezimale Zeichen)

2xxx: 
-3xxx:

Hinweis: Der Zusatz “aggregatable” im Namen wird in aktuellen Drafts abgelegt. -Es sind weitere Subarten definiert:


3.2.4.1. 6bone Test-Adressen

Diese globalen Adressen waren die Ersten definierten und auch benutzen Adressen. Sie alle beginnen mit:

3ffe:

Beispiel:

3ffe:ffff:100:f102::1

Eine spezielle 6bone Test-Adresse, die niemals weltweit einmalig ist, beginnt mit

3ffe:ffff: 

und wird zumeist in alten Beispielen benutzt, um zu vermeiden, dass Anwender diese mit Copy & Paste in Ihre Konfigurationen übernehmen können. Auf diese Weise können Duplikate weltweit einmaliger Adressen aus Versehen bzw. Unachtsamkeit vermieden werden. Es würde für den Original-Host ernste Probleme bedeuten (z.B. Antwortpakete für niemals gesendete Anfragen bekommen...). -Aufgrund dessen, daß IPv6 nun produktiv ist, wird dieser Präfix nicht mehr länger delegiert und nach dem 6.6.2006 vom Routing ausgenommen (mehr unter RFC 3701 / 6bone Phaseout ).


3.2.4.2. 6to4 Adressen

Diese Adressen werden für einen speziellen Tunnelmechanismus verwendet [RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds und RFC 2893 / Transition Mechanisms for IPv6 Hosts and Routers]. Sie kodieren eine gegebene IPv4 Adresse, ein eventuelles Subnetz und beginnen mit

2002:

z.B. wird 192.168.1.1/5 repräsentiert durch:

2002:c0a8:0101:5::1

Ein kleines Shell-Kommando kann aus einer IPv4 eine 6to4 Adresse erstellen:

ipv4="1.2.3.4"; sla="5"; printf "2002:%02x%02x:%02x%02x:%04x::1" `echo $ipv4
-¬ | tr "." " "` $sla

Siehe auch tunneling using 6to4 und information about 6to4 relay routers.


3.2.4.3. Durch einen Provider zugewiesene Adressen für ein hierarchisches Routing

Diese Adressen werden an Internet Service Provider (ISP) delegiert und beginnen mit:

2001:

Präfixe für große ISPs (mit eigenem Backbone) werden durch local registries vergeben. Zurzeit wird ein Präfix mit der Länge 32 zugeteilt.

Grosse ISPs delegieren ihrerseits an kleinere ISPs ein Präfix mit der Länge 48.


3.2.4.4. Für Beispiele und Dokumentationen reservierte Adressen

Momentan sind zwei Adressbereiche für Beispiele und Dokumentationen RFC 3849 / IPv6 Address Prefix Reserved for Documentation reserviert:

3ffe:ffff::/32
-2001:0DB8::/32   EXAMPLENET-WF

Diese Adressbereiche sollten nicht geroutet werden und am Übergangsrouter zum Internet (basierend auf Absendeadressen) gefiltert werden.


3.2.5. Multicast-Addressen

Multicast-Adressen werden für entsprechende Dienste verwendet.

Sie beginnen immer mit (xx ist hierbei der Wert der Reichweite)

ffxy:

Die Adressen werden in Reichweiten und Typen unterteilt:


3.2.5.1. Multicast-Bereiche

Die Multicast Reichweite ist ein Parameter, mit dem die maximale Distanz angegeben werden kann, die ein Multicast Paket sich von der versendenden Einheit entfernen kann.

Zurzeit sind folgende Regionen (reichweiten) definiert:

  • ffx1: Node-lokal, Pakete verlassen niemals den Knoten

  • ffx2: Link-lokal, Pakete werden niemals von Routers weitergeleitet, der angegebene Link wird nie verlassen.

  • ffx5: Site-lokal, Pakete verlassen niemals den Standort (Site)

  • ffx8: organisationsweit, Pakete verlassen niemals eine Organisation (nicht einfach zu implementieren, dies muss durch das Routing Protokoll abgedeckt werden)

  • ffxe: Globale Reichweite

  • Sonstige sind reserviert


3.2.5.2. Multicast-Typen

Es sind bereits viele Typen definiert bzw. reserviert (siehe RFC 4291 / IP Version 6 Addressing Architecture für weitere Details), einige Beispiele:

  • All Nodes Adresse: ID = 1h, alle Hosts am lokalen Node (ff01:0:0:0:0:0:0:1) oder am angeschlossenen Link (ff02:0:0:0:0:0:0:1) werden adressiert.

  • All Routers Adresse: ID = 2h, alle Router am lokalen Node (ff01:0:0:0:0:0:0:2), am angeschlossenen Link (ff02:0:0:0:0:0:0:2) oder am lokalen Standort werden adressiert.


3.2.5.3. Erforderliche node link-local Multicast Adresse

Diese spezielle Multicast Adresse wird als Zieladresse bei der Erkundung des Nahbereichs verwendet, da es ARP bei IPv6 im Gegensatz zu IPv4 nicht mehr gibt.

Ein Beispiel für diese Adresse könnte sein:

ff02::1:ff00:1234

Das benutzte Präfix zeigt, dass es sich um eine link-lokale Multicast Adresse handelt. Dass Suffix wird aus der Zieladresse erstellt. In diesem Beispiel soll ein Paket zur Adresse “fe80::1234” gesendet werden, aber die Netzwerk-Schicht hat keine Kenntnis der aktuellen Schicht 2 MAC Adresse. Die oberen 104 bits werde mit “ff02:0:0:0:01:ff00::/104” ersetzt und die unteres 24 bits bleiben unverändert. Diese Adresse wird nun ”am Link” verwendet, um den entsprechenden Node zu finden, der wiederum seine Schicht 2 MAC Adresse als Antwort zurücksendet.


3.2.6. Anycast-Adressen

Anycast Adressen sind spezielle Adressen und werden verwendet, um besondere Bereiche wie den nächstgelegenen DNS-Server, den nächstliegenden DHCP Server und vergleichbare dynamische Gruppen abzudecken. Die Adressen werden dem Pool des Unicast Adressraums (global-aggregierbar oder Site-lokal zurzeit) entnommen. Der Anycast-Mechanismus (client view) wird von dynamischen Routing-Protokollen gehandhabt.

Hinweis: Anycast Adressen können nicht als Quelladresse verwendet werden, sondern ausschließlich als Zieladressen.


3.2.6.1. Subnet-Router Anycast-Adresse

Die Subnet-Router Anycast Adresse ist ein einfaches Beispiel für eine Anycast Adresse. Angenommen, der Knoten hat folgende global zugewiesene IPv6 Adresse:

2001:0db8:100:f101:210:a4ff:fee3:9566/64  <- Node's address

Die Subnet-Router Anycast Adresse wird durch komplette Streichung des Suffixes (die letzten gültigen 64 bits) erstellt:

2001:0db8:100:f101::/64  <- subnet-router anycast address

3.3. Adress-Typen (Host-Teil)

In Hinblick auf Auto-Konfigurations- und Mobilitätsfragen wurde entschieden, die niedrigeren 64 bits als Host-Bestandteil zu nutzen. Jedes einzelne Subnetz kann deshalb eine große Anzahl an Adressen enthalten.

Der Host-Teil kann aus unterschiedlichen Blickwinkeln betrachtet werden:


3.3.1. Automatisch erstellte Adressen (auch unter dem Namen stateless bekannt)

Bei der Auto-Konfiguration wird der Hostteil der Adresse durch die Konvertierung der MAC-Adresse eines Interfaces (falls vorhanden) zu einer einmaligen IPv6 Adresse (mittels EUI-64 Methode) generiert. Falls keine MAC-Adresse verfügbar ist (z.B. bei virtuellen Interfaces), wird anstelle dessen etwas anderes herangezogen (wie z.B. die IPv4 Adresse oder die MAC-Adresse eines physikalischen Interfaces).

Als Beispiel hat hier ein NIC folgende MAC-Adresse (48 bit):

00:10:a4:01:23:45

Diese wird gemäß demIEEE-Tutorial EUI-64 Design für EUI-48 Identifiers zum 64 bit Interface Identifier erweitert:

0210:a4ff:fe01:2345

Mit einem gegebenen Präfix wird daraus die schon oben gezeigte IPv6-Adresse:

2001:0db8:0100:f101:0210:a4ff:fe01:2345

3.3.1.1. Datenschutzproblem mit automatisch erstellten Adressen sowie eine Lösung

Der "automatisch generierte" Hostteil ist weltweit einmalig (mit Ausnahme, wenn der Hersteller einer NIC die gleiche MAC-Adresse bei mehr als einer NIC einsetzt). Die Client-Verfolgung am Host wird dadurch möglich, solange kein Proxy verwendet wird.

Dies ist ein bekanntes Problem und eine Lösung wurde dafür definiert: Datenschutz-Erweiterung, definiert in RFC 3041 / Privacy Extensions for Stateless Address Autoconfiguration in IPv6 (es gibt bereits ein neueres Draft: draft-ietf-ipv6-privacy-addrs-v2-*). Es wird von Zeit zu Zeit mittels eines statischen und eines Zufallswertes ein neues Suffix erstellt. Hinweis: Dies ist nur für ausgehende Client-Verbindungen sinnvoll und bei bekannten Servern nicht wirklich sinnvoll.


3.3.2. Manuell festgelegte Adressen

Bei Servern ist es wahrscheinlich leichter, sich einfachere Adressen zu merken. Dies kann z.B. mit der Zuweisung einer zusätzlichen IPv6 Adresse an ein Interface geschehen.

2001:0db8:100:f101::1

Für das manuelle Suffix, wie “::1” im obigen Beispiel, muss das siebte höchstwertige Bit auf 0 gesetzt sein (das universale/local Bit des automatisch generierten Identifiers). Es sind auch noch andere (ansonsten nichtausgewählte) Bit-Kombinationen für Anycast-Adressen reserviert.


3.4. Präfixlängen für das Routing

Um eine maximale Reduktion an Routing-Tabellen zu erzielen, war in der frühen Design-Phase noch ein vollkommen hierarchischer Routing-Ansatz vorgesehen. Die Überlegungen hinter diesem Ansatz waren die gegenwärtigen IPv4 Routing-Einträge in den Haupt-Routern (mit über 400.000 Einträgen im Jahr 2013) sowie die Reduktion des Speicherbedarfs für die Routing-Tabellen bei Hardware-Routern (ASIC “Application Specified Integrated Circuit”, speziell konstuierter Chip) sowie ein daraus resultierender Geschwindigkeitszuwachs (weniger Einträge ergeben hoffentlich schnellere Abfragen).

Heutiger Standpunkt ist, dass das Routing für Netzwerke mit nur einem Service Provider hauptsächlich mit einem hierarchischen Design realisiert wird. Eine solche Vorgehensweise ist nicht möglich, wenn mehr als eine ISP-Verbindung besteht. Diese Problematik wird unter dem Thema multi-homing diskutiert (Infos zu multi-homing: drafts-ietf-multi6-*,IPv6 Multihoming Solutions).


3.4.1. Präfixlängen ("netmasks" genannt)

Vergleichbar zu IPv4, handelt es sich hierbei um den routbaren Netzwerkpfad für das stattfindende Routing. Da die Standard-Notierung der Netzmaske von 128 bit nicht sehr fein aussieht, verwenden die Designer das aus IPv4 bekannte Classless Inter Domain Routing Schema (CIDR, RFC 1519 / Classless Inter-Domain Routing). Mit Hilfe des CIDR wird die Bitanzahl der IP Adresse festgelegt, welche für das Routing verwendet werden. Diese Methode wird auch als "Slash"-Notation genannt.

Ein Beispiel:

2001:0db8:100:1:2:3:4:5/48

Diese Notation wird erweitert zu:

  • Netzwerk:

2001:0db8:0100:0000:0000:0000:0000:0000

  • Netzmaske:

ffff:ffff:ffff:0000:0000:0000:0000:0000

3.4.2. Zutreffende Routen

Im Normalfall (ohne QoS) ergibt eine Suche in der Routing-Tabelle eine Route mit der signifikantesten Adress-Bit-Anzahl, d.h. jene Route mit der größten Präfix-Länge wird zuerst herangezogen.

Wenn z.B. eine Routing-Tabelle folgende Einträge zeigt (Liste ist nicht komplett):

2001:0db8:100::/48     ::            U  1 0 0 sit1 
-2000::/3               ::192.88.99.1 UG 1 0 0 tun6to4

Die gezeigten Zieladressen der IPv6 Pakete werden über die entsprechenden Geräte geroutet

2001:0db8:100:1:2:3:4:5/48  ->  routed through device sit1
-2001:0db8:200:1:2:3:4:5/48  ->  routed through device tun6to4

Kapitel 4. IPv6 System-Check

Bevor Sie IPv6 auf einem Linux Host einsetzen können, müssen sie überprüfen, ob das System IPv6 fähig ist. Eventuell haben Sie Änderungen vorzunehmen, um IPv6 zu ermöglichen.


4.1. IPv6 kompatibler Kernel

Neuere Linux Distributionen beinhalten bereits einen IPv6-fähigen Kernel. Die IPv6-Funktionalität wird im Allgemeinen als Modul kompiliert. Es ist aber durchaus möglich, dass das Modul nicht automatisch beim Start des Betriebssystems geladen wird.

Hinweis: Sie sollten die Kernel Serie 2.2.x nicht mehr verwenden, da die IPv6-Implementierung nicht mehr aktuell ist. Auch die in der Serie 2.4.x wird nicht mehr weiterentwickelt bzgl. der Definitionen in den neueren RFCs. Es wird empfohlen, einen aus der Serie 2.6.x zu verwenden.


4.1.1. Überprüfung der IPv6 Unterstützung im aktuellen Kernel

Um zu überprüfen, ob ihr aktueller Kernel IPv6 unterstützt, sollten sie einen Blick in ihr /proc-Dateisystem werfen. Folgende Einträge müssen existieren:

/proc/net/if_inet6

Einen kleinen automatischen Test können Sie wie folgt durchführen:

# test -f /proc/net/if_inet6 && echo "Running kernel is IPv6 ready"

Wenn dieser Test negativ verläuft, ist das IPv6 Modul aller Wahrscheinlichkeit noch nicht geladen.


4.1.2. IPv6 Module laden

Mit folgenden Befehl können Sie versuchen, das Modul zu laden:

# modprobe ipv6

Wenn dieser Befehl positiv verläuft, dann sollten Sie das Modul mit folgendem Befehl auflisten können:

# lsmod |grep -w 'ipv6' && echo "IPv6 module successfully loaded"

Der obige Test sollte nun erfolgreich verlaufen.

Hinweis: Ein Entfernen des Moduls im laufenden System wird derzeit nicht unterstützt und kann unter gewissen Bedingungen zu einem Absturz des Kernels führen.


4.1.2.1. Automatisches Laden des Moduls

Es ist möglich das IPv6 Modul bei Bedarf automatisch zu laden. Sie müssen nur folgende Zeile in die Konfigurationsdatei des kernel modul loaders eintragen (normalerweise: /etc/modules.conf oder /etc/conf.modules):

alias net-pf-10 ipv6  # automatically load IPv6 module on demand

Mit der folgenden Zeile ist es auch möglich, das automatische Laden des IPv6 Moduls auszuschalten.

alias net-pf-10 off   # disable automatically load of IPv6 module on demand

Anmerkung: In Kernel Series 2.6.x wurde der Modul-Lade-Mechanismus geändert. Die neue Konfigurationsdatei wird anstelle /etc/modules.conf nun /etc/modprobe.conf genannt.


4.1.3. Kernel-Kompilierung mit IPv6 Funktionalität

Wenn beide oben gezeigten Methoden ohne Erfolg blieben und ihr Kernel somit keine IPv6 Unterstützung bietet, dann haben Sie folgende Optionen:

  • Aktualisieren Sie Ihre Distribution mit einer Version, die von Haus aus IPv6 unterstützt (empfohlen für Anfänger),

  • Sie können einen Standard-Kernel kompilieren (einfach, wenn Sie die benötigten Optionen kennen)

  • Kompilieren Sie die Kernel-Quellen ihrer Distribution (manchmal nicht ganz so einfach)

  • Kompilieren Sie einen Kernel mit den USAGI-Erweiterungen

Falls Sie sich dazu entscheiden, einen neuen IPv6 kompatiblen Kernel zu kompilieren, sollten Sie auf jeden Fall bereits Erfahrung mit der Kernel-Kompilierung haben sowie das Linux Kernel HOWTO lesen.

Ein Vergleich zwischen dem Standard-Kernel und dem Kernel mit USAGI-Erweiterungen ist verfügbar unter IPv6+Linux-Status-Kernel.


4.1.3.1. Kompilieren eines Standard-Kernels

Detailliertere Ausführungen zur Kompilierung eines IPv6 fähigen Kernels finden Sie unter IPv6-HOWTO-2#kernel.

Hinweis: Sie sollten wann immer möglich die Kernel Serie 2.6.x oder höher einsetzen, da die IPv6 Unterstützung der Serie 2.4.x nur einige Backports erhält und die IPv6-Unterstützung von Serie 2.2.x hoffnungslos veraltet ist und nicht mehr weiterentwickelt wird.


4.1.3.2. Kompilieren eines Kernels mit USAGI-Erweiterungen

Wie für den Standard-Kernel gilt auch hier, dass das Kompilieren des Kernels nur fortgeschrittenen Benutzern empfohlen wird, die mit IPv6 und dem Kompilieren des Kernels bereits vertraut sind.

Siehe auch USAGI project / FAQ und Obtaining the best IPv6 support with Linux (Article) (Spiegel).


4.1.4. IPv6 kompatible Netzwerkgeräte

Nicht alle Netzwerkgeräte sind bereits (bzw. überhaupt) dazu in der Lage, IPv6 Pakete übertragen zu können. Den aktuellen Status können Sie unter IPv6+Linux-status-kernel.html#transport.

Ein entscheidender Punkt ist die Tatsache, dass ein IPv6 Paket wegen der Struktur der Netzwerkschicht in der Kernel-Implementierung nicht wirklich aufgrund der IP-Header-Nummer (6 anstelle 4) wiedererkannt wird. Es wird aufgrund der Protokollnummer der Schicht 2 Transport-Protokolls wiedererkannt. Folglich können IPv6 Pakete von keinem Transport-Protokoll verwendet werden, welche diese Protokoll-Nummer nicht nutzen. Hinweis: Das Paket wird nach wie vor über den Link transportiert, aber auf der Empfänger-Seite kann das Paket nicht verarbeitet werden (Sie können dies z.B. mit tcpdump sehen).


4.1.4.1. Gegenwärtig bekannte Verbindungsarten, die niemals IPv6 fähig sein werden

  • Serial Line IP (RFC 1055 / SLIP), auch SLIPv4 genannt; das Gerät heißt: s1X

  • Parallel Line IP (PLIP), gleich dem SLIP, Gerätename: plipX

  • ISDN mit rawip Encapsulation; Gerätename: isdnX


4.1.4.2. Bekannte Verbindungsarten, die gegenwärtig IPv6 nicht unterstützen

  • ISDN mit syncppp Encapsulation; Gerätename: ipppX (Designfrage des ipppd; in der Kernel Serie 2.5.x wird ipppX in einer allgemeinen PPP Schicht inkludiert)


4.2. IPv6 kompatible Tools zur Netzwerkkonfiguration

Ohne entsprechende Tools zur Konfiguration von IPv6 würden Sie mit einem IPv6 fähigen Kernel nicht weit kommen. Es gibt verschiedene Pakete womit IPv6 konfiguriert werden kann.


4.2.1. net-tools Paket

Das Paket net-tool beinhaltet einige Tools wie ifconfig und route. Mit den Tools kann IPv6 auf einem Interface konfiguriert werden. Sehen Sie sich die Ausgabe des Befehls ifconfig -? Bzw. route -? an. Finden Sie in der Ausgabe die Worte IPv6, inet6 oder Ähnliches, dann ist das Tool IPv6-kompatibel.

Automatische Überprüfung:

# /sbin/ifconfig -? 2>& 1|grep -qw 'inet6' && echo "utility 'ifconfig' is
-¬ IPv6-ready"

Folgenden Check gibt es für route:

# /sbin/route -? 2>& 1|grep -qw 'inet6' && echo "utility 'route' is IPv6-ready"

4.2.2. iproute Paket

Alexey N.Kuznetsov (gegenwärtig ein Betreuer des Linux Network Codes) erstellte eine Tool-Sammlung, womit das Netzwerk mittels dem netlink Device konfiguriert wird. Diese Tool-Sammlung stellt mehr Funktionalität als das net-tools Paket zur Verfügung, ist aber nicht sehr umfangreich dokumentiert und nichts für schwache Nerven.

# /sbin/ip 2>&1 |grep -qw 'inet6' && echo "utility 'ip' is IPv6-ready"

Wird das Programm /sbin/ip nicht gefunden, dann wird die Installation des iproute Paketes empfohlen.

  • Sie können dies (falls beinhaltet) von der benutzten Linux-Distribution installieren

  • Sie können nach einem passenden RPM Paket unter RPMfind/iproute suchen (manchmal ist auch das kompilieren eines SRPMS Paketes zu empfohlen)


4.3. IPv6 Test/Debug-Programme

Nachdem Sie ihr System auf IPv6 vorbereitet haben, wollen Sie nun IPv6 für die Netzwerkkommunikation einsetzen. Zuerst sollten Sie lernen, IPv6 Pakete mit einem Sniffer Programm zu untersuchen. Dies ist zu empfehlen, denn in Hinblick auf Fehlersuche und Troubleshooting kann das Durchführen einer schnellen Diagnose von Nutzen sein.


4.3.1. IPv6 ping

Das Programm ist normalerweise im Paket iputils beinhaltet. Durch senden von ICMPv6 echo-request Paketen und warten auf ICMPv6 echo-reply Paketen können einfache Transport-Tests durchgeführt werden.

Anwendung

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

Einige Implementierungen unterstützen auch %<device> Definition zusätzlich zu -I <device>, z.B.

# ping6 <link-local-ipv6address>%<device>

Beispiel

# 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

Hinweis: ping6 benötigt direkten Zugriff auf den Socket und hierfür Root-Rechte. Wenn Nicht-Root-Benutzer ping6 nicht benutzen können, kann dies zwei Ursachen haben:

  1. ping6 ist nicht im Pfad des Benutzers eingetragen; ping6 ist allgemein in /usr/sbin zu finden -> Lösung: Den Pfad ergänzen (nicht empfohlen)

  2. ping6 lässt sich im Allgemeines wegen fehlender Root-Rechte nicht korrekt ausführen -> Lösung: chmod u+s /usr/sbin/ping6


4.3.1.1. Das Interface für einen IPv6 ping bestimmen

Wenn link-lokale Adressen für ein IPv6 ping verwendet werden, dann hat der Kernel keine Kenntnis darüber, durch welches (physikalische oder virtuelle) Gerät das Paket gesendet werden muss - jedes Gerät hat eine link-lokale Adresse. Ein Versuch resultiert in folgender Fehlermeldung:

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

In diesem Fall müssen Sie das Interface zusätzlich spezifizieren:

# 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

Beispiel für %<device> Notation:

# ping6 -c 1 fe80::2e0:18ff:fe90:9205%eth0

4.3.1.2. Ping6 zu Multicast-Adressen

Ein interessanter Mechanismus zum Aufspüren eines IPv6 aktiven Hosts am Link ist mit ping6 an eine link-lokale all-node Multicast Adresse zu pingen.

# 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!) 

Beispiel für %<device> Notation:

# ping6 ff02::1%eth0

Bei IPv6 kann dieses Verhalten zurzeit, im Gegensatz zu IPv4, wo Antworten auf ein Ping auf die Broadcast Adresse unterdrückt werden können, nicht unterbunden werden. Ausnahme hierbei ist der Einsatz der lokalen IPv6 Firewall-Funktionalität.


4.3.2. IPv6 traceroute6

Dieses Programm ist normal im Paket iputils enthalten. Es ist ein Programm vergleichbar dem IPv4 traceroute. Unten sehen Sie ein Beispiel:

# traceroute6 www.6bone.net 
-traceroute to 6bone.net (3ffe:b00:c18:1::10) from 2001:0db8:0000:f101::2, 30
-¬ hops max, 16 byte packets 
- 1 localipv6gateway (2001:0db8: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

Anmerkung: Im Unterschied zu modernen IPv4 traceroute Versionen, welche den Einsatz von ICMPv4-echo-request Paketen wie auch UDP Paketen (default) ermöglichen, können mit IPv6-traceroute nur UDP Pakete versendet werden. Wie Sie vielleicht bereits wissen, werden von Firewalls bzw. von ACLs auf Routern ICMP echo-request Pakete mehr akzeptiert als UDP Pakete.

Falls ein Interface spezifiziert werden muß, kann dies durch -i <device> oder in der Form <address>%<device> erfolgen.


4.3.3. IPv6 tracepath6

Dieses Programm ist normalerweise im Paket iputils enthalten. Das Programm ist dem traceroute6 ähnlich, es gibt den Weg zu einem angegebenen Ziel wieder und misst hierbei den MTU-Wert. Unten sehen Sie ein Beispiel:

# 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. IPv6 tcpdump

In Linux ist tcpdump ein Haupttool zum aufzeichnen von Paketen. Weiter unten sehen Sie einige Beispiele. Normalerweise ist die Ipv6-Unterstützung in der aktuellen Version 3.6 gegeben.

Bei tcpdump werden zur Geräuschminimierung bei der Paket-Filterung Ausdrücke eingesetzt:

  • icmp6: ICMPv6 Datenverkehr wird gefiltert

  • ip6: IPv6 Datenverkehr (inkl.ICMPv6) wird gefiltert

  • proto ipv6: getunnelter IPv6-in-IPv4 Datenverkehr wird gefiltert

  • not port ssh: zum unterdrücken der Anzeige von SSH Paketen während der Ausführung von tcpdump bei einer remote SSH-Sitzung

Ebenfalls sind einige Kommandozeilen-Optionen sehr hilfreich, um detailliertere Informationen über die Pakete erlangen und protokollieren zu können. Für ICMPv6 Pakete sind hauptsächlich interessant:

  • “-s 512”: Bei der Aufzeichnung der Pakete wird die zu Aufzeichnungslänge auf 512 bytes vergrößert

  • “-vv”: wirklich sehr ausführliche Ausgabe

  • “-n”: Adressen werden nicht in Namen aufgelöst. Dies ist hilfreich, wenn die Reverse-DNS-Auflösung nicht sauber arbeiten sollte


4.3.4.1. IPv6 ping zur Adresse 2001:0db8:100:f101::1 über einen lokalen Link

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

4.3.4.2. IPv6 ping zur Adresse 2001:0db8:100::1 über einen IPv6-in-IPv4 Tunnel geroutet

1.2.3.4. und 5.6.7.8. sind Tunnel-Endpunkte (alle Adressen sind Beispiele)

# 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 > 2001:0db8:100::1: icmp6: echo request
-¬ (len 64, hlim 64) (DF) (ttl 64, id 0, len 124) 
-5.6.7.8 > 1.2.3.4: 2001:0db8: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 > 2001:0db8:100::1: icmp6: echo request
-¬ (len 64, hlim 64) (DF) (ttl 64, id 0, len 124) 
-5.6.7.8 > 1.2.3.4: 2001:0db8:100::1 > 2002:ffff:f5f8::1: icmp6: echo reply (len
-¬ 64, hlim 61) (ttl 23, id 29919, len 124)

4.4. IPv6 kompatible Programme

Aktuelle Distributionen beinhalten bereits die gängigsten IPv6 kompatiblen Client- und Server-Programme. Weitere Infos gibt es unter IPv6+Linux-Status-Distribution. Falls ein Programm hier noch nicht gelistet sein sollte, können Sie unter Current Status of IPv6 Support for Networking Applications nachlesen, ob das Programm bereits auf IPv6 portiert wurde und unter Linux bereits läuft. Für verbreitete Programme gibt es einige Hinweise hier weiter unten.


4.5. IPv6 kompatible Client-Programme (Auswahl)

Um die folgend abgebildeten Tests durchzuführen, benötigen Sie ein funktionierendes IPv6 System. Bei einigen Beispielen werden Adressen angezeigt, die nur bei einer verfügbaren 6bone Verbindung erreichbar sind.

Note: wenn Namen anstatt dedizierter IPv4/IPv6 Adressen benutzt werden, dann kann dieser zu einer Liste von IPv4 und IPv6 Adressen aufgelöst werden. Einige Kommandozeilenwerkzeuge unterstützen explizite Benutzung des gewünschten Protokolls. Üblicherweis haben solche Werkzeuge Optionen wie “-4” für IPv4 und “-6” für IPv6.


4.5.1. DNS-Überprüfung der IPv6 Adress-Auflösung

Jeder DNS-Server (Domain Name System) sollte aufgrund der Sicherheitsupdates der letzten Jahre bereits mit neuerer Software bestückt sein, die den Übergangs-IPv6-Adress-Standardtyp AAAA unterstützt (der neueste Standardtyp - A6 genannt - wird nur von BIND9 und höheren Versionen unterstützt und ist daher noch nicht allzu verbreitet. Ebenfalls nicht unterstützt wird die root Domain IP6.ARPA). Ein einfacher Test zum überprüfen der IPv6 Adress-Auflösung ist:

# host -t AAAA www.join.uni-muenster.de

Die Ausgabe des Tests sollte etwa wie folgt sein:

www.join.uni-muenster.de. is an alias for tolot.join.uni-muenster.de. 
-tolot.join.uni-muenster.de. has AAAA address
-¬ 2001:638:500:101:2e0:81ff:fe24:37c6

4.5.2. IPv6 kompatible Telnet Client-Programme

IPv6 kompatible Clients sind verfügbar. Ein einfacher Test sieht wie folgt aus:

$ 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.

Wird ein Text wie “cannot resolve hostname” ausgegeben, dann unterstützt der Telnet Client keine IPv6 Adressen.


4.5.3. IPv6 kompatible ssh Client-Programme

4.5.3.1. openssh

Aktuelle openssh-Versionen sind IPv6 kompatibel. Abhängig von der Konfiguration vor der Kompilierung gibt es zwei unterschiedliche Verhaltensweisen:

  • --without-ipv4-default: Der Client versucht zuerst eine IPv6-Verbindung. Misslingt dies, wird eine IPv4-Verbindung aufgebaut

  • --with-ipv4-default: standardmäßig wird eine IPv4-Verbindung aufgebaut. Eine IPv6-Verbindung muss, wie unten im Beispiel zu sehen ist, erzwungen werden:

$ ssh -6 ::1 
-user@::1's password: ****** 
-[user@ipv6host user]$

Falls ihr ssh Client-Programm die Option “-6” nicht kennt, dann ist das Programm nicht IPv6 fähig. Dies ist bei den meisten ssh Paketen der Version 1 der Fall.


4.5.3.2. ssh.com

SSH.com's SSH Client und Server sind ebenfalls IPv6 kompatibel und darüber hinaus handelt es sich um freie Programme für die Linux- und FreeBSD-Plattform, unabhängig davon, ob sie zu kommerziellem oder zu persönlichen Zweck verwendet werden.


4.5.4. IPv6 kompatible Web-Browser

Einen aktuellen Statusüberblick zum Thema IPv6 kompatible Web-Browser ist unter Current Status of IPv6 Support for Networking Applications - HTTP verfügbar.

Die meisten Browser haben zurzeit noch ungelöste Probleme

  1. Ist ein IPv4 Proxy in den Einstellungen eingetragen, dann werden IPv6 Anfragen zum Proxy gesendet. Der Proxy kann keine IPv6 Anfragen verstehen und somit scheitert die Anfrage. Lösung: Proxy Software aktualisieren (siehe weiter unten).

  2. Automatik-Einstellungen des Proxy (*.pac) können aufgrund ihrer Beschaffenheit nicht derart erweitert werden, dass sie IPv6 Anfragen anders handhaben (z.B. kein Proxy verwenden) können (Sie sind in Javaskript geschrieben und ziemlich hard coded in den Quellen verankert; z.B. Mozilla Quellcode).

Ältere Browser-Versionen verstehen ebenfalls keine URL mit IPv6 Adressen wie z.B. http://[2001:4dd0:f838:a006::6]/, IPv6-Addresse von http://www.ipv6.bieringer.de/ (die angegebene URL funktioniert nur mit einem IPv6 kompatiblen Browser!).

Ein kleiner Test ist diese URL mit einem gegebenen Browser und ohne Proxy zu verwenden.


4.5.4.1. URLs zum testen

Ein guter Ausgangspunkt zum Betrachten von Webseiten mit IPv6 ist http://www.kame.net/. Ist die Schildkröte animiert, dann ist Verbindung mittels IPv6 Verbindung zustande gekommen, andererseits bleibt die Schildkröte statisch.

Andere Test-Server sind z.B.


4.6. IPv6 kompatible Server

In diesem Teil des HOWTOs wird stärker auf Client-spezifische Belange eingegangen. Folglich sei zu IPv6 kompatiblen Servern wie sshd, httpd, telnetd usw. auf diese Stelle verwiesen: Hints for IPv6-enabled daemons.


4.7. FAQ (IPv6 Systemcheck)

4.7.1. Anwendung diverser Tools

4.7.1.1. Q: ping6 zu einer link-lokalen Adresse funktioniert nicht

Fehlermeldung: "connect: Invalid argument"

Der Kernel hat keine Kenntnis darüber, welchen physikalischen oder virtuellen Link Sie zum versenden von ICMPv6 Paketen verwenden möchten. Aus diesem Grund wird die Fehlermeldung ausgegeben.

Lösung: Spezifizieren Sie den Link, z.B.: “ping6 -I eth0 fe80::2e0:18ff:fe90:9205”. Siehe auch program ping6 usage.


4.7.1.2. Q: ping6 oder traceroute6 funktioniert nicht als normaler Benutzer

Fehlermeldung: “icmp socket: Operation not permitted

Diese Tools erzeugen spezielle ICMPv6 Pakete und versenden diese unter Verwendung von raw sockets im Kernel. Raw sockets können aber nur vom Benutzer “root” verwendet werden. Normale Benutzer bekommen aus diesem Grund diese Fehlermeldung.

Lösung: Wenn wirklich alle Benutzer auf diese Tools zugreifen sollen, können Sie dies mit setzen des “suid” bits mittels “chmod u+s / path/to/program” erreichen (siehe auch program ping6 usage). Falls nicht alle Benutzer das Programm benötigen, können Sie die Gruppenzugehörigkeit des Programms ändern, z.B. Gruppe “wheel”. Fügen Sie alle Benutzer zu dieser Gruppe hinzu und entfernen Sie das execution bit für andere Benutzer mittels “chmod o-rwx /path/to/program”. Alternativ können Sie auch “sudo” dazu verwenden, um Ihren Sicherheitsbestimmungen Rechnung zu tragen.


Kapitel 5. Interface-Konfiguration

5.1. Unterschiedliche Netzwerk-Geräte

Ein Knoten besitzt mehrere Netzwerk-Devices, die in Klassen zusammengefasst werden können:

  • Physikalische Devices wie eth0, tr0

  • Virtuelle Devices wie ppp0, tun0, tap0, sit0, isdn0, ippp0


5.1.1. Physikalische Devices

Physikalische Interfaces wie Ethernet oder Token-Ring bedürfen keiner speziellen Handhabung.


5.1.2. Virtuelle Devices

Virtuelle Interfaces hingegen benötigen immer eine spezielle Konfiguration.


5.1.2.1. IPv6-in-IPv4 Tunnel Interfaces

Diese Interfaces werden sitx genannt. Der Name sit ist eine Abkürzung für Simple Internet Transition. Das Gerät hat die Fähigkeit IPv6 Pakete in IPv4 Pakete zu verkapseln und diese dann über einen Tunnel zum entfernten Endpunkt zu transportieren.

sit0 hat eine spezielle Bedeutung: dieses Interface kann nicht für fest zugeordnete Tunnel verwendet werden.


5.1.2.2. PPP Interfaces

PPP Interfaces beziehen ihre IPv6 Funktionalität von einem IPv6 kompatiblen PPP Daemon.


5.1.2.3. ISDN HDLC Interfaces

Für HDLC mit IP encapsulation ist die IPv6 Funktionalität bereits im Kernel integriert.


5.1.2.4. ISDN PPP Interfaces

ISDN PPP Interfaces (ippp) werden durch den Kernel nicht mit IPv6 Funktionalität unterstützt. Es gibt auch keine Pläne hierfür, da im Kernel 2.5.+ dieser Interface-Typ durch eine allgemeinere ppp Interface Schicht ersetzt werden soll.


5.1.2.5. SLIP + PLIP

Wie bereits erwähnt, unterstützen diese Interfaces keinen IPv6 Transport (senden ist ok, das abfertigen ankommender Pakete funktioniert jedoch nicht).


5.1.2.6. Ether-tap Device

Ether-tap Devices sind IPv6 kompatibel und als stateless konfiguriert. Für den Gebrauch muss das Modul “ethertap” geladen werden.


5.1.2.7. tun Device

Nicht von mir getestet...


5.1.2.8. ATM

01/2002: ATM wird vom Standard-Kernel nicht, jedoch aber durch die USAGI-Erweiterungen unterstützt.


5.1.2.9. Sonstige

Wurde ein Interface vergessen...?


5.2. Interfaces ein/aus-schalten

Es gibt zwei Methoden, ein Interface ein- oder auszuschalten.


5.2.1. Verwendung von "ip"

Gebrauch:

# ip link set dev <interface> up
-# ip link set dev <interface> down

Beispiel:

# ip link set dev eth0 up
-# ip link set dev eth0 down

5.2.2. Verwendung von "ifconfig"

Gebrauch:

# /sbin/ifconfig <interface> up
-# /sbin/ifconfig <interface> down

Beispiel:

# /sbin/ifconfig eth0 up
-# /sbin/ifconfig eth0 down

Kapitel 6. IPv6 Adressen konfigurieren

Es gibt verschiedene Methoden zum konfigurieren einer IPv6 Adresse eines Interfaces. Sie können "ifconfig" oder "ip" dazu einsetzen.


6.1. Bestehende IPv6 Adressen anzeigen

Zuerst sollten sie überprüfen, ob und welche IPv6 Adressen bereits konfiguriert sind (etwa durch automatischer stateless Konfiguration).

Achtung: Adressen beginnend mit “fec0” sind obsolet, hier aber noch der Vollständigheit wegen gezeigt!


6.1.1. Verwendung von "ip"

Anwendung:

# /sbin/ip -6 addr show dev <interface>

Beispiel für einen statisch konfigurierten Host:

# /sbin/ip -6 addr show dev eth0
-2: eth0: <BROADCAST,MULTICAST,UP&gt; mtu 1500 qdisc pfifo_ fast qlen 100
-inet6 fe80::210:a4ff:fee3:9566/10 scope link
-inet6 2001:0db8:0:f101::1/64 scope global
-inet6 fec0:0:0:f101::1/64 scope site 

Just note that addresses beginning with “fec0” are deprecated!

Beispiel für einen automatisch konfigurierten Host.

Hier sehen Sie einige automatisch konfigurierte IP Adressen und deren Lebensdauer.

# /sbin/ip -6 addr show dev eth0 
-3: eth0: <BROADCAST,MULTICAST,PROMISC,UP&gt; mtu 1500 qdisc pfifo_fast qlen
-¬ 100 
-inet6 2002:d950:f5f8:f101:2e0:18ff:fe90:9205/64 scope global dynamic 
-valid_lft 16sec preferred_lft 6sec 
-inet6 3ffe:400:100:f101:2e0:18ff:fe90:9205/64 scope global dynamic 
-valid_lft 2591997sec preferred_lft 604797sec inet6 fe80::2e0:18ff:fe90:9205/10
-¬ scope link

6.1.2. Verwendung von "ifconfig"

Anwendung:

# /sbin/ifconfig <interface>

Hier sehen Sie verschiedene IP Adressen mit unterschiedlichen Gültigkeitsbereichen (die Ausgabe wurde mit grep gefiltert)

# /sbin/ifconfig eth0 |grep "inet6 addr:"
-inet6 addr: fe80::210:a4ff:fee3:9566/10 Scope:Link
-inet6 addr: 2001:0db8:0:f101::1/64 Scope:Global
-inet6 addr: fec0:0:0:f101::1/64 Scope:Site

6.2. Hinzufügen einer IPv6 Adresse

Die Vorgehensweise beim hinzufügen einer IPv6 Adresse ist vergleichbar mit dem "IP ALIAS"-Mechanismus bei IPv4 adressierten Interfaces.


6.2.1. Verwendung von "ip"

Anwendung:

# /sbin/ip -6 addr add <ipv6address>/<prefixlength> dev <interface> 

Beispiel:

# /sbin/ip -6 addr add 2001:0db8:0:f101::1/64 dev eth0 

6.2.2. Verwendung von "ifconfig"

Anwendung:

# /sbin/ifconfig <interface> inet6 add <ipv6address>/<prefixlength>

Beispiel:

# /sbin/ifconfig eth0 inet6 add 2001:0db8:0:f101::1/64 

6.3. IPv6 Adressen entfernen

Diese Funktion wird selten benötigt. Vorsicht ist beim entfernen nicht existenter IPv6 Adressen geboten, da ältere Kernel dieses Fehlverhalten manchmal mit einem Crash quittieren.


6.3.1. Verwendung von "ip"

Anwendung:

# /sbin/ip -6 addr del <ipv6address>/<prefixlength> dev <interface> 

Beispiel:

# /sbin/ip -6 addr del 2001:0db8:0:f101::1/64 dev eth0 

6.3.2. Verwendung von "ifconfig"

Anwendung:

# /sbin/ifconfig <interface> inet6 del <ipv6address>/<prefixlength>

Beispiel:

# /sbin/ifconfig eth0 inet6 del 2001:0db8:0:f101::1/64

6.4. Automatische IPv6-Adress-Konfiguration

Im Fall, dass ein Endgerät ein Router Advertisement empfängt und der Host kein Router ist, konfiguriert sich das Endgerät selbst eine IPv6-Adresse entsprechend dem Präfix aus dem Router Advertisement (siehe auch Abschnitt 22.4).


6.5. Aktivieren der Privacy Extension

Privacy Extension wie beschrieben in RFC 4941 / Privacy Extensions for Stateless Address Autoconfiguration in IPv6 (Nachfolger von RFC 3041) ersetzt die statische Interface ID (mostly basierend auf der weltweit eindeutigen MAC-Adresse), die bei der Autokonfiguration benutzt wird, durch eine pseudo-random und von Zeit zu Zeit neu generierte.


6.5.1. Aktivieren von Privacy Extension mit Hilfe von sysctl

Temporäre Aktivierung

Einschalten der Privacy Extension für z.B. Interface “eth0” und zudem Präferieren dieser Adresse:

# sysctl -w net.ipv6.conf.eth0.use_tempaddr=2

Zur Aktivierung ist der Restart des Interfaces notwendig

# ip link set dev eth0 down
-# ip link set dev eth0 up

Nach Empfang eines Router Advertisement sollte das Interface eine entsprechende Adresse sich selbst konfiguriert haben

# ip -6 addr show dev eth0
-2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
-    inet6 2001:db8:0:1:8992:3c03:d6e2:ed72/64 scope global secondary dynamic   <- pseudo-random IID
-       valid_lft 604711sec preferred_lft 86311sec
-    inet6 2001:db8:0:1::224:21ff:fe01:2345/64 scope global     <- IID based on MAC
-       valid_lft 604711sec preferred_lft 86311sec
-    ...

Permanente Aktivierung

Für eine permanente Aktivierung muss entweder ein spezieller Initscript-Wert pro Interface gesetzt sein oder ein entsprechender Wert in /etc/sysctl.conf definiert werden:

net.ipv6.conf.eth0.use_tempaddr=2

Achtung: das Interface muss zu diesem Zeitpunkt bereits existieren. Wenn das nicht der Fall ist (z.B. nach einem Reboot) musses für alle Interfaces konfiguriert werden:

net.ipv6.conf.all.use_tempaddr=2
-net.ipv6.conf.default.use_tempaddr=2

Die Änderungen in /etc/sysctl.conf können im laufenden Betrieb geändert werden, aber zur wirklichen Aktivierung wird mindestens wird ein Interface-Restart (down/up) oder ein Reboot benötigt.

# sysctl -p

6.5.2. Aktivieren von Privacy Extension mit Hilfe des NetworkManager

Moderne (Client-) Systeme nutzen NetworkManager zur Interface-Konfiguration. Ein Kommandozeilen-Werkzeug ist eingebaut welches auch Parameter ändern kann, die in der GUI nicht verfügbar (oder sichtbar) sind.

Beispiele basieren auf Version 0.9.9.1-5.git20140319.fc21

Prüfen existierender Interfaces mit:

# nmcli connection 
-NAME UUID TYPE DEVICE
-ens4v1 d0fc2b2e-5fa0-4675-96b5-b723ca5c46db 802-3-ethernet ens4v1 

Menge von IPv6-Adressen mit Privacy Extension:

# ip -o addr show dev ens4v1 | grep temporary | wc -l
-0

Aktuelle Einstellung der IPv6 Privacy Extension für ein Interface:

# nmcli connection show ens4v1 |grep ip6-privacy
-ipv6.ip6-privacy: -1 (unknown)

Aktivieren der IPv6 Privacy Extension und Restart des Interfaces;

# nmcli connection modify ens4v1 ipv6.ip6-privacy 2
-# nmcli connection down ens4v1; nmcli connection up ens4v1

Neuer Wert der IPv6 Privacy Extension prüfen:

# nmcli connection show ens4v1 |grep ip6-privacy
-ipv6.ip6-privacy: 2 (active, prefer temporary IP)

Nun sollten auch IPv6 Privacy Extension Adressen automatisch konfiguriert sein

# ip -o addr show dev ens4v1 | grep temporary | wc -l
-2

6.5.3. Test zur Benutzung von Privacy Extension IPv6-Adressen

Ob die IPv6-Adresss mit einer durch die Privacy Extension generierte Interface ID für ausgehende Verbindungen wirklich benutzt wird, kann z.B. mit Hilfe eines Web-Browers durch Aufruf von http://ip.bieringer.de/ durchgeführt werden. Wenn EUI64_SCOPE als Ausgabe “iid-privacy” zeigt, dann funktioniert alles richtig.


Kapitel 7. Konfiguration normaler IPv6-Routen

Wenn Sie Ihren lokalen Link verlassen und Pakete in das weltweite IPv6-Internet versenden wollen, dann benötigen Sie Routing. Wenn sich bereits ein IPv6 fähiger Router an Ihrem Link befindet, dann reicht eventuell das Hinzufügen von IPv6 Routen.

Achtung: Adressen beginnend mit “fec0” sind obsolet, hier aber noch der Vollständigheit wegen gezeigt!


7.1. Bestehende IPv6-Routen anzeigen

Zuerst sollten sie überprüfen, ob und welche IPv6 Adressen bereits konfiguriert sind (etwa durch automatischer Konfiguration).


7.1.1. Verwendung von "ip"

Anwendung:

# /sbin/ip -6 route show [dev <device>]

Beispiel:

# /sbin/ip -6 route show dev eth0
-2001:0db8: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. Verwendung von "route"

Anwendung:

# /sbin/route -A inet6 

Sie sehen hier mehrere IPv6 Routen mit unterschiedlichen Adressen eines einzelnen Interfaces (bei der Ausgabe wurde das Interface eth0 herausgefiltert).

# /sbin/route -A inet6 |grep -w "eth0"
-2001:0db8:0:f101 ::/64 :: UA  256 0 0 eth0 <- Interface route for global
-¬ address
-fe80::/10        ::       UA  256 0 0 eth0 <- Interface route for link-local
-¬ address
-ff00::/8         ::       UA  256 0 0 eth0 <- Interface route for all multicast
-¬ addresses
-::/0             ::       UDA 256 0 0 eth0 <- Automatic default route

7.2. Eine IPv6-Route über ein Gateway hinzufügen

Eine Route wird meistens benötigt, um mit IPv6 die Außenwelt über einen IPv6 fähigen Router und über Ihren Link zu erreichen.


7.2.1. Verwendung von "ip"

Anwendung:

# /sbin/ip -6 route add <ipv6network>/<prefixlength> via <ipv6address>
-¬ [dev <device>]

Beispiel:

# /sbin/ip -6 route add default via 2001:0db8:0:f101::1

7.2.2. Verwendung von "route"

Anwendung:

# /sbin/route -A inet6 add <ipv6network>/<prefixlength> gw
-¬ <ipv6address> [dev <device>] 

Die optionale Angabe eines Devices wird dann benötigt, wenn die IPv6 Adresse des Gateways eine lokale Link-Adresse ist.

Im folgenden Beispiel wird eine Route für alle Adressen (default) über das Gateway 2001:0db8:0:f101::1 hinzugefügt.

# /sbin/route -A inet6 add default gw 2001:0db8:0:f101::1

7.3. Eine IPv6-Route über ein Gateway entfernen

Das manuelle entfernen einer Route wird nicht oft benötigt, meistens wird dies automatisch durch Netzwerk-Konfigurationsscripts beim herunterfahren (des Betriebssystems oder eines Interfaces) bewirkt.


7.3.1. Verwendung von "ip"

Anwendung:

# /sbin/ip -6 route del <ipv6network>/<prefixlength> via <ipv6address>
-¬ [dev <device>]

Beispiel:

# /sbin/ip -6 route del default via 2001:0db8:0:f101::1

7.3.2. Verwendung von "route"

Anwendung:

# /sbin/route -A inet6 del <ipv6network>/<prefixlength> gw <ipv6address> [dev
-¬ <device>]

Beispiel zum entfernen der im obigen Beispiel hinzugefügten Route:

# /sbin/route -A inet6 del default gw 2001:0db8:0:f101::1

7.4. Eine IPv6-Route über ein Interface hinzufügen

Diese Funktion wird manchmal im Fall dedizierter Punkt-zu-Punkt Verbindungen verwendet, in der Regel aber eher selten benötigt.


7.4.1. Verwendung von "ip"

Anwendung:

# /sbin/ip -6 route add <ipv6network>/<prefixlength> dev <device>
-¬ metric 1

Beispiel:

# /sbin/ip -6 route add default dev eth0 metric 1

Der Metrik-Wert “1” wird verwendet, um mit dem Metrik Wert von route kompatibel zu sein; der Standard-Metrik-Wert von “ip” ist “1024”.


7.4.2. Verwendung von "route"

Anwendung:

# /sbin/route -A inet6 add <network>/<prefixlength> dev <device>

Beispiel:

# /sbin/route -A inet6 add default dev eth0 

7.5. Eine IPv6-Route über ein Interface entfernen

Dies wird manuell nicht so oft benötigt, jedoch aber beim herunterfahren von Konfigurationsscripts benutzt.


7.5.1. Verwendung von "ip"

Anwendung:

# /sbin/ip -6 route del <ipv6network>/<prefixlength> dev <device>

Beispiel:

# /sbin/ip -6 route del default dev eth0 

7.5.2. Verwendung von "route"

Anwendung:

# /sbin/route -A inet6 del <network>/<prefixlength> dev <device>

Beispiel:

# /sbin/route -A inet6 del default dev eth0

7.6. FAQ für IPv6-Routen

7.6.1. Unterstützung einer IPv6 Default-Route

Ein Schwerpunkt bei IPv6 ist das hierarchische Routing. Aus diesem Grund werden in Routern nur wenige Routing-Einträge benötigt.

Einige Punkte sind im aktuellen Kernel zu beachten:


7.6.1.1. Clients (kein Routing eines Paketes!)

Ein client kann eine Default Route (z.B. “::/0” ) einrichten, diese aber auch durch automatische Konfiguration, z.B. mit radvd, erlernen:

# 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. Router & Paketweiterleitung

Ältere Linux Kernel ( zumindest <= 2.4.17) unterstützen keine Default Routen. Man kann dies einrichten, aber die Abfrage dieser Route misslingt im Fall, dass ein Paket weitergeleitet werden soll ( normaler Zwecke eines Routers).

Falls ein entsprechender Kernel noch verwendet wird, kann “default routing” eingerichtet werden, wenn hierbei das einzig globale Adress-Präfix “2000::/3” verwendet wird.

Anmerkung: Walten Sie mit Vorsicht bei der Anwendung von default routing auf exponierten Routern, wenn keine Adressfilterung eingesetzt wird. Andernfalls kann Multicast- oder lokaler Site-Datenverkehr den Router ungewollt verlassen.


Kapitel 8. Neighbor Discovery

Die Neighbor Discovery (Ermittlung der Netzwerkumgebung) ist der IPv6 Nachfolger für das ARP (Address Resolution Protocol) bei IPv4. Sie können Informationen über die aktuelle Netzwerkumgebung gewinnen, Einträge erstellen und entfernen.

Der Kernel merkt sich erfolgreich gelernte “Nachbarn” (wie ARP in IPv4). Sie können die gelernten Einträge mit “ip” einsehen.


8.1. Netzwerkumgebung mit “ip” anzeigen

Mit dem folgenden Befehl können Sie die gelernten oder konfigurierten IPv6 Nachbarn anzeigen:

# ip -6 neigh show [dev <device>]

Das folgende Beispiel zeigt einen Nachbar, einen erreichbaren Router:

# ip -6 neigh show
-fe80::201:23ff:fe45:6789 dev eth0 lladdr 00:01:23:45:67:89 router nud reachable

8.2. Tabelle der Netzwerkumgebung mit “ip” editieren

8.2.1. Eintrag manuell hinzufügen

Mit folgendem Befehl können Sie einen Eintrag manuell hinzufügen:

# ip -6 neigh add <IPv6 address> lladdr <link-layer address> dev <device>

Beispiel:

# ip -6 neigh add fec0::1 lladdr 02:01:02:03:04:05 dev eth0

8.2.2. Eintrag manuell entfernen

Sie können einen Eintrag auch löschen:

# ip -6 neigh del <IPv6 address> lladdr <link-layer address> dev <device>

Beispiel:

# ip -6 neigh del fec0::1 lladdr 02:01:02:03:04:05 dev eth0

8.2.3. Erweiterte Einstellungen

Das Tool “ip” ist weniger ausführlich dokumentiert, dennoch ist es sehr mächtig. Sehen Sie online mit “help” für weitere Details:

# 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 ]

Es sieht aus, als seien manche Optionen ausschließlich für IPv4 gedacht... Es wird um Ihre Mithilfe gebeten, wenn Sie Informationen zu Optionen und der erweiterten Anwendung beisteuern können.


Kapitel 9. Konfiguration eines IPv6-in-IPv4 Tunnels

Wenn zum Verlassen des lokalen Netzwerks keine native IPv6-Anbindung vorhanden ist, wird zum Erreichen des weltweiten IPv6 Internet ein IPv6-in-IPv4 Tunnel benötigt.

Es gibt unterschiedliche Tunnel-Mechanismen sowie einige Möglichkeiten zum Einrichten eines Tunnels.


9.1. Tunnelarten

Es steht Ihnen mehr als eine Möglichkeit zur Verfügung, IPv6 Pakete über ausschließliche IPv4 Links zu tunneln.


9.1.1. Statische Punkt-zu-Punkt Tunnel

Ein Punkt-zu-Punkt Tunnel ist ein dedizierter Tunnel zu einem Endpunkt, der Kenntnis über das lokale IPv6 Netzwerk (für das Routing zurück...) und die IPv4 Adresse des Tunnel-Endpunktes verfügt. Definition des Punkt-zu-Punkt Tunnels siehe: RFC 4213 / Basic Transition Mechanisms for IPv6 Hosts and Routers. Anforderungen:

  • Die IPv4 Adresse des lokalen Tunnel-Endpunktes muss statisch sein, global eindeutig und vom entfernten Tunnel-Endpunkt aus erreichbar sein.

    • Wenn keine statische IPv4 Addresse verfügbar ist, muß der Tunnel-Provider die Authentifizerung der dynamischen IPv4 Addresse unterstützen, wie z.B. SixXS / AICCU oder gogo6.

  • Sie müssen ein globales IPv6 Präfix zugewiesen bekommen haben.

    • Es ist auch möglich, daß zusätzliche IPv6 Netzwerke über diesen Tunnel geroutet werden.

  • Ein entfernter Tunnel-Endpunkt muss dazu in der Lage sein, ihr IPv6 Präfix bis zu Ihrem lokalen Tunnel-Endpunkt zu routen (wobei meistens manuelle Konfiguration notwendig wird).

Statische Tunnelprovider:


9.1.2. Automatische Tunnel

Automatisches Tunneln tritt dann ein, wenn ein Knoten direkt einen anderen Knoten (dessen IPv4-Adresse er zuerst kennen lernen muss) über die IPv4-mapped IPv6-Adresse anspricht - dieser Mechanismus sollte nicht mehr unterstützt werden, weil er sehr unsicher ist.


9.1.3. 6to4 Tunnel

6to4 Tunnel (RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds) verwenden einen einfachen Mechanismus zum erstellen eines automatischen Tunnels. Jeder Knoten mit einer weltweit einmaligen IPv4 Adresse kann zu einem 6to4 Tunnel-Endpunkt gemacht werden (solange keine IPv4-Firewall den Verkehr unterbindet). Ein 6to4 Tunnel ist zumeist kein one-to-one Tunnel. In diesem Fall wird das Untertunneln in einen Upstream- und einen Downstream-Tunnel unterteilt. Ferner zeigt eine spezielle IPv6 Adresse an, dass der Knoten einen 6to4 Tunnel für die Verbindung zum weltweiten IPv6 Netzwerk verwendet.


9.1.3.1. Erstellen eines 6to4 Präfixes

Die 6to4 Adresse wird wie folgt definiert (Schema ist dem RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds entnommen):

|   3+13   |    32     |    16  |            64 bits             | 
-+---+------+-----------+--------+--------------------------------+ 
-|  FP+TLA  |  V4ADDR   | SLA ID |           Interface ID         | 
-|  0x2002  |           |        |                                | 
-+---+------+-----------+--------+--------------------------------+

FP und TLA zusammen haben den Wert 0x2002. V4ADDR ist die weltweit einmalige IPv4 Adresse des Knoten (in hexadezimaler Notation). Mit dem SLA wird das Subnetz identifiziert (65536 lokale Subnetze sind möglich) und benutzbar, um die lokale Netzwerstruktur abzubilden.

Für Gateways wird dieser Präfix normalerweise mit dem SLA “0000” definiert und dem 6to4 Tunnel-Interface das Suffix “::1” (kann aber auch ein beliebiger mit local-scope sein) zugewiesen. Zu bemerken ist, dass Microsoft Windows als Suffix auch immer die V4ADDR einsetzt.


9.1.3.2. 6to4 Tunnel zum Upstream

Der Knoten muss die Kenntnis darüber haben, an welchen entfernten Tunnel-Endpunkt die in IPv4 Paketen eingeschlossenen IPv6 Pakete gesendet werden sollen. In den “Anfängen” der 6to4 Tunnel-Anwendung wurden dedizierte Upstream akzeptierende Router definiert. Liste der Router siehe: NSayer's 6to4 information.

Heute können Upstream Router automatisch mittels der anycast Adresse 192.88.99.1 gefunden werden. Routing Protokolle sind für die Verarbeitung im Hintergrund zuständig, siehe RFC 3068 / An Anycast Prefix for 6to4 Relay Routers für weitere Details.


9.1.3.3. 6to4 Tunnel zum Downstream

Der Downstream (6bone -> Ihr 6to4 fähiger Node) ist nicht wirklich fix, er kann von jenem Host variieren, an dem ursprünglich die Pakete gesendet wurden. Es gibt zwei Möglichkeiten:

  • Der entfernte Host benutzt 6to4 und sendet die Pakete direkt an den lokalen Knoten zurück (siehe unten).

  • Der entfernte Host sendet die Pakete zurück an das weltweite IPv6 Netzwerk, und abhängig vom dynamischen Routing, erstellt dann ein Relay-Router eines ISPs, der 2002::/16 via BGP kundgibt, automatisch zum lokalen Knoten einen Tunnel.


9.1.3.4. Möglicher 6to4 Verkehr

  • Vom 6to4 zum 6to4: der Tunnel entsteht normalerweise direkt zwischen den beiden 6to4 fähigen Hosts.

  • Vom 6to4 zum non-6to4: Der Datenstrom wird mittels Upstream-Tunnel versendet.

  • Vom non-6to4 zum 6to4: Der Datenstrom wird mittels Downstream-Tunnel versendet.

Achtung, durch das mögliche asymmetrische Routing können Probleme mit defekten 6to4-Relays schwer zu diagnostizieren sein.


9.1.4. UDP gekapselte IPv6 Tunnels

UDP gekapseltes IPv6 Tunneling wird üblicherweise benutzt, wenn am internen Endpunkt keine globale IPv4 Addresse verfügbar ist, aber via Network Adress Translation (NAT) noch entsprechende Endpunkte im Internet mit Hilfe unten beschriebener UDP Ports erreichbar sind.


9.1.4.1. Teredo Tunnel

RFC 4380 / Teredo: Tunneling IPv6 over UDP through Network Address Translationsbeschreibt das Tunneln von IPv6 Pakete über IPv4 UDP Pakete (Bubbles), siehe auch Wikipedia / Teredo. Üblicherweise benutzt es 3544/udp. Der Client für Linux heißt miredo und ist benutzbar ohne große Konfiguration. Über diese Tunnelmethode kann nur ein einzelner Client an das globale IPv6-Netzwerk angeschlossen werden.


9.1.4.2. AYIYA Tunnel

Tunnel provider SixXS bietet auch einen IPv6-in-UDP-in-IPv4 (5072/udp) Tunnel an, zur Nutzung muss der Modus AYIYA aktiviert werden.


9.1.4.3. gogo6 Tunnel

Tunnel provider gogo6 bietet auch einen IPv6-in-UDP-in-IPv4 (3653/udp) Tunnel an, zur Nutzung muss der Modus v6udpv4 aktiviert werden.


9.2. Bestehende Tunnel anzeigen

9.2.1. Verwendung von "ip"

Anwendung:

# /sbin/ip -6 tunnel show [<device>]

Beispiel:

# /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. Verwendung von "route"

Anwendung:

# /sbin/route -A inet6 

Beispiel (Ausgabe wurde derart gefiltert, dass nur Tunnels über das virtuelle Interface sit0 angezeigt werden):

# /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. Einrichtung eines Punkt-zu-Punkt Tunnels

Es gibt drei Methoden ein Punkt-zu-Punkt Tunnel hinzuzufügen bzw. zu entfernen.

Eine gute Informationsquelle zum Thema Tunnel-Einrichtung mit “ip” ist folgender Artikel: Configuring tunnels with iproute2 (article) (Spiegel).


9.3.1. Einen Punkt-zu-Punkt Tunnel hinzufügen

9.3.1.1. Verwendung von "ip"

Bei einer kleinen Anzahl von Tunnels ist die Verwendung von “ip” zurzeit die Standardmethode.

Beispiel für das Erstellen eines Tunnel-Devices (das Device wird aber hiermit nicht aktiviert; ebenso muss ein TTL Wert spezifiziert werden, da der Standardwert 0 ist):

# /sbin/ip tunnel add <device> mode sit ttl <ttldefault> remote
-¬ <ipv4addressofforeigntunnel> local <ipv4addresslocal>

Anwendung (drei allgemeine Beispiele):

# /sbin/ip tunnel add sit1 mode sit ttl <ttldefault> remote
-¬ <ipv4addressofforeigntunnel1> local <ipv4addresslocal>
-# /sbin/ip link set dev sit1 up
-# /sbin/ip -6 route add <prefixtoroute1> dev sit1 metric 1
-
-# /sbin/ip tunnel add sit2 mode sit ttl <ttldefault>
-¬ <ipv4addressofforeigntunnel2> local <ipv4addresslocal>
-# /sbin/ip link set dev sit2 up
-# /sbin/ip -6 route add <prefixtoroute2> dev sit2 metric 1
-
-# /sbin/ip tunnel add sit3 mode sit ttl <ttldefault>
-¬ <ipv4addressofforeigntunnel3> local <ipv4addresslocal>
-# /sbin/ip link set dev sit3 up
-# /sbin/ip -6 route add <prefixtoroute3> dev sit3 metric 1

9.3.1.2. Verwendung von "ifconfig" und "route" (nicht empfehlenswert)

Diese Methode zum Hinzufügen eines Tunnels wird nicht empfohlen, da Ungereimtheiten auftreten. Es gibt keine Probleme, wenn nur ein Tunnel hinzugefügt wird. Werden hingegen mehrere Tunnel hinzugefügt, dann kann der erste Tunnel nicht einfach deaktiviert werden, wenn die restlichen Tunnel aktiviert bleiben sollen.

Anwendung (drei allgemeine Beispiele):

# /sbin/ifconfig sit0 up
-
-# /sbin/ifconfig sit0 tunnel <ipv4addressofforeigntunnel1>
-# /sbin/ifconfig sit1 up
-# /sbin/route -A inet6 add <prefixtoroute1> dev sit1
-
-# /sbin/ifconfig sit0 tunnel <ipv4addressofforeigntunnel2>
-# /sbin/ifconfig sit2 up
-# /sbin/route -A inet6 add <prefixtoroute2> dev sit2
-
-# /sbin/ifconfig sit0 tunnel <ipv4addressofforeigntunnel3>
-# /sbin/ifconfig sit3 up
-# /sbin/route -A inet6 add <prefixtoroute3> dev sit3

WICHTIG: NICHT VERWENDEN! Mit diesem Setup wird von überall aus dem Internet das "automatische Tunneln" vorbehaltlos aktiviert. Das ist ein unnötiges Risiko.


9.3.1.3. Verwendung allein von "route"

Sie können einen Tunnel auch im NBMA-Stil (Non Broadcast Multiple Access) einrichten. Bei dieser Vorgehensweise können Sie sehr einfach mehrere Tunnels zugleich einrichten, aber kein Tunnel kann nummeriert werden (und das ist ein kein benötigtes Feature).

Anwendung (drei allgemeine Beispiele):

# /sbin/ifconfig sit0 up
-
-# /sbin/route -A inet6 add <prefixtoroute1> gw
-¬ ::<ipv4addressofforeigntunnel1> dev sit0
-# /sbin/route -A inet6 add <prefixtoroute2> gw
-¬ ::<ipv4addressofforeigntunnel2> dev sit0
-# /sbin/route -A inet6 add <prefixtoroute3> gw
-¬ ::<ipv4addressofforeigntunnel3> dev sit0

WICHTIG: NICHT VERWENDEN! Mit diesem Setup wird von überall aus dem Internet das "automatische Tunneln" vorbehaltlos aktiviert. Das ist ein unnötiges Risiko.


9.3.2. Punkt-zu-Punkt Tunnel entfernen

Diese Funktion wird selten manuell durchgeführt. Skripte verwenden diese Funktion zum sauberen deaktivieren bzw. beim Neustart einer IPv6 Konfiguration.


9.3.2.1. Verwendung von "ip"

Entfernen eines Tunnel-Devices:

# /sbin/ip tunnel del <device>

Anwendung (drei allgemeine Beispiele):

# /sbin/ip -6 route del <prefixtoroute1> dev sit1
-# /sbin/ip link set sit1 down
-# /sbin/ip tunnel del sit1
-
-# /sbin/ip -6 route del <prefixtoroute2> dev sit2
-# /sbin/ip link set sit2 down
-# /sbin/ip tunnel del sit2
-
-# /sbin/ip -6 route del <prefixtoroute3> dev sit3
-# /sbin/ip link set sit3 down
-# /sbin/ip tunnel del sit3

9.3.2.2. Verwendung von "ifconfig" und "route" (nicht empfehlenswert, da unbequem)

Nicht nur bei der Erstellung eines Tunnels kommt es zu Ungereimtheiten, sondern auch bei dessen Entfernung. Die Tunnel müssen in umgekehrter Reihenfolge wieder entfernt werden, d.h. der zuletzt erstellte Tunnel muss als Erster entfernt werden...

Anwendung (drei allgemeine Beispiele):

# /sbin/route -A inet6 del <prefixtoroute3> dev sit3
-# /sbin/ifconfig sit3 down
-
-# /sbin/route -A inet6 del <prefixtoroute2> dev sit2
-# /sbin/ifconfig sit2 down
-
-# /sbin/route -A inet6 add <prefixtoroute1> dev sit1
-# /sbin/ifconfig sit1 down
-
-# /sbin/ifconfig sit0 down

9.3.2.3. Verwendung von "route"

Die Vorgehensweise ist vergleichbar mit dem löschen einer normalen IPv6 Route.

Anwendung (drei allgemeine Beispiele):

# /sbin/route -A inet6 del <prefixtoroute1> gw
-¬ ::<ipv4addressofforeigntunnel1> dev sit0
-# /sbin/route -A inet6 del <prefixtoroute2> gw
-¬ ::<ipv4addressofforeigntunnel2> dev sit0
-# /sbin/route -A inet6 del <prefixtoroute3> gw
-¬ ::<ipv4addressofforeigntunnel3> dev sit0
-
-# /sbin/ifconfig sit0 down

9.3.3. Nummerierte Punkt-zu-Punkt Tunnel

Manchmal ist es notwendig, einen Punkt-zu-Punkt Tunnel mit IPv6 Adresse genauso einzurichten, wie heute bei IPv4. Dies ist nur mit der ersten (ifconfig+route - nicht empfehlenswert) sowie mit der dritten (ip+route) beschriebenen Methode zur Einrichtung eines Tunnels möglich. Bei diesen Fällen können Sie den Tunnel-Interfaces die IPv6 Adressen, wie im Abschnitt zur Interface-Konfiguration beschrieben, hinzufügen.


9.4. Einrichtung von 6to4 Tunnel

Beachten sie Bitte, dass 6to4 Tunnel im Standard-Kernel der Serie 2.2.x (siehe systemcheck/kernel) nicht unterstützt werden. Weiter ist zu beachten, dass die Präfix-Länge für 6to4 Adressen 16 ist, da sich aus Perspektive des Netzwerks betrachtet, alle anderen 6to4 Hosts sich in der gleichen Schicht 2 befinden.


9.4.1. 6to4 Tunnel hinzufügen

Zu Anfang müssen Sie Ihre 6to4 Präfix-Länge mittels der lokal zugewiesenen global routbaren IPv4 Adresse berechnen (sollte ihr Host keine global routebare IPv4 Adresse haben, dann ist unter speziellen Bedingungen NAT auf dem Border Gateway möglich):

Angenommen, Ihre IPv4 Adresse ist:

1.2.3.4

Dann ist das daraus resultierende 6to4 Präfix:

2002:0102:0304::

Lokalen 6to4 Gateways sollte immer (ist aber kein Muss, ein beliebiger local-scope Suffix kann benutzt werden) das Suffix “::1” zugewiesen werden. Daraus resultierend ergibt sich Ihre lokale 6to4 Adresse:

2002:0102:0304::1

Zum automatischen Erstellen der Adresse können Sie folgenden Befehl nutzen:

ipv4="1.2.3.4"; printf "2002:%02x%02x:%02x%02x::1" `echo $ipv4 | tr "." " "`

Es gibt nun zwei Möglichkeiten einen 6to4 Tunnel einzurichten.


9.4.1.1. Verwendung von "ip" und einem dedizierten Tunnel-Device

Die empfohlene Vorgehensweise (der Wert TTL muss angegeben werden, da der Standardwert 0 ist):

Erstellen eines neues Tunnel-Device:

# /sbin/ip tunnel add tun6to4 mode sit ttl <ttldefault> remote any local
-¬ <localipv4address> 

Interface aktivieren:

# /sbin/ip link set dev tun6to4 up 

Eine lokale 6to4 Adresse am Interface hinzufügen (Hinweis: Präfix-Länge 16 ist wichtig!)

# /sbin/ip -6 addr add <local6to4address>/16 dev tun6to4 

Hinzufügen der (Standard-) Route zum globalen IPv6 Netz unter Verwendung der all-6to4-routers IPv4 anycast Adresse:

# /sbin/ip -6 route add default via ::192.88.99.1 dev tun6to4 metric 1

Manche Versionen von “ip” (z.B. SuSE Linux 9.0) unterstützen keine IPv4-kompatiblen IPv6-Adressen für Gateways, in diesem Fall muss die entsprechende IPv6-Adresse benutzt werden:

# /sbin/ip -6 route add default via 2002:c058:6301::1 dev tun6to4 metric 1

9.4.1.2. Verwendung von "ifconfig" und "route" sowie einem generischen Tunnel-Device "sit0" (nicht empfehlenswert)

Diese Vorgehensweise wird nicht empfohlen, da bei Verwendung des allgemeinen Tunnel Device sit0 keine Filter-Spezifizierung pro Device ermöglicht wird.

Das allgemeine Tunnel Interface sit0 aktivieren:

# /sbin/ifconfig sit0 up 

Dem Interface eine lokale 6to4 Adresse hinzufügen:

# /sbin/ifconfig sit0 add <local6to4address>/16

Hinzufügen der (Standard-) Route zum globalen IPv6 Netz unter Verwendung der all-6to4-routers IPv4 anycast Adresse:

# /sbin/route -A inet6 add default gw ::192.88.99.1 dev sit0

9.4.2. 6to4 Tunnel entfernen

9.4.2.1. Verwendung von "ip" und einem dedizierten Tunnel-Device

Entfernen aller Routen über dieses bestimmten Tunnel Devices:

# /sbin/ip -6 route flush dev tun6to4

Interface deaktivieren:

# /sbin/ip link set dev tun6to4 down

Ein erstelltes Tunnel Device entfernen:

# /sbin/ip tunnel del tun6to4 

9.4.2.2. Verwendung von "ifconfig" und "route" sowie einem generischen Tunnel-Device "sit0" (nicht empfehlenswert)

Entfernen der (Standard-) Route über ein 6to4 Tunnel Device:

# /sbin/route -A inet6 del default gw ::192.88.99.1 dev sit0

Eine 6to4 Adresse des Interfaces entfernen:

# /sbin/ifconfig sit0 del <local6to4address>/16

Ein allgemeines Tunnel Device deaktivieren (aber Achtung, eventuell ist das Interface noch in Verwendung...)

# /sbin/ifconfig sit0 down 

Kapitel 10. Konfiguration eines IPv4-in-IPv6 Tunnels

RFC 2473 / Generic Packet Tunneling in IPv6 Specification spezifiziert den Mechanismus, um unterschiedliche Pakettypen (einschließlich IPv4) über IPv6 zu tunneln.

ANMERKUNG: Unterstützung für IPv4-in-IPv6 Tunnel ist erst seit Kernel Version 2.6.22 verfügbar.


10.1. Anzeigen von existierenden Tunnels

Anwendung:

# /sbin/ip -6 tunnel show [<device>]

Beispiel:

# /sbin/ip -6 tunnel show mode any
-ip6tnl0: ipv6/ipv6 remote :: local :: encaplimit 0 hoplimit 0 tclass 0x00 flowlabel 0x00000 (flowinfo 0x00000000)
-ip6tnl1: ip/ipv6 remote fd00:0:0:2::a local fd00:0:0:2::1 dev eth1 encaplimit 4 hoplimit 64 tclass 0x00 flowlabel 0x00000 (flowinfo 0x00000000)

ANMERKUNG: wenn "mode any" nicht angegeben wird, werde nur IPv6-in-IPv6 Tunnels angezeigt.


10.2. Konfiguration eines Punkt-zu-Punkt Tunnels

Anwendung für die Erzeugung einer 4over6 Tunnel-Schnittstelle (welche danach aber noch nicht aktiv ist)

# /sbin/ip tunnel add <device> mode ip4ip6 remote <ipv6addressofforeigntunnel> local <ipv6addresslocal>

Anwendung (allgemeines Beispiel für drei Tunnels):

# /sbin/ip -6 tunnel add ip6tnl1 mode ip4ip6 remote <ipv6addressofforeigntunnel1> local <ipv6addresslocal>
-# /sbin/ip link set dev ip6tnl1 up 
-# /sbin/ip -6 route add <prefixtoroute1> dev ip6tnl1 metric 1
-
-# /sbin/ip -6 tunnel add ip6tnl2 mode ip4ip6 remote <ipv6addressofforeigntunnel2> local <ipv6addresslocal>
-# /sbin/ip link set dev ip6tnl2 up
-# /sbin/ip -6 route add <prefixtoroute2> dev ip6tnl2 metric 1
-
-# /sbin/ip -6 tunnel add ip6tnl3 mode ip4ip6 remote <ipv6addressofforeigntunnel3> local <ipv6addresslocal>
-# /sbin/ip link set dev ip6tnl3 up
-# /sbin/ip -6 route add <prefixtoroute3> dev ip6tnl3 metric 1

10.3. Löschen von Punkt-zu-Punkt-Tunnels

Anwendung für das Löschen einer Tunnel-Schnittstelle:

# /sbin/ip -6 tunnel del <device>

Anwendung (allgemeines Beispiel für drei Tunnels):

# /sbin/ip -6 route del <prefixtoroute1> dev ip6tnl1
-# /sbin/ip link set ip6tnl1 down
-# /sbin/ip -6 tunnel del ip6tnl1
-
-# /sbin/ip -6 route del <prefixtoroute2> dev ip6tnl2
-# /sbin/ip link set ip6tnl2 down
-# /sbin/ip -6 tunnel del ip6tnl2
-
-# /sbin/ip -6 route del <prefixtoroute3> dev ip6tnl3
-# /sbin/ip link set ip6tnl3 down
-# /sbin/ip -6 tunnel del ip6tnl3 

Kapitel 11. Kernel-Einstellungen im /proc-Dateisystem

Anmerkung: Dieses Kapitel basiert großteils auf der Datei “ip-sysctl.txt”, welche in den aktuellen Kernel-Quellen im Verzeichnis “Documentation/networking” zu finden ist. Danke an dieser Stelle an Pekka Savola, der den IPv6 relevanten Inhalt dieser Datei wartet und betreut. Ebenso sei erwähnt, dass einige Textstellen hieraus mehr oder weniger mit Copy & Paste in dieses Dokument übernommen wurden.


11.1. Zugriff auf das /proc-Dateisystem

11.1.1. Verwendung von "cat" und "echo"

Mit “cat” und “echo” können Sie am einfachsten das /proc Dateisystem einsehen. Hierfür gibt es aber einige Voraussetzungen, die erfüllt sein müssen:

  • Das /proc-Dateisystem muss im Kernel aktiviert sein. Hierfür muss die folgende Einstellung beim kompilieren des Kernels vorgenommen werden:

CONFIG_PROC_FS=y

  • Das /proc-Dateisystem muss zuerst gemountet sein. Dies kann wie folgt getestet werden:

# mount | grep "type proc"
-none on /proc type proc (rw)

  • Sie benötigen Lese- und manchmal auch Schreib-Zugriff (normalerweise nur als Root-Benutzer) auf das /proc-Dateisystem.

Normalerweise sind, mit Ausnahme in /proc/sys/*, alle Einträge ausschließlich mit Leserechten ausgestattet. Die Einträge werden zum Zweck der Informationsgewinnung verwendet.


11.1.1.1. Wert anzeigen

Den Inhalt eines Eintrags können sie mit “cat” anzeigen:

# cat /proc/sys/net/ipv6/conf/all/forwarding
-0

11.1.1.2. Wert einstellen

Mit “echo” können sie einen neuen Wert zuweisen (nur wenn der Eintrag beschreibbar ist):

# echo "1" >/proc/sys/net/ipv6/conf/all/forwarding

11.1.2. Verwendung von "sysctl"

Die Verwendung des Programms “sysctl” ist eine zeitgemäße Methode zum Anzeigen der Kernel-Switches. Es funktioniert auch dann, wenn das /proc-Dateisystem nicht gemountet ist, wobei aber nur ein Zugriff auf /proc/sys/* möglich ist!

Das Programm “sysctl” ist (auf Red Hat Linux Systemen) im Paket “procps” enthalten.

  • Das sysctl-Interface muss im Kernel aktiviert sein. Hierfür muss die folgende Einstellung beim kompilieren des Kernels vorgenommen werden:

CONFIG_SYSCTL=y

11.1.2.1. Wert anzeigen

Der Wert eines Eintrags kann nun angezeigt werden:

# sysctl net.ipv6.conf.all.forwarding
-net.ipv6.conf.all.forwarding = 0

11.1.2.2. Wert einstellen

Ein neuer Wert kann wie folgt zugewiesen werden (wenn der Eintrag beschreibbar ist):

# sysctl -w net.ipv6.conf.all.forwarding=1
-net.ipv6.conf.all.forwarding = 1

Anmerkung: Verwenden Sie beim setzen eines Wertes keine Leerzeichen vor oder nach dem “=”. Sollten Sie mehrere Werte in einer Zeile angeben, müssen sie diese mit Anführungszeichen umgeben:

# sysctl -w net.ipv4.ip_local_port_range="32768 61000"
-net.ipv4.ip_local_port_range = 32768 61000

11.1.2.3. Sonstiges

Anmerkung: Es gibt sysctl-Versionen im Umlauf, die anstelle des Punktes “.” einen slash “/” ausgeben.

Für weitere Details siehe die manpage von sysctl.

Hinweise: Um schnell einen Überblick über die Einstellungen zu bekommen, verwenden Sie einfach die Option “-a” (anzeigen aller Einträge) sowie das Tool “grep”.


11.1.3. Werte im /proc-Dateisystem

Es gibt im /proc-Dateisystem unterschiedliche Formate:

  • BOOLEAN: einfach eine “0” (falsch) oder eine “1” (wahr)

  • INTEGER: Wert ist eine Ganzzahl (kann auch eine unsigned int sein)

  • Kompliziertere Zeilen mit verschiedenen Werten: manchmal wir eine Header-Zeile mit angezeigt... Sie können aber auch weitere Informationen zu den Werten und deren Bedeutung direkt in den Kernel Quellen beziehen.


11.2. Einträge in /proc/sys/net/ipv6/

11.2.1. conf/default/*

Ändern der Interface-spezifischen Einstellungen.


11.2.2. conf/all/*

Ändern aller Interface-spezifischen Einstellungen.

Ausnahme: “conf/all/forwarding” hat hier eine andere Bedeutung:


11.2.2.1. conf/all/forwarding

  • Typ: BOOLEAN

Hiermit wird die globale IPv6 Weiterleitung zwischen allen Interfaces aktiviert.

In IPv6 ist kein forwarding per Device möglich. Die Steuerung der Weiterleitung muss mittels IPv6-netfilter Regel-Sets (mit dem Programm ip6tables) und der Bestimmung der Ein- und Ausgabe-Devices (siehe Firewalling/Netfilter6 für Details) vollzogen werden. In IPv4 ist das anders, forwarding per device ist hier möglich (hier wird am Interface, wo das Paket einlangt, die entsprechende Entscheidung getroffen).

Hiermit werden die Host/Router Einstellungen 'forwarding' aller Interfaces eingestellt (auch globales Forwarding genannt). Für weitere Details Siehe unten.

Ist der Wert gleich 0, dann ist IPv6 forwarding deaktiviert. Pakete verlassen in diesem Fall niemals ein anderes Interface (weder physikalische noch logische wie z.B. Tunnel).


11.2.3. conf/interface/*

Spezielle Einstellungen per Interface ändern.

Das funktionale Verhalten einzelner Einstellungen ist davon abhängig, ob lokales forwarding aktiviert ist oder nicht.


11.2.3.1. accept_ra

  • Typ: BOOLEAN

  • Standardeinstellung: aktiviert, wenn lokales forwarding deaktiviert ist. Deaktiviert, wenn lokales forwarding aktiviert ist.

Router Advertisements werden akzeptiert; das Interface wird mit Status 'received data' automatisch konfiguriert.


11.2.3.2. accept_redirects

  • Typ: BOOLEAN

  • Standardeinstellung: aktiviert, wenn lokales forwarding deaktiviert ist. Deaktiviert, wenn lokales forwarding aktiviert ist.

Akzeptiert von IPv6 Router gesendete Redirects.


11.2.3.3. autoconf

  • Typ: BOOLEAN

  • Funktionale Standardeinstellung: aktiviert, wenn accept_ra_pinfo aktiv ist. Deaktiviert, wenn accept_ra_pinfo deaktiviert ist.

Autokonfiguriert Adressen unter Benutzung der Prefix-Information eines Router-Advertisements.


11.2.3.4. dad_transmits

  • Typ: INTEGER

  • Standardwert: 1

Die Anzahl der gesendeten Proben zum entdecken von Adress-Duplikaten.


11.2.3.5. forwarding

  • Typ: BOOLEAN

  • Standardwert: FALSCH, wenn globale forwarding deaktiviert ist (Standard), ansonst WAHR

Konfigurieren von Interface-spezifischem Host/Router-Verhalten.

Anmerkung: Es wird die gleiche Konfiguration für alle Interfaces empfohlen; Gemischte Host/Router-Szenarios sind eher unüblich.

  • Wert FALSCH: Per Standard wird von einem Host-Verhalten ausgegangen. Das bedeutet:

  1. Der Schalter IsRouter ist bei Router Advertisements nicht aktiviert.

  2. Router-Anfragen werden bei Bedarf gesendet.

  3. Wenn accept_ra WAHR ist (Standard), dann werden Router Advertisements akzeptiert (und starte die automatische Konfiguration).

  4. Wenn accept_redirects WAHR ist (Standard), dann akzeptiere Redirects.

  • Wert WAHR: Ist lokales forwarding eingeschaltet, dann wird von einem Router-Verhalten ausgegangen. Das bedeutet genau das Gegenteil zu oben:

  1. Der Schalter IsRouter ist bei Router Advertisements aktiviert.

  2. Router-Anfragen werden nicht gesendet.

  3. Router Advertisements werden ignoriert.

  4. Redirects werden ignoriert.


11.2.3.6. hop_limit

  • Typ: INTEGER

  • Standardwert: 64

Der Standardwert für das Hop-Limit wird hiermit eingestellt.


11.2.3.7. mtu

  • Type: INTEGER

  • Standardwert: 1280 (Minimumwert in IPv6)

Der Standardwert für die Maximum Transfer Unit wird hiermit eingestellt.


11.2.3.8. router_solicitation_delay

  • Typ: INTEGER

  • Standardwert: 1

Die Anzahl der nach der Aktivierung eines Interfaces zu wartenden Sekunden bevor Router-Anfragen gesendet werden.


11.2.3.9. router_solicitation_interval

  • Typ: INTEGER

  • Standardwert: 4

Die Anzahl der Sekunden zwischen Router-Anfragen.


11.2.3.10. router_solicitations

  • Typ: INTEGER

  • Standardwert: 3

Die Anzahl der Router-Anfragen, bevor angenommen wird, dass keine Router verfügbar sind.


11.2.4. neigh/default/*

Standardeinstellungen der Neighbor-Erkennung und einige spezielle globale Intervall- sowie Threshold-Werte ändern:


11.2.4.1. gc_thresh1

  • Typ: INTEGER

  • Standardwert: 128

Mehr Infos hierzu in späteren Versionen.


11.2.4.2. gc_thresh2

  • Typ: INTEGER

  • Standardwert: 512

Mehr Infos hierzu in späteren Versionen.


11.2.4.3. gc_thresh3

  • Typ: INTEGER

  • Standardwert: 1024

Parameter zum Einstellen der Größe der Neighbour-Tabelle.

Wenn Sie viele Interfaces und Probleme mit inkorrekt oder nicht funktionierenden Routen haben, dann sollten Sie diesen Wert erhöhen. Ebenfalls erhöhen sollten Sie den Wert, wenn von einem aktiven Zebra (routing daemon) Folgendes angezeigt wird:

ZEBRA: netlink-listen error: No buffer space available, type=RTM_NEWROUTE(24),
-¬ seq=426, pid=0

11.2.4.4. gc_interval

  • Typ: INTEGER

  • Standardwert: 30

Mehr Infos hierzu in späteren Versionen.


11.2.5. neigh/interface/*

Per Interface ändern spezieller Einstellungen zur Neighbor-Erkennung.


11.2.5.1. anycast_delay

  • Typ: INTEGER

  • Standardwert: 100

Mehr Infos hierzu in späteren Versionen.


11.2.5.2. gc_stale_time

  • Typ: INTEGER

  • Standardwert: 60

Mehr Infos hierzu in späteren Versionen.


11.2.5.3. proxy_qlen

  • Typ: INTEGER

  • Standardwert: 64

Mehr Infos hierzu in späteren Versionen.


11.2.5.4. unres_qlen

  • Typ: INTEGER

  • Standardwert: 3

Mehr Infos hierzu in späteren Versionen.


11.2.5.5. app_solicit

  • Typ: INTEGER

  • Standardwert: 0

Mehr Infos hierzu in späteren Versionen.


11.2.5.6. locktime

  • Typ: INTEGER

  • Standardwert: 0

Mehr Infos hierzu in späteren Versionen.


11.2.5.7. retrans_time

  • Typ: INTEGER

  • Standardwert: 100

Mehr Infos hierzu in späteren Versionen.


11.2.5.8. base_reachable_time

  • Typ: INTEGER

  • Standardwert: 30

Mehr Infos hierzu in späteren Versionen.


11.2.5.9. mcast_solicit

  • Typ: INTEGER

  • Standardwert: 3

Mehr Infos hierzu in späteren Versionen.


11.2.5.10. ucast_solicit

  • Typ: INTEGER

  • Standardwert: 3

Mehr Infos hierzu in späteren Versionen.


11.2.5.11. delay_first_probe_time

  • Typ: INTEGER

  • Standardwert: 5

Mehr Infos hierzu in späteren Versionen.


11.2.5.12. proxy_delay

  • Typ: INTEGER

  • Standardwert: 80

Mehr Infos hierzu in späteren Versionen.


11.2.6. route/*

Globale Routing-Einstellungen ändern.


11.2.6.1. flush

In neueren Kernel-Versionen wurde diese Option entfernt - mehr Infos hierzu in späteren Versionen.


11.2.6.2. gc_interval

  • Typ: INTEGER

  • Standardwert: 30

Mehr Infos hierzu in späteren Versionen.


11.2.6.3. gc_thresh

  • Typ: INTEGER

  • Standardwert: 1024

Mehr Infos hierzu in späteren Versionen.


11.2.6.4. mtu_expires

  • Typ: INTEGER

  • Standardwert: 600

Mehr Infos hierzu in späteren Versionen.


11.2.6.5. gc_elasticity

  • Typ: INTEGER

  • Standardwert: 0

Mehr Infos hierzu in späteren Versionen.


11.2.6.6. gc_min_interval

  • Typ: INTEGER

  • Standardwert: 5

Mehr Infos hierzu in späteren Versionen.


11.2.6.7. gc_timeout

  • Typ: INTEGER

  • Standardwert: 60

Mehr Infos hierzu in späteren Versionen.


11.2.6.8. min_adv_mss

  • Typ: INTEGER

  • Standardwert: 12

Mehr Infos hierzu in späteren Versionen.


11.2.6.9. max_size

  • Typ: INTEGER

  • Standardwert: 4096

Mehr Infos hierzu in späteren Versionen.


11.3. IPv6 relevante Einträge in /proc/sys/net/ipv4/

Zurzeit werden einige Schalter auch bei IPv6 eingesetzt (Dies bleibt so, bis IPv4 zur Gänze in ein unabhängiges Kernel-Modul umgewandelt wurde).


11.3.1. ip_*

11.3.1.1. ip_local_port_range

Diese Kontrolleinstellung wird ebenfalls bei IPv6 verwendet.


11.3.2. tcp_*

Diese Kontrolleinstellungen werden ebenfalls bei IPv6 verwendet.


11.3.3. icmp_*

Diese Kontrolleinstellungen werden bei IPv6 nicht verwendet. Zum aktivieren der ICMPv6 Quoten-Limitierung (auf Grund der ICMPv6 storms Auswirkungen sehr empfohlen) müssen netfilter-v6-Regeln eingesetzt werden.


11.3.4. Sonstige Einträge

Keine bekannt, bzw. von IPv6 vermutlich ungenutzt.


11.4. IPv6 relevante Einträge in /proc/net/

In /proc/net gibt es einige Einträge die ausschließlich Lese-Rechte besitzen. Mit “sysctl” können Sie hier keine Informationen bekommen, verwenden Sie anstelle dessen z.B. “cat”.


11.4.1. if_inet6

  • Typ: Eine Zeile pro Adresse mit jeweils mehreren Werten

Alle konfigurierten IPv6 Adressen werden hier in einem speziellen Format angezeigt. Im Beispiel wird ein Loopback-Interface angezeigt. Die Werte werden unten erklärt (siehe “net/ipv6/addrconf.c” für Details).

# cat /proc/net/if_inet6
-00000000000000000000000000000001 01 80 10 80 lo
-+------------------------------+ ++ ++ ++ ++ ++
-|                                |  |  |  |  |
-1                                2  3  4  5  6

  1. IPv6 Adresse mit 32 hexadezimalen Zeichen ohne Doppelpunkte als Trennzeichen

  2. Netlink Device Nummer (Interface Index) im hexadezimalen Format (siehe auch “ip addr”)

  3. Präfix-Länge in hexadezimaler Notation

  4. Wert des Gültigkeitsbereichs (s.a. Kernel Quellen “include/net/ipv6.h” und “net/ipv6/addrconf.c”)

  5. Interface flags (s.a. “include/linux/rtnetlink.h” und “net/ipv6/addrconf.c”)

  6. Devicename


11.4.2. ipv6_route

  • Typ: Eine Zeile pro Route mit jeweils mehreren Werten

Alle konfigurierten IPv6 Routen werden hier in einem speziellen Format angezeigt. Im Beispiel wird ein Loopback-Interface angezeigt. Die Werte werden unten erklärt (siehe “net/ipv6/route.c” für Details).

# 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. IPv6 Zielnetzwerk mit 32 hexadezimalen Zeichen ohne Doppelpunkte als Trennzeichen

  2. IPv6 Ziel-Präfix-Länge in hexadezimaler Notation

  3. IPv6 Ursprungsnetzwerk mit 32 hexadezimalen Zeichen ohne Doppelpunkte als Trennzeichen

  4. IPv6 Ursprungs-Präfix-Länge in hexadezimaler Notation

  5. IPv6 next Hop mit 32 hexadezimalen Zeichen ohne Doppelpunkte als Trennzeichen

  6. Metrik in hexadezimaler Schreibweise

  7. Reference Counter

  8. Use Counter

  9. Flags

  10. Devicename


11.4.3. sockstat6

  • Typ: Eine Zeile pro Protokoll mit Beschreibung und Wert

Statistiken über verwendete IPv6 Sockets. Beispiel:

# cat /proc/net/sockstat6
-TCP6: inuse 7 
-UDP6: inuse 2 
-RAW6: inuse 1 
-FRAG6: inuse 0 memory 0

11.4.4. tcp6

Mehr Infos hierzu in späteren Versionen.


11.4.5. udp6

Mehr Infos hierzu in späteren Versionen.


11.4.6. igmp6

Mehr Infos hierzu in späteren Versionen.


11.4.7. raw6

Mehr Infos hierzu in späteren Versionen.


11.4.8. ip6_flowlabel

Mehr Infos hierzu in späteren Versionen.


11.4.9. rt6_stats

Mehr Infos hierzu in späteren Versionen.


11.4.10. snmp6

  • Typ: Eine Zeile pro SNMP Beschreibung und Wert

SNMP Statistiken; diese können mittels snmp server und entsprechender MIB Tabelle mit einer Network Management Software gewonnen werden.


11.4.11. ip6_tables_names

Verfügbare netfilter6 Tabellen


Kapitel 12. Netlink-Interface zum Kernel

Mehr Infos hierzu in späteren Versionen... der Autor hat hiermit keine Erfahrung...


Kapitel 13. Adress-Auflösung

Zusätzliche Informationen sind hier zu finden

Address-Auflösung & Ziel-Adressen-Auswahl

Die Auflösung von Namen zu einer IPv4- bzw. IPv6-Adresse wird üblicherweise durch die Benutzung einer libc resolver Bibliothek durchgeführt. Dazu wird normalerweise die Funktion getaddrinfo benutzt. Im Fall, dass mehr als eine IPv6-Adresse zurückgegeben wird, soll nach RFC 3484 / Default Address Selection for Internet Protocol version 6 eine Sortierung angewandt werden, die optional auch konfiguriert werden kann.

Die “Magie” ist durch die Datei /etc/gai.conf konfigurierbar (welche fehlt oder leer ist, solange Standardwerte gelten sollen). Die vorgegebene Sortierung ist üblicherweise in der Dokumentation (z.B. /usr/share/doc/glibc-common/gai.conf) oder im Manual “man gai.conf” zu sehen.

Für die Kontrolle der Sortierung via benutzerdefinierter Konfiguration ist für Tests folgendes notwendig:

  • Ein Hostname im DNS, der mehr als eine IPv6-Adresse zurückgibt, z.B.

$ dig +short aaaa st1.bieringer.de
-2001:4dd0:ff00:834::2
-2a01:238:423d:8800:85b3:9e6b:3019:8909 

  • Lookup via DNS (mit /etc/hosts klappt es nicht)

  • /etc/gai.conf mit einer passenden Konfiguration, e.g.

precedence  ::1/128       50            # default
-precedence  ::/0          40            # default
-precedence  2002::/16     30            # default
-precedence ::/96          20            # default
-precedence ::ffff:0:0/96  10            # default
-precedence 2001:4dd0:ff00:834::/64  80  # dst-A
-precedence 2a01:238:423d:8800::/64  90  # dst-B

  • Für Tests kann dann ein Telnet-Client benutzt werden:

$ telnet st1.bieringer.de
-Trying 2a01:238:423d:8800:85b3:9e6b:3019:8909...    (dst-B)
-...
-Trying 2001:4dd0:ff00:834::2...                     (dst-A)
-...

  • Wenn nun die precedence geändert wird in der Konfiguration:

precedence 2001:4dd0:ff00:834::/64  90  # dst-A ex 80
-precedence 2a01:238:423d:8800::/64  80  # dst-B ex 90

  • Dann ändert sich die Reihenfolge entsprechend

$ telnet st1.bieringer.de
-Trying 2001:4dd0:ff00:834::2...                     (dst-A)
-...
-Trying 2a01:238:423d:8800:85b3:9e6b:3019:8909...    (dst-B)
-...

Quell-Addressen-Auswahl

Source address selection in Linux wird automatisch vom Kernel vorgenommen, üblicherweise abhängig von den Routing-Tabellen und unter der Vorgabe, den Scope einer Adresse beizubehalten.

Quell-Adressen-Auswahl mit “ip addrlabel”

Mit einer Erweiterung der internen “ip addrlabel” Tabelle kann eine Quell-Adresse zu einer Ziel-Adresse gebunden werden. Bindung wird hier durch die Angabe des gleichen Labels (einer Nummer) konfiguriert.

  • Standard von “ip addrlabel” (hier von CentOS 6):

# ip addrlabel
-prefix ::1/128 label 0 
-prefix ::/96 label 3 
-prefix ::ffff:0.0.0.0/96 label 4 
-prefix 2001::/32 label 6 
-prefix 2001:10::/28 label 7 
-prefix 2002::/16 label 2 
-prefix fc00::/7 label 5 
-prefix ::/0 label 1 

  • Das System ist multihomed (hier an einem Interface), der Router verteilt 2 Präfixe mit Hilfe von radvd:

# ip -6 addr show dev eth1 | grep -w inet6 |grep -w global
-    inet6 2001:6f8:12d8:2:5054:ff:fefb:6582/64 scope global dynamic     (src-A)
-    inet6 2001:6f8:900:8cbc:5054:ff:fefb:6582/64 scope global dynamic   (src-B)

  • Eine Verbindung zum Server zeigt nun:

$ telnet st1.bieringer.de
-Trying 2001:4dd0:ff00:834::2...                     (dst-A)
-...
-Trying 2a01:238:423d:8800:85b3:9e6b:3019:8909...    (dst-B)
-...

  • Ein tcpdump mit filter “tcp and dst port 23” zeigt nur die Benutzung der oberen lokalen Quell-IPv6-Adresse

IP6 2001:6f8:12d8:2:5054:ff:fefb:6582.37762 > 2001:4dd0:ff00:834::2.telnet:                  (src-A -> dst-A)
-IP6 2001:6f8:12d8:2:5054:ff:fefb:6582.45754 > 2a01:238:423d:8800:85b3:9e6b:3019:8909.telnet: (src-A -> dst-B)

  • Wenn nun Quelle und Ziel mit Hilfe von “ip addrlabel” zusammengebunden werden:

# ip addrlabel add prefix 2001:6f8:12d8:2::/64 label 200
-# ip addrlabel add prefix 2001:6f8:900:8cbc::/64 label 300
-# ip addrlabel add prefix 2001:4dd0:ff00:834::/64 label 200
-# ip addrlabel add prefix 2a01:238:423d:8800::/64 label 300

  • Was in folgender “ip addrlabel”resultiert:

# ip addrlabel
-prefix ::1/128 label 0 
-prefix ::/96 label 3 
-prefix ::ffff:0.0.0.0/96 label 4 
-prefix 2a01:238:423d:8800::/64 label 300   # dst-B
-prefix 2001:4dd0:ff00:834::/64 label 200   # dst-A
-prefix 2001:6f8:900:8cbc::/64 label 300    # src-B
-prefix 2001:6f8:12d8:2::/64 label 200      # src-A
-prefix 2001::/32 label 6 
-prefix 2001:10::/28 label 7 
-prefix 2002::/16 label 2 
-prefix fc00::/7 label 5 
-prefix ::/0 label 1 

  • Und dann nochmal eine Verbindung zum Server versucht wird

$ telnet st1.bieringer.de
-Trying 2001:4dd0:ff00:834::2...                     (dst-A)
-...
-Trying 2a01:238:423d:8800:85b3:9e6b:3019:8909...    (dst-B)
-...

  • tcpdump mit filter “tcp and dst port 23” zeigt nun die Benutzung beider Quell-IPv6-Adressen wie konfiguriert

IP6 2001:6f8:12d8:2:5054:ff:fefb:6582.37765   > 2001:4dd0:ff00:834::2.telnet:                  (src-A -> dst-A)
-IP6 2001:6f8:900:8cbc:5054:ff:fefb:6582.39632 > 2a01:238:423d:8800:85b3:9e6b:3019:8909.telnet: (src-B -> dst-B)

Persistente Konfiguration von “ip addrtable” ist wahrscheinlich in aktuellen Linux-Distributionen nicht unterstützt, somit wäre eine Erweiterung der Netzwerk-Init-Scripts oder rc.local notwendig. Ein Skript, welches Informationen aus /etc/gai.conf in entsprechendes “ip addrtable” umwandelt, gibt es hier: /etc/gai.conf - it ain't what you think it is


Kapitel 14. Netzwerk-Fehlersuche

14.1. Server Socket-Anbindung

14.1.1. Überprüfung der Server Socket-Anbindung mit “netstat”

Es ist immer von Interesse welche Sockets eines Knotens gerade aktiv sind. Mit “netstat” können Sie die betreffenden Informationen abfragen:

Verwendete Optionen: -nlptu

Beispiel:

# 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

14.2. tcpdump-Beispiele

Hier folgen einige Beispiele von (mit tcpdump) aufgezeichneten Paketen, die hoffentlich bei Ihrer Fehlersuche nützlich sein können.

... mehr Beispiele in den nächsten Versionen...


14.2.1. Router-Erkennung

14.2.1.1. 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=2001:0db8:0:1::/64)(src lladdr:
-¬ 0:12:34:12:34:50) (len 88, hlim 255)

Der Router mit der link-lokalen Adresse “fe80::212:34ff:fe12:3450” sendet eine Ankündigung mit zwei Präfixes “2002:0102:0304:1::/64” (Lebensdauer 30s) und “2001:0db8:0:1::/64” (Lebensdauer 2592000s) sowie der eigenen Schicht 2 MAC Adresse “0:12:34:12:34:50” an die all-node-on-link Multicast Adresse “ff02::1”.


14.2.1.2. Router Anfrage

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)

Der Knoten mit der link-lokalen Adresse “fe80:212:34ff:fe12:3456” und der Schicht 2 MAC Adresse “0:12:34:12:34:56” sucht nach einem Router und sendet hierfür diese Anfrage an die all-router-on-link Multicast Adresse “ff02::2”.


14.2.2. Neighbor-Erkennung

14.2.2.1. Neighbor discovery solicitation zur Entdeckung doppelter Adressen

Folgende Pakete werden vom Knoten mit der Schicht 2 MAC Adresse “0:12:34:12:34:56” während der automatischen Konfiguration an die solicited-node link-lokale Multicast Adresse gesendet. Es wird überprüft, ob eine potentielle Adresse bereits von einem anderen Knoten am Link verwendet wird.

  • Der Knoten will seine link-lokale Adresse “fe80:212:34ff:fe12:3456” konfigurieren und überprüft auf Duplikate

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)

  • Der Knoten will seine globale Adresse “2002:0102:0304:1:212:34ff:fe12:3456” konfigurieren (nach Empfang eines Advertisements wie weiter oben abgebildet) und überprüft auf Duplikate

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)

  • Der Knoten will seine globale Adresse “2001:0db8:0:1:212:34ff:fe12:3456” konfigurieren (nach Empfang eines Advertisements wie weiter oben abgebildet) und überprüft auf Duplikate

15:44:22.304028 :: > ff02::1:ff12:3456: icmp6: neighbor sol: who has
-¬ 2001:0db8:0:1:212:34ff:fe12:3456(src lladdr: 0:12:34:12:34:56) (len 32, hlim
-¬ 255)

14.2.2.2. Neighbor discovery solicitation zur Host oder Gateway-Suche

  • Der Knoten möchte Pakete an die Adresse “2001:0db8:0:1::10” senden, hat hierfür aber keine Schicht 2 MAC Adresse und sendet aus diesem Grund zuerst eine Anfrage

13:07:47.664538 2002:0102:0304:1:2e0:18ff:fe90:9205 > ff02::1:ff00:10: icmp6:
-¬ neighbor sol: who has 2001:0db8:0:1::10(src lladdr: 0:e0:18:90:92:5) (len 32,
-¬ hlim 255)

  • Der Knoten sucht nun nach der Adresse “fe80::10”

13:11:20.870070 fe80::2e0:18ff:fe90:9205 > ff02::1:ff00:10: icmp6: neighbor
-¬ sol: who has fe80::10(src lladdr: 0:e0:18:90:92:5) (len 32, hlim 255)

Kapitel 15. Unterstützung einer ständigen IPv6-Konfiguration in Linux Distributionen

Einige Linux-Distributionen unterstützen bereits eine permanente IPv6 Konfiguration. Hierbei werden sowohl bestehende oder als auch neue Konfiguration- und Skriptdateien verwendet sowie tlw. IPv4 Skripte abgeändert.


15.1. Red Hat Linux und “Klone”

Seitdem der Autor begann das IPv6 & Linux - HowTo zu schreiben, war es seine Absicht eine permanente IPv6 Konfiguration zu ermöglichen, wobei die gebräuchlichsten Anwendungsszenarien wie Host-only, Router-only, Dual-homed-host, Router mit einem zweiten Netzwerkstrang, normale Tunnel, 6to4 Tunnel, etc. abgedeckt sein sollten. Heute gibt es eine Sammlung von Konfigurations- und Skriptdateien, die genau diesem Zweck erfüllen (es wurden nie echte Probleme gemeldet, allerdings ist unbekannt von wie vielen Personen dieses Set benutzt wird). Diese Dateien werden von Zeit zu Zeit erweitert und es gibt inzwischen eine eigene Homepage hierfür: initscripts-ipv6 homepage (Spiegel). Da der Autor seine ersten Schritte mit IPv6 auf einem Red Hat Linux 5.0 Klon gemacht habe, basieren seine IPv6 Entwicklungssysteme heute zumeist auf Red Hat Linux und die Skriptdateien sind folglich primär für diese Distributionen gedacht. Es war ebenfalls sehr einfach bestehende Konfigurationsdateien zu erweitern, neue zu erstellen und den Start des IPv6 Setup in das IPv4 Setup einzubetten.

Erfreulicherweise beinhaltet Red Hat Linux seit der Version 7.1 die IPv6-Skripts des Autors. Unterstützt wurde dies und wird auch weiterhin von Pekka Savola.

Bei Mandrake ist ab Version 8.0 ebenfalls ein IPv6-fähiges initscript Paket beinhaltet, ein kleiner Fehler verhindert aber nach wie vor die Anwendung (“ifconfig” vermisst “inet6” vor “add”).


15.1.1. Test der IPv6-Unterstützung bei Netzwerk-Konfigurations-Scripts

Sie können überprüfen, ob Ihre Distribution eine permanente IPv6 Konfiguration unter Verwendung der Skript-Sammlung des Autors unterstützt. Folgende script library sollte existieren:

/etc/sysconfig/network-scripts/network-functions-ipv6

Automatischer Test:

# test -f /etc/sysconfig/network-scripts/network-functions-ipv6 && echo "Main
-¬ IPv6 script library exists"

Die Versionsnummer der Library ist von Interesse, wenn Sie Features vermissen sollten. Die Versionsnummer können Sie anzeigen, indem Sie folgenden Befehl ausführen (einfacher ist es sicherlich, wenn Sie im Header der Datei nachlesen):

# source /etc/sysconfig/network-scripts/network-functions-ipv6 &&
-¬ getversion_ipv6_functions 
-20011124

Im obigen Beispiel ist die Versionsnummer 20011124. Um zu sehen, was sich inzwischen geändert hat, können Sie hier die neuesten Informationen nachlesen: initscripts-ipv6 homepage (Spiegel). Sie finden hier auch ein Change-Log.


15.1.2. Kurze Anleitung zum aktivieren von IPv6 bei RHL 7.1, 7.2, 7.3, ...

  • Überprüfen Sie, ob das IPv6 Modul auf Ihrem System bereits geladen ist:

# modprobe -c | grep net-pf-10
-alias net-pf-10 off

  • Ist das Ergebnis “off”, dann aktivieren Sie IPv6 durch hinzufügen folgender Zeile in /etc/sysconfig/network

NETWORKING_IPV6=yes

  • Rebooten bzw. starten Sie das Netzwerk neu mit dem Befehl

# service network restart

  • Nun sollte das IPv6 Modul geladen sein

# modprobe -c | grep ipv6
-alias net-pf-10 ipv6

Ist ihr System an einem Link, der Router Advertisements liefert, dann wird die automatische Konfiguration automatisch durchgeführt. Zusätzlich Informationen darüber, welche Einstellungen unterstützt werden finden Sie in der Datei /usr/share/doc/initscripts-$version/sysconfig.txt.


15.2. SuSE Linux

Seit neueren 7.x Versionen gibt es eine wirklich rudimentäre Unterstützung für IPv6, siehe /etc/rc.config für Details.

Aufgrund der komplett unterschiedlichen Struktur der Konfigurations- und Scriptdateien ist es sehr schwer (oder unmöglich) das Set für Red Hat Linux und seine Klone mit dieser Distribution zu verwenden. -In Version 8.x wurde das Konfigurations-Setup bei SuSE komplett abgeändert.


15.2.1. SuSE Linux 7.3


15.2.2. SuSE Linux 8.0

15.2.2.1. IPv6-Adress-Konfiguration

Editiere Datei /etc/sysconfig/network/ifcfg-<Interface-Name> und setze folgende Variable entsprechend

IP6ADDR="<ipv6-Adresse>/<prefix>"

15.2.2.2. Zusätzliche information

Siehe Datei /usr/share/doc/packages/sysconfig/README


15.2.3. SuSE Linux 8.1

15.2.3.1. IPv6-Adress-Konfiguration

Editiere Datei /etc/sysconfig/network/ifcfg-<Interface-Name> und setze folgende Variable entsprechend

IPADDR="<ipv6-Adresse>/<prefix>"

15.2.3.2. Zusätzliche information

Siehe Datei /usr/share/doc/packages/sysconfig/Network


15.3. Debian Linux

Folgende Information wurde von Stephane Bortzmeyer <bortzmeyer at nic dot fr> beigesteuert.

  1. Überprüfe, ob IPv6 aktiv ist, entweder weil es in den Kernel hineinkompilier oder das Modul geladen wurde. Für die letzte Möglichkeit gibt es 3 Lösungen: Editieren der Datei /etc/modules, Benutzung des Features pre-up (siehe unten) oder Benutzung von kmod (wird hier nicht weiter erklärt).

  2. Konfiguriere die Schnittstelle (hier im Beispiel: eth0). Editiere /etc/network/interfaces :

iface eth0 inet6 static
-        pre-up modprobe ipv6
-        address 2001:0db8:1234:5::1:1
-        # To suppress completely autoconfiguration:
-        # up echo 0 > /proc/sys/net/ipv6/conf/all/autoconf
-        netmask 64
-        # The router is autoconfigured and has no fixed address.
-        # It is magically
-        # found. (/proc/sys/net/ipv6/conf/all/accept_ra). Otherwise:
-        #gateway 2001:0db8:1234:5::1

Danach rebooten oder folgendes Kommando ausführen

# ifup --force eth0

Danach sollte die statische IPv6-Adresse konfiguriert sein.


15.3.1. Weiterführende Informationen


Kapitel 16. Automatische Konfiguration

16.1. Stateless Auto-Konfiguration (out-of-the-box)

Wird unterstützt und kann bei der zugewiesenen link-lokalen Adressen beobachtet werden, sobald ein IPv6 fähiges Interface aktiv ist.

Beispiel:

# ip -6 addr show dev eth0 scope link
-2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qlen1000
-    inet6 fe80::211:d8ff:fe6b:f0f5/64 scope link
-       valid_lft forever preferred_lft forever 

16.2. Stateless Auto-Konfiguration unter Verwendung des Router Advertisement Daemon (radvd)

Mehr Infos hierzu in späteren Versionen. Siehe unten im Abschnitt radvd daemon autoconfiguration.


16.3. Dynamic Host Configuration Protocol v6 (DHCPv6)

Nach einer langen Zeit der Diskussion wurde RFC 3315 / Dynamic Host Configuration Protocol for IPv6 (DHCPv6) verabschiedet. Momentan (10/2005) existieren 2 Implementierungen:


Kapitel 17. Mobilität

17.1. Allgemeines

17.1.1. Mobilität eines Knotens (Node Mobility)

Die Unterstützung für IPv6-Mobilität in Linux kann durch die Installation der MIPL2-Implementierung aktviert werden, welche hier zu finden ist: http://www.mobile-ipv6.org/

Diese Implementierung ist konform zur RFC 3775. Sie besteht aus einem Kernel-Patch und einen Mobilitäts-Daemon (genannt mip6d). Die Version 2.0.1 passt für Linux kernel 2.6.15.

Installation und Setup sind im Linux Mobile IPv6 HOWTO beschrieben.


17.1.2. Netzwerk-Mobililtät

Zusätzlich existiert die Implementierung der Netzwerk-Mobilität für Linux, genannt NEPL, und basiert auf MIPL. Diese steht auch zur Verfügung unter: http://www.mobile-ipv6.org/.

Folgendes HOWTO Dokument beschreibt Setup und Konfiguration: http://www.nautilus6.org/doc/nepl-howto/.


17.1.3. Links


Kapitel 18. Firewall-Funktionalität

Die IPv6 Firewall-Funktionalität ist wichtig; vor allem dann, wenn Sie auf Ihren internen Netzen IPv6 mit globalen IPv6 Adressen einsetzen. In IPv6 werden - im Unterschied zu IPv4, wo interne Hosts automatisch durch private IPv6 Adressen geschützt werden (RFC 1918 / Address Allocation for Private Internets bzw. Google search for Microsoft + APIPA) - globale Adressen verwendet und jeder mit IPv6-Anbindung kann alle internen Knoten, bei denen IPv6 aktiv ist, erreichen.


18.1. Firewall-Funktionalität mit netfilter6

Von Haus aus unterstützt wird die IPv6-Firewall-Funktionalität im Kernel erst ab Version 2.4+. In älteren 2.2+ Versionen können sie nur mit Protocol 41 das generelle Tunnel von IPv6-in-IPv4-Paketen filtern.

Achtung: Es gibt keine Garantie, dass die beschriebenen Regeln und Beispiele ihr System auch wirklich schützen können!

Beobachten Sie nach der Installation ihr Regelset, siehe Abschnitt Abschnitt 19.3.

Kernels ab Version 2.6.20 (Februar 2007) unterstützen den IPv6-Verbindungsstatus (connection tracking) vollständig.

Kernels ab Version 3.9.0 (April 2013) unterstützen NAT für IPv6 in Verbindung mit ip6tables >= 1.4.18

Kernels ab Version 3.13 (April 2014) unterstützen ein neues Framework namens: nftables


18.1.1. Weitere Informationen


18.2. Vorbereitung

Dies ist nur notwendig, wenn der mitgelieferte Kernel und Netfilter nicht den Ansprüchen genügt und neue Featurs bereits verfügbar sind, jedoch noch nicht beinhaltet.


18.2.1. Quellen besorgen

Besorgen Sie sich den aktuellsten Kernel: http://www.kernel.org/

Besorgen Sie sich das aktuellste iptables Paket:


18.2.2. Quellen entpacken

Wechseln Sie in das Source-Verzeichnis:

# cd /path/to/src 

Entpacken sie die Kernel-Quellen und vergeben diesen einen neuen Namen

# tar z|jxf kernel-version.tar.gz|bz2 
-# mv linux linux-version-iptables-version+IPv6 

Entpacken Sie die iptables Quellen

# tar z|jxf iptables-version.tar.gz|bz2 

18.2.3. Neueste iptables/IPv6-relevante Patches den Kernel-Quellen hinzufügen

Wechseln Sie in das iptables Verzeichnis

# cd iptables-version 

Fügen Sie relevante Patches hinzu

# make pending-patches KERNEL_DIR=/path/to/src/linux-version-iptables-version/ 

Fügen Sie zusätzliche IPv6 relevante IPv6 Patches hinzu (die nach wie vor nicht im Standard-Kernel enthalten sind)

# make patch-o-matic KERNEL_DIR=/path/to/src/linux-version-iptables-version/ 

Sagen Sie zu folgenden Optionen (iptables-1.2.2) Ja:

  • ah-esp.patch

  • masq-dynaddr.patch (nur benötigt bei Systemen mit dynamischer IP-Zuweisung am WAN mittels PPP oder PPPoE)

  • ipv6-agr.patch.ipv6

  • ipv6-ports.patch.ipv6

  • LOG.patch.ipv6

  • REJECT.patch.ipv6

Überprüfen Sie die Erweiterungen

# make print-extensions 
-Extensions found: IPv6:owner IPv6:limit IPv6:mac IPv6:multiport

18.2.4. Konfiguration, kompilieren und Installation eines neues Kernels

Wechseln Sie zu den Kernel-Quellen

# cd /path/to/src/linux-version-iptables-version/ 

Editieren Sie das Makefile

- EXTRAVERSION = 
-+ EXTRAVERSION = -iptables-version+IPv6-try 

Starten Sie configure und aktivieren Sie IPv6 relevante Optionen

            Code maturity level options 
-                  Prompt for development and/or incomplete code/drivers : yes 
-            Networking options 
-                  Network packet filtering: yes 
-                  The IPv6 protocol: module 
-                       IPv6: Netfilter Configuration 
-                             IP6 tables support: module 
-                             All new options like following: 
-                                   limit match support: module 
-                                   MAC address match support: module 
-                                   Multiple port match support: module 
-                                   Owner match support: module 
-                                   netfilter MARK match support: module 
-                                   Aggregated address check: module 
-                                   Packet filtering: module 
-                                        REJECT target support: module 
-                                        LOG target support: module 
-                                   Packet mangling: module 
-                                   MARK target support: module 

Konfigurieren Sie bei Bedarf Sonstiges abseits von IPv6.

Kompilieren und Installation: siehe Kapitel Kernel sowie andere HOWTOs.


18.2.5. iptables neu kompilieren und installieren

Stellen Sie sicher, dass obige Kernel-Sourceverzeichnisstruktur unter /usr/src/linux liegt

Benennen sie das ältere Verzeichnis um

# mv /usr/src/linux /usr/src/linux.old 

Erstellen Sie einen neuen symbolischen Link

# ln -s /path/to/src/linux-version-iptables-version /usr/src/linux 

Erstellen Sie ein neues SRPMS

# rpm --rebuild /path/to/SRPMS/iptables-version-release.src.rpm 

Installieren Sie das neue iptables Paket (iptables + iptables-ipv6)

  • Bei RH 7.1 Systemen ist normalerweise eine ältere Version hiervon bereits installiert, verwenden Sie daher die Option “Freshen”:

# rpm -Fhv /path/to/RPMS/cpu/iptables*-version-release.cpu.rpm 

  • Ist keine ältere Version installiert, benutzen Sie die Option “install”:

# rpm -ihv /path/to/RPMS/cpu/iptables*-version-release.cpu.rpm 

  • Bei RH 6.2 Systemen ist normalerweise kein Kernel Version 2.4.x installiert und die Anforderungen sind demnach nicht gegeben. Benutzen Sie in diesem Fall “nodeps”:

# rpm -ihv --nodeps /path/to/RPMS/cpu/iptables*-version-release.cpu.rpm 

Damit iptables die Libraries finden kann, ist es eventuell notwendig, einen symbolischen Link für die iptables Libraries zu erstellen:

# ln -s /lib/iptables/ /usr/lib/iptables 

18.3. Verwendung

18.3.1. Unterstützung im Kernel

Laden Sie das Modul (falls dies im Kernel so kompiliert wurde):

# modprobe ip6_tables 

Überprüfen der IPv6-Unterstützung:

# [ ! -f /proc/net/ip6_tables_names ] && echo "Current kernel doesn't support
-¬ 'ip6tables' firewalling (IPv6)!" 

18.3.2. Die Benützung von iptables lernen

18.3.2.1. Auflistung aller netfilter Einträge

  • Kurze Auflistung:

# ip6tables -L 

  • Erweiterte Auflistung:

# ip6tables -n -v --line-numbers -L 

18.3.2.2. Auflistung angegebener Filter

# ip6tables -n -v --line-numbers -L INPUT 

18.3.2.3. Hinzufügen einer Log-Regel zum Input-Filter mit Optionen

# ip6tables --table filter --append INPUT  -j LOG --log-prefix "INPUT:"
-¬ --log-level 7 

18.3.2.4. Hinzufügen einer Drop-Regel zum Input-Filter

# ip6tables --table filter --append INPUT  -j DROP 

18.3.2.5. Löschen einer Regel mit Hilfe der Regelnummer

# ip6tables --table filter --delete INPUT 1 

18.3.2.6. Aktiviere die Auswertung des Verbindungsstatus (connection tracking)

Seit Kernel-Version 2.6.20 ist die Auswertung des IPv6-Verbindungsstatus gut unterstützt. Die bis dahin statuslosen Filterregeln sollten ersetzt werden..

# ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

18.3.2.7. ICMPv6 erlauben

Bei älteren Kernelversionen (unpatched kernel 2.4.5 und iptables-1.2.2) kann keine nähere Spezifizierung des ICMPv6-Typs vorgenommen werden:

  • Eingehender ICMPv6 Verkehr durch Tunnel erlauben

# ip6tables -A INPUT -i sit+ -p icmpv6 -j ACCEPT 

  • Ausgehenden ICMPv6 Verkehr durch Tunnel erlauben

# ip6tables -A OUTPUT -o sit+ -p icmpv6 -j ACCEPT 

Neuere Kernel erlauben das Spezifizieren des ICMPv6-Typs:

# ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j ACCEPT

18.3.2.8. Rate-limiting

Da es zu einem ICMPv6 Storm kommen kann (der Autor hat dies bereits mehrfach beobachtet), sollten sie das rate limiting zumindest für das ICMP Regelset einsetzen. Zusätzlich sollten auch die Logging Regeln mit rate limiting geschützt werden, um DoS Attacken gegen das syslog sowie gegen die Logdateien enthaltenden Patitionen entgegenzuwirken. Ein Beispiel für ein rate limited ICMPv6 sieht wie folgt aus:

# ip6tables -A INPUT --protocol icmpv6 --icmpv6-type echo-request
-¬ -j ACCEPT --match limit --limit 30/minute

18.3.2.9. Eingehende SSH-Verbindung erlauben

Im folgenden Beispiel werden eingehende SSH-Verbindungen von einer speziellen IPv6 Adresse zugelassen:

  • Eingehende SSH Verbindungen werden von der Adresse 2001:0db8:100::1/128 erlaubt

# ip6tables -A INPUT -i sit+ -p tcp -s 2001:0db8:100::1/128 --sport 512:65535
-¬ --dport 22 -j ACCEPT 

  • Erlaube Antwortpakete (nicht mehr notwendig, wenn der IPv6-Verbindungsstatus ausgewertet wird!)

# ip6tables -A OUTPUT -o sit+ -p tcp -d 2001:0db8:100::1/128 --dport 512:65535
-¬ --sport 22 ! --syn -j ACCEPT 

18.3.2.10. Getunnelten IPv6-in-IPv4 Datenverkehr erlauben

Um getunnelte IPv6-in-IPv4 Pakete zu akzeptieren, müssen Sie in Ihrem IPv4 Firewall-Setup entsprechende Regeln einzufügen, z.B.

  • Akzeptiere eingehende IPv6-in-IPv4 Daten am interface ppp0

# iptables -A INPUT -i ppp0 -p ipv6 -j ACCEPT 

  • Akzeptiere ausgehende IPv6-in-IPv4 Daten am interface ppp0

# iptables -A OUTPUT -o ppp0 -p ipv6 -j ACCEPT 

Haben Sie nur einen statischen Tunnel, dann können sie die IPv4 Adresse auch dediziert angeben:

  • Akzeptiere eingehende IPv6-in-IPv4 Daten vom Tunnel-Endpunkt 192.0.2.2 am interface ppp0

# iptables -A INPUT -i ppp0 -p ipv6 -s 192.0.2.2 -j ACCEPT 

  • Akzeptiere ausgehende IPv6-in-IPv4 Daten vom Tunnel-Endpunkt 192.0.2.2 am interface ppp0

# iptables -A OUTPUT -o ppp0 -p ipv6 -d 192.0.2.2 -j ACCEPT 

18.3.2.11. Schutz gegen eingehende TCP-Verbindungs-Anfragen

SEHR EMPFOHLEN! Aus Sicherheitsgründen sollten Sie auf jeden Fall eine Regel inkludieren, wodurch eingehende TCP-Verbindungs-Anfragen geblockt werden. Wenn Sie andere Interfacenamen verwenden, müssen Sie die Option "-i" entsprechend anpassen!

  • Blockiere eingehende TCP-Verbindungs-Anfragen zu diesem Host

# ip6tables -I INPUT -i sit+ -p tcp --syn -j DROP 

  • Blockiere eingehende TCP-Verbindungs-Anfragen zu Hosts hinter diesem Router

# ip6tables -I FORWARD -i sit+ -p tcp --syn -j DROP 

Eventuell müssen diese Regeln unterhalb anderer Regeln platziert werden. Nehmen Sie sich für die Reihenfolge der Regeln etwas Zeit. Sinnvoll wird es auch sein, ein Script mit den Regeln zu erstellen, damit die Regeln in der gewünschten Reihenfolge angewendet werden.


18.3.2.12. Schutz gegen eingehende UDP-Verbindungs-Anfragen

EBENFALLS SEHR EMPHOLEN! Wie bereits im Kapitel Firewall erwähnt, ist es möglich die Ports bei ausgehenden UDP/TCP-Verbindungen zu kontrollieren. Im Falle, dass all Ihre IPv6 Systeme lokale Ports verwenden, z.B. von 32768 bis 60999, dann können sie ebenfalls UDP Verbindungen filtern (bis das Verbindungs-Tracking funktioniert):

  • Blockiere eingehende UDP-Pakete, die nicht Antworten ausgehender Anfragen dieses Host sein können

# ip6tables -I INPUT -i sit+ -p udp ! --dport 32768:60999 -j DROP 

  • Blockiere eingehende UDP-Pakete, die nicht Antworten auf Anfragen von hinter diesem Router gelegenen Hosts sein können

# ip6tables -I FORWARD -i sit+ -p udp ! --dport 32768:60999 -j DROP 

18.3.3. Anwendungsbeispiele

18.3.3.1. Einfaches Beispiel für Fedora

Folgende Zeilen zeigen eine einfache Firewall-Konfiguration für Fedora 6 (ab Kernel-Version 2.6.20). Ausgehend von dem Origina (generiert durch system-config-firewall) wurden Modifikationen für die Unterstützung des Verbindungsstatus und der Rückgabe der passenden ICMPv6-Meldung für Rejects. Eingehende SSH (Port 22) Verbindungen sind erlaubt.

Datei: /etc/sysconfig/ip6tables
-
-*filter :INPUT ACCEPT [0:0]
-:FORWARD ACCEPT [0:0]
-:OUTPUT ACCEPT [0:0]
-:RH-Firewall-1-INPUT - [0:0]
--A INPUT -j RH-Firewall-1-INPUT
--A FORWARD -j RH-Firewall-1-INPUT
--A RH-Firewall-1-INPUT -i lo -j ACCEPT
--A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT
--A RH-Firewall-1-INPUT -p 50 -j ACCEPT
--A RH-Firewall-1-INPUT -p 51 -j ACCEPT
--A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT
--A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT 
--A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
--A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
--A RH-Firewall-1-INPUT -m state --state NEW -p tcp --dport 22 -j ACCEPT
--A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited
-COMMIT 

Zwecks der Vollständigkeit ist hier auch die entsprechende Konfiguration für IPv4 gezeigt:

Datei: /etc/sysconfig/iptables
-
-*filter :INPUT ACCEPT [0:0]
-:FORWARD ACCEPT [0:0]
-:OUTPUT ACCEPT [0:0]
-:RH-Firewall-1-INPUT - [0:0]
--A INPUT -j RH-Firewall-1-INPUT
--A FORWARD -j RH-Firewall-1-INPUT
--A RH-Firewall-1-INPUT -i lo -j ACCEPT
--A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
--A RH-Firewall-1-INPUT -p 50 -j ACCEPT
--A RH-Firewall-1-INPUT -p 51 -j ACCEPT
--A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
--A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
--A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
--A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
--A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
--A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
-COMMIT 

Benutzung:

  • Erzeugen/Modifizieren der Konfigurationsdateien

  • Aktivieren von IPv4 & IPv6 Firewalling

# service iptables start
-# service ip6tables start

  • Aktivieren des automatischen Starts nach dem Reboot

# chkconfig iptables on
-# chkconfig ip6tables on

18.3.3.2. Umfangreicheres Beispiel

Folgende Zeilen zeigen ein umfangreicheres Setup. Happy netfilter6 Regelset erstellen...

# ip6tables -n -v -L 
-Chain INPUT (policy DROP 0 packets, 0 bytes) 
- pkts bytes target     prot opt in     out     source               destination
-    0     0 extIN      all      sit+   *       ::/0                 ::/0 
-    4   384 intIN      all      eth0   *       ::/0                 ::/0 
-    0     0 ACCEPT     all      *      *       ::1/128              ::1/128 
-    0     0 ACCEPT     all      lo     *       ::/0                 ::/0 
-    0     0 LOG        all      *      *       ::/0                 ::/0       
-¬        LOG flags 0 level 7 prefix `INPUT-default:' 
-    0     0 DROP       all      *      *       ::/0                 ::/0 
- 
-Chain FORWARD (policy DROP 0 packets, 0 bytes) 
- pkts bytes target     prot opt in     out     source               destination
-¬ 
-    0     0 int2ext    all      eth0   sit+    ::/0                 ::/0 
-    0     0 ext2int    all      sit+   eth0    ::/0                 ::/0 
-    0     0 LOG        all      *      *       ::/0                 ::/0       
-¬        LOG flags 0 level 7 prefix `FORWARD-default:' 
-    0     0 DROP       all      *      *       ::/0                 ::/0 
- 
-Chain OUTPUT (policy DROP 0 packets, 0 bytes) 
- pkts bytes target     prot opt in     out     source               destination
-¬ 
-    0     0 extOUT     all      *      sit+    ::/0                 ::/0 
-    4   384 intOUT     all      *      eth0    ::/0                 ::/0 
-    0     0 ACCEPT     all      *      *       ::1/128              ::1/128 
-    0     0 ACCEPT     all      *      lo      ::/0                 ::/0 
-    0     0 LOG        all      *      *       ::/0                 ::/0       
-¬        LOG flags 0 level 7 prefix `OUTPUT-default:' 
-    0     0 DROP       all      *      *       ::/0                 ::/0 
- 
-Chain ext2int (1 references) 
- pkts bytes target     prot opt in     out     source               destination
-¬ 
-    0     0 ACCEPT     icmpv6    *      *       ::/0                 ::/0 
-    0     0 ACCEPT     tcp      *      *       ::/0                 ::/0       
-¬        tcp spts:1:65535 dpts:1024:65535 flags:!0x16/0x02 
-    0     0 LOG        all      *      *       ::/0                 ::/0       
-¬        LOG flags 0 level 7 prefix `ext2int-default:' 
-    0     0 DROP       tcp      *      *       ::/0                 ::/0 
-    0     0 DROP       udp      *      *       ::/0                 ::/0 
-    0     0 DROP       all      *      *       ::/0                 ::/0 
- 
-Chain extIN (1 references) 
- pkts bytes target     prot opt in     out     source               destination
-¬ 
-    0     0 ACCEPT     tcp      *      *       3ffe:400:100::1/128  ::/0       
-¬        tcp spts:512:65535 dpt:22 
-    0     0 ACCEPT     tcp      *      *       3ffe:400:100::2/128  ::/0       
-¬        tcp spts:512:65535 dpt:22 
-    0     0 ACCEPT     icmpv6    *      *       ::/0                 ::/0 
-    0     0 ACCEPT     tcp      *      *       ::/0                 ::/0       
-¬        tcp spts:1:65535 dpts:1024:65535 flags:!0x16/0x02 
-    0     0 ACCEPT     udp      *      *       ::/0                 ::/0       
-¬        udp spts:1:65535 dpts:1024:65535 
-    0     0 LOG        all      *      *       ::/0                 ::/0       
-¬        limit: avg 5/min burst 5 LOG flags 0 level 7 prefix `extIN-default:' 
-    0     0 DROP       all      *      *       ::/0                 ::/0 
- 
-Chain extOUT (1 references) 
- pkts bytes target     prot opt in     out     source               destination
-¬ 
-    0     0 ACCEPT     tcp      *      *       ::/0                
-¬ 2001:0db8:100::1/128tcp spt:22 dpts:512:65535 flags:!0x16/0x02 
-    0     0 ACCEPT     tcp      *      *       ::/0                
-¬ 2001:0db8:100::2/128tcp spt:22 dpts:512:65535 flags:!0x16/0x02 
-    0     0 ACCEPT     icmpv6    *      *       ::/0                 ::/0 
-    0     0 ACCEPT     tcp      *      *       ::/0                 ::/0       
-¬        tcp spts:1024:65535 dpts:1:65535 
-    0     0 ACCEPT     udp      *      *       ::/0                 ::/0       
-¬        udp spts:1024:65535 dpts:1:65535 
-    0     0 LOG        all      *      *       ::/0                 ::/0       
-¬        LOG flags 0 level 7 prefix `extOUT-default:' 
-    0     0 DROP       all      *      *       ::/0                 ::/0 
- 
-Chain int2ext (1 references) 
- pkts bytes target     prot opt in     out     source               destination
-¬ 
-    0     0 ACCEPT     icmpv6    *      *       ::/0                 ::/0 
-    0     0 ACCEPT     tcp      *      *       ::/0                 ::/0       
-¬        tcp spts:1024:65535 dpts:1:65535 
-    0     0 LOG        all      *      *       ::/0                 ::/0       
-¬        LOG flags 0 level 7 prefix `int2ext:' 
-    0     0 DROP       all      *      *       ::/0                 ::/0 
-    0     0 LOG        all      *      *       ::/0                 ::/0       
-¬        LOG flags 0 level 7 prefix `int2ext-default:' 
-    0     0 DROP       tcp      *      *       ::/0                 ::/0 
-    0     0 DROP       udp      *      *       ::/0                 ::/0 
-    0     0 DROP       all      *      *       ::/0                 ::/0 
- 
-Chain intIN (1 references) 
- pkts bytes target     prot opt in     out     source               destination
-¬ 
-    0     0 ACCEPT     all      *      *       ::/0                
-¬ fe80::/ffc0:: 
-    4   384 ACCEPT     all      *      *       ::/0                 ff02::/16 
- 
-Chain intOUT (1 references) 
- pkts bytes target     prot opt in     out     source               destination
-¬ 
-    0     0 ACCEPT     all      *      *       ::/0                
-¬ fe80::/ffc0:: 
-    4   384 ACCEPT     all      *      *       ::/0                 ff02::/16 
-    0     0 LOG        all      *      *       ::/0                 ::/0       
-¬        LOG flags 0 level 7 prefix `intOUT-default:' 
-    0     0 DROP       all      *      *       ::/0                 ::/0 

18.4. Network Address Translation (NAT) mit netfilter6

Seit mindestens Linux Kernel-Version 3.9.0 und ip6tables ab 1.4.18 kann Network Address Translation (NAT) genutzt werden.


18.4.1. IPv6 Maskierung

Wie bei IPv4 können Systeme hinter einem Router versteckt werden mit Hilfe von IPv6 Maskierung (hide/overlap NAT), z.B.

# ip6tables -t nat -A POSTROUTING -o sixxs -s fec0::/64 -j MASQUERADE

18.4.2. IPv6 Destination NAT

Eine dedizierte öffentliche IPv6-Adresse kann zu einer internen IPv6-Adresse weitergeleitet werden, z.B.

# ip6tables -t nat -A PREROUTING -d 2001:db8:0:1:5054:ff:fe01:2345 -i sixxs -j DNAT --to-destination fec0::5054:ff:fe01:2345

18.4.3. IPv6 Port Weiterleitung

Ein dedizierter Port kann zu einem internen System weitergeleitet werden, z.B.

# ip6tables -t nat -A PREROUTING -i sixxs -p tcp --dport 8080 -j DNAT --to-destination [fec0::1234]:80

18.5. Firewall-Setup mit nftables

Mit nftables wurde die Unterstützung einer Tabelle names “inet” eingeführt in welcher Regeln für IPv4/IPv6 gleichzeitig gelten


18.5.1. Präparation zur Nutzung von nftables

Installieren einer Linux-Distribution, welche die Unterstützung für nftables bereits eingebaut hat. Beim Schreiben dieses Absatzes (Mai 2014) war mindestens Fedora Rawhide (Vorläufer der Version 21) mit entsprechendem Support und nftables version 0.2.0 versehen.


18.5.2. Basis-nftables Konfiguration

Laden der Kernel-Module:

# modprobe nf_tables
-# modprobe nf_tables_ipv4
-# modprobe nf_tables_ipv6
-# modprobe nf_tables_inet 

Löschen der Regeln in iptables and ip6tables um Interferenzen zu vermeiden:

# iptables -F
-# ip6tables -F

Erzeugen der Filter-Tabelle:

# nft add table inet filter 

Erzeugen einer input chain in der Filter-Tabelle:

# nft add chain inet filter input { type filter hook input priority 0 \; }

18.5.3. Einfache Filter-Policy mit nftables

18.5.3.1. Konfiguration

Erlauben von Paketen, die zu existierenden Einträgen in der Connection-Tracking-Tabelle gehören

# nft add rule inet filter input ct state established,related counter accept 

Erlauben von IPv4 und IPv6 ICMP echo-request (aka ping)

# nft add rule inet filter input meta nfproto ipv4 icmp type { echo-request } counter accept
-# nft add rule inet filter input meta nfproto ipv6 icmpv6 type echo-request counter accept 

Erlauben einiger wichtiger IPv6 ICMP Pakete, ohne Zähler, dafür mit Hop-Limit-Prüfung (erhöht die Sicherheit)

# nft add rule inet filter input meta nfproto ipv6
-¬  icmpv6 type { nd-neighbor-advert, nd-neighbor-solicit, nd-router-advert} ip6 hoplimit 1 accept
-# nft add rule inet filter input meta nfproto ipv6
-¬  icmpv6 type { nd-neighbor-advert, nd-neighbor-solicit, nd-router-advert} ip6 hoplimit 255 counter accept

Erlauben von eingehenden SSH-Verbindungen für IPv4 und IPv6

# nft add rule inet filter input tcp dport 22 ct state new tcp flags \& \(syn \| ack\) == syn counter accept

Reject/drop anderer Pakete

# nft add rule inet filter input tcp dport 0-65535 reject
-# nft add rule inet filter input udp dport 0-65535 counter drop
-# nft add rule inet filter input counter drop

18.5.3.2. Ergebnis

Tabelle für IP unabhängigen Filter

table inet filter {
-	chain input {
-		 type filter hook input priority 0;
-		 ct state established,related counter packets 0 bytes 0 accept
-		 ip protocol icmp icmp type { echo-request} counter packets 0 bytes 0 accept
-		 ip6 nexthdr ipv6-icmp icmpv6 type echo-request counter packets 0 bytes 0 accept
-		 ip6 nexthdr ipv6-icmp ip6 hoplimit 1 icmpv6 type { nd-neighbor-advert, nd-neighbor-solicit, nd-router-advert} accept
-		 ip6 nexthdr ipv6-icmp ip6 hoplimit 255 icmpv6 type { nd-neighbor-advert, nd-neighbor-solicit, nd-router-advert} accept
-		 tcp dport ssh ct state new tcp flags & (syn | ack) == syn counter packets 0 bytes 0 accept
-		 tcp dport >= 0 tcp dport <= 65535 counter packets 0 bytes 0 reject
-		 udp dport >= 0 udp dport <= 65535 counter packets 0 bytes 0 drop
-		 log prefix counter packets 0 bytes 0 drop
-	}
-} 

18.5.3.3. Tipps für's Loggen

Für Logging wird ein zusätzliches Kernelmodul benötigt:

# modprobe xt_LOG

ACHTUNG, MOMENTAN KANN DER LOG-LEVEL NICHT ANGEGEBEN WERDEN, dadurch werden nftables-Ereignisse mit Log-Level kern.emerg ausgegeben - ES BESTEHT DIE GEFAHR, DASS DIE KONSOLE DADURCH ÜBERFLUTET WIRD!

Für erste Tests mit der Log-Option kann es nützlich sein, das Loggens für emergency-Ereignisse in z.B. /etc/rsyslog.conf zu deaktivieren mit Hilfe eines “#” am Anfang der Zeile und Neustart des logging-Daemons

#*.emerg    :omusrmsg:* 

Regel von oben, welche SSH auf Port 22 erlaubt, nun mit Logging:

# nft add rule inet filter input tcp dport 22 ct state new tcp flags \& \(syn \| ack\) == syn log prefix \"inet/input/accept: \" counter accept

18.5.4. Filter-Policy mit nftables unter Benutzung der Tablellen “ip”, “ip6” und “inet”

Wie oben schon beschrieben, wenn die Regeln in den einzelnen Tabellen konfiguriert werden, muss gesichert sein, dass frühere “accepts” nicht aufgehoben werden. Eine einfache Lösung ist die Benutzung von Markierungen. Regeln, die Pakete erlauben, setzen die Marke mit “meta mark set xxxx”. Eine generische Regel erlaubt Pakete mit gesetzter Marke “mark xxxx”. Beispiel für ein resultierendes Filter-Regelwerk:

# for table in ip ip6 inet; do nft list table $table filter; done
-table ip filter {
-	chain input {
-		 type filter hook input priority 0;
-		 ct state established,related counter packets 241 bytes 25193 accept
-		 counter packets 2 bytes 120 mark 0x00000100 accept
-		 icmp type { echo-request} counter packets 0 bytes 0 meta mark set 0x00000100 accept
-	}
-}
-table ip6 filter {
-	chain input {
-		 type filter hook input priority 0;
-		 ct state established,related counter packets 14 bytes 4077 accept
-		 counter packets 4 bytes 408 mark 0x00000100 accept
-		 icmpv6 type echo-request counter packets 1 bytes 104 meta mark set 0x00000100
-		 icmpv6 type { nd-neighbor-advert, nd-neighbor-solicit, nd-router-advert} counter packets 2 bytes 224 meta mark set 0x00000100 accept
-	}
-}
-table inet filter {
-	chain input {
-		 type filter hook input priority 0;
-		 ct state established,related counter packets 307 bytes 31974 accept
-		 counter packets 6 bytes 528 mark 0x00000100 accept
-		 tcp dport ssh ct state new tcp flags & (syn | ack) == syn log prefix "inet/input/accept: " meta mark set 0x00000100 counter packets 3 bytes 200 accept
-		 log prefix "inet/input/reject: " counter packets 0 bytes 0 reject
-	}
-}

Kapitel 19. Sicherheit

19.1. Sicherheit des Knoten

Es wird sehr empfohlen alle verfügbaren Patches einzuspielen sowie alle nicht benötigten Dienste zu deaktivieren. Ebenfalls sollten Sie lokales firewalling aktivieren und binden Sie die Dienste ausschließlich an benötigte IPv4/IPv6 Adressen.

Mehr Infos hierzu in späteren Versionen.


19.2. Zugangsbeschränkungen

Viele Dienste setzen die tcp_wrapper Bibliothek für die Zugangskontrolle ein. Eine Beschreibung finden Sie unter use of tcp_wrapper.

Mehr Infos hierzu in späteren Versionen.


19.3. IPv6 Sicherheitsüberwachung

Aktuell gibt es keine komfortablen Sicherheitstools mit denen man ein System über ein Netzwerk nach IPv6 relevanten Sicherheitslücken hin überprüfen kann. Weder Nessus noch irgendein kommerzieller Security Scanner ist zur Zeit dazu in der Lage, IPv6-Adressen scannen zu können.


19.3.1. Rechtsfragen

ACHTUNG: Bitte stellen Sie immer sicher, dass Sie ausschließlich ihr eigenes Netzwerk scannen oder einen Scan nur nach Erhalt einer schriftlichen Erlaubnis durchführen. Andernfalls haben sie mit rechtlichen Konsequenzen zu rechnen! -ÜBERPRÜFEN Sie die Ziel-IPv6-Adresse ZWEIMAL, bevor Sie einen Scan starten.


19.3.2. Sicherheitsüberwachung mit IPv6 fähigen netcat

Mit dem IPv6 fähigen netcat (siehe IPv6+Linux-status-apps/security-auditing für Details) können Sie einen Portscan durchführen. Es wird ein Script abgearbeitet, wobei u.a. ein Port-Bereich überprüft und Banners mitprotokolliert werden. Anwendungsbeispiel:

# nc6 ::1 daytime
-13 JUL 2002 11:22:22 CEST

19.3.3. Sicherheitsüberwachung mit IPv6 fähigen NMap

NMap, einer der weltweit besten Portscanner, unterstützt IPv6 seit der Version 3.10ALPHA1. Anwendungsbeispiel:

# nmap -6 -sT ::1
-Starting nmap V. 3.10ALPHA3 ( www.insecure.org/nmap/ ) 
-Interesting ports on localhost6 (::1): 
-(The 1600 ports scanned but not shown below are in state: closed) 
-Port       State       Service 
-22/tcp     open        ssh 
-53/tcp     open        domain 
-515/tcp    open        printer 
-2401/tcp   open        cvspserver
-Nmap run completed -- 1 IP address (1 host up) scanned in 0.525 seconds

19.3.4. Sicherheitsüberprüfung IPv6 fähigen strobe

Strobe ist (im Vergleich zu NMap) ein low budget Portscanner. Allerdings gibt es für Strobe einen IPv6 Patch (siehe IPv6+Linux-status-apps/security-auditing für Details). Anwendungsbeispiel:

# ./strobe ::1 strobe 1.05 (c) 1995-1999 Julian Assange <proff@iq.org>.
-::1 2401 unassigned unknown
-::1 22 ssh Secure Shell - RSA encrypted rsh 
-::1 515 printer spooler (lpd)
-::1 6010 unassigned unknown 
-::1 53 domain Domain Name Server

Hinweis: strobe wird nicht wirklich weiterentwickelt, die abgebildete Versionsnummer ist zudem falsch.


19.3.5. Sicherheitsüberprüfung mit Online-Werkzeugen

Es gibt einige IPv6-fähige Online-Werkzeuge, welche das Testen einer Firewall-Konfiguration bzgl. eingehenden Verbindungen unterstützen können:


19.3.6. Überprüfungsergebnisse

Falls das Ergebnis einer Überwachung nicht Ihren IPv6 Sicherheitsrichtlinien entspricht, schließen Sie die Lücken mit Hilfe der IPv6-Firewall-Funktionalität, z.B. mit netfilter6 (siehe Firewalling/Netfilter6 für Details).

Hinweis: Detailliertere Informationen zum Thema IPv6 Sicherheit finden Sie unter folgenden Links:


Kapitel 20. Verschlüsselung und Authentifizierung

Zum Unterschied zu IPv4 ist die Verschlüsselung und die Authentifizierung ein zwingendes Feature bei IPv6. Diese Features werden normalerweise mit IPsec implementiert (das auch von IPv4 verwendet wird).


20.1. Nutzungsarten von Verschlüsselung und Authentifizierung

Zwei Arten von Verschlüsselung und Authentifzierung einer Verbindung sind möglich:


20.1.1. Transport-Modus

Der Transport-Modus ist ein Modus nur für Ende-zu-Ende-Verbindungen. Hier wird nur die Nutzlast (üblicherweise ICMP, TCP oder UDP) mit deren entsprechenden Headern verschlüsselt, wogegen der IP-Header nicht verschlüsselt wird (aber üblicherweise in die Authentifizierung eingebunden wird).

Bei Nutzung von AES-128 für Verschlüsselung und SHA1 für Authentifizierung reduziert dieser Modus die MTU um 42 Oktetts.


20.1.2. Tunnel-Modus

Der Tunnel-Modus kann einerseits für eine Ende-zu-Ende wie auch für eine Gatewas-zu-Gateway-Verbindung genutzt werden. Hier wird das komplette IP-Paket verschlüsselt und ein neuer IP-Header vorangestellt .

Dieser Modus reduziert die MTU um weitere 40 Oktetts (bei IPv6), ausgehend von der MTU des Transport-Modus.


20.2. Unterstützung im Kernel (ESP und AH)

20.2.1. Unterstützung im vanilla Linux Kernel 2.4.x

Fehlt in vanilla 2.4. In der Vergangenheit gab es einen Grund, die Linux Kernel Quellen frei von Export/Import-Kontrollgesetzen bzgl. Verschlüsselungs-Techniken zu halten. Dies ist auch ein Grund, wieso FreeS/WAN project nicht in die vanilla Quellen miteingebunden wurde.


20.2.2. Unterstützung im vanilla Linux kernel 2.6.x

Aktuelle Versionen (zum Zeitpunkt des Schreibens 2.6.9 und neuer) unterstützt IPsec für IPv4 und IPv6.

Die Implementierung wurde u.a. vom USAGI project unterstützt.


20.3. Automatischer Schlüssel-Austausch (IKE)

IPsec benötigt einen Schlüsselaustausch mit einem “Geheimnis”. Dieser Vorgang wird meistens automatisch durch sogenannte IKE-Daemons durchgeführt. Diese führen ebenso die Authentifizierung der Partner durch, entweder durch ein gemeinsam bekanntes Geheimnis (auch “pre-shared secret” genannt) oder bei RSA-Schlüssel (z.B. aus X.509 Zertifikaten).

Momentan stehen (für Linux) zwei verschiedene IKE-Daemons zur Verfügung, die aber sich ziemlich in Konfiguration und Benutzung unterscheiden.

Ich präferiere “pluto” von der *S/WAN Implementierung, wei dieser eine überschaubare (und nur eine) Konfiguration.


20.3.1. IKE-Daemon “racoon”

Der IKE-Daemon “racoon” ist vom KAME-Project und auf Linux portiert worden. Aktuelle Linux-Distributionen beinhalten diesen Daemon im Paket “ipsec-tools”. Zwei Programme sind für ein funktionierendes IPsec-Setup notwendig. Siehe dazu auch das Linux Advanced Routing & Traffic Control HOWTO / IPSEC.


20.3.1.1. Manipulation der IPsec SA/SP Datenbank mit dem Werkzeug “setkey”

“setkey” ist für die Definition der Security Policy (SP) im Kernel wichtig.

Datei: /etc/racoon/setkey.sh

  • Beispiel für eine Ende-zu-Ende verschlüsselte Verbindung im Transport-Modus

#!/sbin/setkey -f
-flush;
-spdflush;
-spdadd 2001:db8:1:1::1 2001:db8:2:2::2 any -P out ipsec esp/transport//require;
-spdadd 2001:db8:2:2::2 2001:db8:1:1::1 any -P in  ipsec esp/transport//require;

  • Beispiel für eine Ende-zu-Ende verschlüsselte Verbindung im Tunnel-Modus

#!/sbin/setkey -f
-flush;
-spdflush;
-spdadd 2001:db8:1:1::1 2001:db8:2:2::2 any -P out ipsec
-¬ esp/tunnel/2001:db8:1:1::1-2001:db8:2:2::2/require;
-spdadd 2001:db8:2:2::2 2001:db8:1:1::1 any -P in  ipsec
-¬ esp/tunnel/2001:db8:2:2::2-2001:db8:1:1::1/require;

Beim anderen Partner ist “in” mit “out” zu vertauschen.


20.3.1.2. Konfiguration des IKE-Daemon “racoon”

“racoon” benötigt eine Konfigurationsdatei zur Ausführung. Es beinhaltet zu der Security Policy entprechenden Einstellungen, welche vorher mit “setkey” definiert wurde.

Datei: /etc/racoon/racoon.conf

# Racoon IKE daemon configuration file.
-# See 'man racoon.conf' for a description of the format and entries.
-path include "/etc/racoon";
-path pre_shared_key "/etc/racoon/psk.txt";
-
-listen
-{
-        isakmp 2001:db8:1:1::1;
-}
-
-remote 2001:db8:2:2::2
-{
-        exchange_mode main;
-        lifetime time 24 hour;
-        proposal
-        {
-                encryption_algorithm 3des;
-                hash_algorithm md5;
-                authentication_method pre_shared_key;
-                dh_group 2;
-        }
-}
-
-# gateway-to-gateway
-sainfo address 2001:db8:1:1::1 any address 2001:db8:2:2::2 any
-{
-        lifetime time 1 hour;
-        encryption_algorithm 3des;
-        authentication_algorithm hmac_md5;
-        compression_algorithm deflate;
-}
-
-sainfo address 2001:db8:2:2::2 any address 2001:db8:1:1::1 any
-{
-        lifetime time 1 hour;
-        encryption_algorithm 3des;
-        authentication_algorithm hmac_md5;
-        compression_algorithm deflate;
-} 

Zudem muss das gemeinsame Geheimnis definiert werden:

Datei: /etc/racoon/psk.txt

# file for pre-shared keys used for IKE authentication
-# format is: 'identifier' 'key'
-
-2001:db8:2:2::2 verysecret 

20.3.1.3. IPsec mit IKE-Daemon “racoon” starten

Zum Schluss muss der Daemon gestartet werden. Beim ersten Mal sollte Debug- & Vordergrund-Modus aktiviert werden. Das folgende Beispiel zeigt eine erfolgreiche Aushandlung von IKE-Phase 1 (ISAKMP-SA) und 2 (IPsec-SA):

# racoon -F -v -f /etc/racoon/racoon.conf
-Foreground mode. 
-2005-01-01 20:30:15: INFO: @(#)ipsec-tools 0.3.3 (http://ipsec-tools.sourceforge.net)
-2005-01-01 20:30:15: INFO: @(#)This product linked
-¬ OpenSSL 0.9.7a Feb 19 2003 (http://www.openssl.org/)
-2005-01-01 20:30:15: INFO: 2001:db8:1:1::1[500] used as isakmp port (fd=7)
-2005-01-01 20:31:06: INFO: IPsec-SA request for 2001:db8:2:2::2
-¬ queued due to no phase1 found.
-2005-01-01 20:31:06: INFO: initiate new phase 1 negotiation:
-¬ 2001:db8:1:1::1[500]<=>2001:db8:2:2::2[500]
-2005-01-01 20:31:06: INFO: begin Identity Protection mode.
-2005-01-01 20:31:09: INFO: ISAKMP-SA established
-¬ 2001:db8:1:1::1[500]-2001:db8:2:2::2[500] spi:da3d3693289c9698:ac039a402b2db401
-2005-01-01 20:31:09: INFO: initiate new phase 2 negotiation:
-¬ 2001:6f8:900:94::2[0]<=>2001:db8:2:2::2[0]
-2005-01-01 20:31:10: INFO: IPsec-SA established:
-¬ ESP/Tunnel 2001:db8:2:2::2->2001:db8:1:1::1 spi=253935531(0xf22bfab) 
-2005-01-01 20:31:10: INFO: IPsec-SA established:
-¬ ESP/Tunnel 2001:db8:1:1::1->2001:db8:2:2::2 spi=175002564(0xa6e53c4) 

Jede Richtung bekommt einen eigenen SPI (wie im IPsec-Standard definiert). Mit “tcpdump” kann an der entprechenden Schnittstelle dann das Ergebnis eines IPv6-pings gesehen werden:

20:35:55.305707 2001:db8:1:1::1 > 2001:db8:2:2::2: ESP(spi=0x0a6e53c4,seq=0x3)
-20:35:55.537522 2001:db8:2:2::2 > 2001:db8:1:1::1: ESP(spi=0x0f22bfab,seq=0x3)

Wie erwartet, werden die ausgehandelten SPIs angezeigt.

Mit “setkey” werden die aktiven Parameter angezeigt:

# setkey -D
-2001:db8:1:1::1 2001:db8:2:2::2
-        esp mode=tunnel spi=175002564(0x0a6e53c4) reqid=0(0x00000000)
-        E: 3des-cbc  bd26bc45 aea0d249 ef9c6b89 7056080f 5d9fa49c 924e2edd
-        A: hmac-md5  60c2c505 517dd8b7 c9609128 a5efc2db
-        seq=0x00000000 replay=4 flags=0x00000000 state=mature
-        created: Jan  1 20:31:10 2005   current: Jan  1 20:40:47 2005
-        diff: 577(s)    hard: 3600(s)   soft: 2880(s)
-        last: Jan  1 20:35:05 2005      hard: 0(s)      soft: 0(s)
-        current: 540(bytes)     hard: 0(bytes)  soft: 0(bytes)
-        allocated: 3    hard: 0 soft: 0
-        sadb_seq=1 pid=22358 refcnt=0
-2001:db8:2:2::2 2001:db8:1:1::1
-        esp mode=tunnel spi=253935531(0x0f22bfab) reqid=0(0x00000000)
-        E: 3des-cbc  c1ddba65 83debd62 3f6683c1 20e747ac 933d203f 4777a7ce
-        A: hmac-md5  3f957db9 9adddc8c 44e5739d 3f53ca0e
-        seq=0x00000000 replay=4 flags=0x00000000 state=mature
-        created: Jan  1 20:31:10 2005   current: Jan  1 20:40:47 2005
-        diff: 577(s)    hard: 3600(s)   soft: 2880(s)
-        last: Jan  1 20:35:05 2005      hard: 0(s)      soft: 0(s)
-        current: 312(bytes)     hard: 0(bytes)  soft: 0(bytes)
-        allocated: 3    hard: 0 soft: 0
-        sadb_seq=0 pid=22358 refcnt=0 

20.3.2. IKE-Daemon “pluto”

Der IKE-Daemon “pluto” ist in den Paketen der *S/WAN-Projekte beinhaltet. Das *S/WAN-Projekt startete zu Anfags als FreeS/WAN. Leider wurde die Weiterentwicklung von FreeS/WAN in 2004 eingestellt. Aufgrund der langsamen Entwicklungsgeschwindigkeit in der Vergangenheit entstanden zwei Spin-Offs: strongSwan und Openswan. Heutzutage stehen installationsfertige Pakete bereit, u.a. von Openswan (in Fedora Core 3 beinhaltet).

Ein großer Unterschied zu “racoon” ist, dass nur eine Konfigurationsdatei notwendig ist. Zudem steht ein initscript für automatisches Starten beim Booten zur Verfügung.


20.3.2.1. Konfiguration des IKE-Daemon “pluto”

Die Konfiguration ist der zu IPv4 sehr ähnlich, nur eine wichtige Option ist notwendig.

Datei: /etc/ipsec.conf

# /etc/ipsec.conf - Openswan IPsec configuration file
-#
-# Manual:     ipsec.conf.5
-version 2.0     # conforms to second version of ipsec.conf specification
-
-# basic configuration
-config setup
-        # Debug-logging controls:  "none" for (almost) none, "all" for lots.
-        # klipsdebug=none
-        # plutodebug="control parsing"
-
-#Disable Opportunistic Encryption
-include /etc/ipsec.d/examples/no_oe.conf
-
-conn ipv6-p1-p2
-        connaddrfamily=ipv6       # Important for IPv6, but no longer needed since StrongSwan 4
-        left=2001:db8:1:1::1
-        right=2001:db8:2:2::2
-        authby=secret
-        esp=aes128-sha1
-        ike=aes128-sha-modp1024
-        type=transport
-        #type=tunnel
-        compress=no
-        #compress=yes
-        auto=add
-        #auto=up

Zudem muss das gemeinsame Geheimnis definiert werden:

Datei: /etc/ipsec.secrets

2001:db8:1:1::1 2001:db8:2:2::2 : PSK      "verysecret"

20.3.2.2. IPsec mit IKE daemon “pluto” starten

Wenn die Installation von Openswan erfolgreich war, sollte ein initscript zum Starten von IPsec zur Verfügung stehen. Dann einfach auf jedem Partner folgendes ausführen:

# /etc/rc.d/init.d/ipsec start

Danach kann die Verbindung auf einem Partner gestartet werden. Wenn im folgenden die Zeile “IPsec SA established” erscheint, hat die Aushandlung funktioniert.

# ipsec auto --up ipv6-peer1-peer2
-104 "ipv6-p1-p2" #1: STATE_MAIN_I1: initiate
-106 "ipv6-p1-p2" #1: STATE_MAIN_I2: sent MI2, expecting MR2
-108 "ipv6-p1-p2" #1: STATE_MAIN_I3: sent MI3, expecting MR3
-004 "ipv6-p1-p2" #1: STATE_MAIN_I4: ISAKMP SA established
-112 "ipv6-p1-p2" #2: STATE_QUICK_I1: initiate
-004 "ipv6-p1-p2" #2: STATE_QUICK_I2: sent QI2,
-¬ IPsec SA established {ESP=>0xa98b7710 <0xa51e1f22} 

Weil *S/WAN und setkey/racoon die gleiche IPsec-Implementation im Linux kernel 2.6.x benutzen, zeigt “setkey” auch hier die aktiven Parameter:

# setkey -D
-2001:db8:1:1::1 2001:db8:2:2::2
-        esp mode=transport spi=2844489488(0xa98b7710) reqid=16385(0x00004001)
-        E: aes-cbc  082ee274 2744bae5 7451da37 1162b483
-        A: hmac-sha1  b7803753 757417da 477b1c1a 64070455 ab79082c
-        seq=0x00000000 replay=64 flags=0x00000000 state=mature
-        created: Jan  1 21:16:32 2005   current: Jan  1 21:22:20 2005
-        diff: 348(s)    hard: 0(s)      soft: 0(s)
-        last:                           hard: 0(s)      soft: 0(s)
-        current: 0(bytes)       hard: 0(bytes)  soft: 0(bytes)
-        allocated: 0    hard: 0 soft: 0
-        sadb_seq=1 pid=23825 refcnt=0
-2001:db8:2:2::2 2001:db8:1:1::1
-        esp mode=transport spi=2770214690(0xa51e1f22) reqid=16385(0x00004001)
-        E: aes-cbc  6f59cc30 8d856056 65e07b76 552cac18
-        A: hmac-sha1  c7c7d82b abfca8b1 5440021f e0c3b335 975b508b
-        seq=0x00000000 replay=64 flags=0x00000000 state=mature
-        created: Jan  1 21:16:31 2005   current: Jan  1 21:22:20 2005
-        diff: 349(s)    hard: 0(s)      soft: 0(s)
-        last:                           hard: 0(s)      soft: 0(s)
-        current: 0(bytes)       hard: 0(bytes)  soft: 0(bytes)
-        allocated: 0    hard: 0 soft: 0
-        sadb_seq=0 pid=23825 refcnt=0 

20.4. Anmerkungen:

Bei Linux Kernel 2.6.x kann der IPsec-Status und die Policy auch mit “ip” angezeigt werden:

# ip xfrm policy
-...
-
-# ip xfrm state
-...

Kapitel 21. Quality of Service (QoS)

IPv6 unterstützt QoS durch die Anwendung von Flow Labels und Traffic Classes.

Zusätzliche Infos:


21.1. General

Vernünftig funktionierendes QoS ist nur an der ausgehenden Schnittstelle eines Routers oder Host möglich, wo der Flaschenhals anfängt. Alles andere bereitet nur Probleme und funktioniert wahrscheinlich nicht so, wie erwartet.

------------------->-------
-                Queue 1    \
-                --->---     ---->--------->--------->-------------------
-Dicke Leitung   Queue 2      Queue 1 / Queue 2 / Queue 3   Dünne Leitung
-                --->----    ---->--------->--------->-------------------
-                Queue 3    /
-------------------->-------

21.2. Linux QoS mit “tc”

Linux benutzt “tc” vom Paket “iproute2”, um das Bandbreitenmanagement zu konfigurieren, allgemein beschrieben in Linux Advanced Routing & Traffic Control HOWTO.


21.2.1. Beispiel für eine Warteschlange mit konstanter Bitrate

Mit dem “cbq” Planer können Röhren mit konstanter Bitrate definiert werden.


21.2.1.1. Root qdisc Definition

Definition einer root qdisc mit einer Bandbreite von 1000 MBit/s an eth1

# tc qdisc add dev eth1 root handle 1: cbq avpkt 1000 bandwidth 1000Mbit

21.2.1.2. QoS class Definition

Definition einer Klasse 1:1 mit 1 MBit/s

# tc class add dev eth1 parent 1: classid 1:1 cbq rate   1Mbit allot 1500 bounded 

Definition einer Klasse 1:2 mit 50 MBit/s

# tc class add dev eth1 parent 1: classid 1:2 cbq rate  50Mbit allot 1500 bounded

Definition einer Klasse 1:3 mit 10 MBit/s

# tc class add dev eth1 parent 1: classid 1:3 cbq rate  10Mbit allot 1500 bounded

Definition einer Klasse 1:4 mit 200 kBit/s

# tc class add dev eth1 parent 1: classid 1:4 cbq rate 200kbit allot 1500 bounded

21.2.1.3. QoS filter Definition

Definition eines Filters für IPv4 (protocol ip), TCP (match ip protocol 6 0xff) Zielport 5001 (match ip dport 5001 0xffff) unter Benutzung der Klasse 1:2 von oben

# tc filter add dev eth1 parent 1: protocol ip   u32 match ip  protocol 6 0xff match ip dport 5001 0xffff flowid 1:1

Definition eines Filters für IPv6 (protocol ip), TCP (match ip6 protocol 6 0xff) Zielport 5001 unter der Benutzung der Klasse 1:2 von oben

# tc filter add dev eth1 parent 1: protocol ipv6 u32 match ip6 protocol 6 0xff match ip6 dport 5001 0xffff flowid 1:2

Definition eines Filters für IPv6 für Pakete mit Flowlabel 12345 (match ip6 flowlabel 0x12345 0x3ffff) unter der Benutzung der Klasse 1:3 von oben

# tc filter add dev eth1 parent 1: protocol ipv6 u32 match ip6 flowlabel 12345 0x3ffff flowid 1:3 

Definition eines Filters für IPv6 für Pakete mit der Linux iptables Markierung 32 (handle 32 fw) unter der Benutzung der Klasse 1:4 von oben

# tc filter add dev eth1 parent 1: protocol ipv6 handle 32 fw flowid 1:4

Die letzte Filterdefinition benötigt auch einen Eintrag in ip6tables um das Paket zu markieren

# ip6tables -A POSTROUTING -t mangle -p tcp --dport 5003 -j MARK --set-mark 32 

21.2.1.4. Testen der Filterdefinition mit iperf

Starten auf Serverseite in separaten Konsolen:

# iperf -V -s -p 5001
-# iperf -V -s -p 5002
-# iperf -V -s -p 5003

Starten auf Clientseite und Vergleichen der Ergebnisse:

# iperf -V -c SERVER-IPv4 -p 5001    (erwartet:      1 MBit/s)
-# iperf -V -c SERVER-IPv6 -p 5001    (erwartet:     50 MBit/s)
-# iperf -V -c SERVER-IPv4 -p 5002    (erwartet:  >> 50 MBit/s && <= 1000 MBit/s)
-# iperf -V -c SERVER-IPv6 -p 5002    (erwartet:  >> 50 MBit/s && <= 1000 MBit/s)
-# iperf -V -c SERVER-IPv4 -p 5003    (erwartet:  >> 50 MBit/s && <= 1000 MBit/s)
-# iperf -V -c SERVER-IPv6 -p 5003    (erwartet:    200 kBit/s)

Das Ergebnis der Transferraten sollten der Definitionen von oben entsprechen, das Ergebnis auf Port 5002 sollte ziemlich identisch unabhängig von der benutzten IP-Version sein.


Kapitel 22. Hinweise zu IPv6 kompatiblen Daemons

Im folgenden Kapitel werden einige Hinweise zu IPv6 kompatiblen Daemons gegeben.


22.1. Berkeley Internet Name Domain (BIND) daemon “named”

Seit der Version 9 wird IPv6 unterstützt. Setzen Sie immer die neuest verfügbare Version ein. Zumindest muss Version 9.1.3 eingesetzt werden, da ältere Versionen Sicherheitslöcher beinhalten können, die von Remote entsprechend ausgenutzt werden können.


22.1.1. Auf IPv6 Adressen hören

Anmerkung: Im Gegensatz zu IPv4 können bei aktuellen Versionen Server Sockets nicht an dedizierte IPv6 Adressen gebunden werden, es ist folglich jede oder keine Adresse gültig. Da dies ein Sicherheitsproblem sein kann, lesen Sie diesbezüglich ebenfalls den Abschnitt Access Control Lists (ACL) weiter unten!


22.1.1.1. BIND named konfigurieren, damit er auf IPv6 Adressen antwortet

Folgende Optionen müssen geändert werden, damit IPv6 aktiviert wird

options {
-        # sure other options here, too
-        listen-on-v6 { any; };
-};

Nach einem Neustart (des Dienstes) sollte z.B. Folgendes zu sehen sein:

# netstat -lnptu |grep "named\W*$" 
-tcp 0 0 :::53         :::*      LISTEN 1234/named
-¬ # incoming TCP requests
-udp 0 0 1.2.3.4:53    0.0.0.0:*        1234/named
-¬ # incoming UDP requests to IPv4 1.2.3.4
-udp 0 0 127.0.0.1:53  0.0.0.0:*        1234/named
-¬ # incoming UDP requests to IPv4 localhost
-udp 0 0 0.0.0.0:32868 0.0.0.0:*        1234/named
-¬ # dynamic chosen port for outgoing queries
-udp 0 0 :::53         :::*             1234/named
-¬ # incoming UDP request to any IPv6

Ein kleiner Test sieht wie folgt aus:

# dig localhost @::1

und sollte Ihnen ein Ergebnis anzeigen...


22.1.1.2. BIND named konfigurieren, damit er auf IPv6 Adressen nicht antwortet

Folgende Optionen müssen geändert werden, damit IPv6 deaktiviert wird:

options {
-        # sure other options here, too
-        listen-on-v6 { none; };
-};

22.1.2. Access Control Lists (ACL) mit IPv6 Unterstützung

ACLs mit IPv6 Adressen sind realisierbar und sollten wann immer möglich eingesetzt werden. Ein Beispiel:

acl internal-net { 
-        127.0.0.1; 
-        1.2.3.0/24;  
-        2001:0db8:100::/56; 
-        ::1/128; 
-        ::ffff:1.2.3.4/128; 
-};
-acl ns-internal-net { 
-        1.2.3.4;  
-        1.2.3.5;  
-        2001:0db8:100::4/128; 
-        2001:0db8:100::5/128; 
-};

Diese ACLs können für Client-Anfragen und Zonentransfers zu Secondary Nameserver eingesetzt werden. Es kann auch unterbunden werden, dass ihr Caching-Nameserver mittels IPv6 von der Außenwelt verwendet wird.

options {
-        # sure other options here, too
-        listen-on-v6 { none; };
-        allow-query { internal-net; }; 
-        allow-transfer { ns-internal-net; }; 
-};

Es ist ebenfalls möglich, dass die Optionen allow-query und allow-transfer bei den meisten Single-Zonen-Definitionen verwendet werden.


22.1.3. Anfragen mit festen IPv6 Adressen senden

Diese Option ist nicht verpflichtend, ev. aber benötigt:

query-source-v6 address <ipv6address|*> port <port|*>;

22.1.4. Pro Zone definierte feste IPv6 Adressen

Es ist möglich pro Zone mehrere IPv6 Adressen zu definieren.


22.1.4.1. Transfer source Adresse

Die Transfer source Adresse wird für ausgehende Zonentransfers verwendet:

transfer-source-v6 <ipv6addr|*> [port port];

22.1.4.2. Notify source Adresse

Die Notify source Adresse wird für ausgehende notify Mitteilungen verwendet:

notify-source-v6 <ipv6addr|*> [port port];

22.1.5. IPv6 DNS zone files Beispiele

Einige Informationen finden Sie auch unter IPv6 DNS Setup Information (article). Eventuell ebenfalls hilfreich ist folgendes Tool: IPv6 Reverse DNS zone builder for BIND 8/9 (webtool).


22.1.6. IPv6 bezogene DNS-Daten bereitstellen

Für IPv6 wurden neue Reverse Lookup Arten und Root Zonen definiert:

Mehr Inhalt zu diesem Thema wird eventuell in späteren Versionen eingearbeitet, inzwischen können Sie in den RFCs und in folgenden Quellen nachlesen:

  • AAAA und reverse IP6.INT: IPv6 DNS Setup Information

  • A6, DNAME (WURDE ABGELEHNT!) und reverse IP6.ARPA: lesen Sie im Kapitel 4 und 6 des BIND 9 Administrator Reference Manual (ARM) nach, welches mit dem bind-Paket mitgeliefert wird. Sie können es auch hier lesen: BIND manual version 9.3

Da IP6.INT (ebenfalls) ABGELEHNT WURDE, (jedoch nach wie vor in Verwendung ist,) muss ein DNS Server, der IPv6 Informationen anbieten will, beide reverse Zonen bereitstellen.


22.1.6.1. Aktuell beste Praxis

Da es mit den neuen Formaten noch Probleme gibt, ist die aktuell beste Praxis:

Vorwärts-Auflösung mit:

  • AAAA

Rückwärts-Auflösung mit:

  • Reverse nibble format für die Zone ip6.int (FÜR RÜCKWÄRTSKOMPATIBILITÄT)

  • Reverse nibble format für die Zone ip6.arpa (EMPFHOHLEN)


22.1.7. IPv6 Verbindung überprüfen

Ob BIND auf einen IPv6 socket hört bzw. IPv6 Daten bereitstellt, können Sie anhand folgender Beispiele überprüfen.


22.1.7.1. IPv6 Verbindung durch ACL abgelehnt

Eine IPv6 Verbindung kann durch Angabe eines dedizierten Server, der abgefragt werden soll, erzwungen werden:

$ host -t aaaa www.6bone.net 2001:0db8:200:f101::1 
-Using domain server: 
-Name: 2001:0db8:200:f101::1 
-Address: 2001:0db8:200:f101::1#53 
-Aliases:
-
-Host www.6bone.net. not found: 5(REFUSED)

Ein entsprechender Log-Eintrag sieht wie folgt aus:

Jan 3 12:43:32 gate named[12347]: client
-¬ 2001:0db8:200:f101:212:34ff:fe12:3456#32770: 
- query denied

Wenn Sie diesen Eintrag in der Logdatei finden, prüfen Sie, ob von diesem Client Anfragen akzeptiert werden sollen und ggf. ändern Sie Ihre ACL Konfiguration.


22.1.7.2. Erfolgreiche IPv6 Verbindung

Eine erfolgreiche IPv6 Verbindung sieht wie folgt aus:

$ host -t aaaa www.6bone.net 2001:0db8:200:f101::1 
-Using domain server: 
-Name: 2001:0db8:200:f101::1 
-Address: 2001:0db8:200:f101::1#53 
-Aliases:
-
-www.6bone.net. is an alias for 6bone.net. 
-6bone.net. has AAAA address 3ffe:b00:c18:1::10

22.2. Internet super daemon (xinetd)

IPv6 wird ungefähr seit der xinetd Version 1.8.9 unterstützt. Verwenden sie immer die neueste Version, zumindest aber Version 2.3.3, da ältere Versionen Sicherheitslöcher beinhalten können, die von Remote entsprechend ausgenutzt werden können.

Einige Linux Distributionen beinhalten ein separates IPv6 kompatibles Paket des xinetd, bei anderen Distributionen wird der IPv6 kompatible xinetd mit folgender Variable zumeist in der Datei /etc/sysconfig/network (bei Red Hat kompatible Distributionen) gestartet: NETWORKING_IPV6="yes". In neuere Versionen unterstützt eine Binärdatei sowohl IPv4 als auch IPv6.

Wenn Sie nun einen "eingebauten" Service wie z.B. daytime durch folgende Änderung der Konfigurationsdatei /etc/xinetd.d/daytime aktivieren

# diff -u /etc/xinetd.d/daytime.orig /etc/xinetd.d/daytime 
---- /etc/xinetd.d/daytime.orig Sun Dec 16 19:00:14 2001 
-+++ /etc/xinetd.d/daytime Sun Dec 16 19:00:22 2001 
-@@ -10,5 +10,5 @@ 
-        protocol = tcp 
-        user = root 
-        wait = no 
--       disable = yes 
-+       disable = no 
- }

dann sollten Sie nach einem Neustart des xinetd-Dienstes z.B. folgendes positive Ergebnis sehen:

# netstat -lnptu -A inet6 |grep "xinetd*" 
-tcp 0 0 ::ffff:192.168.1.1:993  :::*  LISTEN  12345/xinetd-ipv6 
-tcp 0 0 :::13                   :::*  LISTEN  12345/xinetd-ipv6 <- service
-¬ daytime/tcp
-tcp 0 0 ::ffff:192.168.1.1:143  :::*  LISTEN  12345/xinetd-ipv6

Das Beispiel zeigt auch die xinetd Dienste IMAP und IMAP-SSL, die nur auf IPv4 Adressen hören.

Hinweis: frühere Versionen hatten ein Problem, dass der nur für IPv4 kompilierte xinetd nicht bei einem IPv6-aktivierten Knoten startete, und eine IPv6-aktivierte nicht bei einem Knoten, der nur IPv4 aktiv hatte. Dies sollte aber mindestens seit Version 2.3.11 gefixt sein.


22.3. Webserver Apache2 (httpd2)

IPv6 wird beim Apache Webserver durch die Entwickler seit der Version 2.0.14 unterstützt. Verfügbare Patches für die alte 1.3.x Serie sind inzwischen nicht mehr aktuell und sollten nicht mehr in öffentlich zugänglichen Umgebungen eingesetzt werden. Verfügbar sind die Patches noch unter KAME / Misc.


22.3.1. Auf IPv6 Adressen hören

Anmerkung: Virtuelle Hosts mit IPv6 Adressen sind bis zur Version 2.0.28 nicht operabel (es gibt für die Version 2.0.28 einen Patch). Testen Sie aber immer zuerst die neueste Version, da ältere Versionen mitunter auch Sicherheitsprobleme mit sich bringen können.


22.3.1.1. Virtueller Host mit IPv6 Adresse

Listen [2001:0db8:100::1]:80
-<VirtualHost [2001:0db8:100::1]:80>
-        ServerName ipv6only.yourdomain.yourtopleveldomain
-        # ...sure more config lines
-</VirtualHost>

22.3.1.2. Virtueller Host mit IPv4 und IPv6 Adresse

Listen [2001:0db8:100::2]:80 
-Listen 1.2.3.4:80
-<VirtualHost [2001:0db8:100::2]:80 1.2.3.4:80>
-        ServerName ipv6andipv4.yourdomain.yourtopleveldomain
-        # ...sure more config lines
-</VirtualHost>

Das Ergebnis sollten nach einen Neustart des Dienstes etwa Folgendes sein:

# netstat -lnptu |grep "httpd2\W*$" 
-tcp 0 0 1.2.3.4:80          0.0.0.0:* LISTEN 12345/httpd2 
-tcp 0 0 2001:0db8:100::1:80 :::*      LISTEN 12345/httpd2 
-tcp 0 0 2001:0db8:100::2:80 :::*      LISTEN 12345/httpd2

Für einfache Tests können Sie auf das bereits gezeigte telnet-Beispiel zurückgreifen.


22.3.1.3. Zusätzliche Anmerkungen

Apache2 unterstützt eine Methode namens “sendfile”, um die Auslieferung von Datenn zu beschleunigen. Einige NIC-Treiber unterstützen auch offline das Berechnen der Checksumme. In einigen Fällen kann dies zu Verbindungsproblemen und ungültigen TCP-Checksummen führen. In diesen Fällen ist “sendfile” zu deaktivieren, entweder durch Rekompilieren unter der Benützung der configure-Option “--without-sendfile” oder durch Benützung der Direktive "EnableSendfile off" in der Konfigurationsdatei.


22.4. Router Advertisement Daemon (radvd)

Der Router Advertisement Daemon ist auf einem LAN dann sehr sinnvoll, wenn die Clients automatisch konfiguriert werden sollen. Der Daemon selbst sollte auf einem Linux Gateway Router eingerichtet sein (es hat nicht notwendigerweise das default IPv4 Gateway zu sein, Vorsicht also wer am LAN Router Advertisements versendet).

Sie können einige Flags und Informationen im Advertisement spezifizieren. Allgemein werden verwendet:

  • Präfix (notwendige Angabe)

  • Lebensdauer des Präfix

  • Intervall der Advertisements (optional)

Nach der korrekten Konfiguration sendet der Daemon die Advertisements über angegebene Interfaces. Die Clients empfangen die Advertisements und konfigurieren automatisch Ihre Adressen mit dem empfangenen Präfix und der Default-Route.


22.4.1. radvd konfigurieren

22.4.1.1. Einfache Konfiguration

Die Konfigurationsdatei des radvd ist normalerweise die Datei /etc/radvd.conf. Eine einfache Konfiguration sieht wie folgt aus:

interface eth0 { 
-        AdvSendAdvert on;
-        MinRtrAdvInterval 3; 
-        MaxRtrAdvInterval 10;
-        prefix 2001:0db8:0100:f101::/64 { 
-                AdvOnLink on; 
-                AdvAutonomous on; 
-                AdvRouterAddr on; 
-        };
-};

Als Ergebnis auf der Client-Seite ergibt sich hieraus:

# ip -6 addr show eth0 
-3: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 100 
-    inet6 2001:0db8:100:f101:2e0:12ff:fe34:1234/64 scope global dynamic 
-       valid_lft 2591992sec preferred_lft 604792sec 
-    inet6 fe80::2e0:12ff:fe34:1234/10 scope link

Ein hoher Wert für die Lebensdauer wurde verwendet, da der Wert nicht manuell konfiguriert wurde.


22.4.1.2. Spezielle 6to4 Konfiguration

Seit der Version 0.6.2pl3 wird die automatische (Neu)-Erstellung des Präfixes abhängig von der IPv4 Adresse eines angegebenen Interfaces unterstützt. Dies kann dazu eingesetzt werden, die Advertisements dann in einem LAN zu verteilen, nachdem das 6to4 tunneling geändert wurde. Zumeist eingesetzt wird dies hinter einem dynamischen dial-on-demand Linux Router. Wegen der sicherlich kürzeren Lebensdauer dieser Präfixe (nach jedem dial-up ist ein anderes Präfix gültig), wird der Wert der Lebensdauer auf einen minimalen Wert gesetzt:

interface eth0 { 
-        AdvSendAdvert on;
-        MinRtrAdvInterval 3; 
-        MaxRtrAdvInterval 10;
-        prefix 0:0:0:f101::/64 { 
-                AdvOnLink off; 
-                AdvAutonomous on; 
-                AdvRouterAddr on; 
-                Base6to4Interface ppp0;
-                AdvPreferredLifetime 20; 
-                AdvValidLifetime 30;
-        };
-};

Das Ergebnis auf Clientseite ist (unter der Annahme, dass ppp0 die lokale IPv4 Adresse 1.2.3.4 hat):

# /sbin/ip -6 addr show eth0
-3: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 100 
-   inet6 2002:0102:0304:f101:2e0:12ff:fe34:1234/64 scope global dynamic 
-      valid_lft 22sec preferred_lft 12sec
-   inet6 fe80::2e0:12ff:fe34:1234/10 scope link

Da eine kurze Lebensdauer definiert wurde, wird das Präfix bald verworfen werden, sollte kein entsprechendes Advertisement empfangen werden.

Achtung: wenn keine spezielle 6to4-Unterstützung der initscripts benutzt wird, ist eine spezielle Route am internen Interface des Routers notwendig, sonst gibt es Probleme bei eingehenden Paketen. Für das gezeigte Beispiel lautet diese:

# /sbin/ip -6 route add 2002:0102:0304:f101::/64 dev eth0 metric 1

Diese Route muß jedesmal, wenn der Prefix wechselt, ersetzt werden. Die ist dann der Fall, wenn das Dial-Up-Interface eine neue IPv4-Adresse bekommen hat.


22.4.2. Fehlersuche

Mit dem Programm “radvdump” können Sie gesendete und empfangene Advertisements detailliert betrachten. Die Anwendung ist einfach:

# radvdump 
-Router advertisement from fe80::280:c8ff:feb9:cef9 (hoplimit 255) 
-        AdvCurHopLimit: 64 
-        AdvManagedFlag: off 
-        AdvOtherConfigFlag: off 
-        AdvHomeAgentFlag: off 
-        AdvReachableTime: 0 
-        AdvRetransTimer: 0 
-        Prefix 2002:0102:0304:f101::/64 
-                AdvValidLifetime: 30 
-                AdvPreferredLifetime: 20 
-                AdvOnLink: off 
-                AdvAutonomous: on 
-                AdvRouterAddr: on 
-        Prefix 2001:0db8:100:f101::/64 
-                AdvValidLifetime: 2592000 
-                AdvPreferredLifetime: 604800 
-                AdvOnLink: on 
-                AdvAutonomous: on 
-                AdvRouterAddr: on 
-        AdvSourceLLAddress: 00 80 12 34 56 78

Im Output wird jedes Advertisement in einem lesbarem Format dargestellt. Zu sehen sollten die von Ihnen eingestellten Werte sein; falls dem nicht so ist, wurde das Advertisement eventuell nicht von Ihrem radvd gesendet... (für die Rückverfolgung des Routers können Sie die LLAddress, die MAC Adresse des Routers, verwenden...)


22.5. Dynamic Host Configuration v6 Server (dhcp6s)

dhcp6s kann für stateful Konfiguration benutzt werden. Der Daemon selbst muß nicht unbedingt auf dem Linux-Standard-Router laufen.

Man kann hier mehr Informationen als bei radvd spezifizieren. Die meisten sind denen des IPv4 DHCP-Servers ähnlich.

Nach einer passenden Konfiguration reagiert der Daemon auf empfangene IPv6-Multicast-Pakete, die von einem Client an die Adresse ff02::1:2 gesendet werden.


22.5.1. Konfiguration des DHCPv6-Servers (dhcp6s)

22.5.1.1. Einfache Konfiguration

Die Konfigurationsdatei des dhcp6s ist normalerweise /etc/dhcp6s.conf. Ein einfaches Beispiel sieht wie folgt aus:

interface eth0 {
-        server-preference 255;
-        renew-time 60;
-        rebind-time 90;
-        prefer-life-time 130;
-        valid-life-time 200;
-        allow rapid-commit;
-        option dns_servers 2001:db8:0:f101::1 sub.domain.example;
-        link AAA {
-                range 2001:db8:0:f101::1000 to 2001:db8:0:f101::ffff/64;
-                prefix 2001:db8:0:f101::/64;
-        };
-};

22.5.2. Konfiguration des DHCPv6-Client (dhcp6s)

22.5.2.1. Einfache Konfiguration

Die Konfigurationsdatei von dhcp6c ist normalerweise /etc/dhcp6c.conf. Ein einfaches Beispiel sieht wie folgt aus:

interface eth0 {
-        send rapid-commit;
-        request domain-name-servers;
-}; 

22.5.3. Benutzung

22.5.3.1. dhcp6s

Starten des Servers, z.B. durch

# service dhcp6s start

22.5.3.2. dhcp6c

Starten des Clients im Vordergrund, z.B. durch

# dhcp6c -f eth0
-...

22.5.4. Fehlersuche

22.5.4.1. dhcp6s

Der Server hat einen Vordergrund und zwei Debug-Schalter (von denen beide benutzt werden sollten), hier ein Beispiel:

# dhcp6c -d -D -f eth0

22.5.4.2. dhcp6c

Mit einem IPv6 Ping an die DHCP Multicast-Adresse kann getestet werden, ob der IPv6 DHCP Server überhaupt erreichbar ist am Link.

# ping6 -I eth0 ff02::1:2

Der Client hat einen Vordergrund und zwei Debug-Schalter, hier ein Beispiel:

# dhcp6c -d -f eth0
-Oct/03/2005 17:18:16 dhcpv6 doesn't support hardware type 776 
-Oct/03/2005 17:18:16 doesn't support sit0 address family 0 
-Oct/03/2005 17:18:16 netlink_recv_rtgenmsg error 
-Oct/03/2005 17:18:16 netlink_recv_rtgenmsg error 
-Oct/03/2005 17:18:17 status code for this address is: success 
-Oct/03/2005 17:18:17 status code: success 
-Oct/03/2005 17:18:17 netlink_recv_rtgenmsg error 
-Oct/03/2005 17:18:17 netlink_recv_rtgenmsg error 
-Oct/03/2005 17:18:17 assigned address 2001:db8:0:f101::1002 prefix len is not in any RAs prefix length using 64 bit instead 
-Oct/03/2005 17:18:17 renew time 60, rebind time 9

Bemerkung: die netlink-Fehlermeldungen haben keinen Einfluß auf die Funktionalität.


22.6. ISC Dynamic Host Configuration Server (dhcpd)

ISC DHCP unterstützt IPv6 seit der Version 4.x.


22.6.1. Konfiguration des ISC DHCP Server für IPv6 (dhcpd)

Es ist zu beachten, daß der ISC DHCP Server aktuell entweder IPv4 oder IPv6 bedienen kann, nicht beides, d.h. der Daemon muß zweimal gestartet werden (für IPv6 mit Option “-6”) um beide Protokolle zu unterstützen.


22.6.1.1. Einfache Configuration

Erstellen einer eigenen Konfigurationsdatei /etc/dhcp/dhcpd6.conf für den IPv6-Teil des dhcpd. Es ist zu beachten, daß der router natürlich eine Schnittstelle mit einer IPv6-Adresse aus dem definierten Subnetz konfiguriert haben muß.

default-lease-time 600;
-max-lease-time 7200; 
-log-facility local7; 
-subnet6 2001:db8:0:1::/64 {
-        # Range for clients
-        range6 2001:db8:0:1::129 2001:db8:0:1::254;
-
-        # Range for clients requesting a temporary address
-        range6 2001:db8:0:1::/64 temporary;
-
-        # Additional options
-        option dhcp6.name-servers fec0:0:0:1::1;
-        option dhcp6.domain-search "domain.example";
-
-        # Prefix range for delegation to sub-routers
-        prefix6 2001:db8:0:100:: 2001:db8:0:f00:: /56;
-
-        # Example for a fixed host address
-        host specialclient {
-    		host-identifier option dhcp6.client-id 00:01:00:01:4a:1f:ba:e3:60:b9:1f:01:23:45;
-        	fixed-address6 2001:db8:0:1::127;
-    	} 
-} 

Es ist zu beachten, dass die “dhcp.client-id” nicht länger die MAC-Adresse ist, sondern eine per System eindeutige ID! “dhcp6c” (siehe oben) benutzt die Datei /var/lib/dhcpv6/dhcp6c_duid (wird beim ersten Start erstellt, falls nicht vorhanden) als eindeutige ID. Es ist eine 14 Byte lange ID, welche mit einer 2 Byte Längeninformation startet (üblicherweise “0x000e”):

# hexdump -e '"%07.7_ax " 1/2 "%04x" " " 14/1 "%02x:" "\n"' /var/lib/dhcpv6/dhcp6c_duid 0000000 000e 00:01:00:01:4a:1f:ba:e3:60:b9:1f:01:23:45:

22.6.2. Benutzung

22.6.2.1. dhcpd

Starte den Server im Vordergrund:

# /usr/sbin/dhcpd -6 -d -cf /etc/dhcp/dhcpd6.conf eth1 
-Internet Systems Consortium DHCP Server 4.1.0 
-Copyright 2004-2008 Internet Systems Consortium. 
-All rights reserved. 
-For info, please visit http://www.isc.org/sw/dhcp/ 
-Not searching LDAP since ldap-server, ldap-port and ldap-base-dn were not specified in the config file 
-Wrote 0 leases to leases file. 
-Bound to *:547 
-Listening on Socket/5/eth1/2001:db8:0:1::/64 
-Sending on   Socket/5/eth1/2001:db8:0:1::/64

22.7. DHCP Server Dibbler

Dibbler ist auch ein DHCP server.


22.7.1. Konfiguration des Dibbler DHCP server für IPv6

22.7.1.1. Einfache Konfuration

Erstellen der Konfigurationsdatei /etc/dibbler/server.conf . Es ist zu beachten, daß der router natürlich eine Schnittstelle mit einer IPv6-Adresse aus dem definierten Subnetz konfiguriert haben muß.

log-level 8 
-log-mode short 
-preference 0 
-iface "eth1" {
-  prefered-lifetime 3600
-  valid-lifetime 7200
-  class {
-    pool 2001:db8:0:1::/64
-  }
-  option dns-server fec0:0:0:1::1
-  option domain domain.example
-} 

22.7.2. Benutzung

22.7.2.1. dibbler-server

Start Server im Vorgergrund:

# dibbler-server run 
-| Dibbler - a portable DHCPv6, version 0.7.3 (SERVER, Linux port) 
-| Authors : Tomasz Mrugalski<thomson(at)klub.com.pl>,Marek Senderski<msend(at)o2.pl> 
-| Licence : GNU GPL v2 only. Developed at Gdansk University of Technology. 
-| Homepage: http://klub.com.pl/dhcpv6/ 
-2009.05.28 10:18:48 Server Notice    My pid (1789) is stored in /var/lib/dibbler/server.pid 
-2009.05.28 10:18:48 Server Notice    Detected iface eth0/3, MAC=54:52:00:01:23:45. 
-2009.05.28 10:18:48 Server Notice    Detected iface eth1/2, MAC=54:52:00:67:89:ab. 
-2009.05.28 10:18:48 Server Notice    Detected iface lo/1, MAC=00:00:00:00:00:00. 
-2009.05.28 10:18:48 Server Debug     Skipping database loading. 
-2009.05.28 10:18:48 Server Debug     Cache:server-cache.xml file: parsing started, expecting 0 entries. 
-2009.05.28 10:18:48 Server Notice    Parsing /etc/dibbler/server.conf config file... 
-18:48 Server Debug     Setting 0 generic option(s). 
-18:48 Server Debug     0 per-client configurations (exceptions) added. 
-18:48 Server Debug     Parsing /etc/dibbler/server.conf done. 
-18:48 Server Info      0 client class(es) defined. 
-18:48 Server Debug     1 interface(s) specified in /etc/dibbler/server.conf 
-18:48 Server Info      Mapping allow, deny list to class 0:0 allow/deny entries in total. 
-18:48 Server Info      Interface eth1/2 configuration has been loaded. 
-18:48 Server Notice    Running in stateful mode. 
-18:48 Server Info      My DUID is 00:01:00:01:11:aa:6d:a7:54:52:00:67:89:ab. 
-18:48 Server Notice    Creating multicast (ff02::1:2) socket on eth1/2 (eth1/2) interface. 
-18:48 Server Debug     Cache: size set to 1048576 bytes, 1 cache entry size is 87 bytes, so maximum 12052 address-client pair(s) may be cached. 
-18:48 Server Notice    Accepting connections. Next event in 4294967295 second(s).

22.8. tcp_wrapper

Mit der tcp_wrapper Programmbibliothek können Sie Ihre Dienste gegen Missbrauch schützen.


22.8.1. Filter-Funktionalität

Sie können tcp_wrapper für folgende Zwecke einsetzen:

  • Nach Source-Adressen filtern (IPv4 oder IPv6)

  • Nach Benutzern filtern (benötigt einen aktiven ident Daemon auf der Client-Seite)


22.8.2. Welches Programm benützt tcp_wrapper

Folgende Programme sind bekannt:

  • Jeder Dienst, der durch den xinetd aufgerufen wird (und wenn der xinetd mit der tcp_wrapper Bibliothek kompiliert wurde)

  • sshd (wenn der mit der tcp_wrapper Bibliothek kompiliert wurde)


22.8.3. Anwendung

Der tcp_wrapper wird durch zwei Dateien konfiguriert und kontrolliert: /etc/hosts.allow sowie /etc/hosts.deny. Weitere Informationen finden Sie mit:

$ man hosts.allow

22.8.3.1. Beispiel für /etc/hosts.allow

In dieser Datei wird ein Dienst pro Zeile eingetragen, der positiv gefiltert werden soll (d.h. Verbindungen werden erlaubt).

sshd:           1.2.3. [2001:0db8:100:200::]/64
-daytime-stream: 1.2.3. [2001:0db8:100:200::]/64

Achtung: es existieren fehlerhafte Implementierungen, welche folgende fehlerhafte IPv6-Netzwerk-Beschreibung unterstützen: [2001:0db8:100:200::/64]. Hoffentlich werden diese Versionen bald gefixt.


22.8.3.2. Beispiel für /etc/hosts.deny

In dieser Datei werden alle Einträge negativ gefiltert. Und normalerweise sollen alle Verbindungen unterbunden werden:

ALL: ALL

Sie können bei Bedarf obige Standardzeile auch durch Folgende ersetzen, jedoch wird dadurch bei zu vielen Verbindungen in kurzer Zeitz eine DoS Angriff möglich (Last des Mailers sowie des Spool-Verzeichnisses). Ein logwatch ist somit wahrscheinlich die bessere Lösung.

ALL: ALL: spawn (echo "Attempt from %h %a to %d at `date`" 
- | tee -a /var/log/tcp.deny.log | mail root@localhost)

22.8.4. Protokollierung

Entsprechend der Syslog Daemon Konfiguration in der Datei /etc/syslog.conf protokolliert der tcp_wrapper normalerweise in die Datei /var/log/secure.


22.8.4.1. Abgelehnte Verbindung

Das Logging einer abgelehnten IPv4-Verbindung zu einem durch den xinetd überwachten Daytime Dienst sieht wie folgt aus:

Jan 2 20:40:44 gate xinetd-ipv6[12346]: FAIL: daytime-stream libwrap
-¬ from=::ffff:1.2.3.4
-Jan 2 20:32:06 gate xinetd-ipv6[12346]: FAIL: daytime-stream libwrap 
- from=2001:0db8:100:200::212:34ff:fe12:3456

Das Logging einer abgelehnten IPv4-Verbindung zu einem durch den xinetd überwachten sshd Daemon (auf IPv4 und IPv6 auf Verbindungen wartend) sieht wie folgt aus:

Jan 2 20:24:17 gate sshd[12345]: refused connect from ::ffff:1.2.3.4
-¬ (::ffff:1.2.3.4)
-Jan 2 20:39:33 gate sshd[12345]: refused connect 
- from 2001:0db8:100:200::212:34ff:fe12:3456
-¬ (2001:0db8:100:200::212:34ff:fe12:3456)

22.8.4.2. Akzeptierte Verbindung

Das Logging einer akzeptierten IPv4-Verbindung zu einem durch den xinetd überwachten Daytime Dienst sieht wie folgt aus:

Jan 2 20:37:50 gate xinetd-ipv6[12346]: START: daytime-stream pid=0
-¬ from=::ffff:1.2.3.4 
-Jan 2 20:37:56 gate xinetd-ipv6[12346]: START: daytime-stream pid=0 
- from=2001:0db8:100:200::212:34ff:fe12:3456

Das Logging einer akzeptierten IPv4-Verbindung zu einem auf zwei Ports hörenden sshd sieht wie folgt aus:

Jan 2 20:43:10 gate sshd[21975]: Accepted password for user from ::ffff:1.2.3.4
-¬ port 33381 ssh2
-Jan 2 20:42:19 gate sshd[12345]: Accepted password for user 
- from 2001:0db8:100:200::212:34ff:fe12:3456 port 33380 ssh2

22.9. vsftpd

22.9.1. Auf IPv6-Adressen lauschen

Editiere die Konfigurationsdatei, üblicherweise /etc/vsftpd/vsftpd.conf, und setze die Option für das “listen” wie folgt:

listen_ipv6=yes

Mehr ist nicht zu tun.


22.10. proftpd

22.10.1. Auf IPv6-Adressen lauschen

Editiere die Konfigurationsdatei, üblicherweise /etc/proftpd.conf, allerdings ist hier zu beachten, daß dies in der Konfigurationsart virtueller Host nicht 100% logisch ist

<VirtualHost 192.0.2.1>
-        ...
-        Bind 2001:0DB8::1
-        ...
-</VirtualHost>

Mehr ist nicht zu tun.


22.11. Andere Daemons

Seit einiger Zeit ist dies meist einfach, suchen Sie einfach nach einer Kommandozeilen-Option oder einer Konfigurationsvariable, um das Lauschen an IPv6-Adressen zu aktivieren. Schauen Sie dazu in den Manual-Seiten des Daemons oder in den entsprechenden FAQs nach. Es kann allerdings durchaus sein, daß sich der Daemon nur an die IPv6-“any”-Adresse (::) binden läßt und kein dediziertes Binden an eine spezielle IPv6-Adresse möglich ist (das hängt von der Unterstützung des Programmierers ab).


Kapitel 23. Programmierung

23.1. Programmierung mit Nutzung der C-API

Dieser Abschnitt ist momentan nicht in Deutsch verfügbar, die englische Version ist verfügbar unter: TLDP / Linux+IPv6-HOWTO / Programming using C-API


23.2. Andere Programmiersprachen

23.2.1. JAVA

In Sun Java Versionen ab 1.4 ist Unterstützung für IPv6 vorhanden, siehe dazu auch die Klasse Inet6Address (1.5/5.0). Weitere Tipps sind verfügbar im Networking IPv6 User Guide for JDK/JRE 1.4 und 1.5 (5.0).


23.2.2. Perl

Stand Mai 2007 ist nichts bekannt, daß der Kern von Perl IPv6 nativ unterstützt. Dies kann allerdings aktiviert werden durch Benützung des folgenden Moduls:

Zudem existieren weitere Module für/mit IPv6 Unterstützung (z.B. Net::IP), suche nach “IPv6” bei http://search.cpan.org/.


Kapitel 24. Interoperabilität

Das TAHI Project prüft das Zusammenspiel der verschiedenen Betriebssysteme in Hinblick auf IPv6 Funktionalität und Implementierung. Der Linux Kernel hat bereits das IPv6 Ready Logo Phase 1 bekommen.


Kapitel 25. Weitere Informationen und URLs

25.1. Gedruckte Bücher, Artikel, Onlinerezensionen

25.1.1. Gedruckte Bücher (Englisch)

25.1.1.1. Cisco

  • Cisco Self-Study: Implementing IPv6 Networks (IPV6), von Regis Desmeules. Cisco Press; ISBN 1587050862; 500 Seiten; 1. Edition (April 11, 2003). -Anmerkung: Dieser Titel wird am 11. April 2003 publiziert.

  • Configuring IPv6 with Cisco IOS, von Sam Brown, Sam Browne, Neal Chen, Robbie Harrell, Edgar, Jr. Parenti (Editor), Eric Knipp (Editor), Paul Fong (Editor) 362 Seiten; Syngress Media Inc; ISBN 1928994849; (July 12, 2002).


25.1.1.2. Allgemein

  • IPv6 in Practice: A Unixer's Guide to the Next Generation Internet von Benedikt Stockebrand, November 2006; ISBN 3-540-24524-3

  • IPv6 Essentials von Silvia Hagen, zweite Auflage, Mai 2006; ISBN 0-5961-0058-2 -ToC, Index, Sample Chapter etc.; O'Reilly Pressrelease

  • IPv6: The New Internet Protocol. Von Christian Huitema; Publiziert von Prentice-Hall; ISBN 0138505055. -Beschreibung: Dieses Buch, geschrieben von Christian Huitema - einem Mitglied des Internet Architecture Board, bietet eine exzellente Beschreibung von IPv6, die Unterschiede zu IPv4 sowie die 'wies' und 'warums' der IPv6 Entwicklung. -Quelle: http://www.cs.uu.nl/wais/html/na-dir/internet/tcp-ip/resource-list.html

  • IPv6 Networks von Niles, Kitty; (ISBN 0070248079); 550 Seiten; Datum der Veröffentlichung: 05/01/1998.

  • Implementing IPV6. Supporting the Next Generation Internet Protocols von P. E. Miller, Mark A. Miller; Hrsg.: John Wiley & Sons; ISBN 0764545892; 2. Edition (15.März 2000); 402 Seiten.

  • Big Book of Ipv6 Addressing Rfcs von Peter H. Salus (Compiler), Morgan Kaufmann (Hrsg.), April 2000, 450 Seiten ISBN 0126167702.

  • Understanding IPV6 von Davies, Joseph; ISBN 0735612455; Datum der Veröffentlichung: 05/01/2001; 350 Seiten.

  • Migrating to IPv6 - IPv6 in Practice von Marc Blanchet; John Wiley & Sons (Hrsg.); ISBN 0471498920; 1. Edition (November 2002); 368 Seiten.

  • Ipv6 Network Programming von Jun-ichiro Hagino; ISBN 1555583180

  • Wireless boosting IPv6 von Carolyn Duffy Marsan, 10/23/2000.

  • O'reilly Network search for keyword IPv6 ergibt 29 Treffer (28. Januar 2002)


25.1.2. Artikel, eBooks, Online Rezensionen


25.1.3. Wissenschaftliche Publikationen (Kurzbeschreibungen, Bibliographien, Online Quellen)

Siehe auch: liinwww.ira.uka.de/ipv6 bzw. Google / Scholar / IPv6


25.1.4. Sonstiges

Mehr Infos gibt es unter: SWITCH IPv6 Pilot / References


25.2. Konferenzen und Meetings

Fehlt etwas? Vorschläge sind willkommen!


25.2.1. 2004

  • 1st Global IPv6 Summit in Sao Paul, Brasil


25.3. Online-Informationen

25.3.1. Mit dem IPv6 Backbone verbinden

Mehr Infos in späteren Versionen... Vorschläge sind Willkommen!


25.3.1.1. Globale Registrierungsstellen

Siehe regionale Registrierungsstellen.


25.3.1.3. Tunnel-Broker

Anmerkung: Eine Tunnel-Broker Liste ist im Abschnitt Tunnel broker weiter unten zu finden.


25.3.2. Neueste Nachrichten und URLs zu anderen Dokumenten

  • Viele URLs zu anderen Dokumenten von Anil Edathara

  • go6 - The IPv6 Portal: ein IPv6 Online-Portal mit einem WIKI-basierenden IPv6-Know-How-Schwerpunkt, einem IPv6-Diskussionsforum, einer aktuellen Sammlung von IPv6-Events und Nachrichten, freiem IPv6-Zugang und Services, IPv6 Software-Applikationen und viel mehr


25.3.3. Protokoll-Informationen

25.3.3.1. IPv6 bezogene Request For Comments (RFCs)

Das veröffentlichen einer Liste mit IPv6 relevanter RFCs geht über den Rahmen dieses Dokumentes hinaus, unter folgenden Links können Sie jedenfalls diverse Listen finden:


25.3.3.3. Sonstige


25.3.4. Weitere Informationen

DeepSpace6 / Weitere interessante Links


25.3.4.3. Allgemeine Informationen

Fehlt etwas? Vorschläge sind Willkommen!


25.3.5. Sortiert nach Ländern

25.3.5.1. Europa

  • www.ist-ipv6.org: IST IPv6 Cluster, European IPv6 Research and Development Projects

  • Euro6IX: European IPv6 Internet Exchanges Backbone


25.3.5.3. Belgien

Vorschläge sind Willkommen!


25.3.5.5. China

Vorschläge sind Willkommen!


25.3.5.8. Großbritannien


25.3.5.9. Indien

Vorschläge sind willkommen!


25.3.5.11. Japan


25.3.5.12. Korea

  • ETRI: Electronics and Telecommunications Research Institut

  • IPv6 Forum Korea: IPv6 Infrastruktur Projekt in Korea


25.3.5.13. Mexiko

  • IPv6 Mexico (spanische & englische Version) - IPv6 Projekt Homepage der National Autonomous University of Mexico (UNAM)


25.3.5.14. Niederlande

  • SURFnet: SURFnet IPv6 Backbone

  • STACK, STACK (IPv6): Computer-Studendten-Verband der Eindhoven University of Technology, Niederlande.

  • IPng.nl: Zusammenarbeit zwischen WiseGuys und Intouch.


25.3.5.15. Österreich


25.3.5.16. Portugal

Vorschläge sind willkommen!


25.3.5.17. Russland


25.3.5.18. Schweiz

Vorschläge sind willkommen!


25.3.6. Sortiert nach Betriebssystemen


25.3.6.2. Cisco IOS


25.3.6.4. IBM


25.3.7. IPv6 Sicherheit


25.3.8. Programm-Listen


25.3.8.1. Analyse-Werkzeuge

  • Wireshark (ehemals Ethereal) is ein kostenloser Netzwerkprotokoll-Analyseprogramm für Unix und Windows

  • Radcom RC100-WL - Download Radcom RC100-WL Protokollanalyseprogramm version 3.20


25.3.8.2. IPv6 Produkte


25.4. IPv6 Infrastruktur

25.4.1. Statistiken


25.4.2. Internet Exchanges

Eine weitere Liste von IPv6 Internet Exchanges gibt es unter: IPv6 status of IXPs in Europe


25.4.2.1. Deutschland

  • INXS: (Cable & Wireless) München und Hamburg


25.4.2.2. Estlanda

  • TIX (Tallinn Interneti eXchange mit IPv6 Support)


25.4.2.3. Europa

  • Euro6IX, European IPv6 Internet Exchange Backbone


25.4.2.4. Frankreich

  • French National Internet Exchange IPv6 (seit 1.11.2002 aktiv). -FNIX6 bietet ISPs im Großraum Paris den Dienst eines kostenlosen und zuverlässlichen High Speed FastEthernet Internet Exchange.


25.4.2.6. Japan

  • NSPIXP-6: IPv6--basierter Internet Exchange in Tokio

  • JPIX, Tokio


25.4.2.8. Niederlande

  • AMS-IX: Amsterdam Internet Exchange


25.4.2.9. USA

  • 6TAP: Chicago. Bietet weltweit Peerings an.

  • PAIX: Palo Alto


25.4.3. Tunnel broker

Auch interessant: http://www.deepspace6.net/docs/tunnelbrokers.html


25.4.3.1. Belgien

Fehlt etwas? Vorschläge sind willkommen!


25.4.3.3. China

Fehlt etwas? Vorschläge sind willkommen!


25.4.3.6. Großbritannien

  • NTT, Großbritannien - IPv6 Versuch. IPv4 Tunnel und native IPv6 Standleitungs-Verbindungen. POPs gibt es in: London, Düsseldorf, New Jersey (USA, East Coast) Cupertino (USA, West Coast) Tokio


25.4.3.7. Italien


25.4.3.8. Japan

Fehlt etwas? Vorschläge sind willkommen!


25.4.3.9. Malaysia

Fehlt etwas? Vorschläge sind willkommen!


25.4.3.10. Niederlande

  • IPng Netherland - Intouch, SurfNet, AMS-IX, UUNet, Cistron, RIPE NCC und AT&T sind am AMS-IX angeschlossen. Unter bestimmten Voraussetzungen ist es möglich, einen statischen Tunnel zu bekommen.

  • SURFnet Customers


25.4.3.11. Norwegen


25.4.3.13. Schweiz

Fehlt etwas? Vorschläge sind willkommen!


25.4.3.14. USA


25.4.3.15. Singapore

Fehlt etwas? Vorschläge sind Willkommen!


25.4.4. Native IPv6 Dienste

Anmerkung: Die folgenden Dienste sind meist nur mit einer gültigen IPv6 Verbbindung erreichbar!


25.4.4.1. Net News (NNTP)

Fehlt etwas? Vorschläge sind Willkommen!


25.4.4.3. IRC Server

Fehlt etwas? Vorschläge sind Willkommen!


25.4.4.4. Radiosender, Musik-Streams

Fehlt etwas? Vorschläge sind Willkommen!


25.5. Mailinglisten

Weitere Listen von Mailinglisten sind verfügbar unter:

Die größten Mailinglisten sind in folgender Tabelle zusammengefasst:

.

SchwerpunktRequest e-mail AdresseAbonnierene-mail Adresse der MailinglisteSpracheZugang via WWW
Linux Kernel Networking inkl. IPv6majordomo (at) vger.kernel.orgnetdevnetdev (at) vger.kernel.orgEnglischInfo, Archive
Mobile IP(v6) für LinuxWeb-based, see URLmiplmipl (at) mobile-ipv6.orgEnglischInfo, Archive
Linux IPv6 User & USAGIusagi-users-ctl (at) linux-ipv6.org usagi-users (at) linux-ipv6.orgEnglischInfo / Search, Archive
IPv6 und Debian LinuxWeb-based, siehe URL debian-ipv6 (at) lists.debian.orgEnglischInfo/Subscription/Archive
6bonemajordomo (at) isi.edu6bone6bone (at) isi.eduEnglischInfo, Archive
IPv6 User allgemeinmajordomo (at) ipv6.orgusersusers (at) ipv6.orgEnglischInfo, Archive
Bugtracking Internet Programme (1)bugtraq-subscribe (at) securityfocus.com bugtraq (at) securityfocus.com (3)EnglischInfo, Archive

.

(1) sehr empfohlen wenn Sie Server-Programme zur Verfügung stellen.

(2) Mailingliste ist moderiert.

Fehlt etwas? Vorschläge sind Willkommen!

Via Web sind auch folgende Mailinglisten & Newsgroups verfügbar:

  • student-ipv6 (India) -Beschreibung: Dies ist eine Newsgruppe für die 'Student Awareness group of IPv6' in Indien

  • sun-ipv6-users -Beschreibung: Bitte berichten Sie Probleme/Vorschläge in Bezug auf die IPng Implementation von SUN Microsystems

  • IPv6-BITS -Beschreibung: Diese Liste dient der Koordination des Projekts Vertebrae.

  • linux-bangalore-ipv6 -Beschreibung: Die IPv6 deployment Liste der Bangalore Linux User Group

  • packet-switching -Beschreibung: Dies Liste behandelt folgende Themen: packet switching theory, technology, implementation and application in any relevant aspect including without limitation LAPB, X.25, SDLC, P802.1d, LLC, IP, IPv6, IPX, DECNET, APPLETALK, FR, PPP, IP Telephony, LAN PBX systems, management protocols like SNMP, e-mail, network transparent window systems, protocol implementation, protocol verification, conformance testing and tools used in maintaining or developing packet switching systems.

  • de.comm.protocols.tcp-ip -Beschreibung: Umstellung auf IPv6 -Quelle: Chartas der Newsgruppen in de.*

  • Google Group: comp.protocols.tcp-ip

  • Google Group: linux.debian.maint.ipv6

  • Google Group: microsoft.public.platformsdk.networking.ipv6

  • Google Group: fa.openbsd.ipv6


25.6. Online-Werkzeuge

25.6.1. Test-Werkzeuge


25.6.2. Informationsbeschaffung


25.6.3. IPv6 Looking Glasses


25.6.4. Hilfsapplikationen


25.7. Trainings, Seminare

Fehlt etwas? Vorschläge sind willkommen!


25.8. 'Die Online Entdeckung' ...

IPv6: Addressing The Needs Of the Future von Yankee Group (Autor)

Listenpreis: $595.00

Edition: e-book (Acrobat Reader)

Seiten: 3 (drei)

Hrsg.: MarketResearch.com; ISBN B00006334Y; (1. November 2001)

;-) Die Auflagenhöhe dieses eBooks wäre doch sehr interessant...


Kapitel 26. Versions-Überblick / Danksagung / Zum Schluss

26.1. Versions-Überblick

Die Versionen x.y. werden im Internet veröffentlicht.

Die Versionen x.y.z stellen Zwischenschritte dar, die nur als LyX- und SGML-Datei im TLDP-CVS veröffentlicht werden. Dadurch, dass allerdings Deep Space 6 diese SGML-Dateien spiegelt und daraus öffentliche Versionen generiert, sind diese auch dort und auf den Servern, die Deep Space 6 spiegeln, verfügbar.


26.1.1. Ausgabe 0.x

26.1.1.1. Englische Sprachversion (Peter Bieringer's Original)

Die Historie der Änderungen der englischen Sprachversion finden Sie dort: TLDP / Linux+IPv6-HOWTO / Revision History.


26.1.1.2. Deutsche Sprachversion

0.66.de.1

2010-04-20/PB: Sync mit Original

0.65.de.1

2009-12-13/PB: Sync mit Original

0.64.de.1

2009-06-11/PB: Sync mit Original

0.63.de.2

2009-03-13/PB: remove original transator contact address, no longer responsible for further changes

0.63.de.1

2009-02-14/PB: Sync mit Original

0.62.de.1

2008-11-09/PB: Sync mit Original

0.61.1.de.3

2007-08-25/PB: Fix Typo

0.61.1.de.2

2007-08-17/PB: Fix Typo

0.61.1.de.1

2007-11-11/PB: Sync mit Original

0.61.de.1

2007-10-06/PB: Sync mit Original, kleine Korrekturen

0.60.de.1

2007-05-31/PB: Sync mit Original (bis auf C-API), kleine Korrekturen

0.51.de.1

2006-11-08/PB: Sync mit Original

0.50.2.de.1

2006-10-25/PB: Sync mit Original

0.50.1.de.1

2006-09-23/PB: Sync mit Original

0.50.de.1

2006-08-24/PB: Sync mit Original

0.49.5.de.1

2006-08-23/PB: Sync mit Original

0.49.4.de.1

2006-08-21/PB: Sync mit Original, Korrektur bei Adresstypen (Übersetzungsfehler)

0.49.3.de.1

2006-08-20/PB: Sync mit Original

0.49.2.de.1

2006-08-20/PB: Sync mit Original

0.49.1.de.1

2006-06-13/PB: Sync mit Original

0.49.de.1

2005-10-03/PB: Sync mit Original

0.48.de.1

2005-01-11/PB: Sync mit Original

0.47.de.1

2004-08-30/PB: Sync mit Original

0.46.5.de.1

2004-07-22/PB: Sync mit Original

0.46.4.de.1

2004-07-19/PB: Sync mit Original und kleine Korrekturen der Übersetzung

0.46.2.de.1

2004-05-22/PB: Sync mit Original

0.46.1.de.1

2004-04-18/PB: Sync mit Original

0.46.de.1

2004-04-04/PB: Sync mit Original (Italienische Übersetzung verfügbar, Informationen über DHCPv6, kleinere Updates)

0.45.1.de.1

2004-01-12/PB: Sync mit Original (kleine Erweiterung)

0.45.de.1

2004-01-11/PB: Sync mit Original (kleine Korrekturen, URL-Korrekturen und Erweiterungen)

0.44.2.de.1

2003-10-30/PB: Sync mit Original (kleine Korrektur)

0.44.de.1

2003-08-15/PB: Sync mit Original (URL-Korrekturen, Tipp bei tcp_wrappers und Apache2)

0.43.2.de.2

2003-07-26/PB: Sync mit Original (URL-Korrekturen)

0.43.2.de.1

2003-06-11/PB: Sync mit Original (URL-Korrekturen)

0.43.1.de.2

2003-06-11/PB: Typo gefixt

0.43.1.de.1

2003-06-07/PB: Sync mit Original (Links, IPsec)

0.43.de.1

2003-06-05/PB: Sync mit Original (SuSe-Linux-Tipps)

0.41.4.de.1

2003-05-02/PB: Sync mit Original (URL-Korrekturen)

0.41.3.de.1

2003-04-23/PB: Sync mit Original (URL-Korrektur)

0.41.1.de.1

2003-03-31/PB: Sync mit Original (URL-Korrektur)

0.41.de.1

2003-03-22/PB: Angabe der URL dieser Übersetzung

0.40.2.de.1

2003-02-27/PB: Sync mit Original (URL-Korrektur)

0.40.1.de.1

2003-02-12/PB: Sync mit Original (Debian-Linux-Konfiguration), Ersetzen der Info über verfügbare Übersetzungen durch einen Link zum Original.

0.40.de.1

2003-02-10/PB: Kleine sprachliche Änderungen und paar kleine Verbesserungen.

0.39.2.de.1

2003-02-10/GK: Erste öffentliche Version in deutscher Sprache. Diese Version entspricht inhaltlich der englischen Version 0.39.2. Der Zusatz de.1 bezeichnet die Revision der deutschen Sprachversion. Diese Version wurde unter Mandrake Linux 9.0 mit LyX Version 1.2.1 und der Klasse DocBook book (SGML) erstellt.


26.2. Danksagung

Dieser feinen Liste hinzugefügt werden können Sie am schnellsten, indem Sie mir Bug fixes, Korrekturen und/oder Updates schicken ;-)

Wenn Sie eine größere Überarbeitung vornehmen wollen, können Sie dazu die LyX Datei (siehe original source) verwenden und mir entsprechende diffs dann zusenden, diffs der SGML-Version sind hingegen nicht sehr nützlich.


26.2.1. Primärer Dank...

  • David Ranch <dranch at trinnet dot net>: Er ermutigte mich zum Schreiben dieses HOWTOs, für seine Anmerkungen zu den ersten englischen Versionen, für seine Beiträge zu den IPv6 Test-Ergebnissen auf der IPv6-Homepage des Autors. Ebenfalls für seine größeren Überarbeitungen und Vorschläge.

  • Pekka Savola <pekkas at netcore dot fi>: Für größere Überarbeitungen der englischen Version, seinen Input und Vorschläge.

  • Georg Käfer <gkaefer at gmx dot at>: Für das Aufspüren eines Fehlers bei der PDF Erstellung (durch LDP Betreuer Greg Ferguson behoben), den Input betreff deutscher Bücher, einer großen URL-Liste, die Überprüfung aller Links und vieler weiterer Vorschläge, Korrekturen und Beiträge.


26.2.2. Sonstiger Dank...

26.2.2.1. Verwaltung des Dokuments

Als Neuling ein LDP HOWTO zu schreiben (in LyX schreiben sowie SGML konformer Export zu DocBook) ist nicht so einfach, wie von so manchem behauptet wird. Es gibt einige sonderbare Fallen... Nichtsdestoweniger Dank an:


26.2.2.2. Inhalt des Dokuments

Mein Dank für Fixes und Hinweise ist hier aufgelistet - und die Liste wird mit der Zeit sicherlich länger werden... -Bezüglich der englischen Version finden Sie in dieser, hier werden nur diejenigen, die die deutsche Version betreffen, aufgelistet.

  • Nico Schottelius, Oliver Kraus, Götz Bauermann: Typo gefunden

  • Jens Nachtigall: Fehler gefunden


26.3. Zum Schluss

Danke für's Lesen. Hoffentlich ist es von Nutzen!

Falls Sie irgendeine Frage haben, abonnieren sie eine entsprechende maillist und diskutieren Sie ihr Problem unter Angabe möglichst vieler Informationen.

\ No newline at end of file diff --git a/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.de.lyx b/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.de.lyx deleted file mode 100644 index bfc19fe6..00000000 --- a/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.de.lyx +++ /dev/null @@ -1,23915 +0,0 @@ -#LyX 2.2 created this file. For more info see http://www.lyx.org/ -\lyxformat 508 -\begin_document -\begin_header -\save_transient_properties true -\origin unavailable -\textclass docbook-book -\begin_preamble - - -\end_preamble -\use_default_options false -\maintain_unincluded_children false -\language ngerman -\language_package default -\inputencoding default -\fontencoding global -\font_roman "default" "default" -\font_sans "default" "default" -\font_typewriter "default" "default" -\font_math "auto" "auto" -\font_default_family default -\use_non_tex_fonts false -\font_sc false -\font_osf false -\font_sf_scale 100 100 -\font_tt_scale 100 100 -\graphics default -\default_output_format default -\output_sync 0 -\bibtex_command default -\index_command default -\paperfontsize default -\spacing single -\use_hyperref false -\papersize default -\use_geometry false -\use_package amsmath 1 -\use_package amssymb 1 -\use_package cancel 0 -\use_package esint 0 -\use_package mathdots 1 -\use_package mathtools 0 -\use_package mhchem 1 -\use_package stackrel 0 -\use_package stmaryrd 0 -\use_package undertilde 0 -\cite_engine basic -\cite_engine_type default -\biblio_style plain -\use_bibtopic false -\use_indices false -\paperorientation portrait -\suppress_date false -\justification true -\use_refstyle 0 -\index Stichwortverzeichnis -\shortcut idx -\color #008000 -\end_index -\secnumdepth 3 -\tocdepth 3 -\paragraph_separation indent -\paragraph_indentation default -\quotes_language swedish -\papercolumns 1 -\papersides 1 -\paperpagestyle default -\tracking_changes false -\output_changes false -\html_math_output 0 -\html_css_as_file 0 -\html_be_strict false -\end_header - -\begin_body - -\begin_layout Title -Linux IPv6 HOWTO (de) -\end_layout - -\begin_layout Standard - -\lang english -\begin_inset ERT -status open - -\begin_layout Plain Layout - -PeterBieringerpb at bieringer dot de -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard - -\lang english -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - - 0.67.de.1wip 2015-08-18 PB -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - - 0.66.de.1 2014-05-15 PB -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - - 0.65.de.1 2009-12-13 PB -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - - 0.64.de.1 2009-06-11 PB -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - - 0.61.de.1 2007-10-06 PB -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Abstract -Das Ziel des Linux IPv6 HOWTO ist die Beantwortung von Basis- und Experten-Frage -n zum Thema IPv6 mit Linux-Betriebssystemen. - Dieses HOWTO will dem Leser genug Informationen bereitstellen, um IPv6-Anwendun -gen auf Linux Computer installieren, konfigurieren und anwenden zu können. - -\lang english -Zwischen-Versionen sind auf -\begin_inset CommandInset href -LatexCommand href -name "mirrors.bieringer.de" -target "http://mirrors.bieringer.de/Linux+IPv6-HOWTO/" - -\end_inset - - oder -\begin_inset CommandInset href -LatexCommand href -name "mirrors.deepspace6.net" -target "http://mirrors.deepspace6.net/Linux+IPv6-HOWTO/" - -\end_inset - - verfügbar. - Änderungen sind in der -\begin_inset CommandInset ref -LatexCommand ref -name "Revisionshistorie" -reference "revision-history" - -\end_inset - - aufgelistet. -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-general" - -\end_inset - -Allgemein -\end_layout - -\begin_layout Standard -Informationen über verfügbare Übersetzungen finden Sie im Abschnitt -\begin_inset CommandInset ref -LatexCommand ref -name "Übersetzungen" -reference "general-translations" - -\end_inset - -. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "general-copright" - -\end_inset - -Copyright, Lizenz und anderes -\end_layout - -\begin_layout Subsection -Copyright -\end_layout - -\begin_layout Standard -Verfasst von und urheberrechtlich geschützt durch Peter Bieringer © 2001-2014. -\begin_inset Newline newline -\end_inset - - -\end_layout - -\begin_layout Standard -Deutsche Übersetzung: -\end_layout - -\begin_layout Standard -Verfasst von und urheberrechtlich geschützt durch Georg Käfer © 2002-2003, - weitergeführt von Peter Bieringer © 2004-2014. -\end_layout - -\begin_layout Subsection -Lizenz -\end_layout - -\begin_layout Standard - -\series bold -Dieses Linux IPv6 HOWTO wird unter der GNU GPL Version 2 herausgegeben: -\series default - -\begin_inset Newline newline -\end_inset - - -\end_layout - -\begin_layout Standard -Dieses Linux IPv6 HOWTO ist ein Handbuch zur Anwendung und Konfiguration - von IPv6 auf Linux-Systemen. - -\begin_inset Newline newline -\end_inset - - -\end_layout - -\begin_layout Standard -Copyright © 2001-2014 Peter Bieringer -\begin_inset Newline newline -\end_inset - -Deutsche Übersetzung Copyright © 2002-2003 Georg Käfer, weitergeführt von - Peter Bieringer © 2004-2013. -\begin_inset Newline newline -\end_inset - - -\end_layout - -\begin_layout Standard -Diese Dokumentation ist freie Software; Sie können diese unter den Bedingungen - der GNU General Public License, wie von der Free Software Foundation publiziert -, entweder unter Version 2 oder optional jede höhere Version redistribuieren - und/oder modifizieren. -\end_layout - -\begin_layout Standard -Dieses Programm wird in der Hoffnung verteilt, dass es für Sie nutzvoll - ist, jedoch OHNE JEDWEDER GEWÄHRLEISTUNG; sogar ohne der implizierten Gewährlei -stung der MARKTFÄHIGKEIT oder der FÄHIGKEIT ZU EINEM BESONDEREN ZWECK bzw. - VORSATZ. - Weitere Details finden Sie in der GNU General Public License. -\end_layout - -\begin_layout Standard -Zusammen mit diesem Dokument sollten Sie eine Kopie der GNU General Public - License erhalten haben; Wenn dem nicht so ist, können Sie sich an folgende - Adresse wenden: Free Software Foundation, Inc., -\lang english -51 Franklin Street, Fifth Floor, Boston, MA 02110, USA -\lang ngerman -. -\end_layout - -\begin_layout Subsection -Über den Autor -\end_layout - -\begin_layout Subsubsection -Internet/IPv6 Background des Autors -\end_layout - -\begin_layout Itemize -1993: In Kontakt mit dem Internet getreten, kennenlernen von konsolenbasierte - E-Mail- und News-Client-Programme (z.B.: suchen Sie nach -\begin_inset Quotes sld -\end_inset - -e91abier -\begin_inset Quotes srd -\end_inset - - auf -\begin_inset CommandInset href -LatexCommand href -name "groups.google.com" -target "http://groups.google.com/" - -\end_inset - -, das ist der Autor). -\end_layout - -\begin_layout Itemize -1996: Anfrage zur Gestaltung eines IPv6 Kurses inklusive eines Workshops - zum Thema Linux Betriebssystem bekommen. -\end_layout - -\begin_layout Itemize -1997: Schreiben einer Anleitung, wie man IPv6 auf Linux Systemen installieren, - konfigurieren und anwenden kann, genannt -\begin_inset CommandInset href -LatexCommand href -name "IPv6 & Linux - HowTo" -target "http://www.bieringer.de/linux/IPv6/" - -\end_inset - - (siehe unter -\begin_inset CommandInset href -LatexCommand href -name "IPv6 & Linux - HowTo/History" -target "http://www.bieringer.de/linux/IPv6/IPv6-HOWTO/IPv6-HOWTO-0.html#history" - -\end_inset - -). -\end_layout - -\begin_layout Itemize -2001: Begonnen, dieses neue Linux IPv6 HOWTO zu schreiben. -\end_layout - -\begin_layout Subsubsection -Ansprechpartner -\end_layout - -\begin_layout Standard -Der Autor kann via E-Mail und auch über seine -\begin_inset CommandInset href -LatexCommand href -name "homepage" -target "http://www.bieringer.de/pb/" - -\end_inset - - kontaktiert werden. -\end_layout - -\begin_layout Standard -Der Autor lebt zurzeit in München / Bayern / (Süd-)Deutschland / (Mittel-)Europa - / Erde (Festland). -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "general-category" - -\end_inset - -Kategorie -\end_layout - -\begin_layout Standard -Dieses HOWTO sollte in der Kategorie -\begin_inset Quotes sld -\end_inset - - -\emph on -Networking -\emph default -/ -\emph on -Protocols -\emph default - -\begin_inset Quotes srd -\end_inset - - aufgelistet werden. -\end_layout - -\begin_layout Section -Version, Werdegang und Unerledigtes -\end_layout - -\begin_layout Subsection -Version -\end_layout - -\begin_layout Standard -Die aktuelle Versionsnummer finden Sie auf der Titelseite. -\end_layout - -\begin_layout Standard -Für andere verfügbare Versionen/Übersetzungen siehe auch -\lang english - -\begin_inset CommandInset href -LatexCommand href -name "http://www.bieringer.de/linux/IPv6/" -target "http://www.bieringer.de/linux/IPv6/" - -\end_inset - -. -\end_layout - -\begin_layout Subsection -Werdegang -\end_layout - -\begin_layout Subsubsection -Eckpunkte -\end_layout - -\begin_layout Standard -2001-11-30: Beginn mit der Neukonzeption dieses HOWTOs. -\end_layout - -\begin_layout Standard -2002-01-02: Viel Inhalt eingearbeitet, erste Version des Kapitels 1 veröffentlic -ht (Version 0.10). -\end_layout - -\begin_layout Standard -2002-01-14: Weitere Vervollständigung und Überprüfung des Inhalts, öffentliche - Freigabe des kompletten Dokuments (Version 0.14). -\end_layout - -\begin_layout Standard -2002-08-16: Polnische Übersetzung ist in Arbeit. -\end_layout - -\begin_layout Standard -2002-10-31: Chinesische Übersetzung ist verfügbar. -\end_layout - -\begin_layout Standard -2002-11-10: Deutsche Übersetzung ist in Arbeit. -\end_layout - -\begin_layout Standard -2003-02-10: Deutsche Übersetzung ist verfügbar. -\end_layout - -\begin_layout Standard - -\lang english -2003-04-09: Französische -\lang ngerman -Übersetzung ist in Arbeit. -\end_layout - -\begin_layout Standard - -\lang english -2003-05-09: Französische -\lang ngerman -Übersetzung ist verfügbar -\end_layout - -\begin_layout Standard - -\lang english -2003-10-16: Italienische -\lang ngerman -Übersetzung ist in Arbeit. -\end_layout - -\begin_layout Standard - -\lang english -2004-03-12: Italienische -\lang ngerman -Übersetzung ist verfügbar -\end_layout - -\begin_layout Standard - -\lang english -2004-06-18: Griechische Übersetzung ist in Arbeit -\end_layout - -\begin_layout Standard - -\lang english -2005-07-25: Türkische Übersetzung ist verfügbar -\end_layout - -\begin_layout Standard - -\lang english -2007-03-28: Portugiesisch-Brasilianische Übersetzung ist in Arbeit -\end_layout - -\begin_layout Standard - -\lang english -2008-07-30: Spanische -\lang ngerman -Übersetzung ist -\lang english -verfügbar -\lang ngerman - (aber noch nicht abgeschlossen) -\end_layout - -\begin_layout Standard - -\lang english -2011-05-09: Portugiesisch-Brasilianische Übersetzung ist wieder in Arbeit -\end_layout - -\begin_layout Subsubsection -Vollständiger Werdegang -\end_layout - -\begin_layout Standard -Am Ende dieses Dokumentes finden Sie die -\begin_inset CommandInset ref -LatexCommand ref -name "Historie der Änderungen" -reference "revision-history" - -\end_inset - -. -\end_layout - -\begin_layout Subsection -Unerledigtes -\end_layout - -\begin_layout Itemize -Fehlenden Inhalt ergänzen -\end_layout - -\begin_layout Itemize -Grammatik-Überprüfung beenden -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "general-translations" - -\end_inset - -Übersetzungen -\end_layout - -\begin_layout Standard -Übersetzungen müssen den URL, die Versionsnummer und das Copyright des Originald -okuments enthalten (aber auch die Daten zu ihrer Übersetzung). - Bitte übersetzen Sie nicht das Original-Changelog, das wäre nicht sehr - sinnvoll. - Es sieht aus, als wäre die Änderungsfrequenz dieses Dokumentes überwiegend - geringer als einmal pro Monat. - Seit Version 0.27 scheint der Hauptteil des vom Autor beigesteuerten Inhaltes - geschrieben zu sein. - Übersetzungen müssen immer das englische Original als Quelle benutzen. -\end_layout - -\begin_layout Subsection -Diverse Sprachen -\end_layout - -\begin_layout Standard - -\lang english -Notiz: eine Übersicht mit URLs ist zu finden unter -\begin_inset CommandInset href -LatexCommand href -name "http://www.bieringer.de/linux/IPv6/" -target "http://www.bieringer.de/linux/IPv6/" - -\end_inset - -. -\end_layout - -\begin_layout Subsubsection -Deutsch -\end_layout - -\begin_layout Standard -Mit 2002-11-10 wurde von Georg Käfer die Deutsche - Übersetzung begonnen und am 10.02.2003 erstmals publiziert. - Grundlage der Übersetzung ist die CVS-Version 1.53 der Lyx-Datei, aus der - das Linux IPv6 HOWTO Version 0.39.2 erstellt wurde. -\end_layout - -\begin_layout Standard -Mit Sicherheit werden in dieser Übersetzung noch so manche 'Hoppalas' und - auch 'grausige' Rechtschreibfehler zu finden sein. - Sorry! Ebenfalls fällt es nicht immer leicht, zu entscheiden, ob ein Terminus - überhaupt übersetzt werden soll, bzw. - ob die Beibehaltung des englischen Originalwortes nicht zielführender wäre... - -\end_layout - -\begin_layout Standard - -\series bold -\emph on -Neue deutsche Rechtschreibung -\series default -\emph default -: es wurde eine konservative Übersetzung angewandt, d.h. - nicht alle möglichen Änderungen der Neuen deutschen Rechtschreibung wurden - durchgeführt, sondern nur die notwendigen Änderungen. -\end_layout - -\begin_layout Standard -Die URL für diese deutsche Übersetzung ist: -\begin_inset CommandInset href -LatexCommand href -name "http://mirrors.deepspace6.net/Linux+IPv6-HOWTO-de/" -target "http://mirrors.deepspace6.net/Linux+IPv6-HOWTO-de/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Andere Sprachen -\end_layout - -\begin_layout Standard -Informationen über Übersetzungen in andere Sprachen finden Sie hier im Originald -okument: -\begin_inset CommandInset href -LatexCommand href -name "TLDP / Linux+IPv6-HOWTO / Übersetzungen" -target "http://www.tldp.org/HOWTO/Linux+IPv6-HOWTO/general-translations.html" - -\end_inset - -. -\end_layout - -\begin_layout Section -Technisches -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "general-original-source" - -\end_inset - -Originalquelle dieses HOWTOs -\end_layout - -\begin_layout Standard -Die originale englische Version dieses HOWTOs wurde mit LyX Version 1.6.1 - auf einem Fedora 10 Linux System mit SGML-Template (DocBook book) erstellt. - Alle Dateien sind unter -\lang english - -\begin_inset CommandInset href -LatexCommand href -name "github / tLDP / LDP / users / Peter-Bieringer" -target "https://github.com/tLDP/LDP/tree/master/LDP/users/Peter-Bieringer/" - -\end_inset - - -\lang ngerman - verfügbar. -\end_layout - -\begin_layout Standard -Auch die deutsche Version wurde mit LyX erstellt und befindet sich ebenfalls - im angegebenen CVS-Verzeichnis. -\end_layout - -\begin_layout Subsubsection -Zeilenumbruch in Code-Beispielen -\end_layout - -\begin_layout Standard -Der Zeilenumbruch wird mit Hilfe eines selbst geschriebenen Tools -\begin_inset Quotes sld -\end_inset - -lyxcodelinewrapper.pl -\begin_inset Quotes srd -\end_inset - - erstellt; Sie finden das Skript am CVS unter: -\begin_inset CommandInset href -LatexCommand href -name "TLDP-CVS / users / Peter-Bieringer" -target "http://cvs.tldp.org/go.to/LDP/LDP/users/Peter-Bieringer/" - -\end_inset - -. -\end_layout - -\begin_layout Subsubsection -SGML Erzeugung -\end_layout - -\begin_layout Standard -SGML wird mit Hilfe der Exportfunktion in LyX generiert. -\end_layout - -\begin_layout Standard -Um korrekten SGML Code zu erstellen, müssen einige Korrekturen gemacht werden. - Die entsprechenden Perl Skripts finden Sie unter -\begin_inset CommandInset href -LatexCommand href -name "TLDP-CVS / users / Peter-Bieringer" -target "http://cvs.tldp.org/go.to/LDP/LDP/users/Peter-Bieringer/" - -\end_inset - -: -\end_layout - -\begin_layout Itemize -Der Export von Lyx-Tabellen erstellt keine korrekten -\begin_inset Quotes sld -\end_inset - -colspan -\begin_inset Quotes srd -\end_inset - - Tags. - Tool für die Korrektur: -\begin_inset Quotes sld -\end_inset - -sgmllyxtabletagfix.pl -\begin_inset Quotes srd -\end_inset - - (behoben seit LyX Version 1.2.0) -\end_layout - -\begin_layout Itemize -LyX verwendet manchmal , anstelle der normalen, spezielle Links-/Rechts-Formatie -rungen für Zitate, die dann auch im generierten HTML Code ausgegeben werden. - Einige Browser können das Ergebnis nicht besonders schön darstellen (bekannt - sind: Opera TP2 oder Konqueror). - Tool für die Korrektur: -\begin_inset Quotes sld -\end_inset - -sgmllyxquotefix.pl -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Subsection -Online-Verweise auf die HTML Version dieses HOWTOs (Links / Anchors) -\end_layout - -\begin_layout Subsubsection -Hauptindexseite -\end_layout - -\begin_layout Standard -Im Allgemeinen wird ein Verweis auf die Hauptindexseite empfohlen. -\end_layout - -\begin_layout Subsubsection -Seitennamen -\end_layout - -\begin_layout Standard -Da die HTML-Seiten aus einer SGML-Datei erstellt werden, werden einige HTML-Date -inamen ziemlich zufällig gewählt. - Manche Seiten sind jedoch in LyX mit Tags gekennzeichnet, woraus statische - Namen resultieren. - Diese sollten der besseren Referenz wegen zukünftig nicht geändert werden. -\end_layout - -\begin_layout Standard -Bitte lassen Sie es wissen, wenn Sie glauben, dass ein Tag vergessen wurde. -\end_layout - -\begin_layout Section -Vorwort -\end_layout - -\begin_layout Standard -Einiges vorab: -\end_layout - -\begin_layout Subsection -Wie viele IPv6 & Linux bezogene HOWTOs gibt es? -\end_layout - -\begin_layout Standard -Inklusive diesem gibt es drei (3) HOWTO-Dokumente. - Pardon, wenn das zu viele sind ;-) -\end_layout - -\begin_layout Subsubsection -Linux Ipv6 FAQ/HOWTO (veraltet) -\end_layout - -\begin_layout Standard -Das erste IPv6 bezogene Dokument wurde von -\emph on -Eric Osborne -\emph default - geschrieben und heißt -\begin_inset CommandInset href -LatexCommand href -name "Linux IPv6 FAQ/HOWTO" -target "http://www.linuxhq.com/IPv6/" - -\end_inset - - (bitte benutzen Sie den Text nur im historischen Kontext). - -\series bold -Die neueste Version -\series default - 3.2.1 wurde am 14.Juli -\series bold -1997 -\series default - veröffentlicht. -\end_layout - -\begin_layout Standard -Bitte um Ihre Mithilfe: Wenn jemand das Erstellungsdatum der Erstversion - dieses HOWTOs kennen sollte, senden Sie mir Bitte ein E-Mail (Die Information - wird im Abschnitt -\begin_inset Quotes sld -\end_inset - -Werdegang -\begin_inset Quotes srd -\end_inset - - eingearbeitet). -\end_layout - -\begin_layout Subsubsection -IPv6 & Linux - HowTo (gewartet) -\end_layout - -\begin_layout Standard -Ein zweites Dokument ( -\begin_inset CommandInset href -LatexCommand href -name "IPv6 & Linux - HowTo" -target "http://www.bieringer.de/linux/IPv6/" - -\end_inset - -) wurde vom selben Autor (Peter Bieringer) geschrieben und liegt im HTML-Format - vor. - -\series bold -Begonnen -\series default - wurde mit dem Schreiben im April -\series bold -1997 -\series default - und die erste englische Version wurde im Juni 1997 veröffentlicht. - Das Dokument wird -\series bold -weiterhin -\series default - betreut, es wird aber langsam (jedoch nicht komplett) in das Linux IPv6 - HOWTO - das Sie gerade lesen - eingearbeitet. -\end_layout - -\begin_layout Subsubsection -Linux IPv6 HOWTO (dieses Dokument) -\end_layout - -\begin_layout Standard -Da das -\begin_inset CommandInset href -LatexCommand href -name "IPv6 & Linux - HowTo" -target "http://www.bieringer.de/linux/IPv6/" - -\end_inset - - in HTML geschrieben wurde, war es nicht wirklich mit dem -\begin_inset CommandInset href -LatexCommand href -name "The Linux Documentation Project (TLDP)" -target "http://www.tldp.org/" - -\end_inset - - kompatibel. - Der Autor (Peter Bieringer) bekam Ende Nov. - 2001 die Anfrage, das -\begin_inset CommandInset href -LatexCommand href -name "IPv6 & Linux - HowTo" -target "http://www.bieringer.de/linux/IPv6/" - -\end_inset - - in SGML zu konvertieren. - Er entschied sich auf Grund dieser Diskontinuität ( -\begin_inset CommandInset href -LatexCommand href -name "Future of IPv6 & Linux - HowTo" -target "http://www.bieringer.de/linux/IPv6/IPv6-HOWTO/IPv6-HOWTO-0.html#history" - -\end_inset - -) und der Tatsache, dass IPv6 mehr und mehr zum Standard wird, zum Schreiben - eines neuen Dokuments. - Im zweiten HOWTO ( -\begin_inset CommandInset href -LatexCommand href -name "IPv6 & Linux - HowTo" -target "http://www.bieringer.de/linux/IPv6/" - -\end_inset - -) wird auch weiterhin dynamischer Inhalt sowie weiterführender Inhalt zu - finden sein. - -\end_layout - -\begin_layout Section -Verwendete Begriffe, Glossar und Abkürzungen -\end_layout - -\begin_layout Subsection -Netzwerkbegriffe -\end_layout - -\begin_layout Description -Base -\begin_inset space ~ -\end_inset - -10 Dezimales Zahlensystem, das die Zahlen 0-9 beinhaltet. -\end_layout - -\begin_layout Description -Base -\begin_inset space ~ -\end_inset - -16 Generell in Programmiersprachen verwendetes hexedezimales Zahlensystem, - das die Zahlen 0-9 und die Buchstaben A-F beinhaltet (Groß/Kleinschreibung - möglich). -\end_layout - -\begin_layout Description -Base -\begin_inset space ~ -\end_inset - -85 85 verschiedene Zahlen/Buchstaben umfasst dieses Zahlensystem und ermöglicht - dadurch kürzere Zeichenketten - aber niemals in der Praxis gesehen. -\end_layout - -\begin_layout Description -Bit Kleinste Speichereinheit mit dem Wert ein/wahr (1) oder aus/falsch (0) -\end_layout - -\begin_layout Description -Byte Meistens eine Menge von 8 bits (aber kein Muss - siehe ältere Computer - Systeme) -\end_layout - -\begin_layout Description -Device Netzwerkgerät, siehe auch NIC -\end_layout - -\begin_layout Description -Dual -\begin_inset space ~ -\end_inset - -homed -\begin_inset space ~ -\end_inset - -host Ein Dual homed host ist ein Node mit zwei (physischen oder virtuellen) - Schnittstellen auf zwei unterschiedlichen Links. - Datenpakete können zwischen den zwei Verbindungen nicht weitergeleitet - werden. -\end_layout - -\begin_layout Description -Host Im Regelfall handelt es sich um einen Rechner mit einen Link sowie - einer aktiven Netzwerk-Schnittstelle, z.B. - Ethernet oder (aber nicht und) PPP. -\end_layout - -\begin_layout Description -Interface Ident mit -\begin_inset Quotes sld -\end_inset - -device -\begin_inset Quotes srd -\end_inset - -, siehe auch NIC. -\end_layout - -\begin_layout Description -IP -\begin_inset space ~ -\end_inset - -Header Kopf eines IP-Paketes (jedes Netzwerk-Paket hat einen header, die - Form des headers ist abhängig von der Netzwerkschicht). -\end_layout - -\begin_layout Description -Link Ein Link ist eine Schicht 2 Netzwerk-Transportmedium für Pakete; Beispiele - sind Ethernet, Token Ring, PPP, SLIP, ATM, ISDN, Frame Relay,... -\end_layout - -\begin_layout Description -Node Ein Node (=Knoten) ist ein Host oder ein Router. -\end_layout - -\begin_layout Description -Octet Sammlung von acht (8) realen bits, vergleichbar mit -\begin_inset Quotes sld -\end_inset - -byte -\begin_inset Quotes srd -\end_inset - -. -\end_layout - -\begin_layout Description -Port Information für den TCP/UDP dispatcher (Schicht 4), mit dessen Hilfe - Informationen auf höhere Schichten transportiert werden. -\end_layout - -\begin_layout Description -Protocol Jede Netzwerkschicht enthält meistens ein Protokoll-Feld damit - die Übergabe transportierter Informationen an höhere Netzwerkschichten - erleichtert wird. - Beispiele hierfür: Schicht 2 (MAC) und 3 (IP). -\end_layout - -\begin_layout Description -Router Ein Router ist ein Knoten mit zwei (2) oder mehr (physischen oder - virtuellen) Schnittstellen, der Datenpakete zwischen den Schnittstellen - versenden kann. -\end_layout - -\begin_layout Description -Socket Ein IP socket wird durch Quell- und Zieladresse, den Ports (und der - Verbindung) definiert. -\end_layout - -\begin_layout Description -Stack Ein Stack setzt sich aus Netzwerkschichten zusammen. - -\end_layout - -\begin_layout Description -Subnetmask IP Netzwerke verwenden Bitmasken um lokale von entfernten Netzwerken - zu trennen. -\end_layout - -\begin_layout Description -Tunnel Ein Tunnel ist typischerweise eine Punkt-zu-Punkt-Verbindung, über - die Datenpakete eines anderen Protokolls ausgetauscht werden. - Beispiel: IPv6-in-IPv4 Tunnel. -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "Glossar" - -\end_inset - -Abkürzungen -\end_layout - -\begin_layout Description -ACL Access Control List - Zugriffsliste) -\end_layout - -\begin_layout Description -API Application Programming Interface - Schnittstellen in Programmen zwischen - den Applikationen -\end_layout - -\begin_layout Description -ASIC Application Specified Integrated Circuit - Applikationsspezifischer - integrierter Schaltkreis -\end_layout - -\begin_layout Description -BSD Berkeley Software Distribution -\end_layout - -\begin_layout Description -CAN-Bus Controller Area Network Bus (physical bus system) -\end_layout - -\begin_layout Description - -\lang english -ISP Internet Service Provider -\end_layout - -\begin_layout Description -KAME Ein Projekt und gemeinsame Anstrengung von sechs (6) Firmen in Japan - mit dem Ziel, einen freien IPv6 und IPsec Stack für BSD Derivate der Öffentlich -keit zur Verfügung zu stellen -\begin_inset CommandInset href -LatexCommand href -name "www.kame.net" -target "http://www.kame.net/" - -\end_inset - -. -\end_layout - -\begin_layout Description - -\lang english -LIR Local Internet Registry - Lokale Internet Registratur -\end_layout - -\begin_layout Description -NIC Network Interface Controller - Netzwerk[schnittstellen]karte, kurz Netzwerkk -arte -\end_layout - -\begin_layout Description -RFC Request For Comments - eine Sammlung von technischen und organisatorischen - Dokumenten zum Thema Internet. -\end_layout - -\begin_layout Description -USAGI UniverSAl playGround for Ipv6 Project - dieses Projekt will für das - Linux System einen IPv6 Protokoll stack mit Produktionsqualität ausliefern. -\end_layout - -\begin_layout Subsection -In diesem Dokument verwendete Syntax -\end_layout - -\begin_layout Subsubsection -Zeilenumbruchs-Zeichen bei langen Codebeispielen -\end_layout - -\begin_layout Standard -Das spezielle Zeichen -\begin_inset Quotes sld -\end_inset - -¬ -\begin_inset Quotes srd -\end_inset - - zeigt in den Beispielen an, dass die Zeile umgebrochen wurde. - Dies wurde für eine korrekte Darstellung des Textes in den PDF- und PS-Versione -n benötigt. -\end_layout - -\begin_layout Subsubsection -Platzhalter -\end_layout - -\begin_layout Standard -In allgemeinen Beispielen können Sie öfters lesen: -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Standard -In Skripts oder an Ihrer Kommandozeile müssen Sie die < und > weglassen - und den Text mit dem entsprechenden Inhalt ersetzen. - Das Beispiel hier z.B. - könnte sein: -\end_layout - -\begin_layout Code - -1.2.3.4 -\end_layout - -\begin_layout Subsubsection -Shell-Kommandos -\end_layout - -\begin_layout Standard -Kommandos, die nicht als Root-Benutzer ausgeführt werden, beginnen mit $, - z.B. -\end_layout - -\begin_layout Code - -$ whoami -\end_layout - -\begin_layout Standard -Befehle, die mit Root-Rechten ausgeführt werden, beginnen mit #, z.B. -\end_layout - -\begin_layout Code - -# whoami -\end_layout - -\begin_layout Section -Grundvoraussetzung für die Verwendung dieses HOWTOs -\end_layout - -\begin_layout Subsection -Persönliche Anforderungen -\end_layout - -\begin_layout Subsubsection -Erfahrung mit Unix Tools -\end_layout - -\begin_layout Standard -Sie sollten mit den gängigsten Unix Tools wie -\emph on - grep -\emph default -, -\emph on -awk -\emph default -, -\emph on -find -\emph default -, etc. - und deren Kommandozeilen-Optionen vertraut sein. -\end_layout - -\begin_layout Subsubsection -Erfahrung mit Netzwerktheorie -\end_layout - -\begin_layout Standard -Sie sollten das Schichtmodell und die einzelnen Schichten, Protokolle, Adressart -en, Kabelsorten, Stecker etc. - kennen. - Wenn das Neuland für Sie sein sollte, finden Sie hier einen guten Ausgangspunkt -: -\begin_inset CommandInset href -LatexCommand href -name "http://www.rigacci.org/docs/biblio/online/intro_to_networking/book1.htm" -target "http://www.rigacci.org/docs/biblio/online/intro_to_networking/book1.htm" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Erfahrung mit der Konfiguration von IPv4 Netzen -\end_layout - -\begin_layout Standard -Sie sollten definitiv Erfahrung mit der Konfiguration von IPv4 Netzwerken - haben, andernfalls werden Sie dem Text nur schwer folgen können. -\end_layout - -\begin_layout Subsubsection -Erfahrung mit dem Domain Name System (DNS) -\end_layout - -\begin_layout Standard -Sie sollten ebenfalls das Domain Name System (DNS) verstehen und damit umgehen - können. -\end_layout - -\begin_layout Subsubsection -Routine im Umgang mit Strategien zur Netzwerk-Fehlersuche -\end_layout - -\begin_layout Standard -Sie sollten zumindest mit tcpdump umgehen und den Output des Programms interpret -ieren können. - Andernfalls wird die Netzwerk-Fehlersuche für Sie schwierig. -\end_layout - -\begin_layout Subsection -Linux kompatible Hardware -\end_layout - -\begin_layout Standard -Sicherlich wollen Sie mit realer Hardware experimentieren und nicht darüber - an dieser Stelle lesen und an der einen oder anderen Stelle einschlummern. - ;-7) -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-basics" - -\end_inset - -Grundlagen -\end_layout - -\begin_layout Section -Was ist IPv6? -\end_layout - -\begin_layout Standard -IPv6 ist ein neues Schicht 3 Vermittlungsprotokoll -\color none -und es wird IPv4 (auch als IP bekannt) ablösen. - IPv4 wurde vor langer Zeit entworfen ( -\begin_inset CommandInset href -LatexCommand href -name "RFC 760 / Internet Protocol" -target "http://www.faqs.org/rfcs/rfc760.html" - -\end_inset - - vom Januar 1980). - Seitdem wurden viele Adressen vergeben und Erweiterungen angeregt. - Die aktuelle RFC ist -\lang english - -\begin_inset CommandInset href -LatexCommand href -name "RFC 2460 / Internet Protocol Version 6 Specification" -target "http://www.faqs.org/rfcs/rfc2460.html" - -\end_inset - - -\lang ngerman -. - Hauptänderungen in IPv6 sind das neue Design des Headers sowie die Erweiterung - der Adresslänge von 32 bits auf 128 bits. - Die Schicht 3 ist für den Transport der Pakete von Endpunkt-zu-Endpunkt - mittels adressbasierten Paket-Routings zuständig, und wie bei IPv4 müssen - bei IPv6 die Adressen (Quell- und Zieladresse) inkludiert sein. -\end_layout - -\begin_layout Standard -Für weitere Informationen zur IPv6 Geschichte siehe die älteren RFCs z.B. - -\begin_inset CommandInset href -LatexCommand href -name "SWITCH IPv6 Pilot / References" -target "http://www.switch.ch/lan/ipv6/references.html" - -\end_inset - -. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "basic-history-IPv6-Linux" - -\end_inset - -Geschichte von IPv6 & Linux -\end_layout - -\begin_layout Standard -Die Jahre 1992, 1993 und 1994 der allgemeinen IPv6 Geschichte können Sie - in folgendem Dokument nachlesen: -\begin_inset CommandInset href -LatexCommand href -name "IPv6 or IPng (IP next generation)" -target "http://www.laynetworks.com/IPv6.htm#CH3" - -\end_inset - -. -\end_layout - -\begin_layout Standard -Zu erledigen: Bessere Chronologie, mehr Inhalt -\end_layout - -\begin_layout Subsection -Anfang -\end_layout - -\begin_layout Standard -Der erste IPv6 Netzwerk Code wurde dem Linux Kernel 2.1.8 im November 1996 - durch Pedro Roque hinzugefügt. - Er basierte auf dem BSD API: -\end_layout - -\begin_layout Code - -diff -u --recursive --new-file v2.1.7/linux/include/linux/in6.h -\end_layout - -\begin_layout Code - -¬ linux/include/linux/in6.h -\end_layout - -\begin_layout Code - ---- v2.1.7/linux/include/linux/in6.h Thu Jan 1 02:00:00 1970 -\end_layout - -\begin_layout Code - -+++ linux/include/linux/in6.h Sun Nov 3 11:04:42 1996 -\end_layout - -\begin_layout Code - -@@ -0,0 +1,99 @@ -\end_layout - -\begin_layout Code - -+/* -\end_layout - -\begin_layout Code - -+ * Types and definitions for AF_INET6 -\end_layout - -\begin_layout Code - -+ * Linux INET6 implementation -\end_layout - -\begin_layout Code - -+ * + * Authors: -\end_layout - -\begin_layout Code - -+ * Pedro Roque <******> -\end_layout - -\begin_layout Code - -+ * -\end_layout - -\begin_layout Code - -+ * Source: -\end_layout - -\begin_layout Code - -+ * IPv6 Program Interfaces for BSD Systems -\end_layout - -\begin_layout Code - -+ * -\end_layout - -\begin_layout Standard -Diese Zeilen entstammen dem patch-2.1.8 (die E-Mail-Adresse wurde hier beim - Copy & Paste absichtlich gelöscht). -\end_layout - -\begin_layout Subsection -Übergangszeit -\end_layout - -\begin_layout Standard -Aufgrund fehlender Arbeitskraft konnte die IPv6-Kernel-Implementierung nicht - mit den Drafts oder neu freigegebenen RFCs Schritt halten. - Im Oktober 2000 wurde in Japan das -\begin_inset CommandInset href -LatexCommand href -name "USAGI" -target "http://www.linux-ipv6.org/" - -\end_inset - - Projekt gestartet. - Das Ziel war, die fehlende bzw. - bereits veraltete IPv6 Funktionalität in Linux zu implementieren. - Dabei richtete man sich nach der aktuellen FreeBSD Implementierung von - IPv6, die durch das -\begin_inset CommandInset href -LatexCommand href -name "KAME project" -target "http://www.kame.net/" - -\end_inset - - umgesetzt wurde. - Von Zeit zu Zeit wurden im Vergleich zu den aktuellen Standard Linux-Kernel-Que -llen ein Auszug erstellt. - -\end_layout - -\begin_layout Standard - -\lang english -Bis zum Start der Entwicklungs-Kernel Serie 2.5.x, der -\begin_inset CommandInset href -LatexCommand href -name "USAGI" -target "http://www.linux-ipv6.org/" - -\end_inset - - Patch war so groß, das er von den Linux-Netzwerkcode-Maintainers nicht - komplett für die Einbindung in die Produktions-Kernel Serie 2.4.x eingebunden - werden konnte. -\end_layout - -\begin_layout Standard - -\lang english -Während der Entwicklung in der Serie 2.5.x hat -\begin_inset CommandInset href -LatexCommand href -name "USAGI" -target "http://www.linux-ipv6.org/" - -\end_inset - - versucht, so viel wie möglich ihrer Erweiterungen darin zu integrieren. -\end_layout - -\begin_layout Subsection -Heute -\end_layout - -\begin_layout Standard - -\lang english -Viele der von -\begin_inset CommandInset href -LatexCommand href -name "USAGI" -target "http://www.linux-ipv6.org/" - -\end_inset - - und anderen lang entwickelten IPv6-bezogenen Patches sind bereits in der - Vanilla Kernel Serie 2.6.x integriert. -\end_layout - -\begin_layout Subsection -Zukunft -\end_layout - -\begin_layout Standard - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "USAGI" -target "http://www.linux-ipv6.org/" - -\end_inset - - und andere arbeiten weiterhin an der Implementierung von neuen Features - wie Mobility und anderen. - Von Zeit zu Zeit werden neue Erweiterungs-Patches veröffentlicht, wie auch - die Integration in die Vanilla Kernel Serie 2.6.x vorangetrieben. -\end_layout - -\begin_layout Section -Wie sehen IPv6 Adressen aus? -\end_layout - -\begin_layout Standard -\align left -Wie gesagt, IPv6 Adressen sind 128 bit lang. - Diese bit-Anzahl kann sehr hohe dezimale Zahlen mit bis zu 39 Ziffern ergeben: -\end_layout - -\begin_layout Code - -2^128-1: 340282366920938463463374607431768211455 -\end_layout - -\begin_layout Standard -\align left -Solche Zahlen sind nicht wirklich Adressen, die auswendig gelernt werden - können. - Die IPv6 Adressdarstellung ist bitweise orientiert (wie bei IPv4, aber - das wird nicht oft bedacht). - Eine bessere Schreibweise ist deshalb die hexadezimale Darstellung. - Dabei werden 4 bits (auch -\begin_inset Quotes srd -\end_inset - -nibble -\begin_inset Quotes srd -\end_inset - - genannt) durch die Zeichen 0-9 und a-f (10-15) dargestellt, wodurch die - Länge auf 32 Zeichen reduziert wird. -\end_layout - -\begin_layout Code - -2^128-1: 0xffffffffffffffffffffffffffffffff -\end_layout - -\begin_layout Standard -\align left -Diese Darstellung ist ebenfalls nicht sehr angenehm (mögliche Verwechslung - oder Verlust einzelner hexadezimaler Ziffern), so dass die IPv6 Designer - das hexadezimales Format mit einem Doppelpunkt als Trennzeichen nach jedem - 16 bit Block erweiterten. - Ferner wird das führende -\begin_inset Quotes srd -\end_inset - -0x -\begin_inset Quotes srd -\end_inset - - (ein in Programmiersprachen verwendetes Identifizierungsmerkmal für hexadezimal -e Werte) entfernt: -\end_layout - -\begin_layout Code - -2^128-1: ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff -\end_layout - -\begin_layout Standard -\align left -Eine gültige Adresse (s.u. - Adress-Typen) ist z.B.: -\end_layout - -\begin_layout Code - -2001:0db8:0100:f101:0210:a4ff:fee3:9566 -\end_layout - -\begin_layout Standard -\align left -Der Vereinfachung halber können führende Nullen jedes 16 bit-Blocks weggelassen - werden: -\end_layout - -\begin_layout Code - -2001:0db8:0100:f101:0210:a4ff:fee3:9566 -> -\end_layout - -\begin_layout Code - -¬ 2001:0db8:100:f101:210:a4ff:fee3:9566 -\end_layout - -\begin_layout Standard -Eine Sequenz von 16 bit-Blöcken, die nur Nullen enthaltet, kann durch ein - -\begin_inset Quotes eld -\end_inset - - -\family typewriter -:: -\family default - -\begin_inset Quotes eld -\end_inset - - ersetzt werden. - Diese Komprimierung kann aber nicht öfters als einmal durchgeführt werden -\end_layout - -\begin_layout Code - -2001:0db8:100:f101:0:0:0:1 -> 2001:0db8:100:f101::1 -\end_layout - -\begin_layout Standard -\align left -Die höchstmögliche Reduktion sieht man bei der IPv6 Localhost Adresse: -\end_layout - -\begin_layout Code - -0000:0000:0000:0000:0000:0000:0000:0001 -> ::1 -\end_layout - -\begin_layout Standard -Es gibt auch eine so genannte -\emph on -kompakte -\emph default - Darstellung (base 85 codiert) -\begin_inset CommandInset href -LatexCommand href -name "RFC 1924 / A Compact Representation of IPv6 Addresses" -target "http://www.faqs.org/rfcs/rfc1924.html" - -\end_inset - - (publiziert am 1. - April 1996). - Diese Notation wurde allerdings nie in der Praxis gesehen und ist wahrscheinlic -h ein Aprilscherz. - Ein Beispiel: -\end_layout - -\begin_layout Code - -# ipv6calc --addr_to_base85 2001:0db8:0100:f101:0210:a4ff:fee3:9566 -\end_layout - -\begin_layout Code - -Itu&-ZQ82s>J%s99FJXT -\end_layout - -\begin_layout Quotation -Info: -\emph on -ipv6calc -\emph default - ist ein IPv6 Adressen-Format-Umrechner und Konvertierungsprogramm und ist - hier zu finden: -\begin_inset CommandInset href -LatexCommand href -name "ipv6calc homepage" -target "http://www.deepspace6.net/projects/ipv6calc.html" - -\end_inset - - ( -\begin_inset CommandInset href -LatexCommand href -name "Mirror" -target "http://mirrors.bieringer.de/www.deepspace6.net/projects/ipv6calc.html" - -\end_inset - -) -\end_layout - -\begin_layout Section -FAQ (Grundlagen) -\end_layout - -\begin_layout Subsection -Warum wird der Nachfolger von IPv4 nun IPv6 und nicht IPv5 genannt? -\end_layout - -\begin_layout Standard -\align left -In jedem IP-Header werden die ersten 4 Bits für die Protokollversion reserviert. - So sind theoretisch die Protokollnummern 0 bis 15 möglich: -\end_layout - -\begin_layout Itemize -\align left -4: Wird schon für IPv4 verwendet -\end_layout - -\begin_layout Itemize -\align left -5: Ist für das Stream Protocol (STP, -\begin_inset CommandInset href -LatexCommand href -name "RFC 1819 / Internet Stream Protocol Version 2" -target "http://www.faqs.org/rfcs/rfc1819.html" - -\end_inset - -) reserviert (das aber nie den Weg in die Öffentlichkeit fand) -\end_layout - -\begin_layout Standard -\align left -So war die nächste freie Zahl 6. - IPv6 war geboren! -\end_layout - -\begin_layout Subsection -IPv6 Adressen: Warum ist die Anzahl der Bits so groß? -\end_layout - -\begin_layout Standard -Bei der Entwicklung von IPv4 dachte man, dass 32 Bits für die Welt ausreichend - wären. - Blickt man zurück, so waren bis heute 32 bits ausreichend. - Vielleicht ist dies auch noch für ein paar Jahre so. - Jedoch werden 32 bits nicht ausreichen, um in der Zukunft jedes Netzwerkgerät - mit einer globalen Adresse ausstatten zu können. - Denken Sie an Mobiltelefone, Autos (mit elektronischen Geräten an einem - CAN Bus), Toaster, Kühlschränken, Lichtschalter usw. -\end_layout - -\begin_layout Standard -Die IPv6 Designer haben 128 Bit gewählt, 4-mal mehr als im heutigen IPv4. -\end_layout - -\begin_layout Standard -Aber die benutzbare Größe ist kleiner als es erscheinen mag, da in dem gegenwärt -ig definierten Adress-Schema 64 Bits für die Schnittstellen-Identifizierung - verwendet werden. - Die zweiten 64 Bit werden für das Routing verwendet. - Die derzeitigen Aggregation-Levels (= Größe der zugeteilten IP-Blöcke) - vorausgesetzt (/48, /32,...), ist eine Verknappung der Adressen weiterhin - denkbar. - Aber mit Sicherheit nicht in naher Zukunft. - -\end_layout - -\begin_layout Standard -Weitere Informationen finden Sie unter -\begin_inset CommandInset href -LatexCommand href -name "RFC 1715 / The H Ratio for Address Assignment Efficiency" -target "http://www.faqs.org/rfcs/rfc1715.html" - -\end_inset - - und -\begin_inset CommandInset href -LatexCommand href -name "RFC 3194 / The Host-Density Ratio for Address Assignment Efficiency" -target "http://www.faqs.org/rfcs/rfc3194.html" - -\end_inset - -. -\end_layout - -\begin_layout Subsection -IPv6 Adressen: Warum ist die Bit-Anzahl bei einem neuen Design so klein? -\end_layout - -\begin_layout Standard -\align left -Es gibt (wahrscheinlich) eine Gruppe (bekannt ist nur Jim Fleming...) von Personen - am Internet, die über IPv8 und IPv16 nachdenken. - Für diese Designs gibt es aber keine hohe Akzeptanz und auch keine Kernel-Imple -mentierungen. - 128 bits sind die beste Wahl bezogen auf Header-Overhead und dem Datentransport. - Denken Sie an die minimalste Maximum Transfer Unit (MTU) in IPv4 (575 octets) - und in IPv6 (1280 octets), die Header-Länge in IPv4 (20 octets Minimum, - kann bis zu 60 octets mit IPv4 Optionen ansteigen) und in IPv6 sind es - 40 octets (fixer Wert). - Dies ist 3.4 % der minimalen MTU in IPv4 und 3.1 % der minimalen MTU in IPv6. - Dies bedeutet, dass der Overhead beim Header fast identisch ist. - Mehr bits für die Adressierung würden größere Header und deshalb mehr Overhead - erfordern. - Bedenken Sie auch die maximale MTU von 1500 octets (in speziellen Fällen - bei Jumbo-Paketen bis zu 9k octets) bei normalen Verbindungen (z.B. - Ethernet). - Letztlich wäre es kein korrektes Design, wenn 10 % oder 20 % der transportierte -n Daten in einem Schicht 3-Paket für Adressen und nicht für die -\begin_inset Quotes srd -\end_inset - -Nutzlast -\begin_inset Quotes srd -\end_inset - - benötigt würden. -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-addresstypes" - -\end_inset - -Adress-Typen -\end_layout - -\begin_layout Standard -Wie bei IPv4 können IPv6-Adressen mittels Subnetzmasken (subnet masks) in - einen Netz- und einen Host-Teil unterteilt werden. -\end_layout - -\begin_layout Standard -Bei IPv4 hat sich gezeigt, dass es manchmal von Nutzen wäre, einem Interface - mehr als eine IP-Adresse zuweisen zu können, je nach Bedarf und Zweck (aliases, - multicast etc.). - Um in Zukunft flexibler bleiben zu können, geht man bei IPv6 weiter und - erlaubt pro Interface mehr als eine zugewiesene IP-Adresse. - Derzeit sind durch die RFCs kein Limit gesetzt, wohl aber in der Implementierun -g des IPv6 Stacks (um DoS Attacken vorzubeugen). -\end_layout - -\begin_layout Standard -Neben der großen Bit-Anzahl für Adressen definiert IPv6 basierend auf einigen - vorangestellten Bits verschiedene Adress-Typen. - Diese werden hoffentlich in der Zukunft niemals aufgehoben (zum Unterschied - zu IPv4 heute und die Entwicklung der class A, B und C Netze). -\end_layout - -\begin_layout Standard -Zur Unterstützung einer automatischen Konfiguration wird die Bitanzahl in - einen Netzwerk-Teil (vordere 64 Bits) und einen Hostteil (hintere 64 Bits). - -\end_layout - -\begin_layout Section -Adressen ohne speziellen Präfix -\end_layout - -\begin_layout Subsection -Localhost Adresse -\end_layout - -\begin_layout Standard -Dies ist eine spezielle Adresse für das Loopback Interface, vergleichbar - zur -\begin_inset Quotes sld -\end_inset - -127.0.0.1 -\begin_inset Quotes srd -\end_inset - - bei IPv4. - Bei IPv6 lautet die localhost Adresse: -\end_layout - -\begin_layout Code - -0000:0000:0000:0000:0000:0000:0000:0001 -\end_layout - -\begin_layout Standard -bzw. - komprimiert: -\end_layout - -\begin_layout Code - -::1 -\end_layout - -\begin_layout Standard -\align left -Pakete mit dieser Quell- bzw. - Ziel-Adresse sollten niemals den sendenden Host verlassen. -\end_layout - -\begin_layout Subsection -Unspezifische Adresse -\end_layout - -\begin_layout Standard -Dies ist eine spezielle Adresse vergleichbar mit -\begin_inset Quotes sld -\end_inset - -any -\begin_inset Quotes srd -\end_inset - - oder -\begin_inset Quotes sld -\end_inset - -0.0.0.0 -\begin_inset Quotes srd -\end_inset - - bei IPv4. - In IPv6 lautet sie: -\end_layout - -\begin_layout Code - -0000:0000:0000:0000:0000:0000:0000:0000 -\end_layout - -\begin_layout Standard -oder: -\end_layout - -\begin_layout Code - -:: -\end_layout - -\begin_layout Standard -Diese Adresse wird meistens in Routing-Tabellen und beim -\begin_inset Quotes sld -\end_inset - -socket binding -\begin_inset Quotes srd -\end_inset - - (zu jeder IPv6 Adresse) angewendet bzw. - gesehen. -\end_layout - -\begin_layout Standard -Beachten: Die Unspezifizierte Adresse kann nicht als Ziel-Adresse verwendet - werden. -\end_layout - -\begin_layout Subsection -IPv6 Adressen mit eingebetteter IPv4 Adresse -\end_layout - -\begin_layout Standard -Es gibt zwei Adressen-Typen, die IPv4 Adressen enthalten können. -\end_layout - -\begin_layout Subsubsection -IPv4 Adressen in IPv6 Format -\end_layout - -\begin_layout Standard -IPv4-only IPv6-kompatible Adressen kommen manchmal bei IPv6 kompatiblen - Daemon zur Anwendung, die allerdings ausschließlich an IPv4 Adressen gebunden - sind. -\end_layout - -\begin_layout Standard -Diese Adressen sind mit einer speziellen Präfixlänge von 96 definiert (a.b.c.d. - ist die IPv4 Adresse): -\end_layout - -\begin_layout Code - -0:0:0:0:0:ffff:a.b.c.d/96 -\end_layout - -\begin_layout Standard -oder in komprimiertem Format: -\end_layout - -\begin_layout Code - -::ffff:a.b.c.d/96 -\end_layout - -\begin_layout Standard -Die IPv4 Adresse 1.2.3.4. - z.B. - sieht wie folgt aus: -\end_layout - -\begin_layout Code - -::ffff:1.2.3.4 -\end_layout - -\begin_layout Subsubsection -IPv4 kompatible IPv6 Adressen -\end_layout - -\begin_layout Standard -Dieser Adress-Typ wurde für das automatische Tunneln ( -\begin_inset CommandInset href -LatexCommand href -name "RFC 2893 / Transition Mechanisms for IPv6 Hosts and Routers" -target "http://www.faqs.org/rfcs/rfc2893.html" - -\end_inset - -) verwendet, welches aber durch das -\begin_inset CommandInset ref -LatexCommand ref -name "6to4 tunneling" -reference "tunneling-6to4" - -\end_inset - - ersetzt wurde. -\end_layout - -\begin_layout Code - -0:0:0:0:0:0:a.b.c.d/96 -\end_layout - -\begin_layout Standard -oder in komprimierter Form: -\end_layout - -\begin_layout Code - -::a.b.c.d/96 -\end_layout - -\begin_layout Section -Netzteil der Adresse (Präfix) -\end_layout - -\begin_layout Standard -Es wurden einige Adress-Typen definiert und zugleich blieb für zukünftige - Anforderungen ausreichend Raum für weitere Definitionen. - In -\lang english - -\begin_inset CommandInset href -LatexCommand href -name "RFC 4291 / IP Version 6 Addressing Architecture" -target "http://www.faqs.org/rfcs/rfc4291.html" - -\end_inset - - -\lang ngerman - wird das aktuelle Adress-Schema definiert. -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_layout Standard -\align left -Lassen Sie uns nun einen Blick auf die verschiedenen Präfixe (und somit - auf die Adress-Arten) werfen:: -\end_layout - -\begin_layout Subsection -Link-lokaler Adress-Typ -\end_layout - -\begin_layout Standard -\align left -Es handelt sich um spezielle Adressen, die ausschließlich auf einem Link - eines Interfaces gültig sind. - Wird diese Adresse als Zieladresse verwendet, so kann das Paket niemals - einen Router passieren. - Die Adresse wird bei der Link-Kommunikation eingesetzt, z.B.: -\end_layout - -\begin_layout Itemize -\align left -Ist noch jemand anderer auf diesem Link? -\end_layout - -\begin_layout Itemize -\align left -Ist jemand mit einer speziellen Adresse hier (z.B. - Suche nach einem Router)? -\end_layout - -\begin_layout Standard -Die Adresse beginnt mit (wobei -\emph on - -\begin_inset Quotes sld -\end_inset - -x -\begin_inset Quotes srd -\end_inset - - -\emph default - für ein hexadezimales Zeichen steht, im Normalfall -\emph on - -\begin_inset Quotes sld -\end_inset - -0 -\emph default - -\begin_inset Quotes srd -\end_inset - -) -\end_layout - -\begin_layout Code - -fe8x: <- zurzeit als einziger in Benutzung -\end_layout - -\begin_layout Code - -fe9x: -\end_layout - -\begin_layout Code - -feax: -\end_layout - -\begin_layout Code - -febx: -\end_layout - -\begin_layout Standard -Eine Adresse mit diesem Präfix gibt es an jedem IPv6 fähigen Interface nach - einer stateless automatischen Konfiguration (dies ist der Regelfall). -\end_layout - -\begin_layout Subsection -Site-lokaler Adress-Typ -\end_layout - -\begin_layout Standard -\align left -Diese Adressen sind vergleichbar zu den -\begin_inset CommandInset href -LatexCommand href -name "RFC 1918 / Address Allocation for Private Internets" -target "http://www.faqs.org/rfcs/rfc1918.html" - -\end_inset - - im heutigen IPv4. - Eine Neuerung und Vorteil hierbei ist, vergleichbar zum 10.0.0.0/8 im IPv4, - die Nutzbarkeit von 16 bits bzw. - ein Maximum von 65536 Subnetzen. -\end_layout - -\begin_layout Standard -Ein weiterer Vorteil: Da man bei IPv6 mehr als eine Adresse an ein Interface - binden kann, ist auch die Zuweisung einer site-local Adresse zusätzlich - zu einer globalen Adresse möglich. -\end_layout - -\begin_layout Standard -Die Adresse beginnt mit: -\end_layout - -\begin_layout Code - -fecx: <- meistens genutzt. -\end_layout - -\begin_layout Code - -fedx: -\end_layout - -\begin_layout Code - -feex: -\end_layout - -\begin_layout Code - -fefx: -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Standard -( -\emph on - -\begin_inset Quotes sld -\end_inset - -x -\begin_inset Quotes srd -\end_inset - - -\emph default - ist ein hexadezimales Zeichen, normalerweise -\emph on - -\begin_inset Quotes sld -\end_inset - -0 -\emph default - -\begin_inset Quotes srd -\end_inset - -) -\end_layout - -\begin_layout Standard -Dieser Adresstyp ist nun abgekündigt -\lang english - -\begin_inset CommandInset href -LatexCommand href -name "RFC 3879 / Deprecating Site Local Addresses" -target "http://www.faqs.org/rfcs/rfc3879.html" - -\end_inset - - -\lang ngerman - und sollte nicht mehr verwendet werden. - -\lang english - Für Tests im Labor sind solche Adressen meineserachtens aber immer noch - eine gute Wahl. -\end_layout - -\begin_layout Subsection - -\lang english -Unique Local IPv6 Unicast Adressen -\end_layout - -\begin_layout Standard - -\lang english -Weil die schon früh definierten site-local Adressen nicht eindeutig sind, - kann dies zu großen Problemen führen, wenn z.B. - einst unabhängige Netzwerke später zusammengeschlossen werden (Überlappung - von Subnetzen). - Aufgrund dessen und anderer Gründe wurde ein neuer Adresstyp definiert, - genant -\begin_inset CommandInset href -LatexCommand href -name "RFC 4193 / Unique Local IPv6 Unicast Addresses" -target "http://www.faqs.org/rfcs/rfc4193.html" - -\end_inset - -. - -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_layout Standard -\align left -Die Adresse beginnt mit: -\end_layout - -\begin_layout Code - -fcxx: -\end_layout - -\begin_layout Code - -fdxx: <- zurzeit als einziger in Benutzung -\end_layout - -\begin_layout Standard -\align left - -\lang english -Ein Teil des Präfix (40 Bits) werden pseudozufällig generiert. - Es ist sehr unwahrscheinlich, daß zwei generierte Präfixe identisch sind. -\end_layout - -\begin_layout Standard - -\lang english -Ein Beispiel für einen Präfix (generiert mit Hilfe des web-basierten Werkzeugs: - -\begin_inset CommandInset href -LatexCommand href -name "Goebel Consult / createLULA" -target "http://www.goebel-consult.de/ipv6/createLULA" - -\end_inset - -): -\end_layout - -\begin_layout Code - -fd0f:8b72:ac90::/48 -\end_layout - -\begin_layout Subsection -Globaler Adress-Typ ("Aggregatable global unicast") -\end_layout - -\begin_layout Standard -Heute gibt es ist per Definition eine globale Adress-Art (Das erste Design, - ''Provider based'' genannt, wurde bereits vor einigen Jahren wieder aufgegeben - -\begin_inset CommandInset href -LatexCommand href -name "RFC 1884 / IP Version 6 Addressing Architecture [obsolete]" -target "http://www.faqs.org/rfcs/rfc1884.html" - -\end_inset - -. - Einige Überbleibsel hiervon sind in älteren Linux Kernelquellen noch zu - finden. -\end_layout - -\begin_layout Standard -Die Adresse beginnt mit (x sind hexadezimale Zeichen) -\end_layout - -\begin_layout Code - -2xxx: -\end_layout - -\begin_layout Code - -3xxx: -\end_layout - -\begin_layout Standard -Hinweis: Der Zusatz -\begin_inset Quotes sld -\end_inset - -aggregatable -\begin_inset Quotes srd -\end_inset - - im Namen wird in aktuellen Drafts abgelegt. - -\begin_inset Newline newline -\end_inset - -Es sind weitere Subarten definiert: -\end_layout - -\begin_layout Subsubsection -6bone Test-Adressen -\end_layout - -\begin_layout Standard -\align left -Diese globalen Adressen waren die Ersten definierten und auch benutzen Adressen. - Sie alle beginnen mit: -\end_layout - -\begin_layout Code - -3ffe: -\end_layout - -\begin_layout Standard -Beispiel: -\end_layout - -\begin_layout Code - -3ffe:ffff:100:f102::1 -\end_layout - -\begin_layout Standard -Eine spezielle 6bone Test-Adresse, die niemals weltweit einmalig ist, beginnt - mit -\end_layout - -\begin_layout Code - -3ffe:ffff: -\end_layout - -\begin_layout Standard -und wird zumeist in alten Beispielen benutzt, um zu vermeiden, dass Anwender - diese mit Copy & Paste in Ihre Konfigurationen übernehmen können. - Auf diese Weise können Duplikate weltweit einmaliger Adressen aus Versehen - bzw. - Unachtsamkeit vermieden werden. - Es würde für den Original-Host ernste Probleme bedeuten (z.B. - Antwortpakete für niemals gesendete Anfragen bekommen...). - -\lang english - -\begin_inset Newline newline -\end_inset - -Aufgrund dessen, daß IPv6 nun produktiv ist, wird dieser Präfix nicht mehr - länger delegiert und nach dem 6.6.2006 vom Routing ausgenommen (mehr unter - -\begin_inset CommandInset href -LatexCommand href -name "RFC 3701 / 6bone Phaseout" -target "http://www.faqs.org/rfcs/rfc3701.html" - -\end_inset - - ). -\end_layout - -\begin_layout Subsubsection -6to4 Adressen -\end_layout - -\begin_layout Standard -\align left -Diese Adressen werden für einen speziellen Tunnelmechanismus verwendet [ -\begin_inset CommandInset href -LatexCommand href -name "RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds" -target "http://www.faqs.org/rfcs/rfc3056.html" - -\end_inset - - und -\begin_inset CommandInset href -LatexCommand href -name "RFC 2893 / Transition Mechanisms for IPv6 Hosts and Routers" -target "http://www.faqs.org/rfcs/rfc2893.html" - -\end_inset - -]. - Sie kodieren eine gegebene IPv4 Adresse, ein eventuelles Subnetz und beginnen - mit -\end_layout - -\begin_layout Code - -2002: -\end_layout - -\begin_layout Standard -z.B. - wird 192.168.1.1/5 repräsentiert durch: -\end_layout - -\begin_layout Code - -2002:c0a8:0101:5::1 -\end_layout - -\begin_layout Standard -Ein kleines Shell-Kommando kann aus einer IPv4 eine 6to4 Adresse erstellen: -\end_layout - -\begin_layout Code - -ipv4="1.2.3.4"; sla="5"; printf "2002:%02x%02x:%02x%02x:%04x::1" `echo $ipv4 -\end_layout - -\begin_layout Code - -¬ | tr "." " "` $sla -\end_layout - -\begin_layout Standard -Siehe auch -\begin_inset CommandInset ref -LatexCommand ref -name "tunneling using 6to4" -reference "tunneling-6to4" - -\end_inset - - und -\begin_inset CommandInset ref -LatexCommand ref -name "information about 6to4 relay routers" -reference "information-joinipv6-6to4-tunneling" - -\end_inset - -. -\end_layout - -\begin_layout Subsubsection -Durch einen Provider zugewiesene Adressen für ein hierarchisches Routing -\end_layout - -\begin_layout Standard -Diese Adressen werden an Internet Service Provider (ISP) delegiert und beginnen - mit: -\end_layout - -\begin_layout Code - -2001: -\end_layout - -\begin_layout Standard -Präfixe für große ISPs (mit eigenem Backbone) werden durch -\begin_inset CommandInset ref -LatexCommand ref -name "local registries" -reference "information-majorregionregistries" - -\end_inset - - vergeben. - Zurzeit wird ein Präfix mit der Länge 32 zugeteilt. -\end_layout - -\begin_layout Standard -Grosse ISPs delegieren ihrerseits an kleinere ISPs ein Präfix mit der Länge - 48. -\end_layout - -\begin_layout Subsubsection - -\lang english -Für Beispiele und Dokumentationen reservierte Adressen -\end_layout - -\begin_layout Standard - -\lang english -Momentan sind zwei Adressbereiche für Beispiele und Dokumentationen -\begin_inset CommandInset href -LatexCommand href -name "RFC 3849 / IPv6 Address Prefix Reserved for Documentation" -target "http://www.faqs.org/rfcs/rfc3849.html" - -\end_inset - - reserviert: -\end_layout - -\begin_layout Code - -3ffe:ffff::/32 -\end_layout - -\begin_layout Code - -2001:0DB8::/32 EXAMPLENET-WF -\end_layout - -\begin_layout Standard - -\lang english -Diese Adressbereiche sollten nicht geroutet werden und am Übergangsrouter - zum Internet (basierend auf Absendeadressen) gefiltert werden. -\end_layout - -\begin_layout Subsection -Multicast-Addressen -\end_layout - -\begin_layout Standard -\align left -Multicast-Adressen werden für entsprechende Dienste verwendet. -\end_layout - -\begin_layout Standard -Sie beginnen immer mit (xx ist hierbei der Wert der Reichweite) -\end_layout - -\begin_layout Code - -ffxy: -\end_layout - -\begin_layout Standard -Die Adressen werden in Reichweiten und Typen unterteilt: -\end_layout - -\begin_layout Subsubsection -Multicast-Bereiche -\end_layout - -\begin_layout Standard -Die Multicast Reichweite ist ein Parameter, mit dem die maximale Distanz - angegeben werden kann, die ein Multicast Paket sich von der versendenden - Einheit entfernen kann. -\end_layout - -\begin_layout Standard -Zurzeit sind folgende Regionen (reichweiten) definiert: -\end_layout - -\begin_layout Itemize -ffx1: Node-lokal, Pakete verlassen niemals den Knoten -\end_layout - -\begin_layout Itemize -ffx2: Link-lokal, Pakete werden niemals von Routers weitergeleitet, der - angegebene Link wird nie verlassen. -\end_layout - -\begin_layout Itemize -ffx5: Site-lokal, Pakete verlassen niemals den Standort (Site) -\end_layout - -\begin_layout Itemize -ffx8: organisationsweit, Pakete verlassen niemals eine Organisation (nicht - einfach zu implementieren, dies muss durch das Routing Protokoll abgedeckt - werden) -\end_layout - -\begin_layout Itemize -ffxe: Globale Reichweite -\end_layout - -\begin_layout Itemize -Sonstige sind reserviert -\end_layout - -\begin_layout Subsubsection -Multicast-Typen -\end_layout - -\begin_layout Standard -Es sind bereits viele Typen definiert bzw. - reserviert (siehe -\lang english - -\begin_inset CommandInset href -LatexCommand href -name "RFC 4291 / IP Version 6 Addressing Architecture" -target "http://www.faqs.org/rfcs/rfc4291.html" - -\end_inset - - -\lang ngerman - für weitere Details), einige Beispiele: -\end_layout - -\begin_layout Itemize -All Nodes Adresse: ID = 1h, alle Hosts am lokalen Node (ff01:0:0:0:0:0:0:1) - oder am angeschlossenen Link (ff02:0:0:0:0:0:0:1) werden adressiert. -\end_layout - -\begin_layout Itemize -All Routers Adresse: ID = 2h, alle Router am lokalen Node (ff01:0:0:0:0:0:0:2), - am angeschlossenen Link (ff02:0:0:0:0:0:0:2) oder am lokalen Standort werden - adressiert. -\end_layout - -\begin_layout Subsubsection -Erforderliche node link-local Multicast Adresse -\end_layout - -\begin_layout Standard -Diese spezielle Multicast Adresse wird als Zieladresse bei der Erkundung - des Nahbereichs verwendet, da es ARP bei IPv6 im Gegensatz zu IPv4 nicht - mehr gibt. -\end_layout - -\begin_layout Standard -Ein Beispiel für diese Adresse könnte sein: -\end_layout - -\begin_layout Code - -ff02::1:ff00:1234 -\end_layout - -\begin_layout Standard -Das benutzte Präfix zeigt, dass es sich um eine link-lokale Multicast Adresse - handelt. - Dass Suffix wird aus der Zieladresse erstellt. - In diesem Beispiel soll ein Paket zur Adresse -\begin_inset Quotes eld -\end_inset - -fe80::1234 -\begin_inset Quotes erd -\end_inset - - gesendet werden, aber die Netzwerk-Schicht hat keine Kenntnis der aktuellen - Schicht 2 MAC Adresse. - Die oberen 104 bits werde mit -\begin_inset Quotes eld -\end_inset - -ff02:0:0:0:01:ff00::/104 -\begin_inset Quotes erd -\end_inset - - ersetzt und die unteres 24 bits bleiben unverändert. - Diese Adresse wird nun -\begin_inset Quotes srd -\end_inset - -am Link -\begin_inset Quotes srd -\end_inset - - verwendet, um den entsprechenden Node zu finden, der wiederum seine Schicht - 2 MAC Adresse als Antwort zurücksendet. -\end_layout - -\begin_layout Subsection -Anycast-Adressen -\end_layout - -\begin_layout Standard -Anycast Adressen sind spezielle Adressen und werden verwendet, um besondere - Bereiche wie den nächstgelegenen DNS-Server, den nächstliegenden DHCP Server - und vergleichbare dynamische Gruppen abzudecken. - Die Adressen werden dem Pool des Unicast Adressraums (global-aggregierbar - oder Site-lokal zurzeit) entnommen. - Der Anycast-Mechanismus (client view) wird von dynamischen Routing-Protokollen - gehandhabt. -\end_layout - -\begin_layout Standard -Hinweis: Anycast Adressen können nicht als Quelladresse verwendet werden, - sondern ausschließlich als Zieladressen. -\end_layout - -\begin_layout Subsubsection -Subnet-Router Anycast-Adresse -\end_layout - -\begin_layout Standard -Die Subnet-Router Anycast Adresse ist ein einfaches Beispiel für eine Anycast - Adresse. - Angenommen, der Knoten hat folgende global zugewiesene IPv6 Adresse: -\end_layout - -\begin_layout Code - -2001:0db8:100:f101:210:a4ff:fee3:9566/64 <- Node's address -\end_layout - -\begin_layout Standard -Die Subnet-Router Anycast Adresse wird durch komplette Streichung des Suffixes - (die letzten gültigen 64 bits) erstellt: -\end_layout - -\begin_layout Code - -2001:0db8:100:f101::/64 <- subnet-router anycast address -\end_layout - -\begin_layout Section -Adress-Typen (Host-Teil) -\end_layout - -\begin_layout Standard -\align left -In Hinblick auf Auto-Konfigurations- und Mobilitätsfragen wurde entschieden, - die niedrigeren 64 bits als Host-Bestandteil zu nutzen. - Jedes einzelne Subnetz kann deshalb eine große Anzahl an Adressen enthalten. -\end_layout - -\begin_layout Standard -Der Host-Teil kann aus unterschiedlichen Blickwinkeln betrachtet werden: -\end_layout - -\begin_layout Subsection -Automatisch erstellte Adressen (auch unter dem Namen stateless bekannt) -\end_layout - -\begin_layout Standard -Bei der Auto-Konfiguration wird der Hostteil der Adresse durch die Konvertierung - der MAC-Adresse eines Interfaces (falls vorhanden) zu einer einmaligen - IPv6 Adresse (mittels EUI-64 Methode) generiert. - Falls keine MAC-Adresse verfügbar ist (z.B. - bei virtuellen Interfaces), wird anstelle dessen etwas anderes herangezogen - (wie z.B. - die IPv4 Adresse oder die MAC-Adresse eines physikalischen Interfaces). -\end_layout - -\begin_layout Standard - -\lang english -Als Beispiel hat hier ein NIC folgende MAC-Adresse (48 bit): -\end_layout - -\begin_layout Code - -00:10:a4:01:23:45 -\end_layout - -\begin_layout Standard -\align left - -\lang english -Diese wird gemäß dem -\begin_inset CommandInset href -LatexCommand href -name "IEEE-Tutorial EUI-64" -target "http://standards.ieee.org/regauth/oui/tutorials/EUI64.html" - -\end_inset - - Design für EUI-48 Identifiers zum 64 bit Interface Identifier erweitert: -\end_layout - -\begin_layout Code - -0210:a4ff:fe01:2345 -\end_layout - -\begin_layout Standard -\align left - -\lang english -Mit einem gegebenen Präfix wird daraus die schon oben gezeigte IPv6-Adresse: -\end_layout - -\begin_layout Code - -2001:0db8:0100:f101:0210:a4ff:fe01:2345 -\end_layout - -\begin_layout Subsubsection -Datenschutzproblem mit automatisch erstellten Adressen sowie eine Lösung -\end_layout - -\begin_layout Standard -Der "automatisch generierte" Hostteil ist weltweit einmalig (mit Ausnahme, - wenn der Hersteller einer NIC die gleiche MAC-Adresse bei mehr als einer - NIC einsetzt). - Die Client-Verfolgung am Host wird dadurch möglich, solange kein Proxy - verwendet wird. - -\end_layout - -\begin_layout Standard -Dies ist ein bekanntes Problem und eine Lösung wurde dafür definiert: Datenschut -z-Erweiterung, definiert in -\begin_inset CommandInset href -LatexCommand href -name "RFC 3041 / Privacy Extensions for Stateless Address Autoconfiguration in IPv6" -target "http://www.faqs.org/rfcs/rfc3041.html" - -\end_inset - - (es gibt bereits ein neueres Draft: -\lang english - -\begin_inset CommandInset href -LatexCommand href -name "draft-ietf-ipv6-privacy-addrs-v2-*" -target "http://www.ietf.org/ids.by.wg/ipv6.html" - -\end_inset - - -\lang ngerman -). - Es wird von Zeit zu Zeit mittels eines statischen und eines Zufallswertes - ein neues Suffix erstellt. - Hinweis: Dies ist nur für ausgehende Client-Verbindungen sinnvoll und bei - bekannten Servern nicht wirklich sinnvoll. -\end_layout - -\begin_layout Subsection -Manuell festgelegte Adressen -\end_layout - -\begin_layout Standard -Bei Servern ist es wahrscheinlich leichter, sich einfachere Adressen zu - merken. - Dies kann z.B. - mit der Zuweisung einer zusätzlichen IPv6 Adresse an ein Interface geschehen. -\end_layout - -\begin_layout Code - -2001:0db8:100:f101::1 -\end_layout - -\begin_layout Standard -Für das manuelle Suffix, wie -\begin_inset Quotes sld -\end_inset - -::1 -\begin_inset Quotes srd -\end_inset - - im obigen Beispiel, muss das siebte höchstwertige Bit auf 0 gesetzt sein - (das universale/local Bit des automatisch generierten Identifiers). - Es sind auch noch andere (ansonsten nichtausgewählte) Bit-Kombinationen - für Anycast-Adressen reserviert. -\end_layout - -\begin_layout Section -Präfixlängen für das Routing -\end_layout - -\begin_layout Standard -Um eine maximale Reduktion an Routing-Tabellen zu erzielen, war in der frühen - Design-Phase noch ein vollkommen hierarchischer Routing-Ansatz vorgesehen. - Die Überlegungen hinter diesem Ansatz waren die gegenwärtigen IPv4 Routing-Eint -räge in den Haupt-Routern (mit über 400.000 Einträgen im Jahr 2013) sowie - die Reduktion des Speicherbedarfs für die Routing-Tabellen bei Hardware-Routern - (ASIC -\begin_inset Quotes sld -\end_inset - -Application Specified Integrated Circuit -\begin_inset Quotes srd -\end_inset - -, speziell konstuierter Chip) sowie ein daraus resultierender Geschwindigkeitszu -wachs (weniger Einträge ergeben hoffentlich schnellere Abfragen). -\end_layout - -\begin_layout Standard -Heutiger Standpunkt ist, dass das Routing für Netzwerke mit nur einem Service - Provider hauptsächlich mit einem hierarchischen Design realisiert wird. - Eine solche Vorgehensweise ist nicht möglich, wenn mehr als eine ISP-Verbindung - besteht. - Diese Problematik wird unter dem Thema multi-homing diskutiert (Infos zu - multi-homing: -\lang english - -\begin_inset CommandInset href -LatexCommand href -name "drafts-ietf-multi6-*" -target "http://www.ietf.org/ids.by.wg/multi6.html" - -\end_inset - - -\lang ngerman -, -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Multihoming Solutions" -target "http://arneill-py.sacramento.ca.us/ipv6mh/" - -\end_inset - -). -\end_layout - -\begin_layout Subsection -Präfixlängen ("netmasks" genannt) -\end_layout - -\begin_layout Standard -Vergleichbar zu IPv4, handelt es sich hierbei um den routbaren Netzwerkpfad - für das stattfindende Routing. - Da die Standard-Notierung der Netzmaske von 128 bit nicht sehr fein aussieht, - verwenden die Designer das aus IPv4 bekannte Classless Inter Domain Routing - Schema (CIDR, -\begin_inset CommandInset href -LatexCommand href -name "RFC 1519 / Classless Inter-Domain Routing" -target "http://www.faqs.org/rfcs/rfc1519.html" - -\end_inset - -). - Mit Hilfe des CIDR wird die Bitanzahl der IP Adresse festgelegt, welche - für das Routing verwendet werden. - Diese Methode wird auch als "Slash"-Notation genannt. -\end_layout - -\begin_layout Standard -Ein Beispiel: -\end_layout - -\begin_layout Code - -2001:0db8:100:1:2:3:4:5/48 -\end_layout - -\begin_layout Standard -\align left -Diese Notation wird erweitert zu: -\end_layout - -\begin_layout Itemize -Netzwerk: -\end_layout - -\begin_layout Code - -2001:0db8:0100:0000:0000:0000:0000:0000 -\end_layout - -\begin_layout Itemize -Netzmaske: -\end_layout - -\begin_layout Code - -ffff:ffff:ffff:0000:0000:0000:0000:0000 -\end_layout - -\begin_layout Subsection -Zutreffende Routen -\end_layout - -\begin_layout Standard -Im Normalfall (ohne QoS) ergibt eine Suche in der Routing-Tabelle eine Route - mit der signifikantesten Adress-Bit-Anzahl, d.h. - jene Route mit der größten Präfix-Länge wird zuerst herangezogen. -\end_layout - -\begin_layout Standard -Wenn z.B. - eine Routing-Tabelle folgende Einträge zeigt (Liste ist nicht komplett): -\end_layout - -\begin_layout Code - -2001:0db8:100::/48 :: U 1 0 0 sit1 -\end_layout - -\begin_layout Code - -2000::/3 ::192.88.99.1 UG 1 0 0 tun6to4 -\end_layout - -\begin_layout Standard -Die gezeigten Zieladressen der IPv6 Pakete werden über die entsprechenden - Geräte geroutet -\end_layout - -\begin_layout Code - -2001:0db8:100:1:2:3:4:5/48 -> routed through device sit1 -\end_layout - -\begin_layout Code - -2001:0db8:200:1:2:3:4:5/48 -> routed through device tun6to4 -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-systemcheck" - -\end_inset - -IPv6 System-Check -\end_layout - -\begin_layout Standard -\align left -Bevor Sie IPv6 auf einem Linux Host einsetzen können, müssen sie überprüfen, - ob das System IPv6 fähig ist. - Eventuell haben Sie Änderungen vorzunehmen, um IPv6 zu ermöglichen. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "systemcheck-kernel" - -\end_inset - -IPv6 kompatibler Kernel -\end_layout - -\begin_layout Standard -Neuere Linux Distributionen beinhalten bereits einen IPv6-fähigen Kernel. - Die IPv6-Funktionalität wird im Allgemeinen als Modul kompiliert. - Es ist aber durchaus möglich, dass das Modul nicht automatisch beim Start - des Betriebssystems geladen wird. -\end_layout - -\begin_layout Standard - -\series bold -Hinweis: Sie sollten die Kernel Serie 2.2.x nicht mehr verwenden, da die IPv6-Impl -ementierung nicht mehr aktuell ist. - Auch die in der Serie 2.4.x wird nicht mehr weiterentwickelt bzgl. - der Definitionen in den neueren RFCs. - Es wird empfohlen, einen aus der Serie 2.6.x zu verwenden. -\end_layout - -\begin_layout Subsection -Überprüfung der IPv6 Unterstützung im aktuellen Kernel -\end_layout - -\begin_layout Standard -\align left -Um zu überprüfen, ob ihr aktueller Kernel IPv6 unterstützt, sollten sie - einen Blick in ihr /proc-Dateisystem werfen. - Folgende Einträge müssen existieren: -\end_layout - -\begin_layout Code - -/proc/net/if_inet6 -\end_layout - -\begin_layout Standard -\align left -Einen kleinen automatischen Test können Sie wie folgt durchführen: -\end_layout - -\begin_layout Code - -# test -f /proc/net/if_inet6 && echo "Running kernel is IPv6 ready" -\end_layout - -\begin_layout Standard -\align left -Wenn dieser Test negativ verläuft, ist das IPv6 Modul aller Wahrscheinlichkeit - noch nicht geladen. -\end_layout - -\begin_layout Subsection -IPv6 Module laden -\end_layout - -\begin_layout Standard -\align left -Mit folgenden Befehl können Sie versuchen, das Modul zu laden: -\end_layout - -\begin_layout Code - -# modprobe ipv6 -\end_layout - -\begin_layout Standard -\align left -Wenn dieser Befehl positiv verläuft, dann sollten Sie das Modul mit folgendem - Befehl auflisten können: -\end_layout - -\begin_layout Code - -# lsmod |grep -w 'ipv6' && echo "IPv6 module successfully loaded" -\end_layout - -\begin_layout Standard -\align left -Der obige Test sollte nun erfolgreich verlaufen. -\end_layout - -\begin_layout Standard -Hinweis: Ein Entfernen des Moduls im laufenden System wird derzeit nicht - unterstützt und kann unter gewissen Bedingungen zu einem Absturz des Kernels - führen. -\end_layout - -\begin_layout Subsubsection -Automatisches Laden des Moduls -\end_layout - -\begin_layout Standard -Es ist möglich das IPv6 Modul bei Bedarf automatisch zu laden. - Sie müssen nur folgende Zeile in die Konfigurationsdatei des kernel modul - loaders eintragen (normalerweise: /etc/modules.conf oder /etc/conf.modules): -\end_layout - -\begin_layout Code - -alias net-pf-10 ipv6 # automatically load IPv6 module on demand -\end_layout - -\begin_layout Standard -Mit der folgenden Zeile ist es auch möglich, das automatische Laden des - IPv6 Moduls auszuschalten. -\end_layout - -\begin_layout Code - -alias net-pf-10 off # disable automatically load of IPv6 module on demand -\end_layout - -\begin_layout Standard -Anmerkung: In Kernel Series 2.6.x wurde der Modul-Lade-Mechanismus geändert. - Die neue Konfigurationsdatei wird anstelle /etc/modules.conf nun /etc/modprobe.co -nf genannt. -\end_layout - -\begin_layout Subsection -Kernel-Kompilierung mit IPv6 Funktionalität -\end_layout - -\begin_layout Standard -\align left -Wenn beide oben gezeigten Methoden ohne Erfolg blieben und ihr Kernel somit - keine IPv6 Unterstützung bietet, dann haben Sie folgende Optionen: -\end_layout - -\begin_layout Itemize -\align left -Aktualisieren Sie Ihre Distribution mit einer Version, die von Haus aus - IPv6 unterstützt (empfohlen für Anfänger), -\end_layout - -\begin_layout Itemize -\align left -Sie können einen Standard-Kernel kompilieren (einfach, wenn Sie die benötigten - Optionen kennen) -\end_layout - -\begin_layout Itemize -Kompilieren Sie die Kernel-Quellen ihrer Distribution (manchmal nicht ganz - so einfach) -\end_layout - -\begin_layout Itemize -\align left -Kompilieren Sie einen Kernel mit den USAGI-Erweiterungen -\end_layout - -\begin_layout Standard -Falls Sie sich dazu entscheiden, einen neuen IPv6 kompatiblen Kernel zu - kompilieren, sollten Sie auf jeden Fall bereits Erfahrung mit der Kernel-Kompil -ierung haben sowie das -\begin_inset CommandInset href -LatexCommand href -name "Linux Kernel HOWTO" -target "http://www.tldp.org/HOWTO/Kernel-HOWTO.html" - -\end_inset - - lesen. -\end_layout - -\begin_layout Standard -Ein Vergleich zwischen dem Standard-Kernel und dem Kernel mit USAGI-Erweiterunge -n ist verfügbar unter -\begin_inset CommandInset href -LatexCommand href -name "IPv6+Linux-Status-Kernel" -target "http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status-kernel.html" - -\end_inset - -. -\end_layout - -\begin_layout Subsubsection -Kompilieren eines Standard-Kernels -\end_layout - -\begin_layout Standard -Detailliertere Ausführungen zur Kompilierung eines IPv6 fähigen Kernels - finden Sie unter -\begin_inset CommandInset href -LatexCommand href -name "IPv6-HOWTO-2#kernel" -target "http://www.bieringer.de/linux/IPv6/IPv6-HOWTO/IPv6-HOWTO-2.html#kernel" - -\end_inset - -. -\end_layout - -\begin_layout Standard -Hinweis: Sie sollten wann immer möglich die Kernel Serie 2.6.x oder höher - einsetzen, da die IPv6 Unterstützung der Serie 2.4.x nur einige Backports - erhält und die IPv6-Unterstützung von Serie 2.2.x hoffnungslos veraltet ist - und nicht mehr weiterentwickelt wird. -\end_layout - -\begin_layout Subsubsection -Kompilieren eines Kernels mit USAGI-Erweiterungen -\end_layout - -\begin_layout Standard -Wie für den Standard-Kernel gilt auch hier, dass das Kompilieren des Kernels - nur fortgeschrittenen Benutzern empfohlen wird, die mit IPv6 und dem Kompiliere -n des Kernels bereits vertraut sind. -\end_layout - -\begin_layout Standard -Siehe auch -\begin_inset CommandInset href -LatexCommand href -name "USAGI project / FAQ" -target "http://www.linux-ipv6.org/faq.html" - -\end_inset - - und -\begin_inset CommandInset href -LatexCommand href -name "Obtaining the best IPv6 support with Linux (Article)" -target "http://www.deepspace6.net/docs/best_ipv6_support.html" - -\end_inset - - -\lang english -( -\begin_inset CommandInset href -LatexCommand href -name "Spiegel" -target "http://mirrors.bieringer.de/www.deepspace6.net/docs/best_ipv6_support.html" - -\end_inset - -) -\lang ngerman -. -\end_layout - -\begin_layout Subsection -IPv6 kompatible Netzwerkgeräte -\end_layout - -\begin_layout Standard -Nicht alle Netzwerkgeräte sind bereits (bzw. - überhaupt) dazu in der Lage, IPv6 Pakete übertragen zu können. - Den aktuellen Status können Sie unter -\begin_inset CommandInset href -LatexCommand href -name "IPv6+Linux-status-kernel.html#transport" -target "http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status-kernel.html#transport" - -\end_inset - -. -\end_layout - -\begin_layout Standard -Ein entscheidender Punkt ist die Tatsache, dass ein IPv6 Paket wegen der - Struktur der Netzwerkschicht in der Kernel-Implementierung nicht wirklich - aufgrund der IP-Header-Nummer (6 anstelle 4) wiedererkannt wird. - Es wird aufgrund der Protokollnummer der Schicht 2 Transport-Protokolls - wiedererkannt. - Folglich können IPv6 Pakete von keinem Transport-Protokoll verwendet werden, - welche diese Protokoll-Nummer nicht nutzen. - Hinweis: Das Paket wird nach wie vor über den Link transportiert, aber - auf der Empfänger-Seite kann das Paket nicht verarbeitet werden (Sie können - dies z.B. - mit tcpdump sehen). -\end_layout - -\begin_layout Subsubsection -Gegenwärtig bekannte Verbindungsarten, die niemals IPv6 fähig sein werden -\end_layout - -\begin_layout Itemize -Serial Line IP ( -\begin_inset CommandInset href -LatexCommand href -name "RFC 1055 / SLIP" -target "http://www.faqs.org/rfcs/rfc1055.html" - -\end_inset - -), auch SLIPv4 genannt; das Gerät heißt: s1X -\end_layout - -\begin_layout Itemize -Parallel Line IP (PLIP), gleich dem SLIP, Gerätename: plipX -\end_layout - -\begin_layout Itemize -ISDN mit -\emph on -rawip -\emph default - Encapsulation; Gerätename: isdnX -\end_layout - -\begin_layout Subsubsection -Bekannte Verbindungsarten, die gegenwärtig IPv6 nicht unterstützen -\end_layout - -\begin_layout Itemize -ISDN mit -\emph on -syncppp -\emph default - Encapsulation; Gerätename: ipppX (Designfrage des ipppd; in der Kernel - Serie 2.5.x wird ipppX in einer allgemeinen PPP Schicht inkludiert) -\end_layout - -\begin_layout Section -IPv6 kompatible Tools zur Netzwerkkonfiguration -\end_layout - -\begin_layout Standard -\align left -Ohne entsprechende Tools zur Konfiguration von IPv6 würden Sie mit einem - IPv6 fähigen Kernel nicht weit kommen. - Es gibt verschiedene Pakete womit IPv6 konfiguriert werden kann. -\end_layout - -\begin_layout Subsection -net-tools Paket -\end_layout - -\begin_layout Standard -\align left -Das Paket net-tool beinhaltet einige Tools wie -\family typewriter -ifconfig -\family default - und -\family typewriter -route -\family default -. - Mit den Tools kann IPv6 auf einem Interface konfiguriert werden. - Sehen Sie sich die Ausgabe des Befehls -\family typewriter -\emph on -ifconfig -? -\family default -\emph default - Bzw. - -\family typewriter -\emph on -route -? -\family default -\emph default - an. - Finden Sie in der Ausgabe die Worte IPv6, inet6 oder Ähnliches, dann ist - das Tool IPv6-kompatibel. -\end_layout - -\begin_layout Standard -Automatische Überprüfung: -\end_layout - -\begin_layout Code - -# /sbin/ifconfig -? 2>& 1|grep -qw 'inet6' && echo "utility 'ifconfig' is -\end_layout - -\begin_layout Code - -¬ IPv6-ready" -\end_layout - -\begin_layout Standard -\align left -Folgenden Check gibt es für -\family typewriter -route -\family default -: -\end_layout - -\begin_layout Code - -# /sbin/route -? 2>& 1|grep -qw 'inet6' && echo "utility 'route' is IPv6-ready" -\end_layout - -\begin_layout Subsection -iproute Paket -\end_layout - -\begin_layout Standard -\align left -Alexey N.Kuznetsov (gegenwärtig ein Betreuer des Linux Network Codes) erstellte - eine Tool-Sammlung, womit das Netzwerk mittels dem netlink Device konfiguriert - wird. - Diese Tool-Sammlung stellt mehr Funktionalität als das net-tools Paket - zur Verfügung, ist aber nicht sehr umfangreich dokumentiert und nichts - für schwache Nerven. -\end_layout - -\begin_layout Code - -# /sbin/ip 2>&1 |grep -qw 'inet6' && echo "utility 'ip' is IPv6-ready" -\end_layout - -\begin_layout Standard -Wird das Programm /sbin/ip nicht gefunden, dann wird die Installation des - iproute Paketes empfohlen. -\end_layout - -\begin_layout Itemize -Sie können dies (falls beinhaltet) von der benutzten Linux-Distribution - installieren -\end_layout - -\begin_layout Itemize -Sie können nach einem passenden RPM Paket unter -\begin_inset CommandInset href -LatexCommand href -name "RPMfind/iproute" -target "http://rpmfind.net/linux/rpm2html/search.php?query=iproute" - -\end_inset - - suchen (manchmal ist auch das kompilieren eines SRPMS Paketes zu empfohlen) -\end_layout - -\begin_layout Section -IPv6 Test/Debug-Programme -\end_layout - -\begin_layout Standard -\align left -Nachdem Sie ihr System auf IPv6 vorbereitet haben, wollen Sie nun IPv6 für - die Netzwerkkommunikation einsetzen. - Zuerst sollten Sie lernen, IPv6 Pakete mit einem Sniffer Programm zu untersuche -n. - Dies ist zu empfehlen, denn in Hinblick auf Fehlersuche und Troubleshooting - kann das Durchführen einer schnellen Diagnose von Nutzen sein. - -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "program-ping6" - -\end_inset - -IPv6 ping -\end_layout - -\begin_layout Standard -Das Programm ist normalerweise im Paket -\emph on -iputils -\emph default - beinhaltet. - Durch senden von ICMPv6 echo-request Paketen und warten auf ICMPv6 echo-reply - Paketen können einfache Transport-Tests durchgeführt werden. -\end_layout - -\begin_layout Standard -Anwendung -\end_layout - -\begin_layout Code - -# ping6 -\end_layout - -\begin_layout Code - -# ping6 -\end_layout - -\begin_layout Code - -# ping6 [-I ] -\end_layout - -\begin_layout Standard - -\lang english -Einige Implementierungen unterstützen auch % Definition zusätzlich - zu -I , z.B. -\end_layout - -\begin_layout Code - -# ping6 % -\end_layout - -\begin_layout Standard -Beispiel -\end_layout - -\begin_layout Code - -# ping6 -c 1 ::1 -\end_layout - -\begin_layout Code - -PING ::1(::1) from ::1 : 56 data bytes -\end_layout - -\begin_layout Code - -64 bytes from ::1: icmp_seq=0 hops=64 time=292 usec -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - ---- ::1 ping statistics --- -\end_layout - -\begin_layout Code - -1 packets transmitted, 1 packets received, 0% packet loss -\end_layout - -\begin_layout Code - -round-trip min/avg/max/mdev = 0.292/0.292/0.292/0.000 ms -\end_layout - -\begin_layout Standard -Hinweis: ping6 benötigt direkten Zugriff auf den Socket und hierfür Root-Rechte. - Wenn Nicht-Root-Benutzer ping6 nicht benutzen können, kann dies zwei Ursachen - haben: -\end_layout - -\begin_layout Enumerate -ping6 ist nicht im Pfad des Benutzers eingetragen; ping6 ist allgemein in - /usr/sbin zu finden -> Lösung: Den Pfad ergänzen (nicht empfohlen) -\end_layout - -\begin_layout Enumerate -ping6 lässt sich im Allgemeines wegen fehlender Root-Rechte nicht korrekt - ausführen -> Lösung: chmod u+s /usr/sbin/ping6 -\end_layout - -\begin_layout Subsubsection -Das Interface für einen IPv6 ping bestimmen -\end_layout - -\begin_layout Standard -Wenn link-lokale Adressen für ein IPv6 ping verwendet werden, dann hat der - Kernel keine Kenntnis darüber, durch welches (physikalische oder virtuelle) - Gerät das Paket gesendet werden muss - jedes Gerät hat eine link-lokale - Adresse. - Ein Versuch resultiert in folgender Fehlermeldung: -\end_layout - -\begin_layout Code - -# ping6 fe80::212:34ff:fe12:3456 -\end_layout - -\begin_layout Code - -connect: Invalid argument -\end_layout - -\begin_layout Standard -In diesem Fall müssen Sie das Interface zusätzlich spezifizieren: -\end_layout - -\begin_layout Code - -# ping6 -I eth0 -c 1 fe80::2e0:18ff:fe90:9205 -\end_layout - -\begin_layout Code - -PING fe80::212:23ff:fe12:3456(fe80::212:23ff:fe12:3456) from -\end_layout - -\begin_layout Code - -¬ fe80::212:34ff:fe12:3478 eth0: 56 data bytes -\end_layout - -\begin_layout Code - -64 bytes from fe80::212:23ff:fe12:3456: icmp_seq=0 hops=64 time=445 usec -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - ---- fe80::2e0:18ff:fe90:9205 ping statistics --- -\end_layout - -\begin_layout Code - -1 packets transmitted, 1 packets received, 0% packet loss round-trip -\end_layout - -\begin_layout Code - -¬ min/avg/max/mdev = 0.445/0.445/0.445/0.000 ms -\end_layout - -\begin_layout Standard - -\lang english -Beispiel für % Notation: -\end_layout - -\begin_layout Code - -# ping6 -c 1 fe80::2e0:18ff:fe90:9205%eth0 -\end_layout - -\begin_layout Subsubsection -Ping6 zu Multicast-Adressen -\end_layout - -\begin_layout Standard -Ein interessanter Mechanismus zum Aufspüren eines IPv6 aktiven Hosts am - Link ist mit ping6 an eine link-lokale all-node Multicast Adresse zu pingen. -\end_layout - -\begin_layout Code - -# ping6 -I eth0 ff02::1 -\end_layout - -\begin_layout Code - -PING ff02::1(ff02::1) from fe80:::2ab:cdff:feef:0123 eth0: 56 data bytes -\end_layout - -\begin_layout Code - -64 bytes from ::1: icmp_seq=1 ttl=64 time=0.104 ms -\end_layout - -\begin_layout Code - -64 bytes from fe80::212:34ff:fe12:3450: icmp_seq=1 ttl=64 time=0.549 ms (DUP!) - -\end_layout - -\begin_layout Standard - -\lang english -Beispiel für % Notation: -\end_layout - -\begin_layout Code - -# ping6 ff02::1%eth0 -\end_layout - -\begin_layout Standard -Bei IPv6 kann dieses Verhalten zurzeit, im Gegensatz zu IPv4, wo Antworten - auf ein Ping auf die Broadcast Adresse unterdrückt werden können, nicht - unterbunden werden. - Ausnahme hierbei ist der Einsatz der lokalen IPv6 Firewall-Funktionalität. -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "program-traceroute6" - -\end_inset - -IPv6 traceroute6 -\end_layout - -\begin_layout Standard -Dieses Programm ist normal im Paket iputils enthalten. - Es ist ein Programm vergleichbar dem IPv4 traceroute. - Unten sehen Sie ein Beispiel: -\end_layout - -\begin_layout Code - -# traceroute6 www.6bone.net -\end_layout - -\begin_layout Code - -traceroute to 6bone.net (3ffe:b00:c18:1::10) from 2001:0db8:0000:f101::2, - 30 -\end_layout - -\begin_layout Code - -¬ hops max, 16 byte packets -\end_layout - -\begin_layout Code - - 1 localipv6gateway (2001:0db8:0000:f101::1) 1.354 ms 1.566 ms 0.407 ms -\end_layout - -\begin_layout Code - - 2 swi6T1-T0.ipv6.switch.ch (3ffe:2000:0:400::1) 90.431 ms 91.956 ms 92.377 ms - -\end_layout - -\begin_layout Code - - 3 3ffe:2000:0:1::132 (3ffe:2000:0:1::132) 118.945 ms 107.982 ms 114.557 ms - -\end_layout - -\begin_layout Code - - 4 3ffe:c00:8023:2b::2 (3ffe:c00:8023:2b::2) 968.468 ms 993.392 ms 973.441 - ms -\end_layout - -\begin_layout Code - - 5 3ffe:2e00:e:c::3 (3ffe:2e00:e:c::3) 507.784 ms 505.549 ms 508.928 ms -\end_layout - -\begin_layout Code - - 6 www.6bone.net (3ffe:b00:c18:1::10) 1265.85 ms * 1304.74 ms -\end_layout - -\begin_layout Standard -Anmerkung: Im Unterschied zu modernen IPv4 traceroute Versionen, welche - den Einsatz von ICMPv4-echo-request Paketen wie auch UDP Paketen (default) - ermöglichen, können mit IPv6-traceroute nur UDP Pakete versendet werden. - Wie Sie vielleicht bereits wissen, werden von Firewalls bzw. - von ACLs auf Routern ICMP echo-request Pakete mehr akzeptiert als UDP Pakete. - -\end_layout - -\begin_layout Standard -Falls ein Interface spezifiziert werden muß, kann dies durch -i - oder in der Form
% erfolgen. -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "program-tracepath6" - -\end_inset - -IPv6 tracepath6 -\end_layout - -\begin_layout Standard -Dieses Programm ist normalerweise im Paket -\emph on -iputils -\emph default - enthalten. - Das Programm ist dem traceroute6 ähnlich, es gibt den Weg zu einem angegebenen - Ziel wieder und misst hierbei den MTU-Wert. - Unten sehen Sie ein Beispiel: -\end_layout - -\begin_layout Code - -# tracepath6 www.6bone.net -\end_layout - -\begin_layout Code - - 1?: [LOCALHOST] pmtu 1480 -\end_layout - -\begin_layout Code - - 1: 3ffe:401::2c0:33ff:fe02:14 150.705ms -\end_layout - -\begin_layout Code - - 2: 3ffe:b00:c18::5 267.864ms -\end_layout - -\begin_layout Code - - 3: 3ffe:b00:c18::5 asymm 2 266.145ms pmtu 1280 -\end_layout - -\begin_layout Code - - 3: 3ffe:3900:5::2 asymm 4 346.632ms -\end_layout - -\begin_layout Code - - 4: 3ffe:28ff:ffff:4::3 asymm 5 365.965ms -\end_layout - -\begin_layout Code - - 5: 3ffe:1cff:0:ee::2 asymm 4 534.704ms -\end_layout - -\begin_layout Code - - 6: 3ffe:3800::1:1 asymm 4 578.126ms !N -\end_layout - -\begin_layout Code - -Resume: pmtu 1280 -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "program-tcpdump" - -\end_inset - -IPv6 tcpdump -\end_layout - -\begin_layout Standard -In Linux ist tcpdump ein Haupttool zum aufzeichnen von Paketen. - Weiter unten sehen Sie einige Beispiele. - Normalerweise ist die Ipv6-Unterstützung in der aktuellen Version 3.6 gegeben. -\end_layout - -\begin_layout Standard -Bei tcpdump werden zur Geräuschminimierung bei der Paket-Filterung Ausdrücke - eingesetzt: -\end_layout - -\begin_layout Itemize -icmp6: ICMPv6 Datenverkehr wird gefiltert -\end_layout - -\begin_layout Itemize -ip6: IPv6 Datenverkehr (inkl.ICMPv6) wird gefiltert -\end_layout - -\begin_layout Itemize -proto ipv6: getunnelter IPv6-in-IPv4 Datenverkehr wird gefiltert -\end_layout - -\begin_layout Itemize -not port ssh: zum unterdrücken der Anzeige von SSH Paketen während der Ausführun -g von tcpdump bei einer remote SSH-Sitzung -\end_layout - -\begin_layout Standard -Ebenfalls sind einige Kommandozeilen-Optionen sehr hilfreich, um detailliertere - Informationen über die Pakete erlangen und protokollieren zu können. - Für ICMPv6 Pakete sind hauptsächlich interessant: -\end_layout - -\begin_layout Itemize -\begin_inset Quotes eld -\end_inset - --s 512 -\begin_inset Quotes erd -\end_inset - -: Bei der Aufzeichnung der Pakete wird die zu Aufzeichnungslänge auf 512 - bytes vergrößert -\end_layout - -\begin_layout Itemize -\begin_inset Quotes eld -\end_inset - --vv -\begin_inset Quotes erd -\end_inset - -: wirklich sehr ausführliche Ausgabe -\end_layout - -\begin_layout Itemize -\begin_inset Quotes eld -\end_inset - --n -\begin_inset Quotes erd -\end_inset - -: Adressen werden nicht in Namen aufgelöst. - Dies ist hilfreich, wenn die Reverse-DNS-Auflösung nicht sauber arbeiten - sollte -\end_layout - -\begin_layout Subsubsection -IPv6 ping zur Adresse -\size footnotesize - 2001:0db8:100:f101::1 -\size default - über einen lokalen Link -\end_layout - -\begin_layout Code - -# tcpdump -t -n -i eth0 -s 512 -vv ip6 or proto ipv6 -\end_layout - -\begin_layout Code - -tcpdump: listening on eth0 -\end_layout - -\begin_layout Code - -2001:0db8:100:f101:2e0:18ff:fe90:9205 > 2001:0db8:100:f101::1: icmp6: echo -\end_layout - -\begin_layout Code - -¬ request (len 64, hlim 64) -\end_layout - -\begin_layout Code - -2001:0db8:100:f101::1 > 2001:0db8:100:f101:2e0:18ff:fe90:9205: icmp6: echo -\end_layout - -\begin_layout Code - -¬ reply (len 64, hlim 64) -\end_layout - -\begin_layout Subsubsection -IPv6 ping zur Adresse -\size footnotesize -2001:0db8:100::1 -\size default - über einen IPv6-in-IPv4 Tunnel geroutet -\end_layout - -\begin_layout Standard -1.2.3.4. - und 5.6.7.8. - sind Tunnel-Endpunkte (alle Adressen sind Beispiele) -\end_layout - -\begin_layout Code - -# tcpdump -t -n -i ppp0 -s 512 -vv ip6 or proto ipv6 -\end_layout - -\begin_layout Code - -tcpdump: listening on ppp0 -\end_layout - -\begin_layout Code - -1.2.3.4 > 5.6.7.8: 2002:ffff:f5f8::1 > 2001:0db8:100::1: icmp6: echo request -\end_layout - -\begin_layout Code - -¬ (len 64, hlim 64) (DF) (ttl 64, id 0, len 124) -\end_layout - -\begin_layout Code - -5.6.7.8 > 1.2.3.4: 2001:0db8:100::1 > 2002:ffff:f5f8::1: icmp6: echo reply (len -\end_layout - -\begin_layout Code - -¬ 64, hlim 61) (ttl 23, id 29887, len 124) -\end_layout - -\begin_layout Code - -1.2.3.4 > 5.6.7.8: 2002:ffff:f5f8::1 > 2001:0db8:100::1: icmp6: echo request -\end_layout - -\begin_layout Code - -¬ (len 64, hlim 64) (DF) (ttl 64, id 0, len 124) -\end_layout - -\begin_layout Code - -5.6.7.8 > 1.2.3.4: 2001:0db8:100::1 > 2002:ffff:f5f8::1: icmp6: echo reply (len -\end_layout - -\begin_layout Code - -¬ 64, hlim 61) (ttl 23, id 29919, len 124) -\end_layout - -\begin_layout Section -IPv6 kompatible Programme -\end_layout - -\begin_layout Standard -Aktuelle Distributionen beinhalten bereits die gängigsten IPv6 kompatiblen - Client- und Server-Programme. - Weitere Infos gibt es unter -\begin_inset CommandInset href -LatexCommand href -name "IPv6+Linux-Status-Distribution" -target "http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status-distributions.html" - -\end_inset - -. - Falls ein Programm hier noch nicht gelistet sein sollte, können Sie unter - -\begin_inset CommandInset href -LatexCommand href -name "Current Status of IPv6 Support for Networking Applications" -target "http://www.deepspace6.net/docs/ipv6_status_page_apps.html" - -\end_inset - - nachlesen, ob das Programm bereits auf IPv6 portiert wurde und unter Linux - bereits läuft. - Für verbreitete Programme gibt es einige Hinweise hier weiter unten. -\end_layout - -\begin_layout Section -IPv6 kompatible Client-Programme (Auswahl) -\end_layout - -\begin_layout Standard -Um die folgend abgebildeten Tests durchzuführen, benötigen Sie ein funktionieren -des IPv6 System. - Bei einigen Beispielen werden Adressen angezeigt, die nur bei einer verfügbaren - 6bone Verbindung erreichbar sind. -\end_layout - -\begin_layout Standard - -\lang english -Note: wenn Namen anstatt dedizierter IPv4/IPv6 Adressen benutzt werden, - dann kann dieser zu einer Liste von IPv4 und IPv6 Adressen aufgelöst werden. - Einige Kommandozeilenwerkzeuge unterstützen explizite Benutzung des gewünschten - Protokolls. - Üblicherweis haben solche Werkzeuge Optionen wie -\begin_inset Quotes sld -\end_inset - --4 -\begin_inset Quotes srd -\end_inset - - für IPv4 und -\begin_inset Quotes sld -\end_inset - --6 -\begin_inset Quotes srd -\end_inset - - für IPv6. -\end_layout - -\begin_layout Subsection -DNS-Überprüfung der IPv6 Adress-Auflösung -\end_layout - -\begin_layout Standard -Jeder DNS-Server (Domain Name System) sollte aufgrund der Sicherheitsupdates - der letzten Jahre bereits mit neuerer Software bestückt sein, die den Übergangs --IPv6-Adress-Standardtyp AAAA unterstützt (der neueste Standardtyp - A6 - genannt - wird nur von BIND9 und höheren Versionen unterstützt und ist - daher noch nicht allzu verbreitet. - Ebenfalls nicht unterstützt wird die root Domain IP6.ARPA). - Ein einfacher Test zum überprüfen der IPv6 Adress-Auflösung ist: -\end_layout - -\begin_layout Code - -# host -t AAAA www.join.uni-muenster.de -\end_layout - -\begin_layout Standard -Die Ausgabe des Tests sollte etwa wie folgt sein: -\end_layout - -\begin_layout Code - -www.join.uni-muenster.de. - is an alias for tolot.join.uni-muenster.de. - -\end_layout - -\begin_layout Code - -tolot.join.uni-muenster.de. - has AAAA address -\end_layout - -\begin_layout Code - -¬ 2001:638:500:101:2e0:81ff:fe24:37c6 -\end_layout - -\begin_layout Subsection -IPv6 kompatible Telnet Client-Programme -\end_layout - -\begin_layout Standard -IPv6 kompatible Clients sind verfügbar. - Ein einfacher Test sieht wie folgt aus: -\end_layout - -\begin_layout Code - -$ telnet 3ffe:400:100::1 80 -\end_layout - -\begin_layout Code - -Trying 3ffe:400:100::1... - -\end_layout - -\begin_layout Code - -Connected to 3ffe:400:100::1. - -\end_layout - -\begin_layout Code - -Escape character is '^]'. - -\end_layout - -\begin_layout Code - -HEAD / HTTP/1.0 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -HTTP/1.1 200 OK -\end_layout - -\begin_layout Code - -Date: Sun, 16 Dec 2001 16:07:21 -\end_layout - -\begin_layout Code - -GMT Server: Apache/2.0.28 (Unix) -\end_layout - -\begin_layout Code - -Last-Modified: Wed, 01 Aug 2001 21:34:42 GMT -\end_layout - -\begin_layout Code - -ETag: "3f02-a4d-b1b3e080" -\end_layout - -\begin_layout Code - -Accept-Ranges: bytes -\end_layout - -\begin_layout Code - -Content-Length: 2637 -\end_layout - -\begin_layout Code - -Connection: close -\end_layout - -\begin_layout Code - -Content-Type: text/html; charset=ISO-8859-1 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -Connection closed by foreign host. -\end_layout - -\begin_layout Standard -Wird ein Text wie -\begin_inset Quotes sld -\end_inset - -cannot resolve hostname -\begin_inset Quotes srd -\end_inset - - ausgegeben, dann unterstützt der Telnet Client keine IPv6 Adressen. -\end_layout - -\begin_layout Subsection -IPv6 kompatible ssh Client-Programme -\end_layout - -\begin_layout Subsubsection -openssh -\end_layout - -\begin_layout Standard -Aktuelle openssh-Versionen sind IPv6 kompatibel. - Abhängig von der Konfiguration vor der Kompilierung gibt es zwei unterschiedlic -he Verhaltensweisen: -\end_layout - -\begin_layout Itemize ---without-ipv4-default: Der Client versucht zuerst eine IPv6-Verbindung. - Misslingt dies, wird eine IPv4-Verbindung aufgebaut -\end_layout - -\begin_layout Itemize ---with-ipv4-default: standardmäßig wird eine IPv4-Verbindung aufgebaut. - Eine IPv6-Verbindung muss, wie unten im Beispiel zu sehen ist, erzwungen - werden: -\end_layout - -\begin_layout Code - -$ ssh -6 ::1 -\end_layout - -\begin_layout Code - -user@::1's password: ****** -\end_layout - -\begin_layout Code - -[user@ipv6host user]$ -\end_layout - -\begin_layout Standard -Falls ihr ssh Client-Programm die Option -\begin_inset Quotes sld -\end_inset - --6 -\begin_inset Quotes srd -\end_inset - - nicht kennt, dann ist das Programm nicht IPv6 fähig. - Dies ist bei den meisten ssh Paketen der Version 1 der Fall. -\end_layout - -\begin_layout Subsubsection -ssh.com -\end_layout - -\begin_layout Standard -SSH.com's SSH Client und Server sind ebenfalls IPv6 kompatibel und darüber - hinaus handelt es sich um freie Programme für die Linux- und FreeBSD-Plattform, - unabhängig davon, ob sie zu kommerziellem oder zu persönlichen Zweck verwendet - werden. -\end_layout - -\begin_layout Subsection -IPv6 kompatible Web-Browser -\end_layout - -\begin_layout Standard -Einen aktuellen Statusüberblick zum Thema IPv6 kompatible Web-Browser ist - unter -\lang english - -\begin_inset CommandInset href -LatexCommand href -name "Current Status of IPv6 Support for Networking Applications - HTTP" -target "http://www.deepspace6.net/docs/ipv6_status_page_apps.html#http" - -\end_inset - - -\lang ngerman - verfügbar. -\end_layout - -\begin_layout Standard -Die meisten Browser haben zurzeit noch ungelöste Probleme -\end_layout - -\begin_layout Enumerate -Ist ein IPv4 Proxy in den Einstellungen eingetragen, dann werden IPv6 Anfragen - zum Proxy gesendet. - Der Proxy kann keine IPv6 Anfragen verstehen und somit scheitert die Anfrage. - Lösung: Proxy Software aktualisieren (siehe weiter unten). -\end_layout - -\begin_layout Enumerate -Automatik-Einstellungen des Proxy (*.pac) können aufgrund ihrer Beschaffenheit - nicht derart erweitert werden, dass sie IPv6 Anfragen anders handhaben - (z.B. - kein Proxy verwenden) können (Sie sind in Javaskript geschrieben und ziemlich - hard coded in den Quellen verankert; z.B. - Mozilla Quellcode). -\end_layout - -\begin_layout Standard -Ältere Browser-Versionen verstehen ebenfalls keine URL mit IPv6 Adressen - wie z.B. - -\lang english - -\begin_inset CommandInset href -LatexCommand href -name "http://[2001:4dd0:f838:a006::6]/" -target "http://[2001:4dd0:f838:a006::6]/" - -\end_inset - -, IPv6-Addresse von -\begin_inset CommandInset href -LatexCommand href -name "http://www.ipv6.bieringer.de/" -target "http://www.ipv6.bieringer.de/" - -\end_inset - - -\lang ngerman -(die angegebene URL funktioniert nur mit einem IPv6 kompatiblen Browser!). -\end_layout - -\begin_layout Standard -Ein kleiner Test ist diese URL mit einem gegebenen Browser und ohne Proxy - zu verwenden. -\end_layout - -\begin_layout Subsubsection -URLs zum testen -\end_layout - -\begin_layout Standard -Ein guter Ausgangspunkt zum Betrachten von Webseiten mit IPv6 ist -\begin_inset CommandInset href -LatexCommand href -name "http://www.kame.net/" -target "http://www.kame.net/" - -\end_inset - -. - Ist die Schildkröte animiert, dann ist Verbindung mittels IPv6 Verbindung - zustande gekommen, andererseits bleibt die Schildkröte statisch. -\end_layout - -\begin_layout Standard -Andere Test-Server sind z.B. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "What Is My IPv6" -target "http://www.whatismyipv6.com/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "ip.bieringer.de" -target "http://ip.bieringer.de/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Test" -target "http://ipv6-test.com/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "test-ipv6.com" -target "http://test-ipv6.com/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "The ICSI Netalyzr" -target "http://netalyzr.icsi.berkeley.edu/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Speedtest Comcast" -target "http://speedtest.comcast.net/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Speedtest Comcast" -target "http://ipv6.speedtest.comcast.net/" - -\end_inset - - -\end_layout - -\begin_layout Section -IPv6 kompatible Server -\end_layout - -\begin_layout Standard -In diesem Teil des HOWTOs wird stärker auf Client-spezifische Belange eingegange -n. - Folglich sei zu IPv6 kompatiblen Servern wie sshd, httpd, telnetd usw. - auf diese Stelle verwiesen: -\begin_inset CommandInset ref -LatexCommand ref -name "Hints for IPv6-enabled daemons" -reference "chapter-hints-daemons" - -\end_inset - -. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "faq-ipv6-ready-system-check" - -\end_inset - -FAQ (IPv6 Systemcheck) -\end_layout - -\begin_layout Subsection -Anwendung diverser Tools -\end_layout - -\begin_layout Subsubsection -Q: ping6 zu einer link-lokalen Adresse funktioniert nicht -\end_layout - -\begin_layout Standard -Fehlermeldung: " -\emph on -connect: Invalid argument -\emph default -" -\end_layout - -\begin_layout Standard -Der Kernel hat keine Kenntnis darüber, welchen physikalischen oder virtuellen - Link Sie zum versenden von ICMPv6 Paketen verwenden möchten. - Aus diesem Grund wird die Fehlermeldung ausgegeben. -\end_layout - -\begin_layout Standard -Lösung: Spezifizieren Sie den Link, z.B.: -\begin_inset Quotes sld -\end_inset - -ping6 -\series bold --I eth0 -\series default - fe80::2e0:18ff:fe90:9205 -\begin_inset Quotes srd -\end_inset - -. - Siehe auch -\begin_inset CommandInset ref -LatexCommand ref -name "program ping6 usage" -reference "program-ping6" - -\end_inset - -. -\end_layout - -\begin_layout Subsubsection -Q: ping6 oder traceroute6 funktioniert nicht als normaler Benutzer -\end_layout - -\begin_layout Standard -Fehlermeldung: -\begin_inset Quotes sld -\end_inset - - -\emph on -icmp socket: Operation not permitted -\emph default - -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -Diese Tools erzeugen spezielle ICMPv6 Pakete und versenden diese unter Verwendun -g von raw sockets im Kernel. - Raw sockets können aber nur vom Benutzer -\begin_inset Quotes sld -\end_inset - -root -\begin_inset Quotes srd -\end_inset - - verwendet werden. - Normale Benutzer bekommen aus diesem Grund diese Fehlermeldung. -\begin_inset Newline newline -\end_inset - - -\end_layout - -\begin_layout Standard -Lösung: Wenn wirklich alle Benutzer auf diese Tools zugreifen sollen, können - Sie dies mit setzen des -\begin_inset Quotes sld -\end_inset - -suid -\begin_inset Quotes srd -\end_inset - - bits mittels -\begin_inset Quotes sld -\end_inset - -chmod u+s / path/to/program -\begin_inset Quotes srd -\end_inset - - erreichen (siehe auch -\begin_inset CommandInset ref -LatexCommand ref -name "program ping6 usage" -reference "program-ping6" - -\end_inset - -). - Falls nicht alle Benutzer das Programm benötigen, können Sie die Gruppenzugehör -igkeit des Programms ändern, z.B. - Gruppe -\begin_inset Quotes sld -\end_inset - -wheel -\begin_inset Quotes srd -\end_inset - -. - Fügen Sie alle Benutzer zu dieser Gruppe hinzu und entfernen Sie das execution - bit für andere Benutzer mittels -\begin_inset Quotes sld -\end_inset - -chmod o-rwx /path/to/program -\begin_inset Quotes srd -\end_inset - -. - Alternativ können Sie auch -\begin_inset Quotes sld -\end_inset - -sudo -\begin_inset Quotes srd -\end_inset - - dazu verwenden, um Ihren Sicherheitsbestimmungen Rechnung zu tragen. -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-configuration-interface" - -\end_inset - -Interface-Konfiguration -\end_layout - -\begin_layout Section -Unterschiedliche Netzwerk-Geräte -\end_layout - -\begin_layout Standard -Ein Knoten besitzt mehrere Netzwerk-Devices, die in Klassen zusammengefasst - werden können: -\end_layout - -\begin_layout Itemize -Physikalische Devices wie eth0, tr0 -\end_layout - -\begin_layout Itemize -Virtuelle Devices wie ppp0, tun0, tap0, sit0, isdn0, ippp0 -\end_layout - -\begin_layout Subsection -Physikalische Devices -\end_layout - -\begin_layout Standard -Physikalische Interfaces wie Ethernet oder Token-Ring bedürfen keiner speziellen - Handhabung. -\end_layout - -\begin_layout Subsection -Virtuelle Devices -\end_layout - -\begin_layout Standard -Virtuelle Interfaces hingegen benötigen immer eine spezielle Konfiguration. -\end_layout - -\begin_layout Subsubsection -IPv6-in-IPv4 Tunnel Interfaces -\end_layout - -\begin_layout Standard -Diese Interfaces werden -\series bold -sitx -\series default - genannt. - Der Name sit ist eine Abkürzung für -\series bold -S -\series default -imple -\series bold -I -\series default -nternet -\series bold -T -\series default -ransition. - Das Gerät hat die Fähigkeit IPv6 Pakete in IPv4 Pakete zu verkapseln und - diese dann über einen Tunnel zum entfernten Endpunkt zu transportieren. -\end_layout - -\begin_layout Standard - -\series bold -sit0 -\series default - hat eine spezielle Bedeutung: dieses Interface kann nicht für fest zugeordnete - Tunnel verwendet werden. -\end_layout - -\begin_layout Subsubsection -PPP Interfaces -\end_layout - -\begin_layout Standard -PPP Interfaces beziehen ihre IPv6 Funktionalität von einem IPv6 kompatiblen - PPP Daemon. -\end_layout - -\begin_layout Subsubsection -ISDN HDLC Interfaces -\end_layout - -\begin_layout Standard -Für HDLC mit -\series bold -IP -\series default - encapsulation ist die IPv6 Funktionalität bereits im Kernel integriert. -\end_layout - -\begin_layout Subsubsection -ISDN PPP Interfaces -\end_layout - -\begin_layout Standard -ISDN PPP Interfaces (ippp) werden durch den Kernel nicht mit IPv6 Funktionalität - unterstützt. - Es gibt auch keine Pläne hierfür, da im Kernel 2.5.+ dieser Interface-Typ - durch eine allgemeinere ppp Interface Schicht ersetzt werden soll. -\end_layout - -\begin_layout Subsubsection -SLIP + PLIP -\end_layout - -\begin_layout Standard -Wie bereits erwähnt, unterstützen diese Interfaces keinen IPv6 Transport - (senden ist ok, das abfertigen ankommender Pakete funktioniert jedoch nicht). -\end_layout - -\begin_layout Subsubsection -Ether-tap Device -\end_layout - -\begin_layout Standard -Ether-tap Devices sind IPv6 kompatibel und als stateless konfiguriert. - Für den Gebrauch muss das Modul -\begin_inset Quotes sld -\end_inset - -ethertap -\begin_inset Quotes srd -\end_inset - - geladen werden. -\end_layout - -\begin_layout Subsubsection -tun Device -\end_layout - -\begin_layout Standard -Nicht von mir getestet... -\end_layout - -\begin_layout Subsubsection -ATM -\end_layout - -\begin_layout Standard -01/2002: ATM wird vom Standard-Kernel nicht, jedoch aber durch die USAGI-Erweite -rungen unterstützt. -\end_layout - -\begin_layout Subsubsection -Sonstige -\end_layout - -\begin_layout Standard -Wurde ein Interface vergessen...? -\end_layout - -\begin_layout Section -Interfaces ein/aus-schalten -\end_layout - -\begin_layout Standard -Es gibt zwei Methoden, ein Interface ein- oder auszuschalten. -\end_layout - -\begin_layout Subsection -Verwendung von "ip" -\end_layout - -\begin_layout Standard -Gebrauch: -\end_layout - -\begin_layout Code - -# ip link set dev up -\end_layout - -\begin_layout Code - -# ip link set dev down -\end_layout - -\begin_layout Standard -Beispiel: -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# ip link set dev eth0 up -\end_layout - -\begin_layout Code - -# ip link set dev eth0 down -\end_layout - -\begin_layout Subsection -Verwendung von "ifconfig" -\end_layout - -\begin_layout Standard -\align left -Gebrauch: -\end_layout - -\begin_layout Code - -# /sbin/ifconfig up -\end_layout - -\begin_layout Code - -# /sbin/ifconfig down -\end_layout - -\begin_layout Standard -Beispiel: -\end_layout - -\begin_layout Code - -# /sbin/ifconfig eth0 up -\end_layout - -\begin_layout Code - -# /sbin/ifconfig eth0 down -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-configuration-address" - -\end_inset - -IPv6 Adressen konfigurieren -\end_layout - -\begin_layout Standard -\align left -Es gibt verschiedene Methoden zum konfigurieren einer IPv6 Adresse eines - Interfaces. - Sie können "ifconfig" oder "ip" dazu einsetzen. -\end_layout - -\begin_layout Section -Bestehende IPv6 Adressen anzeigen -\end_layout - -\begin_layout Standard -\align left -Zuerst sollten sie überprüfen, ob und welche IPv6 Adressen bereits konfiguriert - sind (etwa durch automatischer stateless Konfiguration). - -\end_layout - -\begin_layout Standard - -\lang english -Achtung: Adressen beginnend mit -\begin_inset Quotes sld -\end_inset - -fec0 -\begin_inset Quotes srd -\end_inset - - sind obsolet, hier aber noch der Vollständigheit wegen gezeigt! -\end_layout - -\begin_layout Subsection -Verwendung von "ip" -\end_layout - -\begin_layout Standard -Anwendung: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 addr show dev -\end_layout - -\begin_layout Standard -Beispiel für einen statisch konfigurierten Host: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 addr show dev eth0 -\end_layout - -\begin_layout Code - -2: eth0: -\end_layout - -\begin_layout Standard -Hier sehen Sie verschiedene IP Adressen mit unterschiedlichen Gültigkeitsbereich -en (die Ausgabe wurde mit grep gefiltert) -\end_layout - -\begin_layout Code - -# /sbin/ifconfig eth0 |grep "inet6 addr:" -\end_layout - -\begin_layout Code - -inet6 addr: fe80::210:a4ff:fee3:9566/10 Scope:Link -\end_layout - -\begin_layout Code - -inet6 addr: 2001:0db8:0:f101::1/64 Scope:Global -\end_layout - -\begin_layout Code - -inet6 addr: fec0:0:0:f101::1/64 Scope:Site -\end_layout - -\begin_layout Section -Hinzufügen einer IPv6 Adresse -\end_layout - -\begin_layout Standard -Die Vorgehensweise beim hinzufügen einer IPv6 Adresse ist vergleichbar mit - dem "IP ALIAS"-Mechanismus bei IPv4 adressierten Interfaces. - -\end_layout - -\begin_layout Subsection -Verwendung von "ip" -\end_layout - -\begin_layout Standard -Anwendung: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 addr add / dev -\end_layout - -\begin_layout Standard -Beispiel: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 addr add 2001:0db8:0:f101::1/64 dev eth0 -\end_layout - -\begin_layout Subsection -Verwendung von "ifconfig" -\end_layout - -\begin_layout Standard -\align left -Anwendung: -\end_layout - -\begin_layout Code - -# /sbin/ifconfig inet6 add / -\end_layout - -\begin_layout Standard -Beispiel: -\end_layout - -\begin_layout Code - -# /sbin/ifconfig eth0 inet6 add 2001:0db8:0:f101::1/64 -\end_layout - -\begin_layout Section -IPv6 Adressen entfernen -\end_layout - -\begin_layout Standard -\align left -Diese Funktion wird selten benötigt. - Vorsicht ist beim entfernen nicht existenter IPv6 Adressen geboten, da - ältere Kernel dieses Fehlverhalten manchmal mit einem Crash quittieren. -\end_layout - -\begin_layout Subsection -Verwendung von "ip" -\end_layout - -\begin_layout Standard -Anwendung: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 addr del / dev -\end_layout - -\begin_layout Standard -Beispiel: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 addr del 2001:0db8:0:f101::1/64 dev eth0 -\end_layout - -\begin_layout Subsection -Verwendung von "ifconfig" -\end_layout - -\begin_layout Standard -\align left -Anwendung: -\end_layout - -\begin_layout Code - -# /sbin/ifconfig inet6 del / -\end_layout - -\begin_layout Standard -Beispiel: -\end_layout - -\begin_layout Code - -# /sbin/ifconfig eth0 inet6 del 2001:0db8:0:f101::1/64 -\end_layout - -\begin_layout Section - -\lang english -Automatische IPv6-Adress-Konfiguration -\end_layout - -\begin_layout Standard - -\lang english -Im Fall, dass ein Endgerät ein Router Advertisement empfängt und der Host - kein Router ist, konfiguriert sich das Endgerät selbst eine IPv6-Adresse - entsprechend dem Präfix aus dem Router Advertisement (siehe auch -\begin_inset CommandInset ref -LatexCommand ref -reference "hints-daemons-radvd" - -\end_inset - -). -\end_layout - -\begin_layout Section - -\lang english -Aktivieren der Privacy Extension -\end_layout - -\begin_layout Standard - -\lang english -Privacy Extension wie beschrieben in -\begin_inset CommandInset href -LatexCommand href -name "RFC 4941 / Privacy Extensions for Stateless Address Autoconfiguration in IPv6" -target "http://www.faqs.org/rfcs/rfc4941.html" - -\end_inset - - (Nachfolger von -\begin_inset CommandInset href -LatexCommand href -name "RFC 3041" -target "http://www.faqs.org/rfcs/rfc3041.html" - -\end_inset - -) ersetzt die statische Interface ID (mostly basierend auf der weltweit - eindeutigen MAC-Adresse), die bei der Autokonfiguration benutzt wird, durch - eine pseudo-random und von Zeit zu Zeit neu generierte. -\end_layout - -\begin_layout Subsection - -\lang english -Aktivieren von Privacy Extension mit Hilfe von sysctl -\end_layout - -\begin_layout Subsection* - -\lang english -Temporäre Aktivierung -\end_layout - -\begin_layout Standard - -\lang english -Einschalten der Privacy Extension für z.B. - Interface -\begin_inset Quotes sld -\end_inset - -eth0 -\begin_inset Quotes srd -\end_inset - - und zudem Präferieren dieser Adresse: -\end_layout - -\begin_layout Code - -# sysctl -w net.ipv6.conf.eth0.use_tempaddr=2 -\end_layout - -\begin_layout Standard - -\lang english -Zur Aktivierung ist der Restart des Interfaces notwendig -\end_layout - -\begin_layout Code - -# ip link set dev eth0 down -\end_layout - -\begin_layout Code - -# ip link set dev eth0 up -\end_layout - -\begin_layout Standard - -\lang english -Nach Empfang eines Router Advertisement sollte das Interface eine entsprechende - Adresse sich selbst konfiguriert haben -\end_layout - -\begin_layout Code - -# ip -6 addr show dev eth0 -\end_layout - -\begin_layout Code - -2: eth0: mtu 1500 qlen 1000 -\end_layout - -\begin_layout Code - - inet6 2001:db8:0:1:8992:3c03:d6e2:ed72/64 scope global secondary dynamic - <- pseudo-random IID -\end_layout - -\begin_layout Code - - valid_lft 604711sec preferred_lft 86311sec -\end_layout - -\begin_layout Code - - inet6 2001:db8:0:1::224:21ff:fe01:2345/64 scope global <- IID based - on MAC -\end_layout - -\begin_layout Code - - valid_lft 604711sec preferred_lft 86311sec -\end_layout - -\begin_layout Code - - ... -\end_layout - -\begin_layout Subsection* - -\lang english -Permanente Aktivierung -\end_layout - -\begin_layout Standard -Für -\lang english - eine permanente Aktivierung muss entweder ein spezieller Initscript-Wert - pro Interface gesetzt sein oder ein entsprechender Wert in /etc/sysctl.conf - definiert werden: -\end_layout - -\begin_layout Code - -net.ipv6.conf.eth0.use_tempaddr=2 -\end_layout - -\begin_layout Standard - -\lang english -Achtung: das Interface muss zu diesem Zeitpunkt bereits existieren. - Wenn das nicht der Fall ist (z.B. - nach einem Reboot) musses für alle Interfaces konfiguriert werden: -\end_layout - -\begin_layout Code - -net.ipv6.conf.all.use_tempaddr=2 -\end_layout - -\begin_layout Code - -net.ipv6.conf.default.use_tempaddr=2 -\end_layout - -\begin_layout Standard - -\lang english -Die Änderungen in /etc/sysctl.conf können im laufenden Betrieb geändert werden, - aber zur wirklichen Aktivierung wird mindestens wird ein Interface-Restart - (down/up) oder ein Reboot benötigt. -\end_layout - -\begin_layout Code - -# sysctl -p -\end_layout - -\begin_layout Subsection - -\lang english -Aktivieren von Privacy Extension mit Hilfe des NetworkManager -\end_layout - -\begin_layout Standard - -\lang english -Moderne (Client-) Systeme nutzen NetworkManager zur Interface-Konfiguration. - Ein Kommandozeilen-Werkzeug ist eingebaut welches auch Parameter ändern - kann, die in der GUI nicht verfügbar (oder sichtbar) sind. -\end_layout - -\begin_layout Standard - -\lang english -Beispiele basieren auf Version 0.9.9.1-5.git20140319.fc21 -\end_layout - -\begin_layout Standard - -\lang english -Prüfen existierender Interfaces mit: -\end_layout - -\begin_layout Code - -# nmcli connection -\end_layout - -\begin_layout Code - -NAME UUID TYPE DEVICE -\end_layout - -\begin_layout Code - -ens4v1 d0fc2b2e-5fa0-4675-96b5-b723ca5c46db 802-3-ethernet ens4v1 -\end_layout - -\begin_layout Standard - -\lang english -Menge von IPv6-Adressen mit Privacy Extension: -\end_layout - -\begin_layout Code - -# ip -o addr show dev ens4v1 | grep temporary | wc -l -\end_layout - -\begin_layout Code - -0 -\end_layout - -\begin_layout Standard - -\lang english -Aktuelle Einstellung der IPv6 Privacy Extension für ein Interface: -\end_layout - -\begin_layout Code - -# nmcli connection show ens4v1 |grep ip6-privacy -\end_layout - -\begin_layout Code - -ipv6.ip6-privacy: -1 (unknown) -\end_layout - -\begin_layout Standard - -\lang english -Aktivieren der IPv6 Privacy Extension und Restart des Interfaces; -\end_layout - -\begin_layout Code - -# nmcli connection modify ens4v1 ipv6.ip6-privacy 2 -\end_layout - -\begin_layout Code - -# nmcli connection down ens4v1; nmcli connection up ens4v1 -\end_layout - -\begin_layout Standard - -\lang english -Neuer Wert der IPv6 Privacy Extension prüfen: -\end_layout - -\begin_layout Code - -# nmcli connection show ens4v1 |grep ip6-privacy -\end_layout - -\begin_layout Code - -ipv6.ip6-privacy: 2 (active, prefer temporary IP) -\end_layout - -\begin_layout Standard - -\lang english -Nun sollten auch IPv6 Privacy Extension Adressen automatisch konfiguriert - sein -\end_layout - -\begin_layout Code - -# ip -o addr show dev ens4v1 | grep temporary | wc -l -\end_layout - -\begin_layout Code - -2 -\end_layout - -\begin_layout Subsection - -\lang english -Test zur Benutzung von Privacy Extension IPv6-Adressen -\end_layout - -\begin_layout Standard - -\lang english -Ob die IPv6-Adresss mit einer durch die Privacy Extension generierte Interface - ID für ausgehende Verbindungen wirklich benutzt wird, kann z.B. - mit Hilfe eines Web-Browers durch Aufruf von -\begin_inset CommandInset href -LatexCommand href -name "http://ip.bieringer.de/" -target "http://ip.bieringer.de/" - -\end_inset - - durchgeführt werden. - Wenn EUI64_SCOPE als Ausgabe -\begin_inset Quotes sld -\end_inset - -iid-privacy -\begin_inset Quotes srd -\end_inset - - zeigt, dann funktioniert alles richtig. -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-configuration-route" - -\end_inset - -Konfiguration normaler IPv6-Routen -\end_layout - -\begin_layout Standard -Wenn Sie Ihren lokalen Link verlassen und Pakete in das weltweite IPv6-Internet - versenden wollen, dann benötigen Sie Routing. - Wenn sich bereits ein IPv6 fähiger Router an Ihrem Link befindet, dann - reicht eventuell das Hinzufügen von IPv6 Routen. -\end_layout - -\begin_layout Standard - -\lang english -Achtung: Adressen beginnend mit -\begin_inset Quotes sld -\end_inset - -fec0 -\begin_inset Quotes srd -\end_inset - - sind obsolet, hier aber noch der Vollständigheit wegen gezeigt! -\end_layout - -\begin_layout Section -Bestehende IPv6-Routen anzeigen -\end_layout - -\begin_layout Standard -\align left -Zuerst sollten sie überprüfen, ob und welche IPv6 Adressen bereits konfiguriert - sind (etwa durch automatischer Konfiguration). -\end_layout - -\begin_layout Subsection -Verwendung von "ip" -\end_layout - -\begin_layout Standard -Anwendung: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route show [dev ] -\end_layout - -\begin_layout Standard -\align left -Beispiel: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route show dev eth0 -\end_layout - -\begin_layout Code - -2001:0db8:0:f101::/64 proto kernel metric 256 mtu 1500 advmss 1440 -\end_layout - -\begin_layout Code - -fe80::/10 proto kernel metric 256 mtu 1500 advmss 1440 -\end_layout - -\begin_layout Code - -ff00::/8 proto kernel metric 256 mtu 1500 advmss 1440 -\end_layout - -\begin_layout Code - -default proto kernel metric 256 mtu 1500 advmss 1440 -\end_layout - -\begin_layout Subsection -Verwendung von "route" -\end_layout - -\begin_layout Standard -\align left -Anwendung: -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 -\end_layout - -\begin_layout Standard -\align left -Sie sehen hier mehrere IPv6 Routen mit unterschiedlichen Adressen eines - einzelnen Interfaces (bei der Ausgabe wurde das Interface eth0 herausgefiltert). -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 |grep -w "eth0" -\end_layout - -\begin_layout Code - -2001:0db8:0:f101 ::/64 :: UA 256 0 0 eth0 <- Interface route for global -\end_layout - -\begin_layout Code - -¬ address -\end_layout - -\begin_layout Code - -fe80::/10 :: UA 256 0 0 eth0 <- Interface route for link-local -\end_layout - -\begin_layout Code - -¬ address -\end_layout - -\begin_layout Code - -ff00::/8 :: UA 256 0 0 eth0 <- Interface route for all multicast -\end_layout - -\begin_layout Code - -¬ addresses -\end_layout - -\begin_layout Code - -::/0 :: UDA 256 0 0 eth0 <- Automatic default route -\end_layout - -\begin_layout Section -Eine IPv6-Route über ein Gateway hinzufügen -\end_layout - -\begin_layout Standard -\align left -Eine Route wird meistens benötigt, um mit IPv6 die Außenwelt über einen - IPv6 fähigen Router und über Ihren Link zu erreichen. -\end_layout - -\begin_layout Subsection -Verwendung von "ip" -\end_layout - -\begin_layout Standard -Anwendung: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route add / via -\end_layout - -\begin_layout Code - -¬ [dev ] -\end_layout - -\begin_layout Standard -Beispiel: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route add default via 2001:0db8:0:f101::1 -\end_layout - -\begin_layout Subsection -Verwendung von "route" -\end_layout - -\begin_layout Standard -\align left -Anwendung: -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 add / gw -\end_layout - -\begin_layout Code - -¬ [dev ] -\end_layout - -\begin_layout Standard -Die optionale Angabe eines Devices wird dann benötigt, wenn die IPv6 Adresse - des Gateways eine lokale Link-Adresse ist. -\end_layout - -\begin_layout Standard -Im folgenden Beispiel wird eine Route für alle Adressen (default) über das - Gateway -\family typewriter -2001:0db8:0:f101::1 -\family default - hinzugefügt. -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 add default gw 2001:0db8:0:f101::1 -\end_layout - -\begin_layout Section -Eine IPv6-Route über ein Gateway entfernen -\end_layout - -\begin_layout Standard -\align left -Das manuelle entfernen einer Route wird nicht oft benötigt, meistens wird - dies automatisch durch Netzwerk-Konfigurationsscripts beim herunterfahren - (des Betriebssystems oder eines Interfaces) bewirkt. -\end_layout - -\begin_layout Subsection -Verwendung von "ip" -\end_layout - -\begin_layout Standard -\align left -Anwendung: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route del / via -\end_layout - -\begin_layout Code - -¬ [dev ] -\end_layout - -\begin_layout Standard -Beispiel: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route del default via 2001:0db8:0:f101::1 -\end_layout - -\begin_layout Subsection -Verwendung von "route" -\end_layout - -\begin_layout Standard -\align left -Anwendung: -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 del / gw - [dev -\end_layout - -\begin_layout Code - -¬ ] -\end_layout - -\begin_layout Standard -Beispiel zum entfernen der im obigen Beispiel hinzugefügten Route: -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 del default gw 2001:0db8:0:f101::1 -\end_layout - -\begin_layout Section -Eine IPv6-Route über ein Interface hinzufügen -\end_layout - -\begin_layout Standard -\align left -Diese Funktion wird manchmal im Fall dedizierter Punkt-zu-Punkt Verbindungen - verwendet, in der Regel aber eher selten benötigt. -\end_layout - -\begin_layout Subsection -Verwendung von "ip" -\end_layout - -\begin_layout Standard -\align left -Anwendung: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route add / dev -\end_layout - -\begin_layout Code - -¬ metric 1 -\end_layout - -\begin_layout Standard -Beispiel: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route add default dev eth0 metric 1 -\end_layout - -\begin_layout Standard -Der Metrik-Wert -\begin_inset Quotes sld -\end_inset - -1 -\begin_inset Quotes srd -\end_inset - - wird verwendet, um mit dem Metrik Wert von route kompatibel zu sein; der - Standard-Metrik-Wert von -\begin_inset Quotes sld -\end_inset - -ip -\begin_inset Quotes srd -\end_inset - - ist -\begin_inset Quotes sld -\end_inset - -1024 -\begin_inset Quotes srd -\end_inset - -. -\end_layout - -\begin_layout Subsection -Verwendung von "route" -\end_layout - -\begin_layout Standard -\align left -Anwendung: -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 add / dev -\end_layout - -\begin_layout Standard -Beispiel: -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 add default dev eth0 -\end_layout - -\begin_layout Section -Eine IPv6-Route über ein Interface entfernen -\end_layout - -\begin_layout Standard -\align left -Dies wird manuell nicht so oft benötigt, jedoch aber beim herunterfahren - von Konfigurationsscripts benutzt. -\end_layout - -\begin_layout Subsection -Verwendung von "ip" -\end_layout - -\begin_layout Standard -Anwendung: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route del / dev -\end_layout - -\begin_layout Standard -Beispiel: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route del default dev eth0 -\end_layout - -\begin_layout Subsection -Verwendung von "route" -\end_layout - -\begin_layout Standard -\align left -Anwendung: -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 del / dev -\end_layout - -\begin_layout Standard -\align left -Beispiel: -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 del default dev eth0 -\end_layout - -\begin_layout Section -FAQ für IPv6-Routen -\end_layout - -\begin_layout Subsection -Unterstützung einer IPv6 Default-Route -\end_layout - -\begin_layout Standard -Ein Schwerpunkt bei IPv6 ist das hierarchische Routing. - Aus diesem Grund werden in Routern nur wenige Routing-Einträge benötigt. -\end_layout - -\begin_layout Standard -Einige Punkte sind im aktuellen Kernel zu beachten: -\end_layout - -\begin_layout Subsubsection -Clients (kein Routing eines Paketes!) -\end_layout - -\begin_layout Standard -Ein client kann eine Default Route (z.B. - -\begin_inset Quotes sld -\end_inset - -::/0 -\begin_inset Quotes srd -\end_inset - - ) einrichten, diese aber auch durch automatische Konfiguration, z.B. - mit radvd, erlernen: -\end_layout - -\begin_layout Code - -# ip -6 route show | grep ^default -\end_layout - -\begin_layout Code - -default via fe80::212:34ff:fe12:3450 dev eth0 proto kernel metric 1024 expires -\end_layout - -\begin_layout Code - -¬ 29sec mtu 1500 advmss 1440 -\end_layout - -\begin_layout Subsubsection -Router & Paketweiterleitung -\end_layout - -\begin_layout Standard -Ältere Linux Kernel ( zumindest <= 2.4.17) unterstützen keine Default Routen. - Man kann dies einrichten, aber die Abfrage dieser Route misslingt im Fall, - dass ein Paket weitergeleitet werden soll ( normaler Zwecke eines Routers). -\end_layout - -\begin_layout Standard -Falls ein entsprechender Kernel noch verwendet wird, kann -\begin_inset Quotes sld -\end_inset - -default routing -\begin_inset Quotes srd -\end_inset - - eingerichtet werden, wenn hierbei das einzig globale Adress-Präfix -\begin_inset Quotes sld -\end_inset - -2000::/3 -\begin_inset Quotes srd -\end_inset - - verwendet wird. -\end_layout - -\begin_layout Standard -Anmerkung: Walten Sie mit Vorsicht bei der Anwendung von default routing - auf exponierten Routern, wenn keine Adressfilterung eingesetzt wird. - Andernfalls kann Multicast- oder lokaler Site-Datenverkehr den Router ungewollt - verlassen. -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-Neighbor-Discovery" - -\end_inset - -Neighbor Discovery -\end_layout - -\begin_layout Standard -Die Neighbor Discovery (Ermittlung der Netzwerkumgebung) ist der IPv6 Nachfolger - für das ARP (Address Resolution Protocol) bei IPv4. - Sie können Informationen über die aktuelle Netzwerkumgebung gewinnen, Einträge - erstellen und entfernen. -\end_layout - -\begin_layout Standard -Der Kernel merkt sich erfolgreich gelernte -\begin_inset Quotes sld -\end_inset - -Nachbarn -\begin_inset Quotes srd -\end_inset - - (wie ARP in IPv4). - Sie können die gelernten Einträge mit -\begin_inset Quotes sld -\end_inset - -ip -\begin_inset Quotes srd -\end_inset - - einsehen. -\end_layout - -\begin_layout Section -Netzwerkumgebung mit -\begin_inset Quotes sld -\end_inset - -ip -\begin_inset Quotes srd -\end_inset - - anzeigen -\end_layout - -\begin_layout Standard -Mit dem folgenden Befehl können Sie die gelernten oder konfigurierten IPv6 - Nachbarn anzeigen: -\end_layout - -\begin_layout Code - -# ip -6 neigh show [dev ] -\end_layout - -\begin_layout Standard -Das folgende Beispiel zeigt einen Nachbar, einen erreichbaren Router: -\end_layout - -\begin_layout Code - -# ip -6 neigh show -\end_layout - -\begin_layout Code - -fe80::201:23ff:fe45:6789 dev eth0 lladdr 00:01:23:45:67:89 router nud reachable -\end_layout - -\begin_layout Section -Tabelle der Netzwerkumgebung mit -\begin_inset Quotes sld -\end_inset - -ip -\begin_inset Quotes srd -\end_inset - - editieren -\end_layout - -\begin_layout Subsection -Eintrag manuell hinzufügen -\end_layout - -\begin_layout Standard -Mit folgendem Befehl können Sie einen Eintrag manuell hinzufügen: -\end_layout - -\begin_layout Code - -# ip -6 neigh add lladdr dev -\end_layout - -\begin_layout Standard -Beispiel: -\end_layout - -\begin_layout Code - -# ip -6 neigh add fec0::1 lladdr 02:01:02:03:04:05 dev eth0 -\end_layout - -\begin_layout Subsection -Eintrag manuell entfernen -\end_layout - -\begin_layout Standard -Sie können einen Eintrag auch löschen: -\end_layout - -\begin_layout Code - -# ip -6 neigh del lladdr dev -\end_layout - -\begin_layout Standard -Beispiel: -\end_layout - -\begin_layout Code - -# ip -6 neigh del fec0::1 lladdr 02:01:02:03:04:05 dev eth0 -\end_layout - -\begin_layout Subsection -Erweiterte Einstellungen -\end_layout - -\begin_layout Standard -Das Tool -\begin_inset Quotes sld -\end_inset - -ip -\begin_inset Quotes srd -\end_inset - - ist weniger ausführlich dokumentiert, dennoch ist es sehr mächtig. - Sehen Sie online mit -\begin_inset Quotes sld -\end_inset - -help -\begin_inset Quotes srd -\end_inset - - für weitere Details: -\end_layout - -\begin_layout Code - -# ip -6 neigh help -\end_layout - -\begin_layout Code - -Usage: ip neigh { add | del | change | replace } { ADDR [ lladdr LLADDR - ] -\end_layout - -\begin_layout Code - - [ nud { permanent | noarp | stale | reachable } ] -\end_layout - -\begin_layout Code - - | proxy ADDR } [ dev DEV ] -\end_layout - -\begin_layout Code - - ip neigh {show|flush} [ to PREFIX ] [ dev DEV ] [ nud STATE ] -\end_layout - -\begin_layout Standard -Es sieht aus, als seien manche Optionen ausschließlich für IPv4 gedacht... - Es wird um Ihre Mithilfe gebeten, wenn Sie Informationen zu Optionen und - der erweiterten Anwendung beisteuern können. -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-configuring-ipv6-in-ipv4-tunnels" - -\end_inset - -Konfiguration eines IPv6-in-IPv4 Tunnels -\end_layout - -\begin_layout Standard -\align left -Wenn zum Verlassen des lokalen Netzwerks keine native IPv6-Anbindung vorhanden - ist, wird zum Erreichen des weltweiten IPv6 Internet ein IPv6-in-IPv4 Tunnel - benötigt. -\end_layout - -\begin_layout Standard -Es gibt unterschiedliche Tunnel-Mechanismen sowie einige Möglichkeiten zum - Einrichten eines Tunnels. -\end_layout - -\begin_layout Section -Tunnelarten -\end_layout - -\begin_layout Standard -Es steht Ihnen mehr als eine Möglichkeit zur Verfügung, IPv6 Pakete über - ausschließliche IPv4 Links zu tunneln. -\end_layout - -\begin_layout Subsection -Statische Punkt-zu-Punkt Tunnel -\end_layout - -\begin_layout Standard -Ein Punkt-zu-Punkt Tunnel ist ein dedizierter Tunnel zu einem Endpunkt, - der Kenntnis über das lokale IPv6 Netzwerk (für das Routing zurück...) und - die IPv4 Adresse des Tunnel-Endpunktes verfügt. - Definition des Punkt-zu-Punkt Tunnels siehe: -\lang english - -\begin_inset CommandInset href -LatexCommand href -name "RFC 4213 / Basic Transition Mechanisms for IPv6 Hosts and Routers" -target "http://www.faqs.org/rfcs/rfc4213.html" - -\end_inset - - -\lang ngerman -. - Anforderungen: -\end_layout - -\begin_layout Itemize -Die IPv4 Adresse des lokalen Tunnel-Endpunktes muss statisch sein, global - eindeutig und vom entfernten Tunnel-Endpunkt aus erreichbar sein. -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_deeper -\begin_layout Itemize - -\lang english -Wenn keine statische IPv4 Addresse verfügbar ist, muß der Tunnel-Provider - die Authentifizerung der dynamischen IPv4 Addresse unterstützen, wie z.B. - -\begin_inset CommandInset href -LatexCommand href -name "SixXS / AICCU" -target "http://www.sixxs.net/" - -\end_inset - - oder -\begin_inset CommandInset href -LatexCommand href -name "gogo6" -target "http://gogo6.com/" - -\end_inset - -. -\end_layout - -\end_deeper -\begin_layout Itemize -Sie müssen ein globales IPv6 Präfix zugewiesen bekommen haben. -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_deeper -\begin_layout Itemize - -\lang english -Es ist auch möglich, daß zusätzliche IPv6 Netzwerke über diesen Tunnel geroutet - werden. -\end_layout - -\end_deeper -\begin_layout Itemize -Ein entfernter Tunnel-Endpunkt muss dazu in der Lage sein, ihr IPv6 Präfix - bis zu Ihrem lokalen Tunnel-Endpunkt zu routen (wobei meistens manuelle - Konfiguration notwendig wird). -\end_layout - -\begin_layout Standard -Statische Tunnelprovider: -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "Hurricane Electric" -target "http://he.com/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "SixXS" -target "http://www.sixxs.net/" - -\end_inset - - -\end_layout - -\begin_layout Subsection -Automatische Tunnel -\end_layout - -\begin_layout Standard -Automatisches Tunneln tritt dann ein, wenn ein Knoten direkt einen anderen - Knoten (dessen IPv4-Adresse er zuerst kennen lernen muss) über die IPv4-mapped - IPv6-Adresse anspricht -\lang english -- dieser Mechanismus sollte nicht mehr unterstützt werden, weil er sehr - unsicher ist. -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "tunneling-6to4" - -\end_inset - -6to4 Tunnel -\end_layout - -\begin_layout Standard -6to4 Tunnel ( -\begin_inset CommandInset href -LatexCommand href -name "RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds" -target "http://www.faqs.org/rfcs/rfc3056.html" - -\end_inset - -) verwenden einen einfachen Mechanismus zum erstellen eines automatischen - Tunnels. - Jeder Knoten mit einer weltweit einmaligen IPv4 Adresse kann zu einem 6to4 - Tunnel-Endpunkt gemacht werden (solange keine IPv4-Firewall den Verkehr - unterbindet). - Ein 6to4 Tunnel ist zumeist kein one-to-one Tunnel. - In diesem Fall wird das Untertunneln in einen Upstream- und einen Downstream-Tu -nnel unterteilt. - Ferner zeigt eine spezielle IPv6 Adresse an, dass der Knoten einen 6to4 - Tunnel für die Verbindung zum weltweiten IPv6 Netzwerk verwendet. -\end_layout - -\begin_layout Subsubsection -Erstellen eines 6to4 Präfixes -\end_layout - -\begin_layout Standard -Die 6to4 Adresse wird wie folgt definiert (Schema ist dem -\begin_inset CommandInset href -LatexCommand href -name "RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds" -target "http://www.faqs.org/rfcs/rfc3056.html" - -\end_inset - - entnommen): -\end_layout - -\begin_layout Code - -| 3+13 | 32 | 16 | 64 bits | -\end_layout - -\begin_layout Code - -+---+------+-----------+--------+--------------------------------+ -\end_layout - -\begin_layout Code - -| FP+TLA | V4ADDR | SLA ID | Interface ID | -\end_layout - -\begin_layout Code - -| 0x2002 | | | | -\end_layout - -\begin_layout Code - -+---+------+-----------+--------+--------------------------------+ -\end_layout - -\begin_layout Standard -FP und TLA zusammen haben den Wert 0x2002. - V4ADDR ist die weltweit einmalige IPv4 Adresse des Knoten (in hexadezimaler - Notation). - Mit dem SLA wird das Subnetz identifiziert (65536 lokale Subnetze sind - möglich) und benutzbar, um die lokale Netzwerstruktur abzubilden. -\end_layout - -\begin_layout Standard -Für Gateways wird dieser Präfix normalerweise mit dem SLA -\begin_inset Quotes sld -\end_inset - -0000 -\begin_inset Quotes srd -\end_inset - - definiert und dem 6to4 Tunnel-Interface das Suffix -\begin_inset Quotes sld -\end_inset - -::1 -\begin_inset Quotes srd -\end_inset - - (kann aber auch ein beliebiger mit local-scope sein) zugewiesen. - Zu bemerken ist, dass Microsoft Windows als Suffix auch immer die V4ADDR - einsetzt. -\end_layout - -\begin_layout Subsubsection -6to4 Tunnel zum Upstream -\end_layout - -\begin_layout Standard -Der Knoten muss die Kenntnis darüber haben, an welchen entfernten Tunnel-Endpunk -t die in IPv4 Paketen eingeschlossenen IPv6 Pakete gesendet werden sollen. - In den -\begin_inset Quotes sld -\end_inset - -Anfängen -\begin_inset Quotes srd -\end_inset - - der 6to4 Tunnel-Anwendung wurden dedizierte Upstream akzeptierende Router - definiert. - Liste der Router siehe: -\begin_inset CommandInset href -LatexCommand href -name "NSayer's 6to4 information" -target "http://www.kfu.com/~nsayer/6to4/" - -\end_inset - -. -\end_layout - -\begin_layout Standard -Heute können Upstream Router automatisch mittels der anycast Adresse 192.88.99.1 - gefunden werden. - Routing Protokolle sind für die Verarbeitung im Hintergrund zuständig, - siehe -\begin_inset CommandInset href -LatexCommand href -name "RFC 3068 / An Anycast Prefix for 6to4 Relay Routers" -target "http://www.faqs.org/rfcs/rfc3068.html" - -\end_inset - - für weitere Details. -\end_layout - -\begin_layout Subsubsection -6to4 Tunnel zum Downstream -\end_layout - -\begin_layout Standard -Der Downstream (6bone -> Ihr 6to4 fähiger Node) ist nicht wirklich fix, - er kann von jenem Host variieren, an dem ursprünglich die Pakete gesendet - wurden. - Es gibt zwei Möglichkeiten: -\end_layout - -\begin_layout Itemize -Der entfernte Host benutzt 6to4 und sendet die Pakete direkt an den lokalen - Knoten zurück (siehe unten). -\end_layout - -\begin_layout Itemize -Der entfernte Host sendet die Pakete zurück an das weltweite IPv6 Netzwerk, - und abhängig vom dynamischen Routing, erstellt dann ein Relay-Router eines - ISPs, der 2002::/16 via BGP kundgibt, automatisch zum lokalen Knoten einen - Tunnel. -\end_layout - -\begin_layout Subsubsection -Möglicher 6to4 Verkehr -\end_layout - -\begin_layout Itemize -Vom 6to4 zum 6to4: der Tunnel entsteht normalerweise direkt zwischen den - beiden 6to4 fähigen Hosts. -\end_layout - -\begin_layout Itemize -Vom 6to4 zum non-6to4: Der Datenstrom wird mittels Upstream-Tunnel versendet. -\end_layout - -\begin_layout Itemize -Vom non-6to4 zum 6to4: Der Datenstrom wird mittels Downstream-Tunnel versendet. -\end_layout - -\begin_layout Standard -Achtung, durch das mögliche asymmetrische Routing können Probleme mit defekten - 6to4-Relays schwer zu diagnostizieren sein. -\end_layout - -\begin_layout Subsection - -\lang english -UDP gekapselte IPv6 Tunnels -\end_layout - -\begin_layout Standard - -\lang english -UDP gekapseltes IPv6 Tunneling wird üblicherweise benutzt, wenn am internen - Endpunkt keine globale IPv4 Addresse verfügbar ist, aber via Network Adress - Translation (NAT) noch entsprechende Endpunkte im Internet mit Hilfe unten - beschriebener UDP Ports erreichbar sind. -\end_layout - -\begin_layout Subsubsection - -\lang english -Teredo Tunnel -\end_layout - -\begin_layout Standard - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "RFC 4380 / Teredo: Tunneling IPv6 over UDP through Network Address Translations" -target "http://www.faqs.org/rfcs/rfc4380.html" - -\end_inset - -beschreibt das Tunneln von IPv6 Pakete über IPv4 UDP Pakete (Bubbles), siehe - auch -\begin_inset CommandInset href -LatexCommand href -name "Wikipedia / Teredo" -target "http://de.wikipedia.org/wiki/Teredo" - -\end_inset - -. - Üblicherweise benutzt es 3544/udp. - Der Client für Linux heißt -\begin_inset CommandInset href -LatexCommand href -name "miredo" -target "http://www.remlab.net/miredo/" - -\end_inset - - und ist benutzbar ohne große Konfiguration. - Über diese Tunnelmethode kann nur ein einzelner Client an das globale IPv6-Netz -werk angeschlossen werden. -\end_layout - -\begin_layout Subsubsection - -\lang english -AYIYA Tunnel -\end_layout - -\begin_layout Standard - -\lang english -Tunnel provider -\begin_inset CommandInset href -LatexCommand href -name "SixXS" -target "http://www.sixxs.net/" - -\end_inset - - bietet auch einen IPv6-in-UDP-in-IPv4 (5072/udp) Tunnel an, zur Nutzung - muss der Modus AYIYA aktiviert werden. -\end_layout - -\begin_layout Subsubsection - -\lang english -gogo6 Tunnel -\end_layout - -\begin_layout Standard - -\lang english -Tunnel provider -\begin_inset CommandInset href -LatexCommand href -name "gogo6" -target "http://gogo6.com/" - -\end_inset - - bietet auch einen IPv6-in-UDP-in-IPv4 (3653/udp) Tunnel an, zur Nutzung - muss der Modus v6udpv4 aktiviert werden. -\end_layout - -\begin_layout Section -Bestehende Tunnel anzeigen -\end_layout - -\begin_layout Subsection -Verwendung von "ip" -\end_layout - -\begin_layout Standard -Anwendung: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 tunnel show [] -\end_layout - -\begin_layout Standard -Beispiel: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 tunnel show -\end_layout - -\begin_layout Code - -sit0: ipv6/ip remote any local any ttl 64 nopmtudisc -\end_layout - -\begin_layout Code - -sit1: ipv6/ip remote 195.226.187.50 local any ttl 64 -\end_layout - -\begin_layout Subsection -Verwendung von "route" -\end_layout - -\begin_layout Standard -Anwendung: -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 -\end_layout - -\begin_layout Standard -Beispiel (Ausgabe wurde derart gefiltert, dass nur Tunnels über das virtuelle - Interface sit0 angezeigt werden): -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 | grep " -\backslash -Wsit0 -\backslash -W*$" -\end_layout - -\begin_layout Code - -::/96 :: U 256 2 0 sit0 -\end_layout - -\begin_layout Code - -2002::/16 :: UA 256 0 0 sit0 -\end_layout - -\begin_layout Code - -2000::/3 ::193.113.58.75 UG 1 0 0 sit0 -\end_layout - -\begin_layout Code - -fe80::/10 :: UA 256 0 0 sit0 -\end_layout - -\begin_layout Code - -ff00::/8 :: UA 256 0 0 sit0 -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "conf-ipv6-in-ipv4-point-to-point-tunnels" - -\end_inset - -Einrichtung eines Punkt-zu-Punkt Tunnels -\end_layout - -\begin_layout Standard -Es gibt drei Methoden ein Punkt-zu-Punkt Tunnel hinzuzufügen bzw. - zu entfernen. -\end_layout - -\begin_layout Standard -Eine gute Informationsquelle zum Thema Tunnel-Einrichtung mit -\begin_inset Quotes sld -\end_inset - -ip -\begin_inset Quotes srd -\end_inset - - ist folgender Artikel: -\begin_inset CommandInset href -LatexCommand href -name "Configuring tunnels with iproute2 (article)" -target "http://www.deepspace6.net/docs/iproute2tunnel-en.html" - -\end_inset - - -\lang english - ( -\begin_inset CommandInset href -LatexCommand href -name "Spiegel" -target "http://mirrors.bieringer.de/www.deepspace6.net/docs/iproute2tunnel-en.html" - -\end_inset - -) -\lang ngerman -. -\end_layout - -\begin_layout Subsection -Einen Punkt-zu-Punkt Tunnel hinzufügen -\end_layout - -\begin_layout Subsubsection -Verwendung von "ip" -\end_layout - -\begin_layout Standard -Bei einer kleinen Anzahl von Tunnels ist die Verwendung von -\begin_inset Quotes sld -\end_inset - -ip -\begin_inset Quotes srd -\end_inset - - zurzeit die Standardmethode. -\end_layout - -\begin_layout Standard -Beispiel für das Erstellen eines Tunnel-Devices (das Device wird aber hiermit - nicht aktiviert; ebenso muss ein TTL Wert spezifiziert werden, da der Standardw -ert 0 ist): -\end_layout - -\begin_layout Code - -# /sbin/ip tunnel add mode sit ttl remote -\end_layout - -\begin_layout Code - -¬ local -\end_layout - -\begin_layout Standard -Anwendung (drei allgemeine Beispiele): -\end_layout - -\begin_layout Code - -# /sbin/ip tunnel add sit1 mode sit ttl remote -\end_layout - -\begin_layout Code - -¬ local -\end_layout - -\begin_layout Code - -# /sbin/ip link set dev sit1 up -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route add dev sit1 metric 1 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/ip tunnel add sit2 mode sit ttl -\end_layout - -\begin_layout Code - -¬ local -\end_layout - -\begin_layout Code - -# /sbin/ip link set dev sit2 up -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route add dev sit2 metric 1 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/ip tunnel add sit3 mode sit ttl -\end_layout - -\begin_layout Code - -¬ local -\end_layout - -\begin_layout Code - -# /sbin/ip link set dev sit3 up -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route add dev sit3 metric 1 -\end_layout - -\begin_layout Subsubsection -Verwendung von "ifconfig" und "route" (nicht empfehlenswert) -\end_layout - -\begin_layout Standard -\align left -Diese Methode zum Hinzufügen eines Tunnels wird nicht empfohlen, da Ungereimthei -ten auftreten. - Es gibt keine Probleme, wenn nur ein Tunnel hinzugefügt wird. - Werden hingegen mehrere Tunnel hinzugefügt, dann kann der erste Tunnel - nicht einfach deaktiviert werden, wenn die restlichen Tunnel aktiviert - bleiben sollen. -\end_layout - -\begin_layout Standard -Anwendung (drei allgemeine Beispiele): -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit0 up -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit0 tunnel -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit1 up -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 add dev sit1 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit0 tunnel -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit2 up -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 add dev sit2 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit0 tunnel -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit3 up -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 add dev sit3 -\end_layout - -\begin_layout Standard -WICHTIG: NICHT VERWENDEN! Mit diesem Setup wird von überall aus dem Internet - das "automatische Tunneln" vorbehaltlos aktiviert. - Das ist ein unnötiges Risiko. -\end_layout - -\begin_layout Subsubsection -Verwendung allein von "route" -\end_layout - -\begin_layout Standard -\align left -Sie können einen Tunnel auch im NBMA-Stil (Non Broadcast Multiple Access) - einrichten. - Bei dieser Vorgehensweise können Sie sehr einfach mehrere Tunnels zugleich - einrichten, aber kein Tunnel kann nummeriert werden (und das ist ein kein - benötigtes Feature). - -\end_layout - -\begin_layout Standard -Anwendung (drei allgemeine Beispiele): -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit0 up -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 add gw -\end_layout - -\begin_layout Code - -¬ :: dev sit0 -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 add gw -\end_layout - -\begin_layout Code - -¬ :: dev sit0 -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 add gw -\end_layout - -\begin_layout Code - -¬ :: dev sit0 -\end_layout - -\begin_layout Standard -WICHTIG: NICHT VERWENDEN! Mit diesem Setup wird von überall aus dem Internet - das "automatische Tunneln" vorbehaltlos aktiviert. - Das ist ein unnötiges Risiko. -\end_layout - -\begin_layout Subsection -Punkt-zu-Punkt Tunnel entfernen -\end_layout - -\begin_layout Standard -\align left -Diese Funktion wird selten manuell durchgeführt. - Skripte verwenden diese Funktion zum sauberen deaktivieren bzw. - beim Neustart einer IPv6 Konfiguration. -\end_layout - -\begin_layout Subsubsection -Verwendung von "ip" -\end_layout - -\begin_layout Standard -Entfernen eines Tunnel-Devices: -\end_layout - -\begin_layout Code - -# /sbin/ip tunnel del -\end_layout - -\begin_layout Standard -Anwendung (drei allgemeine Beispiele): -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route del dev sit1 -\end_layout - -\begin_layout Code - -# /sbin/ip link set sit1 down -\end_layout - -\begin_layout Code - -# /sbin/ip tunnel del sit1 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route del dev sit2 -\end_layout - -\begin_layout Code - -# /sbin/ip link set sit2 down -\end_layout - -\begin_layout Code - -# /sbin/ip tunnel del sit2 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route del dev sit3 -\end_layout - -\begin_layout Code - -# /sbin/ip link set sit3 down -\end_layout - -\begin_layout Code - -# /sbin/ip tunnel del sit3 -\end_layout - -\begin_layout Subsubsection -Verwendung von "ifconfig" und "route" (nicht empfehlenswert, da unbequem) -\end_layout - -\begin_layout Standard -\align left -Nicht nur bei der Erstellung eines Tunnels kommt es zu Ungereimtheiten, - sondern auch bei dessen Entfernung. - Die Tunnel müssen in umgekehrter Reihenfolge wieder entfernt werden, d.h. - der zuletzt erstellte Tunnel muss als Erster entfernt werden... -\end_layout - -\begin_layout Standard -Anwendung (drei allgemeine Beispiele): -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 del dev sit3 -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit3 down -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 del dev sit2 -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit2 down -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 add dev sit1 -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit1 down -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit0 down -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Subsubsection -Verwendung von "route" -\end_layout - -\begin_layout Standard -Die Vorgehensweise ist vergleichbar mit dem löschen einer normalen IPv6 - Route. -\end_layout - -\begin_layout Standard -Anwendung (drei allgemeine Beispiele): -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 del gw -\end_layout - -\begin_layout Code - -¬ :: dev sit0 -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 del gw -\end_layout - -\begin_layout Code - -¬ :: dev sit0 -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 del gw -\end_layout - -\begin_layout Code - -¬ :: dev sit0 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit0 down -\end_layout - -\begin_layout Subsection -Nummerierte Punkt-zu-Punkt Tunnel -\end_layout - -\begin_layout Standard -Manchmal ist es notwendig, einen Punkt-zu-Punkt Tunnel mit IPv6 Adresse - genauso einzurichten, wie heute bei IPv4. - Dies ist nur mit der ersten (ifconfig+route - nicht empfehlenswert) sowie - mit der dritten (ip+route) beschriebenen Methode zur Einrichtung eines - Tunnels möglich. - Bei diesen Fällen können Sie den Tunnel-Interfaces die IPv6 Adressen, wie - im Abschnitt zur Interface-Konfiguration beschrieben, hinzufügen. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "configuring-ipv6to4-tunnels" - -\end_inset - -Einrichtung von 6to4 Tunnel -\end_layout - -\begin_layout Standard -Beachten sie Bitte, dass 6to4 Tunnel im Standard-Kernel der Serie 2.2.x (siehe - -\begin_inset CommandInset ref -LatexCommand ref -name "systemcheck/kernel" -reference "systemcheck-kernel" - -\end_inset - -) nicht unterstützt werden. - Weiter ist zu beachten, dass die Präfix-Länge für 6to4 Adressen 16 ist, - da sich aus Perspektive des Netzwerks betrachtet, alle anderen 6to4 Hosts - sich in der gleichen Schicht 2 befinden. - -\end_layout - -\begin_layout Subsection -6to4 Tunnel hinzufügen -\end_layout - -\begin_layout Standard -Zu Anfang müssen Sie Ihre 6to4 Präfix-Länge mittels der lokal zugewiesenen - global routbaren IPv4 Adresse berechnen (sollte ihr Host keine global routebare - IPv4 Adresse haben, dann ist unter speziellen Bedingungen NAT auf dem Border - Gateway möglich): -\end_layout - -\begin_layout Standard -Angenommen, Ihre IPv4 Adresse ist: -\end_layout - -\begin_layout Code - -1.2.3.4 -\end_layout - -\begin_layout Standard -Dann ist das daraus resultierende 6to4 Präfix: -\end_layout - -\begin_layout Code - -2002:0102:0304:: -\end_layout - -\begin_layout Standard -Lokalen 6to4 Gateways sollte immer (ist aber kein Muss, ein beliebiger local-sco -pe Suffix kann benutzt werden) das Suffix -\begin_inset Quotes sld -\end_inset - -::1 -\begin_inset Quotes srd -\end_inset - - zugewiesen werden. - Daraus resultierend ergibt sich Ihre lokale 6to4 Adresse: -\end_layout - -\begin_layout Code - -2002:0102:0304::1 -\end_layout - -\begin_layout Standard -Zum automatischen Erstellen der Adresse können Sie folgenden Befehl nutzen: -\end_layout - -\begin_layout Code - -ipv4="1.2.3.4"; printf "2002:%02x%02x:%02x%02x::1" `echo $ipv4 | tr "." " "` -\end_layout - -\begin_layout Standard -Es gibt nun zwei Möglichkeiten einen 6to4 Tunnel einzurichten. -\end_layout - -\begin_layout Subsubsection -Verwendung von "ip" und einem dedizierten Tunnel-Device -\end_layout - -\begin_layout Standard -Die empfohlene Vorgehensweise (der Wert TTL muss angegeben werden, da der - Standardwert 0 ist): -\end_layout - -\begin_layout Standard -Erstellen eines neues Tunnel-Device: -\end_layout - -\begin_layout Code - -# /sbin/ip tunnel add tun6to4 mode sit ttl remote any local -\end_layout - -\begin_layout Code - -¬ -\end_layout - -\begin_layout Standard -Interface aktivieren: -\end_layout - -\begin_layout Code - -# /sbin/ip link set dev tun6to4 up -\end_layout - -\begin_layout Standard -Eine lokale 6to4 Adresse am Interface hinzufügen (Hinweis: Präfix-Länge - 16 ist wichtig!) -\end_layout - -\begin_layout Code - -# /sbin/ip -6 addr add /16 dev tun6to4 -\end_layout - -\begin_layout Standard -Hinzufügen der (Standard-) Route zum globalen IPv6 Netz unter Verwendung - der all-6to4-routers IPv4 anycast Adresse: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route add default via ::192.88.99.1 dev tun6to4 metric 1 -\end_layout - -\begin_layout Standard - -\lang english -Manche Versionen von -\begin_inset Quotes sld -\end_inset - -ip -\begin_inset Quotes srd -\end_inset - - (z.B. - SuSE Linux 9.0) unterstützen keine IPv4-kompatiblen IPv6-Adressen für Gateways, - in diesem Fall muss die entsprechende IPv6-Adresse benutzt werden: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route add default via 2002:c058:6301::1 dev tun6to4 metric - 1 -\end_layout - -\begin_layout Subsubsection -Verwendung von "ifconfig" und "route" sowie einem generischen Tunnel-Device - "sit0" (nicht empfehlenswert) -\end_layout - -\begin_layout Standard -Diese Vorgehensweise wird nicht empfohlen, da bei Verwendung des allgemeinen - Tunnel Device sit0 keine Filter-Spezifizierung pro Device ermöglicht wird. -\end_layout - -\begin_layout Standard -Das allgemeine Tunnel Interface sit0 aktivieren: -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit0 up -\end_layout - -\begin_layout Standard -Dem Interface eine lokale 6to4 Adresse hinzufügen: -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit0 add /16 -\end_layout - -\begin_layout Standard -Hinzufügen der (Standard-) Route zum globalen IPv6 Netz unter Verwendung - der all-6to4-routers IPv4 anycast Adresse: -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 add default gw ::192.88.99.1 dev sit0 -\end_layout - -\begin_layout Subsection -6to4 Tunnel entfernen -\end_layout - -\begin_layout Subsubsection -Verwendung von "ip" und einem dedizierten Tunnel-Device -\end_layout - -\begin_layout Standard -Entfernen aller Routen über dieses bestimmten Tunnel Devices: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route flush dev tun6to4 -\end_layout - -\begin_layout Standard -Interface deaktivieren: -\end_layout - -\begin_layout Code - -# /sbin/ip link set dev tun6to4 down -\end_layout - -\begin_layout Standard -Ein erstelltes Tunnel Device entfernen: -\end_layout - -\begin_layout Code - -# /sbin/ip tunnel del tun6to4 -\end_layout - -\begin_layout Subsubsection -Verwendung von "ifconfig" und "route" sowie einem generischen Tunnel-Device - "sit0" (nicht empfehlenswert) -\end_layout - -\begin_layout Standard -Entfernen der (Standard-) Route über ein 6to4 Tunnel Device: -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 del default gw ::192.88.99.1 dev sit0 -\end_layout - -\begin_layout Standard -Eine 6to4 Adresse des Interfaces entfernen: -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit0 del /16 -\end_layout - -\begin_layout Standard -Ein allgemeines Tunnel Device deaktivieren (aber Achtung, eventuell ist - das Interface noch in Verwendung...) -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit0 down -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-configuring-ipv4-in-ipv6-tunnels" - -\end_inset - -Konfiguration eines IPv4-in-IPv6 Tunnels -\end_layout - -\begin_layout Standard - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "RFC 2473 / Generic Packet Tunneling in IPv6 Specification" -target "http://www.faqs.org/rfcs/rfc2473.html" - -\end_inset - - spezifiziert den Mechanismus, um unterschiedliche Pakettypen (einschließlich - IPv4) über IPv6 zu tunneln. -\end_layout - -\begin_layout Standard - -\lang english -ANMERKUNG: Unterstützung für IPv4-in-IPv6 Tunnel ist erst seit Kernel Version - 2.6.22 verfügbar. -\end_layout - -\begin_layout Section - -\lang english -Anzeigen von existierenden Tunnels -\end_layout - -\begin_layout Standard - -\lang english -Anwendung: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 tunnel show [] -\end_layout - -\begin_layout Standard - -\lang english -Beispiel: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 tunnel show mode any -\end_layout - -\begin_layout Code - -ip6tnl0: ipv6/ipv6 remote :: local :: encaplimit 0 hoplimit 0 tclass 0x00 - flowlabel 0x00000 (flowinfo 0x00000000) -\end_layout - -\begin_layout Code - -ip6tnl1: ip/ipv6 remote fd00:0:0:2::a local fd00:0:0:2::1 dev eth1 encaplimit - 4 hoplimit 64 tclass 0x00 flowlabel 0x00000 (flowinfo 0x00000000) -\end_layout - -\begin_layout Standard - -\lang english -ANMERKUNG: wenn "mode any" nicht angegeben wird, werde nur IPv6-in-IPv6 - Tunnels angezeigt. -\end_layout - -\begin_layout Section - -\lang english -Konfiguration eines Punkt-zu-Punkt Tunnels -\end_layout - -\begin_layout Standard - -\lang english -Anwendung für die Erzeugung einer 4over6 Tunnel-Schnittstelle (welche danach - aber noch nicht aktiv ist) -\end_layout - -\begin_layout Code - -# /sbin/ip tunnel add mode ip4ip6 remote - local -\end_layout - -\begin_layout Standard - -\lang english -Anwendung (allgemeines Beispiel für drei Tunnels): -\end_layout - -\begin_layout Code - -# /sbin/ip -6 tunnel add ip6tnl1 mode ip4ip6 remote local -\end_layout - -\begin_layout Code - -# /sbin/ip link set dev ip6tnl1 up -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route add dev ip6tnl1 metric 1 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/ip -6 tunnel add ip6tnl2 mode ip4ip6 remote local -\end_layout - -\begin_layout Code - -# /sbin/ip link set dev ip6tnl2 up -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route add dev ip6tnl2 metric 1 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/ip -6 tunnel add ip6tnl3 mode ip4ip6 remote local -\end_layout - -\begin_layout Code - -# /sbin/ip link set dev ip6tnl3 up -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route add dev ip6tnl3 metric 1 -\end_layout - -\begin_layout Section - -\lang english -Löschen von Punkt-zu-Punkt-Tunnels -\end_layout - -\begin_layout Standard - -\lang english -Anwendung für das Löschen einer Tunnel-Schnittstelle: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 tunnel del -\end_layout - -\begin_layout Standard - -\lang english -Anwendung (allgemeines Beispiel für drei Tunnels): -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route del dev ip6tnl1 -\end_layout - -\begin_layout Code - -# /sbin/ip link set ip6tnl1 down -\end_layout - -\begin_layout Code - -# /sbin/ip -6 tunnel del ip6tnl1 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route del dev ip6tnl2 -\end_layout - -\begin_layout Code - -# /sbin/ip link set ip6tnl2 down -\end_layout - -\begin_layout Code - -# /sbin/ip -6 tunnel del ip6tnl2 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route del dev ip6tnl3 -\end_layout - -\begin_layout Code - -# /sbin/ip link set ip6tnl3 down -\end_layout - -\begin_layout Code - -# /sbin/ip -6 tunnel del ip6tnl3 -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-kernel-settings" - -\end_inset - -Kernel-Einstellungen im /proc-Dateisystem -\end_layout - -\begin_layout Standard -\begin_inset CommandInset label -LatexCommand label -name "proc-filesystem" - -\end_inset - -Anmerkung: Dieses Kapitel basiert großteils auf der Datei -\begin_inset Quotes sld -\end_inset - -ip-sysctl.txt -\begin_inset Quotes srd -\end_inset - -, welche in den aktuellen Kernel-Quellen im Verzeichnis -\begin_inset Quotes sld -\end_inset - -Documentation/networking -\begin_inset Quotes srd -\end_inset - - zu finden ist. - Danke an dieser Stelle an Pekka Savola, der den IPv6 relevanten Inhalt - dieser Datei wartet und betreut. - Ebenso sei erwähnt, dass einige Textstellen hieraus mehr oder weniger mit - Copy & Paste in dieses Dokument übernommen wurden. -\end_layout - -\begin_layout Section -Zugriff auf das /proc-Dateisystem -\end_layout - -\begin_layout Subsection -Verwendung von "cat" und "echo" -\end_layout - -\begin_layout Standard -Mit -\begin_inset Quotes sld -\end_inset - -cat -\begin_inset Quotes srd -\end_inset - - und -\begin_inset Quotes sld -\end_inset - -echo -\begin_inset Quotes srd -\end_inset - - können Sie am einfachsten das /proc Dateisystem einsehen. - Hierfür gibt es aber einige Voraussetzungen, die erfüllt sein müssen: -\end_layout - -\begin_layout Itemize -Das /proc-Dateisystem muss im Kernel aktiviert sein. - Hierfür muss die folgende Einstellung beim kompilieren des Kernels vorgenommen - werden: -\end_layout - -\begin_layout Code - -CONFIG_PROC_FS=y -\end_layout - -\begin_layout Itemize -Das /proc-Dateisystem muss zuerst gemountet sein. - Dies kann wie folgt getestet werden: -\end_layout - -\begin_layout Code - -# mount | grep "type proc" -\end_layout - -\begin_layout Code - -none on /proc type proc (rw) -\end_layout - -\begin_layout Itemize -Sie benötigen Lese- und manchmal auch Schreib-Zugriff (normalerweise nur - als Root-Benutzer) auf das /proc-Dateisystem. -\end_layout - -\begin_layout Standard -Normalerweise sind, mit Ausnahme in /proc/sys/*, alle Einträge ausschließlich - mit Leserechten ausgestattet. - Die Einträge werden zum Zweck der Informationsgewinnung verwendet. -\end_layout - -\begin_layout Subsubsection -Wert anzeigen -\end_layout - -\begin_layout Standard -Den Inhalt eines Eintrags können sie mit -\begin_inset Quotes sld -\end_inset - -cat -\begin_inset Quotes srd -\end_inset - - anzeigen: -\end_layout - -\begin_layout Code - -# cat /proc/sys/net/ipv6/conf/all/forwarding -\end_layout - -\begin_layout Code - -0 -\end_layout - -\begin_layout Subsubsection -Wert einstellen -\end_layout - -\begin_layout Standard -Mit -\begin_inset Quotes sld -\end_inset - -echo -\begin_inset Quotes srd -\end_inset - - können sie einen neuen Wert zuweisen (nur wenn der Eintrag beschreibbar - ist): -\end_layout - -\begin_layout Code - -# echo "1" >/proc/sys/net/ipv6/conf/all/forwarding -\end_layout - -\begin_layout Subsection -Verwendung von "sysctl" -\end_layout - -\begin_layout Standard -Die Verwendung des Programms -\begin_inset Quotes sld -\end_inset - -sysctl -\begin_inset Quotes srd -\end_inset - - ist eine zeitgemäße Methode zum Anzeigen der Kernel-Switches. - Es funktioniert auch dann, wenn das /proc-Dateisystem nicht gemountet ist, - wobei aber nur ein Zugriff auf /proc/sys/* möglich ist! -\end_layout - -\begin_layout Standard -Das Programm -\begin_inset Quotes sld -\end_inset - -sysctl -\begin_inset Quotes srd -\end_inset - - ist (auf Red Hat Linux Systemen) im Paket -\begin_inset Quotes sld -\end_inset - -procps -\begin_inset Quotes srd -\end_inset - - enthalten. -\end_layout - -\begin_layout Itemize -Das sysctl-Interface muss im Kernel aktiviert sein. - Hierfür muss die folgende Einstellung beim kompilieren des Kernels vorgenommen - werden: -\end_layout - -\begin_layout Code - -CONFIG_SYSCTL=y -\end_layout - -\begin_layout Subsubsection -Wert anzeigen -\end_layout - -\begin_layout Standard -Der Wert eines Eintrags kann nun angezeigt werden: -\end_layout - -\begin_layout Code - -# sysctl net.ipv6.conf.all.forwarding -\end_layout - -\begin_layout Code - -net.ipv6.conf.all.forwarding = 0 -\end_layout - -\begin_layout Subsubsection -Wert einstellen -\end_layout - -\begin_layout Standard -Ein neuer Wert kann wie folgt zugewiesen werden (wenn der Eintrag beschreibbar - ist): -\end_layout - -\begin_layout Code - -# sysctl -w net.ipv6.conf.all.forwarding=1 -\end_layout - -\begin_layout Code - -net.ipv6.conf.all.forwarding = 1 -\end_layout - -\begin_layout Standard -Anmerkung: Verwenden Sie beim setzen eines Wertes keine Leerzeichen vor - oder nach dem -\begin_inset Quotes sld -\end_inset - -= -\begin_inset Quotes srd -\end_inset - -. - Sollten Sie mehrere Werte in einer Zeile angeben, müssen sie diese mit - Anführungszeichen umgeben: -\end_layout - -\begin_layout Code - -# sysctl -w net.ipv4.ip_local_port_range="32768 61000" -\end_layout - -\begin_layout Code - -net.ipv4.ip_local_port_range = 32768 61000 -\end_layout - -\begin_layout Subsubsection -Sonstiges -\end_layout - -\begin_layout Standard -Anmerkung: Es gibt sysctl-Versionen im Umlauf, die anstelle des Punktes - -\begin_inset Quotes sld -\end_inset - -. -\begin_inset Quotes srd -\end_inset - - einen slash -\begin_inset Quotes sld -\end_inset - -/ -\begin_inset Quotes srd -\end_inset - - ausgeben. -\end_layout - -\begin_layout Standard -Für weitere Details siehe die manpage von sysctl. -\end_layout - -\begin_layout Standard -Hinweise: Um schnell einen Überblick über die Einstellungen zu bekommen, - verwenden Sie einfach die Option -\begin_inset Quotes sld -\end_inset - --a -\begin_inset Quotes srd -\end_inset - - (anzeigen aller Einträge) sowie das Tool -\begin_inset Quotes sld -\end_inset - -grep -\begin_inset Quotes srd -\end_inset - -. -\end_layout - -\begin_layout Subsection -Werte im /proc-Dateisystem -\end_layout - -\begin_layout Standard -Es gibt im /proc-Dateisystem unterschiedliche Formate: -\end_layout - -\begin_layout Itemize -BOOLEAN: einfach eine -\begin_inset Quotes sld -\end_inset - -0 -\begin_inset Quotes srd -\end_inset - - (falsch) oder eine -\begin_inset Quotes sld -\end_inset - -1 -\begin_inset Quotes srd -\end_inset - - (wahr) -\end_layout - -\begin_layout Itemize -INTEGER: Wert ist eine Ganzzahl (kann auch eine unsigned int sein) -\end_layout - -\begin_layout Itemize -Kompliziertere Zeilen mit verschiedenen Werten: manchmal wir eine Header-Zeile - mit angezeigt... - Sie können aber auch weitere Informationen zu den Werten und deren Bedeutung - direkt in den Kernel Quellen beziehen. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "proc-sys-net-ipv6" - -\end_inset - -Einträge in /proc/sys/net/ipv6/ -\end_layout - -\begin_layout Subsection -conf/default/* -\end_layout - -\begin_layout Standard -Ändern der Interface-spezifischen Einstellungen. -\end_layout - -\begin_layout Subsection -conf/all/* -\end_layout - -\begin_layout Standard -Ändern aller Interface-spezifischen Einstellungen. -\end_layout - -\begin_layout Standard -Ausnahme: -\begin_inset Quotes sld -\end_inset - -conf/all/forwarding -\begin_inset Quotes srd -\end_inset - - hat hier eine andere Bedeutung: -\end_layout - -\begin_layout Subsubsection -conf/all/forwarding -\end_layout - -\begin_layout Itemize -Typ: BOOLEAN -\end_layout - -\begin_layout Standard -Hiermit wird die globale IPv6 Weiterleitung zwischen allen Interfaces aktiviert. -\end_layout - -\begin_layout Standard -In IPv6 ist kein forwarding per Device möglich. - Die Steuerung der Weiterleitung muss mittels IPv6-netfilter Regel-Sets - (mit dem Programm ip6tables) und der Bestimmung der Ein- und Ausgabe-Devices - (siehe -\begin_inset CommandInset ref -LatexCommand ref -name "Firewalling/Netfilter6" -reference "firewalling-netfilter6" - -\end_inset - - für Details) vollzogen werden. - In IPv4 ist das anders, forwarding per device ist hier möglich (hier wird - am Interface, wo das Paket einlangt, die entsprechende Entscheidung getroffen). -\end_layout - -\begin_layout Standard -Hiermit werden die Host/Router Einstellungen 'forwarding' aller Interfaces - eingestellt (auch globales Forwarding genannt). - Für weitere Details Siehe unten. - -\end_layout - -\begin_layout Standard -Ist der Wert gleich 0, dann ist IPv6 forwarding deaktiviert. - Pakete verlassen in diesem Fall niemals ein anderes Interface (weder physikalis -che noch logische wie z.B. - Tunnel). -\end_layout - -\begin_layout Subsection -conf/interface/* -\end_layout - -\begin_layout Standard -Spezielle Einstellungen per Interface ändern. -\end_layout - -\begin_layout Standard -Das funktionale Verhalten einzelner Einstellungen ist davon abhängig, ob - lokales forwarding aktiviert ist oder nicht. -\end_layout - -\begin_layout Subsubsection -accept_ra -\end_layout - -\begin_layout Itemize -Typ: BOOLEAN -\end_layout - -\begin_layout Itemize -Standardeinstellung: aktiviert, wenn lokales forwarding deaktiviert ist. - Deaktiviert, wenn lokales forwarding aktiviert ist. -\end_layout - -\begin_layout Standard -Router Advertisements werden akzeptiert; das Interface wird mit Status 'received - data' automatisch konfiguriert. -\end_layout - -\begin_layout Subsubsection -accept_redirects -\end_layout - -\begin_layout Itemize -Typ: BOOLEAN -\end_layout - -\begin_layout Itemize -Standardeinstellung: aktiviert, wenn lokales forwarding deaktiviert ist. - Deaktiviert, wenn lokales forwarding aktiviert ist. -\end_layout - -\begin_layout Standard -Akzeptiert von IPv6 Router gesendete Redirects. -\end_layout - -\begin_layout Subsubsection -autoconf -\end_layout - -\begin_layout Itemize - -\lang english -Typ: BOOLEAN -\end_layout - -\begin_layout Itemize - -\lang english -Funktionale Standardeinstellung: aktiviert, wenn accept_ra_pinfo aktiv ist. - Deaktiviert, wenn accept_ra_pinfo deaktiviert ist. -\end_layout - -\begin_layout Standard - -\lang english -Autokonfiguriert Adressen unter Benutzung der Prefix-Information eines Router-Ad -vertisements. -\end_layout - -\begin_layout Subsubsection -dad_transmits -\end_layout - -\begin_layout Itemize -Typ: INTEGER -\end_layout - -\begin_layout Itemize -Standardwert: 1 -\end_layout - -\begin_layout Standard -Die Anzahl der gesendeten Proben zum entdecken von Adress-Duplikaten. - -\end_layout - -\begin_layout Subsubsection -forwarding -\end_layout - -\begin_layout Itemize -Typ: BOOLEAN -\end_layout - -\begin_layout Itemize -Standardwert: FALSCH, wenn globale forwarding deaktiviert ist (Standard), - ansonst WAHR -\end_layout - -\begin_layout Standard -Konfigurieren von Interface-spezifischem Host/Router-Verhalten. -\end_layout - -\begin_layout Standard -Anmerkung: Es wird die gleiche Konfiguration für alle Interfaces empfohlen; - Gemischte Host/Router-Szenarios sind eher unüblich. -\end_layout - -\begin_layout Itemize -Wert FALSCH: Per Standard wird von einem Host-Verhalten ausgegangen. - Das bedeutet: -\end_layout - -\begin_layout Enumerate -Der Schalter IsRouter ist bei Router Advertisements nicht aktiviert. -\end_layout - -\begin_layout Enumerate -Router-Anfragen werden bei Bedarf gesendet. -\end_layout - -\begin_layout Enumerate -Wenn accept_ra WAHR ist (Standard), dann werden Router Advertisements akzeptiert - (und starte die automatische Konfiguration). -\end_layout - -\begin_layout Enumerate -Wenn accept_redirects WAHR ist (Standard), dann akzeptiere Redirects. -\end_layout - -\begin_layout Itemize -Wert WAHR: Ist lokales forwarding eingeschaltet, dann wird von einem Router-Verh -alten ausgegangen. - Das bedeutet genau das Gegenteil zu oben: -\end_layout - -\begin_layout Enumerate -Der Schalter IsRouter ist bei Router Advertisements aktiviert. -\end_layout - -\begin_layout Enumerate -Router-Anfragen werden nicht gesendet. -\end_layout - -\begin_layout Enumerate -Router Advertisements werden ignoriert. -\end_layout - -\begin_layout Enumerate -Redirects werden ignoriert. -\end_layout - -\begin_layout Subsubsection -hop_limit -\end_layout - -\begin_layout Itemize -Typ: INTEGER -\end_layout - -\begin_layout Itemize -Standardwert: 64 -\end_layout - -\begin_layout Standard -Der Standardwert für das Hop-Limit wird hiermit eingestellt. -\end_layout - -\begin_layout Subsubsection -mtu -\end_layout - -\begin_layout Itemize -Type: INTEGER -\end_layout - -\begin_layout Itemize -Standardwert: 1280 (Minimumwert in IPv6) -\end_layout - -\begin_layout Standard -Der Standardwert für die Maximum Transfer Unit wird hiermit eingestellt. -\end_layout - -\begin_layout Subsubsection -router_solicitation_delay -\end_layout - -\begin_layout Itemize -Typ: INTEGER -\end_layout - -\begin_layout Itemize -Standardwert: 1 -\end_layout - -\begin_layout Standard -Die Anzahl der nach der Aktivierung eines Interfaces zu wartenden Sekunden - bevor Router-Anfragen gesendet werden. -\end_layout - -\begin_layout Subsubsection -router_solicitation_interval -\end_layout - -\begin_layout Itemize -Typ: INTEGER -\end_layout - -\begin_layout Itemize -Standardwert: 4 -\end_layout - -\begin_layout Standard -Die Anzahl der Sekunden zwischen Router-Anfragen. -\end_layout - -\begin_layout Subsubsection -router_solicitations -\end_layout - -\begin_layout Itemize -Typ: INTEGER -\end_layout - -\begin_layout Itemize -Standardwert: 3 -\end_layout - -\begin_layout Standard -Die Anzahl der Router-Anfragen, bevor angenommen wird, dass keine Router - verfügbar sind. -\end_layout - -\begin_layout Subsection -neigh/default/* -\end_layout - -\begin_layout Standard -Standardeinstellungen der Neighbor-Erkennung und einige spezielle globale - Intervall- sowie Threshold-Werte ändern: -\end_layout - -\begin_layout Subsubsection -gc_thresh1 -\end_layout - -\begin_layout Itemize -Typ: INTEGER -\end_layout - -\begin_layout Itemize -Standardwert: 128 -\end_layout - -\begin_layout Standard -Mehr Infos hierzu in späteren Versionen. -\end_layout - -\begin_layout Subsubsection -gc_thresh2 -\end_layout - -\begin_layout Itemize -Typ: INTEGER -\end_layout - -\begin_layout Itemize -Standardwert: 512 -\end_layout - -\begin_layout Standard -Mehr Infos hierzu in späteren Versionen. -\end_layout - -\begin_layout Subsubsection -gc_thresh3 -\end_layout - -\begin_layout Itemize -Typ: INTEGER -\end_layout - -\begin_layout Itemize -Standardwert: 1024 -\end_layout - -\begin_layout Standard -Parameter zum Einstellen der Größe der Neighbour-Tabelle. -\end_layout - -\begin_layout Standard -Wenn Sie viele Interfaces und Probleme mit inkorrekt oder nicht funktionierenden - Routen haben, dann sollten Sie diesen Wert erhöhen. - Ebenfalls erhöhen sollten Sie den Wert, wenn von einem aktiven -\begin_inset CommandInset href -LatexCommand href -name "Zebra (routing daemon)" -target "http://www.zebra.org/" - -\end_inset - - Folgendes angezeigt wird: -\end_layout - -\begin_layout Code - -ZEBRA: netlink-listen error: No buffer space available, type=RTM_NEWROUTE(24), -\end_layout - -\begin_layout Code - -¬ seq=426, pid=0 -\end_layout - -\begin_layout Subsubsection -gc_interval -\end_layout - -\begin_layout Itemize -Typ: INTEGER -\end_layout - -\begin_layout Itemize -Standardwert: 30 -\end_layout - -\begin_layout Standard -Mehr Infos hierzu in späteren Versionen. -\end_layout - -\begin_layout Subsection -neigh/interface/* -\end_layout - -\begin_layout Standard -Per Interface ändern spezieller Einstellungen zur Neighbor-Erkennung. -\end_layout - -\begin_layout Subsubsection -anycast_delay -\end_layout - -\begin_layout Itemize -Typ: INTEGER -\end_layout - -\begin_layout Itemize -Standardwert: 100 -\end_layout - -\begin_layout Standard -Mehr Infos hierzu in späteren Versionen. -\end_layout - -\begin_layout Subsubsection -gc_stale_time -\end_layout - -\begin_layout Itemize -Typ: INTEGER -\end_layout - -\begin_layout Itemize -Standardwert: 60 -\end_layout - -\begin_layout Standard -Mehr Infos hierzu in späteren Versionen. -\end_layout - -\begin_layout Subsubsection -proxy_qlen -\end_layout - -\begin_layout Itemize -Typ: INTEGER -\end_layout - -\begin_layout Itemize -Standardwert: 64 -\end_layout - -\begin_layout Standard -Mehr Infos hierzu in späteren Versionen. -\end_layout - -\begin_layout Subsubsection -unres_qlen -\end_layout - -\begin_layout Itemize -Typ: INTEGER -\end_layout - -\begin_layout Itemize -Standardwert: 3 -\end_layout - -\begin_layout Standard -Mehr Infos hierzu in späteren Versionen. -\end_layout - -\begin_layout Subsubsection -app_solicit -\end_layout - -\begin_layout Itemize -Typ: INTEGER -\end_layout - -\begin_layout Itemize -Standardwert: 0 -\end_layout - -\begin_layout Standard -Mehr Infos hierzu in späteren Versionen. -\end_layout - -\begin_layout Subsubsection -locktime -\end_layout - -\begin_layout Itemize -Typ: INTEGER -\end_layout - -\begin_layout Itemize -Standardwert: 0 -\end_layout - -\begin_layout Standard -Mehr Infos hierzu in späteren Versionen. -\end_layout - -\begin_layout Subsubsection -retrans_time -\end_layout - -\begin_layout Itemize -Typ: INTEGER -\end_layout - -\begin_layout Itemize -Standardwert: 100 -\end_layout - -\begin_layout Standard -Mehr Infos hierzu in späteren Versionen. -\end_layout - -\begin_layout Subsubsection -base_reachable_time -\end_layout - -\begin_layout Itemize -Typ: INTEGER -\end_layout - -\begin_layout Itemize -Standardwert: 30 -\end_layout - -\begin_layout Standard -Mehr Infos hierzu in späteren Versionen. -\end_layout - -\begin_layout Subsubsection -mcast_solicit -\end_layout - -\begin_layout Itemize -Typ: INTEGER -\end_layout - -\begin_layout Itemize -Standardwert: 3 -\end_layout - -\begin_layout Standard -Mehr Infos hierzu in späteren Versionen. -\end_layout - -\begin_layout Subsubsection -ucast_solicit -\end_layout - -\begin_layout Itemize -Typ: INTEGER -\end_layout - -\begin_layout Itemize -Standardwert: 3 -\end_layout - -\begin_layout Standard -Mehr Infos hierzu in späteren Versionen. -\end_layout - -\begin_layout Subsubsection -delay_first_probe_time -\end_layout - -\begin_layout Itemize -Typ: INTEGER -\end_layout - -\begin_layout Itemize -Standardwert: 5 -\end_layout - -\begin_layout Standard -Mehr Infos hierzu in späteren Versionen. -\end_layout - -\begin_layout Subsubsection -proxy_delay -\end_layout - -\begin_layout Itemize -Typ: INTEGER -\end_layout - -\begin_layout Itemize -Standardwert: 80 -\end_layout - -\begin_layout Standard -Mehr Infos hierzu in späteren Versionen. -\end_layout - -\begin_layout Subsection -route/* -\end_layout - -\begin_layout Standard -Globale Routing-Einstellungen ändern. -\end_layout - -\begin_layout Subsubsection -flush -\end_layout - -\begin_layout Standard -In neueren Kernel-Versionen wurde diese Option entfernt - mehr Infos hierzu - in späteren Versionen. -\end_layout - -\begin_layout Subsubsection -gc_interval -\end_layout - -\begin_layout Itemize -Typ: INTEGER -\end_layout - -\begin_layout Itemize -Standardwert: 30 -\end_layout - -\begin_layout Standard -Mehr Infos hierzu in späteren Versionen. -\end_layout - -\begin_layout Subsubsection -gc_thresh -\end_layout - -\begin_layout Itemize -Typ: INTEGER -\end_layout - -\begin_layout Itemize -Standardwert: 1024 -\end_layout - -\begin_layout Standard -Mehr Infos hierzu in späteren Versionen. -\end_layout - -\begin_layout Subsubsection -mtu_expires -\end_layout - -\begin_layout Itemize -Typ: INTEGER -\end_layout - -\begin_layout Itemize -Standardwert: 600 -\end_layout - -\begin_layout Standard -Mehr Infos hierzu in späteren Versionen. -\end_layout - -\begin_layout Subsubsection -gc_elasticity -\end_layout - -\begin_layout Itemize -Typ: INTEGER -\end_layout - -\begin_layout Itemize -Standardwert: 0 -\end_layout - -\begin_layout Standard -Mehr Infos hierzu in späteren Versionen. -\end_layout - -\begin_layout Subsubsection -gc_min_interval -\end_layout - -\begin_layout Itemize -Typ: INTEGER -\end_layout - -\begin_layout Itemize -Standardwert: 5 -\end_layout - -\begin_layout Standard -Mehr Infos hierzu in späteren Versionen. -\end_layout - -\begin_layout Subsubsection -gc_timeout -\end_layout - -\begin_layout Itemize -Typ: INTEGER -\end_layout - -\begin_layout Itemize -Standardwert: 60 -\end_layout - -\begin_layout Standard -Mehr Infos hierzu in späteren Versionen. -\end_layout - -\begin_layout Subsubsection -min_adv_mss -\end_layout - -\begin_layout Itemize -Typ: INTEGER -\end_layout - -\begin_layout Itemize -Standardwert: 12 -\end_layout - -\begin_layout Standard -Mehr Infos hierzu in späteren Versionen. -\end_layout - -\begin_layout Subsubsection -max_size -\end_layout - -\begin_layout Itemize -Typ: INTEGER -\end_layout - -\begin_layout Itemize -Standardwert: 4096 -\end_layout - -\begin_layout Standard -Mehr Infos hierzu in späteren Versionen. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "proc-sys-net-ipv4" - -\end_inset - -IPv6 relevante Einträge in /proc/sys/net/ipv4/ -\end_layout - -\begin_layout Standard -Zurzeit werden einige Schalter auch bei IPv6 eingesetzt (Dies bleibt so, - bis IPv4 zur Gänze in ein unabhängiges Kernel-Modul umgewandelt wurde). -\end_layout - -\begin_layout Subsection -ip_* -\end_layout - -\begin_layout Subsubsection -ip_local_port_range -\end_layout - -\begin_layout Standard -Diese Kontrolleinstellung wird ebenfalls bei IPv6 verwendet. -\end_layout - -\begin_layout Subsection -tcp_* -\end_layout - -\begin_layout Standard -Diese Kontrolleinstellungen werden ebenfalls bei IPv6 verwendet. -\end_layout - -\begin_layout Subsection -icmp_* -\end_layout - -\begin_layout Standard -Diese Kontrolleinstellungen werden bei IPv6 nicht verwendet. - Zum aktivieren der ICMPv6 Quoten-Limitierung (auf Grund der ICMPv6 storms - Auswirkungen sehr empfohlen) müssen netfilter-v6-Regeln eingesetzt werden. -\end_layout - -\begin_layout Subsection -Sonstige Einträge -\end_layout - -\begin_layout Standard -Keine bekannt, bzw. - von IPv6 vermutlich ungenutzt. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "proc-net" - -\end_inset - -IPv6 relevante Einträge in /proc/net/ -\end_layout - -\begin_layout Standard -In /proc/net gibt es einige Einträge die ausschließlich Lese-Rechte besitzen. - Mit -\begin_inset Quotes sld -\end_inset - -sysctl -\begin_inset Quotes srd -\end_inset - - können Sie hier keine Informationen bekommen, verwenden Sie anstelle dessen - z.B. - -\begin_inset Quotes sld -\end_inset - -cat -\begin_inset Quotes srd -\end_inset - -. -\end_layout - -\begin_layout Subsection -if_inet6 -\end_layout - -\begin_layout Itemize -Typ: Eine Zeile pro Adresse mit jeweils mehreren Werten -\end_layout - -\begin_layout Standard -Alle konfigurierten IPv6 Adressen werden hier in einem speziellen Format - angezeigt. - Im Beispiel wird ein Loopback-Interface angezeigt. - Die Werte werden unten erklärt (siehe -\begin_inset Quotes sld -\end_inset - -net/ipv6/addrconf.c -\begin_inset Quotes srd -\end_inset - - für Details). -\end_layout - -\begin_layout Code - -# cat /proc/net/if_inet6 -\end_layout - -\begin_layout Code - -00000000000000000000000000000001 01 80 10 80 lo -\end_layout - -\begin_layout Code - -+------------------------------+ ++ ++ ++ ++ ++ -\end_layout - -\begin_layout Code - -| | | | | | -\end_layout - -\begin_layout Code - -1 2 3 4 5 6 -\end_layout - -\begin_layout Enumerate -IPv6 Adresse mit 32 hexadezimalen Zeichen ohne Doppelpunkte als Trennzeichen -\end_layout - -\begin_layout Enumerate -Netlink Device Nummer (Interface Index) im hexadezimalen Format (siehe auch - -\begin_inset Quotes sld -\end_inset - -ip addr -\begin_inset Quotes srd -\end_inset - -) -\end_layout - -\begin_layout Enumerate -Präfix-Länge in hexadezimaler Notation -\end_layout - -\begin_layout Enumerate -Wert des Gültigkeitsbereichs (s.a. - Kernel Quellen -\begin_inset Quotes sld -\end_inset - -include/net/ipv6.h -\begin_inset Quotes srd -\end_inset - - und -\begin_inset Quotes sld -\end_inset - -net/ipv6/addrconf.c -\begin_inset Quotes srd -\end_inset - -) -\end_layout - -\begin_layout Enumerate -Interface flags (s.a. - -\begin_inset Quotes sld -\end_inset - -include/linux/rtnetlink.h -\begin_inset Quotes srd -\end_inset - - und -\begin_inset Quotes sld -\end_inset - -net/ipv6/addrconf.c -\begin_inset Quotes srd -\end_inset - -) -\end_layout - -\begin_layout Enumerate -Devicename -\end_layout - -\begin_layout Subsection -ipv6_route -\end_layout - -\begin_layout Itemize -Typ: Eine Zeile pro Route mit jeweils mehreren Werten -\end_layout - -\begin_layout Standard -Alle konfigurierten IPv6 Routen werden hier in einem speziellen Format angezeigt. - Im Beispiel wird ein Loopback-Interface angezeigt. - Die Werte werden unten erklärt (siehe -\begin_inset Quotes sld -\end_inset - -net/ipv6/route.c -\begin_inset Quotes srd -\end_inset - - für Details). -\end_layout - -\begin_layout Code - -# cat /proc/net/ipv6_route -\end_layout - -\begin_layout Code - -00000000000000000000000000000000 00 00000000000000000000000000000000 00 -\end_layout - -\begin_layout Code - -+------------------------------+ ++ +------------------------------+ ++ -\end_layout - -\begin_layout Code - -| | | | -\end_layout - -\begin_layout Code - -1 2 3 4 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -¬ 00000000000000000000000000000000 ffffffff 00000001 00000001 00200200 lo -\end_layout - -\begin_layout Code - -¬ +------------------------------+ +------+ +------+ +------+ +------+ ++ -\end_layout - -\begin_layout Code - -¬ | | | | | | -\end_layout - -\begin_layout Code - -¬ 5 6 7 8 9 10 -\end_layout - -\begin_layout Enumerate -IPv6 Zielnetzwerk mit 32 hexadezimalen Zeichen ohne Doppelpunkte als Trennzeiche -n -\end_layout - -\begin_layout Enumerate -IPv6 Ziel-Präfix-Länge in hexadezimaler Notation -\end_layout - -\begin_layout Enumerate -IPv6 Ursprungsnetzwerk mit 32 hexadezimalen Zeichen ohne Doppelpunkte als - Trennzeichen -\end_layout - -\begin_layout Enumerate -IPv6 Ursprungs-Präfix-Länge in hexadezimaler Notation -\end_layout - -\begin_layout Enumerate -IPv6 next Hop mit 32 hexadezimalen Zeichen ohne Doppelpunkte als Trennzeichen -\end_layout - -\begin_layout Enumerate -Metrik in hexadezimaler Schreibweise -\end_layout - -\begin_layout Enumerate -Reference Counter -\end_layout - -\begin_layout Enumerate -Use Counter -\end_layout - -\begin_layout Enumerate -Flags -\end_layout - -\begin_layout Enumerate -Devicename -\end_layout - -\begin_layout Subsection -sockstat6 -\end_layout - -\begin_layout Itemize -Typ: Eine Zeile pro Protokoll mit Beschreibung und Wert -\end_layout - -\begin_layout Standard -Statistiken über verwendete IPv6 Sockets. - Beispiel: -\end_layout - -\begin_layout Code - -# cat /proc/net/sockstat6 -\end_layout - -\begin_layout Code - -TCP6: inuse 7 -\end_layout - -\begin_layout Code - -UDP6: inuse 2 -\end_layout - -\begin_layout Code - -RAW6: inuse 1 -\end_layout - -\begin_layout Code - -FRAG6: inuse 0 memory 0 -\end_layout - -\begin_layout Subsection -tcp6 -\end_layout - -\begin_layout Standard -Mehr Infos hierzu in späteren Versionen. -\end_layout - -\begin_layout Subsection -udp6 -\end_layout - -\begin_layout Standard -Mehr Infos hierzu in späteren Versionen. -\end_layout - -\begin_layout Subsection -igmp6 -\end_layout - -\begin_layout Standard -Mehr Infos hierzu in späteren Versionen. -\end_layout - -\begin_layout Subsection -raw6 -\end_layout - -\begin_layout Standard -Mehr Infos hierzu in späteren Versionen. -\end_layout - -\begin_layout Subsection -ip6_flowlabel -\end_layout - -\begin_layout Standard -Mehr Infos hierzu in späteren Versionen. -\end_layout - -\begin_layout Subsection -rt6_stats -\end_layout - -\begin_layout Standard -Mehr Infos hierzu in späteren Versionen. -\end_layout - -\begin_layout Subsection -snmp6 -\end_layout - -\begin_layout Itemize -Typ: Eine Zeile pro SNMP Beschreibung und Wert -\end_layout - -\begin_layout Standard -SNMP Statistiken; diese können mittels snmp server und entsprechender MIB - Tabelle mit einer Network Management Software gewonnen werden. -\end_layout - -\begin_layout Subsection -ip6_tables_names -\end_layout - -\begin_layout Standard -Verfügbare netfilter6 Tabellen -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "netlink" - -\end_inset - -Netlink-Interface zum Kernel -\end_layout - -\begin_layout Standard -Mehr Infos hierzu in späteren Versionen... - der Autor hat hiermit keine Erfahrung... -\end_layout - -\begin_layout Chapter - -\lang english -\begin_inset CommandInset label -LatexCommand label -name "resolver" - -\end_inset - -Adress-Auflösung -\end_layout - -\begin_layout Standard -\begin_inset VSpace defskip -\end_inset - - -\end_layout - -\begin_layout Standard - -\lang english -Zusätzliche Informationen sind hier zu finden -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "Linux & IPv6: getaddrinfo and search domains - Research" -target "http://www.bieringer.de/linux/IPv6/getaddrinfo/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "RFC 3484 on Linux" -target "http://people.redhat.com/drepper/linux-rfc3484.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -Karl Auer's Blog: -\begin_inset CommandInset href -LatexCommand href -name "Controlling IPv6 source address selection" -target "http://biplane.com.au/blog/?p=30" - -\end_inset - - , -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Source Address Selection - what, why, how" -target "http://biplane.com.au/blog/?p=22" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -Into6: -\begin_inset CommandInset href -LatexCommand href -name "/etc/gai.conf - it ain't what you think it is" -target "http://into6.com.au/?p=288" - -\end_inset - - -\end_layout - -\begin_layout Section* - -\lang english -Address-Auflösung & Ziel-Adressen-Auswahl -\end_layout - -\begin_layout Standard - -\lang english -Die Auflösung von Namen zu einer IPv4- bzw. - IPv6-Adresse wird üblicherweise durch die Benutzung einer libc resolver - Bibliothek durchgeführt. - Dazu wird normalerweise die Funktion -\emph on -getaddrinfo -\emph default - benutzt. - Im Fall, dass mehr als eine IPv6-Adresse zurückgegeben wird, soll nach - -\begin_inset CommandInset href -LatexCommand href -name "RFC 3484 / Default Address Selection for Internet Protocol version 6" -target "http://www.faqs.org/rfcs/rfc3484.html" - -\end_inset - - eine Sortierung angewandt werden, die optional auch konfiguriert werden - kann. -\end_layout - -\begin_layout Standard - -\lang english -Die -\begin_inset Quotes sld -\end_inset - -Magie -\begin_inset Quotes srd -\end_inset - - ist durch die Datei /etc/gai.conf konfigurierbar (welche fehlt oder leer - ist, solange Standardwerte gelten sollen). - Die vorgegebene Sortierung ist üblicherweise in der Dokumentation (z.B. - /usr/share/doc/glibc-common/gai.conf) oder im Manual -\begin_inset Quotes sld -\end_inset - -man gai.conf -\begin_inset Quotes srd -\end_inset - - zu sehen. -\end_layout - -\begin_layout Standard - -\lang english -Für die Kontrolle der Sortierung via benutzerdefinierter Konfiguration ist - für Tests folgendes notwendig: -\end_layout - -\begin_layout Itemize - -\lang english -Ein Hostname im DNS, der mehr als eine IPv6-Adresse zurückgibt, z.B. -\end_layout - -\begin_layout Code - -$ dig +short aaaa st1.bieringer.de -\end_layout - -\begin_layout Code - -2001:4dd0:ff00:834::2 -\end_layout - -\begin_layout Code - -2a01:238:423d:8800:85b3:9e6b:3019:8909 -\end_layout - -\begin_layout Itemize - -\lang english -Lookup via DNS (mit /etc/hosts klappt es nicht) -\end_layout - -\begin_layout Itemize - -\lang english -/etc/gai.conf mit einer passenden Konfiguration, e.g. -\end_layout - -\begin_layout Code - -precedence ::1/128 50 # default -\end_layout - -\begin_layout Code - -precedence ::/0 40 # default -\end_layout - -\begin_layout Code - -precedence 2002::/16 30 # default -\end_layout - -\begin_layout Code - -precedence ::/96 20 # default -\end_layout - -\begin_layout Code - -precedence ::ffff:0:0/96 10 # default -\end_layout - -\begin_layout Code - -precedence 2001:4dd0:ff00:834::/64 80 # dst-A -\end_layout - -\begin_layout Code - -precedence 2a01:238:423d:8800::/64 90 # dst-B -\end_layout - -\begin_layout Itemize - -\lang english -Für Tests kann dann ein Telnet-Client benutzt werden: -\end_layout - -\begin_layout Code - -$ telnet st1.bieringer.de -\end_layout - -\begin_layout Code - -Trying 2a01:238:423d:8800:85b3:9e6b:3019:8909... - (dst-B) -\end_layout - -\begin_layout Code - -... -\end_layout - -\begin_layout Code - -Trying 2001:4dd0:ff00:834::2... - (dst-A) -\end_layout - -\begin_layout Code - -... -\end_layout - -\begin_layout Itemize - -\lang english -Wenn nun die precedence geändert wird in der Konfiguration: -\end_layout - -\begin_layout Code - -precedence 2001:4dd0:ff00:834::/64 90 # dst-A ex 80 -\end_layout - -\begin_layout Code - -precedence 2a01:238:423d:8800::/64 80 # dst-B ex 90 -\end_layout - -\begin_layout Itemize - -\lang english -Dann ändert sich die Reihenfolge entsprechend -\end_layout - -\begin_layout Code - -$ telnet st1.bieringer.de -\end_layout - -\begin_layout Code - -Trying 2001:4dd0:ff00:834::2... - (dst-A) -\end_layout - -\begin_layout Code - -... -\end_layout - -\begin_layout Code - -Trying 2a01:238:423d:8800:85b3:9e6b:3019:8909... - (dst-B) -\end_layout - -\begin_layout Code - -... -\end_layout - -\begin_layout Section* - -\lang english -Quell-Addressen-Auswahl -\end_layout - -\begin_layout Standard - -\lang english -Source address selection in Linux wird automatisch vom Kernel vorgenommen, - üblicherweise abhängig von den Routing-Tabellen und unter der Vorgabe, - den Scope einer Adresse beizubehalten. -\end_layout - -\begin_layout Subsection* - -\lang english -Quell-Adressen-Auswahl mit -\begin_inset Quotes sld -\end_inset - -ip addrlabel -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard - -\lang english -Mit einer Erweiterung der internen -\begin_inset Quotes sld -\end_inset - -ip addrlabel -\begin_inset Quotes srd -\end_inset - - Tabelle kann eine Quell-Adresse zu einer Ziel-Adresse gebunden werden. - Bindung wird hier durch die Angabe des gleichen Labels (einer Nummer) konfiguri -ert. -\end_layout - -\begin_layout Itemize - -\lang english -Standard von -\begin_inset Quotes sld -\end_inset - -ip addrlabel -\begin_inset Quotes srd -\end_inset - - (hier von CentOS 6): -\end_layout - -\begin_layout Code - -# ip addrlabel -\end_layout - -\begin_layout Code - -prefix ::1/128 label 0 -\end_layout - -\begin_layout Code - -prefix ::/96 label 3 -\end_layout - -\begin_layout Code - -prefix ::ffff:0.0.0.0/96 label 4 -\end_layout - -\begin_layout Code - -prefix 2001::/32 label 6 -\end_layout - -\begin_layout Code - -prefix 2001:10::/28 label 7 -\end_layout - -\begin_layout Code - -prefix 2002::/16 label 2 -\end_layout - -\begin_layout Code - -prefix fc00::/7 label 5 -\end_layout - -\begin_layout Code - -prefix ::/0 label 1 -\end_layout - -\begin_layout Itemize - -\lang english -Das System ist multihomed (hier an einem Interface), der Router verteilt - 2 Präfixe mit Hilfe von radvd: -\end_layout - -\begin_layout Code - -# ip -6 addr show dev eth1 | grep -w inet6 |grep -w global -\end_layout - -\begin_layout Code - - inet6 2001:6f8:12d8:2:5054:ff:fefb:6582/64 scope global dynamic - (src-A) -\end_layout - -\begin_layout Code - - inet6 2001:6f8:900:8cbc:5054:ff:fefb:6582/64 scope global dynamic - (src-B) -\end_layout - -\begin_layout Itemize - -\lang english -Eine Verbindung zum Server zeigt nun: -\end_layout - -\begin_layout Code - -$ telnet st1.bieringer.de -\end_layout - -\begin_layout Code - -Trying 2001:4dd0:ff00:834::2... - (dst-A) -\end_layout - -\begin_layout Code - -... -\end_layout - -\begin_layout Code - -Trying 2a01:238:423d:8800:85b3:9e6b:3019:8909... - (dst-B) -\end_layout - -\begin_layout Code - -... -\end_layout - -\begin_layout Itemize - -\lang english -Ein tcpdump mit filter -\begin_inset Quotes sld -\end_inset - -tcp and dst port 23 -\begin_inset Quotes srd -\end_inset - - zeigt nur die Benutzung der oberen lokalen Quell-IPv6-Adresse -\end_layout - -\begin_layout Code - -IP6 2001:6f8:12d8:2:5054:ff:fefb:6582.37762 > 2001:4dd0:ff00:834::2.telnet: - (src-A -> dst-A) -\end_layout - -\begin_layout Code - -IP6 2001:6f8:12d8:2:5054:ff:fefb:6582.45754 > 2a01:238:423d:8800:85b3:9e6b:3019:8 -909.telnet: (src-A -> dst-B) -\end_layout - -\begin_layout Itemize - -\lang english -Wenn nun Quelle und Ziel mit Hilfe von -\begin_inset Quotes sld -\end_inset - -ip addrlabel -\begin_inset Quotes srd -\end_inset - - zusammengebunden werden: -\end_layout - -\begin_layout Code - -# ip addrlabel add prefix 2001:6f8:12d8:2::/64 label 200 -\end_layout - -\begin_layout Code - -# ip addrlabel add prefix 2001:6f8:900:8cbc::/64 label 300 -\end_layout - -\begin_layout Code - -# ip addrlabel add prefix 2001:4dd0:ff00:834::/64 label 200 -\end_layout - -\begin_layout Code - -# ip addrlabel add prefix 2a01:238:423d:8800::/64 label 300 -\end_layout - -\begin_layout Itemize - -\lang english -Was in folgender -\begin_inset Quotes sld -\end_inset - -ip addrlabel -\begin_inset Quotes srd -\end_inset - -resultiert: -\end_layout - -\begin_layout Code - -# ip addrlabel -\end_layout - -\begin_layout Code - -prefix ::1/128 label 0 -\end_layout - -\begin_layout Code - -prefix ::/96 label 3 -\end_layout - -\begin_layout Code - -prefix ::ffff:0.0.0.0/96 label 4 -\end_layout - -\begin_layout Code - -prefix 2a01:238:423d:8800::/64 label 300 # dst-B -\end_layout - -\begin_layout Code - -prefix 2001:4dd0:ff00:834::/64 label 200 # dst-A -\end_layout - -\begin_layout Code - -prefix 2001:6f8:900:8cbc::/64 label 300 # src-B -\end_layout - -\begin_layout Code - -prefix 2001:6f8:12d8:2::/64 label 200 # src-A -\end_layout - -\begin_layout Code - -prefix 2001::/32 label 6 -\end_layout - -\begin_layout Code - -prefix 2001:10::/28 label 7 -\end_layout - -\begin_layout Code - -prefix 2002::/16 label 2 -\end_layout - -\begin_layout Code - -prefix fc00::/7 label 5 -\end_layout - -\begin_layout Code - -prefix ::/0 label 1 -\end_layout - -\begin_layout Itemize - -\lang english -Und dann nochmal eine Verbindung zum Server versucht wird -\end_layout - -\begin_layout Code - -$ telnet st1.bieringer.de -\end_layout - -\begin_layout Code - -Trying 2001:4dd0:ff00:834::2... - (dst-A) -\end_layout - -\begin_layout Code - -... -\end_layout - -\begin_layout Code - -Trying 2a01:238:423d:8800:85b3:9e6b:3019:8909... - (dst-B) -\end_layout - -\begin_layout Code - -... -\end_layout - -\begin_layout Itemize - -\lang english -tcpdump mit filter -\begin_inset Quotes sld -\end_inset - -tcp and dst port 23 -\begin_inset Quotes srd -\end_inset - - zeigt nun die Benutzung beider Quell-IPv6-Adressen wie konfiguriert -\end_layout - -\begin_layout Code - -IP6 2001:6f8:12d8:2:5054:ff:fefb:6582.37765 > 2001:4dd0:ff00:834::2.telnet: - (src-A -> dst-A) -\end_layout - -\begin_layout Code - -IP6 2001:6f8:900:8cbc:5054:ff:fefb:6582.39632 > 2a01:238:423d:8800:85b3:9e6b:3019 -:8909.telnet: (src-B -> dst-B) -\end_layout - -\begin_layout Standard -Persistente Konfiguration von -\begin_inset Quotes sld -\end_inset - -ip addrtable -\begin_inset Quotes srd -\end_inset - - ist wahrscheinlich in aktuellen Linux-Distributionen nicht unterstützt, - somit wäre eine Erweiterung der Netzwerk-Init-Scripts oder rc.local notwendig. - Ein Skript, welches Informationen aus /etc/gai.conf in entsprechendes -\begin_inset Quotes sld -\end_inset - -ip addrtable -\begin_inset Quotes srd -\end_inset - - umwandelt, gibt es hier: -\lang english - -\begin_inset CommandInset href -LatexCommand href -name "/etc/gai.conf - it ain't what you think it is" -target "http://into6.com.au/?p=288" - -\end_inset - - -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "network-debugging" - -\end_inset - -Netzwerk-Fehlersuche -\end_layout - -\begin_layout Section -Server Socket-Anbindung -\end_layout - -\begin_layout Subsection -Überprüfung der Server Socket-Anbindung mit -\begin_inset Quotes sld -\end_inset - -netstat -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -Es ist immer von Interesse welche Sockets eines Knotens gerade aktiv sind. - Mit -\begin_inset Quotes sld -\end_inset - -netstat -\begin_inset Quotes srd -\end_inset - - können Sie die betreffenden Informationen abfragen: -\end_layout - -\begin_layout Standard -Verwendete Optionen: -nlptu -\end_layout - -\begin_layout Standard -Beispiel: -\end_layout - -\begin_layout Code - -# netstat -nlptu -\end_layout - -\begin_layout Code - -Active Internet connections (only servers) -\end_layout - -\begin_layout Code - -Proto Recv-Q Send-Q Local Address Foreign Address State - -\end_layout - -\begin_layout Code - -¬ PID/Program name -\end_layout - -\begin_layout Code - -tcp 0 0 0.0.0.0:32768 0.0.0.0:* LISTEN - -\end_layout - -\begin_layout Code - -¬ 1258/rpc.statd -\end_layout - -\begin_layout Code - -tcp 0 0 0.0.0.0:32769 0.0.0.0:* LISTEN - -\end_layout - -\begin_layout Code - -¬ 1502/rpc.mountd -\end_layout - -\begin_layout Code - -tcp 0 0 0.0.0.0:515 0.0.0.0:* LISTEN - -\end_layout - -\begin_layout Code - -¬ 22433/lpd Waiting -\end_layout - -\begin_layout Code - -tcp 0 0 1.2.3.1:139 0.0.0.0:* LISTEN - -\end_layout - -\begin_layout Code - -¬ 1746/smbd -\end_layout - -\begin_layout Code - -tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN - -\end_layout - -\begin_layout Code - -¬ 1230/portmap -\end_layout - -\begin_layout Code - -tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN - -\end_layout - -\begin_layout Code - -¬ 3551/X -\end_layout - -\begin_layout Code - -tcp 0 0 1.2.3.1:8081 0.0.0.0:* LISTEN - -\end_layout - -\begin_layout Code - -¬ 18735/junkbuster -\end_layout - -\begin_layout Code - -tcp 0 0 1.2.3.1:3128 0.0.0.0:* LISTEN - -\end_layout - -\begin_layout Code - -¬ 18822/(squid) -\end_layout - -\begin_layout Code - -tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN - -\end_layout - -\begin_layout Code - -¬ 30734/named -\end_layout - -\begin_layout Code - -tcp 0 0 ::ffff:1.2.3.1:993 :::* LISTEN - -\end_layout - -\begin_layout Code - -¬ 6742/xinetd-ipv6 -\end_layout - -\begin_layout Code - -tcp 0 0 :::13 :::* LISTEN - -\end_layout - -\begin_layout Code - -¬ 6742/xinetd-ipv6 -\end_layout - -\begin_layout Code - -tcp 0 0 ::ffff:1.2.3.1:143 :::* LISTEN - -\end_layout - -\begin_layout Code - -¬ 6742/xinetd-ipv6 -\end_layout - -\begin_layout Code - -tcp 0 0 :::53 :::* LISTEN - -\end_layout - -\begin_layout Code - -¬ 30734/named -\end_layout - -\begin_layout Code - -tcp 0 0 :::22 :::* LISTEN - -\end_layout - -\begin_layout Code - -¬ 1410/sshd -\end_layout - -\begin_layout Code - -tcp 0 0 :::6010 :::* LISTEN - -\end_layout - -\begin_layout Code - -¬ 13237/sshd -\end_layout - -\begin_layout Code - -udp 0 0 0.0.0.0:32768 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 1258/rpc.statd -\end_layout - -\begin_layout Code - -udp 0 0 0.0.0.0:2049 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ - -\end_layout - -\begin_layout Code - -udp 0 0 0.0.0.0:32770 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 1502/rpc.mountd -\end_layout - -\begin_layout Code - -udp 0 0 0.0.0.0:32771 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ - -\end_layout - -\begin_layout Code - -udp 0 0 1.2.3.1:137 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 1751/nmbd -\end_layout - -\begin_layout Code - -udp 0 0 0.0.0.0:137 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 1751/nmbd -\end_layout - -\begin_layout Code - -udp 0 0 1.2.3.1:138 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 1751/nmbd -\end_layout - -\begin_layout Code - -udp 0 0 0.0.0.0:138 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 1751/nmbd -\end_layout - -\begin_layout Code - -udp 0 0 0.0.0.0:33044 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 30734/named -\end_layout - -\begin_layout Code - -udp 0 0 1.2.3.1:53 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 30734/named -\end_layout - -\begin_layout Code - -udp 0 0 127.0.0.1:53 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 30734/named -\end_layout - -\begin_layout Code - -udp 0 0 0.0.0.0:67 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 1530/dhcpd -\end_layout - -\begin_layout Code - -udp 0 0 0.0.0.0:67 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 1530/dhcpd -\end_layout - -\begin_layout Code - -udp 0 0 0.0.0.0:32858 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 18822/(squid) -\end_layout - -\begin_layout Code - -udp 0 0 0.0.0.0:4827 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 18822/(squid) -\end_layout - -\begin_layout Code - -udp 0 0 0.0.0.0:111 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 1230/portmap -\end_layout - -\begin_layout Code - -udp 0 0 :::53 :::* - -\end_layout - -\begin_layout Code - -¬ 30734/named -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "examples-tcpdump" - -\end_inset - -tcpdump-Beispiele -\end_layout - -\begin_layout Standard -Hier folgen einige Beispiele von (mit tcpdump) aufgezeichneten Paketen, - die hoffentlich bei Ihrer Fehlersuche nützlich sein können. -\end_layout - -\begin_layout Standard -... - mehr Beispiele in den nächsten Versionen... -\end_layout - -\begin_layout Subsection -Router-Erkennung -\end_layout - -\begin_layout Subsubsection -Router Advertisement -\end_layout - -\begin_layout Code - -15:43:49.484751 fe80::212:34ff:fe12:3450 > ff02::1: icmp6: router -\end_layout - -\begin_layout Code - -¬ advertisement(chlim=64, router_ltime=30, reachable_time=0, -\end_layout - -\begin_layout Code - -¬ retrans_time=0)(prefix info: AR valid_ltime=30, preffered_ltime=20, -\end_layout - -\begin_layout Code - -¬ prefix=2002:0102:0304:1::/64)(prefix info: LAR valid_ltime=2592000, -\end_layout - -\begin_layout Code - -¬ preffered_ltime=604800, prefix=2001:0db8:0:1::/64)(src lladdr: -\end_layout - -\begin_layout Code - -¬ 0:12:34:12:34:50) (len 88, hlim 255) -\end_layout - -\begin_layout Standard -Der Router mit der link-lokalen Adresse -\begin_inset Quotes sld -\end_inset - -fe80::212:34ff:fe12:3450 -\begin_inset Quotes srd -\end_inset - - sendet eine Ankündigung mit zwei Präfixes -\begin_inset Quotes sld -\end_inset - -2002:0102:0304:1::/64 -\begin_inset Quotes srd -\end_inset - - (Lebensdauer 30s) und -\begin_inset Quotes sld -\end_inset - -2001:0db8:0:1::/64 -\begin_inset Quotes srd -\end_inset - - (Lebensdauer 2592000s) sowie der eigenen Schicht 2 MAC Adresse -\begin_inset Quotes sld -\end_inset - -0:12:34:12:34:50 -\begin_inset Quotes srd -\end_inset - - an die all-node-on-link Multicast Adresse -\begin_inset Quotes sld -\end_inset - -ff02::1 -\begin_inset Quotes srd -\end_inset - -. -\end_layout - -\begin_layout Subsubsection -Router Anfrage -\end_layout - -\begin_layout Code - -15:44:21.152646 fe80::212:34ff:fe12:3456 > ff02::2: icmp6: router solicitation -\end_layout - -\begin_layout Code - -¬ (src lladdr: 0:12:34:12:34:56) (len 16, hlim 255) -\end_layout - -\begin_layout Standard -Der Knoten mit der link-lokalen Adresse -\begin_inset Quotes sld -\end_inset - -fe80:212:34ff:fe12:3456 -\begin_inset Quotes srd -\end_inset - - und der Schicht 2 MAC Adresse -\begin_inset Quotes sld -\end_inset - -0:12:34:12:34:56 -\begin_inset Quotes srd -\end_inset - - sucht nach einem Router und sendet hierfür diese Anfrage an die all-router-on-l -ink Multicast Adresse -\begin_inset Quotes sld -\end_inset - -ff02::2 -\begin_inset Quotes srd -\end_inset - -. -\end_layout - -\begin_layout Subsection -Neighbor-Erkennung -\end_layout - -\begin_layout Subsubsection -Neighbor discovery solicitation zur Entdeckung doppelter Adressen -\end_layout - -\begin_layout Standard -Folgende Pakete werden vom Knoten mit der Schicht 2 MAC Adresse -\begin_inset Quotes sld -\end_inset - -0:12:34:12:34:56 -\begin_inset Quotes srd -\end_inset - - während der automatischen Konfiguration an die solicited-node link-lokale - Multicast Adresse gesendet. - Es wird überprüft, ob eine potentielle Adresse bereits von einem anderen - Knoten am Link verwendet wird. -\end_layout - -\begin_layout Itemize -Der Knoten will seine link-lokale Adresse -\begin_inset Quotes sld -\end_inset - -fe80:212:34ff:fe12:3456 -\begin_inset Quotes srd -\end_inset - - konfigurieren und überprüft auf Duplikate -\end_layout - -\begin_layout Code - -15:44:17.712338 :: > ff02::1:ff12:3456: icmp6: neighbor sol: who has -\end_layout - -\begin_layout Code - -¬ fe80::212:34ff:fe12:3456(src lladdr: 0:12:34:12:34:56) (len 32, hlim 255) -\end_layout - -\begin_layout Itemize -Der Knoten will seine globale Adresse -\begin_inset Quotes sld -\end_inset - -2002:0102:0304:1:212:34ff:fe12:3456 -\begin_inset Quotes srd -\end_inset - - konfigurieren (nach Empfang eines Advertisements wie weiter oben abgebildet) - und überprüft auf Duplikate -\end_layout - -\begin_layout Code - -15:44:21.905596 :: > ff02::1:ff12:3456: icmp6: neighbor sol: who has -\end_layout - -\begin_layout Code - -¬ 2002:0102:0304:1:212:34ff:fe12:3456(src lladdr: 0:12:34:12:34:56) (len - 32, -\end_layout - -\begin_layout Code - -¬ hlim 255) -\end_layout - -\begin_layout Itemize -Der Knoten will seine globale Adresse -\begin_inset Quotes sld -\end_inset - -2001:0db8:0:1:212:34ff:fe12:3456 -\begin_inset Quotes srd -\end_inset - - konfigurieren (nach Empfang eines Advertisements wie weiter oben abgebildet) - und überprüft auf Duplikate -\end_layout - -\begin_layout Code - -15:44:22.304028 :: > ff02::1:ff12:3456: icmp6: neighbor sol: who has -\end_layout - -\begin_layout Code - -¬ 2001:0db8:0:1:212:34ff:fe12:3456(src lladdr: 0:12:34:12:34:56) (len 32, - hlim -\end_layout - -\begin_layout Code - -¬ 255) -\end_layout - -\begin_layout Subsubsection -Neighbor discovery solicitation zur Host oder Gateway-Suche -\end_layout - -\begin_layout Itemize -Der Knoten möchte Pakete an die Adresse -\begin_inset Quotes sld -\end_inset - -2001:0db8:0:1::10 -\begin_inset Quotes srd -\end_inset - - senden, hat hierfür aber keine Schicht 2 MAC Adresse und sendet aus diesem - Grund zuerst eine Anfrage -\end_layout - -\begin_layout Code - -13:07:47.664538 2002:0102:0304:1:2e0:18ff:fe90:9205 > ff02::1:ff00:10: icmp6: -\end_layout - -\begin_layout Code - -¬ neighbor sol: who has 2001:0db8:0:1::10(src lladdr: 0:e0:18:90:92:5) (len - 32, -\end_layout - -\begin_layout Code - -¬ hlim 255) -\end_layout - -\begin_layout Itemize -Der Knoten sucht nun nach der Adresse -\begin_inset Quotes sld -\end_inset - -fe80::10 -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Code - -13:11:20.870070 fe80::2e0:18ff:fe90:9205 > ff02::1:ff00:10: icmp6: neighbor -\end_layout - -\begin_layout Code - -¬ sol: who has fe80::10(src lladdr: 0:e0:18:90:92:5) (len 32, hlim 255) -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-support-persistent-configuration" - -\end_inset - -Unterstützung einer ständigen IPv6-Konfiguration in Linux Distributionen -\end_layout - -\begin_layout Standard -Einige Linux-Distributionen unterstützen bereits eine permanente IPv6 Konfigurat -ion. - Hierbei werden sowohl bestehende oder als auch neue Konfiguration- und - Skriptdateien verwendet sowie tlw. - IPv4 Skripte abgeändert. -\end_layout - -\begin_layout Section -Red Hat Linux und -\begin_inset Quotes sld -\end_inset - -Klone -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -Seitdem der Autor begann das -\begin_inset CommandInset href -LatexCommand href -name "IPv6 & Linux - HowTo" -target "http://www.bieringer.de/linux/IPv6/" - -\end_inset - - zu schreiben, war es seine Absicht eine permanente IPv6 Konfiguration zu - ermöglichen, wobei die gebräuchlichsten Anwendungsszenarien wie Host-only, - Router-only, Dual-homed-host, Router mit einem zweiten Netzwerkstrang, - normale Tunnel, 6to4 Tunnel, etc. - abgedeckt sein sollten. - Heute gibt es eine Sammlung von Konfigurations- und Skriptdateien, die - genau diesem Zweck erfüllen (es wurden nie echte Probleme gemeldet, allerdings - ist unbekannt von wie vielen Personen dieses Set benutzt wird). - Diese Dateien werden von Zeit zu Zeit erweitert und es gibt inzwischen - eine eigene Homepage hierfür: -\lang english - -\begin_inset CommandInset href -LatexCommand href -name "initscripts-ipv6 homepage" -target "http://www.deepspace6.net/projects/initscripts-ipv6.html" - -\end_inset - - ( -\begin_inset CommandInset href -LatexCommand href -name "Spiegel" -target "http://mirrors.bieringer.de/www.deepspace6.net/projects/initscripts-ipv6.html" - -\end_inset - -) -\lang ngerman -. - Da der Autor seine ersten Schritte mit IPv6 auf einem Red Hat Linux 5.0 - Klon gemacht habe, basieren seine IPv6 Entwicklungssysteme heute zumeist - auf Red Hat Linux und die Skriptdateien sind folglich primär für diese - Distributionen gedacht. - Es war ebenfalls sehr einfach bestehende Konfigurationsdateien zu erweitern, - neue zu erstellen und den Start des IPv6 Setup in das IPv4 Setup einzubetten. -\end_layout - -\begin_layout Standard -Erfreulicherweise beinhaltet Red Hat Linux seit der Version 7.1 die IPv6-Skripts - des Autors. - Unterstützt wurde dies und wird auch weiterhin von Pekka Savola. -\end_layout - -\begin_layout Standard -Bei Mandrake ist ab Version 8.0 ebenfalls ein IPv6-fähiges initscript Paket - beinhaltet, ein kleiner Fehler verhindert aber nach wie vor die Anwendung - ( -\begin_inset Quotes sld -\end_inset - -ifconfig -\begin_inset Quotes srd -\end_inset - - vermisst -\begin_inset Quotes sld -\end_inset - -inet6 -\begin_inset Quotes srd -\end_inset - - vor -\begin_inset Quotes sld -\end_inset - -add -\begin_inset Quotes srd -\end_inset - -). -\end_layout - -\begin_layout Subsection -Test der IPv6-Unterstützung bei Netzwerk-Konfigurations-Scripts -\end_layout - -\begin_layout Standard -Sie können überprüfen, ob Ihre Distribution eine permanente IPv6 Konfiguration - unter Verwendung der Skript-Sammlung des Autors unterstützt. - Folgende script library sollte existieren: -\end_layout - -\begin_layout Code - -/etc/sysconfig/network-scripts/network-functions-ipv6 -\end_layout - -\begin_layout Standard -Automatischer Test: -\end_layout - -\begin_layout Code - -# test -f /etc/sysconfig/network-scripts/network-functions-ipv6 && echo - "Main -\end_layout - -\begin_layout Code - -¬ IPv6 script library exists" -\end_layout - -\begin_layout Standard -Die Versionsnummer der Library ist von Interesse, wenn Sie Features vermissen - sollten. - Die Versionsnummer können Sie anzeigen, indem Sie folgenden Befehl ausführen - (einfacher ist es sicherlich, wenn Sie im Header der Datei nachlesen): -\end_layout - -\begin_layout Code - -# source /etc/sysconfig/network-scripts/network-functions-ipv6 && -\end_layout - -\begin_layout Code - -¬ getversion_ipv6_functions -\end_layout - -\begin_layout Code - -20011124 -\end_layout - -\begin_layout Standard -Im obigen Beispiel ist die Versionsnummer -\series bold -20011124 -\series default -. - Um zu sehen, was sich inzwischen geändert hat, können Sie hier die neuesten - Informationen nachlesen: -\lang english - -\begin_inset CommandInset href -LatexCommand href -name "initscripts-ipv6 homepage" -target "http://www.deepspace6.net/projects/initscripts-ipv6.html" - -\end_inset - - ( -\begin_inset CommandInset href -LatexCommand href -name "Spiegel" -target "http://mirrors.bieringer.de/www.deepspace6.net/projects/initscripts-ipv6.html" - -\end_inset - -) -\lang ngerman -. - Sie finden hier auch ein Change-Log. -\end_layout - -\begin_layout Subsection -Kurze Anleitung zum aktivieren von IPv6 bei RHL 7.1, 7.2, 7.3, ... -\end_layout - -\begin_layout Itemize -Überprüfen Sie, ob das IPv6 Modul auf Ihrem System bereits geladen ist: -\end_layout - -\begin_layout Code - -# modprobe -c | grep net-pf-10 -\end_layout - -\begin_layout Code - -alias net-pf-10 off -\end_layout - -\begin_layout Itemize -Ist das Ergebnis -\begin_inset Quotes sld -\end_inset - -off -\begin_inset Quotes srd -\end_inset - -, dann aktivieren Sie IPv6 durch hinzufügen folgender Zeile in /etc/sysconfig/ne -twork -\end_layout - -\begin_layout Code - -NETWORKING_IPV6=yes -\end_layout - -\begin_layout Itemize -Rebooten bzw. - starten Sie das Netzwerk neu mit dem Befehl -\end_layout - -\begin_layout Code - -# service network restart -\end_layout - -\begin_layout Itemize -Nun sollte das IPv6 Modul geladen sein -\end_layout - -\begin_layout Code - -# modprobe -c | grep ipv6 -\end_layout - -\begin_layout Code - -alias net-pf-10 ipv6 -\end_layout - -\begin_layout Standard -Ist ihr System an einem Link, der Router Advertisements liefert, dann wird - die automatische Konfiguration automatisch durchgeführt. - Zusätzlich Informationen darüber, welche Einstellungen unterstützt werden - finden Sie in der Datei /usr/share/doc/initscripts-$version/sysconfig.txt. -\end_layout - -\begin_layout Section -SuSE Linux -\end_layout - -\begin_layout Standard -Seit neueren 7.x Versionen gibt es eine wirklich rudimentäre Unterstützung - für IPv6, siehe /etc/rc.config für Details. -\end_layout - -\begin_layout Standard -Aufgrund der komplett unterschiedlichen Struktur der Konfigurations- und - Scriptdateien ist es sehr schwer (oder unmöglich) das Set für Red Hat Linux - und seine Klone mit dieser Distribution zu verwenden. -\begin_inset Newline newline -\end_inset - -In Version 8.x wurde das Konfigurations-Setup bei SuSE komplett abgeändert. -\end_layout - -\begin_layout Subsection - -\lang english -SuSE Linux 7.3 -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "How to setup 6to4 IPv6 with SuSE 7.3" -target "http://www.feyrer.de/IPv6/SuSE73-IPv6+6to4-setup.html" - -\end_inset - - -\end_layout - -\begin_layout Subsection - -\lang english -SuSE Linux 8.0 -\end_layout - -\begin_layout Subsubsection - -\lang english -IPv6-Adress-Konfiguration -\end_layout - -\begin_layout Standard - -\lang english -Editiere Datei /etc/sysconfig/network/ifcfg- und setze folgende - Variable entsprechend -\end_layout - -\begin_layout Code - -IP6ADDR="/" -\end_layout - -\begin_layout Subsubsection - -\lang english -Zusätzliche information -\end_layout - -\begin_layout Standard - -\lang english -Siehe Datei /usr/share/doc/packages/sysconfig/README -\end_layout - -\begin_layout Subsection - -\lang english -SuSE Linux 8.1 -\end_layout - -\begin_layout Subsubsection - -\lang english -IPv6-Adress-Konfiguration -\end_layout - -\begin_layout Standard - -\lang english -Editiere Datei /etc/sysconfig/network/ifcfg- und setze folgende - Variable entsprechend -\end_layout - -\begin_layout Code - -IPADDR="/" -\end_layout - -\begin_layout Subsubsection - -\lang english -Zusätzliche information -\end_layout - -\begin_layout Standard - -\lang english -Siehe Datei /usr/share/doc/packages/sysconfig/Network -\end_layout - -\begin_layout Section - -\lang english -\begin_inset CommandInset label -LatexCommand label -name "Configuration-Debian-Linux" - -\end_inset - - -\lang ngerman -Debian Linux -\end_layout - -\begin_layout Standard - -\lang english -Folgende Information wurde von Stephane Bortzmeyer beigesteuert. -\end_layout - -\begin_layout Enumerate - -\lang english -Überprüfe, ob IPv6 aktiv ist, entweder weil es in den Kernel hineinkompilier - oder das Modul geladen wurde. - Für die letzte Möglichkeit gibt es 3 Lösungen: Editieren der Datei /etc/modules -, Benutzung des Features pre-up (siehe unten) oder Benutzung von kmod (wird - hier nicht weiter erklärt). -\end_layout - -\begin_layout Enumerate - -\lang english -Konfiguriere die Schnittstelle (hier im Beispiel: eth0). - Editiere /etc/network/interfaces : -\end_layout - -\begin_layout Code - -iface eth0 inet6 static -\end_layout - -\begin_layout Code - - pre-up modprobe ipv6 -\end_layout - -\begin_layout Code - - address 2001:0db8:1234:5::1:1 -\end_layout - -\begin_layout Code - - # To suppress completely autoconfiguration: -\end_layout - -\begin_layout Code - - # up echo 0 > /proc/sys/net/ipv6/conf/all/autoconf -\end_layout - -\begin_layout Code - - netmask 64 -\end_layout - -\begin_layout Code - - # The router is autoconfigured and has no fixed address. -\end_layout - -\begin_layout Code - - # It is magically -\end_layout - -\begin_layout Code - - # found. - (/proc/sys/net/ipv6/conf/all/accept_ra). - Otherwise: -\end_layout - -\begin_layout Code - - #gateway 2001:0db8:1234:5::1 -\end_layout - -\begin_layout Standard - -\lang english -Danach rebooten oder folgendes Kommando ausführen -\end_layout - -\begin_layout Code - -# ifup --force eth0 -\end_layout - -\begin_layout Standard - -\lang english -Danach sollte die statische IPv6-Adresse konfiguriert sein. - -\end_layout - -\begin_layout Subsection -Weiterführende Informationen -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 with Debian Linux" -target "http://ipv6.debian.net/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Jean-Marc V. - Liotier's -\lang english - -\begin_inset CommandInset href -LatexCommand href -name "HOWTO for Freenet6 & Debian Users" -target "http://www.ruwenzori.net/ipv6/Jims_LAN_IPv6_global_connectivity_howto.html" - -\end_inset - - -\lang ngerman - (am 24.12.2002 in der -\begin_inset CommandInset ref -LatexCommand ref -name "mailinglist" -reference "information-maillists" - -\end_inset - - users@ipv6.org angekündigt) -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-autoconfiguration" - -\end_inset - -Automatische Konfiguration -\end_layout - -\begin_layout Section -Stateless Auto-Konfiguration (out-of-the-box) -\end_layout - -\begin_layout Standard -Wird unterstützt und kann bei der zugewiesenen link-lokalen Adressen beobachtet - werden, sobald ein IPv6 fähiges Interface aktiv ist. -\end_layout - -\begin_layout Standard - -\lang english -Beispiel: -\end_layout - -\begin_layout Code - -# ip -6 addr show dev eth0 scope link -\end_layout - -\begin_layout Code - -2: eth0: mtu 1500 qlen1000 -\end_layout - -\begin_layout Code - - inet6 fe80::211:d8ff:fe6b:f0f5/64 scope link -\end_layout - -\begin_layout Code - - valid_lft forever preferred_lft forever -\end_layout - -\begin_layout Section -Stateless Auto-Konfiguration unter Verwendung des Router Advertisement Daemon - (radvd) -\end_layout - -\begin_layout Standard -Mehr Infos hierzu in späteren Versionen. - Siehe unten im Abschnitt -\begin_inset CommandInset ref -LatexCommand ref -name "radvd daemon autoconfiguration" -reference "hints-daemons-radvd" - -\end_inset - -. -\end_layout - -\begin_layout Section -Dynamic Host Configuration Protocol v6 (DHCPv6) -\end_layout - -\begin_layout Standard - -\lang english -Nach einer langen Zeit der Diskussion wurde -\begin_inset CommandInset href -LatexCommand href -name "RFC 3315 / Dynamic Host Configuration Protocol for IPv6 (DHCPv6)" -target "http://www.faqs.org/rfcs/rfc3315.html" - -\end_inset - - verabschiedet. - Momentan (10/2005) existieren 2 Implementierungen: -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "Dibbler" -target "http://klub.com.pl/dhcpv6/" - -\end_inset - - von Tomasz Mrugalski ( -\begin_inset CommandInset ref -LatexCommand ref -name "Tipps zur Konfiguration" -reference "hints-daemons-dibbler" - -\end_inset - -) -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "dhcpv6" -target "https://fedorahosted.org/dhcpv6/" - -\end_inset - - ( -\begin_inset CommandInset ref -LatexCommand ref -name "Tipps zur Konfiguration" -reference "hints-daemons-dhcpv6" - -\end_inset - -) -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "ISC DHCP" -target "http://www.isc.org/software/dhcp" - -\end_inset - - ( -\begin_inset CommandInset ref -LatexCommand ref -name "Tipps zur Konfiguration" -reference "hints-daemons-isc-dhcp" - -\end_inset - -) -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-mobility" - -\end_inset - -Mobilität -\end_layout - -\begin_layout Section -Allgemeines -\end_layout - -\begin_layout Subsection - -\lang english -Mobilität eines Knotens (Node Mobility) -\end_layout - -\begin_layout Standard - -\lang english -Die Unterstützung für IPv6-Mobilität in Linux kann durch die Installation - der MIPL2-Implementierung aktviert werden, welche hier zu finden ist: -\begin_inset CommandInset href -LatexCommand href -name "http://www.mobile-ipv6.org/" -target "http://www.mobile-ipv6.org/" - -\end_inset - - -\end_layout - -\begin_layout Standard - -\lang english -Diese Implementierung ist konform zur RFC 3775. - Sie besteht aus einem Kernel-Patch und einen Mobilitäts-Daemon (genannt - mip6d). - Die Version 2.0.1 passt für Linux kernel 2.6.15. -\end_layout - -\begin_layout Standard - -\lang english -Installation und Setup sind im -\begin_inset CommandInset href -LatexCommand href -name "Linux Mobile IPv6 HOWTO" -target "http://tldp.org/HOWTO/Mobile-IPv6-HOWTO/" - -\end_inset - - beschrieben. -\end_layout - -\begin_layout Subsection - -\lang english -Netzwerk-Mobililtät -\end_layout - -\begin_layout Standard - -\lang english -Zusätzlich existiert die Implementierung der Netzwerk-Mobilität für Linux, - genannt NEPL, und basiert auf MIPL. - Diese steht auch zur Verfügung unter: -\begin_inset CommandInset href -LatexCommand href -name "http://www.mobile-ipv6.org/" -target "http://www.mobile-ipv6.org/" - -\end_inset - -. -\end_layout - -\begin_layout Standard - -\lang english -Folgendes HOWTO Dokument beschreibt Setup und Konfiguration: -\begin_inset CommandInset href -LatexCommand href -name "http://www.nautilus6.org/doc/nepl-howto/" -target "http://www.nautilus6.org/doc/nepl-howto/" - -\end_inset - -. -\end_layout - -\begin_layout Subsection - -\lang english -Links -\end_layout - -\begin_layout Itemize - -\lang english -Mobile IPv6 for Linux (MIPL) project: -\begin_inset CommandInset href -LatexCommand href -name "http://www.mobile-ipv6.org/" -target "http://www.mobile-ipv6.org/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -Nautilus6 working group: -\begin_inset CommandInset href -LatexCommand href -name "http://nautilus6.org/" -target "http://nautilus6.org/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -Fast Handovers for Mobile IPv6 for Linux project: -\begin_inset CommandInset href -LatexCommand href -name "http://www.fmipv6.org/" -target "http://www.fmipv6.org/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -USAGI-patched Mobile IPv6 for Linux (UMIP): -\begin_inset CommandInset href -LatexCommand href -name "http://umip.linux-ipv6.org/" -target "http://umip.linux-ipv6.org/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -Deploying IPsec/IKE-protected MIPv6 under Linux: -\begin_inset CommandInset href -LatexCommand href -name "http://natisbad.org/MIPv6/" -target "http://natisbad.org/MIPv6/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "RFC 3775 / Mobility Support in IPv6" -target "http://www.faqs.org/rfcs/rfc3775.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "RFC 3776 / Using IPsec to Protect Mobile IPv6 Signaling Between Mobile Nodes and Home Agents" -target "http://www.faqs.org/rfcs/rfc3776.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "RFC 3963 / Network Mobility (NEMO)" -target "http://www.faqs.org/rfcs/rfc3963.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "RFC 4068 / Fast Handovers for Mobile IPv6" -target "http://www.faqs.org/rfcs/rfc4068.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "RFC 4423 / Host Identity Protocol (HIP) Architecture" -target "http://www.faqs.org/rfcs/rfc4423.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "RFC 5201 / Host Identity Protocol" -target "http://www.faqs.org/rfcs/rfc5201.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -HIP Implementierungen: -\begin_inset CommandInset href -LatexCommand href -name "http://infrahip.hiit.fi/" -target "http://infrahip.hiit.fi/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "http://hip4inter.net/" -target "http://hip4inter.net/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "http://www.openhip.org/" -target "http://www.openhip.org/" - -\end_inset - - -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-firewalling-security" - -\end_inset - -Firewall-Funktionalität -\end_layout - -\begin_layout Standard -Die IPv6 Firewall-Funktionalität ist wichtig; vor allem dann, wenn Sie auf - Ihren internen Netzen IPv6 mit globalen IPv6 Adressen einsetzen. - In IPv6 werden - im Unterschied zu IPv4, wo interne Hosts automatisch durch - private IPv6 Adressen geschützt werden ( -\begin_inset CommandInset href -LatexCommand href -name "RFC 1918 / Address Allocation for Private Internets" -target "http://www.faqs.org/rfcs/rfc1918.html" - -\end_inset - - bzw. - -\begin_inset CommandInset href -LatexCommand href -name "Google search for Microsoft + APIPA" -target "http://www.google.com/search?q=apipa+microsoft" - -\end_inset - -) - globale Adressen verwendet und jeder mit IPv6-Anbindung kann alle internen - Knoten, bei denen IPv6 aktiv ist, erreichen. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "firewalling-netfilter6" - -\end_inset - -Firewall-Funktionalität mit netfilter6 -\end_layout - -\begin_layout Standard -Von Haus aus unterstützt wird die IPv6-Firewall-Funktionalität im Kernel - erst ab Version 2.4+. - In älteren 2.2+ Versionen können sie nur mit Protocol 41 das generelle Tunnel - von IPv6-in-IPv4-Paketen filtern. -\end_layout - -\begin_layout Standard -Achtung: Es gibt keine Garantie, dass die beschriebenen Regeln und Beispiele - ihr System auch wirklich schützen können! -\end_layout - -\begin_layout Standard -Beobachten Sie nach der Installation ihr Regelset, siehe Abschnitt -\begin_inset CommandInset ref -LatexCommand ref -reference "IPv6-security-auditing" - -\end_inset - -. -\end_layout - -\begin_layout Standard - -\lang english -Kernels ab Version 2.6.20 (Februar 2007) unterstützen den IPv6-Verbindungsstatus - (connection tracking) vollständig. -\end_layout - -\begin_layout Standard - -\lang english -Kernels ab Version 3.9.0 (April 2013) unterstützen NAT für IPv6 in Verbindung - mit ip6tables >= 1.4.18 -\end_layout - -\begin_layout Standard - -\lang english -Kernels ab Version 3.13 (April 2014) unterstützen ein neues Framework namens: - nftables -\end_layout - -\begin_layout Subsection -Weitere Informationen -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Netfilter project" -target "http://www.netfilter.org/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "maillist archive of netfilter users" -target "https://lists.netfilter.org/mailman/listinfo/netfilter" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "maillist archive of netfilter developers" -target "https://lists.netfilter.org/mailman/listinfo/netfilter-devel" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Unofficial status informations" -target "http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status-kernel.html#netfilter6 " - -\end_inset - - -\end_layout - -\begin_layout Section -Vorbereitung -\end_layout - -\begin_layout Standard - -\lang english -Dies ist nur notwendig, wenn der mitgelieferte Kernel und Netfilter nicht - den Ansprüchen genügt und neue Featurs bereits verfügbar sind, jedoch noch - nicht beinhaltet. -\end_layout - -\begin_layout Subsection -Quellen besorgen -\end_layout - -\begin_layout Standard -Besorgen Sie sich den aktuellsten Kernel: -\begin_inset CommandInset href -LatexCommand href -name "http://www.kernel.org/" -target "http://www.kernel.org/" - -\end_inset - - -\end_layout - -\begin_layout Standard -Besorgen Sie sich das aktuellste iptables Paket: -\end_layout - -\begin_layout Itemize -Source tarball (für Kernel Patches): -\begin_inset CommandInset href -LatexCommand href -name "http://www.netfilter.org/" -target "http://www.netfilter.org/" - -\end_inset - - -\end_layout - -\begin_layout Subsection -Quellen entpacken -\end_layout - -\begin_layout Standard -Wechseln Sie in das Source-Verzeichnis: -\end_layout - -\begin_layout Code - -# cd /path/to/src -\end_layout - -\begin_layout Standard -Entpacken sie die Kernel-Quellen und vergeben diesen einen neuen Namen -\end_layout - -\begin_layout Code - -# tar z|jxf kernel-version.tar.gz|bz2 -\end_layout - -\begin_layout Code - -# mv linux linux-version-iptables-version+IPv6 -\end_layout - -\begin_layout Standard -Entpacken Sie die iptables Quellen -\end_layout - -\begin_layout Code - -# tar z|jxf iptables-version.tar.gz|bz2 -\end_layout - -\begin_layout Subsection -Neueste iptables/IPv6-relevante Patches den Kernel-Quellen hinzufügen -\end_layout - -\begin_layout Standard -Wechseln Sie in das iptables Verzeichnis -\end_layout - -\begin_layout Code - -# cd iptables-version -\end_layout - -\begin_layout Standard -Fügen Sie relevante Patches hinzu -\end_layout - -\begin_layout Code - -# make pending-patches KERNEL_DIR=/path/to/src/linux-version-iptables-version/ - -\end_layout - -\begin_layout Standard -Fügen Sie zusätzliche IPv6 relevante IPv6 Patches hinzu (die nach wie vor - nicht im Standard-Kernel enthalten sind) -\end_layout - -\begin_layout Code - -# make patch-o-matic KERNEL_DIR=/path/to/src/linux-version-iptables-version/ - -\end_layout - -\begin_layout Standard -Sagen Sie zu folgenden Optionen (iptables-1.2.2) Ja: -\end_layout - -\begin_layout Itemize -ah-esp.patch -\end_layout - -\begin_layout Itemize -masq-dynaddr.patch (nur benötigt bei Systemen mit dynamischer IP-Zuweisung - am WAN mittels PPP oder PPPoE) -\end_layout - -\begin_layout Itemize -ipv6-agr.patch.ipv6 -\end_layout - -\begin_layout Itemize -ipv6-ports.patch.ipv6 -\end_layout - -\begin_layout Itemize -LOG.patch.ipv6 -\end_layout - -\begin_layout Itemize -REJECT.patch.ipv6 -\end_layout - -\begin_layout Standard -Überprüfen Sie die Erweiterungen -\end_layout - -\begin_layout Code - -# make print-extensions -\end_layout - -\begin_layout Code - -Extensions found: IPv6:owner IPv6:limit IPv6:mac IPv6:multiport -\end_layout - -\begin_layout Subsection -Konfiguration, kompilieren und Installation eines neues Kernels -\end_layout - -\begin_layout Standard -Wechseln Sie zu den Kernel-Quellen -\end_layout - -\begin_layout Code - -# cd /path/to/src/linux-version-iptables-version/ -\end_layout - -\begin_layout Standard -Editieren Sie das Makefile -\end_layout - -\begin_layout Code - -- EXTRAVERSION = -\end_layout - -\begin_layout Code - -+ EXTRAVERSION = -iptables-version+IPv6-try -\end_layout - -\begin_layout Standard -Starten Sie configure und aktivieren Sie IPv6 relevante Optionen -\end_layout - -\begin_layout Code - - Code maturity level options -\end_layout - -\begin_layout Code - - Prompt for development and/or incomplete code/drivers - : yes -\end_layout - -\begin_layout Code - - Networking options -\end_layout - -\begin_layout Code - - Network packet filtering: yes -\end_layout - -\begin_layout Code - - The IPv6 protocol: module -\end_layout - -\begin_layout Code - - IPv6: Netfilter Configuration -\end_layout - -\begin_layout Code - - IP6 tables support: module -\end_layout - -\begin_layout Code - - All new options like following: -\end_layout - -\begin_layout Code - - limit match support: module -\end_layout - -\begin_layout Code - - MAC address match support: module -\end_layout - -\begin_layout Code - - Multiple port match support: module -\end_layout - -\begin_layout Code - - Owner match support: module -\end_layout - -\begin_layout Code - - netfilter MARK match support: module - -\end_layout - -\begin_layout Code - - Aggregated address check: module -\end_layout - -\begin_layout Code - - Packet filtering: module -\end_layout - -\begin_layout Code - - REJECT target support: module -\end_layout - -\begin_layout Code - - LOG target support: module -\end_layout - -\begin_layout Code - - Packet mangling: module -\end_layout - -\begin_layout Code - - MARK target support: module -\end_layout - -\begin_layout Standard -Konfigurieren Sie bei Bedarf Sonstiges abseits von IPv6. -\end_layout - -\begin_layout Standard -Kompilieren und Installation: siehe Kapitel Kernel sowie andere HOWTOs. -\end_layout - -\begin_layout Subsection -iptables neu kompilieren und installieren -\end_layout - -\begin_layout Standard -Stellen Sie sicher, dass obige Kernel-Sourceverzeichnisstruktur unter /usr/src/l -inux liegt -\end_layout - -\begin_layout Standard -Benennen sie das ältere Verzeichnis um -\end_layout - -\begin_layout Code - -# mv /usr/src/linux /usr/src/linux.old -\end_layout - -\begin_layout Standard -Erstellen Sie einen neuen symbolischen Link -\end_layout - -\begin_layout Code - -# ln -s /path/to/src/linux-version-iptables-version /usr/src/linux -\end_layout - -\begin_layout Standard -Erstellen Sie ein neues SRPMS -\end_layout - -\begin_layout Code - -# rpm --rebuild /path/to/SRPMS/iptables-version-release.src.rpm -\end_layout - -\begin_layout Standard -Installieren Sie das neue iptables Paket (iptables + iptables-ipv6) -\end_layout - -\begin_layout Itemize -Bei RH 7.1 Systemen ist normalerweise eine ältere Version hiervon bereits - installiert, verwenden Sie daher die Option -\begin_inset Quotes sld -\end_inset - -Freshen -\begin_inset Quotes srd -\end_inset - -: -\end_layout - -\begin_layout Code - -# rpm -Fhv /path/to/RPMS/cpu/iptables*-version-release.cpu.rpm -\end_layout - -\begin_layout Itemize -Ist keine ältere Version installiert, benutzen Sie die Option -\begin_inset Quotes sld -\end_inset - -install -\begin_inset Quotes srd -\end_inset - -: -\end_layout - -\begin_layout Code - -# rpm -ihv /path/to/RPMS/cpu/iptables*-version-release.cpu.rpm -\end_layout - -\begin_layout Itemize -Bei RH 6.2 Systemen ist normalerweise kein Kernel Version 2.4.x installiert - und die Anforderungen sind demnach nicht gegeben. - Benutzen Sie in diesem Fall -\begin_inset Quotes sld -\end_inset - -nodeps -\begin_inset Quotes srd -\end_inset - -: -\end_layout - -\begin_layout Code - -# rpm -ihv --nodeps /path/to/RPMS/cpu/iptables*-version-release.cpu.rpm -\end_layout - -\begin_layout Standard -Damit iptables die Libraries finden kann, ist es eventuell notwendig, einen - symbolischen Link für die iptables Libraries zu erstellen: -\end_layout - -\begin_layout Code - -# ln -s /lib/iptables/ /usr/lib/iptables -\end_layout - -\begin_layout Section -Verwendung -\end_layout - -\begin_layout Subsection -Unterstützung im Kernel -\end_layout - -\begin_layout Standard -Laden Sie das Modul (falls dies im Kernel so kompiliert wurde): -\end_layout - -\begin_layout Code - -# modprobe ip6_tables -\end_layout - -\begin_layout Standard -Überprüfen der IPv6-Unterstützung: -\end_layout - -\begin_layout Code - -# [ ! -f /proc/net/ip6_tables_names ] && echo "Current kernel doesn't support -\end_layout - -\begin_layout Code - -¬ 'ip6tables' firewalling (IPv6)!" -\end_layout - -\begin_layout Subsection -Die Benützung von iptables lernen -\end_layout - -\begin_layout Subsubsection -Auflistung aller netfilter Einträge -\end_layout - -\begin_layout Itemize -Kurze Auflistung: -\end_layout - -\begin_layout Code - -# ip6tables -L -\end_layout - -\begin_layout Itemize -Erweiterte Auflistung: -\end_layout - -\begin_layout Code - -# ip6tables -n -v --line-numbers -L -\end_layout - -\begin_layout Subsubsection -Auflistung angegebener Filter -\end_layout - -\begin_layout Code - -# ip6tables -n -v --line-numbers -L INPUT -\end_layout - -\begin_layout Subsubsection -Hinzufügen einer Log-Regel zum Input-Filter mit Optionen -\end_layout - -\begin_layout Code - -# ip6tables --table filter --append INPUT -j LOG --log-prefix "INPUT:" -\end_layout - -\begin_layout Code - -¬ --log-level 7 -\end_layout - -\begin_layout Subsubsection -Hinzufügen einer Drop-Regel zum Input-Filter -\end_layout - -\begin_layout Code - -# ip6tables --table filter --append INPUT -j DROP -\end_layout - -\begin_layout Subsubsection -Löschen einer Regel mit Hilfe der Regelnummer -\end_layout - -\begin_layout Code - -# ip6tables --table filter --delete INPUT 1 -\end_layout - -\begin_layout Subsubsection - -\lang english -Aktiviere die Auswertung des Verbindungsstatus (connection tracking) -\end_layout - -\begin_layout Standard - -\lang english -Seit Kernel-Version 2.6.20 ist die Auswertung des IPv6-Verbindungsstatus gut - unterstützt. - Die bis dahin statuslosen Filterregeln sollten ersetzt werden.. -\end_layout - -\begin_layout Code - -# ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -\end_layout - -\begin_layout Subsubsection -ICMPv6 erlauben -\end_layout - -\begin_layout Standard -Bei älteren Kernelversionen (unpatched kernel 2.4.5 und iptables-1.2.2) kann - keine nähere Spezifizierung des ICMPv6-Typs vorgenommen werden: -\end_layout - -\begin_layout Itemize -Eingehender ICMPv6 Verkehr durch Tunnel erlauben -\end_layout - -\begin_layout Code - -# ip6tables -A INPUT -i sit+ -p icmpv6 -j ACCEPT -\end_layout - -\begin_layout Itemize -Ausgehenden ICMPv6 Verkehr durch Tunnel erlauben -\end_layout - -\begin_layout Code - -# ip6tables -A OUTPUT -o sit+ -p icmpv6 -j ACCEPT -\end_layout - -\begin_layout Standard -Neuere Kernel erlauben das Spezifizieren des ICMPv6-Typs: -\end_layout - -\begin_layout Code - -# ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j ACCEPT -\end_layout - -\begin_layout Subsubsection -Rate-limiting -\end_layout - -\begin_layout Standard -Da es zu einem ICMPv6 Storm kommen kann (der Autor hat dies bereits mehrfach - beobachtet), sollten sie das rate limiting zumindest für das ICMP Regelset - einsetzen. - Zusätzlich sollten auch die Logging Regeln mit rate limiting geschützt - werden, um DoS Attacken gegen das syslog sowie gegen die Logdateien enthaltende -n Patitionen entgegenzuwirken. - Ein Beispiel für ein rate limited ICMPv6 sieht wie folgt aus: -\end_layout - -\begin_layout Code - -# ip6tables -A INPUT --protocol icmpv6 --icmpv6-type echo-request -\end_layout - -\begin_layout Code - -¬ -j ACCEPT --match limit --limit 30/minute -\end_layout - -\begin_layout Subsubsection -Eingehende SSH-Verbindung erlauben -\end_layout - -\begin_layout Standard -Im folgenden Beispiel werden eingehende SSH-Verbindungen von einer speziellen - IPv6 Adresse zugelassen: -\end_layout - -\begin_layout Itemize -Eingehende SSH Verbindungen werden von der Adresse 2001:0db8:100::1/128 - erlaubt -\end_layout - -\begin_layout Code - -# ip6tables -A INPUT -i sit+ -p tcp -s 2001:0db8:100::1/128 --sport 512:65535 -\end_layout - -\begin_layout Code - -¬ --dport 22 -j ACCEPT -\end_layout - -\begin_layout Itemize -Erlaube Antwortpakete -\lang english -( -\series bold -nicht mehr notwendig, wenn der IPv6-Verbindungsstatus ausgewertet wird! -\series default -) -\end_layout - -\begin_layout Code - -# ip6tables -A OUTPUT -o sit+ -p tcp -d 2001:0db8:100::1/128 --dport 512:65535 -\end_layout - -\begin_layout Code - -¬ --sport 22 ! --syn -j ACCEPT -\end_layout - -\begin_layout Subsubsection -Getunnelten IPv6-in-IPv4 Datenverkehr erlauben -\end_layout - -\begin_layout Standard -Um getunnelte IPv6-in-IPv4 Pakete zu akzeptieren, müssen Sie in Ihrem IPv4 - Firewall-Setup entsprechende Regeln einzufügen, z.B. -\end_layout - -\begin_layout Itemize -Akzeptiere eingehende IPv6-in-IPv4 Daten am interface ppp0 -\end_layout - -\begin_layout Code - -# iptables -A INPUT -i ppp0 -p ipv6 -j ACCEPT -\end_layout - -\begin_layout Itemize -Akzeptiere ausgehende IPv6-in-IPv4 Daten am interface ppp0 -\end_layout - -\begin_layout Code - -# iptables -A OUTPUT -o ppp0 -p ipv6 -j ACCEPT -\end_layout - -\begin_layout Standard -Haben Sie nur einen statischen Tunnel, dann können sie die IPv4 Adresse - auch dediziert angeben: -\end_layout - -\begin_layout Itemize -Akzeptiere eingehende IPv6-in-IPv4 Daten vom Tunnel-Endpunkt 192.0.2.2 am interface - ppp0 -\end_layout - -\begin_layout Code - -# iptables -A INPUT -i ppp0 -p ipv6 -s 192.0.2.2 -j ACCEPT -\end_layout - -\begin_layout Itemize -Akzeptiere ausgehende IPv6-in-IPv4 Daten vom Tunnel-Endpunkt 192.0.2.2 am interface - ppp0 -\end_layout - -\begin_layout Code - -# iptables -A OUTPUT -o ppp0 -p ipv6 -d 192.0.2.2 -j ACCEPT -\end_layout - -\begin_layout Subsubsection -Schutz gegen eingehende TCP-Verbindungs-Anfragen -\end_layout - -\begin_layout Standard - -\series bold -SEHR EMPFOHLEN! -\series default - Aus Sicherheitsgründen sollten Sie auf jeden Fall eine Regel inkludieren, - wodurch eingehende TCP-Verbindungs-Anfragen geblockt werden. - Wenn Sie andere Interfacenamen verwenden, müssen Sie die Option "-i" entspreche -nd anpassen! -\end_layout - -\begin_layout Itemize -Blockiere eingehende TCP-Verbindungs-Anfragen zu diesem Host -\end_layout - -\begin_layout Code - -# ip6tables -I INPUT -i sit+ -p tcp --syn -j DROP -\end_layout - -\begin_layout Itemize -Blockiere eingehende TCP-Verbindungs-Anfragen zu Hosts hinter diesem Router -\end_layout - -\begin_layout Code - -# ip6tables -I FORWARD -i sit+ -p tcp --syn -j DROP -\end_layout - -\begin_layout Standard -Eventuell müssen diese Regeln unterhalb anderer Regeln platziert werden. - Nehmen Sie sich für die Reihenfolge der Regeln etwas Zeit. - Sinnvoll wird es auch sein, ein Script mit den Regeln zu erstellen, damit - die Regeln in der gewünschten Reihenfolge angewendet werden. -\end_layout - -\begin_layout Subsubsection -Schutz gegen eingehende UDP-Verbindungs-Anfragen -\end_layout - -\begin_layout Standard - -\series bold -EBENFALLS SEHR EMPHOLEN! -\series default - Wie bereits im Kapitel Firewall erwähnt, ist es möglich die Ports bei ausgehend -en UDP/TCP-Verbindungen zu kontrollieren. - Im Falle, dass all Ihre IPv6 Systeme lokale Ports verwenden, z.B. - von 32768 bis 60999, dann können sie ebenfalls UDP Verbindungen filtern - (bis das Verbindungs-Tracking funktioniert): -\end_layout - -\begin_layout Itemize -Blockiere eingehende UDP-Pakete, die nicht Antworten ausgehender Anfragen - dieses Host sein können -\end_layout - -\begin_layout Code - -# ip6tables -I INPUT -i sit+ -p udp ! --dport 32768:60999 -j DROP -\end_layout - -\begin_layout Itemize -Blockiere eingehende UDP-Pakete, die nicht Antworten auf Anfragen von hinter - diesem Router gelegenen Hosts sein können -\end_layout - -\begin_layout Code - -# ip6tables -I FORWARD -i sit+ -p udp ! --dport 32768:60999 -j DROP -\end_layout - -\begin_layout Subsection -Anwendungsbeispiele -\end_layout - -\begin_layout Subsubsection - -\lang english -Einfaches Beispiel für Fedora -\end_layout - -\begin_layout Standard - -\lang english -Folgende Zeilen zeigen eine einfache Firewall-Konfiguration für Fedora 6 - (ab Kernel-Version 2.6.20). - Ausgehend von dem Origina (generiert durch -\shape italic -system-config-firewall -\shape default -) wurden Modifikationen für die Unterstützung des Verbindungsstatus und - der Rückgabe der passenden ICMPv6-Meldung für Rejects. - Eingehende SSH (Port 22) Verbindungen sind erlaubt. -\end_layout - -\begin_layout Code - -Datei: /etc/sysconfig/ip6tables -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -*filter :INPUT ACCEPT [0:0] -\end_layout - -\begin_layout Code - -:FORWARD ACCEPT [0:0] -\end_layout - -\begin_layout Code - -:OUTPUT ACCEPT [0:0] -\end_layout - -\begin_layout Code - -:RH-Firewall-1-INPUT - [0:0] -\end_layout - -\begin_layout Code - --A INPUT -j RH-Firewall-1-INPUT -\end_layout - -\begin_layout Code - --A FORWARD -j RH-Firewall-1-INPUT -\end_layout - -\begin_layout Code - --A RH-Firewall-1-INPUT -i lo -j ACCEPT -\end_layout - -\begin_layout Code - --A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT -\end_layout - -\begin_layout Code - --A RH-Firewall-1-INPUT -p 50 -j ACCEPT -\end_layout - -\begin_layout Code - --A RH-Firewall-1-INPUT -p 51 -j ACCEPT -\end_layout - -\begin_layout Code - --A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT -\end_layout - -\begin_layout Code - --A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT -\end_layout - -\begin_layout Code - --A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT -\end_layout - -\begin_layout Code - --A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -\end_layout - -\begin_layout Code - --A RH-Firewall-1-INPUT -m state --state NEW -p tcp --dport 22 -j ACCEPT -\end_layout - -\begin_layout Code - --A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited -\end_layout - -\begin_layout Code - -COMMIT -\end_layout - -\begin_layout Standard - -\lang english -Zwecks der Vollständigkeit ist hier auch die entsprechende Konfiguration - für IPv4 gezeigt: -\end_layout - -\begin_layout Code - -Datei: /etc/sysconfig/iptables -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -*filter :INPUT ACCEPT [0:0] -\end_layout - -\begin_layout Code - -:FORWARD ACCEPT [0:0] -\end_layout - -\begin_layout Code - -:OUTPUT ACCEPT [0:0] -\end_layout - -\begin_layout Code - -:RH-Firewall-1-INPUT - [0:0] -\end_layout - -\begin_layout Code - --A INPUT -j RH-Firewall-1-INPUT -\end_layout - -\begin_layout Code - --A FORWARD -j RH-Firewall-1-INPUT -\end_layout - -\begin_layout Code - --A RH-Firewall-1-INPUT -i lo -j ACCEPT -\end_layout - -\begin_layout Code - --A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT -\end_layout - -\begin_layout Code - --A RH-Firewall-1-INPUT -p 50 -j ACCEPT -\end_layout - -\begin_layout Code - --A RH-Firewall-1-INPUT -p 51 -j ACCEPT -\end_layout - -\begin_layout Code - --A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT -\end_layout - -\begin_layout Code - --A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT -\end_layout - -\begin_layout Code - --A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT -\end_layout - -\begin_layout Code - --A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -\end_layout - -\begin_layout Code - --A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j - ACCEPT -\end_layout - -\begin_layout Code - --A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited -\end_layout - -\begin_layout Code - -COMMIT -\end_layout - -\begin_layout Standard - -\lang english -Benutzung: -\end_layout - -\begin_layout Itemize - -\lang english -Erzeugen/Modifizieren der Konfigurationsdateien -\end_layout - -\begin_layout Itemize - -\lang english -Aktivieren von IPv4 & IPv6 Firewalling -\end_layout - -\begin_layout Code - -# service iptables start -\end_layout - -\begin_layout Code - -# service ip6tables start -\end_layout - -\begin_layout Itemize - -\lang english -Aktivieren des automatischen Starts nach dem Reboot -\end_layout - -\begin_layout Code - -# chkconfig iptables on -\end_layout - -\begin_layout Code - -# chkconfig ip6tables on -\end_layout - -\begin_layout Subsubsection -Umfangreicheres Beispiel -\end_layout - -\begin_layout Standard -Folgende Zeilen zeigen ein umfangreicheres Setup. - Happy netfilter6 Regelset erstellen... -\end_layout - -\begin_layout Code - -# ip6tables -n -v -L -\end_layout - -\begin_layout Code - -Chain INPUT (policy DROP 0 packets, 0 bytes) -\end_layout - -\begin_layout Code - - pkts bytes target prot opt in out source destination -\end_layout - -\begin_layout Code - - 0 0 extIN all sit+ * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 4 384 intIN all eth0 * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 ACCEPT all * * ::1/128 ::1/128 - -\end_layout - -\begin_layout Code - - 0 0 ACCEPT all lo * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 LOG all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ LOG flags 0 level 7 prefix `INPUT-default:' -\end_layout - -\begin_layout Code - - 0 0 DROP all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Code - -Chain FORWARD (policy DROP 0 packets, 0 bytes) -\end_layout - -\begin_layout Code - - pkts bytes target prot opt in out source destination -\end_layout - -\begin_layout Code - -¬ -\end_layout - -\begin_layout Code - - 0 0 int2ext all eth0 sit+ ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 ext2int all sit+ eth0 ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 LOG all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ LOG flags 0 level 7 prefix `FORWARD-default:' -\end_layout - -\begin_layout Code - - 0 0 DROP all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Code - -Chain OUTPUT (policy DROP 0 packets, 0 bytes) -\end_layout - -\begin_layout Code - - pkts bytes target prot opt in out source destination -\end_layout - -\begin_layout Code - -¬ -\end_layout - -\begin_layout Code - - 0 0 extOUT all * sit+ ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 4 384 intOUT all * eth0 ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 ACCEPT all * * ::1/128 ::1/128 - -\end_layout - -\begin_layout Code - - 0 0 ACCEPT all * lo ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 LOG all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ LOG flags 0 level 7 prefix `OUTPUT-default:' -\end_layout - -\begin_layout Code - - 0 0 DROP all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Code - -Chain ext2int (1 references) -\end_layout - -\begin_layout Code - - pkts bytes target prot opt in out source destination -\end_layout - -\begin_layout Code - -¬ -\end_layout - -\begin_layout Code - - 0 0 ACCEPT icmpv6 * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 ACCEPT tcp * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ tcp spts:1:65535 dpts:1024:65535 flags:!0x16/0x02 -\end_layout - -\begin_layout Code - - 0 0 LOG all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ LOG flags 0 level 7 prefix `ext2int-default:' -\end_layout - -\begin_layout Code - - 0 0 DROP tcp * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 DROP udp * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 DROP all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Code - -Chain extIN (1 references) -\end_layout - -\begin_layout Code - - pkts bytes target prot opt in out source destination -\end_layout - -\begin_layout Code - -¬ -\end_layout - -\begin_layout Code - - 0 0 ACCEPT tcp * * 3ffe:400:100::1/128 ::/0 - -\end_layout - -\begin_layout Code - -¬ tcp spts:512:65535 dpt:22 -\end_layout - -\begin_layout Code - - 0 0 ACCEPT tcp * * 3ffe:400:100::2/128 ::/0 - -\end_layout - -\begin_layout Code - -¬ tcp spts:512:65535 dpt:22 -\end_layout - -\begin_layout Code - - 0 0 ACCEPT icmpv6 * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 ACCEPT tcp * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ tcp spts:1:65535 dpts:1024:65535 flags:!0x16/0x02 -\end_layout - -\begin_layout Code - - 0 0 ACCEPT udp * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ udp spts:1:65535 dpts:1024:65535 -\end_layout - -\begin_layout Code - - 0 0 LOG all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ limit: avg 5/min burst 5 LOG flags 0 level 7 prefix `extIN-default:' - -\end_layout - -\begin_layout Code - - 0 0 DROP all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Code - -Chain extOUT (1 references) -\end_layout - -\begin_layout Code - - pkts bytes target prot opt in out source destination -\end_layout - -\begin_layout Code - -¬ -\end_layout - -\begin_layout Code - - 0 0 ACCEPT tcp * * ::/0 -\end_layout - -\begin_layout Code - -¬ 2001:0db8:100::1/128tcp spt:22 dpts:512:65535 flags:!0x16/0x02 -\end_layout - -\begin_layout Code - - 0 0 ACCEPT tcp * * ::/0 -\end_layout - -\begin_layout Code - -¬ 2001:0db8:100::2/128tcp spt:22 dpts:512:65535 flags:!0x16/0x02 -\end_layout - -\begin_layout Code - - 0 0 ACCEPT icmpv6 * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 ACCEPT tcp * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ tcp spts:1024:65535 dpts:1:65535 -\end_layout - -\begin_layout Code - - 0 0 ACCEPT udp * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ udp spts:1024:65535 dpts:1:65535 -\end_layout - -\begin_layout Code - - 0 0 LOG all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ LOG flags 0 level 7 prefix `extOUT-default:' -\end_layout - -\begin_layout Code - - 0 0 DROP all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Code - -Chain int2ext (1 references) -\end_layout - -\begin_layout Code - - pkts bytes target prot opt in out source destination -\end_layout - -\begin_layout Code - -¬ -\end_layout - -\begin_layout Code - - 0 0 ACCEPT icmpv6 * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 ACCEPT tcp * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ tcp spts:1024:65535 dpts:1:65535 -\end_layout - -\begin_layout Code - - 0 0 LOG all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ LOG flags 0 level 7 prefix `int2ext:' -\end_layout - -\begin_layout Code - - 0 0 DROP all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 LOG all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ LOG flags 0 level 7 prefix `int2ext-default:' -\end_layout - -\begin_layout Code - - 0 0 DROP tcp * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 DROP udp * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 DROP all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Code - -Chain intIN (1 references) -\end_layout - -\begin_layout Code - - pkts bytes target prot opt in out source destination -\end_layout - -\begin_layout Code - -¬ -\end_layout - -\begin_layout Code - - 0 0 ACCEPT all * * ::/0 -\end_layout - -\begin_layout Code - -¬ fe80::/ffc0:: -\end_layout - -\begin_layout Code - - 4 384 ACCEPT all * * ::/0 ff02::/16 - -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Code - -Chain intOUT (1 references) -\end_layout - -\begin_layout Code - - pkts bytes target prot opt in out source destination -\end_layout - -\begin_layout Code - -¬ -\end_layout - -\begin_layout Code - - 0 0 ACCEPT all * * ::/0 -\end_layout - -\begin_layout Code - -¬ fe80::/ffc0:: -\end_layout - -\begin_layout Code - - 4 384 ACCEPT all * * ::/0 ff02::/16 - -\end_layout - -\begin_layout Code - - 0 0 LOG all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ LOG flags 0 level 7 prefix `intOUT-default:' -\end_layout - -\begin_layout Code - - 0 0 DROP all * * ::/0 ::/0 - -\end_layout - -\begin_layout Section - -\lang english -\begin_inset CommandInset label -LatexCommand label -name "nat-netfilter6" - -\end_inset - -Network Address Translation (NAT) mit netfilter6 -\end_layout - -\begin_layout Standard - -\lang english -Seit mindestens Linux Kernel-Version 3.9.0 und ip6tables ab 1.4.18 kann Network - Address Translation (NAT) genutzt werden. -\end_layout - -\begin_layout Subsection - -\lang english -IPv6 Maskierung -\end_layout - -\begin_layout Standard - -\lang english -Wie bei IPv4 können Systeme hinter einem Router versteckt werden mit Hilfe - von IPv6 Maskierung (hide/overlap NAT), z.B. -\end_layout - -\begin_layout Code - -# ip6tables -t nat -A POSTROUTING -o sixxs -s fec0::/64 -j MASQUERADE -\end_layout - -\begin_layout Subsection - -\lang english -IPv6 Destination NAT -\end_layout - -\begin_layout Standard - -\lang english -Eine dedizierte öffentliche IPv6-Adresse kann zu einer internen IPv6-Adresse - weitergeleitet werden, z.B. -\end_layout - -\begin_layout Code - -# ip6tables -t nat -A PREROUTING -d 2001:db8:0:1:5054:ff:fe01:2345 -i sixxs - -j DNAT --to-destination fec0::5054:ff:fe01:2345 -\end_layout - -\begin_layout Subsection - -\lang english -IPv6 Port Weiterleitung -\end_layout - -\begin_layout Standard - -\lang english -Ein dedizierter Port kann zu einem internen System weitergeleitet werden, - z.B. -\end_layout - -\begin_layout Code - -# ip6tables -t nat -A PREROUTING -i sixxs -p tcp --dport 8080 -j DNAT --to-desti -nation [fec0::1234]:80 -\end_layout - -\begin_layout Section - -\lang english -Firewall-Setup mit nftables -\end_layout - -\begin_layout Standard - -\lang english -Mit nftables wurde die Unterstützung einer Tabelle names -\begin_inset Quotes sld -\end_inset - -inet -\begin_inset Quotes srd -\end_inset - - eingeführt in welcher Regeln für IPv4/IPv6 gleichzeitig gelten -\end_layout - -\begin_layout Subsection - -\lang english -Präparation zur Nutzung von nftables -\end_layout - -\begin_layout Standard - -\lang english -Installieren einer Linux-Distribution, welche die Unterstützung für nftables - bereits eingebaut hat. - Beim Schreiben dieses Absatzes (Mai 2014) war mindestens Fedora Rawhide - (Vorläufer der Version 21) mit entsprechendem Support und nftables version - 0.2.0 versehen. -\end_layout - -\begin_layout Subsection - -\lang english -Basis-nftables Konfiguration -\end_layout - -\begin_layout Standard - -\lang english -Laden der Kernel-Module: -\end_layout - -\begin_layout Code - -# modprobe nf_tables -\end_layout - -\begin_layout Code - -# modprobe nf_tables_ipv4 -\end_layout - -\begin_layout Code - -# modprobe nf_tables_ipv6 -\end_layout - -\begin_layout Code - -# modprobe nf_tables_inet -\end_layout - -\begin_layout Standard - -\lang english -Löschen der Regeln in iptables and ip6tables um Interferenzen zu vermeiden: -\end_layout - -\begin_layout Code - -# iptables -F -\end_layout - -\begin_layout Code - -# ip6tables -F -\end_layout - -\begin_layout Standard - -\lang english -Erzeugen der Filter-Tabelle: -\end_layout - -\begin_layout Code - -# nft add table inet filter -\end_layout - -\begin_layout Standard - -\lang english -Erzeugen einer input chain in der Filter-Tabelle: -\end_layout - -\begin_layout Code - -# nft add chain inet filter input { type filter hook input priority 0 -\backslash -; } -\end_layout - -\begin_layout Subsection - -\lang english -Einfache Filter-Policy mit nftables -\end_layout - -\begin_layout Subsubsection - -\lang english -Konfiguration -\end_layout - -\begin_layout Standard - -\lang english -Erlauben von Paketen, die zu existierenden Einträgen in der Connection-Tracking- -Tabelle gehören -\end_layout - -\begin_layout Code - -# nft add rule inet filter input ct state established,related counter accept - -\end_layout - -\begin_layout Standard - -\lang english -Erlauben von IPv4 und IPv6 ICMP echo-request (aka ping) -\end_layout - -\begin_layout Code - -# nft add rule inet filter input meta nfproto ipv4 icmp type { echo-request - } counter accept -\end_layout - -\begin_layout Code - -# nft add rule inet filter input meta nfproto ipv6 icmpv6 type echo-request - counter accept -\end_layout - -\begin_layout Standard - -\lang english -Erlauben einiger wichtiger IPv6 ICMP Pakete, ohne Zähler, dafür mit Hop-Limit-Pr -üfung (erhöht die Sicherheit) -\end_layout - -\begin_layout Code - -# nft add rule inet filter input meta nfproto ipv6 -\end_layout - -\begin_layout Code - -¬ icmpv6 type { nd-neighbor-advert, nd-neighbor-solicit, nd-router-advert} - ip6 hoplimit 1 accept -\end_layout - -\begin_layout Code - -# nft add rule inet filter input meta nfproto ipv6 -\end_layout - -\begin_layout Code - -¬ icmpv6 type { nd-neighbor-advert, nd-neighbor-solicit, nd-router-advert} - ip6 hoplimit 255 counter accept -\end_layout - -\begin_layout Standard - -\lang english -Erlauben von eingehenden SSH-Verbindungen für IPv4 und IPv6 -\end_layout - -\begin_layout Code - -# nft add rule inet filter input tcp dport 22 ct state new tcp flags -\backslash -& -\backslash -(syn -\backslash -| ack -\backslash -) == syn counter accept -\end_layout - -\begin_layout Standard - -\lang english -Reject/drop anderer Pakete -\end_layout - -\begin_layout Code - -# nft add rule inet filter input tcp dport 0-65535 reject -\end_layout - -\begin_layout Code - -# nft add rule inet filter input udp dport 0-65535 counter drop -\end_layout - -\begin_layout Code - -# nft add rule inet filter input counter drop -\end_layout - -\begin_layout Subsubsection - -\lang english -Ergebnis -\end_layout - -\begin_layout Standard - -\lang english -Tabelle für IP unabhängigen Filter -\end_layout - -\begin_layout Code - -table inet filter { -\end_layout - -\begin_layout Code - - chain input { -\end_layout - -\begin_layout Code - - type filter hook input priority 0; -\end_layout - -\begin_layout Code - - ct state established,related counter packets 0 bytes 0 accept -\end_layout - -\begin_layout Code - - ip protocol icmp icmp type { echo-request} counter packets 0 bytes 0 - accept -\end_layout - -\begin_layout Code - - ip6 nexthdr ipv6-icmp icmpv6 type echo-request counter packets 0 bytes - 0 accept -\end_layout - -\begin_layout Code - - ip6 nexthdr ipv6-icmp ip6 hoplimit 1 icmpv6 type { nd-neighbor-advert, - nd-neighbor-solicit, nd-router-advert} accept -\end_layout - -\begin_layout Code - - ip6 nexthdr ipv6-icmp ip6 hoplimit 255 icmpv6 type { nd-neighbor-advert, - nd-neighbor-solicit, nd-router-advert} accept -\end_layout - -\begin_layout Code - - tcp dport ssh ct state new tcp flags & (syn | ack) == syn counter packets - 0 bytes 0 accept -\end_layout - -\begin_layout Code - - tcp dport >= 0 tcp dport <= 65535 counter packets 0 bytes 0 reject -\end_layout - -\begin_layout Code - - udp dport >= 0 udp dport <= 65535 counter packets 0 bytes 0 drop -\end_layout - -\begin_layout Code - - log prefix counter packets 0 bytes 0 drop -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - -} -\end_layout - -\begin_layout Subsubsection - -\lang english -Tipps für's Loggen -\end_layout - -\begin_layout Standard - -\lang english -Für Logging wird ein zusätzliches Kernelmodul benötigt: -\end_layout - -\begin_layout Code - -# modprobe xt_LOG -\end_layout - -\begin_layout Standard - -\lang english -ACHTUNG, MOMENTAN KANN DER LOG-LEVEL NICHT ANGEGEBEN WERDEN, dadurch werden - nftables-Ereignisse mit Log-Level kern.emerg ausgegeben - ES BESTEHT DIE - GEFAHR, DASS DIE KONSOLE DADURCH ÜBERFLUTET WIRD! -\end_layout - -\begin_layout Standard - -\lang english -Für erste Tests mit der Log-Option kann es nützlich sein, das Loggens für - emergency-Ereignisse in z.B. - /etc/rsyslog.conf zu deaktivieren mit Hilfe eines -\begin_inset Quotes sld -\end_inset - -# -\begin_inset Quotes srd -\end_inset - - am Anfang der Zeile und Neustart des logging-Daemons -\end_layout - -\begin_layout Code - -#*.emerg :omusrmsg:* -\end_layout - -\begin_layout Standard - -\lang english -Regel von oben, welche SSH auf Port 22 erlaubt, nun mit Logging: -\end_layout - -\begin_layout Code - -# nft add rule inet filter input tcp dport 22 ct state new tcp flags -\backslash -& -\backslash -(syn -\backslash -| ack -\backslash -) == syn log prefix -\backslash -"inet/input/accept: -\backslash -" counter accept -\end_layout - -\begin_layout Subsection - -\lang english -Filter-Policy mit nftables unter Benutzung der Tablellen -\begin_inset Quotes sld -\end_inset - -ip -\begin_inset Quotes srd -\end_inset - -, -\begin_inset Quotes sld -\end_inset - -ip6 -\begin_inset Quotes srd -\end_inset - - und -\begin_inset Quotes sld -\end_inset - -inet -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard - -\lang english -Wie oben schon beschrieben, wenn die Regeln in den einzelnen Tabellen konfigurie -rt werden, muss gesichert sein, dass frühere -\begin_inset Quotes sld -\end_inset - -accepts -\begin_inset Quotes srd -\end_inset - - nicht aufgehoben werden. - Eine einfache Lösung ist die Benutzung von Markierungen. - Regeln, die Pakete erlauben, setzen die Marke mit -\begin_inset Quotes sld -\end_inset - -meta mark set xxxx -\begin_inset Quotes srd -\end_inset - -. - Eine generische Regel erlaubt Pakete mit gesetzter Marke -\begin_inset Quotes sld -\end_inset - -mark xxxx -\begin_inset Quotes srd -\end_inset - -. - Beispiel für ein resultierendes Filter-Regelwerk: -\end_layout - -\begin_layout Code - -# for table in ip ip6 inet; do nft list table $table filter; done -\end_layout - -\begin_layout Code - -table ip filter { -\end_layout - -\begin_layout Code - - chain input { -\end_layout - -\begin_layout Code - - type filter hook input priority 0; -\end_layout - -\begin_layout Code - - ct state established,related counter packets 241 bytes 25193 accept -\end_layout - -\begin_layout Code - - counter packets 2 bytes 120 mark 0x00000100 accept -\end_layout - -\begin_layout Code - - icmp type { echo-request} counter packets 0 bytes 0 meta mark set 0x00000100 - accept -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - -} -\end_layout - -\begin_layout Code - -table ip6 filter { -\end_layout - -\begin_layout Code - - chain input { -\end_layout - -\begin_layout Code - - type filter hook input priority 0; -\end_layout - -\begin_layout Code - - ct state established,related counter packets 14 bytes 4077 accept -\end_layout - -\begin_layout Code - - counter packets 4 bytes 408 mark 0x00000100 accept -\end_layout - -\begin_layout Code - - icmpv6 type echo-request counter packets 1 bytes 104 meta mark set 0x00000100 -\end_layout - -\begin_layout Code - - icmpv6 type { nd-neighbor-advert, nd-neighbor-solicit, nd-router-advert} - counter packets 2 bytes 224 meta mark set 0x00000100 accept -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - -} -\end_layout - -\begin_layout Code - -table inet filter { -\end_layout - -\begin_layout Code - - chain input { -\end_layout - -\begin_layout Code - - type filter hook input priority 0; -\end_layout - -\begin_layout Code - - ct state established,related counter packets 307 bytes 31974 accept -\end_layout - -\begin_layout Code - - counter packets 6 bytes 528 mark 0x00000100 accept -\end_layout - -\begin_layout Code - - tcp dport ssh ct state new tcp flags & (syn | ack) == syn log prefix - "inet/input/accept: " meta mark set 0x00000100 counter packets 3 bytes - 200 accept -\end_layout - -\begin_layout Code - - log prefix "inet/input/reject: " counter packets 0 bytes 0 reject -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - -} -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-security" - -\end_inset - -Sicherheit -\end_layout - -\begin_layout Section -Sicherheit des Knoten -\end_layout - -\begin_layout Standard -Es wird sehr empfohlen alle verfügbaren Patches einzuspielen sowie alle - nicht benötigten Dienste zu deaktivieren. - Ebenfalls sollten Sie lokales firewalling aktivieren und binden Sie die - Dienste ausschließlich an benötigte IPv4/IPv6 Adressen. -\end_layout - -\begin_layout Standard -Mehr Infos hierzu in späteren Versionen. -\end_layout - -\begin_layout Section -Zugangsbeschränkungen -\end_layout - -\begin_layout Standard -Viele Dienste setzen die tcp_wrapper Bibliothek für die Zugangskontrolle - ein. - Eine Beschreibung finden Sie unter -\begin_inset CommandInset ref -LatexCommand ref -name "use of tcp_wrapper" -reference "hints-daemons-tcpwrapper" - -\end_inset - -. -\end_layout - -\begin_layout Standard -Mehr Infos hierzu in späteren Versionen. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "IPv6-security-auditing" - -\end_inset - -IPv6 Sicherheitsüberwachung -\end_layout - -\begin_layout Standard -Aktuell gibt es keine komfortablen Sicherheitstools mit denen man ein System - über ein Netzwerk nach IPv6 relevanten Sicherheitslücken hin überprüfen - kann. - Weder -\begin_inset CommandInset href -LatexCommand href -name "Nessus" -target "http://www.nessus.org/" - -\end_inset - - noch irgendein kommerzieller Security Scanner ist zur Zeit dazu in der - Lage, IPv6-Adressen scannen zu können. -\end_layout - -\begin_layout Subsection -Rechtsfragen -\end_layout - -\begin_layout Standard -ACHTUNG: Bitte stellen Sie immer sicher, dass Sie ausschließlich ihr eigenes - Netzwerk scannen oder einen Scan nur nach Erhalt einer schriftlichen Erlaubnis - durchführen. - Andernfalls haben sie mit rechtlichen Konsequenzen zu rechnen! -\begin_inset Newline newline -\end_inset - -ÜBERPRÜFEN Sie die Ziel-IPv6-Adresse ZWEIMAL, bevor Sie einen Scan starten. -\end_layout - -\begin_layout Subsection -Sicherheitsüberwachung mit IPv6 fähigen netcat -\end_layout - -\begin_layout Standard -Mit dem IPv6 fähigen netcat (siehe -\begin_inset CommandInset href -LatexCommand href -name "IPv6+Linux-status-apps/security-auditing" -target "http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status-apps.html#security-auditing" - -\end_inset - - für Details) können Sie einen Portscan durchführen. - Es wird ein Script abgearbeitet, wobei u.a. - ein Port-Bereich überprüft und Banners mitprotokolliert werden. - Anwendungsbeispiel: -\end_layout - -\begin_layout Code - -# nc6 ::1 daytime -\end_layout - -\begin_layout Code - -13 JUL 2002 11:22:22 CEST -\end_layout - -\begin_layout Subsection -Sicherheitsüberwachung mit IPv6 fähigen NMap -\end_layout - -\begin_layout Standard -\begin_inset CommandInset href -LatexCommand href -name "NMap" -target "http://www.insecure.org/nmap/" - -\end_inset - -, einer der weltweit besten Portscanner, unterstützt IPv6 seit der Version - 3.10ALPHA1. - Anwendungsbeispiel: -\end_layout - -\begin_layout Code - -# nmap -6 -sT ::1 -\end_layout - -\begin_layout Code - -Starting nmap V. - 3.10ALPHA3 ( www.insecure.org/nmap/ ) -\end_layout - -\begin_layout Code - -Interesting ports on localhost6 (::1): -\end_layout - -\begin_layout Code - -(The 1600 ports scanned but not shown below are in state: closed) -\end_layout - -\begin_layout Code - -Port State Service -\end_layout - -\begin_layout Code - -22/tcp open ssh -\end_layout - -\begin_layout Code - -53/tcp open domain -\end_layout - -\begin_layout Code - -515/tcp open printer -\end_layout - -\begin_layout Code - -2401/tcp open cvspserver -\end_layout - -\begin_layout Code - -Nmap run completed -- 1 IP address (1 host up) scanned in 0.525 seconds -\end_layout - -\begin_layout Subsection -Sicherheitsüberprüfung IPv6 fähigen strobe -\end_layout - -\begin_layout Standard -Strobe ist (im Vergleich zu NMap) ein low budget Portscanner. - Allerdings gibt es für Strobe einen IPv6 Patch (siehe -\begin_inset CommandInset href -LatexCommand href -name "IPv6+Linux-status-apps/security-auditing" -target "http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status-apps.html#security-auditing" - -\end_inset - - für Details). - Anwendungsbeispiel: -\end_layout - -\begin_layout Code - -# ./strobe ::1 strobe 1.05 (c) 1995-1999 Julian Assange . -\end_layout - -\begin_layout Code - -::1 2401 unassigned unknown -\end_layout - -\begin_layout Code - -::1 22 ssh Secure Shell - RSA encrypted rsh -\end_layout - -\begin_layout Code - -::1 515 printer spooler (lpd) -\end_layout - -\begin_layout Code - -::1 6010 unassigned unknown -\end_layout - -\begin_layout Code - -::1 53 domain Domain Name Server -\end_layout - -\begin_layout Standard -Hinweis: strobe wird nicht wirklich weiterentwickelt, die abgebildete Versionsnu -mmer ist zudem falsch. -\end_layout - -\begin_layout Subsection - -\lang english -Sicherheitsüberprüfung mit Online-Werkzeugen -\end_layout - -\begin_layout Standard - -\lang english -Es gibt einige IPv6-fähige Online-Werkzeuge, welche das Testen einer Firewall-Ko -nfiguration bzgl. - eingehenden Verbindungen unterstützen können: -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "Tim's Online IPv6 TCP/UDP Port Scanner" -target "http://ipv6.chappell-family.com/ipv6tcptest/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "SubnetOnline IPv6 Scanner" -target "http://www.subnetonline.com/pages/ipv6-network-tools/online-ipv6-port-scanner.php" - -\end_inset - - -\end_layout - -\begin_layout Subsection -Überprüfungsergebnisse -\end_layout - -\begin_layout Standard -Falls das Ergebnis einer Überwachung nicht Ihren IPv6 Sicherheitsrichtlinien - entspricht, schließen Sie die Lücken mit Hilfe der IPv6-Firewall-Funktionalität -, z.B. - mit netfilter6 (siehe -\begin_inset CommandInset ref -LatexCommand ref -name "Firewalling/Netfilter6" -reference "firewalling-netfilter6" - -\end_inset - - für Details). - -\end_layout - -\begin_layout Standard -Hinweis: Detailliertere Informationen zum Thema IPv6 Sicherheit finden Sie - unter folgenden Links: -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "IETF drafts - IPv6 Operations (v6ops)" -target "http://www.ietf.org/ids.by.wg/v6ops.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "RFC 3964 / Security Considerations for 6to4" -target "http://www.faqs.org/rfcs/rfc3964.html" - -\end_inset - - -\end_layout - -\begin_layout Chapter - -\lang english -\begin_inset CommandInset label -LatexCommand label -name "chapter-encryption-authentication" - -\end_inset - -Verschlüsselung und Authentifizierung -\end_layout - -\begin_layout Standard - -\lang english -Zum Unterschied zu IPv4 ist die Verschlüsselung und die Authentifizierung - ein zwingendes Feature bei IPv6. - Diese Features werden normalerweise mit IPsec implementiert (das auch von - IPv4 verwendet wird). - -\end_layout - -\begin_layout Section - -\lang english -Nutzungsarten von Verschlüsselung und Authentifizierung -\end_layout - -\begin_layout Standard - -\lang english -Zwei Arten von Verschlüsselung und Authentifzierung einer Verbindung sind - möglich: -\end_layout - -\begin_layout Subsection - -\lang english -Transport-Modus -\end_layout - -\begin_layout Standard - -\lang english -Der Transport-Modus ist ein Modus nur für Ende-zu-Ende-Verbindungen. - Hier wird nur die Nutzlast (üblicherweise ICMP, TCP oder UDP) mit deren - entsprechenden Headern verschlüsselt, wogegen der IP-Header nicht verschlüsselt - wird (aber üblicherweise in die Authentifizierung eingebunden wird). -\end_layout - -\begin_layout Standard - -\lang english -Bei Nutzung von AES-128 für Verschlüsselung und SHA1 für Authentifizierung - reduziert dieser Modus die MTU um 42 Oktetts. -\end_layout - -\begin_layout Subsection - -\lang english -Tunnel-Modus -\end_layout - -\begin_layout Standard - -\lang english -Der Tunnel-Modus kann einerseits für eine Ende-zu-Ende wie auch für eine - Gatewas-zu-Gateway-Verbindung genutzt werden. - Hier wird das komplette IP-Paket verschlüsselt und ein neuer IP-Header - vorangestellt . -\end_layout - -\begin_layout Standard - -\lang english -Dieser Modus reduziert die MTU um weitere 40 Oktetts (bei IPv6), ausgehend - von der MTU des Transport-Modus. -\end_layout - -\begin_layout Section - -\lang english -Unterstützung im Kernel (ESP und AH) -\end_layout - -\begin_layout Subsection - -\lang english -Unterstützung im vanilla Linux Kernel 2.4.x -\end_layout - -\begin_layout Standard - -\lang english -Fehlt in vanilla 2.4. - In der Vergangenheit gab es einen Grund, die Linux Kernel Quellen frei - von Export/Import-Kontrollgesetzen bzgl. - Verschlüsselungs-Techniken zu halten. - Dies ist auch ein Grund, wieso -\begin_inset CommandInset href -LatexCommand href -name "FreeS/WAN project" -target "http://www.freeswan.org/" - -\end_inset - - nicht in die vanilla Quellen miteingebunden wurde. -\end_layout - -\begin_layout Subsection - -\lang english -Unterstützung im vanilla Linux kernel 2.6.x -\end_layout - -\begin_layout Standard - -\lang english -Aktuelle Versionen (zum Zeitpunkt des Schreibens 2.6.9 und neuer) unterstützt - IPsec für IPv4 und IPv6. -\end_layout - -\begin_layout Standard - -\lang english -Die Implementierung wurde u.a. - vom USAGI project unterstützt. -\end_layout - -\begin_layout Section - -\lang english -Automatischer Schlüssel-Austausch (IKE) -\end_layout - -\begin_layout Standard - -\lang english -IPsec benötigt einen Schlüsselaustausch mit einem -\begin_inset Quotes sld -\end_inset - -Geheimnis -\begin_inset Quotes srd -\end_inset - -. - Dieser Vorgang wird meistens automatisch durch sogenannte IKE-Daemons durchgefü -hrt. - Diese führen ebenso die Authentifizierung der Partner durch, entweder durch - ein gemeinsam bekanntes Geheimnis (auch -\begin_inset Quotes sld -\end_inset - -pre-shared secret -\begin_inset Quotes srd -\end_inset - - genannt) oder bei RSA-Schlüssel (z.B. - aus X.509 Zertifikaten). -\end_layout - -\begin_layout Standard - -\lang english -Momentan stehen (für Linux) zwei verschiedene IKE-Daemons zur Verfügung, - die aber sich ziemlich in Konfiguration und Benutzung unterscheiden. -\end_layout - -\begin_layout Standard - -\lang english -Ich präferiere -\begin_inset Quotes sld -\end_inset - -pluto -\begin_inset Quotes srd -\end_inset - - von der *S/WAN Implementierung, wei dieser eine überschaubare (und nur - eine) Konfiguration. -\end_layout - -\begin_layout Subsection - -\lang english -IKE-Daemon -\begin_inset Quotes sld -\end_inset - -racoon -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard - -\lang english -Der IKE-Daemon -\begin_inset Quotes sld -\end_inset - -racoon -\begin_inset Quotes srd -\end_inset - - ist vom KAME-Project und auf Linux portiert worden. - Aktuelle Linux-Distributionen beinhalten diesen Daemon im Paket -\begin_inset Quotes sld -\end_inset - -ipsec-tools -\begin_inset Quotes srd -\end_inset - -. - Zwei Programme sind für ein funktionierendes IPsec-Setup notwendig. - Siehe dazu auch das -\begin_inset CommandInset href -LatexCommand href -name "Linux Advanced Routing & Traffic Control HOWTO / IPSEC" -target "http://lartc.org/howto/lartc.ipsec.html" - -\end_inset - -. -\end_layout - -\begin_layout Subsubsection - -\lang english -Manipulation der IPsec SA/SP Datenbank mit dem Werkzeug -\begin_inset Quotes sld -\end_inset - -setkey -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard - -\lang english -\begin_inset Quotes sld -\end_inset - -setkey -\begin_inset Quotes srd -\end_inset - - ist für die Definition der Security Policy (SP) im Kernel wichtig. -\end_layout - -\begin_layout Standard - -\lang english -Datei: /etc/racoon/setkey.sh -\end_layout - -\begin_layout Itemize - -\lang english -Beispiel für eine Ende-zu-Ende verschlüsselte Verbindung im Transport-Modus -\end_layout - -\begin_layout Code - -#!/sbin/setkey -f -\end_layout - -\begin_layout Code - -flush; -\end_layout - -\begin_layout Code - -spdflush; -\end_layout - -\begin_layout Code - -spdadd 2001:db8:1:1::1 2001:db8:2:2::2 any -P out ipsec esp/transport//require; -\end_layout - -\begin_layout Code - -spdadd 2001:db8:2:2::2 2001:db8:1:1::1 any -P in ipsec esp/transport//require; -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Itemize - -\lang english -Beispiel für eine Ende-zu-Ende verschlüsselte Verbindung im Tunnel-Modus -\end_layout - -\begin_layout Code - -#!/sbin/setkey -f -\end_layout - -\begin_layout Code - -flush; -\end_layout - -\begin_layout Code - -spdflush; -\end_layout - -\begin_layout Code - -spdadd 2001:db8:1:1::1 2001:db8:2:2::2 any -P out ipsec -\end_layout - -\begin_layout Code - -¬ esp/tunnel/2001:db8:1:1::1-2001:db8:2:2::2/require; -\end_layout - -\begin_layout Code - -spdadd 2001:db8:2:2::2 2001:db8:1:1::1 any -P in ipsec -\end_layout - -\begin_layout Code - -¬ esp/tunnel/2001:db8:2:2::2-2001:db8:1:1::1/require; -\end_layout - -\begin_layout Standard - -\lang english -Beim anderen Partner ist -\begin_inset Quotes sld -\end_inset - -in -\begin_inset Quotes srd -\end_inset - - mit -\begin_inset Quotes sld -\end_inset - -out -\begin_inset Quotes srd -\end_inset - - zu vertauschen. -\end_layout - -\begin_layout Subsubsection - -\lang english -Konfiguration des IKE-Daemon -\begin_inset Quotes sld -\end_inset - -racoon -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard - -\lang english -\begin_inset Quotes sld -\end_inset - -racoon -\begin_inset Quotes srd -\end_inset - - benötigt eine Konfigurationsdatei zur Ausführung. - Es beinhaltet zu der Security Policy entprechenden Einstellungen, welche - vorher mit -\begin_inset Quotes sld -\end_inset - -setkey -\begin_inset Quotes srd -\end_inset - - definiert wurde. -\end_layout - -\begin_layout Standard - -\lang english -Datei: /etc/racoon/racoon.conf -\end_layout - -\begin_layout Code - -# Racoon IKE daemon configuration file. -\end_layout - -\begin_layout Code - -# See 'man racoon.conf' for a description of the format and entries. -\end_layout - -\begin_layout Code - -path include "/etc/racoon"; -\end_layout - -\begin_layout Code - -path pre_shared_key "/etc/racoon/psk.txt"; -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -listen -\end_layout - -\begin_layout Code - -{ -\end_layout - -\begin_layout Code - - isakmp 2001:db8:1:1::1; -\end_layout - -\begin_layout Code - -} -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -remote 2001:db8:2:2::2 -\end_layout - -\begin_layout Code - -{ -\end_layout - -\begin_layout Code - - exchange_mode main; -\end_layout - -\begin_layout Code - - lifetime time 24 hour; -\end_layout - -\begin_layout Code - - proposal -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - encryption_algorithm 3des; -\end_layout - -\begin_layout Code - - hash_algorithm md5; -\end_layout - -\begin_layout Code - - authentication_method pre_shared_key; -\end_layout - -\begin_layout Code - - dh_group 2; -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - -} -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# gateway-to-gateway -\end_layout - -\begin_layout Code - -sainfo address 2001:db8:1:1::1 any address 2001:db8:2:2::2 any -\end_layout - -\begin_layout Code - -{ -\end_layout - -\begin_layout Code - - lifetime time 1 hour; -\end_layout - -\begin_layout Code - - encryption_algorithm 3des; -\end_layout - -\begin_layout Code - - authentication_algorithm hmac_md5; -\end_layout - -\begin_layout Code - - compression_algorithm deflate; -\end_layout - -\begin_layout Code - -} -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -sainfo address 2001:db8:2:2::2 any address 2001:db8:1:1::1 any -\end_layout - -\begin_layout Code - -{ -\end_layout - -\begin_layout Code - - lifetime time 1 hour; -\end_layout - -\begin_layout Code - - encryption_algorithm 3des; -\end_layout - -\begin_layout Code - - authentication_algorithm hmac_md5; -\end_layout - -\begin_layout Code - - compression_algorithm deflate; -\end_layout - -\begin_layout Code - -} -\end_layout - -\begin_layout Standard - -\lang english -Zudem muss das gemeinsame Geheimnis definiert werden: -\end_layout - -\begin_layout Standard - -\lang english -Datei: /etc/racoon/psk.txt -\end_layout - -\begin_layout Code - -# file for pre-shared keys used for IKE authentication -\end_layout - -\begin_layout Code - -# format is: 'identifier' 'key' -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -2001:db8:2:2::2 verysecret -\end_layout - -\begin_layout Subsubsection - -\lang english -IPsec mit IKE-Daemon -\begin_inset Quotes sld -\end_inset - -racoon -\begin_inset Quotes srd -\end_inset - - starten -\end_layout - -\begin_layout Standard - -\lang english -Zum Schluss muss der Daemon gestartet werden. - Beim ersten Mal sollte Debug- & Vordergrund-Modus aktiviert werden. - Das folgende Beispiel zeigt eine erfolgreiche Aushandlung von IKE-Phase - 1 (ISAKMP-SA) und 2 (IPsec-SA): -\end_layout - -\begin_layout Code - -# racoon -F -v -f /etc/racoon/racoon.conf -\end_layout - -\begin_layout Code - -Foreground mode. - -\end_layout - -\begin_layout Code - -2005-01-01 20:30:15: INFO: @(#)ipsec-tools 0.3.3 (http://ipsec-tools.sourceforge.net -) -\end_layout - -\begin_layout Code - -2005-01-01 20:30:15: INFO: @(#)This product linked -\end_layout - -\begin_layout Code - -¬ OpenSSL 0.9.7a Feb 19 2003 (http://www.openssl.org/) -\end_layout - -\begin_layout Code - -2005-01-01 20:30:15: INFO: 2001:db8:1:1::1[500] used as isakmp port (fd=7) -\end_layout - -\begin_layout Code - -2005-01-01 20:31:06: INFO: IPsec-SA request for 2001:db8:2:2::2 -\end_layout - -\begin_layout Code - -¬ queued due to no phase1 found. -\end_layout - -\begin_layout Code - -2005-01-01 20:31:06: INFO: initiate new phase 1 negotiation: -\end_layout - -\begin_layout Code - -¬ 2001:db8:1:1::1[500]<=>2001:db8:2:2::2[500] -\end_layout - -\begin_layout Code - -2005-01-01 20:31:06: INFO: begin Identity Protection mode. -\end_layout - -\begin_layout Code - -2005-01-01 20:31:09: INFO: ISAKMP-SA established -\end_layout - -\begin_layout Code - -¬ 2001:db8:1:1::1[500]-2001:db8:2:2::2[500] spi:da3d3693289c9698:ac039a402b2db40 -1 -\end_layout - -\begin_layout Code - -2005-01-01 20:31:09: INFO: initiate new phase 2 negotiation: -\end_layout - -\begin_layout Code - -¬ 2001:6f8:900:94::2[0]<=>2001:db8:2:2::2[0] -\end_layout - -\begin_layout Code - -2005-01-01 20:31:10: INFO: IPsec-SA established: -\end_layout - -\begin_layout Code - -¬ ESP/Tunnel 2001:db8:2:2::2->2001:db8:1:1::1 spi=253935531(0xf22bfab) -\end_layout - -\begin_layout Code - -2005-01-01 20:31:10: INFO: IPsec-SA established: -\end_layout - -\begin_layout Code - -¬ ESP/Tunnel 2001:db8:1:1::1->2001:db8:2:2::2 spi=175002564(0xa6e53c4) -\end_layout - -\begin_layout Standard - -\lang english -Jede Richtung bekommt einen eigenen SPI (wie im IPsec-Standard definiert). - Mit -\begin_inset Quotes sld -\end_inset - -tcpdump -\begin_inset Quotes srd -\end_inset - - kann an der entprechenden Schnittstelle dann das Ergebnis eines IPv6-pings - gesehen werden: -\end_layout - -\begin_layout Code - -20:35:55.305707 2001:db8:1:1::1 > 2001:db8:2:2::2: ESP(spi=0x0a6e53c4,seq=0x3) -\end_layout - -\begin_layout Code - -20:35:55.537522 2001:db8:2:2::2 > 2001:db8:1:1::1: ESP(spi=0x0f22bfab,seq=0x3) -\end_layout - -\begin_layout Standard - -\lang english -Wie erwartet, werden die ausgehandelten SPIs angezeigt. -\end_layout - -\begin_layout Standard - -\lang english -Mit -\begin_inset Quotes sld -\end_inset - -setkey -\begin_inset Quotes srd -\end_inset - - werden die aktiven Parameter angezeigt: -\end_layout - -\begin_layout Code - -# setkey -D -\end_layout - -\begin_layout Code - -2001:db8:1:1::1 2001:db8:2:2::2 -\end_layout - -\begin_layout Code - - esp mode=tunnel spi=175002564(0x0a6e53c4) reqid=0(0x00000000) -\end_layout - -\begin_layout Code - - E: 3des-cbc bd26bc45 aea0d249 ef9c6b89 7056080f 5d9fa49c 924e2edd -\end_layout - -\begin_layout Code - - A: hmac-md5 60c2c505 517dd8b7 c9609128 a5efc2db -\end_layout - -\begin_layout Code - - seq=0x00000000 replay=4 flags=0x00000000 state=mature -\end_layout - -\begin_layout Code - - created: Jan 1 20:31:10 2005 current: Jan 1 20:40:47 2005 -\end_layout - -\begin_layout Code - - diff: 577(s) hard: 3600(s) soft: 2880(s) -\end_layout - -\begin_layout Code - - last: Jan 1 20:35:05 2005 hard: 0(s) soft: 0(s) -\end_layout - -\begin_layout Code - - current: 540(bytes) hard: 0(bytes) soft: 0(bytes) -\end_layout - -\begin_layout Code - - allocated: 3 hard: 0 soft: 0 -\end_layout - -\begin_layout Code - - sadb_seq=1 pid=22358 refcnt=0 -\end_layout - -\begin_layout Code - -2001:db8:2:2::2 2001:db8:1:1::1 -\end_layout - -\begin_layout Code - - esp mode=tunnel spi=253935531(0x0f22bfab) reqid=0(0x00000000) -\end_layout - -\begin_layout Code - - E: 3des-cbc c1ddba65 83debd62 3f6683c1 20e747ac 933d203f 4777a7ce -\end_layout - -\begin_layout Code - - A: hmac-md5 3f957db9 9adddc8c 44e5739d 3f53ca0e -\end_layout - -\begin_layout Code - - seq=0x00000000 replay=4 flags=0x00000000 state=mature -\end_layout - -\begin_layout Code - - created: Jan 1 20:31:10 2005 current: Jan 1 20:40:47 2005 -\end_layout - -\begin_layout Code - - diff: 577(s) hard: 3600(s) soft: 2880(s) -\end_layout - -\begin_layout Code - - last: Jan 1 20:35:05 2005 hard: 0(s) soft: 0(s) -\end_layout - -\begin_layout Code - - current: 312(bytes) hard: 0(bytes) soft: 0(bytes) -\end_layout - -\begin_layout Code - - allocated: 3 hard: 0 soft: 0 -\end_layout - -\begin_layout Code - - sadb_seq=0 pid=22358 refcnt=0 -\end_layout - -\begin_layout Subsection - -\lang english -IKE-Daemon -\begin_inset Quotes sld -\end_inset - -pluto -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard - -\lang english -Der IKE-Daemon -\begin_inset Quotes sld -\end_inset - -pluto -\begin_inset Quotes srd -\end_inset - - ist in den Paketen der *S/WAN-Projekte beinhaltet. - Das *S/WAN-Projekt startete zu Anfags als -\begin_inset CommandInset href -LatexCommand href -name "FreeS/WAN" -target "http://www.freeswan.org/" - -\end_inset - -. - Leider wurde die Weiterentwicklung von FreeS/WAN in 2004 eingestellt. - Aufgrund der langsamen Entwicklungsgeschwindigkeit in der Vergangenheit - entstanden zwei Spin-Offs: -\begin_inset CommandInset href -LatexCommand href -name "strongSwan" -target "http://www.strongswan.org/" - -\end_inset - - und -\begin_inset CommandInset href -LatexCommand href -name "Openswan" -target "http://www.openswan.org/" - -\end_inset - -. - Heutzutage stehen installationsfertige Pakete bereit, u.a. - von Openswan (in Fedora Core 3 beinhaltet). -\end_layout - -\begin_layout Standard - -\lang english -Ein großer Unterschied zu -\begin_inset Quotes sld -\end_inset - -racoon -\begin_inset Quotes srd -\end_inset - - ist, dass nur eine Konfigurationsdatei notwendig ist. - Zudem steht ein initscript für automatisches Starten beim Booten zur Verfügung. -\end_layout - -\begin_layout Subsubsection - -\lang english -Konfiguration des IKE-Daemon -\begin_inset Quotes sld -\end_inset - -pluto -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard - -\lang english -Die Konfiguration ist der zu IPv4 sehr ähnlich, nur eine wichtige Option - ist notwendig. -\end_layout - -\begin_layout Standard - -\lang english -Datei: /etc/ipsec.conf -\end_layout - -\begin_layout Code - -# /etc/ipsec.conf - Openswan IPsec configuration file -\end_layout - -\begin_layout Code - -# -\end_layout - -\begin_layout Code - -# Manual: ipsec.conf.5 -\end_layout - -\begin_layout Code - -version 2.0 # conforms to second version of ipsec.conf specification -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# basic configuration -\end_layout - -\begin_layout Code - -config setup -\end_layout - -\begin_layout Code - - # Debug-logging controls: "none" for (almost) none, "all" for lots. -\end_layout - -\begin_layout Code - - # klipsdebug=none -\end_layout - -\begin_layout Code - - # plutodebug="control parsing" -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -#Disable Opportunistic Encryption -\end_layout - -\begin_layout Code - -include /etc/ipsec.d/examples/no_oe.conf -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -conn ipv6-p1-p2 -\end_layout - -\begin_layout Code - - connaddrfamily=ipv6 # Important for IPv6, but no longer needed - since StrongSwan 4 -\end_layout - -\begin_layout Code - - left=2001:db8:1:1::1 -\end_layout - -\begin_layout Code - - right=2001:db8:2:2::2 -\end_layout - -\begin_layout Code - - authby=secret -\end_layout - -\begin_layout Code - - esp=aes128-sha1 -\end_layout - -\begin_layout Code - - ike=aes128-sha-modp1024 -\end_layout - -\begin_layout Code - - type=transport -\end_layout - -\begin_layout Code - - #type=tunnel -\end_layout - -\begin_layout Code - - compress=no -\end_layout - -\begin_layout Code - - #compress=yes -\end_layout - -\begin_layout Code - - auto=add -\end_layout - -\begin_layout Code - - #auto=up -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Standard - -\lang english -Zudem muss das gemeinsame Geheimnis definiert werden: -\end_layout - -\begin_layout Standard - -\lang english -Datei: /etc/ipsec.secrets -\end_layout - -\begin_layout Code - -2001:db8:1:1::1 2001:db8:2:2::2 : PSK "verysecret" -\end_layout - -\begin_layout Subsubsection - -\lang english -IPsec mit IKE daemon -\begin_inset Quotes sld -\end_inset - -pluto -\begin_inset Quotes srd -\end_inset - - starten -\end_layout - -\begin_layout Standard - -\lang english -Wenn die Installation von Openswan erfolgreich war, sollte ein initscript - zum Starten von IPsec zur Verfügung stehen. - Dann einfach auf jedem Partner folgendes ausführen: -\end_layout - -\begin_layout Code - -# /etc/rc.d/init.d/ipsec start -\end_layout - -\begin_layout Standard - -\lang english -Danach kann die Verbindung auf einem Partner gestartet werden. - Wenn im folgenden die Zeile -\begin_inset Quotes sld -\end_inset - -IPsec SA established -\begin_inset Quotes srd -\end_inset - - erscheint, hat die Aushandlung funktioniert. -\end_layout - -\begin_layout Code - -# ipsec auto --up ipv6-peer1-peer2 -\end_layout - -\begin_layout Code - -104 "ipv6-p1-p2" #1: STATE_MAIN_I1: initiate -\end_layout - -\begin_layout Code - -106 "ipv6-p1-p2" #1: STATE_MAIN_I2: sent MI2, expecting MR2 -\end_layout - -\begin_layout Code - -108 "ipv6-p1-p2" #1: STATE_MAIN_I3: sent MI3, expecting MR3 -\end_layout - -\begin_layout Code - -004 "ipv6-p1-p2" #1: STATE_MAIN_I4: ISAKMP SA established -\end_layout - -\begin_layout Code - -112 "ipv6-p1-p2" #2: STATE_QUICK_I1: initiate -\end_layout - -\begin_layout Code - -004 "ipv6-p1-p2" #2: STATE_QUICK_I2: sent QI2, -\end_layout - -\begin_layout Code - -¬ IPsec SA established {ESP=>0xa98b7710 <0xa51e1f22} -\end_layout - -\begin_layout Standard - -\lang english -Weil *S/WAN und setkey/racoon die gleiche IPsec-Implementation im Linux - kernel 2.6.x benutzen, zeigt -\begin_inset Quotes sld -\end_inset - -setkey -\begin_inset Quotes srd -\end_inset - - auch hier die aktiven Parameter: -\end_layout - -\begin_layout Code - -# setkey -D -\end_layout - -\begin_layout Code - -2001:db8:1:1::1 2001:db8:2:2::2 -\end_layout - -\begin_layout Code - - esp mode=transport spi=2844489488(0xa98b7710) reqid=16385(0x00004001) -\end_layout - -\begin_layout Code - - E: aes-cbc 082ee274 2744bae5 7451da37 1162b483 -\end_layout - -\begin_layout Code - - A: hmac-sha1 b7803753 757417da 477b1c1a 64070455 ab79082c -\end_layout - -\begin_layout Code - - seq=0x00000000 replay=64 flags=0x00000000 state=mature -\end_layout - -\begin_layout Code - - created: Jan 1 21:16:32 2005 current: Jan 1 21:22:20 2005 -\end_layout - -\begin_layout Code - - diff: 348(s) hard: 0(s) soft: 0(s) -\end_layout - -\begin_layout Code - - last: hard: 0(s) soft: 0(s) -\end_layout - -\begin_layout Code - - current: 0(bytes) hard: 0(bytes) soft: 0(bytes) -\end_layout - -\begin_layout Code - - allocated: 0 hard: 0 soft: 0 -\end_layout - -\begin_layout Code - - sadb_seq=1 pid=23825 refcnt=0 -\end_layout - -\begin_layout Code - -2001:db8:2:2::2 2001:db8:1:1::1 -\end_layout - -\begin_layout Code - - esp mode=transport spi=2770214690(0xa51e1f22) reqid=16385(0x00004001) -\end_layout - -\begin_layout Code - - E: aes-cbc 6f59cc30 8d856056 65e07b76 552cac18 -\end_layout - -\begin_layout Code - - A: hmac-sha1 c7c7d82b abfca8b1 5440021f e0c3b335 975b508b -\end_layout - -\begin_layout Code - - seq=0x00000000 replay=64 flags=0x00000000 state=mature -\end_layout - -\begin_layout Code - - created: Jan 1 21:16:31 2005 current: Jan 1 21:22:20 2005 -\end_layout - -\begin_layout Code - - diff: 349(s) hard: 0(s) soft: 0(s) -\end_layout - -\begin_layout Code - - last: hard: 0(s) soft: 0(s) -\end_layout - -\begin_layout Code - - current: 0(bytes) hard: 0(bytes) soft: 0(bytes) -\end_layout - -\begin_layout Code - - allocated: 0 hard: 0 soft: 0 -\end_layout - -\begin_layout Code - - sadb_seq=0 pid=23825 refcnt=0 -\end_layout - -\begin_layout Section - -\lang english -Anmerkungen: -\end_layout - -\begin_layout Standard - -\lang english -Bei Linux Kernel 2.6.x kann der IPsec-Status und die Policy auch mit -\begin_inset Quotes sld -\end_inset - -ip -\begin_inset Quotes srd -\end_inset - - angezeigt werden: -\end_layout - -\begin_layout Code - -# ip xfrm policy -\end_layout - -\begin_layout Code - -... -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# ip xfrm state -\end_layout - -\begin_layout Code - -... -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-qos" - -\end_inset - -Quality of Service (QoS) -\end_layout - -\begin_layout Standard -IPv6 unterstützt QoS durch die Anwendung von Flow Labels und Traffic Classes. - -\end_layout - -\begin_layout Standard -Zusätzliche Infos: -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "RFC 3697 / IPv6 Flow Label Specification" -target "http://www.faqs.org/rfcs/rfc3697.html" - -\end_inset - - -\end_layout - -\begin_layout Section - -\lang english -General -\end_layout - -\begin_layout Standard - -\lang english -Vernünftig funktionierendes QoS ist nur an der ausgehenden Schnittstelle - eines Routers oder Host möglich, wo der Flaschenhals anfängt. - Alles andere bereitet nur Probleme und funktioniert wahrscheinlich nicht - so, wie erwartet. -\end_layout - -\begin_layout Code - -------------------->------- -\end_layout - -\begin_layout Code - - Queue 1 -\backslash - -\end_layout - -\begin_layout Code - - --->--- ---->--------->--------->------------------- -\end_layout - -\begin_layout Code - -Dicke Leitung Queue 2 Queue 1 / Queue 2 / Queue 3 Dünne Leitung -\end_layout - -\begin_layout Code - - --->---- ---->--------->--------->------------------- -\end_layout - -\begin_layout Code - - Queue 3 / -\end_layout - -\begin_layout Code - -------------------->------- -\end_layout - -\begin_layout Section - -\lang english -Linux QoS mit -\begin_inset Quotes sld -\end_inset - -tc -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard - -\lang english -Linux benutzt -\begin_inset Quotes sld -\end_inset - -tc -\begin_inset Quotes srd -\end_inset - - vom Paket -\begin_inset Quotes sld -\end_inset - -iproute2 -\begin_inset Quotes srd -\end_inset - -, um das Bandbreitenmanagement zu konfigurieren, allgemein beschrieben in - -\begin_inset CommandInset href -LatexCommand href -name "Linux Advanced Routing & Traffic Control HOWTO" -target "http://lartc.org/" - -\end_inset - -. -\end_layout - -\begin_layout Subsection - -\lang english -Beispiel für eine Warteschlange mit konstanter Bitrate -\end_layout - -\begin_layout Standard - -\lang english -Mit dem -\begin_inset Quotes sld -\end_inset - -cbq -\begin_inset Quotes srd -\end_inset - - Planer können Röhren mit konstanter Bitrate definiert werden. -\end_layout - -\begin_layout Subsubsection - -\lang english -Root qdisc Definition -\end_layout - -\begin_layout Standard - -\lang english -Definition einer root qdisc mit einer Bandbreite von 1000 MBit/s an eth1 -\end_layout - -\begin_layout Code - -# tc qdisc add dev eth1 root handle 1: cbq avpkt 1000 bandwidth 1000Mbit -\end_layout - -\begin_layout Subsubsection - -\lang english -QoS class Definition -\end_layout - -\begin_layout Standard - -\lang english -Definition einer Klasse 1:1 mit 1 MBit/s -\end_layout - -\begin_layout Code - -# tc class add dev eth1 parent 1: classid 1:1 cbq rate 1Mbit allot 1500 - bounded -\end_layout - -\begin_layout Standard - -\lang english -Definition einer Klasse 1:2 mit 50 MBit/s -\end_layout - -\begin_layout Code - -# tc class add dev eth1 parent 1: classid 1:2 cbq rate 50Mbit allot 1500 - bounded -\end_layout - -\begin_layout Standard - -\lang english -Definition einer Klasse 1:3 mit 10 MBit/s -\end_layout - -\begin_layout Code - -# tc class add dev eth1 parent 1: classid 1:3 cbq rate 10Mbit allot 1500 - bounded -\end_layout - -\begin_layout Standard - -\lang english -Definition einer Klasse 1:4 mit 200 kBit/s -\end_layout - -\begin_layout Code - -# tc class add dev eth1 parent 1: classid 1:4 cbq rate 200kbit allot 1500 - bounded -\end_layout - -\begin_layout Subsubsection - -\lang english -QoS filter Definition -\end_layout - -\begin_layout Standard - -\lang english -Definition eines Filters für IPv4 ( -\emph on -protocol ip -\emph default -), TCP ( -\emph on -match ip protocol 6 0xff -\emph default -) Zielport 5001 ( -\emph on -match ip dport 5001 0xffff -\emph default -) unter Benutzung der Klasse 1:2 von oben -\end_layout - -\begin_layout Code - -# tc filter add dev eth1 parent 1: protocol ip u32 match ip protocol - 6 0xff match ip dport 5001 0xffff flowid 1:1 -\end_layout - -\begin_layout Standard - -\lang english -Definition eines Filters für IPv6 ( -\emph on -protocol ip -\emph default -), TCP ( -\emph on -match ip6 protocol 6 0xff -\emph default -) Zielport 5001 unter der Benutzung der Klasse 1:2 von oben -\end_layout - -\begin_layout Code - -# tc filter add dev eth1 parent 1: protocol ipv6 u32 match ip6 protocol - 6 0xff match ip6 dport 5001 0xffff flowid 1:2 -\end_layout - -\begin_layout Standard - -\lang english -Definition eines Filters für IPv6 für Pakete mit Flowlabel 12345 ( -\emph on -match ip6 flowlabel 0x12345 0x3ffff -\emph default -) unter der Benutzung der Klasse 1:3 von oben -\end_layout - -\begin_layout Code - -# tc filter add dev eth1 parent 1: protocol ipv6 u32 match ip6 flowlabel - 12345 0x3ffff flowid 1:3 -\end_layout - -\begin_layout Standard - -\lang english -Definition eines Filters für IPv6 für Pakete mit der Linux iptables Markierung - 32 ( -\emph on -handle 32 fw -\emph default -) unter der Benutzung der Klasse 1:4 von oben -\end_layout - -\begin_layout Code - -# tc filter add dev eth1 parent 1: protocol ipv6 handle 32 fw flowid 1:4 -\end_layout - -\begin_layout Standard - -\lang english -Die letzte Filterdefinition benötigt auch einen Eintrag in ip6tables um - das Paket zu markieren -\end_layout - -\begin_layout Code - -# ip6tables -A POSTROUTING -t mangle -p tcp --dport 5003 -j MARK --set-mark - 32 -\end_layout - -\begin_layout Subsubsection - -\lang english -Testen der Filterdefinition mit iperf -\end_layout - -\begin_layout Standard - -\lang english -Starten auf Serverseite in separaten Konsolen: -\end_layout - -\begin_layout Code - -# iperf -V -s -p 5001 -\end_layout - -\begin_layout Code - -# iperf -V -s -p 5002 -\end_layout - -\begin_layout Code - -# iperf -V -s -p 5003 -\end_layout - -\begin_layout Standard - -\lang english -Starten auf Clientseite und Vergleichen der Ergebnisse: -\end_layout - -\begin_layout Code - -# iperf -V -c SERVER-IPv4 -p 5001 (erwartet: 1 MBit/s) -\end_layout - -\begin_layout Code - -# iperf -V -c SERVER-IPv6 -p 5001 (erwartet: 50 MBit/s) -\end_layout - -\begin_layout Code - -# iperf -V -c SERVER-IPv4 -p 5002 (erwartet: >> 50 MBit/s && <= 1000 - MBit/s) -\end_layout - -\begin_layout Code - -# iperf -V -c SERVER-IPv6 -p 5002 (erwartet: >> 50 MBit/s && <= 1000 - MBit/s) -\end_layout - -\begin_layout Code - -# iperf -V -c SERVER-IPv4 -p 5003 (erwartet: >> 50 MBit/s && <= 1000 - MBit/s) -\end_layout - -\begin_layout Code - -# iperf -V -c SERVER-IPv6 -p 5003 (erwartet: 200 kBit/s) -\end_layout - -\begin_layout Standard - -\lang english -Das Ergebnis der Transferraten sollten der Definitionen von oben entsprechen, - das Ergebnis auf Port 5002 sollte ziemlich identisch unabhängig von der - benutzten IP-Version sein. -\end_layout - -\begin_layout Standard - -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-hints-daemons" - -\end_inset - -Hinweise zu IPv6 kompatiblen Daemons -\end_layout - -\begin_layout Standard -Im folgenden Kapitel werden einige Hinweise zu IPv6 kompatiblen Daemons - gegeben. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-bind" - -\end_inset - -Berkeley Internet Name Domain (BIND) daemon -\begin_inset Quotes sld -\end_inset - -named -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -Seit der Version 9 wird IPv6 unterstützt. - Setzen Sie immer die neuest verfügbare Version ein. - Zumindest muss Version 9.1.3 eingesetzt werden, da ältere Versionen Sicherheitslö -cher beinhalten können, die von Remote entsprechend ausgenutzt werden können. -\end_layout - -\begin_layout Subsection -Auf IPv6 Adressen hören -\end_layout - -\begin_layout Standard -Anmerkung: Im Gegensatz zu IPv4 können bei aktuellen Versionen Server Sockets - nicht an dedizierte IPv6 Adressen gebunden werden, es ist folglich -\emph on -jede -\emph default - oder -\emph on -keine -\emph default - Adresse gültig. - Da dies ein Sicherheitsproblem sein kann, lesen Sie diesbezüglich ebenfalls - den Abschnitt Access Control Lists (ACL) weiter unten! -\end_layout - -\begin_layout Subsubsection -BIND named konfigurieren, damit er auf IPv6 Adressen antwortet -\end_layout - -\begin_layout Standard -Folgende Optionen müssen geändert werden, damit IPv6 aktiviert wird -\end_layout - -\begin_layout Code - -options { -\end_layout - -\begin_layout Code - - # sure other options here, too -\end_layout - -\begin_layout Code - - listen-on-v6 { any; }; -\end_layout - -\begin_layout Code - -}; -\end_layout - -\begin_layout Standard -Nach einem Neustart (des Dienstes) sollte z.B. - Folgendes zu sehen sein: -\end_layout - -\begin_layout Code - -# netstat -lnptu |grep "named -\backslash -W*$" -\end_layout - -\begin_layout Code - -tcp 0 0 :::53 :::* LISTEN 1234/named -\end_layout - -\begin_layout Code - -¬ # incoming TCP requests -\end_layout - -\begin_layout Code - -udp 0 0 1.2.3.4:53 0.0.0.0:* 1234/named -\end_layout - -\begin_layout Code - -¬ # incoming UDP requests to IPv4 1.2.3.4 -\end_layout - -\begin_layout Code - -udp 0 0 127.0.0.1:53 0.0.0.0:* 1234/named -\end_layout - -\begin_layout Code - -¬ # incoming UDP requests to IPv4 localhost -\end_layout - -\begin_layout Code - -udp 0 0 0.0.0.0:32868 0.0.0.0:* 1234/named -\end_layout - -\begin_layout Code - -¬ # dynamic chosen port for outgoing queries -\end_layout - -\begin_layout Code - -udp 0 0 :::53 :::* 1234/named -\end_layout - -\begin_layout Code - -¬ # incoming UDP request to any IPv6 -\end_layout - -\begin_layout Standard -Ein kleiner Test sieht wie folgt aus: -\end_layout - -\begin_layout Code - -# dig localhost @::1 -\end_layout - -\begin_layout Standard -und sollte Ihnen ein Ergebnis anzeigen... -\end_layout - -\begin_layout Subsubsection -BIND named konfigurieren, damit er auf IPv6 Adressen nicht antwortet -\end_layout - -\begin_layout Standard -Folgende Optionen müssen geändert werden, damit IPv6 deaktiviert wird: -\end_layout - -\begin_layout Code - -options { -\end_layout - -\begin_layout Code - - # sure other options here, too -\end_layout - -\begin_layout Code - - listen-on-v6 { none; }; -\end_layout - -\begin_layout Code - -}; -\end_layout - -\begin_layout Subsection -Access Control Lists (ACL) mit IPv6 Unterstützung -\end_layout - -\begin_layout Standard -ACLs mit IPv6 Adressen sind realisierbar und sollten wann immer möglich - eingesetzt werden. - Ein Beispiel: -\end_layout - -\begin_layout Code - -acl internal-net { -\end_layout - -\begin_layout Code - - 127.0.0.1; -\end_layout - -\begin_layout Code - - 1.2.3.0/24; -\end_layout - -\begin_layout Code - - 2001:0db8:100::/56; -\end_layout - -\begin_layout Code - - ::1/128; -\end_layout - -\begin_layout Code - - ::ffff:1.2.3.4/128; -\end_layout - -\begin_layout Code - -}; -\end_layout - -\begin_layout Code - -acl ns-internal-net { -\end_layout - -\begin_layout Code - - 1.2.3.4; -\end_layout - -\begin_layout Code - - 1.2.3.5; -\end_layout - -\begin_layout Code - - 2001:0db8:100::4/128; -\end_layout - -\begin_layout Code - - 2001:0db8:100::5/128; -\end_layout - -\begin_layout Code - -}; -\end_layout - -\begin_layout Standard -Diese ACLs können für Client-Anfragen und Zonentransfers zu Secondary Nameserver - eingesetzt werden. - Es kann auch unterbunden werden, dass ihr Caching-Nameserver mittels IPv6 - von der Außenwelt verwendet wird. -\end_layout - -\begin_layout Code - -options { -\end_layout - -\begin_layout Code - - # sure other options here, too -\end_layout - -\begin_layout Code - - listen-on-v6 { none; }; -\end_layout - -\begin_layout Code - - allow-query { internal-net; }; -\end_layout - -\begin_layout Code - - allow-transfer { ns-internal-net; }; -\end_layout - -\begin_layout Code - -}; -\end_layout - -\begin_layout Standard -Es ist ebenfalls möglich, dass die Optionen -\emph on -allow-query -\emph default - und -\emph on -allow-transfer -\emph default - bei den meisten Single-Zonen-Definitionen verwendet werden. -\end_layout - -\begin_layout Subsection -Anfragen mit festen IPv6 Adressen senden -\end_layout - -\begin_layout Standard -Diese Option ist nicht verpflichtend, ev. - aber benötigt: -\end_layout - -\begin_layout Code - -query-source-v6 address port ; -\end_layout - -\begin_layout Subsection -Pro Zone definierte feste IPv6 Adressen -\end_layout - -\begin_layout Standard -Es ist möglich pro Zone mehrere IPv6 Adressen zu definieren. -\end_layout - -\begin_layout Subsubsection -Transfer source Adresse -\end_layout - -\begin_layout Standard -Die Transfer source Adresse wird für ausgehende Zonentransfers verwendet: -\end_layout - -\begin_layout Code - -transfer-source-v6 [port port]; -\end_layout - -\begin_layout Subsubsection -Notify source Adresse -\end_layout - -\begin_layout Standard -Die Notify source Adresse wird für ausgehende notify Mitteilungen verwendet: -\end_layout - -\begin_layout Code - -notify-source-v6 [port port]; -\end_layout - -\begin_layout Subsection -IPv6 DNS zone files Beispiele -\end_layout - -\begin_layout Standard -Einige Informationen finden Sie auch unter -\begin_inset CommandInset href -LatexCommand href -name "IPv6 DNS Setup Information (article)" -target "http://www.isi.edu/~bmanning/v6DNS.html" - -\end_inset - -. - Eventuell ebenfalls hilfreich ist folgendes Tool: -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Reverse DNS zone builder for BIND 8/9 (webtool)" -target "http://tools.fpsn.net/ipv6-inaddr/" - -\end_inset - -. -\end_layout - -\begin_layout Subsection -IPv6 bezogene DNS-Daten bereitstellen -\end_layout - -\begin_layout Standard -Für IPv6 wurden neue Reverse Lookup Arten und Root Zonen definiert: -\end_layout - -\begin_layout Itemize -AAAA und reverse IP6.INT: beschrieben in -\begin_inset CommandInset href -LatexCommand href -name "RFC 1886 / DNS Extensions to support IP version 6" -target "http://www.faqs.org/rfcs/rfc1886.html" - -\end_inset - - sowie seit BIND Version 4.9.6 in Verwendung -\end_layout - -\begin_layout Itemize -A6, DNAME (WURDE ABGELEHNT!) und reverse IP6.ARPA: beschrieben in -\begin_inset CommandInset href -LatexCommand href -name "RFC 2874 / DNS Extensions to Support IPv6 Address Aggregation and Renumbering" -target "http://www.faqs.org/rfcs/rfc2874.html" - -\end_inset - - sowie seit BIND 9 in Verwendung. - Informationen zum aktuellen Stand sind unter -\begin_inset CommandInset href -LatexCommand href -name "Domain Name System Extension (dnsext)" -target "http://www.ietf.org/ids.by.wg/dnsext.html" - -\end_inset - - zu finden. -\end_layout - -\begin_layout Standard -Mehr Inhalt zu diesem Thema wird eventuell in späteren Versionen eingearbeitet, - inzwischen können Sie in den RFCs und in folgenden Quellen nachlesen: -\end_layout - -\begin_layout Itemize -AAAA und reverse IP6.INT: -\begin_inset CommandInset href -LatexCommand href -name "IPv6 DNS Setup Information" -target "http://www.isi.edu/~bmanning/v6DNS.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -A6, DNAME (WURDE ABGELEHNT!) und reverse IP6.ARPA: lesen Sie im Kapitel 4 - und 6 des BIND 9 Administrator Reference Manual (ARM) nach, welches mit - dem bind-Paket mitgeliefert wird. - Sie können es auch hier lesen: -\lang english - -\begin_inset CommandInset href -LatexCommand href -name "BIND manual version 9.3" -target "http://www.isc.org/sw/bind/arm93/" - -\end_inset - - -\end_layout - -\begin_layout Standard -Da IP6.INT (ebenfalls) ABGELEHNT WURDE, (jedoch nach wie vor in Verwendung - ist,) muss ein DNS Server, der IPv6 Informationen anbieten will, beide - reverse Zonen bereitstellen. -\end_layout - -\begin_layout Subsubsection -Aktuell beste Praxis -\end_layout - -\begin_layout Standard -Da es mit den neuen Formaten noch Probleme gibt, ist die aktuell beste Praxis: -\end_layout - -\begin_layout Standard -Vorwärts-Auflösung mit: -\end_layout - -\begin_layout Itemize -AAAA -\end_layout - -\begin_layout Standard -Rückwärts-Auflösung mit: -\end_layout - -\begin_layout Itemize -Reverse nibble format für die Zone ip6.int (FÜR RÜCKWÄRTSKOMPATIBILITÄT) -\end_layout - -\begin_layout Itemize -Reverse nibble format für die Zone ip6.arpa (EMPFHOHLEN) -\end_layout - -\begin_layout Subsection -IPv6 Verbindung überprüfen -\end_layout - -\begin_layout Standard -Ob BIND auf einen IPv6 socket hört bzw. - IPv6 Daten bereitstellt, können Sie anhand folgender Beispiele überprüfen. -\end_layout - -\begin_layout Subsubsection -IPv6 Verbindung durch ACL abgelehnt -\end_layout - -\begin_layout Standard -Eine IPv6 Verbindung kann durch Angabe eines dedizierten Server, der abgefragt - werden soll, erzwungen werden: -\end_layout - -\begin_layout Code - -$ host -t aaaa www.6bone.net 2001:0db8:200:f101::1 -\end_layout - -\begin_layout Code - -Using domain server: -\end_layout - -\begin_layout Code - -Name: 2001:0db8:200:f101::1 -\end_layout - -\begin_layout Code - -Address: 2001:0db8:200:f101::1#53 -\end_layout - -\begin_layout Code - -Aliases: -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -Host www.6bone.net. - not found: 5(REFUSED) -\end_layout - -\begin_layout Standard -Ein entsprechender Log-Eintrag sieht wie folgt aus: -\end_layout - -\begin_layout Code - -Jan 3 12:43:32 gate named[12347]: client -\end_layout - -\begin_layout Code - -¬ 2001:0db8:200:f101:212:34ff:fe12:3456#32770: -\end_layout - -\begin_layout Code - - query denied -\end_layout - -\begin_layout Standard -Wenn Sie diesen Eintrag in der Logdatei finden, prüfen Sie, ob von diesem - Client Anfragen akzeptiert werden sollen und ggf. - ändern Sie Ihre ACL Konfiguration. -\end_layout - -\begin_layout Subsubsection -Erfolgreiche IPv6 Verbindung -\end_layout - -\begin_layout Standard -Eine erfolgreiche IPv6 Verbindung sieht wie folgt aus: -\end_layout - -\begin_layout Code - -$ host -t aaaa www.6bone.net 2001:0db8:200:f101::1 -\end_layout - -\begin_layout Code - -Using domain server: -\end_layout - -\begin_layout Code - -Name: 2001:0db8:200:f101::1 -\end_layout - -\begin_layout Code - -Address: 2001:0db8:200:f101::1#53 -\end_layout - -\begin_layout Code - -Aliases: -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -www.6bone.net. - is an alias for 6bone.net. - -\end_layout - -\begin_layout Code - -6bone.net. - has AAAA address 3ffe:b00:c18:1::10 -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-xinetd" - -\end_inset - -Internet super daemon (xinetd) -\end_layout - -\begin_layout Standard -IPv6 wird ungefähr seit der -\begin_inset CommandInset href -LatexCommand href -name "xinetd" -target "http://www.xinetd.org/" - -\end_inset - - Version 1.8.9 unterstützt. - Verwenden sie immer die neueste Version, zumindest aber Version 2.3.3, da - ältere Versionen Sicherheitslöcher beinhalten können, die von Remote entspreche -nd ausgenutzt werden können. -\end_layout - -\begin_layout Standard -Einige Linux Distributionen beinhalten ein separates IPv6 kompatibles Paket - des xinetd, bei anderen Distributionen wird der IPv6 kompatible xinetd - mit folgender Variable zumeist in der Datei /etc/sysconfig/network (bei - Red Hat kompatible Distributionen) gestartet: NETWORKING_IPV6="yes". - In neuere Versionen unterstützt eine Binärdatei sowohl IPv4 als auch IPv6. -\end_layout - -\begin_layout Standard -Wenn Sie nun einen "eingebauten" Service wie z.B. - daytime durch folgende Änderung der Konfigurationsdatei /etc/xinetd.d/daytime - aktivieren -\end_layout - -\begin_layout Code - -# diff -u /etc/xinetd.d/daytime.orig /etc/xinetd.d/daytime -\end_layout - -\begin_layout Code - ---- /etc/xinetd.d/daytime.orig Sun Dec 16 19:00:14 2001 -\end_layout - -\begin_layout Code - -+++ /etc/xinetd.d/daytime Sun Dec 16 19:00:22 2001 -\end_layout - -\begin_layout Code - -@@ -10,5 +10,5 @@ -\end_layout - -\begin_layout Code - - protocol = tcp -\end_layout - -\begin_layout Code - - user = root -\end_layout - -\begin_layout Code - - wait = no -\end_layout - -\begin_layout Code - -- disable = yes -\end_layout - -\begin_layout Code - -+ disable = no -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Standard -dann sollten Sie nach einem Neustart des xinetd-Dienstes z.B. - folgendes positive Ergebnis sehen: -\end_layout - -\begin_layout Code - -# netstat -lnptu -A inet6 |grep "xinetd*" -\end_layout - -\begin_layout Code - -tcp 0 0 ::ffff:192.168.1.1:993 :::* LISTEN 12345/xinetd-ipv6 -\end_layout - -\begin_layout Code - -tcp 0 0 :::13 :::* LISTEN 12345/xinetd-ipv6 <- service -\end_layout - -\begin_layout Code - -¬ daytime/tcp -\end_layout - -\begin_layout Code - -tcp 0 0 ::ffff:192.168.1.1:143 :::* LISTEN 12345/xinetd-ipv6 -\end_layout - -\begin_layout Standard -Das Beispiel zeigt auch die xinetd Dienste IMAP und IMAP-SSL, die nur auf - IPv4 Adressen hören. -\end_layout - -\begin_layout Standard - -\lang english -Hinweis: frühere Versionen hatten ein Problem, dass der nur für IPv4 kompilierte - xinetd nicht bei einem IPv6-aktivierten Knoten startete, und eine IPv6-aktivier -te nicht bei einem Knoten, der nur IPv4 aktiv hatte. - Dies sollte aber mindestens seit Version 2.3.11 gefixt sein. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-apache2" - -\end_inset - -Webserver Apache2 (httpd2) -\end_layout - -\begin_layout Standard -IPv6 wird beim Apache Webserver durch die Entwickler seit der Version 2.0.14 - unterstützt. - Verfügbare Patches für die alte 1.3.x Serie sind inzwischen nicht mehr aktuell - und sollten nicht mehr in öffentlich zugänglichen Umgebungen eingesetzt - werden. - Verfügbar sind die Patches noch unter -\begin_inset CommandInset href -LatexCommand href -name "KAME / Misc" -target "ftp://ftp.kame.net/pub/kame/misc/" - -\end_inset - -. -\end_layout - -\begin_layout Subsection -Auf IPv6 Adressen hören -\end_layout - -\begin_layout Standard -Anmerkung: Virtuelle Hosts mit IPv6 Adressen sind bis zur Version 2.0.28 nicht - operabel (es gibt für die Version 2.0.28 einen Patch). - Testen Sie aber immer zuerst die neueste Version, da ältere Versionen mitunter - auch Sicherheitsprobleme mit sich bringen können. -\end_layout - -\begin_layout Subsubsection -Virtueller Host mit IPv6 Adresse -\end_layout - -\begin_layout Code - -Listen [2001:0db8:100::1]:80 -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Code - - ServerName ipv6only.yourdomain.yourtopleveldomain -\end_layout - -\begin_layout Code - - # ...sure more config lines -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Subsubsection -Virtueller Host mit IPv4 und IPv6 Adresse -\end_layout - -\begin_layout Code - -Listen [2001:0db8:100::2]:80 -\end_layout - -\begin_layout Code - -Listen 1.2.3.4:80 -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Code - - ServerName ipv6andipv4.yourdomain.yourtopleveldomain -\end_layout - -\begin_layout Code - - # ...sure more config lines -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Standard -Das Ergebnis sollten nach einen Neustart des Dienstes etwa Folgendes sein: -\end_layout - -\begin_layout Code - -# netstat -lnptu |grep "httpd2 -\backslash -W*$" -\end_layout - -\begin_layout Code - -tcp 0 0 1.2.3.4:80 0.0.0.0:* LISTEN 12345/httpd2 -\end_layout - -\begin_layout Code - -tcp 0 0 2001:0db8:100::1:80 :::* LISTEN 12345/httpd2 -\end_layout - -\begin_layout Code - -tcp 0 0 2001:0db8:100::2:80 :::* LISTEN 12345/httpd2 -\end_layout - -\begin_layout Standard -Für einfache Tests können Sie auf das bereits gezeigte telnet-Beispiel zurückgre -ifen. -\end_layout - -\begin_layout Subsubsection - -\lang english -Zusätzliche Anmerkungen -\end_layout - -\begin_layout Standard - -\lang english -Apache2 unterstützt eine Methode namens -\begin_inset Quotes sld -\end_inset - -sendfile -\begin_inset Quotes srd -\end_inset - -, um die Auslieferung von Datenn zu beschleunigen. - Einige NIC-Treiber unterstützen auch offline das Berechnen der Checksumme. - In einigen Fällen kann dies zu Verbindungsproblemen und ungültigen TCP-Checksum -men führen. - In diesen Fällen ist -\begin_inset Quotes sld -\end_inset - -sendfile -\begin_inset Quotes srd -\end_inset - - zu deaktivieren, entweder durch Rekompilieren unter der Benützung der configure --Option -\begin_inset Quotes sld -\end_inset - ---without-sendfile -\begin_inset Quotes srd -\end_inset - - oder durch Benützung der Direktive "EnableSendfile off" in der Konfigurationsda -tei. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-radvd" - -\end_inset - -Router Advertisement Daemon (radvd) -\end_layout - -\begin_layout Standard -Der Router Advertisement Daemon ist auf einem LAN dann sehr sinnvoll, wenn - die Clients automatisch konfiguriert werden sollen. - Der Daemon selbst sollte auf einem Linux Gateway Router eingerichtet sein - (es hat nicht notwendigerweise das default IPv4 Gateway zu sein, Vorsicht - also wer am LAN Router Advertisements versendet). -\end_layout - -\begin_layout Standard -Sie können einige Flags und Informationen im Advertisement spezifizieren. - Allgemein werden verwendet: -\end_layout - -\begin_layout Itemize -Präfix (notwendige Angabe) -\end_layout - -\begin_layout Itemize -Lebensdauer des Präfix -\end_layout - -\begin_layout Itemize -Intervall der Advertisements (optional) -\end_layout - -\begin_layout Standard -Nach der korrekten Konfiguration sendet der Daemon die Advertisements über - angegebene Interfaces. - Die Clients empfangen die Advertisements und konfigurieren automatisch - Ihre Adressen mit dem empfangenen Präfix und der Default-Route. -\end_layout - -\begin_layout Subsection -radvd konfigurieren -\end_layout - -\begin_layout Subsubsection -Einfache Konfiguration -\end_layout - -\begin_layout Standard -Die Konfigurationsdatei des radvd ist normalerweise die Datei /etc/radvd.conf. - Eine einfache Konfiguration sieht wie folgt aus: -\end_layout - -\begin_layout Code - -interface eth0 { -\end_layout - -\begin_layout Code - - AdvSendAdvert on; -\end_layout - -\begin_layout Code - - MinRtrAdvInterval 3; -\end_layout - -\begin_layout Code - - MaxRtrAdvInterval 10; -\end_layout - -\begin_layout Code - - prefix 2001:0db8:0100:f101::/64 { -\end_layout - -\begin_layout Code - - AdvOnLink on; -\end_layout - -\begin_layout Code - - AdvAutonomous on; -\end_layout - -\begin_layout Code - - AdvRouterAddr on; -\end_layout - -\begin_layout Code - - }; -\end_layout - -\begin_layout Code - -}; -\end_layout - -\begin_layout Standard -Als Ergebnis auf der Client-Seite ergibt sich hieraus: -\end_layout - -\begin_layout Code - -# ip -6 addr show eth0 -\end_layout - -\begin_layout Code - -3: eth0: mtu 1500 qdisc pfifo_fast qlen 100 -\end_layout - -\begin_layout Code - - inet6 2001:0db8:100:f101:2e0:12ff:fe34:1234/64 scope global dynamic - -\end_layout - -\begin_layout Code - - valid_lft 2591992sec preferred_lft 604792sec -\end_layout - -\begin_layout Code - - inet6 fe80::2e0:12ff:fe34:1234/10 scope link -\end_layout - -\begin_layout Standard -Ein hoher Wert für die Lebensdauer wurde verwendet, da der Wert nicht manuell - konfiguriert wurde. - -\end_layout - -\begin_layout Subsubsection -Spezielle 6to4 Konfiguration -\end_layout - -\begin_layout Standard -Seit der Version 0.6.2pl3 wird die automatische (Neu)-Erstellung des Präfixes - abhängig von der IPv4 Adresse eines angegebenen Interfaces unterstützt. - Dies kann dazu eingesetzt werden, die Advertisements dann in einem LAN - zu verteilen, nachdem das 6to4 tunneling geändert wurde. - Zumeist eingesetzt wird dies hinter einem dynamischen dial-on-demand Linux - Router. - Wegen der sicherlich kürzeren Lebensdauer dieser Präfixe (nach jedem dial-up - ist ein anderes Präfix gültig), wird der Wert der Lebensdauer auf einen - minimalen Wert gesetzt: -\end_layout - -\begin_layout Code - -interface eth0 { -\end_layout - -\begin_layout Code - - AdvSendAdvert on; -\end_layout - -\begin_layout Code - - MinRtrAdvInterval 3; -\end_layout - -\begin_layout Code - - MaxRtrAdvInterval 10; -\end_layout - -\begin_layout Code - - prefix 0:0:0:f101::/64 { -\end_layout - -\begin_layout Code - - AdvOnLink off; -\end_layout - -\begin_layout Code - - AdvAutonomous on; -\end_layout - -\begin_layout Code - - AdvRouterAddr on; -\end_layout - -\begin_layout Code - - Base6to4Interface ppp0; -\end_layout - -\begin_layout Code - - AdvPreferredLifetime 20; -\end_layout - -\begin_layout Code - - AdvValidLifetime 30; -\end_layout - -\begin_layout Code - - }; -\end_layout - -\begin_layout Code - -}; -\end_layout - -\begin_layout Standard -Das Ergebnis auf Clientseite ist (unter der Annahme, dass ppp0 die lokale - IPv4 Adresse 1.2.3.4 hat): -\end_layout - -\begin_layout Code - -# /sbin/ip -6 addr show eth0 -\end_layout - -\begin_layout Code - -3: eth0: mtu 1500 qdisc pfifo_fast qlen 100 -\end_layout - -\begin_layout Code - - inet6 2002:0102:0304:f101:2e0:12ff:fe34:1234/64 scope global dynamic - -\end_layout - -\begin_layout Code - - valid_lft 22sec preferred_lft 12sec -\end_layout - -\begin_layout Code - - inet6 fe80::2e0:12ff:fe34:1234/10 scope link -\end_layout - -\begin_layout Standard -Da eine kurze Lebensdauer definiert wurde, wird das Präfix bald verworfen - werden, sollte kein entsprechendes Advertisement empfangen werden. -\end_layout - -\begin_layout Standard - -\lang english -Achtung: wenn keine spezielle 6to4-Unterstützung der initscripts benutzt - wird, ist eine spezielle Route am internen Interface des Routers notwendig, - sonst gibt es Probleme bei eingehenden Paketen. - Für das gezeigte Beispiel lautet diese: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route add 2002:0102:0304:f101::/64 dev eth0 metric 1 -\end_layout - -\begin_layout Standard - -\lang english -Diese Route muß jedesmal, wenn der Prefix wechselt, ersetzt werden. - Die ist dann der Fall, wenn das Dial-Up-Interface eine neue IPv4-Adresse - bekommen hat. -\end_layout - -\begin_layout Subsection -Fehlersuche -\end_layout - -\begin_layout Standard -Mit dem Programm -\begin_inset Quotes sld -\end_inset - -radvdump -\begin_inset Quotes srd -\end_inset - - können Sie gesendete und empfangene Advertisements detailliert betrachten. - Die Anwendung ist einfach: -\end_layout - -\begin_layout Code - -# radvdump -\end_layout - -\begin_layout Code - -Router advertisement from fe80::280:c8ff:feb9:cef9 (hoplimit 255) -\end_layout - -\begin_layout Code - - AdvCurHopLimit: 64 -\end_layout - -\begin_layout Code - - AdvManagedFlag: off -\end_layout - -\begin_layout Code - - AdvOtherConfigFlag: off -\end_layout - -\begin_layout Code - - AdvHomeAgentFlag: off -\end_layout - -\begin_layout Code - - AdvReachableTime: 0 -\end_layout - -\begin_layout Code - - AdvRetransTimer: 0 -\end_layout - -\begin_layout Code - - Prefix 2002:0102:0304:f101::/64 -\end_layout - -\begin_layout Code - - AdvValidLifetime: 30 -\end_layout - -\begin_layout Code - - AdvPreferredLifetime: 20 -\end_layout - -\begin_layout Code - - AdvOnLink: off -\end_layout - -\begin_layout Code - - AdvAutonomous: on -\end_layout - -\begin_layout Code - - AdvRouterAddr: on -\end_layout - -\begin_layout Code - - Prefix 2001:0db8:100:f101::/64 -\end_layout - -\begin_layout Code - - AdvValidLifetime: 2592000 -\end_layout - -\begin_layout Code - - AdvPreferredLifetime: 604800 -\end_layout - -\begin_layout Code - - AdvOnLink: on -\end_layout - -\begin_layout Code - - AdvAutonomous: on -\end_layout - -\begin_layout Code - - AdvRouterAddr: on -\end_layout - -\begin_layout Code - - AdvSourceLLAddress: 00 80 12 34 56 78 -\end_layout - -\begin_layout Standard -Im Output wird jedes Advertisement in einem lesbarem Format dargestellt. - Zu sehen sollten die von Ihnen eingestellten Werte sein; falls dem nicht - so ist, wurde das Advertisement eventuell nicht von Ihrem radvd gesendet... - (für die Rückverfolgung des Routers können Sie die LLAddress, die MAC Adresse - des Routers, verwenden...) -\end_layout - -\begin_layout Section - -\lang english -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-dhcpv6" - -\end_inset - -Dynamic Host Configuration v6 Server (dhcp6s) -\end_layout - -\begin_layout Standard - -\lang english -dhcp6s kann für stateful Konfiguration benutzt werden. - Der Daemon selbst muß nicht unbedingt auf dem Linux-Standard-Router laufen. - -\end_layout - -\begin_layout Standard - -\lang english -Man kann hier mehr Informationen als bei radvd spezifizieren. - Die meisten sind denen des IPv4 DHCP-Servers ähnlich. -\end_layout - -\begin_layout Standard - -\lang english -Nach einer passenden Konfiguration reagiert der Daemon auf empfangene IPv6-Multi -cast-Pakete, die von einem Client an die Adresse ff02::1:2 gesendet werden. -\end_layout - -\begin_layout Subsection - -\lang english -Konfiguration des DHCPv6-Servers (dhcp6s) -\end_layout - -\begin_layout Subsubsection - -\lang english -Einfache Konfiguration -\end_layout - -\begin_layout Standard - -\lang english -Die Konfigurationsdatei des dhcp6s ist normalerweise /etc/dhcp6s.conf. - Ein einfaches Beispiel sieht wie folgt aus: -\end_layout - -\begin_layout Code - -interface eth0 { -\end_layout - -\begin_layout Code - - server-preference 255; -\end_layout - -\begin_layout Code - - renew-time 60; -\end_layout - -\begin_layout Code - - rebind-time 90; -\end_layout - -\begin_layout Code - - prefer-life-time 130; -\end_layout - -\begin_layout Code - - valid-life-time 200; -\end_layout - -\begin_layout Code - - allow rapid-commit; -\end_layout - -\begin_layout Code - - option dns_servers 2001:db8:0:f101::1 sub.domain.example; -\end_layout - -\begin_layout Code - - link AAA { -\end_layout - -\begin_layout Code - - range 2001:db8:0:f101::1000 to 2001:db8:0:f101::ffff/64; -\end_layout - -\begin_layout Code - - prefix 2001:db8:0:f101::/64; -\end_layout - -\begin_layout Code - - }; -\end_layout - -\begin_layout Code - -}; -\end_layout - -\begin_layout Subsection - -\lang english -Konfiguration des DHCPv6-Client (dhcp6s) -\end_layout - -\begin_layout Subsubsection - -\lang english -Einfache Konfiguration -\end_layout - -\begin_layout Standard - -\lang english -Die Konfigurationsdatei von dhcp6c ist normalerweise /etc/dhcp6c.conf. - Ein einfaches Beispiel sieht wie folgt aus: -\end_layout - -\begin_layout Code - -interface eth0 { -\end_layout - -\begin_layout Code - - send rapid-commit; -\end_layout - -\begin_layout Code - - request domain-name-servers; -\end_layout - -\begin_layout Code - -}; -\end_layout - -\begin_layout Subsection - -\lang english -Benutzung -\end_layout - -\begin_layout Subsubsection - -\lang english -dhcp6s -\end_layout - -\begin_layout Standard - -\lang english -Starten des Servers, z.B. - durch -\end_layout - -\begin_layout Code - -# service dhcp6s start -\end_layout - -\begin_layout Subsubsection - -\lang english -dhcp6c -\end_layout - -\begin_layout Standard - -\lang english -Starten des Clients im Vordergrund, z.B. - durch -\end_layout - -\begin_layout Code - -# dhcp6c -f eth0 -\end_layout - -\begin_layout Code - -... -\end_layout - -\begin_layout Subsection - -\lang english -Fehlersuche -\end_layout - -\begin_layout Subsubsection - -\lang english -dhcp6s -\end_layout - -\begin_layout Standard - -\lang english -Der Server hat einen Vordergrund und zwei Debug-Schalter (von denen beide - benutzt werden sollten), hier ein Beispiel: -\end_layout - -\begin_layout Code - -# dhcp6c -d -D -f eth0 -\end_layout - -\begin_layout Subsubsection - -\lang english -dhcp6c -\end_layout - -\begin_layout Standard - -\lang english -Mit einem IPv6 Ping an die DHCP Multicast-Adresse kann getestet werden, - ob der IPv6 DHCP Server überhaupt erreichbar ist am Link. -\end_layout - -\begin_layout Code - -# ping6 -I eth0 ff02::1:2 -\end_layout - -\begin_layout Standard - -\lang english -Der Client hat einen Vordergrund und zwei Debug-Schalter, hier ein Beispiel: -\end_layout - -\begin_layout Code - -# dhcp6c -d -f eth0 -\end_layout - -\begin_layout Code - -Oct/03/2005 17:18:16 dhcpv6 doesn't support hardware type 776 -\end_layout - -\begin_layout Code - -Oct/03/2005 17:18:16 doesn't support sit0 address family 0 -\end_layout - -\begin_layout Code - -Oct/03/2005 17:18:16 netlink_recv_rtgenmsg error -\end_layout - -\begin_layout Code - -Oct/03/2005 17:18:16 netlink_recv_rtgenmsg error -\end_layout - -\begin_layout Code - -Oct/03/2005 17:18:17 status code for this address is: success -\end_layout - -\begin_layout Code - -Oct/03/2005 17:18:17 status code: success -\end_layout - -\begin_layout Code - -Oct/03/2005 17:18:17 netlink_recv_rtgenmsg error -\end_layout - -\begin_layout Code - -Oct/03/2005 17:18:17 netlink_recv_rtgenmsg error -\end_layout - -\begin_layout Code - -Oct/03/2005 17:18:17 assigned address 2001:db8:0:f101::1002 prefix len is - not in any RAs prefix length using 64 bit instead -\end_layout - -\begin_layout Code - -Oct/03/2005 17:18:17 renew time 60, rebind time 9 -\end_layout - -\begin_layout Standard - -\lang english -Bemerkung: die netlink-Fehlermeldungen haben keinen Einfluß auf die Funktionalit -ät. -\end_layout - -\begin_layout Section - -\lang english -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-isc-dhcp" - -\end_inset - -ISC Dynamic Host Configuration Server (dhcpd) -\end_layout - -\begin_layout Standard - -\lang english -ISC DHCP unterstützt IPv6 seit der Version 4.x. -\end_layout - -\begin_layout Subsection - -\lang english -Konfiguration des ISC DHCP Server für IPv6 (dhcpd) -\end_layout - -\begin_layout Standard - -\lang english -Es ist zu beachten, daß der ISC DHCP Server aktuell entweder IPv4 oder IPv6 - bedienen kann, nicht beides, d.h. - der Daemon muß zweimal gestartet werden (für IPv6 mit Option -\begin_inset Quotes sld -\end_inset - --6 -\begin_inset Quotes srd -\end_inset - -) um beide Protokolle zu unterstützen. -\end_layout - -\begin_layout Subsubsection - -\lang english -Einfache Configuration -\end_layout - -\begin_layout Standard - -\lang english -Erstellen einer eigenen Konfigurationsdatei /etc/dhcp/dhcpd6.conf für den - IPv6-Teil des dhcpd. - Es ist zu beachten, daß der router natürlich eine Schnittstelle mit einer - IPv6-Adresse aus dem definierten Subnetz konfiguriert haben muß. -\end_layout - -\begin_layout Code - -default-lease-time 600; -\end_layout - -\begin_layout Code - -max-lease-time 7200; -\end_layout - -\begin_layout Code - -log-facility local7; -\end_layout - -\begin_layout Code - -subnet6 2001:db8:0:1::/64 { -\end_layout - -\begin_layout Code - - # Range for clients -\end_layout - -\begin_layout Code - - range6 2001:db8:0:1::129 2001:db8:0:1::254; -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - - # Range for clients requesting a temporary address -\end_layout - -\begin_layout Code - - range6 2001:db8:0:1::/64 temporary; -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - - # Additional options -\end_layout - -\begin_layout Code - - option dhcp6.name-servers fec0:0:0:1::1; -\end_layout - -\begin_layout Code - - option dhcp6.domain-search "domain.example"; -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - - # Prefix range for delegation to sub-routers -\end_layout - -\begin_layout Code - - prefix6 2001:db8:0:100:: 2001:db8:0:f00:: /56; -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - - # Example for a fixed host address -\end_layout - -\begin_layout Code - - host specialclient { -\end_layout - -\begin_layout Code - - host-identifier option dhcp6.client-id 00:01:00:01:4a:1f:ba:e3:60:b9:1f:01: -23:45; -\end_layout - -\begin_layout Code - - fixed-address6 2001:db8:0:1::127; -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - -} -\end_layout - -\begin_layout Standard - -\lang english -Es ist zu beachten, dass die -\begin_inset Quotes sld -\end_inset - -dhcp.client-id -\begin_inset Quotes srd -\end_inset - - nicht länger die MAC-Adresse ist, sondern eine per System eindeutige ID! - -\begin_inset Quotes sld -\end_inset - -dhcp6c -\begin_inset Quotes srd -\end_inset - - (siehe oben) benutzt die Datei /var/lib/dhcpv6/dhcp6c_duid (wird beim ersten - Start erstellt, falls nicht vorhanden) als eindeutige ID. - Es ist eine 14 Byte lange ID, welche mit einer 2 Byte Längeninformation - startet (üblicherweise -\begin_inset Quotes sld -\end_inset - -0x000e -\begin_inset Quotes srd -\end_inset - -): -\end_layout - -\begin_layout Code - -# hexdump -e '"%07.7_ax " 1/2 "%04x" " " 14/1 "%02x:" " -\backslash -n"' /var/lib/dhcpv6/dhcp6c_duid 0000000 000e 00:01:00:01:4a:1f:ba:e3:60:b9:1f:01 -:23:45: -\end_layout - -\begin_layout Subsection - -\lang english -Benutzung -\end_layout - -\begin_layout Subsubsection - -\lang english -dhcpd -\end_layout - -\begin_layout Standard - -\lang english -Starte den Server im Vordergrund: -\end_layout - -\begin_layout Code - -# /usr/sbin/dhcpd -6 -d -cf /etc/dhcp/dhcpd6.conf eth1 -\end_layout - -\begin_layout Code - -Internet Systems Consortium DHCP Server 4.1.0 -\end_layout - -\begin_layout Code - -Copyright 2004-2008 Internet Systems Consortium. - -\end_layout - -\begin_layout Code - -All rights reserved. - -\end_layout - -\begin_layout Code - -For info, please visit http://www.isc.org/sw/dhcp/ -\end_layout - -\begin_layout Code - -Not searching LDAP since ldap-server, ldap-port and ldap-base-dn were not - specified in the config file -\end_layout - -\begin_layout Code - -Wrote 0 leases to leases file. - -\end_layout - -\begin_layout Code - -Bound to *:547 -\end_layout - -\begin_layout Code - -Listening on Socket/5/eth1/2001:db8:0:1::/64 -\end_layout - -\begin_layout Code - -Sending on Socket/5/eth1/2001:db8:0:1::/64 -\end_layout - -\begin_layout Section - -\lang english -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-dibbler" - -\end_inset - -DHCP Server Dibbler -\end_layout - -\begin_layout Standard - -\lang english -Dibbler ist auch ein DHCP server. -\end_layout - -\begin_layout Subsection - -\lang english -Konfiguration des Dibbler DHCP server für IPv6 -\end_layout - -\begin_layout Subsubsection - -\lang english -Einfache Konfuration -\end_layout - -\begin_layout Standard - -\lang english -Erstellen der Konfigurationsdatei /etc/dibbler/server.conf . - Es ist zu beachten, daß der router natürlich eine Schnittstelle mit einer - IPv6-Adresse aus dem definierten Subnetz konfiguriert haben muß. -\end_layout - -\begin_layout Code - -log-level 8 -\end_layout - -\begin_layout Code - -log-mode short -\end_layout - -\begin_layout Code - -preference 0 -\end_layout - -\begin_layout Code - -iface "eth1" { -\end_layout - -\begin_layout Code - - prefered-lifetime 3600 -\end_layout - -\begin_layout Code - - valid-lifetime 7200 -\end_layout - -\begin_layout Code - - class { -\end_layout - -\begin_layout Code - - pool 2001:db8:0:1::/64 -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - option dns-server fec0:0:0:1::1 -\end_layout - -\begin_layout Code - - option domain domain.example -\end_layout - -\begin_layout Code - -} -\end_layout - -\begin_layout Subsection - -\lang english -Benutzung -\end_layout - -\begin_layout Subsubsection - -\lang english -dibbler-server -\end_layout - -\begin_layout Standard - -\lang english -Start Server im Vorgergrund: -\end_layout - -\begin_layout Code - -# dibbler-server run -\end_layout - -\begin_layout Code - -| Dibbler - a portable DHCPv6, version 0.7.3 (SERVER, Linux port) -\end_layout - -\begin_layout Code - -| Authors : Tomasz Mrugalski,Marek Senderski -\end_layout - -\begin_layout Code - -| Licence : GNU GPL v2 only. - Developed at Gdansk University of Technology. - -\end_layout - -\begin_layout Code - -| Homepage: http://klub.com.pl/dhcpv6/ -\end_layout - -\begin_layout Code - -2009.05.28 10:18:48 Server Notice My pid (1789) is stored in /var/lib/dibbler/s -erver.pid -\end_layout - -\begin_layout Code - -2009.05.28 10:18:48 Server Notice Detected iface eth0/3, MAC=54:52:00:01:23:45. - -\end_layout - -\begin_layout Code - -2009.05.28 10:18:48 Server Notice Detected iface eth1/2, MAC=54:52:00:67:89:ab. - -\end_layout - -\begin_layout Code - -2009.05.28 10:18:48 Server Notice Detected iface lo/1, MAC=00:00:00:00:00:00. - -\end_layout - -\begin_layout Code - -2009.05.28 10:18:48 Server Debug Skipping database loading. - -\end_layout - -\begin_layout Code - -2009.05.28 10:18:48 Server Debug Cache:server-cache.xml file: parsing started, - expecting 0 entries. - -\end_layout - -\begin_layout Code - -2009.05.28 10:18:48 Server Notice Parsing /etc/dibbler/server.conf config - file... - -\end_layout - -\begin_layout Code - -18:48 Server Debug Setting 0 generic option(s). - -\end_layout - -\begin_layout Code - -18:48 Server Debug 0 per-client configurations (exceptions) added. - -\end_layout - -\begin_layout Code - -18:48 Server Debug Parsing /etc/dibbler/server.conf done. - -\end_layout - -\begin_layout Code - -18:48 Server Info 0 client class(es) defined. - -\end_layout - -\begin_layout Code - -18:48 Server Debug 1 interface(s) specified in /etc/dibbler/server.conf - -\end_layout - -\begin_layout Code - -18:48 Server Info Mapping allow, deny list to class 0:0 allow/deny - entries in total. - -\end_layout - -\begin_layout Code - -18:48 Server Info Interface eth1/2 configuration has been loaded. - -\end_layout - -\begin_layout Code - -18:48 Server Notice Running in stateful mode. - -\end_layout - -\begin_layout Code - -18:48 Server Info My DUID is 00:01:00:01:11:aa:6d:a7:54:52:00:67:89:ab. - -\end_layout - -\begin_layout Code - -18:48 Server Notice Creating multicast (ff02::1:2) socket on eth1/2 (eth1/2) - interface. - -\end_layout - -\begin_layout Code - -18:48 Server Debug Cache: size set to 1048576 bytes, 1 cache entry size - is 87 bytes, so maximum 12052 address-client pair(s) may be cached. - -\end_layout - -\begin_layout Code - -18:48 Server Notice Accepting connections. - Next event in 4294967295 second(s). -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-tcpwrapper" - -\end_inset - -tcp_wrapper -\end_layout - -\begin_layout Standard -Mit der tcp_wrapper Programmbibliothek können Sie Ihre Dienste gegen Missbrauch - schützen. -\end_layout - -\begin_layout Subsection -Filter-Funktionalität -\end_layout - -\begin_layout Standard -Sie können tcp_wrapper für folgende Zwecke einsetzen: -\end_layout - -\begin_layout Itemize -Nach Source-Adressen filtern (IPv4 oder IPv6) -\end_layout - -\begin_layout Itemize -Nach Benutzern filtern (benötigt einen aktiven ident Daemon auf der Client-Seite -) -\end_layout - -\begin_layout Subsection -Welches Programm benützt tcp_wrapper -\end_layout - -\begin_layout Standard -Folgende Programme sind bekannt: -\end_layout - -\begin_layout Itemize -Jeder Dienst, der durch den xinetd aufgerufen wird (und wenn der xinetd - mit der tcp_wrapper Bibliothek kompiliert wurde) -\end_layout - -\begin_layout Itemize -sshd (wenn der mit der tcp_wrapper Bibliothek kompiliert wurde) -\end_layout - -\begin_layout Subsection -Anwendung -\end_layout - -\begin_layout Standard -Der tcp_wrapper wird durch zwei Dateien konfiguriert und kontrolliert: /etc/host -s.allow sowie /etc/hosts.deny. - Weitere Informationen finden Sie mit: -\end_layout - -\begin_layout Code - -$ man hosts.allow -\end_layout - -\begin_layout Subsubsection -Beispiel für /etc/hosts.allow -\end_layout - -\begin_layout Standard -In dieser Datei wird ein Dienst pro Zeile eingetragen, der positiv gefiltert - werden soll (d.h. - Verbindungen werden erlaubt). -\end_layout - -\begin_layout Code - -sshd: 1.2.3. - [2001:0db8:100:200::]/64 -\end_layout - -\begin_layout Code - -daytime-stream: 1.2.3. - [2001:0db8:100:200::]/64 -\end_layout - -\begin_layout Standard -Achtung: es existieren fehlerhafte Implementierungen, welche folgende fehlerhaft -e IPv6-Netzwerk-Beschreibung unterstützen: [2001:0db8:100:200::/64]. - Hoffentlich werden diese Versionen bald gefixt. -\end_layout - -\begin_layout Subsubsection -Beispiel für /etc/hosts.deny -\end_layout - -\begin_layout Standard -In dieser Datei werden alle Einträge negativ gefiltert. - Und normalerweise sollen alle Verbindungen unterbunden werden: -\end_layout - -\begin_layout Code - -ALL: ALL -\end_layout - -\begin_layout Standard -Sie können bei Bedarf obige Standardzeile auch durch Folgende ersetzen, - jedoch wird dadurch bei zu vielen Verbindungen in kurzer Zeitz eine DoS - Angriff möglich (Last des Mailers sowie des Spool-Verzeichnisses). - Ein logwatch ist somit wahrscheinlich die bessere Lösung. -\end_layout - -\begin_layout Code - -ALL: ALL: spawn (echo "Attempt from %h %a to %d at `date`" -\end_layout - -\begin_layout Code - - | tee -a /var/log/tcp.deny.log | mail root@localhost) -\end_layout - -\begin_layout Subsection -Protokollierung -\end_layout - -\begin_layout Standard -Entsprechend der Syslog Daemon Konfiguration in der Datei /etc/syslog.conf - protokolliert der tcp_wrapper normalerweise in die Datei /var/log/secure. -\end_layout - -\begin_layout Subsubsection -Abgelehnte Verbindung -\end_layout - -\begin_layout Standard -Das Logging einer abgelehnten IPv4-Verbindung zu einem durch den xinetd - überwachten Daytime Dienst sieht wie folgt aus: -\end_layout - -\begin_layout Code - -Jan 2 20:40:44 gate xinetd-ipv6[12346]: FAIL: daytime-stream libwrap -\end_layout - -\begin_layout Code - -¬ from=::ffff:1.2.3.4 -\end_layout - -\begin_layout Code - -Jan 2 20:32:06 gate xinetd-ipv6[12346]: FAIL: daytime-stream libwrap -\end_layout - -\begin_layout Code - - from=2001:0db8:100:200::212:34ff:fe12:3456 -\end_layout - -\begin_layout Standard -Das Logging einer abgelehnten IPv4-Verbindung zu einem durch den xinetd - überwachten sshd Daemon (auf IPv4 und IPv6 auf Verbindungen wartend) sieht - wie folgt aus: -\end_layout - -\begin_layout Code - -Jan 2 20:24:17 gate sshd[12345]: refused connect from ::ffff:1.2.3.4 -\end_layout - -\begin_layout Code - -¬ (::ffff:1.2.3.4) -\end_layout - -\begin_layout Code - -Jan 2 20:39:33 gate sshd[12345]: refused connect -\end_layout - -\begin_layout Code - - from 2001:0db8:100:200::212:34ff:fe12:3456 -\end_layout - -\begin_layout Code - -¬ (2001:0db8:100:200::212:34ff:fe12:3456) -\end_layout - -\begin_layout Subsubsection -Akzeptierte Verbindung -\end_layout - -\begin_layout Standard -Das Logging einer akzeptierten IPv4-Verbindung zu einem durch den xinetd - überwachten Daytime Dienst sieht wie folgt aus: -\end_layout - -\begin_layout Code - -Jan 2 20:37:50 gate xinetd-ipv6[12346]: START: daytime-stream pid=0 -\end_layout - -\begin_layout Code - -¬ from=::ffff:1.2.3.4 -\end_layout - -\begin_layout Code - -Jan 2 20:37:56 gate xinetd-ipv6[12346]: START: daytime-stream pid=0 -\end_layout - -\begin_layout Code - - from=2001:0db8:100:200::212:34ff:fe12:3456 -\end_layout - -\begin_layout Standard -Das Logging einer akzeptierten IPv4-Verbindung zu einem auf zwei Ports hörenden - sshd sieht wie folgt aus: -\end_layout - -\begin_layout Code - -Jan 2 20:43:10 gate sshd[21975]: Accepted password for user from ::ffff:1.2.3.4 -\end_layout - -\begin_layout Code - -¬ port 33381 ssh2 -\end_layout - -\begin_layout Code - -Jan 2 20:42:19 gate sshd[12345]: Accepted password for user -\end_layout - -\begin_layout Code - - from 2001:0db8:100:200::212:34ff:fe12:3456 port 33380 ssh2 -\end_layout - -\begin_layout Section - -\lang english -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-vsftpd" - -\end_inset - -vsftpd -\end_layout - -\begin_layout Subsection -Auf IPv6-Adressen lauschen -\end_layout - -\begin_layout Standard - -\lang english -Editiere die Konfigurationsdatei, üblicherweise /etc/vsftpd/vsftpd.conf, - und setze die Option für das -\begin_inset Quotes sld -\end_inset - -listen -\begin_inset Quotes srd -\end_inset - - wie folgt: -\end_layout - -\begin_layout Code - -listen_ipv6=yes -\end_layout - -\begin_layout Standard - -\lang english -Mehr ist nicht zu tun. -\end_layout - -\begin_layout Section - -\lang english -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-proftpd" - -\end_inset - -proftpd -\end_layout - -\begin_layout Subsection -Auf IPv6-Adressen lauschen -\end_layout - -\begin_layout Standard - -\lang english -Editiere die Konfigurationsdatei, üblicherweise /etc/proftpd.conf, allerdings - ist hier zu beachten, daß dies in der Konfigurationsart virtueller Host - nicht 100% logisch ist -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Code - - ... -\end_layout - -\begin_layout Code - - Bind 2001:0DB8::1 -\end_layout - -\begin_layout Code - - ... -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Standard - -\lang english -Mehr ist nicht zu tun. -\end_layout - -\begin_layout Section - -\lang english -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-others" - -\end_inset - -Andere Daemons -\end_layout - -\begin_layout Standard - -\lang english -Seit einiger Zeit ist dies meist einfach, suchen Sie einfach nach einer - Kommandozeilen-Option oder einer Konfigurationsvariable, um das Lauschen - an IPv6-Adressen zu aktivieren. - Schauen Sie dazu in den Manual-Seiten des Daemons oder in den entsprechenden - FAQs nach. - Es kann allerdings durchaus sein, daß sich der Daemon nur an die IPv6- -\begin_inset Quotes sld -\end_inset - -any -\begin_inset Quotes srd -\end_inset - --Adresse (::) binden läßt und kein dediziertes Binden an eine spezielle - IPv6-Adresse möglich ist (das hängt von der Unterstützung des Programmierers - ab). -\end_layout - -\begin_layout Chapter - -\lang english -\begin_inset CommandInset label -LatexCommand label -name "chapter-programming" - -\end_inset - -Programmierung -\end_layout - -\begin_layout Section - -\lang english -\begin_inset CommandInset label -LatexCommand label -name "chapter-section-using-API" - -\end_inset - - -\begin_inset CommandInset label -LatexCommand label -name "chapter-programming-using-API" - -\end_inset - - -\lang ngerman -Programmierung mit Nutzung der C-API -\end_layout - -\begin_layout Standard -Dieser Abschnitt ist momentan nicht in Deutsch verfügbar, die englische - Version ist verfügbar unter: -\begin_inset CommandInset href -LatexCommand href -name "TLDP / Linux+IPv6-HOWTO / Programming using C-API" -target "http://www.tldp.org/HOWTO/Linux+IPv6-HOWTO/chapter-section-using-api.html" - -\end_inset - - -\end_layout - -\begin_layout Section - -\lang english -Andere Programmiersprachen -\end_layout - -\begin_layout Subsection - -\lang english -JAVA -\end_layout - -\begin_layout Standard - -\lang english -In Sun Java Versionen ab 1.4 ist Unterstützung für IPv6 vorhanden, siehe - dazu auch die Klasse -\begin_inset CommandInset href -LatexCommand href -name "Inet6Address (1.5/5.0)" -target "http://java.sun.com/j2se/1.5.0/docs/api/java/net/Inet6Address.html" - -\end_inset - -. - Weitere Tipps sind verfügbar im -\emph on -Networking IPv6 User Guide for JDK/JRE -\emph default - -\begin_inset CommandInset href -LatexCommand href -name "1.4" -target "http://java.sun.com/j2se/1.4.2/docs/guide/net/ipv6_guide/index.html" - -\end_inset - - und -\begin_inset CommandInset href -LatexCommand href -name "1.5 (5.0)" -target "http://java.sun.com/j2se/1.5.0/docs/guide/net/ipv6_guide/index.html" - -\end_inset - -. -\end_layout - -\begin_layout Subsection - -\lang english -Perl -\end_layout - -\begin_layout Standard - -\lang english -Stand Mai 2007 ist nichts bekannt, daß der Kern von Perl IPv6 nativ unterstützt. - Dies kann allerdings aktiviert werden durch Benützung des folgenden Moduls: -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "Socket6" -target "http://search.cpan.org/~umemoto/Socket6/" - -\end_inset - - -\end_layout - -\begin_layout Standard - -\lang english -Zudem existieren weitere Module für/mit IPv6 Unterstützung (z.B. - Net::IP), suche nach -\begin_inset Quotes sld -\end_inset - -IPv6 -\begin_inset Quotes srd -\end_inset - - bei -\begin_inset CommandInset href -LatexCommand href -name "http://search.cpan.org/" -target "http://search.cpan.org/" - -\end_inset - -. -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-interoperability" - -\end_inset - -Interoperabilität -\end_layout - -\begin_layout Standard - -\lang english -Das -\begin_inset CommandInset href -LatexCommand href -name "TAHI Project" -target "http://www.tahi.org/" - -\end_inset - - prüft das -\lang ngerman -Zusammenspiel der verschiedenen Betriebssysteme in Hinblick auf IPv6 Funktionali -tät und Implementierung -\lang english -. - Der Linux Kernel hat bereits das -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Ready Logo Phase 1" -target "http://www.linux-ipv6.org/v6ready/" - -\end_inset - - bekommen. -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-information" - -\end_inset - -Weitere Informationen und URLs -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "information-books" - -\end_inset - -Gedruckte Bücher, Artikel, Onlinerezensionen -\end_layout - -\begin_layout Subsection -Gedruckte Bücher (Englisch) -\end_layout - -\begin_layout Subsubsection -Cisco -\end_layout - -\begin_layout Itemize -Cisco Self-Study: -\lang english -Implementing IPv6 Networks (IPV6) -\lang ngerman -, von Regis Desmeules. - Cisco Press; ISBN 1587050862; 500 Seiten; 1. - Edition (April 11, 2003). -\begin_inset Newline newline -\end_inset - -Anmerkung: Dieser Titel wird am 11. - April 2003 publiziert. -\end_layout - -\begin_layout Itemize - -\lang english -Configuring IPv6 with Cisco IOS -\lang ngerman -, von Sam Brown, Sam Browne, Neal Chen, Robbie Harrell, Edgar, Jr. - Parenti (Editor), Eric Knipp (Editor), Paul Fong (Editor) 362 Seiten; Syngress - Media Inc; ISBN 1928994849; (July 12, 2002). -\end_layout - -\begin_layout Subsubsection -Allgemein -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 in Practice: A Unixer's Guide to the Next Generation Internet" -target "http://www.benedikt-stockebrand.de/books_e.html#ipv6-in-practice" - -\end_inset - - von Benedikt Stockebrand, November 2006; ISBN 3-540-24524-3 -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Essentials" -target "http://www.sunny.ch/publications/f_ipv6.htm" - -\end_inset - - von Silvia Hagen, zweite Auflage, Mai 2006; ISBN 0-5961-0058-2 -\begin_inset Newline newline -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name "ToC, Index, Sample Chapter etc." -target "http://www.oreilly.com/catalog/ipv6ess/" - -\end_inset - -; -\begin_inset CommandInset href -LatexCommand href -name "O'Reilly Pressrelease" -target "http://press.oreilly.com/ipv6ess.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -IPv6: The New Internet Protocol. - Von Christian Huitema; Publiziert von Prentice-Hall; ISBN 0138505055. - -\begin_inset Newline newline -\end_inset - -Beschreibung: Dieses Buch, geschrieben von Christian Huitema - einem Mitglied - des Internet Architecture Board, bietet eine exzellente Beschreibung von - IPv6, die Unterschiede zu IPv4 sowie die 'wies' und 'warums' der IPv6 Entwicklu -ng. - -\begin_inset Newline newline -\end_inset - -Quelle: -\begin_inset CommandInset href -LatexCommand href -name "http://www.cs.uu.nl/wais/html/na-dir/internet/tcp-ip/resource-list.html" -target "http://www.cs.uu.nl/wais/html/na-dir/internet/tcp-ip/resource-list.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Networks" -target "http://www.epinions.com/book_mu-3402412/display_~full_specs" - -\end_inset - - von Niles, Kitty; (ISBN 0070248079); 550 Seiten; Datum der Veröffentlichung: - 05/01/1998. -\end_layout - -\begin_layout Itemize - -\lang english -Implementing IPV6. - Supporting the Next Generation Internet Protocols -\lang ngerman - von P. - E. - Miller, Mark A. - Miller; Hrsg.: John Wiley & Sons; ISBN 0764545892; 2. - Edition (15.März 2000); 402 Seiten. -\end_layout - -\begin_layout Itemize - -\lang english -Big Book of Ipv6 Addressing Rfcs -\lang ngerman - von Peter H. - Salus (Compiler), Morgan Kaufmann (Hrsg.), April 2000, 450 Seiten ISBN 012616770 -2. - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Understanding IPV6" -target "http://www.epinions.com/book_mu-3922588/display_~full_specs" - -\end_inset - - von Davies, Joseph; ISBN 0735612455; Datum der Veröffentlichung: 05/01/2001; - 350 Seiten. -\end_layout - -\begin_layout Itemize - -\lang english -Migrating to IPv6 - IPv6 in Practice -\lang ngerman - von Marc Blanchet; John Wiley & Sons (Hrsg.); ISBN 0471498920; 1. - Edition (November 2002); 368 Seiten. -\end_layout - -\begin_layout Itemize - -\lang english -Ipv6 Network Programming von Jun-ichiro Hagino; ISBN 1555583180 -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Wireless boosting IPv6" -target "http://www.nwfusion.com/news/2000/1023ipv6.html" - -\end_inset - - von Carolyn Duffy Marsan, 10/23/2000. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "O'reilly Network search for keyword IPv6" -target "http://www.oreillynet.com/search/index.ncsp?sp-q=IPv6" - -\end_inset - - ergibt 29 Treffer (28. - Januar 2002) -\end_layout - -\begin_layout Subsection -Artikel, eBooks, Online Rezensionen -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Getting Connected with 6to4" -target "http://www.onlamp.com/pub/a/onlamp/2001/06/01/ipv6_tutorial.html" - -\end_inset - - von Huber Feyrer, 06/01/2001 -\end_layout - -\begin_layout Itemize -Transient Addressing for Related Processes: Improved Firewalling by Using - IPv6 and Multiple Addresses per Host; geschrieben von Peter M. - Gleiz, Steven M. - Bellovin ( -\begin_inset CommandInset href -LatexCommand href -name "PC-PDF-Version" -target "http://www.securiteinfo.com/ebooks/pdf/tarp.pdf" - -\end_inset - -; -\begin_inset CommandInset href -LatexCommand href -name "Palm-PDF-Version" -target "http://www.securiteinfo.com/ebooks/palm/tarp.pdf" - -\end_inset - -; -\begin_inset CommandInset href -LatexCommand href -name "PDB-Version" -target "http://www.securiteinfo.com/ebooks/pdb/tarp.pdb" - -\end_inset - -) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Internetworking IPv6 with Cisco Routers" -target "http://www.ip6.com/index.html" - -\end_inset - - von Silvano Gai, McGrawHill Italia, 1997. - Die 13 Kapitel und der Anhang A-D sind als PDF-Dokument 'downladbar'. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Migration and Co-existence of IPv4 and IPv6 in Residential Networks" -target "http://www.csc.fi/~psavola/residential.html" - -\end_inset - - von Pekka Savola, CSC/FUNET, 2002 -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "information-sciencepublication" - -\end_inset - -Wissenschaftliche Publikationen (Kurzbeschreibungen, Bibliographien, Online - Quellen) -\end_layout - -\begin_layout Standard - -\lang english -Siehe auch: -\begin_inset CommandInset href -LatexCommand href -name "liinwww.ira.uka.de/ipv6" -target "http://liinwww.ira.uka.de/mpsbib?query=ipv6&maxnum=200" - -\end_inset - - bzw. - -\begin_inset CommandInset href -LatexCommand href -name "Google / Scholar / IPv6" -target "http://www.google.com/scholar?q=ipv6" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "GEANT IPv6 Workplan" -target "http://www.ipv6.ac.uk/gtpv6/workplan.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Trials on UK Academic Networks: Bermuda Project Aug.2002" -target "http://www.ipv6.ac.uk/bermuda2/" - -\end_inset - -: Participants - Getting connected - Project deliverables - Network topology - - Address assignments - Wireless IPv6 access - IPv6 migration - Project - presentations - Internet 2 - Other IPv6 projects - IPv6 fora and standards - Bermuda 2... -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "http://www.ipv6.ac.uk/" -target "http://www.ipv6.ac.uk/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 at the University of Southampton" -target "http://www.ipv6.ecs.soton.ac.uk/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Microsoft Research IPv6 Implementation (MSRIPv6): -\begin_inset CommandInset href -LatexCommand href -name "MSRIPv6 Configuring 6to4 - Connectivity with MSR IPv6 - Our 6Bone Node... " -target "http://www.research.microsoft.com/msripv6/" - -\end_inset - - -\end_layout - -\begin_layout Subsection -Sonstiges -\end_layout - -\begin_layout Standard -Mehr Infos gibt es unter: -\begin_inset CommandInset href -LatexCommand href -name "SWITCH IPv6 Pilot / References" -target "http://www.switch.ch/lan/ipv6/references.html" - -\end_inset - - -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "information-conferences" - -\end_inset - -Konferenzen und Meetings -\end_layout - -\begin_layout Standard -Fehlt etwas? Vorschläge sind willkommen! -\end_layout - -\begin_layout Subsection - -\lang english -2004 -\end_layout - -\begin_layout Itemize - -\lang english -1st Global IPv6 Summit in Sao Paul, Brasil -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "information-onlineinformation" - -\end_inset - -Online-Informationen -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "information-joinipv6" - -\end_inset - -Mit dem IPv6 Backbone verbinden -\end_layout - -\begin_layout Standard -Mehr Infos in späteren Versionen... - Vorschläge sind Willkommen! -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-globalregistries" - -\end_inset - -Globale Registrierungsstellen -\end_layout - -\begin_layout Standard -Siehe regionale Registrierungsstellen. -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-majorregionregistries" - -\end_inset - -Regionale Haupt-Registrierungsstellen -\end_layout - -\begin_layout Itemize -Amerika: -\begin_inset CommandInset href -LatexCommand href -name "ARIN" -target "http://www.arin.net/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "ARIN / registration page" -target "http://www.arin.net/registration/ipv6/index.html" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "ARIN / IPv6 guidelines" -target "http://www.arin.net/registration/ipv6/index.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -EMEA: -\begin_inset CommandInset href -LatexCommand href -name "Ripe NCC" -target "http://www.ripe.net/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "Ripe NCC / registration page" -target "http://www.ripe.net/ripencc/mem-services/registration/" - -\end_inset - -, -\lang english - -\begin_inset CommandInset href -LatexCommand href -name "Ripe NCC / IPv6 registration" -target "http://www.ripe.net/ripencc/mem-services/registration/ipv6/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Asien/Pazifik: -\begin_inset CommandInset href -LatexCommand href -name "APNIC" -target "http://www.apnic.net/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "APNIC / IPv6 ressource guide" -target "http://www.apnic.net/services/ipv6_guide.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Latein Amerika und Karikik: -\begin_inset CommandInset href -LatexCommand href -name "LACNIC" -target "http://lacnic.org/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Registration Services" -target "http://lacnic.net/en/bt-IPv6.html" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Allocation Policy" -target "http://lacnic.net/en/chapter-4-en.pdf" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Afrika: -\begin_inset CommandInset href -LatexCommand href -name "AfriNIC" -target "http://www.afrinic.org/" - -\end_inset - - -\end_layout - -\begin_layout Standard -Es existiert auch eine Liste der größten Zuteilungen sortiert nach lokalen - Registrierungsstellen: -\begin_inset CommandInset href -LatexCommand href -name "Ripe NCC / IPv6 allocations" -target "http://www.ripe.net/ripencc/mem-services/registration/ipv6/ipv6allocs.html" - -\end_inset - -. -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-joinipv6-tunnelbrokers" - -\end_inset - -Tunnel-Broker -\end_layout - -\begin_layout Standard -Anmerkung: Eine Tunnel-Broker Liste ist im Abschnitt -\begin_inset CommandInset ref -LatexCommand ref -name "Tunnel broker" -reference "information-Tunnelbroker" - -\end_inset - - weiter unten zu finden. - -\end_layout - -\begin_layout Itemize -Former IPng. - Tunnelbroker and IPv6 resources, now migrated to the -\begin_inset CommandInset href -LatexCommand href -name "SixXs System" -target "http://www.sixxs.net/main/" - -\end_inset - -. -\end_layout - -\begin_layout Itemize -Eckes -\begin_inset CommandInset href -LatexCommand href -name "IPv6-with-Linux" -target "http://sites.inka.de/lina/linux/ipv6.html" - -\end_inset - - Seite. -\end_layout - -\begin_layout Itemize -tunnelc - ein Perl basiertes Tunnel Client Script: -\begin_inset Newline newline -\end_inset - -freshmeat.net: -\begin_inset CommandInset href -LatexCommand href -name "Project details for tunnel client" -target "http://freshmeat.net/projects/tunnelc" - -\end_inset - - -\begin_inset Newline newline -\end_inset - -SourceForge: -\begin_inset CommandInset href -LatexCommand href -name "Project Info - tunnelc" -target "http://sourceforge.net/projects/tunnelc" - -\end_inset - - (also -\begin_inset CommandInset href -LatexCommand href -name "here" -target "http://tunnelc.sourceforge.net/" - -\end_inset - -) -\end_layout - -\begin_layout Itemize -Linux Advanced Routing & Traffic Control HOWTO, -\begin_inset CommandInset href -LatexCommand href -name "Chapter 6: IPv6 tunneling with Cisco and/or 6bone" -target "http://howtos.linuxbroker.com/howtoreader.shtml?file=Adv-Routing-HOWTO.html#LARTC.TUNNEL-IPV6.ADDRESSING" - -\end_inset - -. -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-joinipv6-6to4-tunneling" - -\end_inset - -6to4 -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "NSayer's 6to4 information" -target "http://www.kfu.com/~nsayer/6to4/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "RFC 3068 / An Anycast Prefix for 6to4 Relay Routers" -target "http://www.faqs.org/rfcs/rfc3068.html" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection - -\lang english -\begin_inset CommandInset label -LatexCommand label -name "information-joinipv6-isatap-tunneling" - -\end_inset - -ISATAP -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "ISATAP (Intra-Site Automatic Tunnel Access Protocol) Information" -target "http://www.join.uni-muenster.de/Dokumente/Howtos/Howto_ISATAP.php?lang=en" - -\end_inset - - by -\begin_inset CommandInset href -LatexCommand href -name "JOIN" -target "http://www.join.uni-muenster.de/" - -\end_inset - - -\end_layout - -\begin_layout Subsection -Neueste Nachrichten und URLs zu anderen Dokumenten -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "Viele URLs zu anderen Dokumenten" -target "http://www.estoile.com/links/ipv6" - -\end_inset - - von Anil Edathara -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "go6 - The IPv6 Portal" -target "http://www.go6.net/" - -\end_inset - -: ein IPv6 Online-Portal mit einem WIKI-basierenden IPv6-Know-How-Schwerpunkt, - einem IPv6-Diskussionsforum, einer aktuellen Sammlung von IPv6-Events und - Nachrichten, freiem IPv6-Zugang und Services, IPv6 Software-Applikationen - und viel mehr -\end_layout - -\begin_layout Subsection -Protokoll-Informationen -\end_layout - -\begin_layout Subsubsection -IPv6 bezogene Request For Comments (RFCs) -\end_layout - -\begin_layout Standard -Das veröffentlichen einer Liste mit IPv6 relevanter RFCs geht über den Rahmen - dieses Dokumentes hinaus, unter folgenden Links können Sie jedenfalls diverse - Listen finden: -\end_layout - -\begin_layout Itemize -sortierte Liste: -\begin_inset CommandInset href -LatexCommand href -name "IPng Standardization Status" -target "http://playground.sun.com/pub/ipng/html/specs/standards.html" - -\end_inset - - oder -\begin_inset CommandInset href -LatexCommand href -name "IPng Current Specifications" -target "http://playground.sun.com/pub/ipng/html/specs/specifications.html" - -\end_inset - - von Robert Hinden -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Related Specifications" -target "http://www.ipv6.org/specs.html" - -\end_inset - - auf IPv6.org -\end_layout - -\begin_layout Subsubsection -Aktuelle Entwürfe diverser Arbeitsgruppen -\end_layout - -\begin_layout Standard -Aktuelle (auch) IPv6-bezogene Drafts finden Sie hier: -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IP Version 6 (ipv6)" -target "http://www.ietf.org/ids.by.wg/ipv6.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Next Generation Transition (ngtrans)" -target "http://www.ietf.org/ids.by.wg/ngtrans.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Dynamic Host Configuration (dhc)" -target "http://www.ietf.org/ids.by.wg/dhc.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Domain Name System Extension (dnsext)" -target "http://www.ietf.org/ids.by.wg/dnsext.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Operations (v6ops)" -target "http://www.ietf.org/ids.by.wg/v6ops.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Mobile IP (mobileip)" -target "http://www.ietf.org/ids.by.wg/mobileip.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Get any information about IPv6, from overviews, through RFCs & drafts, to implementations" -target "http://playground.sun.com/pub/ipng/html/ipng-main.html" - -\end_inset - - (inklusive Verfügbarkeit der Stacks auf verschiedenen Plattformen & Quellcode - diverser IPv6 Stacks) -\end_layout - -\begin_layout Subsubsection -Sonstige -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "SWITCH IPv6 Pilot / References" -target "http://www.switch.ch/lan/ipv6/references.html" - -\end_inset - -, umfangreiche Liste mit IPv6 Quellen betreut von Simon Leinen -\end_layout - -\begin_layout Subsection -Weitere Informationen -\end_layout - -\begin_layout Standard -\begin_inset CommandInset href -LatexCommand href -name "DeepSpace6 / Weitere interessante Links" -target "http://www.deepspace6.net/sections/links.html" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Linux Informationen -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "DeepSpace6 / (Not only) Linux IPv6 Portal" -target "http://www.deepspace6.net/" - -\end_inset - - - Italien -\lang english -( -\begin_inset CommandInset href -LatexCommand href -name "Spiegel" -target "http://mirrors.bieringer.de/www.deepspace6.net/" - -\end_inset - -) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6-HowTo for Linux by Peter Bieringer" -target "http://www.bieringer.de/linux/IPv6/" - -\end_inset - - - Deutschland, und sein -\begin_inset CommandInset href -LatexCommand href -name "Bieringer / IPv6 - software archive" -target "ftp://ftp.bieringer.de/pub/linux/IPv6/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Linux+IPv6 status by Peter Bieringer" -target "http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status.html" - -\end_inset - - - Deutschland -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "DeepSpace6 / IPv6 Status Page" -target "http://www.deepspace6.net/docs/ipv6_status_page_apps.html" - -\end_inset - - - Italien ( -\begin_inset CommandInset href -LatexCommand href -name "Spiegel" -target "http://mirrors.bieringer.de/www.deepspace6.net/docs/ipv6_status_page_apps.html" - -\end_inset - -) (ersetzt das oben genannte in Zukunft) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "USAGI project" -target "http://www.linux-ipv6.org/" - -\end_inset - - - Japan, und deren -\begin_inset CommandInset href -LatexCommand href -name "USAGI project - software archive" -target "ftp://ftp.linux-ipv6.org/pub/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "Linux Optimized Link State Routing Protocol (OLSR) IPv6 HOWTO" -target "http://www.tldp.org/HOWTO/OLSR-IPv6-HOWTO/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "LinShim6" -target "http://inl.info.ucl.ac.be/LinShim6/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Informationen zu Linux-Distributionen -\end_layout - -\begin_layout Description -PLD -\begin_inset CommandInset href -LatexCommand href -name "PLD Linux Distribution" -target "http://www.pld-linux.org/" - -\end_inset - - ( -\begin_inset Quotes sld -\end_inset - -Marktführer -\begin_inset Quotes srd -\end_inset - - bei inkludierten IPv6 fähigen Paketen)) -\end_layout - -\begin_layout Description -Red -\begin_inset space ~ -\end_inset - -Hat -\begin_inset CommandInset href -LatexCommand href -name "Red Hat Enterprise Linux" -target "http://www.redhat.com/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name " Pekka Savola's IPv6 packages (historisch)" -target "http://www.netcore.fi/pekkas/linux/ipv6/" - -\end_inset - - -\end_layout - -\begin_layout Description -Fedora -\begin_inset CommandInset href -LatexCommand href -name "Fedora (Project) Linux" -target "https://fedoraproject.org/" - -\end_inset - - -\end_layout - -\begin_layout Description -Debian -\begin_inset CommandInset href -LatexCommand href -name "Debian Linux" -target "http://www.debian.org/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "IPv6 with Debian Linux" -target "http://ipv6.debian.net/" - -\end_inset - - -\end_layout - -\begin_layout Description -SuSE -\begin_inset CommandInset href -LatexCommand href -name "SuSE Linux" -target "https://www.suse.com/" - -\end_inset - - -\end_layout - -\begin_layout Description - -\lang english -Mandriva -\begin_inset CommandInset href -LatexCommand href -name "Mandriva (historisch)" -target "http://wiht.link/mandrivalinux" - -\end_inset - - -\end_layout - -\begin_layout Standard -Weitere Details siehe unter -\begin_inset CommandInset href -LatexCommand href -name "IPv6+Linux Status Distributions" -target "http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status-distributions.html" - -\end_inset - -. -\end_layout - -\begin_layout Subsubsection -Allgemeine Informationen -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6.org" -target "http://www.ipv6.org/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "6bone" -target "http://www.6bone.net/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "WIDE project" -target "http://www.v6.wide.ad.jp/" - -\end_inset - - - Japan -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "SWITCH IPv6 Pilot" -target "http://www.switch.ch/lan/ipv6/" - -\end_inset - - - Schweiz -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Corner of Hubert Feyrer" -target "http://www.feyrer.de/IPv6/" - -\end_inset - - - Deutschland -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Forum" -target "http://www.ipv6forum.com/" - -\end_inset - - - ein weltweites Konsortium führender Internet-Hersteller, Forschungs- - & Bildungseinrichtungen... - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Playground.sun.com / IPv6 Info Page" -target "http://playground.sun.com/pub/ipng/html/ipng-main.html" - -\end_inset - - - betreut von Robert Hinden, Nokia. - Hier gibt es jede Information zum Thema IPv6: Zusammenfassungen, RFCs & - Drafts, Implementierungen (Verfügbarkeit der Stacks auf verschiedenen Plattform -en & Quellcode diverser IPv6 Stacks). - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "6INIT" -target "http://www.6init.com/" - -\end_inset - - - IPv6 Internet Initiative - ein Fifth Framework Projekt der EU im Rahmen - des IST Programmes. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Task Force (European Union)" -target "http://www.ipv6-taskforce.org/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "6init" -target "http://www.6init.org/" - -\end_inset - - - IPv6 INternet IniTiative -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6: The New Version of the Internet Protocol" -target "http://www.usenix.org/publications/library/proceedings/ana97/summaries/deering.html" - -\end_inset - -, von Steve Deering. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6: The Next Generation Internet Protocol" -target "http://www.garykessler.net/library/ipv6_exp.html" - -\end_inset - -, von Gary C. - Kessler. - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6: Next Generation Internet Protocol" -target "http://www.3com.com/nsc/ipv6.html" - -\end_inset - - - 3Com -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "internet || site" -target "http://www.internet2.org/" - -\end_inset - - und -\begin_inset CommandInset href -LatexCommand href -name "internet2 Working Group" -target "http://ipv6.internet2.edu/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -NetworkWorldFusion: Search / Doc Finder: -\begin_inset CommandInset href -LatexCommand href -name "searched for IPv6" -target "http://search.nwfusion.com/query.html?qt=IPv6&qp=&ch=cn&" - -\end_inset - - (102 Dokumente gefunden - 22.12.2002) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "The Register" -target "http://www.theregister.co.uk/" - -\end_inset - - (Suche nach IPv6 ergab 30 Dokumente, 22.12.2002) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "ZDNet Search for IPv6" -target "http://zdnet.search.com/search?cat=279&q=IPv6" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "TechTarget Search for IPv6" -target "http://whatis.techtarget.com/wsearchResults/1,290214,sid9,00.html?query=IPv6" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 & TCP Resources List" -target "http://www.faqs.org/faqs/internet/tcp-ip/resource-list/index.html" - -\end_inset - - -\end_layout - -\begin_layout Standard -Fehlt etwas? Vorschläge sind Willkommen! -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-marketresearch" - -\end_inset - -Marktforschung -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "statista - The Statistics Portal" -target "http://www.statista.com/search/internet+america/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Market Research" -target "http://www.marketresearch.com/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-patents" - -\end_inset - -Patente -\end_layout - -\begin_layout Itemize -Delphion Research: -\begin_inset CommandInset href -LatexCommand href -name "Patent Search Page" -target "http://www.delphion.com/research/" - -\end_inset - -. - Basic (kostenlose) Registrierung ist notwendig. - Beispiele für die Suche nach IPv6 (vom 21.12.2002): -\begin_inset Newline newline -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name "Communicating method between IPv4 terminal and IPv6 terminal and IPv4-IPv6 converting apparatus" -target "http://www.delphion.com/details?pn=US06118784__" - -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name "Translator for IP networks, network system using the translator, and IP network coupling method therefor" -target "http://www.delphion.com/details?pn=US06038233__" - -\end_inset - - -\end_layout - -\begin_layout Subsection -Sortiert nach Ländern -\end_layout - -\begin_layout Subsubsection - -\lang english -Europa -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "www.ist-ipv6.org" -target "http://www.ist-ipv6.org/" - -\end_inset - -: IST IPv6 Cluster, European IPv6 Research and Development Projects -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "Euro6IX" -target "http://www.euro6ix.org/" - -\end_inset - -: European IPv6 Internet Exchanges Backbone -\end_layout - -\begin_layout Subsubsection -Australien -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Carl's Australian IPv6 Pages" -target "http://oversteer.bl.echidna.id.au/IPv6/" - -\end_inset - - (alter Inhalt) -\end_layout - -\begin_layout Subsubsection -Belgien -\end_layout - -\begin_layout Standard -Vorschläge sind Willkommen! -\end_layout - -\begin_layout Subsubsection -Brasilien -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "IPv6 do Brasil" -target "http://www.ipv6dobrasil.com.br/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -China -\end_layout - -\begin_layout Standard -Vorschläge sind Willkommen! -\end_layout - -\begin_layout Subsubsection -Deutschland -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "OpenBC / IPv6" -target "https://www.xing.com/net/ipv6/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Frankreich -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Renater" -target "http://www.renater.fr/Projets/IPv6/index.htm" - -\end_inset - -: Renater IPv6 Projekt Seite -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "IPv6 - RSVP - ATM at INRIA" -target "http://www.inria.fr/recherche/equipes/ipv6.fr.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "NetBSD IPv6 Dokumentation" -target "http://www.netbsd.org/fr/Documentation/network/ipv6/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Großbritannien -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "British Telecom IPv6 Home" -target "http://www.bt.com/ipv6/" - -\end_inset - -: BT's ISP IPv6 Versuch, Englands erster IPv6 Internet Exchange etc. -\end_layout - -\begin_layout Subsubsection -Indien -\end_layout - -\begin_layout Standard -Vorschläge sind willkommen! -\end_layout - -\begin_layout Subsubsection -Italien -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Project6" -target "http://project6.ferrara.linux.it/" - -\end_inset - -: IPv6 mit Linux -\end_layout - -\begin_layout Subsubsection -Japan -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Yamaha IPv6" -target "http://www.rtpro.yamaha.co.jp/RT/ipv6/" - -\end_inset - - (sorry, alles in japanischer Sprache ...) -\end_layout - -\begin_layout Subsubsection -Korea -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "ETRI" -target "http://www.krv6.net/" - -\end_inset - -: Electronics and Telecommunications Research Institut -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Forum Korea" -target "http://www.ipv6.or.kr/english/index.new.htm" - -\end_inset - -: IPv6 Infrastruktur Projekt in Korea -\end_layout - -\begin_layout Subsubsection -Mexiko -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Mexico" -target "http://www.ipv6.unam.mx/" - -\end_inset - - (spanische & englische Version) - IPv6 Projekt Homepage der National Autonomous - University of Mexico (UNAM) -\end_layout - -\begin_layout Subsubsection -Niederlande -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "SURFnet" -target "http://www.ipv6.surfnet.nl/" - -\end_inset - -: SURFnet IPv6 Backbone -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "STACK" -target "http://www.stack.nl/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "STACK (IPv6)" -target "http://www.stack.nl/ipv6/" - -\end_inset - -: Computer-Studendten-Verband der Eindhoven University of Technology, Niederland -e. - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPng.nl" -target "http://www.ipng.nl/" - -\end_inset - -: Zusammenarbeit zwischen WiseGuys und Intouch. -\end_layout - -\begin_layout Subsubsection -Österreich -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6@IKNnet and MIPv6 Research Group" -target "http://www.ikn.tuwien.ac.at/~ipv6/" - -\end_inset - -: TU Vienna, Austria (IPv6: Projekte, Publikationen, Diplom- / Doktorarbeiten, - Konferenzunterlagen etc.) -\end_layout - -\begin_layout Subsubsection -Portugal -\end_layout - -\begin_layout Standard -Vorschläge sind willkommen! -\end_layout - -\begin_layout Subsubsection -Russland -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Forum for Russia" -target "http://www.ipv6.ru/" - -\end_inset - -: Yaroslavl State University Internet Center -\end_layout - -\begin_layout Subsubsection -Schweiz -\end_layout - -\begin_layout Standard -Vorschläge sind willkommen! -\end_layout - -\begin_layout Subsection -Sortiert nach Betriebssystemen -\end_layout - -\begin_layout Subsubsection -*BSD -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "KAME project" -target "http://www.kame.net/" - -\end_inset - - (*BSD) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "NetBSD's IPv6 Networking FAQ" -target "http://www.netbsd.org/Documentation/network/ipv6/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "FreeBSD Ports: Ipv6" -target "http://www.freebsd.org/ports/ipv6.html" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Cisco IOS -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Cisco IOS IPv6 Entry Page" -target "http://www.cisco.com/warp/public/732/Tech/ipv6/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 for Cisco IOS Software" -target "http://www.cisco.com/univercd/cc/td/doc/product/software/ios122/122newft/122t/122t2/ipv6/ftipv6c.htm" - -\end_inset - -, Datei 2 von 3: Aug 2002 -- Inhalt: IPv6 for Cisco IOS Software; Configuring - Documentation Specifics; Enabling IPv6 Routing and Configuring; IPv6 Addressing -; Enabling IPv6 Processing Globally. -\end_layout - -\begin_layout Itemize -Cisco Internet Networking Handbook, -\begin_inset CommandInset href -LatexCommand href -name "Chapter IPv6" -target "http://www.cisco.com/univercd/cc/td/doc/cisintwk/ito_doc/ipv6.htm" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -HPUX -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "comp.sys.hp.hpux FAQ" -target "http://www.faqs.org/faqs/hp/hpux-faq/index.html" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -IBM -\end_layout - -\begin_layout Itemize -Now that IBM's announced the availability of z/OS V1.4, -\begin_inset CommandInset href -LatexCommand href -name "what's new in this release?" -target "http://search390.techtarget.com/ateQuestionNResponse/0,289625,sid10_cid486367_tax292523,00.html" - -\end_inset - - Die Frage wurde am 15. - August 2002 'geposted'. -\end_layout - -\begin_layout Subsubsection -Microsoft -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Microsoft Windows 2000 IPv6" -target "http://www.microsoft.com/windows2000/technologies/communications/ipv6/default.asp" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "MSRIPv6" -target "http://www.research.microsoft.com/msripv6" - -\end_inset - - - Microsoft Research Network - IPv6 Homepage -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Internet Connection Firewall Does Not Block Internet Protocol Version 6 Traffic" -target "http://support.microsoft.com/default.aspx?scid=kb;en-us;306203" - -\end_inset - - (6.11.2001) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Internet Protocol Numbers" -target "http://support.microsoft.com/default.aspx?scid=kb;en-us;289892" - -\end_inset - - (8.10.2002) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Technology Preview Refresh" -target "http://support.microsoft.com/default.aspx?scid=kb;en-us;273826" - -\end_inset - - (16.10.2002) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "HOW TO: Install and Configure IP Version 6 in Windows .NET Enterprise Server" -target "http://support.microsoft.com/default.aspx?scid=kb;en-us;325449" - -\end_inset - - (26.10.2002) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Windows .NET Server 6to4 Router Service Quits When You Advertise a 2002 Address on the Public Interface" -target "http://support.microsoft.com/default.aspx?scid=kb;en-us;329984" - -\end_inset - - (28.10.2002) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "msdn - Microsoft Windows CE .NET - IPv6 commands" -target "http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcetcpip/htm/cmconIPv6exe.asp" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Solaris -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "Sun Microsystems Solaris" -target "http://www.sun.com/software/solaris/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Solaris 2 Frequently Asked Questions (FAQ) 1.73" -target "http://www.cs.uu.nl/wais/html/na-dir/Solaris2/FAQ.html" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Sumitoma -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Sumitomo Electric has implemented IPv6 on Suminet 3700 family routers" -target "http://playground.sun.com/pub/ipng/html/ipng-implementations.html#Sumitomo" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -ZebOS -\end_layout - -\begin_layout Itemize -IpInfusion's -\begin_inset CommandInset href -LatexCommand href -name "ZebOS Server Routing Software" -target "http://www.ipinfusion.com/products/server/products_server.html" - -\end_inset - - -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "information-ipv6andsecurity" - -\end_inset - -IPv6 Sicherheit -\end_layout - -\begin_layout Itemize -Internet Security Systems: Security Center, -\begin_inset CommandInset href -LatexCommand href -name "X-Force Database Search" -target "http://www.iss.net/security_center/search.php?type=3&type=3&pattern=IPv6" - -\end_inset - - (21.12.2002 - 6 Themen bez. - IPv6 gefunden) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "NIST IPsec Project" -target "http://csrc.nist.gov/ipsec/" - -\end_inset - - ( National Institute of Standards and Technology, NIST) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Information Security" -target "http://www.infosecuritymag.com/index.shtml" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "NewOrder.box.sk (search for IPv6)" -target "http://neworder.box.sk/search.php3?srch=IPv6" - -\end_inset - - (Artikel, Exploits, Datei-Datenbank etc.) -\end_layout - -\begin_layout Subsection -Programm-Listen -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "DeepSpace6 / IPv6 Status Page" -target "http://www.deepspace6.net/docs/ipv6_status_page_apps.html" - -\end_inset - - ( -\begin_inset CommandInset href -LatexCommand href -name "Mirror" -target "http://mirrors.bieringer.de/www.deepspace6.net/docs/ipv6_status_page_apps.html" - -\end_inset - -) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6.org / IPv6 enabled applications" -target "http://www.ipv6.org/v6-apps.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Freshmeat / IPv6 search" -target "http://freshmeat.net/search/?q=IPv6" - -\end_inset - -, aktuell (14 Dez. - 2002) 62 Projekte -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Forum / Web Links" -target "http://www.ipv6forum.com/modules.php?op=modload&name=Web_Links&file=index" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Analyse-Werkzeuge -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "Wireshark" -target "http://www.wireshark.org/" - -\end_inset - - -\lang ngerman - (ehemals -\emph on -Ethereal -\emph default -) is ein kostenloser Netzwerkprotokoll-Analyseprogramm für Unix und Windows - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Radcom RC100-WL" -target "http://www.ip6.com/us/analyzer.htm" - -\end_inset - - - Download Radcom RC100-WL Protokollanalyseprogramm version 3.20 -\end_layout - -\begin_layout Subsubsection -IPv6 Produkte -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "6wind" -target "http://www.6wind.com/" - -\end_inset - - - Lösungen für IPv4/IPv6 Router, QoS, Multicast, Mobility, Security/VPN/Firewal -l. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Fefe's patches for IPv6 with djbdns" -target "http://www.fefe.de/dns/" - -\end_inset - - - Aug 2002 - Was ist djbdns und warum es IPv6 benötigt? djbdns ist ein - vollwertiger DNS Server, welcher -\begin_inset Quotes sld -\end_inset - -outperforms BIND in nearly all respects -\begin_inset Quotes srd -\end_inset - -. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "ZebOS Server Routing Suite " -target "http://www.ipinfusion.com/products/server/products_server.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Inframail (Advantage Server Edition)" -target "http://download.cnet.com/Inframail-Advantage-Server-Edition/3000-10248_4-8202652.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "HTTrack Website Copier" -target "http://download.cnet.com/HTTrack-Website-Copier/3000-2377_4-10149393.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "CommView" -target "http://download.cnet.com/CommView/3000-2085_4-10132748.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Posadis" -target "http://download.cnet.com/Posadis/3000-2155_4-10149750.html" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-snmp" - -\end_inset - -SNMP -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "comp.protocpols.snmp SNMP FAQ Part 1 of 2" -target "http://www.cs.uu.nl/wais/html/na-dir/snmp-faq/part1.html" - -\end_inset - - -\end_layout - -\begin_layout Section -IPv6 Infrastruktur -\end_layout - -\begin_layout Subsection -Statistiken -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 routing table history" -target "http://www.space.net/~gert/RIPE/" - -\end_inset - - erstellt von Gert Döring, -\begin_inset CommandInset href -LatexCommand href -name "Space.Net" -target "http://www.space.net/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Official 6bone Webserver list Statisic" -target "http://6bone.informatik.uni-leipzig.de/ipv6/stats/stats.php3" - -\end_inset - - -\end_layout - -\begin_layout Subsection -Internet Exchanges -\end_layout - -\begin_layout Standard -Eine weitere Liste von IPv6 Internet Exchanges gibt es unter: -\lang english - -\begin_inset CommandInset href -LatexCommand href -name "IPv6 status of IXPs in Europe" -target "http://www.euro-ix.net/isp/choosing/search/matrix.php" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-ipv6exchanges-germany" - -\end_inset - -Deutschland -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "INXS" -target "http://www.inxs.de/" - -\end_inset - -: (Cable & Wireless) München und Hamburg -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-ipv6exchanges-estonia" - -\end_inset - -Estlanda -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "TIX" -target "http://tix.estpak.ee/" - -\end_inset - - (Tallinn Interneti eXchange mit IPv6 Support) -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-ipv6exchanges-europe" - -\end_inset - -Europa -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Euro6IX" -target "http://www.euro6ix.net/" - -\end_inset - -, European IPv6 Internet Exchange Backbone -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-ipv6exchanges-france" - -\end_inset - -Frankreich -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "French National Internet Exchange IPv6" -target "http://www.fnix6.net/" - -\end_inset - - (seit 1.11.2002 aktiv). -\begin_inset Newline newline -\end_inset - -FNIX6 bietet ISPs im Großraum Paris den Dienst eines kostenlosen und zuverlässli -chen High Speed FastEthernet Internet Exchange. -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-ipv6exchanges-uk" - -\end_inset - -Großbritannien -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "UK6X" -target "http://www.uk6x.com/" - -\end_inset - -: London -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "XchangePoint" -target "http://www.xchangepoint.net/" - -\end_inset - -: London -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-ipv6exchanges-japan" - -\end_inset - -Japan -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "NSPIXP-6" -target "http://www.wide.ad.jp/nspixp6/" - -\end_inset - -: IPv6--basierter Internet Exchange in Tokio -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "JPIX" -target "http://www.jpix.co.jp/" - -\end_inset - -, Tokio -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-ipv6exchanges-korea" - -\end_inset - -Korea -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "6NGIX" -target "http://www.ngix.ne.kr/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-ipv6exchanges-netherlands" - -\end_inset - -Niederlande -\end_layout - -\begin_layout Itemize - -\noun on -\begin_inset CommandInset href -LatexCommand href -name "AMS-IX" -target "http://www.ams-ix.net/" - -\end_inset - - -\noun default -: Amsterdam Internet Exchange -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-ipv6exchanges-usa" - -\end_inset - -USA -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "6TAP" -target "http://www.6tap.net/" - -\end_inset - -: Chicago. - Bietet weltweit Peerings an. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "PAIX" -target "http://www.paix.net/" - -\end_inset - -: Palo Alto -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "information-Tunnelbroker" - -\end_inset - -Tunnel broker -\end_layout - -\begin_layout Standard - -\lang english -Auch interessant: -\begin_inset CommandInset href -LatexCommand href -name "http://www.deepspace6.net/docs/tunnelbrokers.html" -target "http://www.deepspace6.net/docs/tunnelbrokers.html" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-belgium" - -\end_inset - -Belgien -\end_layout - -\begin_layout Standard -Fehlt etwas? Vorschläge sind willkommen! -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-canada" - -\end_inset - -Canada -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Freenet6" -target "http://www.freenet6.net/" - -\end_inset - - - /48 Delegation, Canada -\begin_inset Newline newline -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name "Getting IPv6 Using Freenet6 on Debian" -target "http://www.linuxjournal.com/article.php?sid=5963&mode=thread&order=0" - -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name "Freenet6 creater" -target "http://www.viagenie.qc.ca/en/index.shtml" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-china" - -\end_inset - -China -\end_layout - -\begin_layout Standard -Fehlt etwas? Vorschläge sind willkommen! -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-germany" - -\end_inset - -Deutschland -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "6bone Knoten Leipzig" -target "http://6bone.informatik.uni-leipzig.de/" - -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name "Info bez. Hackangriff (2001)" -target "http://www.mail-archive.com/ipv6@uni-muenster.de/msg00056.html" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-estonia" - -\end_inset - -Estlanda -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Estpak" -target "http://tunnelbroker.ipv6.estpak.ee/?tunnel&PHPSESSID=aa2184190cc2cc6d3a6f6ddd01ae3635" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-uk" - -\end_inset - -Großbritannien -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "NTT" -target "http://www.nttv6.net/" - -\end_inset - -, Großbritannien - IPv6 Versuch. - IPv4 Tunnel und native IPv6 Standleitungs-Verbindungen. - POPs gibt es in: London, Düsseldorf, New Jersey (USA, East Coast) Cupertino - (USA, West Coast) Tokio -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-italy" - -\end_inset - -Italien -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Comv6" -target "http://www.comv6.com/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Bersafe" -target "http://www.bersafe.it/" - -\end_inset - - (italienische Sprache) -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-japan" - -\end_inset - -Japan -\end_layout - -\begin_layout Standard -Fehlt etwas? Vorschläge sind willkommen! -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-malaysia" - -\end_inset - -Malaysia -\end_layout - -\begin_layout Standard -Fehlt etwas? Vorschläge sind willkommen! -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-netherlands" - -\end_inset - -Niederlande -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPng Netherland" -target "http://www.ipng.nl/" - -\end_inset - - - Intouch, SurfNet, AMS-IX, UUNet, Cistron, RIPE NCC und AT&T sind am AMS-IX - angeschlossen. - Unter bestimmten Voraussetzungen ist es möglich, einen statischen Tunnel - zu bekommen. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "SURFnet Customers" -target "http://www.ipv6.surfnet.nl/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-norway" - -\end_inset - -Norwegen -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "UNINETT" -target "http://www.uninett.no/testnett/index.en.html" - -\end_inset - - - Pilot IPv6 Service (für Kunden): tunnelbroker & address allocation -\begin_inset Newline newline -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name "Uninett-Autoupdate-HOWTO" -target "http://www.guruz.de/Uninett-Autoupdate-HOWTO" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection - -\lang english -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-spain" - -\end_inset - -Spanien -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "Consulintel" -target "http://tb.consulintel.euro6ix.org/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-switzerland" - -\end_inset - -Schweiz -\end_layout - -\begin_layout Standard -Fehlt etwas? Vorschläge sind willkommen! -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-usa" - -\end_inset - -USA -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "ESnet" -target "http://www.es.net/hypertext/welcome/pr/ipv6.html" - -\end_inset - -, USA - Energy Sciences Network: Tunnel Registry & Address Delegation für - direkt angeschlossene ESnet Sites und ESnet Partner. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Hurricane Electric" -target "http://ipv6tb.he.net/" - -\end_inset - -, US backbone; -\begin_inset Newline newline -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name "Hurrican Electric Tunnelbroker" -target "http://tunnelbroker.net/" - -\end_inset - - (also available under -\begin_inset CommandInset href -LatexCommand href -name "http://tunnelbroker.com/" -target "http://tunnelbroker.com/" - -\end_inset - -) -\begin_inset Newline newline -\end_inset - -Presseaussendung: -\begin_inset CommandInset href -LatexCommand href -name "Hurricane Electric Upgrades IPv6 Tunnel Broker" -target "http://www.he.net/releases/release6.html" - -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name "Tunnel Broker Endpoint Autoupdate" -target "http://ipv6.he.net/tunnelbroker-update.php" - -\end_inset - -, Perl Skript -\end_layout - -\begin_layout Subsubsection - -\lang english -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-singapore" - -\end_inset - -Singapore -\end_layout - -\begin_layout Standard -Fehlt etwas? Vorschläge sind Willkommen! -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-more" - -\end_inset - -Weitere Tunnel broker... -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Public 6to4 relay routers" -target "http://www.kfu.com/~nsayer/6to4/" - -\end_inset - - (MS IIE Boycott!) -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "information-infrastructure-nativeipv6service" - -\end_inset - -Native IPv6 Dienste -\end_layout - -\begin_layout Standard -Anmerkung: Die folgenden Dienste sind meist nur mit einer gültigen IPv6 - Verbbindung erreichbar! -\end_layout - -\begin_layout Subsubsection - -\lang english -\begin_inset CommandInset label -LatexCommand label -name "information-nativeipv6nntp" - -\end_inset - -Net News (NNTP) -\end_layout - -\begin_layout Standard -Fehlt etwas? Vorschläge sind Willkommen! -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-nativeipv6gameserver" - -\end_inset - -Spiele Server -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Quake2" -target "http://www.viagenie.qc.ca/en/ipv6/quake2/ipv6-quake2.shtml" - -\end_inset - - über IPv6 -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-nativeipv6ircserver" - -\end_inset - -IRC Server -\end_layout - -\begin_layout Standard -Fehlt etwas? Vorschläge sind Willkommen! -\end_layout - -\begin_layout Subsubsection -Radiosender, Musik-Streams -\end_layout - -\begin_layout Standard -Fehlt etwas? Vorschläge sind Willkommen! -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-nativeipv6webserver" - -\end_inset - -Web Server -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Peter Bieringer's Home of Linux IPv6 HOWTO " -target "http://www.ipv6.bieringer.de/" - -\end_inset - - -\end_layout - -\begin_layout Standard -Fehlt etwas? Vorschläge sind Willkommen! -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "information-maillists" - -\end_inset - -Mailinglisten -\end_layout - -\begin_layout Standard -Weitere Listen von Mailinglisten sind verfügbar unter: -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "DeepSpace6 / Mailling Lists" -target "http://www.deepspace6.net/sections/lists.html" - -\end_inset - - -\end_layout - -\begin_layout Standard -Die größten Mailinglisten sind in folgender Tabelle zusammengefasst: -\end_layout - -\begin_layout Standard -. -\end_layout - -\begin_layout Standard -\begin_inset Tabular - - - - - - - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\size scriptsize -Schwerpunkt -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\size scriptsize -Request e-mail Adresse -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\size scriptsize -Abonnieren -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\size scriptsize -e-mail Adresse der Mailingliste -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\size scriptsize -Sprache -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\size scriptsize -Zugang via WWW -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\size scriptsize -Linux Kernel Networking inkl. - IPv6 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\lang english -majordomo (at) vger.kernel.org -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\size scriptsize -netdev -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\lang english -netdev (at) vger.kernel.org -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\size scriptsize -Englisch -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "Info" -target "http://vger.kernel.org/vger-lists.html#netdev" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "Archive" -target "http://www.spinics.net/lists/netdev/" - -\end_inset - - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\size scriptsize -Mobile IP(v6) für Linux -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\lang english -Web-based, see URL -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\size scriptsize -mipl -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\lang english -mipl (at) mobile-ipv6.org -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\size scriptsize -Englisch -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "Info" -target "http://www.mobile-ipv6.org/cgi-bin/mailman/listinfo" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "Archive" -target "http://www.mobile-ipv6.org/pipermail/mipl/" - -\end_inset - - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\size scriptsize -Linux IPv6 User & USAGI -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\size scriptsize -usagi-users-ctl (at) linux-ipv6.org -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\size scriptsize -usagi-users (at) linux-ipv6.org -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\size scriptsize -Englisch -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\size scriptsize -\begin_inset CommandInset href -LatexCommand href -name "Info / Search" -target "http://www.linux-ipv6.org/ml/index.html#usagi-users" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "Archive" -target "http://www.linux-ipv6.org/ml/usagi-users/" - -\end_inset - - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\size scriptsize -IPv6 und Debian Linux -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\size scriptsize -Web-based, siehe URL -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\size scriptsize -debian-ipv6 (at) lists.debian.org -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\size scriptsize -Englisch -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\size scriptsize -\begin_inset CommandInset href -LatexCommand href -name "Info/Subscription/Archive" -target "http://lists.debian.org/debian-ipv6/" - -\end_inset - - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\size scriptsize -6bone -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\size scriptsize -majordomo (at) isi.edu -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\size scriptsize -6bone -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\size scriptsize -6bone (at) isi.edu -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\size scriptsize -Englisch -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\size scriptsize -\begin_inset CommandInset href -LatexCommand href -name "Info" -target "http://www.6bone.net/6bone_email.html" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "Archive" -target "http://mailman.isi.edu/pipermail/6bone/" - -\end_inset - - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\size scriptsize -IPv6 User allgemein -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\size scriptsize -majordomo (at) ipv6.org -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\size scriptsize -users -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\size scriptsize -users (at) ipv6.org -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\size scriptsize -Englisch -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\size scriptsize -\begin_inset CommandInset href -LatexCommand href -name "Info" -target "http://www.ipv6.org/mailing-lists.html" - -\end_inset - - -\size default -\lang english -, -\begin_inset CommandInset href -LatexCommand href -name "Archive" -target "http://www.mail-archive.com/users@ipv6.org/" - -\end_inset - - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\size scriptsize -Bugtracking Internet Programme (1) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\size scriptsize -bugtraq-subscribe (at) securityfocus.com -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\size scriptsize -bugtraq (at) securityfocus.com (3) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\size scriptsize -Englisch -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\size scriptsize -\begin_inset CommandInset href -LatexCommand href -name "Info" -target "http://online.securityfocus.com/popups/forums/bugtraq/intro.shtml" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "Archive" -target "http://online.securityfocus.com/archive/1" - -\end_inset - - -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Standard -. -\end_layout - -\begin_layout Standard -(1) sehr empfohlen wenn Sie Server-Programme zur Verfügung stellen. -\end_layout - -\begin_layout Standard -(2) Mailingliste ist moderiert. -\begin_inset Newline newline -\end_inset - - -\end_layout - -\begin_layout Standard -Fehlt etwas? Vorschläge sind Willkommen! -\begin_inset Newline newline -\end_inset - - -\end_layout - -\begin_layout Standard -Via Web sind auch folgende Mailinglisten & Newsgroups verfügbar: -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "student-ipv6 (India)" -target "http://groups.yahoo.com/group/student-ipv6" - -\end_inset - - -\begin_inset Newline newline -\end_inset - -Beschreibung: Dies ist eine Newsgruppe für die 'Student Awareness group - of IPv6' in Indien -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "sun-ipv6-users" -target "http://groups.yahoo.com/group/sun-ipv6-users" - -\end_inset - - -\begin_inset Newline newline -\end_inset - -Beschreibung: Bitte berichten Sie Probleme/Vorschläge in Bezug auf die IPng - Implementation von SUN Microsystems -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6-BITS" -target "http://groups.yahoo.com/group/IPv6-BITS" - -\end_inset - - -\begin_inset Newline newline -\end_inset - -Beschreibung: Diese Liste dient der Koordination des Projekts Vertebrae. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "linux-bangalore-ipv6" -target "http://groups.yahoo.com/group/linux-bangalore-ipv6" - -\end_inset - - -\begin_inset Newline newline -\end_inset - -Beschreibung: Die IPv6 deployment Liste der Bangalore Linux User Group -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "packet-switching" -target "http://groups.yahoo.com/group/packet-switching" - -\end_inset - - -\begin_inset Newline newline -\end_inset - -Beschreibung: Dies Liste behandelt folgende Themen: packet switching theory, - technology, implementation and application in any relevant aspect including - without limitation LAPB, X.25, SDLC, P802.1d, LLC, IP, IPv6, IPX, DECNET, - APPLETALK, FR, PPP, IP Telephony, LAN PBX systems, management protocols - like SNMP, e-mail, network transparent window systems, protocol implementation, - protocol verification, conformance testing and tools used in maintaining - or developing packet switching systems. -\end_layout - -\begin_layout Itemize -de.comm.protocols.tcp-ip -\begin_inset Newline newline -\end_inset - -Beschreibung: Umstellung auf IPv6 -\begin_inset Newline newline -\end_inset - -Quelle: -\begin_inset CommandInset href -LatexCommand href -name "Chartas der Newsgruppen in de.*" -target "http://www.faqs.org/faqs/de-newsgroups/chartas/index.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Google Group: -\begin_inset CommandInset href -LatexCommand href -name "comp.protocols.tcp-ip" -target "http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF8&safe=off&group=comp.protocols.tcp-ip" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Google Group: -\begin_inset CommandInset href -LatexCommand href -name "linux.debian.maint.ipv6" -target "http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF8&safe=off&group=linux.debian.maint.ipv6" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Google Group: -\begin_inset CommandInset href -LatexCommand href -name "microsoft.public.platformsdk.networking.ipv6" -target "http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF8&safe=off&group=microsoft.public.platformsdk.networking.ipv6" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Google Group: -\begin_inset CommandInset href -LatexCommand href -name "fa.openbsd.ipv6" -target "http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF8&safe=off&group=fa.openbsd.ipv6" - -\end_inset - - -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "information-onlinetesttools" - -\end_inset - -Online-Werkzeuge -\end_layout - -\begin_layout Subsection -Test-Werkzeuge -\end_layout - -\begin_layout Itemize -ping, traceroute, tracepath, 6bone registry, DNS: -\begin_inset CommandInset href -LatexCommand href -name "JOIN / Testtools" -target "http://www.join.uni-muenster.de/lab/testtools.html" - -\end_inset - - (nur in deutscher Sprache, sollte aber keine Probleme für nicht Deutsch - sprechende Personen sein) -\end_layout - -\begin_layout Itemize -traceroute6, whois: -\begin_inset CommandInset href -LatexCommand href -name "IPng.nl" -target "http://www.ipng.nl/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -AAAA Lookup Checker -\begin_inset CommandInset href -LatexCommand href -name "http://www.cnri.dit.ie/cgi-bin/check_aaaa.pl" -target "http://www.cnri.dit.ie/cgi-bin/check_aaaa.pl" - -\end_inset - - -\end_layout - -\begin_layout Subsection -Informationsbeschaffung -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "List of worldwide all IPv6-aggregated IP-Blocks" -target "http://www.ripe.net/ripencc/mem-services/registration/ipv6/ipv6allocs.html" - -\end_inset - - -\end_layout - -\begin_layout Subsection -IPv6 Looking Glasses -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "DRENv6 Looking Glass" -target "http://www.v6.dren.net/lg/" - -\end_inset - - -\end_layout - -\begin_layout Subsection - -\lang english -Hilfsapplikationen -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Prefix Calculator" -target "http://www.tdoi.org/prefcalc.php" - -\end_inset - - von -\begin_inset CommandInset href -LatexCommand href -name "TDOI" -target "http://www.tdoi.org/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "DNS record checker" -target "http://www.maths.tcd.ie/cgi-bin/check_dns.pl" - -\end_inset - - -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "information-trainingsandseminars" - -\end_inset - -Trainings, Seminare -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "CIW Internetworking Professional Training CBT CD" -target "http://www.e-trainonline.com/html/ciw_internetworking_profession.html#IPv6" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Training Pages" -target "http://www.trainingpages.com/x/category,kw-1628,.html" - -\end_inset - -, U.K. - - Suche nach IPv6 (8 Kurse, 2006-08-21) -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "Erion IPv6 Training" -target "http://www.erion.co.uk/ipv6.html" - -\end_inset - -. - UK -\end_layout - -\begin_layout Standard -Fehlt etwas? Vorschläge sind willkommen! -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "information-onlinediscovery" - -\end_inset - -'Die Online Entdeckung' ... -\end_layout - -\begin_layout Standard - -\lang english -IPv6: Addressing The Needs Of the Future -\lang ngerman -von Yankee Group (Autor) -\end_layout - -\begin_layout Standard -Listenpreis: -\series bold -$595.00 -\end_layout - -\begin_layout Standard -Edition: e-book (Acrobat Reader) -\end_layout - -\begin_layout Standard -Seiten: -\series bold -3 -\series default - (drei) -\end_layout - -\begin_layout Standard -Hrsg.: MarketResearch.com; ISBN B00006334Y; (1. - November 2001) -\begin_inset Newline newline -\end_inset - - -\end_layout - -\begin_layout Standard - -\series bold -;-) -\series default - Die Auflagenhöhe dieses eBooks wäre doch sehr interessant... -\begin_inset Newline newline -\end_inset - - -\end_layout - -\begin_layout Chapter -Versions-Überblick / Danksagung / Zum Schluss -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "revision-history" - -\end_inset - -Versions-Überblick -\end_layout - -\begin_layout Standard -Die Versionen x.y. - werden im Internet veröffentlicht. -\end_layout - -\begin_layout Standard -Die Versionen x.y.z stellen Zwischenschritte dar, die nur als LyX- und SGML-Datei - im TLDP-CVS veröffentlicht werden. - Dadurch, dass allerdings Deep Space 6 diese SGML-Dateien spiegelt und daraus - öffentliche Versionen generiert, sind diese auch dort und auf den Servern, - die Deep Space 6 spiegeln, verfügbar. -\end_layout - -\begin_layout Subsection -Ausgabe 0.x -\end_layout - -\begin_layout Subsubsection -Englische Sprachversion (Peter Bieringer's Original) -\end_layout - -\begin_layout Standard -Die Historie der Änderungen der englischen Sprachversion finden Sie dort: - -\begin_inset CommandInset href -LatexCommand href -name "TLDP / Linux+IPv6-HOWTO / Revision History" -target "http://www.tldp.org/HOWTO/Linux+IPv6-HOWTO/revision-history.html" - -\end_inset - -. -\end_layout - -\begin_layout Subsubsection -Deutsche Sprachversion -\end_layout - -\begin_layout Description -0.66.de.1 2010-04-20/PB: Sync mit Original -\end_layout - -\begin_layout Description -0.65.de.1 2009-12-13/PB: Sync mit Original -\end_layout - -\begin_layout Description -0.64.de.1 2009-06-11/PB: Sync mit Original -\end_layout - -\begin_layout Description -0.63.de.2 2009-03-13/PB: remove original transator contact address, no longer - responsible for further changes -\end_layout - -\begin_layout Description -0.63.de.1 2009-02-14/PB: Sync mit Original -\end_layout - -\begin_layout Description -0.62.de.1 2008-11-09/PB: Sync mit Original -\end_layout - -\begin_layout Description -0.61.1.de.3 2007-08-25/PB: Fix Typo -\end_layout - -\begin_layout Description -0.61.1.de.2 2007-08-17/PB: Fix Typo -\end_layout - -\begin_layout Description -0.61.1.de.1 2007-11-11/PB: Sync mit Original -\end_layout - -\begin_layout Description -0.61.de.1 2007-10-06/PB: Sync mit Original, kleine Korrekturen -\end_layout - -\begin_layout Description -0.60.de.1 2007-05-31/PB: Sync mit Original (bis auf C-API), kleine Korrekturen -\end_layout - -\begin_layout Description -0.51.de.1 2006-11-08/PB: Sync mit Original -\end_layout - -\begin_layout Description -0.50.2.de.1 2006-10-25/PB: Sync mit Original -\end_layout - -\begin_layout Description -0.50.1.de.1 2006-09-23/PB: Sync mit Original -\end_layout - -\begin_layout Description -0.50.de.1 2006-08-24/PB: Sync mit Original -\end_layout - -\begin_layout Description -0.49.5.de.1 2006-08-23/PB: Sync mit Original -\end_layout - -\begin_layout Description -0.49.4.de.1 2006-08-21/PB: Sync mit Original, Korrektur bei Adresstypen (Übersetzung -sfehler) -\end_layout - -\begin_layout Description -0.49.3.de.1 2006-08-20/PB: Sync mit Original -\end_layout - -\begin_layout Description -0.49.2.de.1 2006-08-20/PB: Sync mit Original -\end_layout - -\begin_layout Description -0.49.1.de.1 2006-06-13/PB: Sync mit Original -\end_layout - -\begin_layout Description -0.49.de.1 2005-10-03/PB: Sync mit Original -\end_layout - -\begin_layout Description -0.48.de.1 2005-01-11/PB: Sync mit Original -\end_layout - -\begin_layout Description -0.47.de.1 2004-08-30/PB: Sync mit Original -\end_layout - -\begin_layout Description -0.46.5.de.1 2004-07-22/PB: Sync mit Original -\end_layout - -\begin_layout Description -0.46.4.de.1 2004-07-19/PB: Sync mit Original und kleine Korrekturen der Übersetzung -\end_layout - -\begin_layout Description -0.46.2.de.1 2004-05-22/PB: Sync mit Original -\end_layout - -\begin_layout Description -0.46.1.de.1 2004-04-18/PB: Sync mit Original -\end_layout - -\begin_layout Description -0.46.de.1 2004-04-04/PB: Sync mit Original (Italienische Übersetzung verfügbar, - Informationen über DHCPv6, kleinere Updates) -\end_layout - -\begin_layout Description -0.45.1.de.1 2004-01-12/PB: Sync mit Original (kleine Erweiterung) -\end_layout - -\begin_layout Description -0.45.de.1 2004-01-11/PB: Sync mit Original (kleine Korrekturen, URL-Korrekturen - und Erweiterungen) -\end_layout - -\begin_layout Description -0.44.2.de.1 2003-10-30/PB: Sync mit Original (kleine Korrektur) -\end_layout - -\begin_layout Description -0.44.de.1 2003-08-15/PB: Sync mit Original (URL-Korrekturen, Tipp bei tcp_wrappers - und Apache2) -\end_layout - -\begin_layout Description -0.43.2.de.2 2003-07-26/PB: Sync mit Original (URL-Korrekturen) -\end_layout - -\begin_layout Description -0.43.2.de.1 2003-06-11/PB: Sync mit Original (URL-Korrekturen) -\end_layout - -\begin_layout Description -0.43.1.de.2 2003-06-11/PB: Typo gefixt -\end_layout - -\begin_layout Description -0.43.1.de.1 2003-06-07/PB: Sync mit Original (Links, IPsec) -\end_layout - -\begin_layout Description -0.43.de.1 2003-06-05/PB: Sync mit Original (SuSe-Linux-Tipps) -\end_layout - -\begin_layout Description -0.41.4.de.1 2003-05-02/PB: Sync mit Original (URL-Korrekturen) -\end_layout - -\begin_layout Description -0.41.3.de.1 2003-04-23/PB: Sync mit Original (URL-Korrektur) -\end_layout - -\begin_layout Description -0.41.1.de.1 2003-03-31/PB: Sync mit Original (URL-Korrektur) -\end_layout - -\begin_layout Description -0.41.de.1 2003-03-22/PB: Angabe der URL dieser Übersetzung -\end_layout - -\begin_layout Description -0.40.2.de.1 2003-02-27/PB: Sync mit Original (URL-Korrektur) -\end_layout - -\begin_layout Description -0.40.1.de.1 2003-02-12/PB: Sync mit Original (Debian-Linux-Konfiguration), Ersetzen - der Info über verfügbare Übersetzungen durch einen Link zum Original. -\end_layout - -\begin_layout Description -0.40.de.1 2003-02-10/PB: Kleine sprachliche Änderungen und paar kleine Verbesserung -en. -\end_layout - -\begin_layout Description -0.39.2.de.1 2003-02-10/GK: Erste öffentliche Version in deutscher Sprache. - Diese Version entspricht inhaltlich der englischen Version 0.39.2. - Der Zusatz de.1 bezeichnet die Revision der deutschen Sprachversion. - Diese Version wurde unter Mandrake Linux 9.0 mit LyX Version 1.2.1 und der - Klasse DocBook book (SGML) erstellt. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "credits" - -\end_inset - -Danksagung -\end_layout - -\begin_layout Standard -Dieser feinen Liste hinzugefügt werden können Sie am schnellsten, indem - Sie mir Bug fixes, Korrekturen und/oder Updates schicken ;-) -\end_layout - -\begin_layout Standard -Wenn Sie eine größere Überarbeitung vornehmen wollen, können Sie dazu die - LyX Datei (siehe -\begin_inset CommandInset ref -LatexCommand ref -name "original source" -reference "general-original-source" - -\end_inset - -) verwenden und mir entsprechende diffs dann zusenden, diffs der SGML-Version - sind hingegen nicht sehr nützlich. -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "major-credits" - -\end_inset - -Primärer Dank... -\end_layout - -\begin_layout Itemize -David Ranch : Er ermutigte mich zum Schreiben - dieses HOWTOs, für seine Anmerkungen zu den ersten englischen Versionen, - für seine Beiträge zu den IPv6 Test-Ergebnissen auf der IPv6-Homepage des - Autors. - Ebenfalls für seine größeren Überarbeitungen und Vorschläge. -\end_layout - -\begin_layout Itemize -Pekka Savola : Für größere Überarbeitungen der - englischen Version, seinen Input und Vorschläge. -\end_layout - -\begin_layout Itemize -Georg Käfer : Für das Aufspüren eines Fehlers bei - der PDF Erstellung (durch LDP Betreuer Greg Ferguson behoben), den Input - betreff deutscher Bücher, einer großen URL-Liste, die Überprüfung aller - Links und vieler weiterer Vorschläge, Korrekturen und Beiträge. -\end_layout - -\begin_layout Subsection -Sonstiger Dank... -\end_layout - -\begin_layout Subsubsection -Verwaltung des Dokuments -\end_layout - -\begin_layout Standard -Als Neuling ein LDP HOWTO zu schreiben (in LyX schreiben sowie SGML konformer - Export zu DocBook) ist nicht so einfach, wie von so manchem behauptet wird. - Es gibt einige sonderbare Fallen... - Nichtsdestoweniger Dank an: -\end_layout - -\begin_layout Itemize -Autoren des -\begin_inset CommandInset href -LatexCommand href -name "LDP Author Guide" -target "http://www.tldp.org/LDP/LDP-Author-Guide/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -B. - Guillon: Für sein -\begin_inset CommandInset href -LatexCommand href -name "DocBook with LyX HOWTO" -target "http://perso.libertysurf.fr/bgu/doc/db4lyx/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "content-related-credits" - -\end_inset - -Inhalt des Dokuments -\end_layout - -\begin_layout Standard -Mein Dank für Fixes und Hinweise ist hier aufgelistet - und die Liste wird - mit der Zeit sicherlich länger werden... -\begin_inset Newline newline -\end_inset - -Bezüglich der englischen Version finden Sie in dieser, hier werden nur diejenige -n, die die deutsche Version betreffen, aufgelistet. -\end_layout - -\begin_layout Itemize -Nico Schottelius, Oliver Kraus, Götz Bauermann: Typo gefunden -\end_layout - -\begin_layout Itemize -Jens Nachtigall: Fehler gefunden -\end_layout - -\begin_layout Section -Zum Schluss -\end_layout - -\begin_layout Standard -Danke für's Lesen. - Hoffentlich ist es von Nutzen! -\end_layout - -\begin_layout Standard -Falls Sie irgendeine Frage haben, abonnieren sie eine entsprechende -\begin_inset CommandInset ref -LatexCommand ref -name "maillist" -reference "information-maillists" - -\end_inset - - und diskutieren Sie ihr Problem unter Angabe möglichst vieler Informationen. -\end_layout - -\end_body -\end_document diff --git a/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.de.pdf b/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.de.pdf deleted file mode 100644 index 239bdafef06093ce4b8bb532d18bdc8be0940e51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 533958 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�Hd#%{NzGm(LS0D08oANJL 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ΝzWt%|2-?Xgi{kSf!8gsm9EGvNHCDl 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

  • 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 z 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]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 k0l~-w*$-$#SisqqM<~;(e-CBu8r9c;(9G-bfW= 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

    >@bX^IEoSLk;`Owls@5PtFi3g%Y4NQKT5@CEm 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%0D98zYY!mTP(}+uWKaLX_FROq6i@` z4=A5N=jRnQJ^pt@j2oa)hr&qv!FC}C3<`0^b~}8!%_k6`Nm9r&136sBy_Y)6%Qou@ zV)@32dc(e~QE%CSN8@z_-VPFS*;!ak(lXHMWTl~6;1n*8mga=B&GJ)E61c&r5)j$yehE8Z7#fJgC2^ySh+V8x zLK1CcDU_YGMc7g$hB|7H*Y4RmfS#eY!d3`GhhGXzk^O{%*`g3dMyIS!No?+CWn4eY z`On;Z2|O&WHJ5)Y$bUXqAI!~{;=|$+bI0~go-JxZW|ZJ(SwpNAd@;U}63i01Ij#M~4!S&WI3$6knofa8kbjxRChUGPYXn`6}g=cI&F6P^Y+ z^lx2(u1C#YnfwyZv#3;rS|*3rn!hle*AzqfxfmbJX;$Lp#ce4#;GMOiaf+;VR^iltyTR5D@Re8sdM>(wd* z=BBbI4MnAHO>rH$D_ww4S<|_$X)W^xa%V~}qcP$e*~{Da1*4{B;GXOKWVC`OR=d(R zoJLPpx2o|1y5q;{0Juh@OB zxKirKRJAv;%&NHighMBrfWH5rT?;@IhX}>B8n&73(xBUQ&yEi_y_2H zfNS~%t@S@v_5I$g*Oi#F%IU6=$`g~RI_91Mxvn~B$B~Aq_n6RwVw8(1XvEcl+uZaj zqgqCi+7EJ;(c0FscMn9|W+{=(8LlLq0T$6;xhj?kfR!!E4AI7s$Mi$%AvcgdI@p=Q8BT9dz#$)Waj3ExPGc6H^`F_ ziJ*yM0n0T(^kGN{Y6r9vHgC9}yhoQUd!ibl9~s=8%$Veq(j-i7f2EQd&?vvrMxaTR zq?gwEqX*~w7a=|mhzGfwd9=5w!J@c_o}(lkS-40HiHnFC{f&ksO5G|AUW7v2S*2l% z_YgOAww|vZ8kZkVJg0Ft&&7w4_ml5w5#5|t7&J)rs0I3HE~aY=xGLbdyIH=sMN1 zWc6k~Py2%w-aBu~l$_iv0@714383~%QH5{uf;ED8O{7yGsxxdl>NWJ}@m%yTI6N=L zSK`EIt_&KmCY51y?&xQ(eW=N|KL!o#<0d+Yor&j>R*J)&y6rw?!sDma*3qIsOA%*C zSj|Ih<^`0$=#RV@5L1n6QCXL1JsN&0+x)547sBC_nJW=%Wz7c$Bqrw}B9J!1>lq^T z$`FlZp1nAyU?Z#DqR!O@yO_GI{#Z{1gyCh&mJYfrm2g2N{`z|g>TbOZWdI%dhonWs zu@$tTzoJ)lUaqszgXtcD%a;q*Pgt&zMKESEoq^(u?Lelr{I+7)C&UG;1@Hv7)%*o$ zpNhTQY!7U8grKb$1=ZPA84W8}xWbmzv?59{{aYeI$M|*p-m1_Hs=$CBfK$6RG{L!V z02vxN93#rsPV%um_vS@Uifr)!C#MgHS@N=3U*@#`e)nrO+Rn#bBFjNl4uW`Sq%R-q zvCZ>mnoT9)E%&YDITj=O23h(uuf-aqSOITAxPRMi?z|+hb10wz-X>FE6KHRD;|n>b z5qz>owgd<&A6k{|H1V>n4bH`3>%Ip84=&N(r!md=2pRG=gZ9bxpAvw^;geFj127?U zxEea(jpbGUz0gPCPr+p)8vphkt|5c*jSww3Ugi8Z#ST*m6>^ZEol$3qr6(6ZVna|sxD zxN3KNOVP!4jd-1A3DZi5(?g`O?wBA3`|?3{(P@Ag^6lS&V-?gqh^v%DX~1<`&jZ7=sH_;4x|pT+-s(NTYD23zE!!)j2cHN27zz0=>}$ zo_aXDdCVD~HaQIO7i7v`Xo;R2k;F7gFn}lsQ=PEzv@_omLpoI#t;QeVud-DqbvD05 z^MkTupia#>1tnBZr>Va7|KVZ!QJTGDUwv-X-2+N^0vFaA!d@z%&vYX_K^AqGq>7uR zPKAAJ)T*=%CKi`oD7TS~GuRA<6xke>T(t2U zP8-bNx<)p2wqM+mUdHDe7i8S)B)cY{+2RnVr2cQHn&h zF;(q!;#`Wwb<))dN~t)iLuE≧_^>4KtqiDMQT*y7T&zrFN}iFl&j% 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%0DqlUQ%HlN$d!prfB1LmSmtgfyQLct;kUB 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�o^lm|Nnmb&1aUwJDBdP z!I%H4?KE#NSG=Olrp^B5_APkN@aUgSIz}qJ>>KR!I|rG3*^4$y;T=4_PPOuP+o}I< z+4{;d`|oz}^c(Mf*m2mgKRLoT`_Z3mmf-ACP_SICRde?Q^V)63?umk<7t6r^H6VNno}l#5H{zAEYe0lBxf AaR2}S diff --git a/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.de.sgml b/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.de.sgml deleted file mode 100644 index 71a5858b..00000000 --- a/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.de.sgml +++ /dev/null @@ -1,3450 +0,0 @@ - - - - - - ]> - - - - -Linux IPv6 HOWTO (de) -PeterBieringer

    pb at bieringer dot de
    - - 0.67.de.1wip 2015-08-18 PB - 0.66.de.1 2014-05-15 PB - 0.65.de.1 2009-12-13 PB - 0.64.de.1 2009-06-11 PB - 0.61.de.1 2007-10-06 PB - -Das Ziel des Linux IPv6 HOWTO ist die Beantwortung von Basis- und Experten-Fragen zum Thema IPv6 mit Linux-Betriebssystemen. Dieses HOWTO will dem Leser genug Informationen bereitstellen, um IPv6-Anwendungen auf Linux Computer installieren, konfigurieren und anwenden zu können. Zwischen-Versionen sind auf mirrors.bieringer.de oder mirrors.deepspace6.net verfügbar. Änderungen sind in der Revisionshistorie aufgelistet. - -<!-- anchor id="chapter-general" -->Allgemein -Informationen über verfügbare Übersetzungen finden Sie im Abschnitt Übersetzungen. -<!-- anchor id="general-copright" -->Copyright, Lizenz und anderes - -Copyright -Verfasst von und urheberrechtlich geschützt durch Peter Bieringer © 2001-2014. - -Deutsche Übersetzung: -Verfasst von und urheberrechtlich geschützt durch Georg Käfer © 2002-2003, weitergeführt von Peter Bieringer © 2004-2014. -Lizenz -Dieses Linux IPv6 HOWTO wird unter der GNU GPL Version 2 herausgegeben: - -Dieses Linux IPv6 HOWTO ist ein Handbuch zur Anwendung und Konfiguration von IPv6 auf Linux-Systemen. - -Copyright © 2001-2014 Peter Bieringer -Deutsche Übersetzung Copyright © 2002-2003 Georg Käfer, weitergeführt von Peter Bieringer © 2004-2013. - -Diese Dokumentation ist freie Software; Sie können diese unter den Bedingungen der GNU General Public License, wie von der Free Software Foundation publiziert, entweder unter Version 2 oder optional jede höhere Version redistribuieren und/oder modifizieren. -Dieses Programm wird in der Hoffnung verteilt, dass es für Sie nutzvoll ist, jedoch OHNE JEDWEDER GEWÄHRLEISTUNG; sogar ohne der implizierten Gewährleistung der MARKTFÄHIGKEIT oder der FÄHIGKEIT ZU EINEM BESONDEREN ZWECK bzw. VORSATZ. Weitere Details finden Sie in der GNU General Public License. -Zusammen mit diesem Dokument sollten Sie eine Kopie der GNU General Public License erhalten haben; Wenn dem nicht so ist, können Sie sich an folgende Adresse wenden: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA. -Über den Autor - -Internet/IPv6 Background des Autors - -1993: In Kontakt mit dem Internet getreten, kennenlernen von konsolenbasierte E-Mail- und News-Client-Programme (z.B.: suchen Sie nach “e91abier” auf groups.google.com, das ist der Autor).1996: Anfrage zur Gestaltung eines IPv6 Kurses inklusive eines Workshops zum Thema Linux Betriebssystem bekommen.1997: Schreiben einer Anleitung, wie man IPv6 auf Linux Systemen installieren, konfigurieren und anwenden kann, genannt IPv6 & Linux - HowTo (siehe unter IPv6 & Linux - HowTo/History).2001: Begonnen, dieses neue Linux IPv6 HOWTO zu schreiben. -Ansprechpartner -Der Autor kann via E-Mail <pb at bieringer dot de> und auch über seine homepage kontaktiert werden. -Der Autor lebt zurzeit in München / Bayern / (Süd-)Deutschland / (Mittel-)Europa / Erde (Festland). -<!-- anchor id="general-category" -->Kategorie -Dieses HOWTO sollte in der Kategorie “Networking/Protocols” aufgelistet werden. -Version, Werdegang und Unerledigtes - -Version -Die aktuelle Versionsnummer finden Sie auf der Titelseite. -Für andere verfügbare Versionen/Übersetzungen siehe auch http://www.bieringer.de/linux/IPv6/. -Werdegang - -Eckpunkte -2001-11-30: Beginn mit der Neukonzeption dieses HOWTOs. -2002-01-02: Viel Inhalt eingearbeitet, erste Version des Kapitels 1 veröffentlicht (Version 0.10). -2002-01-14: Weitere Vervollständigung und Überprüfung des Inhalts, öffentliche Freigabe des kompletten Dokuments (Version 0.14). -2002-08-16: Polnische Übersetzung ist in Arbeit. -2002-10-31: Chinesische Übersetzung ist verfügbar. -2002-11-10: Deutsche Übersetzung ist in Arbeit. -2003-02-10: Deutsche Übersetzung ist verfügbar. -2003-04-09: Französische Übersetzung ist in Arbeit. -2003-05-09: Französische Übersetzung ist verfügbar -2003-10-16: Italienische Übersetzung ist in Arbeit. -2004-03-12: Italienische Übersetzung ist verfügbar -2004-06-18: Griechische Übersetzung ist in Arbeit -2005-07-25: Türkische Übersetzung ist verfügbar -2007-03-28: Portugiesisch-Brasilianische Übersetzung ist in Arbeit -2008-07-30: Spanische Übersetzung ist verfügbar (aber noch nicht abgeschlossen) -2011-05-09: Portugiesisch-Brasilianische Übersetzung ist wieder in Arbeit -Vollständiger Werdegang -Am Ende dieses Dokumentes finden Sie die Historie der Änderungen. -Unerledigtes - -Fehlenden Inhalt ergänzenGrammatik-Überprüfung beenden -<!-- anchor id="general-translations" -->Übersetzungen -Übersetzungen müssen den URL, die Versionsnummer und das Copyright des Originaldokuments enthalten (aber auch die Daten zu ihrer Übersetzung). Bitte übersetzen Sie nicht das Original-Changelog, das wäre nicht sehr sinnvoll. Es sieht aus, als wäre die Änderungsfrequenz dieses Dokumentes überwiegend geringer als einmal pro Monat. Seit Version 0.27 scheint der Hauptteil des vom Autor beigesteuerten Inhaltes geschrieben zu sein. Übersetzungen müssen immer das englische Original als Quelle benutzen. -Diverse Sprachen -Notiz: eine Übersicht mit URLs ist zu finden unter http://www.bieringer.de/linux/IPv6/. -Deutsch -Mit 2002-11-10 wurde von Georg Käfer <gkaefer at gmx dot at> die Deutsche Übersetzung begonnen und am 10.02.2003 erstmals publiziert. Grundlage der Übersetzung ist die CVS-Version 1.53 der Lyx-Datei, aus der das Linux IPv6 HOWTO Version 0.39.2 erstellt wurde. -Mit Sicherheit werden in dieser Übersetzung noch so manche 'Hoppalas' und auch 'grausige' Rechtschreibfehler zu finden sein. Sorry! Ebenfalls fällt es nicht immer leicht, zu entscheiden, ob ein Terminus überhaupt übersetzt werden soll, bzw. ob die Beibehaltung des englischen Originalwortes nicht zielführender wäre... -Neue deutsche Rechtschreibung: es wurde eine konservative Übersetzung angewandt, d.h. nicht alle möglichen Änderungen der Neuen deutschen Rechtschreibung wurden durchgeführt, sondern nur die notwendigen Änderungen. -Die URL für diese deutsche Übersetzung ist: http://mirrors.deepspace6.net/Linux+IPv6-HOWTO-de/ -Andere Sprachen -Informationen über Übersetzungen in andere Sprachen finden Sie hier im Originaldokument: TLDP / Linux+IPv6-HOWTO / Übersetzungen. -Technisches - -<!-- anchor id="general-original-source" -->Originalquelle dieses HOWTOs -Die originale englische Version dieses HOWTOs wurde mit LyX Version 1.6.1 auf einem Fedora 10 Linux System mit SGML-Template (DocBook book) erstellt. Alle Dateien sind unter github / tLDP / LDP / users / Peter-Bieringer verfügbar. -Auch die deutsche Version wurde mit LyX erstellt und befindet sich ebenfalls im angegebenen CVS-Verzeichnis. -Zeilenumbruch in Code-Beispielen -Der Zeilenumbruch wird mit Hilfe eines selbst geschriebenen Tools “lyxcodelinewrapper.pl” erstellt; Sie finden das Skript am CVS unter: TLDP-CVS / users / Peter-Bieringer. -SGML Erzeugung -SGML wird mit Hilfe der Exportfunktion in LyX generiert. -Um korrekten SGML Code zu erstellen, müssen einige Korrekturen gemacht werden. Die entsprechenden Perl Skripts finden Sie unter TLDP-CVS / users / Peter-Bieringer: -Der Export von Lyx-Tabellen erstellt keine korrekten “colspan” Tags. Tool für die Korrektur: “sgmllyxtabletagfix.pl” (behoben seit LyX Version 1.2.0)LyX verwendet manchmal , anstelle der normalen, spezielle Links-/Rechts-Formatierungen für Zitate, die dann auch im generierten HTML Code ausgegeben werden. Einige Browser können das Ergebnis nicht besonders schön darstellen (bekannt sind: Opera TP2 oder Konqueror). Tool für die Korrektur: “sgmllyxquotefix.pl” -Online-Verweise auf die HTML Version dieses HOWTOs (Links / Anchors) - -Hauptindexseite -Im Allgemeinen wird ein Verweis auf die Hauptindexseite empfohlen. -Seitennamen -Da die HTML-Seiten aus einer SGML-Datei erstellt werden, werden einige HTML-Dateinamen ziemlich zufällig gewählt. Manche Seiten sind jedoch in LyX mit Tags gekennzeichnet, woraus statische Namen resultieren. Diese sollten der besseren Referenz wegen zukünftig nicht geändert werden. -Bitte lassen Sie es wissen, wenn Sie glauben, dass ein Tag vergessen wurde. -Vorwort -Einiges vorab: -Wie viele IPv6 & Linux bezogene HOWTOs gibt es? -Inklusive diesem gibt es drei (3) HOWTO-Dokumente. Pardon, wenn das zu viele sind ;-) -Linux Ipv6 FAQ/HOWTO (veraltet) -Das erste IPv6 bezogene Dokument wurde von Eric Osborne geschrieben und heißt Linux IPv6 FAQ/HOWTO (bitte benutzen Sie den Text nur im historischen Kontext). Die neueste Version 3.2.1 wurde am 14.Juli 1997 veröffentlicht. -Bitte um Ihre Mithilfe: Wenn jemand das Erstellungsdatum der Erstversion dieses HOWTOs kennen sollte, senden Sie mir Bitte ein E-Mail (Die Information wird im Abschnitt “Werdegang” eingearbeitet). -IPv6 & Linux - HowTo (gewartet) -Ein zweites Dokument (IPv6 & Linux - HowTo) wurde vom selben Autor (Peter Bieringer) geschrieben und liegt im HTML-Format vor. Begonnen wurde mit dem Schreiben im April 1997 und die erste englische Version wurde im Juni 1997 veröffentlicht. Das Dokument wird weiterhin betreut, es wird aber langsam (jedoch nicht komplett) in das Linux IPv6 HOWTO - das Sie gerade lesen - eingearbeitet. -Linux IPv6 HOWTO (dieses Dokument) -Da das IPv6 & Linux - HowTo in HTML geschrieben wurde, war es nicht wirklich mit dem The Linux Documentation Project (TLDP) kompatibel. Der Autor (Peter Bieringer) bekam Ende Nov. 2001 die Anfrage, das IPv6 & Linux - HowTo in SGML zu konvertieren. Er entschied sich auf Grund dieser Diskontinuität (Future of IPv6 & Linux - HowTo) und der Tatsache, dass IPv6 mehr und mehr zum Standard wird, zum Schreiben eines neuen Dokuments. Im zweiten HOWTO (IPv6 & Linux - HowTo) wird auch weiterhin dynamischer Inhalt sowie weiterführender Inhalt zu finden sein. -Verwendete Begriffe, Glossar und Abkürzungen - -Netzwerkbegriffe - -Base 10Dezimales Zahlensystem, das die Zahlen 0-9 beinhaltet.Base 16Generell in Programmiersprachen verwendetes hexedezimales Zahlensystem, das die Zahlen 0-9 und die Buchstaben A-F beinhaltet (Groß/Kleinschreibung möglich).Base 8585 verschiedene Zahlen/Buchstaben umfasst dieses Zahlensystem und ermöglicht dadurch kürzere Zeichenketten - aber niemals in der Praxis gesehen.BitKleinste Speichereinheit mit dem Wert ein/wahr (1) oder aus/falsch (0)ByteMeistens eine Menge von 8 bits (aber kein Muss - siehe ältere Computer Systeme)DeviceNetzwerkgerät, siehe auch NICDual homed hostEin Dual homed host ist ein Node mit zwei (physischen oder virtuellen) Schnittstellen auf zwei unterschiedlichen Links. Datenpakete können zwischen den zwei Verbindungen nicht weitergeleitet werden.HostIm Regelfall handelt es sich um einen Rechner mit einen Link sowie einer aktiven Netzwerk-Schnittstelle, z.B. Ethernet oder (aber nicht und) PPP.InterfaceIdent mit “device”, siehe auch NIC.IP HeaderKopf eines IP-Paketes (jedes Netzwerk-Paket hat einen header, die Form des headers ist abhängig von der Netzwerkschicht).LinkEin Link ist eine Schicht 2 Netzwerk-Transportmedium für Pakete; Beispiele sind Ethernet, Token Ring, PPP, SLIP, ATM, ISDN, Frame Relay,...NodeEin Node (=Knoten) ist ein Host oder ein Router.OctetSammlung von acht (8) realen bits, vergleichbar mit “byte”.PortInformation für den TCP/UDP dispatcher (Schicht 4), mit dessen Hilfe Informationen auf höhere Schichten transportiert werden.ProtocolJede Netzwerkschicht enthält meistens ein Protokoll-Feld damit die Übergabe transportierter Informationen an höhere Netzwerkschichten erleichtert wird. Beispiele hierfür: Schicht 2 (MAC) und 3 (IP).RouterEin Router ist ein Knoten mit zwei (2) oder mehr (physischen oder virtuellen) Schnittstellen, der Datenpakete zwischen den Schnittstellen versenden kann.SocketEin IP socket wird durch Quell- und Zieladresse, den Ports (und der Verbindung) definiert.StackEin Stack setzt sich aus Netzwerkschichten zusammen. SubnetmaskIP Netzwerke verwenden Bitmasken um lokale von entfernten Netzwerken zu trennen.TunnelEin Tunnel ist typischerweise eine Punkt-zu-Punkt-Verbindung, über die Datenpakete eines anderen Protokolls ausgetauscht werden. Beispiel: IPv6-in-IPv4 Tunnel. -<!-- anchor id="Glossar" -->Abkürzungen - -ACLAccess Control List - Zugriffsliste)APIApplication Programming Interface - Schnittstellen in Programmen zwischen den ApplikationenASICApplication Specified Integrated Circuit - Applikationsspezifischer integrierter SchaltkreisBSDBerkeley Software DistributionCAN-BusController Area Network Bus (physical bus system)ISPInternet Service ProviderKAMEEin Projekt und gemeinsame Anstrengung von sechs (6) Firmen in Japan mit dem Ziel, einen freien IPv6 und IPsec Stack für BSD Derivate der Öffentlichkeit zur Verfügung zu stellen www.kame.net.LIRLocal Internet Registry - Lokale Internet RegistraturNICNetwork Interface Controller - Netzwerk[schnittstellen]karte, kurz NetzwerkkarteRFCRequest For Comments - eine Sammlung von technischen und organisatorischen Dokumenten zum Thema Internet.USAGIUniverSAl playGround for Ipv6 Project - dieses Projekt will für das Linux System einen IPv6 Protokoll stack mit Produktionsqualität ausliefern. -In diesem Dokument verwendete Syntax - -Zeilenumbruchs-Zeichen bei langen Codebeispielen -Das spezielle Zeichen “¬” zeigt in den Beispielen an, dass die Zeile umgebrochen wurde. Dies wurde für eine korrekte Darstellung des Textes in den PDF- und PS-Versionen benötigt. -Platzhalter -In allgemeinen Beispielen können Sie öfters lesen: - -]]>In Skripts oder an Ihrer Kommandozeile müssen Sie die < und > weglassen und den Text mit dem entsprechenden Inhalt ersetzen. Das Beispiel hier z.B. könnte sein: - -Shell-Kommandos -Kommandos, die nicht als Root-Benutzer ausgeführt werden, beginnen mit $, z.B. -Befehle, die mit Root-Rechten ausgeführt werden, beginnen mit #, z.B. - -Grundvoraussetzung für die Verwendung dieses HOWTOs - -Persönliche Anforderungen - -Erfahrung mit Unix Tools -Sie sollten mit den gängigsten Unix Tools wie grep, awk, find, etc. und deren Kommandozeilen-Optionen vertraut sein. -Erfahrung mit Netzwerktheorie -Sie sollten das Schichtmodell und die einzelnen Schichten, Protokolle, Adressarten, Kabelsorten, Stecker etc. kennen. Wenn das Neuland für Sie sein sollte, finden Sie hier einen guten Ausgangspunkt: http://www.rigacci.org/docs/biblio/online/intro_to_networking/book1.htm -Erfahrung mit der Konfiguration von IPv4 Netzen -Sie sollten definitiv Erfahrung mit der Konfiguration von IPv4 Netzwerken haben, andernfalls werden Sie dem Text nur schwer folgen können. -Erfahrung mit dem Domain Name System (DNS) -Sie sollten ebenfalls das Domain Name System (DNS) verstehen und damit umgehen können. -Routine im Umgang mit Strategien zur Netzwerk-Fehlersuche -Sie sollten zumindest mit tcpdump umgehen und den Output des Programms interpretieren können. Andernfalls wird die Netzwerk-Fehlersuche für Sie schwierig. -Linux kompatible Hardware -Sicherlich wollen Sie mit realer Hardware experimentieren und nicht darüber an dieser Stelle lesen und an der einen oder anderen Stelle einschlummern. ;-7) -<!-- anchor id="chapter-basics" -->Grundlagen - -Was ist IPv6? -IPv6 ist ein neues Schicht 3 Vermittlungsprotokoll und es wird IPv4 (auch als IP bekannt) ablösen. IPv4 wurde vor langer Zeit entworfen (RFC 760 / Internet Protocol vom Januar 1980). Seitdem wurden viele Adressen vergeben und Erweiterungen angeregt. Die aktuelle RFC ist RFC 2460 / Internet Protocol Version 6 Specification. Hauptänderungen in IPv6 sind das neue Design des Headers sowie die Erweiterung der Adresslänge von 32 bits auf 128 bits. Die Schicht 3 ist für den Transport der Pakete von Endpunkt-zu-Endpunkt mittels adressbasierten Paket-Routings zuständig, und wie bei IPv4 müssen bei IPv6 die Adressen (Quell- und Zieladresse) inkludiert sein. -Für weitere Informationen zur IPv6 Geschichte siehe die älteren RFCs z.B. SWITCH IPv6 Pilot / References. -<!-- anchor id="basic-history-IPv6-Linux" -->Geschichte von IPv6 & Linux -Die Jahre 1992, 1993 und 1994 der allgemeinen IPv6 Geschichte können Sie in folgendem Dokument nachlesen: IPv6 or IPng (IP next generation). -Zu erledigen: Bessere Chronologie, mehr Inhalt -Anfang -Der erste IPv6 Netzwerk Code wurde dem Linux Kernel 2.1.8 im November 1996 durch Pedro Roque hinzugefügt. Er basierte auf dem BSD API: - -+ * -+ * Source: -+ * IPv6 Program Interfaces for BSD Systems -+ * -]]>Diese Zeilen entstammen dem patch-2.1.8 (die E-Mail-Adresse wurde hier beim Copy & Paste absichtlich gelöscht). -Übergangszeit -Aufgrund fehlender Arbeitskraft konnte die IPv6-Kernel-Implementierung nicht mit den Drafts oder neu freigegebenen RFCs Schritt halten. Im Oktober 2000 wurde in Japan das USAGI Projekt gestartet. Das Ziel war, die fehlende bzw. bereits veraltete IPv6 Funktionalität in Linux zu implementieren. Dabei richtete man sich nach der aktuellen FreeBSD Implementierung von IPv6, die durch das KAME project umgesetzt wurde. Von Zeit zu Zeit wurden im Vergleich zu den aktuellen Standard Linux-Kernel-Quellen ein Auszug erstellt. -Bis zum Start der Entwicklungs-Kernel Serie 2.5.x, der USAGI Patch war so groß, das er von den Linux-Netzwerkcode-Maintainers nicht komplett für die Einbindung in die Produktions-Kernel Serie 2.4.x eingebunden werden konnte. -Während der Entwicklung in der Serie 2.5.x hat USAGI versucht, so viel wie möglich ihrer Erweiterungen darin zu integrieren. -Heute -Viele der von USAGI und anderen lang entwickelten IPv6-bezogenen Patches sind bereits in der Vanilla Kernel Serie 2.6.x integriert. -Zukunft -USAGI und andere arbeiten weiterhin an der Implementierung von neuen Features wie Mobility und anderen. Von Zeit zu Zeit werden neue Erweiterungs-Patches veröffentlicht, wie auch die Integration in die Vanilla Kernel Serie 2.6.x vorangetrieben. -Wie sehen IPv6 Adressen aus? -Wie gesagt, IPv6 Adressen sind 128 bit lang. Diese bit-Anzahl kann sehr hohe dezimale Zahlen mit bis zu 39 Ziffern ergeben: -Solche Zahlen sind nicht wirklich Adressen, die auswendig gelernt werden können. Die IPv6 Adressdarstellung ist bitweise orientiert (wie bei IPv4, aber das wird nicht oft bedacht). Eine bessere Schreibweise ist deshalb die hexadezimale Darstellung. Dabei werden 4 bits (auch ”nibble” genannt) durch die Zeichen 0-9 und a-f (10-15) dargestellt, wodurch die Länge auf 32 Zeichen reduziert wird. -Diese Darstellung ist ebenfalls nicht sehr angenehm (mögliche Verwechslung oder Verlust einzelner hexadezimaler Ziffern), so dass die IPv6 Designer das hexadezimales Format mit einem Doppelpunkt als Trennzeichen nach jedem 16 bit Block erweiterten. Ferner wird das führende ”0x” (ein in Programmiersprachen verwendetes Identifizierungsmerkmal für hexadezimale Werte) entfernt: -Eine gültige Adresse (s.u. Adress-Typen) ist z.B.: -Der Vereinfachung halber können führende Nullen jedes 16 bit-Blocks weggelassen werden: - -¬ 2001:0db8:100:f101:210:a4ff:fee3:9566 -]]>Eine Sequenz von 16 bit-Blöcken, die nur Nullen enthaltet, kann durch ein “::“ ersetzt werden. Diese Komprimierung kann aber nicht öfters als einmal durchgeführt werden - 2001:0db8:100:f101::1 -]]>Die höchstmögliche Reduktion sieht man bei der IPv6 Localhost Adresse: - ::1 -]]>Es gibt auch eine so genannte kompakte Darstellung (base 85 codiert) RFC 1924 / A Compact Representation of IPv6 Addresses (publiziert am 1. April 1996). Diese Notation wurde allerdings nie in der Praxis gesehen und ist wahrscheinlich ein Aprilscherz. Ein Beispiel: -J%s99FJXT -]]>
    -Info: ipv6calc ist ein IPv6 Adressen-Format-Umrechner und Konvertierungsprogramm und ist hier zu finden: ipv6calc homepage (Mirror) -
    -FAQ (Grundlagen) - -Warum wird der Nachfolger von IPv4 nun IPv6 und nicht IPv5 genannt? -In jedem IP-Header werden die ersten 4 Bits für die Protokollversion reserviert. So sind theoretisch die Protokollnummern 0 bis 15 möglich: -4: Wird schon für IPv4 verwendet5: Ist für das Stream Protocol (STP, RFC 1819 / Internet Stream Protocol Version 2) reserviert (das aber nie den Weg in die Öffentlichkeit fand)So war die nächste freie Zahl 6. IPv6 war geboren! -IPv6 Adressen: Warum ist die Anzahl der Bits so groß? -Bei der Entwicklung von IPv4 dachte man, dass 32 Bits für die Welt ausreichend wären. Blickt man zurück, so waren bis heute 32 bits ausreichend. Vielleicht ist dies auch noch für ein paar Jahre so. Jedoch werden 32 bits nicht ausreichen, um in der Zukunft jedes Netzwerkgerät mit einer globalen Adresse ausstatten zu können. Denken Sie an Mobiltelefone, Autos (mit elektronischen Geräten an einem CAN Bus), Toaster, Kühlschränken, Lichtschalter usw. -Die IPv6 Designer haben 128 Bit gewählt, 4-mal mehr als im heutigen IPv4. -Aber die benutzbare Größe ist kleiner als es erscheinen mag, da in dem gegenwärtig definierten Adress-Schema 64 Bits für die Schnittstellen-Identifizierung verwendet werden. Die zweiten 64 Bit werden für das Routing verwendet. Die derzeitigen Aggregation-Levels (= Größe der zugeteilten IP-Blöcke) vorausgesetzt (/48, /32,...), ist eine Verknappung der Adressen weiterhin denkbar. Aber mit Sicherheit nicht in naher Zukunft. -Weitere Informationen finden Sie unter RFC 1715 / The H Ratio for Address Assignment Efficiency und RFC 3194 / The Host-Density Ratio for Address Assignment Efficiency. -IPv6 Adressen: Warum ist die Bit-Anzahl bei einem neuen Design so klein? -Es gibt (wahrscheinlich) eine Gruppe (bekannt ist nur Jim Fleming...) von Personen am Internet, die über IPv8 und IPv16 nachdenken. Für diese Designs gibt es aber keine hohe Akzeptanz und auch keine Kernel-Implementierungen. 128 bits sind die beste Wahl bezogen auf Header-Overhead und dem Datentransport. Denken Sie an die minimalste Maximum Transfer Unit (MTU) in IPv4 (575 octets) und in IPv6 (1280 octets), die Header-Länge in IPv4 (20 octets Minimum, kann bis zu 60 octets mit IPv4 Optionen ansteigen) und in IPv6 sind es 40 octets (fixer Wert). Dies ist 3.4 % der minimalen MTU in IPv4 und 3.1 % der minimalen MTU in IPv6. Dies bedeutet, dass der Overhead beim Header fast identisch ist. Mehr bits für die Adressierung würden größere Header und deshalb mehr Overhead erfordern. Bedenken Sie auch die maximale MTU von 1500 octets (in speziellen Fällen bei Jumbo-Paketen bis zu 9k octets) bei normalen Verbindungen (z.B. Ethernet). Letztlich wäre es kein korrektes Design, wenn 10 % oder 20 % der transportierten Daten in einem Schicht 3-Paket für Adressen und nicht für die ”Nutzlast” benötigt würden.
    -<!-- anchor id="chapter-addresstypes" -->Adress-Typen -Wie bei IPv4 können IPv6-Adressen mittels Subnetzmasken (subnet masks) in einen Netz- und einen Host-Teil unterteilt werden. -Bei IPv4 hat sich gezeigt, dass es manchmal von Nutzen wäre, einem Interface mehr als eine IP-Adresse zuweisen zu können, je nach Bedarf und Zweck (aliases, multicast etc.). Um in Zukunft flexibler bleiben zu können, geht man bei IPv6 weiter und erlaubt pro Interface mehr als eine zugewiesene IP-Adresse. Derzeit sind durch die RFCs kein Limit gesetzt, wohl aber in der Implementierung des IPv6 Stacks (um DoS Attacken vorzubeugen). -Neben der großen Bit-Anzahl für Adressen definiert IPv6 basierend auf einigen vorangestellten Bits verschiedene Adress-Typen. Diese werden hoffentlich in der Zukunft niemals aufgehoben (zum Unterschied zu IPv4 heute und die Entwicklung der class A, B und C Netze). -Zur Unterstützung einer automatischen Konfiguration wird die Bitanzahl in einen Netzwerk-Teil (vordere 64 Bits) und einen Hostteil (hintere 64 Bits). -Adressen ohne speziellen Präfix - -Localhost Adresse -Dies ist eine spezielle Adresse für das Loopback Interface, vergleichbar zur “127.0.0.1” bei IPv4. Bei IPv6 lautet die localhost Adresse: -bzw. komprimiert: -Pakete mit dieser Quell- bzw. Ziel-Adresse sollten niemals den sendenden Host verlassen. -Unspezifische Adresse -Dies ist eine spezielle Adresse vergleichbar mit “any” oder “0.0.0.0” bei IPv4. In IPv6 lautet sie: -oder: -Diese Adresse wird meistens in Routing-Tabellen und beim “socket binding” (zu jeder IPv6 Adresse) angewendet bzw. gesehen. -Beachten: Die Unspezifizierte Adresse kann nicht als Ziel-Adresse verwendet werden. -IPv6 Adressen mit eingebetteter IPv4 Adresse -Es gibt zwei Adressen-Typen, die IPv4 Adressen enthalten können. -IPv4 Adressen in IPv6 Format -IPv4-only IPv6-kompatible Adressen kommen manchmal bei IPv6 kompatiblen Daemon zur Anwendung, die allerdings ausschließlich an IPv4 Adressen gebunden sind. -Diese Adressen sind mit einer speziellen Präfixlänge von 96 definiert (a.b.c.d. ist die IPv4 Adresse): -oder in komprimiertem Format: -Die IPv4 Adresse 1.2.3.4. z.B. sieht wie folgt aus: - -IPv4 kompatible IPv6 Adressen -Dieser Adress-Typ wurde für das automatische Tunneln (RFC 2893 / Transition Mechanisms for IPv6 Hosts and Routers) verwendet, welches aber durch das 6to4 tunneling ersetzt wurde. -oder in komprimierter Form: - -Netzteil der Adresse (Präfix) -Es wurden einige Adress-Typen definiert und zugleich blieb für zukünftige Anforderungen ausreichend Raum für weitere Definitionen. In RFC 4291 / IP Version 6 Addressing Architecture wird das aktuelle Adress-Schema definiert. - -Lassen Sie uns nun einen Blick auf die verschiedenen Präfixe (und somit auf die Adress-Arten) werfen:: -Link-lokaler Adress-Typ -Es handelt sich um spezielle Adressen, die ausschließlich auf einem Link eines Interfaces gültig sind. Wird diese Adresse als Zieladresse verwendet, so kann das Paket niemals einen Router passieren. Die Adresse wird bei der Link-Kommunikation eingesetzt, z.B.: -Ist noch jemand anderer auf diesem Link?Ist jemand mit einer speziellen Adresse hier (z.B. Suche nach einem Router)?Die Adresse beginnt mit (wobei “x” für ein hexadezimales Zeichen steht, im Normalfall “0”) -Eine Adresse mit diesem Präfix gibt es an jedem IPv6 fähigen Interface nach einer stateless automatischen Konfiguration (dies ist der Regelfall). -Site-lokaler Adress-Typ -Diese Adressen sind vergleichbar zu den RFC 1918 / Address Allocation for Private Internets im heutigen IPv4. Eine Neuerung und Vorteil hierbei ist, vergleichbar zum 10.0.0.0/8 im IPv4, die Nutzbarkeit von 16 bits bzw. ein Maximum von 65536 Subnetzen. -Ein weiterer Vorteil: Da man bei IPv6 mehr als eine Adresse an ein Interface binden kann, ist auch die Zuweisung einer site-local Adresse zusätzlich zu einer globalen Adresse möglich. -Die Adresse beginnt mit: -(“x” ist ein hexadezimales Zeichen, normalerweise “0”) -Dieser Adresstyp ist nun abgekündigt RFC 3879 / Deprecating Site Local Addresses und sollte nicht mehr verwendet werden. Für Tests im Labor sind solche Adressen meineserachtens aber immer noch eine gute Wahl. -Unique Local IPv6 Unicast Adressen -Weil die schon früh definierten site-local Adressen nicht eindeutig sind, kann dies zu großen Problemen führen, wenn z.B. einst unabhängige Netzwerke später zusammengeschlossen werden (Überlappung von Subnetzen). Aufgrund dessen und anderer Gründe wurde ein neuer Adresstyp definiert, genant RFC 4193 / Unique Local IPv6 Unicast Addresses. - -Die Adresse beginnt mit: -Ein Teil des Präfix (40 Bits) werden pseudozufällig generiert. Es ist sehr unwahrscheinlich, daß zwei generierte Präfixe identisch sind. -Ein Beispiel für einen Präfix (generiert mit Hilfe des web-basierten Werkzeugs: Goebel Consult / createLULA): - -Globaler Adress-Typ ("Aggregatable global unicast") -Heute gibt es ist per Definition eine globale Adress-Art (Das erste Design, ''Provider based'' genannt, wurde bereits vor einigen Jahren wieder aufgegeben RFC 1884 / IP Version 6 Addressing Architecture [obsolete]. Einige Überbleibsel hiervon sind in älteren Linux Kernelquellen noch zu finden. -Die Adresse beginnt mit (x sind hexadezimale Zeichen) -Hinweis: Der Zusatz “aggregatable” im Namen wird in aktuellen Drafts abgelegt. -Es sind weitere Subarten definiert: -6bone Test-Adressen -Diese globalen Adressen waren die Ersten definierten und auch benutzen Adressen. Sie alle beginnen mit: -Beispiel: -Eine spezielle 6bone Test-Adresse, die niemals weltweit einmalig ist, beginnt mit -und wird zumeist in alten Beispielen benutzt, um zu vermeiden, dass Anwender diese mit Copy & Paste in Ihre Konfigurationen übernehmen können. Auf diese Weise können Duplikate weltweit einmaliger Adressen aus Versehen bzw. Unachtsamkeit vermieden werden. Es würde für den Original-Host ernste Probleme bedeuten (z.B. Antwortpakete für niemals gesendete Anfragen bekommen...). -Aufgrund dessen, daß IPv6 nun produktiv ist, wird dieser Präfix nicht mehr länger delegiert und nach dem 6.6.2006 vom Routing ausgenommen (mehr unter RFC 3701 / 6bone Phaseout ). -6to4 Adressen -Diese Adressen werden für einen speziellen Tunnelmechanismus verwendet [RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds und RFC 2893 / Transition Mechanisms for IPv6 Hosts and Routers]. Sie kodieren eine gegebene IPv4 Adresse, ein eventuelles Subnetz und beginnen mit -z.B. wird 192.168.1.1/5 repräsentiert durch: -Ein kleines Shell-Kommando kann aus einer IPv4 eine 6to4 Adresse erstellen: -Siehe auch tunneling using 6to4 und information about 6to4 relay routers. -Durch einen Provider zugewiesene Adressen für ein hierarchisches Routing -Diese Adressen werden an Internet Service Provider (ISP) delegiert und beginnen mit: -Präfixe für große ISPs (mit eigenem Backbone) werden durch local registries vergeben. Zurzeit wird ein Präfix mit der Länge 32 zugeteilt. -Grosse ISPs delegieren ihrerseits an kleinere ISPs ein Präfix mit der Länge 48. -Für Beispiele und Dokumentationen reservierte Adressen -Momentan sind zwei Adressbereiche für Beispiele und Dokumentationen RFC 3849 / IPv6 Address Prefix Reserved for Documentation reserviert: -Diese Adressbereiche sollten nicht geroutet werden und am Übergangsrouter zum Internet (basierend auf Absendeadressen) gefiltert werden. -Multicast-Addressen -Multicast-Adressen werden für entsprechende Dienste verwendet. -Sie beginnen immer mit (xx ist hierbei der Wert der Reichweite) -Die Adressen werden in Reichweiten und Typen unterteilt: -Multicast-Bereiche -Die Multicast Reichweite ist ein Parameter, mit dem die maximale Distanz angegeben werden kann, die ein Multicast Paket sich von der versendenden Einheit entfernen kann. -Zurzeit sind folgende Regionen (reichweiten) definiert: -ffx1: Node-lokal, Pakete verlassen niemals den Knotenffx2: Link-lokal, Pakete werden niemals von Routers weitergeleitet, der angegebene Link wird nie verlassen.ffx5: Site-lokal, Pakete verlassen niemals den Standort (Site)ffx8: organisationsweit, Pakete verlassen niemals eine Organisation (nicht einfach zu implementieren, dies muss durch das Routing Protokoll abgedeckt werden)ffxe: Globale ReichweiteSonstige sind reserviert -Multicast-Typen -Es sind bereits viele Typen definiert bzw. reserviert (siehe RFC 4291 / IP Version 6 Addressing Architecture für weitere Details), einige Beispiele: -All Nodes Adresse: ID = 1h, alle Hosts am lokalen Node (ff01:0:0:0:0:0:0:1) oder am angeschlossenen Link (ff02:0:0:0:0:0:0:1) werden adressiert.All Routers Adresse: ID = 2h, alle Router am lokalen Node (ff01:0:0:0:0:0:0:2), am angeschlossenen Link (ff02:0:0:0:0:0:0:2) oder am lokalen Standort werden adressiert. -Erforderliche node link-local Multicast Adresse -Diese spezielle Multicast Adresse wird als Zieladresse bei der Erkundung des Nahbereichs verwendet, da es ARP bei IPv6 im Gegensatz zu IPv4 nicht mehr gibt. -Ein Beispiel für diese Adresse könnte sein: -Das benutzte Präfix zeigt, dass es sich um eine link-lokale Multicast Adresse handelt. Dass Suffix wird aus der Zieladresse erstellt. In diesem Beispiel soll ein Paket zur Adresse “fe80::1234” gesendet werden, aber die Netzwerk-Schicht hat keine Kenntnis der aktuellen Schicht 2 MAC Adresse. Die oberen 104 bits werde mit “ff02:0:0:0:01:ff00::/104” ersetzt und die unteres 24 bits bleiben unverändert. Diese Adresse wird nun ”am Link” verwendet, um den entsprechenden Node zu finden, der wiederum seine Schicht 2 MAC Adresse als Antwort zurücksendet. -Anycast-Adressen -Anycast Adressen sind spezielle Adressen und werden verwendet, um besondere Bereiche wie den nächstgelegenen DNS-Server, den nächstliegenden DHCP Server und vergleichbare dynamische Gruppen abzudecken. Die Adressen werden dem Pool des Unicast Adressraums (global-aggregierbar oder Site-lokal zurzeit) entnommen. Der Anycast-Mechanismus (client view) wird von dynamischen Routing-Protokollen gehandhabt. -Hinweis: Anycast Adressen können nicht als Quelladresse verwendet werden, sondern ausschließlich als Zieladressen. -Subnet-Router Anycast-Adresse -Die Subnet-Router Anycast Adresse ist ein einfaches Beispiel für eine Anycast Adresse. Angenommen, der Knoten hat folgende global zugewiesene IPv6 Adresse: -Die Subnet-Router Anycast Adresse wird durch komplette Streichung des Suffixes (die letzten gültigen 64 bits) erstellt: - -Adress-Typen (Host-Teil) -In Hinblick auf Auto-Konfigurations- und Mobilitätsfragen wurde entschieden, die niedrigeren 64 bits als Host-Bestandteil zu nutzen. Jedes einzelne Subnetz kann deshalb eine große Anzahl an Adressen enthalten. -Der Host-Teil kann aus unterschiedlichen Blickwinkeln betrachtet werden: -Automatisch erstellte Adressen (auch unter dem Namen stateless bekannt) -Bei der Auto-Konfiguration wird der Hostteil der Adresse durch die Konvertierung der MAC-Adresse eines Interfaces (falls vorhanden) zu einer einmaligen IPv6 Adresse (mittels EUI-64 Methode) generiert. Falls keine MAC-Adresse verfügbar ist (z.B. bei virtuellen Interfaces), wird anstelle dessen etwas anderes herangezogen (wie z.B. die IPv4 Adresse oder die MAC-Adresse eines physikalischen Interfaces). -Als Beispiel hat hier ein NIC folgende MAC-Adresse (48 bit): -Diese wird gemäß demIEEE-Tutorial EUI-64 Design für EUI-48 Identifiers zum 64 bit Interface Identifier erweitert: -Mit einem gegebenen Präfix wird daraus die schon oben gezeigte IPv6-Adresse: - -Datenschutzproblem mit automatisch erstellten Adressen sowie eine Lösung -Der "automatisch generierte" Hostteil ist weltweit einmalig (mit Ausnahme, wenn der Hersteller einer NIC die gleiche MAC-Adresse bei mehr als einer NIC einsetzt). Die Client-Verfolgung am Host wird dadurch möglich, solange kein Proxy verwendet wird. -Dies ist ein bekanntes Problem und eine Lösung wurde dafür definiert: Datenschutz-Erweiterung, definiert in RFC 3041 / Privacy Extensions for Stateless Address Autoconfiguration in IPv6 (es gibt bereits ein neueres Draft: draft-ietf-ipv6-privacy-addrs-v2-*). Es wird von Zeit zu Zeit mittels eines statischen und eines Zufallswertes ein neues Suffix erstellt. Hinweis: Dies ist nur für ausgehende Client-Verbindungen sinnvoll und bei bekannten Servern nicht wirklich sinnvoll. -Manuell festgelegte Adressen -Bei Servern ist es wahrscheinlich leichter, sich einfachere Adressen zu merken. Dies kann z.B. mit der Zuweisung einer zusätzlichen IPv6 Adresse an ein Interface geschehen. -Für das manuelle Suffix, wie “::1” im obigen Beispiel, muss das siebte höchstwertige Bit auf 0 gesetzt sein (das universale/local Bit des automatisch generierten Identifiers). Es sind auch noch andere (ansonsten nichtausgewählte) Bit-Kombinationen für Anycast-Adressen reserviert. -Präfixlängen für das Routing -Um eine maximale Reduktion an Routing-Tabellen zu erzielen, war in der frühen Design-Phase noch ein vollkommen hierarchischer Routing-Ansatz vorgesehen. Die Überlegungen hinter diesem Ansatz waren die gegenwärtigen IPv4 Routing-Einträge in den Haupt-Routern (mit über 400.000 Einträgen im Jahr 2013) sowie die Reduktion des Speicherbedarfs für die Routing-Tabellen bei Hardware-Routern (ASIC “Application Specified Integrated Circuit”, speziell konstuierter Chip) sowie ein daraus resultierender Geschwindigkeitszuwachs (weniger Einträge ergeben hoffentlich schnellere Abfragen). -Heutiger Standpunkt ist, dass das Routing für Netzwerke mit nur einem Service Provider hauptsächlich mit einem hierarchischen Design realisiert wird. Eine solche Vorgehensweise ist nicht möglich, wenn mehr als eine ISP-Verbindung besteht. Diese Problematik wird unter dem Thema multi-homing diskutiert (Infos zu multi-homing: drafts-ietf-multi6-*,IPv6 Multihoming Solutions). -Präfixlängen ("netmasks" genannt) -Vergleichbar zu IPv4, handelt es sich hierbei um den routbaren Netzwerkpfad für das stattfindende Routing. Da die Standard-Notierung der Netzmaske von 128 bit nicht sehr fein aussieht, verwenden die Designer das aus IPv4 bekannte Classless Inter Domain Routing Schema (CIDR, RFC 1519 / Classless Inter-Domain Routing). Mit Hilfe des CIDR wird die Bitanzahl der IP Adresse festgelegt, welche für das Routing verwendet werden. Diese Methode wird auch als "Slash"-Notation genannt. -Ein Beispiel: -Diese Notation wird erweitert zu: -Netzwerk: - -Netzmaske: - -Zutreffende Routen -Im Normalfall (ohne QoS) ergibt eine Suche in der Routing-Tabelle eine Route mit der signifikantesten Adress-Bit-Anzahl, d.h. jene Route mit der größten Präfix-Länge wird zuerst herangezogen. -Wenn z.B. eine Routing-Tabelle folgende Einträge zeigt (Liste ist nicht komplett): -Die gezeigten Zieladressen der IPv6 Pakete werden über die entsprechenden Geräte geroutet - routed through device sit1 -2001:0db8:200:1:2:3:4:5/48 -> routed through device tun6to4 -]]> -<!-- anchor id="chapter-systemcheck" -->IPv6 System-Check -Bevor Sie IPv6 auf einem Linux Host einsetzen können, müssen sie überprüfen, ob das System IPv6 fähig ist. Eventuell haben Sie Änderungen vorzunehmen, um IPv6 zu ermöglichen. -<!-- anchor id="systemcheck-kernel" -->IPv6 kompatibler Kernel -Neuere Linux Distributionen beinhalten bereits einen IPv6-fähigen Kernel. Die IPv6-Funktionalität wird im Allgemeinen als Modul kompiliert. Es ist aber durchaus möglich, dass das Modul nicht automatisch beim Start des Betriebssystems geladen wird. -Hinweis: Sie sollten die Kernel Serie 2.2.x nicht mehr verwenden, da die IPv6-Implementierung nicht mehr aktuell ist. Auch die in der Serie 2.4.x wird nicht mehr weiterentwickelt bzgl. der Definitionen in den neueren RFCs. Es wird empfohlen, einen aus der Serie 2.6.x zu verwenden. -Überprüfung der IPv6 Unterstützung im aktuellen Kernel -Um zu überprüfen, ob ihr aktueller Kernel IPv6 unterstützt, sollten sie einen Blick in ihr /proc-Dateisystem werfen. Folgende Einträge müssen existieren: -Einen kleinen automatischen Test können Sie wie folgt durchführen: -Wenn dieser Test negativ verläuft, ist das IPv6 Modul aller Wahrscheinlichkeit noch nicht geladen. -IPv6 Module laden -Mit folgenden Befehl können Sie versuchen, das Modul zu laden: -Wenn dieser Befehl positiv verläuft, dann sollten Sie das Modul mit folgendem Befehl auflisten können: -Der obige Test sollte nun erfolgreich verlaufen. -Hinweis: Ein Entfernen des Moduls im laufenden System wird derzeit nicht unterstützt und kann unter gewissen Bedingungen zu einem Absturz des Kernels führen. -Automatisches Laden des Moduls -Es ist möglich das IPv6 Modul bei Bedarf automatisch zu laden. Sie müssen nur folgende Zeile in die Konfigurationsdatei des kernel modul loaders eintragen (normalerweise: /etc/modules.conf oder /etc/conf.modules): -Mit der folgenden Zeile ist es auch möglich, das automatische Laden des IPv6 Moduls auszuschalten. -Anmerkung: In Kernel Series 2.6.x wurde der Modul-Lade-Mechanismus geändert. Die neue Konfigurationsdatei wird anstelle /etc/modules.conf nun /etc/modprobe.conf genannt. -Kernel-Kompilierung mit IPv6 Funktionalität -Wenn beide oben gezeigten Methoden ohne Erfolg blieben und ihr Kernel somit keine IPv6 Unterstützung bietet, dann haben Sie folgende Optionen: -Aktualisieren Sie Ihre Distribution mit einer Version, die von Haus aus IPv6 unterstützt (empfohlen für Anfänger),Sie können einen Standard-Kernel kompilieren (einfach, wenn Sie die benötigten Optionen kennen)Kompilieren Sie die Kernel-Quellen ihrer Distribution (manchmal nicht ganz so einfach)Kompilieren Sie einen Kernel mit den USAGI-ErweiterungenFalls Sie sich dazu entscheiden, einen neuen IPv6 kompatiblen Kernel zu kompilieren, sollten Sie auf jeden Fall bereits Erfahrung mit der Kernel-Kompilierung haben sowie das Linux Kernel HOWTO lesen. -Ein Vergleich zwischen dem Standard-Kernel und dem Kernel mit USAGI-Erweiterungen ist verfügbar unter IPv6+Linux-Status-Kernel. -Kompilieren eines Standard-Kernels -Detailliertere Ausführungen zur Kompilierung eines IPv6 fähigen Kernels finden Sie unter IPv6-HOWTO-2#kernel. -Hinweis: Sie sollten wann immer möglich die Kernel Serie 2.6.x oder höher einsetzen, da die IPv6 Unterstützung der Serie 2.4.x nur einige Backports erhält und die IPv6-Unterstützung von Serie 2.2.x hoffnungslos veraltet ist und nicht mehr weiterentwickelt wird. -Kompilieren eines Kernels mit USAGI-Erweiterungen -Wie für den Standard-Kernel gilt auch hier, dass das Kompilieren des Kernels nur fortgeschrittenen Benutzern empfohlen wird, die mit IPv6 und dem Kompilieren des Kernels bereits vertraut sind. -Siehe auch USAGI project / FAQ und Obtaining the best IPv6 support with Linux (Article) (Spiegel). -IPv6 kompatible Netzwerkgeräte -Nicht alle Netzwerkgeräte sind bereits (bzw. überhaupt) dazu in der Lage, IPv6 Pakete übertragen zu können. Den aktuellen Status können Sie unter IPv6+Linux-status-kernel.html#transport. -Ein entscheidender Punkt ist die Tatsache, dass ein IPv6 Paket wegen der Struktur der Netzwerkschicht in der Kernel-Implementierung nicht wirklich aufgrund der IP-Header-Nummer (6 anstelle 4) wiedererkannt wird. Es wird aufgrund der Protokollnummer der Schicht 2 Transport-Protokolls wiedererkannt. Folglich können IPv6 Pakete von keinem Transport-Protokoll verwendet werden, welche diese Protokoll-Nummer nicht nutzen. Hinweis: Das Paket wird nach wie vor über den Link transportiert, aber auf der Empfänger-Seite kann das Paket nicht verarbeitet werden (Sie können dies z.B. mit tcpdump sehen). -Gegenwärtig bekannte Verbindungsarten, die niemals IPv6 fähig sein werden - -Serial Line IP (RFC 1055 / SLIP), auch SLIPv4 genannt; das Gerät heißt: s1X Parallel Line IP (PLIP), gleich dem SLIP, Gerätename: plipXISDN mit rawip Encapsulation; Gerätename: isdnX -Bekannte Verbindungsarten, die gegenwärtig IPv6 nicht unterstützen - -ISDN mit syncppp Encapsulation; Gerätename: ipppX (Designfrage des ipppd; in der Kernel Serie 2.5.x wird ipppX in einer allgemeinen PPP Schicht inkludiert) -IPv6 kompatible Tools zur Netzwerkkonfiguration -Ohne entsprechende Tools zur Konfiguration von IPv6 würden Sie mit einem IPv6 fähigen Kernel nicht weit kommen. Es gibt verschiedene Pakete womit IPv6 konfiguriert werden kann. -net-tools Paket -Das Paket net-tool beinhaltet einige Tools wie ifconfig und route. Mit den Tools kann IPv6 auf einem Interface konfiguriert werden. Sehen Sie sich die Ausgabe des Befehls ifconfig -? Bzw. route -? an. Finden Sie in der Ausgabe die Worte IPv6, inet6 oder Ähnliches, dann ist das Tool IPv6-kompatibel. -Automatische Überprüfung: -& 1|grep -qw 'inet6' && echo "utility 'ifconfig' is -¬ IPv6-ready" -]]>Folgenden Check gibt es für route: -& 1|grep -qw 'inet6' && echo "utility 'route' is IPv6-ready" -]]> -iproute Paket -Alexey N.Kuznetsov (gegenwärtig ein Betreuer des Linux Network Codes) erstellte eine Tool-Sammlung, womit das Netzwerk mittels dem netlink Device konfiguriert wird. Diese Tool-Sammlung stellt mehr Funktionalität als das net-tools Paket zur Verfügung, ist aber nicht sehr umfangreich dokumentiert und nichts für schwache Nerven. -&1 |grep -qw 'inet6' && echo "utility 'ip' is IPv6-ready" -]]>Wird das Programm /sbin/ip nicht gefunden, dann wird die Installation des iproute Paketes empfohlen. -Sie können dies (falls beinhaltet) von der benutzten Linux-Distribution installierenSie können nach einem passenden RPM Paket unter RPMfind/iproute suchen (manchmal ist auch das kompilieren eines SRPMS Paketes zu empfohlen) -IPv6 Test/Debug-Programme -Nachdem Sie ihr System auf IPv6 vorbereitet haben, wollen Sie nun IPv6 für die Netzwerkkommunikation einsetzen. Zuerst sollten Sie lernen, IPv6 Pakete mit einem Sniffer Programm zu untersuchen. Dies ist zu empfehlen, denn in Hinblick auf Fehlersuche und Troubleshooting kann das Durchführen einer schnellen Diagnose von Nutzen sein. -<!-- anchor id="program-ping6." -->IPv6 ping -Das Programm ist normalerweise im Paket iputils beinhaltet. Durch senden von ICMPv6 echo-request Paketen und warten auf ICMPv6 echo-reply Paketen können einfache Transport-Tests durchgeführt werden. -Anwendung - -# ping6 -# ping6 [-I ] -]]>Einige Implementierungen unterstützen auch %<device> Definition zusätzlich zu -I <device>, z.B. -% -]]>Beispiel -Hinweis: ping6 benötigt direkten Zugriff auf den Socket und hierfür Root-Rechte. Wenn Nicht-Root-Benutzer ping6 nicht benutzen können, kann dies zwei Ursachen haben: -ping6 ist nicht im Pfad des Benutzers eingetragen; ping6 ist allgemein in /usr/sbin zu finden -> Lösung: Den Pfad ergänzen (nicht empfohlen)ping6 lässt sich im Allgemeines wegen fehlender Root-Rechte nicht korrekt ausführen -> Lösung: chmod u+s /usr/sbin/ping6 -Das Interface für einen IPv6 ping bestimmen -Wenn link-lokale Adressen für ein IPv6 ping verwendet werden, dann hat der Kernel keine Kenntnis darüber, durch welches (physikalische oder virtuelle) Gerät das Paket gesendet werden muss - jedes Gerät hat eine link-lokale Adresse. Ein Versuch resultiert in folgender Fehlermeldung: -In diesem Fall müssen Sie das Interface zusätzlich spezifizieren: -Beispiel für %<device> Notation: - -Ping6 zu Multicast-Adressen -Ein interessanter Mechanismus zum Aufspüren eines IPv6 aktiven Hosts am Link ist mit ping6 an eine link-lokale all-node Multicast Adresse zu pingen. -Beispiel für %<device> Notation: -Bei IPv6 kann dieses Verhalten zurzeit, im Gegensatz zu IPv4, wo Antworten auf ein Ping auf die Broadcast Adresse unterdrückt werden können, nicht unterbunden werden. Ausnahme hierbei ist der Einsatz der lokalen IPv6 Firewall-Funktionalität. -<!-- anchor id="program-traceroute6." -->IPv6 traceroute6 -Dieses Programm ist normal im Paket iputils enthalten. Es ist ein Programm vergleichbar dem IPv4 traceroute. Unten sehen Sie ein Beispiel: -Anmerkung: Im Unterschied zu modernen IPv4 traceroute Versionen, welche den Einsatz von ICMPv4-echo-request Paketen wie auch UDP Paketen (default) ermöglichen, können mit IPv6-traceroute nur UDP Pakete versendet werden. Wie Sie vielleicht bereits wissen, werden von Firewalls bzw. von ACLs auf Routern ICMP echo-request Pakete mehr akzeptiert als UDP Pakete. -Falls ein Interface spezifiziert werden muß, kann dies durch -i <device> oder in der Form <address>%<device> erfolgen. -<!-- anchor id="program-tracepath6." -->IPv6 tracepath6 -Dieses Programm ist normalerweise im Paket iputils enthalten. Das Programm ist dem traceroute6 ähnlich, es gibt den Weg zu einem angegebenen Ziel wieder und misst hierbei den MTU-Wert. Unten sehen Sie ein Beispiel: - -<!-- anchor id="program-tcpdump" -->IPv6 tcpdump -In Linux ist tcpdump ein Haupttool zum aufzeichnen von Paketen. Weiter unten sehen Sie einige Beispiele. Normalerweise ist die Ipv6-Unterstützung in der aktuellen Version 3.6 gegeben. -Bei tcpdump werden zur Geräuschminimierung bei der Paket-Filterung Ausdrücke eingesetzt: -icmp6: ICMPv6 Datenverkehr wird gefiltertip6: IPv6 Datenverkehr (inkl.ICMPv6) wird gefiltertproto ipv6: getunnelter IPv6-in-IPv4 Datenverkehr wird gefiltertnot port ssh: zum unterdrücken der Anzeige von SSH Paketen während der Ausführung von tcpdump bei einer remote SSH-SitzungEbenfalls sind einige Kommandozeilen-Optionen sehr hilfreich, um detailliertere Informationen über die Pakete erlangen und protokollieren zu können. Für ICMPv6 Pakete sind hauptsächlich interessant: -“-s 512”: Bei der Aufzeichnung der Pakete wird die zu Aufzeichnungslänge auf 512 bytes vergrößert“-vv”: wirklich sehr ausführliche Ausgabe“-n”: Adressen werden nicht in Namen aufgelöst. Dies ist hilfreich, wenn die Reverse-DNS-Auflösung nicht sauber arbeiten sollte -IPv6 ping zur Adresse 2001:0db8:100:f101::1 über einen lokalen Link - - 2001:0db8:100:f101::1: icmp6: echo -¬ request (len 64, hlim 64) -2001:0db8:100:f101::1 > 2001:0db8:100:f101:2e0:18ff:fe90:9205: icmp6: echo -¬ reply (len 64, hlim 64) -]]> -IPv6 ping zur Adresse 2001:0db8:100::1 über einen IPv6-in-IPv4 Tunnel geroutet -1.2.3.4. und 5.6.7.8. sind Tunnel-Endpunkte (alle Adressen sind Beispiele) - 5.6.7.8: 2002:ffff:f5f8::1 > 2001:0db8:100::1: icmp6: echo request -¬ (len 64, hlim 64) (DF) (ttl 64, id 0, len 124) -5.6.7.8 > 1.2.3.4: 2001:0db8: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 > 2001:0db8:100::1: icmp6: echo request -¬ (len 64, hlim 64) (DF) (ttl 64, id 0, len 124) -5.6.7.8 > 1.2.3.4: 2001:0db8:100::1 > 2002:ffff:f5f8::1: icmp6: echo reply (len -¬ 64, hlim 61) (ttl 23, id 29919, len 124) -]]> -IPv6 kompatible Programme -Aktuelle Distributionen beinhalten bereits die gängigsten IPv6 kompatiblen Client- und Server-Programme. Weitere Infos gibt es unter IPv6+Linux-Status-Distribution. Falls ein Programm hier noch nicht gelistet sein sollte, können Sie unter Current Status of IPv6 Support for Networking Applications nachlesen, ob das Programm bereits auf IPv6 portiert wurde und unter Linux bereits läuft. Für verbreitete Programme gibt es einige Hinweise hier weiter unten. -IPv6 kompatible Client-Programme (Auswahl) -Um die folgend abgebildeten Tests durchzuführen, benötigen Sie ein funktionierendes IPv6 System. Bei einigen Beispielen werden Adressen angezeigt, die nur bei einer verfügbaren 6bone Verbindung erreichbar sind. -Note: wenn Namen anstatt dedizierter IPv4/IPv6 Adressen benutzt werden, dann kann dieser zu einer Liste von IPv4 und IPv6 Adressen aufgelöst werden. Einige Kommandozeilenwerkzeuge unterstützen explizite Benutzung des gewünschten Protokolls. Üblicherweis haben solche Werkzeuge Optionen wie “-4” für IPv4 und “-6” für IPv6. -DNS-Überprüfung der IPv6 Adress-Auflösung -Jeder DNS-Server (Domain Name System) sollte aufgrund der Sicherheitsupdates der letzten Jahre bereits mit neuerer Software bestückt sein, die den Übergangs-IPv6-Adress-Standardtyp AAAA unterstützt (der neueste Standardtyp - A6 genannt - wird nur von BIND9 und höheren Versionen unterstützt und ist daher noch nicht allzu verbreitet. Ebenfalls nicht unterstützt wird die root Domain IP6.ARPA). Ein einfacher Test zum überprüfen der IPv6 Adress-Auflösung ist: -Die Ausgabe des Tests sollte etwa wie folgt sein: - -IPv6 kompatible Telnet Client-Programme -IPv6 kompatible Clients sind verfügbar. Ein einfacher Test sieht wie folgt aus: -Wird ein Text wie “cannot resolve hostname” ausgegeben, dann unterstützt der Telnet Client keine IPv6 Adressen. -IPv6 kompatible ssh Client-Programme - -openssh -Aktuelle openssh-Versionen sind IPv6 kompatibel. Abhängig von der Konfiguration vor der Kompilierung gibt es zwei unterschiedliche Verhaltensweisen: ---without-ipv4-default: Der Client versucht zuerst eine IPv6-Verbindung. Misslingt dies, wird eine IPv4-Verbindung aufgebaut--with-ipv4-default: standardmäßig wird eine IPv4-Verbindung aufgebaut. Eine IPv6-Verbindung muss, wie unten im Beispiel zu sehen ist, erzwungen werden: -Falls ihr ssh Client-Programm die Option “-6” nicht kennt, dann ist das Programm nicht IPv6 fähig. Dies ist bei den meisten ssh Paketen der Version 1 der Fall. -ssh.com -SSH.com's SSH Client und Server sind ebenfalls IPv6 kompatibel und darüber hinaus handelt es sich um freie Programme für die Linux- und FreeBSD-Plattform, unabhängig davon, ob sie zu kommerziellem oder zu persönlichen Zweck verwendet werden. -IPv6 kompatible Web-Browser -Einen aktuellen Statusüberblick zum Thema IPv6 kompatible Web-Browser ist unter Current Status of IPv6 Support for Networking Applications - HTTP verfügbar. -Die meisten Browser haben zurzeit noch ungelöste Probleme -Ist ein IPv4 Proxy in den Einstellungen eingetragen, dann werden IPv6 Anfragen zum Proxy gesendet. Der Proxy kann keine IPv6 Anfragen verstehen und somit scheitert die Anfrage. Lösung: Proxy Software aktualisieren (siehe weiter unten).Automatik-Einstellungen des Proxy (*.pac) können aufgrund ihrer Beschaffenheit nicht derart erweitert werden, dass sie IPv6 Anfragen anders handhaben (z.B. kein Proxy verwenden) können (Sie sind in Javaskript geschrieben und ziemlich hard coded in den Quellen verankert; z.B. Mozilla Quellcode).Ältere Browser-Versionen verstehen ebenfalls keine URL mit IPv6 Adressen wie z.B. http://[2001:4dd0:f838:a006::6]/, IPv6-Addresse von http://www.ipv6.bieringer.de/ (die angegebene URL funktioniert nur mit einem IPv6 kompatiblen Browser!). -Ein kleiner Test ist diese URL mit einem gegebenen Browser und ohne Proxy zu verwenden. -URLs zum testen -Ein guter Ausgangspunkt zum Betrachten von Webseiten mit IPv6 ist http://www.kame.net/. Ist die Schildkröte animiert, dann ist Verbindung mittels IPv6 Verbindung zustande gekommen, andererseits bleibt die Schildkröte statisch. -Andere Test-Server sind z.B. -What Is My IPv6ip.bieringer.deIPv6 Testtest-ipv6.comThe ICSI NetalyzrSpeedtest Comcast, IPv6 Speedtest Comcast -IPv6 kompatible Server -In diesem Teil des HOWTOs wird stärker auf Client-spezifische Belange eingegangen. Folglich sei zu IPv6 kompatiblen Servern wie sshd, httpd, telnetd usw. auf diese Stelle verwiesen: Hints for IPv6-enabled daemons. -<!-- anchor id="faq-ipv6-ready-system-check" -->FAQ (IPv6 Systemcheck) - -Anwendung diverser Tools - -Q: ping6 zu einer link-lokalen Adresse funktioniert nicht -Fehlermeldung: "connect: Invalid argument" -Der Kernel hat keine Kenntnis darüber, welchen physikalischen oder virtuellen Link Sie zum versenden von ICMPv6 Paketen verwenden möchten. Aus diesem Grund wird die Fehlermeldung ausgegeben. -Lösung: Spezifizieren Sie den Link, z.B.: “ping6 -I eth0 fe80::2e0:18ff:fe90:9205”. Siehe auch program ping6 usage. -Q: ping6 oder traceroute6 funktioniert nicht als normaler Benutzer -Fehlermeldung: “icmp socket: Operation not permitted -Diese Tools erzeugen spezielle ICMPv6 Pakete und versenden diese unter Verwendung von raw sockets im Kernel. Raw sockets können aber nur vom Benutzer “root” verwendet werden. Normale Benutzer bekommen aus diesem Grund diese Fehlermeldung. - -Lösung: Wenn wirklich alle Benutzer auf diese Tools zugreifen sollen, können Sie dies mit setzen des “suid” bits mittels “chmod u+s / path/to/program” erreichen (siehe auch program ping6 usage). Falls nicht alle Benutzer das Programm benötigen, können Sie die Gruppenzugehörigkeit des Programms ändern, z.B. Gruppe “wheel”. Fügen Sie alle Benutzer zu dieser Gruppe hinzu und entfernen Sie das execution bit für andere Benutzer mittels “chmod o-rwx /path/to/program”. Alternativ können Sie auch “sudo” dazu verwenden, um Ihren Sicherheitsbestimmungen Rechnung zu tragen. -<!-- anchor id="chapter-configuration-interface" -->Interface-Konfiguration - -Unterschiedliche Netzwerk-Geräte -Ein Knoten besitzt mehrere Netzwerk-Devices, die in Klassen zusammengefasst werden können: -Physikalische Devices wie eth0, tr0Virtuelle Devices wie ppp0, tun0, tap0, sit0, isdn0, ippp0 -Physikalische Devices -Physikalische Interfaces wie Ethernet oder Token-Ring bedürfen keiner speziellen Handhabung. -Virtuelle Devices -Virtuelle Interfaces hingegen benötigen immer eine spezielle Konfiguration. -IPv6-in-IPv4 Tunnel Interfaces -Diese Interfaces werden sitx genannt. Der Name sit ist eine Abkürzung für Simple Internet Transition. Das Gerät hat die Fähigkeit IPv6 Pakete in IPv4 Pakete zu verkapseln und diese dann über einen Tunnel zum entfernten Endpunkt zu transportieren. -sit0 hat eine spezielle Bedeutung: dieses Interface kann nicht für fest zugeordnete Tunnel verwendet werden. -PPP Interfaces -PPP Interfaces beziehen ihre IPv6 Funktionalität von einem IPv6 kompatiblen PPP Daemon. -ISDN HDLC Interfaces -Für HDLC mit IP encapsulation ist die IPv6 Funktionalität bereits im Kernel integriert. -ISDN PPP Interfaces -ISDN PPP Interfaces (ippp) werden durch den Kernel nicht mit IPv6 Funktionalität unterstützt. Es gibt auch keine Pläne hierfür, da im Kernel 2.5.+ dieser Interface-Typ durch eine allgemeinere ppp Interface Schicht ersetzt werden soll. -SLIP + PLIP -Wie bereits erwähnt, unterstützen diese Interfaces keinen IPv6 Transport (senden ist ok, das abfertigen ankommender Pakete funktioniert jedoch nicht). -Ether-tap Device -Ether-tap Devices sind IPv6 kompatibel und als stateless konfiguriert. Für den Gebrauch muss das Modul “ethertap” geladen werden. -tun Device -Nicht von mir getestet... -ATM -01/2002: ATM wird vom Standard-Kernel nicht, jedoch aber durch die USAGI-Erweiterungen unterstützt. -Sonstige -Wurde ein Interface vergessen...? -Interfaces ein/aus-schalten -Es gibt zwei Methoden, ein Interface ein- oder auszuschalten. -Verwendung von "ip" -Gebrauch: - up -# ip link set dev down -]]>Beispiel: - -Verwendung von "ifconfig" -Gebrauch: - up -# /sbin/ifconfig down -]]>Beispiel: - -<!-- anchor id="chapter-configuration-address" -->IPv6 Adressen konfigurieren -Es gibt verschiedene Methoden zum konfigurieren einer IPv6 Adresse eines Interfaces. Sie können "ifconfig" oder "ip" dazu einsetzen. -Bestehende IPv6 Adressen anzeigen -Zuerst sollten sie überprüfen, ob und welche IPv6 Adressen bereits konfiguriert sind (etwa durch automatischer stateless Konfiguration). -Achtung: Adressen beginnend mit “fec0” sind obsolet, hier aber noch der Vollständigheit wegen gezeigt! -Verwendung von "ip" -Anwendung: - -]]>Beispiel für einen statisch konfigurierten Host: -Just note that addresses beginning with “fec0” are deprecated! -Beispiel für einen automatisch konfigurierten Host. -Hier sehen Sie einige automatisch konfigurierte IP Adressen und deren Lebensdauer. - -Verwendung von "ifconfig" -Anwendung: - -]]>Hier sehen Sie verschiedene IP Adressen mit unterschiedlichen Gültigkeitsbereichen (die Ausgabe wurde mit grep gefiltert) - -Hinzufügen einer IPv6 Adresse -Die Vorgehensweise beim hinzufügen einer IPv6 Adresse ist vergleichbar mit dem "IP ALIAS"-Mechanismus bei IPv4 adressierten Interfaces. -Verwendung von "ip" -Anwendung: -/ dev -]]>Beispiel: - -Verwendung von "ifconfig" -Anwendung: - inet6 add / -]]>Beispiel: - -IPv6 Adressen entfernen -Diese Funktion wird selten benötigt. Vorsicht ist beim entfernen nicht existenter IPv6 Adressen geboten, da ältere Kernel dieses Fehlverhalten manchmal mit einem Crash quittieren. -Verwendung von "ip" -Anwendung: -/ dev -]]>Beispiel: - -Verwendung von "ifconfig" -Anwendung: - inet6 del / -]]>Beispiel: - -Automatische IPv6-Adress-Konfiguration -Im Fall, dass ein Endgerät ein Router Advertisement empfängt und der Host kein Router ist, konfiguriert sich das Endgerät selbst eine IPv6-Adresse entsprechend dem Präfix aus dem Router Advertisement (siehe auch ). -Aktivieren der Privacy Extension -Privacy Extension wie beschrieben in RFC 4941 / Privacy Extensions for Stateless Address Autoconfiguration in IPv6 (Nachfolger von RFC 3041) ersetzt die statische Interface ID (mostly basierend auf der weltweit eindeutigen MAC-Adresse), die bei der Autokonfiguration benutzt wird, durch eine pseudo-random und von Zeit zu Zeit neu generierte. -Aktivieren von Privacy Extension mit Hilfe von sysctl -Temporäre Aktivierung -Einschalten der Privacy Extension für z.B. Interface “eth0” und zudem Präferieren dieser Adresse: -Zur Aktivierung ist der Restart des Interfaces notwendig -Nach Empfang eines Router Advertisement sollte das Interface eine entsprechende Adresse sich selbst konfiguriert haben - mtu 1500 qlen 1000 - inet6 2001:db8:0:1:8992:3c03:d6e2:ed72/64 scope global secondary dynamic <- pseudo-random IID - valid_lft 604711sec preferred_lft 86311sec - inet6 2001:db8:0:1::224:21ff:fe01:2345/64 scope global <- IID based on MAC - valid_lft 604711sec preferred_lft 86311sec - ... -]]>Permanente Aktivierung -Für eine permanente Aktivierung muss entweder ein spezieller Initscript-Wert pro Interface gesetzt sein oder ein entsprechender Wert in /etc/sysctl.conf definiert werden: -Achtung: das Interface muss zu diesem Zeitpunkt bereits existieren. Wenn das nicht der Fall ist (z.B. nach einem Reboot) musses für alle Interfaces konfiguriert werden: -Die Änderungen in /etc/sysctl.conf können im laufenden Betrieb geändert werden, aber zur wirklichen Aktivierung wird mindestens wird ein Interface-Restart (down/up) oder ein Reboot benötigt. - -Aktivieren von Privacy Extension mit Hilfe des NetworkManager -Moderne (Client-) Systeme nutzen NetworkManager zur Interface-Konfiguration. Ein Kommandozeilen-Werkzeug ist eingebaut welches auch Parameter ändern kann, die in der GUI nicht verfügbar (oder sichtbar) sind. -Beispiele basieren auf Version 0.9.9.1-5.git20140319.fc21 -Prüfen existierender Interfaces mit: -Menge von IPv6-Adressen mit Privacy Extension: -Aktuelle Einstellung der IPv6 Privacy Extension für ein Interface: -Aktivieren der IPv6 Privacy Extension und Restart des Interfaces; -Neuer Wert der IPv6 Privacy Extension prüfen: -Nun sollten auch IPv6 Privacy Extension Adressen automatisch konfiguriert sein - -Test zur Benutzung von Privacy Extension IPv6-Adressen -Ob die IPv6-Adresss mit einer durch die Privacy Extension generierte Interface ID für ausgehende Verbindungen wirklich benutzt wird, kann z.B. mit Hilfe eines Web-Browers durch Aufruf von http://ip.bieringer.de/ durchgeführt werden. Wenn EUI64_SCOPE als Ausgabe “iid-privacy” zeigt, dann funktioniert alles richtig. -<!-- anchor id="chapter-configuration-route" -->Konfiguration normaler IPv6-Routen -Wenn Sie Ihren lokalen Link verlassen und Pakete in das weltweite IPv6-Internet versenden wollen, dann benötigen Sie Routing. Wenn sich bereits ein IPv6 fähiger Router an Ihrem Link befindet, dann reicht eventuell das Hinzufügen von IPv6 Routen. -Achtung: Adressen beginnend mit “fec0” sind obsolet, hier aber noch der Vollständigheit wegen gezeigt! -Bestehende IPv6-Routen anzeigen -Zuerst sollten sie überprüfen, ob und welche IPv6 Adressen bereits konfiguriert sind (etwa durch automatischer Konfiguration). -Verwendung von "ip" -Anwendung: -] -]]>Beispiel: - -Verwendung von "route" -Anwendung: -Sie sehen hier mehrere IPv6 Routen mit unterschiedlichen Adressen eines einzelnen Interfaces (bei der Ausgabe wurde das Interface eth0 herausgefiltert). - -Eine IPv6-Route über ein Gateway hinzufügen -Eine Route wird meistens benötigt, um mit IPv6 die Außenwelt über einen IPv6 fähigen Router und über Ihren Link zu erreichen. -Verwendung von "ip" -Anwendung: -/ via -¬ [dev ] -]]>Beispiel: - -Verwendung von "route" -Anwendung: -/ gw -¬ [dev ] -]]>Die optionale Angabe eines Devices wird dann benötigt, wenn die IPv6 Adresse des Gateways eine lokale Link-Adresse ist. -Im folgenden Beispiel wird eine Route für alle Adressen (default) über das Gateway 2001:0db8:0:f101::1 hinzugefügt. - -Eine IPv6-Route über ein Gateway entfernen -Das manuelle entfernen einer Route wird nicht oft benötigt, meistens wird dies automatisch durch Netzwerk-Konfigurationsscripts beim herunterfahren (des Betriebssystems oder eines Interfaces) bewirkt. -Verwendung von "ip" -Anwendung: -/ via -¬ [dev ] -]]>Beispiel: - -Verwendung von "route" -Anwendung: -/ gw [dev -¬ ] -]]>Beispiel zum entfernen der im obigen Beispiel hinzugefügten Route: - -Eine IPv6-Route über ein Interface hinzufügen -Diese Funktion wird manchmal im Fall dedizierter Punkt-zu-Punkt Verbindungen verwendet, in der Regel aber eher selten benötigt. -Verwendung von "ip" -Anwendung: -/ dev -¬ metric 1 -]]>Beispiel: -Der Metrik-Wert “1” wird verwendet, um mit dem Metrik Wert von route kompatibel zu sein; der Standard-Metrik-Wert von “ip” ist “1024”. -Verwendung von "route" -Anwendung: -/ dev -]]>Beispiel: - -Eine IPv6-Route über ein Interface entfernen -Dies wird manuell nicht so oft benötigt, jedoch aber beim herunterfahren von Konfigurationsscripts benutzt. -Verwendung von "ip" -Anwendung: -/ dev -]]>Beispiel: - -Verwendung von "route" -Anwendung: -/ dev -]]>Beispiel: - -FAQ für IPv6-Routen - -Unterstützung einer IPv6 Default-Route -Ein Schwerpunkt bei IPv6 ist das hierarchische Routing. Aus diesem Grund werden in Routern nur wenige Routing-Einträge benötigt. -Einige Punkte sind im aktuellen Kernel zu beachten: -Clients (kein Routing eines Paketes!) -Ein client kann eine Default Route (z.B. “::/0” ) einrichten, diese aber auch durch automatische Konfiguration, z.B. mit radvd, erlernen: - -Router & Paketweiterleitung -Ältere Linux Kernel ( zumindest <= 2.4.17) unterstützen keine Default Routen. Man kann dies einrichten, aber die Abfrage dieser Route misslingt im Fall, dass ein Paket weitergeleitet werden soll ( normaler Zwecke eines Routers). -Falls ein entsprechender Kernel noch verwendet wird, kann “default routing” eingerichtet werden, wenn hierbei das einzig globale Adress-Präfix “2000::/3” verwendet wird. -Anmerkung: Walten Sie mit Vorsicht bei der Anwendung von default routing auf exponierten Routern, wenn keine Adressfilterung eingesetzt wird. Andernfalls kann Multicast- oder lokaler Site-Datenverkehr den Router ungewollt verlassen. -<!-- anchor id="chapter-Neighbor-Discovery" -->Neighbor Discovery -Die Neighbor Discovery (Ermittlung der Netzwerkumgebung) ist der IPv6 Nachfolger für das ARP (Address Resolution Protocol) bei IPv4. Sie können Informationen über die aktuelle Netzwerkumgebung gewinnen, Einträge erstellen und entfernen. -Der Kernel merkt sich erfolgreich gelernte “Nachbarn” (wie ARP in IPv4). Sie können die gelernten Einträge mit “ip” einsehen. -Netzwerkumgebung mit “ip” anzeigen -Mit dem folgenden Befehl können Sie die gelernten oder konfigurierten IPv6 Nachbarn anzeigen: -] -]]>Das folgende Beispiel zeigt einen Nachbar, einen erreichbaren Router: - -Tabelle der Netzwerkumgebung mit “ip” editieren - -Eintrag manuell hinzufügen -Mit folgendem Befehl können Sie einen Eintrag manuell hinzufügen: - lladdr dev -]]>Beispiel: - -Eintrag manuell entfernen -Sie können einen Eintrag auch löschen: - lladdr dev -]]>Beispiel: - -Erweiterte Einstellungen -Das Tool “ip” ist weniger ausführlich dokumentiert, dennoch ist es sehr mächtig. Sehen Sie online mit “help” für weitere Details: -Es sieht aus, als seien manche Optionen ausschließlich für IPv4 gedacht... Es wird um Ihre Mithilfe gebeten, wenn Sie Informationen zu Optionen und der erweiterten Anwendung beisteuern können. -<!-- anchor id="chapter-configuring-ipv6-in-ipv4-tunnels" -->Konfiguration eines IPv6-in-IPv4 Tunnels -Wenn zum Verlassen des lokalen Netzwerks keine native IPv6-Anbindung vorhanden ist, wird zum Erreichen des weltweiten IPv6 Internet ein IPv6-in-IPv4 Tunnel benötigt. -Es gibt unterschiedliche Tunnel-Mechanismen sowie einige Möglichkeiten zum Einrichten eines Tunnels. -Tunnelarten -Es steht Ihnen mehr als eine Möglichkeit zur Verfügung, IPv6 Pakete über ausschließliche IPv4 Links zu tunneln. -Statische Punkt-zu-Punkt Tunnel -Ein Punkt-zu-Punkt Tunnel ist ein dedizierter Tunnel zu einem Endpunkt, der Kenntnis über das lokale IPv6 Netzwerk (für das Routing zurück...) und die IPv4 Adresse des Tunnel-Endpunktes verfügt. Definition des Punkt-zu-Punkt Tunnels siehe: RFC 4213 / Basic Transition Mechanisms for IPv6 Hosts and Routers. Anforderungen: -Die IPv4 Adresse des lokalen Tunnel-Endpunktes muss statisch sein, global eindeutig und vom entfernten Tunnel-Endpunkt aus erreichbar sein. - -Wenn keine statische IPv4 Addresse verfügbar ist, muß der Tunnel-Provider die Authentifizerung der dynamischen IPv4 Addresse unterstützen, wie z.B. SixXS / AICCU oder gogo6.Sie müssen ein globales IPv6 Präfix zugewiesen bekommen haben. - -Es ist auch möglich, daß zusätzliche IPv6 Netzwerke über diesen Tunnel geroutet werden.Ein entfernter Tunnel-Endpunkt muss dazu in der Lage sein, ihr IPv6 Präfix bis zu Ihrem lokalen Tunnel-Endpunkt zu routen (wobei meistens manuelle Konfiguration notwendig wird).Statische Tunnelprovider: -Hurricane ElectricSixXS -Automatische Tunnel -Automatisches Tunneln tritt dann ein, wenn ein Knoten direkt einen anderen Knoten (dessen IPv4-Adresse er zuerst kennen lernen muss) über die IPv4-mapped IPv6-Adresse anspricht - dieser Mechanismus sollte nicht mehr unterstützt werden, weil er sehr unsicher ist. -<!-- anchor id="tunneling-6to4." -->6to4 Tunnel -6to4 Tunnel (RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds) verwenden einen einfachen Mechanismus zum erstellen eines automatischen Tunnels. Jeder Knoten mit einer weltweit einmaligen IPv4 Adresse kann zu einem 6to4 Tunnel-Endpunkt gemacht werden (solange keine IPv4-Firewall den Verkehr unterbindet). Ein 6to4 Tunnel ist zumeist kein one-to-one Tunnel. In diesem Fall wird das Untertunneln in einen Upstream- und einen Downstream-Tunnel unterteilt. Ferner zeigt eine spezielle IPv6 Adresse an, dass der Knoten einen 6to4 Tunnel für die Verbindung zum weltweiten IPv6 Netzwerk verwendet. -Erstellen eines 6to4 Präfixes -Die 6to4 Adresse wird wie folgt definiert (Schema ist dem RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds entnommen): -FP und TLA zusammen haben den Wert 0x2002. V4ADDR ist die weltweit einmalige IPv4 Adresse des Knoten (in hexadezimaler Notation). Mit dem SLA wird das Subnetz identifiziert (65536 lokale Subnetze sind möglich) und benutzbar, um die lokale Netzwerstruktur abzubilden. -Für Gateways wird dieser Präfix normalerweise mit dem SLA “0000” definiert und dem 6to4 Tunnel-Interface das Suffix “::1” (kann aber auch ein beliebiger mit local-scope sein) zugewiesen. Zu bemerken ist, dass Microsoft Windows als Suffix auch immer die V4ADDR einsetzt. -6to4 Tunnel zum Upstream -Der Knoten muss die Kenntnis darüber haben, an welchen entfernten Tunnel-Endpunkt die in IPv4 Paketen eingeschlossenen IPv6 Pakete gesendet werden sollen. In den “Anfängen” der 6to4 Tunnel-Anwendung wurden dedizierte Upstream akzeptierende Router definiert. Liste der Router siehe: NSayer's 6to4 information. -Heute können Upstream Router automatisch mittels der anycast Adresse 192.88.99.1 gefunden werden. Routing Protokolle sind für die Verarbeitung im Hintergrund zuständig, siehe RFC 3068 / An Anycast Prefix for 6to4 Relay Routers für weitere Details. -6to4 Tunnel zum Downstream -Der Downstream (6bone -> Ihr 6to4 fähiger Node) ist nicht wirklich fix, er kann von jenem Host variieren, an dem ursprünglich die Pakete gesendet wurden. Es gibt zwei Möglichkeiten: -Der entfernte Host benutzt 6to4 und sendet die Pakete direkt an den lokalen Knoten zurück (siehe unten).Der entfernte Host sendet die Pakete zurück an das weltweite IPv6 Netzwerk, und abhängig vom dynamischen Routing, erstellt dann ein Relay-Router eines ISPs, der 2002::/16 via BGP kundgibt, automatisch zum lokalen Knoten einen Tunnel. -Möglicher 6to4 Verkehr - -Vom 6to4 zum 6to4: der Tunnel entsteht normalerweise direkt zwischen den beiden 6to4 fähigen Hosts.Vom 6to4 zum non-6to4: Der Datenstrom wird mittels Upstream-Tunnel versendet.Vom non-6to4 zum 6to4: Der Datenstrom wird mittels Downstream-Tunnel versendet.Achtung, durch das mögliche asymmetrische Routing können Probleme mit defekten 6to4-Relays schwer zu diagnostizieren sein. -UDP gekapselte IPv6 Tunnels -UDP gekapseltes IPv6 Tunneling wird üblicherweise benutzt, wenn am internen Endpunkt keine globale IPv4 Addresse verfügbar ist, aber via Network Adress Translation (NAT) noch entsprechende Endpunkte im Internet mit Hilfe unten beschriebener UDP Ports erreichbar sind. -Teredo Tunnel -RFC 4380 / Teredo: Tunneling IPv6 over UDP through Network Address Translationsbeschreibt das Tunneln von IPv6 Pakete über IPv4 UDP Pakete (Bubbles), siehe auch Wikipedia / Teredo. Üblicherweise benutzt es 3544/udp. Der Client für Linux heißt miredo und ist benutzbar ohne große Konfiguration. Über diese Tunnelmethode kann nur ein einzelner Client an das globale IPv6-Netzwerk angeschlossen werden. -AYIYA Tunnel -Tunnel provider SixXS bietet auch einen IPv6-in-UDP-in-IPv4 (5072/udp) Tunnel an, zur Nutzung muss der Modus AYIYA aktiviert werden. -gogo6 Tunnel -Tunnel provider gogo6 bietet auch einen IPv6-in-UDP-in-IPv4 (3653/udp) Tunnel an, zur Nutzung muss der Modus v6udpv4 aktiviert werden. -Bestehende Tunnel anzeigen - -Verwendung von "ip" -Anwendung: -] -]]>Beispiel: - -Verwendung von "route" -Anwendung: -Beispiel (Ausgabe wurde derart gefiltert, dass nur Tunnels über das virtuelle Interface sit0 angezeigt werden): - -<!-- anchor id="conf-ipv6-in-ipv4-point-to-point-tunnels" -->Einrichtung eines Punkt-zu-Punkt Tunnels -Es gibt drei Methoden ein Punkt-zu-Punkt Tunnel hinzuzufügen bzw. zu entfernen. -Eine gute Informationsquelle zum Thema Tunnel-Einrichtung mit “ip” ist folgender Artikel: Configuring tunnels with iproute2 (article) (Spiegel). -Einen Punkt-zu-Punkt Tunnel hinzufügen - -Verwendung von "ip" -Bei einer kleinen Anzahl von Tunnels ist die Verwendung von “ip” zurzeit die Standardmethode. -Beispiel für das Erstellen eines Tunnel-Devices (das Device wird aber hiermit nicht aktiviert; ebenso muss ein TTL Wert spezifiziert werden, da der Standardwert 0 ist): - mode sit ttl remote -¬ local -]]>Anwendung (drei allgemeine Beispiele): - 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 -]]> -Verwendung von "ifconfig" und "route" (nicht empfehlenswert) -Diese Methode zum Hinzufügen eines Tunnels wird nicht empfohlen, da Ungereimtheiten auftreten. Es gibt keine Probleme, wenn nur ein Tunnel hinzugefügt wird. Werden hingegen mehrere Tunnel hinzugefügt, dann kann der erste Tunnel nicht einfach deaktiviert werden, wenn die restlichen Tunnel aktiviert bleiben sollen. -Anwendung (drei allgemeine Beispiele): - -# /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 -]]>WICHTIG: NICHT VERWENDEN! Mit diesem Setup wird von überall aus dem Internet das "automatische Tunneln" vorbehaltlos aktiviert. Das ist ein unnötiges Risiko. -Verwendung allein von "route" -Sie können einen Tunnel auch im NBMA-Stil (Non Broadcast Multiple Access) einrichten. Bei dieser Vorgehensweise können Sie sehr einfach mehrere Tunnels zugleich einrichten, aber kein Tunnel kann nummeriert werden (und das ist ein kein benötigtes Feature). -Anwendung (drei allgemeine Beispiele): - gw -¬ :: dev sit0 -# /sbin/route -A inet6 add gw -¬ :: dev sit0 -# /sbin/route -A inet6 add gw -¬ :: dev sit0 -]]>WICHTIG: NICHT VERWENDEN! Mit diesem Setup wird von überall aus dem Internet das "automatische Tunneln" vorbehaltlos aktiviert. Das ist ein unnötiges Risiko. -Punkt-zu-Punkt Tunnel entfernen -Diese Funktion wird selten manuell durchgeführt. Skripte verwenden diese Funktion zum sauberen deaktivieren bzw. beim Neustart einer IPv6 Konfiguration. -Verwendung von "ip" -Entfernen eines Tunnel-Devices: - -]]>Anwendung (drei allgemeine Beispiele): - 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 -]]> -Verwendung von "ifconfig" und "route" (nicht empfehlenswert, da unbequem) -Nicht nur bei der Erstellung eines Tunnels kommt es zu Ungereimtheiten, sondern auch bei dessen Entfernung. Die Tunnel müssen in umgekehrter Reihenfolge wieder entfernt werden, d.h. der zuletzt erstellte Tunnel muss als Erster entfernt werden... -Anwendung (drei allgemeine Beispiele): - dev sit3 -# /sbin/ifconfig sit3 down - -# /sbin/route -A inet6 del dev sit2 -# /sbin/ifconfig sit2 down - -# /sbin/route -A inet6 add dev sit1 -# /sbin/ifconfig sit1 down - -# /sbin/ifconfig sit0 down - -]]> -Verwendung von "route" -Die Vorgehensweise ist vergleichbar mit dem löschen einer normalen IPv6 Route. -Anwendung (drei allgemeine Beispiele): - gw -¬ :: dev sit0 -# /sbin/route -A inet6 del gw -¬ :: dev sit0 -# /sbin/route -A inet6 del gw -¬ :: dev sit0 - -# /sbin/ifconfig sit0 down -]]> -Nummerierte Punkt-zu-Punkt Tunnel -Manchmal ist es notwendig, einen Punkt-zu-Punkt Tunnel mit IPv6 Adresse genauso einzurichten, wie heute bei IPv4. Dies ist nur mit der ersten (ifconfig+route - nicht empfehlenswert) sowie mit der dritten (ip+route) beschriebenen Methode zur Einrichtung eines Tunnels möglich. Bei diesen Fällen können Sie den Tunnel-Interfaces die IPv6 Adressen, wie im Abschnitt zur Interface-Konfiguration beschrieben, hinzufügen. -<!-- anchor id="configuring-ipv6to4-tunnels" -->Einrichtung von 6to4 Tunnel -Beachten sie Bitte, dass 6to4 Tunnel im Standard-Kernel der Serie 2.2.x (siehe systemcheck/kernel) nicht unterstützt werden. Weiter ist zu beachten, dass die Präfix-Länge für 6to4 Adressen 16 ist, da sich aus Perspektive des Netzwerks betrachtet, alle anderen 6to4 Hosts sich in der gleichen Schicht 2 befinden. -6to4 Tunnel hinzufügen -Zu Anfang müssen Sie Ihre 6to4 Präfix-Länge mittels der lokal zugewiesenen global routbaren IPv4 Adresse berechnen (sollte ihr Host keine global routebare IPv4 Adresse haben, dann ist unter speziellen Bedingungen NAT auf dem Border Gateway möglich): -Angenommen, Ihre IPv4 Adresse ist: -Dann ist das daraus resultierende 6to4 Präfix: -Lokalen 6to4 Gateways sollte immer (ist aber kein Muss, ein beliebiger local-scope Suffix kann benutzt werden) das Suffix “::1” zugewiesen werden. Daraus resultierend ergibt sich Ihre lokale 6to4 Adresse: -Zum automatischen Erstellen der Adresse können Sie folgenden Befehl nutzen: -Es gibt nun zwei Möglichkeiten einen 6to4 Tunnel einzurichten. -Verwendung von "ip" und einem dedizierten Tunnel-Device -Die empfohlene Vorgehensweise (der Wert TTL muss angegeben werden, da der Standardwert 0 ist): -Erstellen eines neues Tunnel-Device: - remote any local -¬ -]]>Interface aktivieren: -Eine lokale 6to4 Adresse am Interface hinzufügen (Hinweis: Präfix-Länge 16 ist wichtig!) -/16 dev tun6to4 -]]>Hinzufügen der (Standard-) Route zum globalen IPv6 Netz unter Verwendung der all-6to4-routers IPv4 anycast Adresse: -Manche Versionen von “ip” (z.B. SuSE Linux 9.0) unterstützen keine IPv4-kompatiblen IPv6-Adressen für Gateways, in diesem Fall muss die entsprechende IPv6-Adresse benutzt werden: - -Verwendung von "ifconfig" und "route" sowie einem generischen Tunnel-Device "sit0" (nicht empfehlenswert) -Diese Vorgehensweise wird nicht empfohlen, da bei Verwendung des allgemeinen Tunnel Device sit0 keine Filter-Spezifizierung pro Device ermöglicht wird. -Das allgemeine Tunnel Interface sit0 aktivieren: -Dem Interface eine lokale 6to4 Adresse hinzufügen: -/16 -]]>Hinzufügen der (Standard-) Route zum globalen IPv6 Netz unter Verwendung der all-6to4-routers IPv4 anycast Adresse: - -6to4 Tunnel entfernen - -Verwendung von "ip" und einem dedizierten Tunnel-Device -Entfernen aller Routen über dieses bestimmten Tunnel Devices: -Interface deaktivieren: -Ein erstelltes Tunnel Device entfernen: - -Verwendung von "ifconfig" und "route" sowie einem generischen Tunnel-Device "sit0" (nicht empfehlenswert) -Entfernen der (Standard-) Route über ein 6to4 Tunnel Device: -Eine 6to4 Adresse des Interfaces entfernen: -/16 -]]>Ein allgemeines Tunnel Device deaktivieren (aber Achtung, eventuell ist das Interface noch in Verwendung...) - -<!-- anchor id="chapter-configuring-ipv4-in-ipv6-tunnels" -->Konfiguration eines IPv4-in-IPv6 Tunnels -RFC 2473 / Generic Packet Tunneling in IPv6 Specification spezifiziert den Mechanismus, um unterschiedliche Pakettypen (einschließlich IPv4) über IPv6 zu tunneln. -ANMERKUNG: Unterstützung für IPv4-in-IPv6 Tunnel ist erst seit Kernel Version 2.6.22 verfügbar. -Anzeigen von existierenden Tunnels -Anwendung: -] -]]>Beispiel: -ANMERKUNG: wenn "mode any" nicht angegeben wird, werde nur IPv6-in-IPv6 Tunnels angezeigt. -Konfiguration eines Punkt-zu-Punkt Tunnels -Anwendung für die Erzeugung einer 4over6 Tunnel-Schnittstelle (welche danach aber noch nicht aktiv ist) - mode ip4ip6 remote local -]]>Anwendung (allgemeines Beispiel für drei Tunnels): - local -# /sbin/ip link set dev ip6tnl1 up -# /sbin/ip -6 route add dev ip6tnl1 metric 1 - -# /sbin/ip -6 tunnel add ip6tnl2 mode ip4ip6 remote local -# /sbin/ip link set dev ip6tnl2 up -# /sbin/ip -6 route add dev ip6tnl2 metric 1 - -# /sbin/ip -6 tunnel add ip6tnl3 mode ip4ip6 remote local -# /sbin/ip link set dev ip6tnl3 up -# /sbin/ip -6 route add dev ip6tnl3 metric 1 -]]> -Löschen von Punkt-zu-Punkt-Tunnels -Anwendung für das Löschen einer Tunnel-Schnittstelle: - -]]>Anwendung (allgemeines Beispiel für drei Tunnels): - dev ip6tnl1 -# /sbin/ip link set ip6tnl1 down -# /sbin/ip -6 tunnel del ip6tnl1 - -# /sbin/ip -6 route del dev ip6tnl2 -# /sbin/ip link set ip6tnl2 down -# /sbin/ip -6 tunnel del ip6tnl2 - -# /sbin/ip -6 route del dev ip6tnl3 -# /sbin/ip link set ip6tnl3 down -# /sbin/ip -6 tunnel del ip6tnl3 -]]> -<!-- anchor id="chapter-kernel-settings" -->Kernel-Einstellungen im /proc-Dateisystem -Anmerkung: Dieses Kapitel basiert großteils auf der Datei “ip-sysctl.txt”, welche in den aktuellen Kernel-Quellen im Verzeichnis “Documentation/networking” zu finden ist. Danke an dieser Stelle an Pekka Savola, der den IPv6 relevanten Inhalt dieser Datei wartet und betreut. Ebenso sei erwähnt, dass einige Textstellen hieraus mehr oder weniger mit Copy & Paste in dieses Dokument übernommen wurden. -Zugriff auf das /proc-Dateisystem - -Verwendung von "cat" und "echo" -Mit “cat” und “echo” können Sie am einfachsten das /proc Dateisystem einsehen. Hierfür gibt es aber einige Voraussetzungen, die erfüllt sein müssen: -Das /proc-Dateisystem muss im Kernel aktiviert sein. Hierfür muss die folgende Einstellung beim kompilieren des Kernels vorgenommen werden: - -Das /proc-Dateisystem muss zuerst gemountet sein. Dies kann wie folgt getestet werden: - -Sie benötigen Lese- und manchmal auch Schreib-Zugriff (normalerweise nur als Root-Benutzer) auf das /proc-Dateisystem.Normalerweise sind, mit Ausnahme in /proc/sys/*, alle Einträge ausschließlich mit Leserechten ausgestattet. Die Einträge werden zum Zweck der Informationsgewinnung verwendet. -Wert anzeigen -Den Inhalt eines Eintrags können sie mit “cat” anzeigen: - -Wert einstellen -Mit “echo” können sie einen neuen Wert zuweisen (nur wenn der Eintrag beschreibbar ist): -/proc/sys/net/ipv6/conf/all/forwarding -]]> -Verwendung von "sysctl" -Die Verwendung des Programms “sysctl” ist eine zeitgemäße Methode zum Anzeigen der Kernel-Switches. Es funktioniert auch dann, wenn das /proc-Dateisystem nicht gemountet ist, wobei aber nur ein Zugriff auf /proc/sys/* möglich ist! -Das Programm “sysctl” ist (auf Red Hat Linux Systemen) im Paket “procps” enthalten. -Das sysctl-Interface muss im Kernel aktiviert sein. Hierfür muss die folgende Einstellung beim kompilieren des Kernels vorgenommen werden: - -Wert anzeigen -Der Wert eines Eintrags kann nun angezeigt werden: - -Wert einstellen -Ein neuer Wert kann wie folgt zugewiesen werden (wenn der Eintrag beschreibbar ist): -Anmerkung: Verwenden Sie beim setzen eines Wertes keine Leerzeichen vor oder nach dem “=”. Sollten Sie mehrere Werte in einer Zeile angeben, müssen sie diese mit Anführungszeichen umgeben: - -Sonstiges -Anmerkung: Es gibt sysctl-Versionen im Umlauf, die anstelle des Punktes “.” einen slash “/” ausgeben. -Für weitere Details siehe die manpage von sysctl. -Hinweise: Um schnell einen Überblick über die Einstellungen zu bekommen, verwenden Sie einfach die Option “-a” (anzeigen aller Einträge) sowie das Tool “grep”. -Werte im /proc-Dateisystem -Es gibt im /proc-Dateisystem unterschiedliche Formate: -BOOLEAN: einfach eine “0” (falsch) oder eine “1” (wahr)INTEGER: Wert ist eine Ganzzahl (kann auch eine unsigned int sein)Kompliziertere Zeilen mit verschiedenen Werten: manchmal wir eine Header-Zeile mit angezeigt... Sie können aber auch weitere Informationen zu den Werten und deren Bedeutung direkt in den Kernel Quellen beziehen. -<!-- anchor id="proc-sys-net-ipv6." -->Einträge in /proc/sys/net/ipv6/ - -conf/default/* -Ändern der Interface-spezifischen Einstellungen. -conf/all/* -Ändern aller Interface-spezifischen Einstellungen. -Ausnahme: “conf/all/forwarding” hat hier eine andere Bedeutung: -conf/all/forwarding - -Typ: BOOLEANHiermit wird die globale IPv6 Weiterleitung zwischen allen Interfaces aktiviert. -In IPv6 ist kein forwarding per Device möglich. Die Steuerung der Weiterleitung muss mittels IPv6-netfilter Regel-Sets (mit dem Programm ip6tables) und der Bestimmung der Ein- und Ausgabe-Devices (siehe Firewalling/Netfilter6 für Details) vollzogen werden. In IPv4 ist das anders, forwarding per device ist hier möglich (hier wird am Interface, wo das Paket einlangt, die entsprechende Entscheidung getroffen). -Hiermit werden die Host/Router Einstellungen 'forwarding' aller Interfaces eingestellt (auch globales Forwarding genannt). Für weitere Details Siehe unten. -Ist der Wert gleich 0, dann ist IPv6 forwarding deaktiviert. Pakete verlassen in diesem Fall niemals ein anderes Interface (weder physikalische noch logische wie z.B. Tunnel). -conf/interface/* -Spezielle Einstellungen per Interface ändern. -Das funktionale Verhalten einzelner Einstellungen ist davon abhängig, ob lokales forwarding aktiviert ist oder nicht. -accept_ra - -Typ: BOOLEANStandardeinstellung: aktiviert, wenn lokales forwarding deaktiviert ist. Deaktiviert, wenn lokales forwarding aktiviert ist.Router Advertisements werden akzeptiert; das Interface wird mit Status 'received data' automatisch konfiguriert. -accept_redirects - -Typ: BOOLEANStandardeinstellung: aktiviert, wenn lokales forwarding deaktiviert ist. Deaktiviert, wenn lokales forwarding aktiviert ist.Akzeptiert von IPv6 Router gesendete Redirects. -autoconf - -Typ: BOOLEANFunktionale Standardeinstellung: aktiviert, wenn accept_ra_pinfo aktiv ist. Deaktiviert, wenn accept_ra_pinfo deaktiviert ist.Autokonfiguriert Adressen unter Benutzung der Prefix-Information eines Router-Advertisements. -dad_transmits - -Typ: INTEGERStandardwert: 1Die Anzahl der gesendeten Proben zum entdecken von Adress-Duplikaten. -forwarding - -Typ: BOOLEANStandardwert: FALSCH, wenn globale forwarding deaktiviert ist (Standard), ansonst WAHRKonfigurieren von Interface-spezifischem Host/Router-Verhalten. -Anmerkung: Es wird die gleiche Konfiguration für alle Interfaces empfohlen; Gemischte Host/Router-Szenarios sind eher unüblich. -Wert FALSCH: Per Standard wird von einem Host-Verhalten ausgegangen. Das bedeutet: -Der Schalter IsRouter ist bei Router Advertisements nicht aktiviert.Router-Anfragen werden bei Bedarf gesendet.Wenn accept_ra WAHR ist (Standard), dann werden Router Advertisements akzeptiert (und starte die automatische Konfiguration).Wenn accept_redirects WAHR ist (Standard), dann akzeptiere Redirects. -Wert WAHR: Ist lokales forwarding eingeschaltet, dann wird von einem Router-Verhalten ausgegangen. Das bedeutet genau das Gegenteil zu oben: -Der Schalter IsRouter ist bei Router Advertisements aktiviert.Router-Anfragen werden nicht gesendet.Router Advertisements werden ignoriert.Redirects werden ignoriert. -hop_limit - -Typ: INTEGERStandardwert: 64Der Standardwert für das Hop-Limit wird hiermit eingestellt. -mtu - -Type: INTEGERStandardwert: 1280 (Minimumwert in IPv6)Der Standardwert für die Maximum Transfer Unit wird hiermit eingestellt. -router_solicitation_delay - -Typ: INTEGERStandardwert: 1Die Anzahl der nach der Aktivierung eines Interfaces zu wartenden Sekunden bevor Router-Anfragen gesendet werden. -router_solicitation_interval - -Typ: INTEGERStandardwert: 4Die Anzahl der Sekunden zwischen Router-Anfragen. -router_solicitations - -Typ: INTEGERStandardwert: 3Die Anzahl der Router-Anfragen, bevor angenommen wird, dass keine Router verfügbar sind. -neigh/default/* -Standardeinstellungen der Neighbor-Erkennung und einige spezielle globale Intervall- sowie Threshold-Werte ändern: -gc_thresh1 - -Typ: INTEGERStandardwert: 128Mehr Infos hierzu in späteren Versionen. -gc_thresh2 - -Typ: INTEGERStandardwert: 512Mehr Infos hierzu in späteren Versionen. -gc_thresh3 - -Typ: INTEGERStandardwert: 1024Parameter zum Einstellen der Größe der Neighbour-Tabelle. -Wenn Sie viele Interfaces und Probleme mit inkorrekt oder nicht funktionierenden Routen haben, dann sollten Sie diesen Wert erhöhen. Ebenfalls erhöhen sollten Sie den Wert, wenn von einem aktiven Zebra (routing daemon) Folgendes angezeigt wird: - -gc_interval - -Typ: INTEGERStandardwert: 30Mehr Infos hierzu in späteren Versionen. -neigh/interface/* -Per Interface ändern spezieller Einstellungen zur Neighbor-Erkennung. -anycast_delay - -Typ: INTEGERStandardwert: 100Mehr Infos hierzu in späteren Versionen. -gc_stale_time - -Typ: INTEGERStandardwert: 60Mehr Infos hierzu in späteren Versionen. -proxy_qlen - -Typ: INTEGERStandardwert: 64Mehr Infos hierzu in späteren Versionen. -unres_qlen - -Typ: INTEGERStandardwert: 3Mehr Infos hierzu in späteren Versionen. -app_solicit - -Typ: INTEGERStandardwert: 0Mehr Infos hierzu in späteren Versionen. -locktime - -Typ: INTEGERStandardwert: 0Mehr Infos hierzu in späteren Versionen. -retrans_time - -Typ: INTEGERStandardwert: 100Mehr Infos hierzu in späteren Versionen. -base_reachable_time - -Typ: INTEGERStandardwert: 30Mehr Infos hierzu in späteren Versionen. -mcast_solicit - -Typ: INTEGERStandardwert: 3Mehr Infos hierzu in späteren Versionen. -ucast_solicit - -Typ: INTEGERStandardwert: 3Mehr Infos hierzu in späteren Versionen. -delay_first_probe_time - -Typ: INTEGERStandardwert: 5Mehr Infos hierzu in späteren Versionen. -proxy_delay - -Typ: INTEGERStandardwert: 80Mehr Infos hierzu in späteren Versionen. -route/* -Globale Routing-Einstellungen ändern. -flush -In neueren Kernel-Versionen wurde diese Option entfernt - mehr Infos hierzu in späteren Versionen. -gc_interval - -Typ: INTEGERStandardwert: 30Mehr Infos hierzu in späteren Versionen. -gc_thresh - -Typ: INTEGERStandardwert: 1024Mehr Infos hierzu in späteren Versionen. -mtu_expires - -Typ: INTEGERStandardwert: 600Mehr Infos hierzu in späteren Versionen. -gc_elasticity - -Typ: INTEGERStandardwert: 0Mehr Infos hierzu in späteren Versionen. -gc_min_interval - -Typ: INTEGERStandardwert: 5Mehr Infos hierzu in späteren Versionen. -gc_timeout - -Typ: INTEGERStandardwert: 60Mehr Infos hierzu in späteren Versionen. -min_adv_mss - -Typ: INTEGERStandardwert: 12Mehr Infos hierzu in späteren Versionen. -max_size - -Typ: INTEGERStandardwert: 4096Mehr Infos hierzu in späteren Versionen. -<!-- anchor id="proc-sys-net-ipv4." -->IPv6 relevante Einträge in /proc/sys/net/ipv4/ -Zurzeit werden einige Schalter auch bei IPv6 eingesetzt (Dies bleibt so, bis IPv4 zur Gänze in ein unabhängiges Kernel-Modul umgewandelt wurde). -ip_* - -ip_local_port_range -Diese Kontrolleinstellung wird ebenfalls bei IPv6 verwendet. -tcp_* -Diese Kontrolleinstellungen werden ebenfalls bei IPv6 verwendet. -icmp_* -Diese Kontrolleinstellungen werden bei IPv6 nicht verwendet. Zum aktivieren der ICMPv6 Quoten-Limitierung (auf Grund der ICMPv6 storms Auswirkungen sehr empfohlen) müssen netfilter-v6-Regeln eingesetzt werden. -Sonstige Einträge -Keine bekannt, bzw. von IPv6 vermutlich ungenutzt. -<!-- anchor id="proc-net" -->IPv6 relevante Einträge in /proc/net/ -In /proc/net gibt es einige Einträge die ausschließlich Lese-Rechte besitzen. Mit “sysctl” können Sie hier keine Informationen bekommen, verwenden Sie anstelle dessen z.B. “cat”. -if_inet6 - -Typ: Eine Zeile pro Adresse mit jeweils mehreren WertenAlle konfigurierten IPv6 Adressen werden hier in einem speziellen Format angezeigt. Im Beispiel wird ein Loopback-Interface angezeigt. Die Werte werden unten erklärt (siehe “net/ipv6/addrconf.c” für Details). - -IPv6 Adresse mit 32 hexadezimalen Zeichen ohne Doppelpunkte als TrennzeichenNetlink Device Nummer (Interface Index) im hexadezimalen Format (siehe auch “ip addr”)Präfix-Länge in hexadezimaler NotationWert des Gültigkeitsbereichs (s.a. Kernel Quellen “include/net/ipv6.h” und “net/ipv6/addrconf.c”)Interface flags (s.a. “include/linux/rtnetlink.h” und “net/ipv6/addrconf.c”)Devicename -ipv6_route - -Typ: Eine Zeile pro Route mit jeweils mehreren WertenAlle konfigurierten IPv6 Routen werden hier in einem speziellen Format angezeigt. Im Beispiel wird ein Loopback-Interface angezeigt. Die Werte werden unten erklärt (siehe “net/ipv6/route.c” für Details). - -IPv6 Zielnetzwerk mit 32 hexadezimalen Zeichen ohne Doppelpunkte als TrennzeichenIPv6 Ziel-Präfix-Länge in hexadezimaler NotationIPv6 Ursprungsnetzwerk mit 32 hexadezimalen Zeichen ohne Doppelpunkte als TrennzeichenIPv6 Ursprungs-Präfix-Länge in hexadezimaler NotationIPv6 next Hop mit 32 hexadezimalen Zeichen ohne Doppelpunkte als TrennzeichenMetrik in hexadezimaler SchreibweiseReference CounterUse CounterFlagsDevicename -sockstat6 - -Typ: Eine Zeile pro Protokoll mit Beschreibung und WertStatistiken über verwendete IPv6 Sockets. Beispiel: - -tcp6 -Mehr Infos hierzu in späteren Versionen. -udp6 -Mehr Infos hierzu in späteren Versionen. -igmp6 -Mehr Infos hierzu in späteren Versionen. -raw6 -Mehr Infos hierzu in späteren Versionen. -ip6_flowlabel -Mehr Infos hierzu in späteren Versionen. -rt6_stats -Mehr Infos hierzu in späteren Versionen. -snmp6 - -Typ: Eine Zeile pro SNMP Beschreibung und WertSNMP Statistiken; diese können mittels snmp server und entsprechender MIB Tabelle mit einer Network Management Software gewonnen werden. -ip6_tables_names -Verfügbare netfilter6 Tabellen -<!-- anchor id="netlink" -->Netlink-Interface zum Kernel -Mehr Infos hierzu in späteren Versionen... der Autor hat hiermit keine Erfahrung... -<!-- anchor id="resolver" -->Adress-Auflösung - - -Zusätzliche Informationen sind hier zu finden -Linux & IPv6: getaddrinfo and search domains - ResearchRFC 3484 on Linux Karl Auer's Blog: Controlling IPv6 source address selection , IPv6 Source Address Selection - what, why, howInto6: /etc/gai.conf - it ain't what you think it isAddress-Auflösung & Ziel-Adressen-Auswahl -Die Auflösung von Namen zu einer IPv4- bzw. IPv6-Adresse wird üblicherweise durch die Benutzung einer libc resolver Bibliothek durchgeführt. Dazu wird normalerweise die Funktion getaddrinfo benutzt. Im Fall, dass mehr als eine IPv6-Adresse zurückgegeben wird, soll nach RFC 3484 / Default Address Selection for Internet Protocol version 6 eine Sortierung angewandt werden, die optional auch konfiguriert werden kann. -Die “Magie” ist durch die Datei /etc/gai.conf konfigurierbar (welche fehlt oder leer ist, solange Standardwerte gelten sollen). Die vorgegebene Sortierung ist üblicherweise in der Dokumentation (z.B. /usr/share/doc/glibc-common/gai.conf) oder im Manual “man gai.conf” zu sehen. -Für die Kontrolle der Sortierung via benutzerdefinierter Konfiguration ist für Tests folgendes notwendig: -Ein Hostname im DNS, der mehr als eine IPv6-Adresse zurückgibt, z.B. - -Lookup via DNS (mit /etc/hosts klappt es nicht)/etc/gai.conf mit einer passenden Konfiguration, e.g. - -Für Tests kann dann ein Telnet-Client benutzt werden: - -Wenn nun die precedence geändert wird in der Konfiguration: - -Dann ändert sich die Reihenfolge entsprechend -Quell-Addressen-Auswahl -Source address selection in Linux wird automatisch vom Kernel vorgenommen, üblicherweise abhängig von den Routing-Tabellen und unter der Vorgabe, den Scope einer Adresse beizubehalten. -Quell-Adressen-Auswahl mit “ip addrlabel” -Mit einer Erweiterung der internen “ip addrlabel” Tabelle kann eine Quell-Adresse zu einer Ziel-Adresse gebunden werden. Bindung wird hier durch die Angabe des gleichen Labels (einer Nummer) konfiguriert. -Standard von “ip addrlabel” (hier von CentOS 6): - -Das System ist multihomed (hier an einem Interface), der Router verteilt 2 Präfixe mit Hilfe von radvd: - -Eine Verbindung zum Server zeigt nun: - -Ein tcpdump mit filter “tcp and dst port 23” zeigt nur die Benutzung der oberen lokalen Quell-IPv6-Adresse - 2001:4dd0:ff00:834::2.telnet: (src-A -> dst-A) -IP6 2001:6f8:12d8:2:5054:ff:fefb:6582.45754 > 2a01:238:423d:8800:85b3:9e6b:3019:8909.telnet: (src-A -> dst-B) -]]> -Wenn nun Quelle und Ziel mit Hilfe von “ip addrlabel” zusammengebunden werden: - -Was in folgender “ip addrlabel”resultiert: - -Und dann nochmal eine Verbindung zum Server versucht wird - -tcpdump mit filter “tcp and dst port 23” zeigt nun die Benutzung beider Quell-IPv6-Adressen wie konfiguriert - 2001:4dd0:ff00:834::2.telnet: (src-A -> dst-A) -IP6 2001:6f8:900:8cbc:5054:ff:fefb:6582.39632 > 2a01:238:423d:8800:85b3:9e6b:3019:8909.telnet: (src-B -> dst-B) -]]>Persistente Konfiguration von “ip addrtable” ist wahrscheinlich in aktuellen Linux-Distributionen nicht unterstützt, somit wäre eine Erweiterung der Netzwerk-Init-Scripts oder rc.local notwendig. Ein Skript, welches Informationen aus /etc/gai.conf in entsprechendes “ip addrtable” umwandelt, gibt es hier: /etc/gai.conf - it ain't what you think it is -<!-- anchor id="network-debugging" -->Netzwerk-Fehlersuche - -Server Socket-Anbindung - -Überprüfung der Server Socket-Anbindung mit “netstat” -Es ist immer von Interesse welche Sockets eines Knotens gerade aktiv sind. Mit “netstat” können Sie die betreffenden Informationen abfragen: -Verwendete Optionen: -nlptu -Beispiel: - -<!-- anchor id="examples-tcpdump" -->tcpdump-Beispiele -Hier folgen einige Beispiele von (mit tcpdump) aufgezeichneten Paketen, die hoffentlich bei Ihrer Fehlersuche nützlich sein können. -... mehr Beispiele in den nächsten Versionen... -Router-Erkennung - -Router Advertisement - - 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=2001:0db8:0:1::/64)(src lladdr: -¬ 0:12:34:12:34:50) (len 88, hlim 255) -]]>Der Router mit der link-lokalen Adresse “fe80::212:34ff:fe12:3450” sendet eine Ankündigung mit zwei Präfixes “2002:0102:0304:1::/64” (Lebensdauer 30s) und “2001:0db8:0:1::/64” (Lebensdauer 2592000s) sowie der eigenen Schicht 2 MAC Adresse “0:12:34:12:34:50” an die all-node-on-link Multicast Adresse “ff02::1”. -Router Anfrage - - ff02::2: icmp6: router solicitation -¬ (src lladdr: 0:12:34:12:34:56) (len 16, hlim 255) -]]>Der Knoten mit der link-lokalen Adresse “fe80:212:34ff:fe12:3456” und der Schicht 2 MAC Adresse “0:12:34:12:34:56” sucht nach einem Router und sendet hierfür diese Anfrage an die all-router-on-link Multicast Adresse “ff02::2”. -Neighbor-Erkennung - -Neighbor discovery solicitation zur Entdeckung doppelter Adressen -Folgende Pakete werden vom Knoten mit der Schicht 2 MAC Adresse “0:12:34:12:34:56” während der automatischen Konfiguration an die solicited-node link-lokale Multicast Adresse gesendet. Es wird überprüft, ob eine potentielle Adresse bereits von einem anderen Knoten am Link verwendet wird. -Der Knoten will seine link-lokale Adresse “fe80:212:34ff:fe12:3456” konfigurieren und überprüft auf Duplikate - 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) -]]> -Der Knoten will seine globale Adresse “2002:0102:0304:1:212:34ff:fe12:3456” konfigurieren (nach Empfang eines Advertisements wie weiter oben abgebildet) und überprüft auf Duplikate - 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) -]]> -Der Knoten will seine globale Adresse “2001:0db8:0:1:212:34ff:fe12:3456” konfigurieren (nach Empfang eines Advertisements wie weiter oben abgebildet) und überprüft auf Duplikate - ff02::1:ff12:3456: icmp6: neighbor sol: who has -¬ 2001:0db8:0:1:212:34ff:fe12:3456(src lladdr: 0:12:34:12:34:56) (len 32, hlim -¬ 255) -]]> -Neighbor discovery solicitation zur Host oder Gateway-Suche - -Der Knoten möchte Pakete an die Adresse “2001:0db8:0:1::10” senden, hat hierfür aber keine Schicht 2 MAC Adresse und sendet aus diesem Grund zuerst eine Anfrage - ff02::1:ff00:10: icmp6: -¬ neighbor sol: who has 2001:0db8:0:1::10(src lladdr: 0:e0:18:90:92:5) (len 32, -¬ hlim 255) -]]> -Der Knoten sucht nun nach der Adresse “fe80::10” - ff02::1:ff00:10: icmp6: neighbor -¬ sol: who has fe80::10(src lladdr: 0:e0:18:90:92:5) (len 32, hlim 255) -]]> -<!-- anchor id="chapter-support-persistent-configuration" -->Unterstützung einer ständigen IPv6-Konfiguration in Linux Distributionen -Einige Linux-Distributionen unterstützen bereits eine permanente IPv6 Konfiguration. Hierbei werden sowohl bestehende oder als auch neue Konfiguration- und Skriptdateien verwendet sowie tlw. IPv4 Skripte abgeändert. -Red Hat Linux und “Klone” -Seitdem der Autor begann das IPv6 & Linux - HowTo zu schreiben, war es seine Absicht eine permanente IPv6 Konfiguration zu ermöglichen, wobei die gebräuchlichsten Anwendungsszenarien wie Host-only, Router-only, Dual-homed-host, Router mit einem zweiten Netzwerkstrang, normale Tunnel, 6to4 Tunnel, etc. abgedeckt sein sollten. Heute gibt es eine Sammlung von Konfigurations- und Skriptdateien, die genau diesem Zweck erfüllen (es wurden nie echte Probleme gemeldet, allerdings ist unbekannt von wie vielen Personen dieses Set benutzt wird). Diese Dateien werden von Zeit zu Zeit erweitert und es gibt inzwischen eine eigene Homepage hierfür: initscripts-ipv6 homepage (Spiegel). Da der Autor seine ersten Schritte mit IPv6 auf einem Red Hat Linux 5.0 Klon gemacht habe, basieren seine IPv6 Entwicklungssysteme heute zumeist auf Red Hat Linux und die Skriptdateien sind folglich primär für diese Distributionen gedacht. Es war ebenfalls sehr einfach bestehende Konfigurationsdateien zu erweitern, neue zu erstellen und den Start des IPv6 Setup in das IPv4 Setup einzubetten. -Erfreulicherweise beinhaltet Red Hat Linux seit der Version 7.1 die IPv6-Skripts des Autors. Unterstützt wurde dies und wird auch weiterhin von Pekka Savola. -Bei Mandrake ist ab Version 8.0 ebenfalls ein IPv6-fähiges initscript Paket beinhaltet, ein kleiner Fehler verhindert aber nach wie vor die Anwendung (“ifconfig” vermisst “inet6” vor “add”). -Test der IPv6-Unterstützung bei Netzwerk-Konfigurations-Scripts -Sie können überprüfen, ob Ihre Distribution eine permanente IPv6 Konfiguration unter Verwendung der Skript-Sammlung des Autors unterstützt. Folgende script library sollte existieren: -Automatischer Test: -Die Versionsnummer der Library ist von Interesse, wenn Sie Features vermissen sollten. Die Versionsnummer können Sie anzeigen, indem Sie folgenden Befehl ausführen (einfacher ist es sicherlich, wenn Sie im Header der Datei nachlesen): -Im obigen Beispiel ist die Versionsnummer 20011124. Um zu sehen, was sich inzwischen geändert hat, können Sie hier die neuesten Informationen nachlesen: initscripts-ipv6 homepage (Spiegel). Sie finden hier auch ein Change-Log. -Kurze Anleitung zum aktivieren von IPv6 bei RHL 7.1, 7.2, 7.3, ... - -Überprüfen Sie, ob das IPv6 Modul auf Ihrem System bereits geladen ist: - -Ist das Ergebnis “off”, dann aktivieren Sie IPv6 durch hinzufügen folgender Zeile in /etc/sysconfig/network - -Rebooten bzw. starten Sie das Netzwerk neu mit dem Befehl - -Nun sollte das IPv6 Modul geladen sein -Ist ihr System an einem Link, der Router Advertisements liefert, dann wird die automatische Konfiguration automatisch durchgeführt. Zusätzlich Informationen darüber, welche Einstellungen unterstützt werden finden Sie in der Datei /usr/share/doc/initscripts-$version/sysconfig.txt. -SuSE Linux -Seit neueren 7.x Versionen gibt es eine wirklich rudimentäre Unterstützung für IPv6, siehe /etc/rc.config für Details. -Aufgrund der komplett unterschiedlichen Struktur der Konfigurations- und Scriptdateien ist es sehr schwer (oder unmöglich) das Set für Red Hat Linux und seine Klone mit dieser Distribution zu verwenden. -In Version 8.x wurde das Konfigurations-Setup bei SuSE komplett abgeändert. -SuSE Linux 7.3 - -How to setup 6to4 IPv6 with SuSE 7.3 -SuSE Linux 8.0 - -IPv6-Adress-Konfiguration -Editiere Datei /etc/sysconfig/network/ifcfg-<Interface-Name> und setze folgende Variable entsprechend -/" -]]> -Zusätzliche information -Siehe Datei /usr/share/doc/packages/sysconfig/README -SuSE Linux 8.1 - -IPv6-Adress-Konfiguration -Editiere Datei /etc/sysconfig/network/ifcfg-<Interface-Name> und setze folgende Variable entsprechend -/" -]]> -Zusätzliche information -Siehe Datei /usr/share/doc/packages/sysconfig/Network -<!-- anchor id="Configuration-Debian-Linux" -->Debian Linux -Folgende Information wurde von Stephane Bortzmeyer <bortzmeyer at nic dot fr> beigesteuert. -Überprüfe, ob IPv6 aktiv ist, entweder weil es in den Kernel hineinkompilier oder das Modul geladen wurde. Für die letzte Möglichkeit gibt es 3 Lösungen: Editieren der Datei /etc/modules, Benutzung des Features pre-up (siehe unten) oder Benutzung von kmod (wird hier nicht weiter erklärt).Konfiguriere die Schnittstelle (hier im Beispiel: eth0). Editiere /etc/network/interfaces : - /proc/sys/net/ipv6/conf/all/autoconf - netmask 64 - # The router is autoconfigured and has no fixed address. - # It is magically - # found. (/proc/sys/net/ipv6/conf/all/accept_ra). Otherwise: - #gateway 2001:0db8:1234:5::1 -]]>Danach rebooten oder folgendes Kommando ausführen -Danach sollte die statische IPv6-Adresse konfiguriert sein. -Weiterführende Informationen - -IPv6 with Debian LinuxJean-Marc V. Liotier's HOWTO for Freenet6 & Debian Users (am 24.12.2002 in der mailinglist users@ipv6.org angekündigt) -<!-- anchor id="chapter-autoconfiguration" -->Automatische Konfiguration - -Stateless Auto-Konfiguration (out-of-the-box) -Wird unterstützt und kann bei der zugewiesenen link-lokalen Adressen beobachtet werden, sobald ein IPv6 fähiges Interface aktiv ist. -Beispiel: - mtu 1500 qlen1000 - inet6 fe80::211:d8ff:fe6b:f0f5/64 scope link - valid_lft forever preferred_lft forever -]]> -Stateless Auto-Konfiguration unter Verwendung des Router Advertisement Daemon (radvd) -Mehr Infos hierzu in späteren Versionen. Siehe unten im Abschnitt radvd daemon autoconfiguration. -Dynamic Host Configuration Protocol v6 (DHCPv6) -Nach einer langen Zeit der Diskussion wurde RFC 3315 / Dynamic Host Configuration Protocol for IPv6 (DHCPv6) verabschiedet. Momentan (10/2005) existieren 2 Implementierungen: -Dibbler von Tomasz Mrugalski <thomson at klub dot com dot pl>(Tipps zur Konfiguration)dhcpv6 (Tipps zur Konfiguration)ISC DHCP (Tipps zur Konfiguration) -<!-- anchor id="chapter-mobility" -->Mobilität - -Allgemeines - -Mobilität eines Knotens (Node Mobility) -Die Unterstützung für IPv6-Mobilität in Linux kann durch die Installation der MIPL2-Implementierung aktviert werden, welche hier zu finden ist: http://www.mobile-ipv6.org/ -Diese Implementierung ist konform zur RFC 3775. Sie besteht aus einem Kernel-Patch und einen Mobilitäts-Daemon (genannt mip6d). Die Version 2.0.1 passt für Linux kernel 2.6.15. -Installation und Setup sind im Linux Mobile IPv6 HOWTO beschrieben. -Netzwerk-Mobililtät -Zusätzlich existiert die Implementierung der Netzwerk-Mobilität für Linux, genannt NEPL, und basiert auf MIPL. Diese steht auch zur Verfügung unter: http://www.mobile-ipv6.org/. -Folgendes HOWTO Dokument beschreibt Setup und Konfiguration: http://www.nautilus6.org/doc/nepl-howto/. -Links - -Mobile IPv6 for Linux (MIPL) project: http://www.mobile-ipv6.org/Nautilus6 working group: http://nautilus6.org/Fast Handovers for Mobile IPv6 for Linux project: http://www.fmipv6.org/USAGI-patched Mobile IPv6 for Linux (UMIP):http://umip.linux-ipv6.org/Deploying IPsec/IKE-protected MIPv6 under Linux:http://natisbad.org/MIPv6/RFC 3775 / Mobility Support in IPv6RFC 3776 / Using IPsec to Protect Mobile IPv6 Signaling Between Mobile Nodes and Home AgentsRFC 3963 / Network Mobility (NEMO)RFC 4068 / Fast Handovers for Mobile IPv6RFC 4423 / Host Identity Protocol (HIP) ArchitectureRFC 5201 / Host Identity ProtocolHIP Implementierungen: http://infrahip.hiit.fi/, http://hip4inter.net/, http://www.openhip.org/ -<!-- anchor id="chapter-firewalling-security" -->Firewall-Funktionalität -Die IPv6 Firewall-Funktionalität ist wichtig; vor allem dann, wenn Sie auf Ihren internen Netzen IPv6 mit globalen IPv6 Adressen einsetzen. In IPv6 werden - im Unterschied zu IPv4, wo interne Hosts automatisch durch private IPv6 Adressen geschützt werden (RFC 1918 / Address Allocation for Private Internets bzw. Google search for Microsoft + APIPA) - globale Adressen verwendet und jeder mit IPv6-Anbindung kann alle internen Knoten, bei denen IPv6 aktiv ist, erreichen. -<!-- anchor id="firewalling-netfilter6." -->Firewall-Funktionalität mit netfilter6 -Von Haus aus unterstützt wird die IPv6-Firewall-Funktionalität im Kernel erst ab Version 2.4+. In älteren 2.2+ Versionen können sie nur mit Protocol 41 das generelle Tunnel von IPv6-in-IPv4-Paketen filtern. -Achtung: Es gibt keine Garantie, dass die beschriebenen Regeln und Beispiele ihr System auch wirklich schützen können! -Beobachten Sie nach der Installation ihr Regelset, siehe Abschnitt . -Kernels ab Version 2.6.20 (Februar 2007) unterstützen den IPv6-Verbindungsstatus (connection tracking) vollständig. -Kernels ab Version 3.9.0 (April 2013) unterstützen NAT für IPv6 in Verbindung mit ip6tables >= 1.4.18 -Kernels ab Version 3.13 (April 2014) unterstützen ein neues Framework namens: nftables -Weitere Informationen - -Netfilter projectmaillist archive of netfilter usersmaillist archive of netfilter developersUnofficial status informations -Vorbereitung -Dies ist nur notwendig, wenn der mitgelieferte Kernel und Netfilter nicht den Ansprüchen genügt und neue Featurs bereits verfügbar sind, jedoch noch nicht beinhaltet. -Quellen besorgen -Besorgen Sie sich den aktuellsten Kernel: http://www.kernel.org/ -Besorgen Sie sich das aktuellste iptables Paket: -Source tarball (für Kernel Patches): http://www.netfilter.org/ -Quellen entpacken -Wechseln Sie in das Source-Verzeichnis: -Entpacken sie die Kernel-Quellen und vergeben diesen einen neuen Namen -Entpacken Sie die iptables Quellen - -Neueste iptables/IPv6-relevante Patches den Kernel-Quellen hinzufügen -Wechseln Sie in das iptables Verzeichnis -Fügen Sie relevante Patches hinzu -Fügen Sie zusätzliche IPv6 relevante IPv6 Patches hinzu (die nach wie vor nicht im Standard-Kernel enthalten sind) -Sagen Sie zu folgenden Optionen (iptables-1.2.2) Ja: -ah-esp.patch masq-dynaddr.patch (nur benötigt bei Systemen mit dynamischer IP-Zuweisung am WAN mittels PPP oder PPPoE) ipv6-agr.patch.ipv6 ipv6-ports.patch.ipv6 LOG.patch.ipv6 REJECT.patch.ipv6 Überprüfen Sie die Erweiterungen - -Konfiguration, kompilieren und Installation eines neues Kernels -Wechseln Sie zu den Kernel-Quellen -Editieren Sie das Makefile -Starten Sie configure und aktivieren Sie IPv6 relevante Optionen -Konfigurieren Sie bei Bedarf Sonstiges abseits von IPv6. -Kompilieren und Installation: siehe Kapitel Kernel sowie andere HOWTOs. -iptables neu kompilieren und installieren -Stellen Sie sicher, dass obige Kernel-Sourceverzeichnisstruktur unter /usr/src/linux liegt -Benennen sie das ältere Verzeichnis um -Erstellen Sie einen neuen symbolischen Link -Erstellen Sie ein neues SRPMS -Installieren Sie das neue iptables Paket (iptables + iptables-ipv6) -Bei RH 7.1 Systemen ist normalerweise eine ältere Version hiervon bereits installiert, verwenden Sie daher die Option “Freshen”: - -Ist keine ältere Version installiert, benutzen Sie die Option “install”: - -Bei RH 6.2 Systemen ist normalerweise kein Kernel Version 2.4.x installiert und die Anforderungen sind demnach nicht gegeben. Benutzen Sie in diesem Fall “nodeps”: -Damit iptables die Libraries finden kann, ist es eventuell notwendig, einen symbolischen Link für die iptables Libraries zu erstellen: - -Verwendung - -Unterstützung im Kernel -Laden Sie das Modul (falls dies im Kernel so kompiliert wurde): -Überprüfen der IPv6-Unterstützung: - -Die Benützung von iptables lernen - -Auflistung aller netfilter Einträge - -Kurze Auflistung: - -Erweiterte Auflistung: - -Auflistung angegebener Filter - - -Hinzufügen einer Log-Regel zum Input-Filter mit Optionen - - -Hinzufügen einer Drop-Regel zum Input-Filter - - -Löschen einer Regel mit Hilfe der Regelnummer - - -Aktiviere die Auswertung des Verbindungsstatus (connection tracking) -Seit Kernel-Version 2.6.20 ist die Auswertung des IPv6-Verbindungsstatus gut unterstützt. Die bis dahin statuslosen Filterregeln sollten ersetzt werden.. - -ICMPv6 erlauben -Bei älteren Kernelversionen (unpatched kernel 2.4.5 und iptables-1.2.2) kann keine nähere Spezifizierung des ICMPv6-Typs vorgenommen werden: -Eingehender ICMPv6 Verkehr durch Tunnel erlauben - -Ausgehenden ICMPv6 Verkehr durch Tunnel erlauben -Neuere Kernel erlauben das Spezifizieren des ICMPv6-Typs: - -Rate-limiting -Da es zu einem ICMPv6 Storm kommen kann (der Autor hat dies bereits mehrfach beobachtet), sollten sie das rate limiting zumindest für das ICMP Regelset einsetzen. Zusätzlich sollten auch die Logging Regeln mit rate limiting geschützt werden, um DoS Attacken gegen das syslog sowie gegen die Logdateien enthaltenden Patitionen entgegenzuwirken. Ein Beispiel für ein rate limited ICMPv6 sieht wie folgt aus: - -Eingehende SSH-Verbindung erlauben -Im folgenden Beispiel werden eingehende SSH-Verbindungen von einer speziellen IPv6 Adresse zugelassen: -Eingehende SSH Verbindungen werden von der Adresse 2001:0db8:100::1/128 erlaubt - -Erlaube Antwortpakete (nicht mehr notwendig, wenn der IPv6-Verbindungsstatus ausgewertet wird!) - -Getunnelten IPv6-in-IPv4 Datenverkehr erlauben -Um getunnelte IPv6-in-IPv4 Pakete zu akzeptieren, müssen Sie in Ihrem IPv4 Firewall-Setup entsprechende Regeln einzufügen, z.B. -Akzeptiere eingehende IPv6-in-IPv4 Daten am interface ppp0 - -Akzeptiere ausgehende IPv6-in-IPv4 Daten am interface ppp0 -Haben Sie nur einen statischen Tunnel, dann können sie die IPv4 Adresse auch dediziert angeben: -Akzeptiere eingehende IPv6-in-IPv4 Daten vom Tunnel-Endpunkt 192.0.2.2 am interface ppp0 - -Akzeptiere ausgehende IPv6-in-IPv4 Daten vom Tunnel-Endpunkt 192.0.2.2 am interface ppp0 - -Schutz gegen eingehende TCP-Verbindungs-Anfragen -SEHR EMPFOHLEN! Aus Sicherheitsgründen sollten Sie auf jeden Fall eine Regel inkludieren, wodurch eingehende TCP-Verbindungs-Anfragen geblockt werden. Wenn Sie andere Interfacenamen verwenden, müssen Sie die Option "-i" entsprechend anpassen! -Blockiere eingehende TCP-Verbindungs-Anfragen zu diesem Host - -Blockiere eingehende TCP-Verbindungs-Anfragen zu Hosts hinter diesem Router -Eventuell müssen diese Regeln unterhalb anderer Regeln platziert werden. Nehmen Sie sich für die Reihenfolge der Regeln etwas Zeit. Sinnvoll wird es auch sein, ein Script mit den Regeln zu erstellen, damit die Regeln in der gewünschten Reihenfolge angewendet werden. -Schutz gegen eingehende UDP-Verbindungs-Anfragen -EBENFALLS SEHR EMPHOLEN! Wie bereits im Kapitel Firewall erwähnt, ist es möglich die Ports bei ausgehenden UDP/TCP-Verbindungen zu kontrollieren. Im Falle, dass all Ihre IPv6 Systeme lokale Ports verwenden, z.B. von 32768 bis 60999, dann können sie ebenfalls UDP Verbindungen filtern (bis das Verbindungs-Tracking funktioniert): -Blockiere eingehende UDP-Pakete, die nicht Antworten ausgehender Anfragen dieses Host sein können - -Blockiere eingehende UDP-Pakete, die nicht Antworten auf Anfragen von hinter diesem Router gelegenen Hosts sein können - -Anwendungsbeispiele - -Einfaches Beispiel für Fedora -Folgende Zeilen zeigen eine einfache Firewall-Konfiguration für Fedora 6 (ab Kernel-Version 2.6.20). Ausgehend von dem Origina (generiert durch system-config-firewall) wurden Modifikationen für die Unterstützung des Verbindungsstatus und der Rückgabe der passenden ICMPv6-Meldung für Rejects. Eingehende SSH (Port 22) Verbindungen sind erlaubt. -Zwecks der Vollständigkeit ist hier auch die entsprechende Konfiguration für IPv4 gezeigt: -Benutzung: -Erzeugen/Modifizieren der KonfigurationsdateienAktivieren von IPv4 & IPv6 Firewalling - -Aktivieren des automatischen Starts nach dem Reboot - -Umfangreicheres Beispiel -Folgende Zeilen zeigen ein umfangreicheres Setup. Happy netfilter6 Regelset erstellen... - -<!-- anchor id="nat-netfilter6." -->Network Address Translation (NAT) mit netfilter6 -Seit mindestens Linux Kernel-Version 3.9.0 und ip6tables ab 1.4.18 kann Network Address Translation (NAT) genutzt werden. -IPv6 Maskierung -Wie bei IPv4 können Systeme hinter einem Router versteckt werden mit Hilfe von IPv6 Maskierung (hide/overlap NAT), z.B. - -IPv6 Destination NAT -Eine dedizierte öffentliche IPv6-Adresse kann zu einer internen IPv6-Adresse weitergeleitet werden, z.B. - -IPv6 Port Weiterleitung -Ein dedizierter Port kann zu einem internen System weitergeleitet werden, z.B. - -Firewall-Setup mit nftables -Mit nftables wurde die Unterstützung einer Tabelle names “inet” eingeführt in welcher Regeln für IPv4/IPv6 gleichzeitig gelten -Präparation zur Nutzung von nftables -Installieren einer Linux-Distribution, welche die Unterstützung für nftables bereits eingebaut hat. Beim Schreiben dieses Absatzes (Mai 2014) war mindestens Fedora Rawhide (Vorläufer der Version 21) mit entsprechendem Support und nftables version 0.2.0 versehen. -Basis-nftables Konfiguration -Laden der Kernel-Module: -Löschen der Regeln in iptables and ip6tables um Interferenzen zu vermeiden: -Erzeugen der Filter-Tabelle: -Erzeugen einer input chain in der Filter-Tabelle: - -Einfache Filter-Policy mit nftables - -Konfiguration -Erlauben von Paketen, die zu existierenden Einträgen in der Connection-Tracking-Tabelle gehören -Erlauben von IPv4 und IPv6 ICMP echo-request (aka ping) -Erlauben einiger wichtiger IPv6 ICMP Pakete, ohne Zähler, dafür mit Hop-Limit-Prüfung (erhöht die Sicherheit) -Erlauben von eingehenden SSH-Verbindungen für IPv4 und IPv6 -Reject/drop anderer Pakete - -Ergebnis -Tabelle für IP unabhängigen Filter -= 0 tcp dport <= 65535 counter packets 0 bytes 0 reject - udp dport >= 0 udp dport <= 65535 counter packets 0 bytes 0 drop - log prefix counter packets 0 bytes 0 drop - } -} -]]> -Tipps für's Loggen -Für Logging wird ein zusätzliches Kernelmodul benötigt: -ACHTUNG, MOMENTAN KANN DER LOG-LEVEL NICHT ANGEGEBEN WERDEN, dadurch werden nftables-Ereignisse mit Log-Level kern.emerg ausgegeben - ES BESTEHT DIE GEFAHR, DASS DIE KONSOLE DADURCH ÜBERFLUTET WIRD! -Für erste Tests mit der Log-Option kann es nützlich sein, das Loggens für emergency-Ereignisse in z.B. /etc/rsyslog.conf zu deaktivieren mit Hilfe eines “#” am Anfang der Zeile und Neustart des logging-Daemons -Regel von oben, welche SSH auf Port 22 erlaubt, nun mit Logging: - -Filter-Policy mit nftables unter Benutzung der Tablellen “ip”, “ip6” und “inet” -Wie oben schon beschrieben, wenn die Regeln in den einzelnen Tabellen konfiguriert werden, muss gesichert sein, dass frühere “accepts” nicht aufgehoben werden. Eine einfache Lösung ist die Benutzung von Markierungen. Regeln, die Pakete erlauben, setzen die Marke mit “meta mark set xxxx”. Eine generische Regel erlaubt Pakete mit gesetzter Marke “mark xxxx”. Beispiel für ein resultierendes Filter-Regelwerk: - -<!-- anchor id="chapter-security" -->Sicherheit - -Sicherheit des Knoten -Es wird sehr empfohlen alle verfügbaren Patches einzuspielen sowie alle nicht benötigten Dienste zu deaktivieren. Ebenfalls sollten Sie lokales firewalling aktivieren und binden Sie die Dienste ausschließlich an benötigte IPv4/IPv6 Adressen. -Mehr Infos hierzu in späteren Versionen. -Zugangsbeschränkungen -Viele Dienste setzen die tcp_wrapper Bibliothek für die Zugangskontrolle ein. Eine Beschreibung finden Sie unter use of tcp_wrapper. -Mehr Infos hierzu in späteren Versionen. -<!-- anchor id="IPv6-security-auditing" -->IPv6 Sicherheitsüberwachung -Aktuell gibt es keine komfortablen Sicherheitstools mit denen man ein System über ein Netzwerk nach IPv6 relevanten Sicherheitslücken hin überprüfen kann. Weder Nessus noch irgendein kommerzieller Security Scanner ist zur Zeit dazu in der Lage, IPv6-Adressen scannen zu können. -Rechtsfragen -ACHTUNG: Bitte stellen Sie immer sicher, dass Sie ausschließlich ihr eigenes Netzwerk scannen oder einen Scan nur nach Erhalt einer schriftlichen Erlaubnis durchführen. Andernfalls haben sie mit rechtlichen Konsequenzen zu rechnen! -ÜBERPRÜFEN Sie die Ziel-IPv6-Adresse ZWEIMAL, bevor Sie einen Scan starten. -Sicherheitsüberwachung mit IPv6 fähigen netcat -Mit dem IPv6 fähigen netcat (siehe IPv6+Linux-status-apps/security-auditing für Details) können Sie einen Portscan durchführen. Es wird ein Script abgearbeitet, wobei u.a. ein Port-Bereich überprüft und Banners mitprotokolliert werden. Anwendungsbeispiel: - -Sicherheitsüberwachung mit IPv6 fähigen NMap -NMap, einer der weltweit besten Portscanner, unterstützt IPv6 seit der Version 3.10ALPHA1. Anwendungsbeispiel: - -Sicherheitsüberprüfung IPv6 fähigen strobe -Strobe ist (im Vergleich zu NMap) ein low budget Portscanner. Allerdings gibt es für Strobe einen IPv6 Patch (siehe IPv6+Linux-status-apps/security-auditing für Details). Anwendungsbeispiel: -. -::1 2401 unassigned unknown -::1 22 ssh Secure Shell - RSA encrypted rsh -::1 515 printer spooler (lpd) -::1 6010 unassigned unknown -::1 53 domain Domain Name Server -]]>Hinweis: strobe wird nicht wirklich weiterentwickelt, die abgebildete Versionsnummer ist zudem falsch. -Sicherheitsüberprüfung mit Online-Werkzeugen -Es gibt einige IPv6-fähige Online-Werkzeuge, welche das Testen einer Firewall-Konfiguration bzgl. eingehenden Verbindungen unterstützen können: -Tim's Online IPv6 TCP/UDP Port ScannerSubnetOnline IPv6 Scanner -Überprüfungsergebnisse -Falls das Ergebnis einer Überwachung nicht Ihren IPv6 Sicherheitsrichtlinien entspricht, schließen Sie die Lücken mit Hilfe der IPv6-Firewall-Funktionalität, z.B. mit netfilter6 (siehe Firewalling/Netfilter6 für Details). -Hinweis: Detailliertere Informationen zum Thema IPv6 Sicherheit finden Sie unter folgenden Links: -IETF drafts - IPv6 Operations (v6ops)RFC 3964 / Security Considerations for 6to4 -<!-- anchor id="chapter-encryption-authentication" -->Verschlüsselung und Authentifizierung -Zum Unterschied zu IPv4 ist die Verschlüsselung und die Authentifizierung ein zwingendes Feature bei IPv6. Diese Features werden normalerweise mit IPsec implementiert (das auch von IPv4 verwendet wird). -Nutzungsarten von Verschlüsselung und Authentifizierung -Zwei Arten von Verschlüsselung und Authentifzierung einer Verbindung sind möglich: -Transport-Modus -Der Transport-Modus ist ein Modus nur für Ende-zu-Ende-Verbindungen. Hier wird nur die Nutzlast (üblicherweise ICMP, TCP oder UDP) mit deren entsprechenden Headern verschlüsselt, wogegen der IP-Header nicht verschlüsselt wird (aber üblicherweise in die Authentifizierung eingebunden wird). -Bei Nutzung von AES-128 für Verschlüsselung und SHA1 für Authentifizierung reduziert dieser Modus die MTU um 42 Oktetts. -Tunnel-Modus -Der Tunnel-Modus kann einerseits für eine Ende-zu-Ende wie auch für eine Gatewas-zu-Gateway-Verbindung genutzt werden. Hier wird das komplette IP-Paket verschlüsselt und ein neuer IP-Header vorangestellt . -Dieser Modus reduziert die MTU um weitere 40 Oktetts (bei IPv6), ausgehend von der MTU des Transport-Modus. -Unterstützung im Kernel (ESP und AH) - -Unterstützung im vanilla Linux Kernel 2.4.x -Fehlt in vanilla 2.4. In der Vergangenheit gab es einen Grund, die Linux Kernel Quellen frei von Export/Import-Kontrollgesetzen bzgl. Verschlüsselungs-Techniken zu halten. Dies ist auch ein Grund, wieso FreeS/WAN project nicht in die vanilla Quellen miteingebunden wurde. -Unterstützung im vanilla Linux kernel 2.6.x -Aktuelle Versionen (zum Zeitpunkt des Schreibens 2.6.9 und neuer) unterstützt IPsec für IPv4 und IPv6. -Die Implementierung wurde u.a. vom USAGI project unterstützt. -Automatischer Schlüssel-Austausch (IKE) -IPsec benötigt einen Schlüsselaustausch mit einem “Geheimnis”. Dieser Vorgang wird meistens automatisch durch sogenannte IKE-Daemons durchgeführt. Diese führen ebenso die Authentifizierung der Partner durch, entweder durch ein gemeinsam bekanntes Geheimnis (auch “pre-shared secret” genannt) oder bei RSA-Schlüssel (z.B. aus X.509 Zertifikaten). -Momentan stehen (für Linux) zwei verschiedene IKE-Daemons zur Verfügung, die aber sich ziemlich in Konfiguration und Benutzung unterscheiden. -Ich präferiere “pluto” von der *S/WAN Implementierung, wei dieser eine überschaubare (und nur eine) Konfiguration. -IKE-Daemon “racoon” -Der IKE-Daemon “racoon” ist vom KAME-Project und auf Linux portiert worden. Aktuelle Linux-Distributionen beinhalten diesen Daemon im Paket “ipsec-tools”. Zwei Programme sind für ein funktionierendes IPsec-Setup notwendig. Siehe dazu auch das Linux Advanced Routing & Traffic Control HOWTO / IPSEC. -Manipulation der IPsec SA/SP Datenbank mit dem Werkzeug “setkey” -“setkey” ist für die Definition der Security Policy (SP) im Kernel wichtig. -Datei: /etc/racoon/setkey.sh -Beispiel für eine Ende-zu-Ende verschlüsselte Verbindung im Transport-Modus - -Beispiel für eine Ende-zu-Ende verschlüsselte Verbindung im Tunnel-Modus -Beim anderen Partner ist “in” mit “out” zu vertauschen. -Konfiguration des IKE-Daemon “racoon” -“racoon” benötigt eine Konfigurationsdatei zur Ausführung. Es beinhaltet zu der Security Policy entprechenden Einstellungen, welche vorher mit “setkey” definiert wurde. -Datei: /etc/racoon/racoon.conf -Zudem muss das gemeinsame Geheimnis definiert werden: -Datei: /etc/racoon/psk.txt - -IPsec mit IKE-Daemon “racoon” starten -Zum Schluss muss der Daemon gestartet werden. Beim ersten Mal sollte Debug- & Vordergrund-Modus aktiviert werden. Das folgende Beispiel zeigt eine erfolgreiche Aushandlung von IKE-Phase 1 (ISAKMP-SA) und 2 (IPsec-SA): -2001:db8:2:2::2[500] -2005-01-01 20:31:06: INFO: begin Identity Protection mode. -2005-01-01 20:31:09: INFO: ISAKMP-SA established -¬ 2001:db8:1:1::1[500]-2001:db8:2:2::2[500] spi:da3d3693289c9698:ac039a402b2db401 -2005-01-01 20:31:09: INFO: initiate new phase 2 negotiation: -¬ 2001:6f8:900:94::2[0]<=>2001:db8:2:2::2[0] -2005-01-01 20:31:10: INFO: IPsec-SA established: -¬ ESP/Tunnel 2001:db8:2:2::2->2001:db8:1:1::1 spi=253935531(0xf22bfab) -2005-01-01 20:31:10: INFO: IPsec-SA established: -¬ ESP/Tunnel 2001:db8:1:1::1->2001:db8:2:2::2 spi=175002564(0xa6e53c4) -]]>Jede Richtung bekommt einen eigenen SPI (wie im IPsec-Standard definiert). Mit “tcpdump” kann an der entprechenden Schnittstelle dann das Ergebnis eines IPv6-pings gesehen werden: - 2001:db8:2:2::2: ESP(spi=0x0a6e53c4,seq=0x3) -20:35:55.537522 2001:db8:2:2::2 > 2001:db8:1:1::1: ESP(spi=0x0f22bfab,seq=0x3) -]]>Wie erwartet, werden die ausgehandelten SPIs angezeigt. -Mit “setkey” werden die aktiven Parameter angezeigt: - -IKE-Daemon “pluto” -Der IKE-Daemon “pluto” ist in den Paketen der *S/WAN-Projekte beinhaltet. Das *S/WAN-Projekt startete zu Anfags als FreeS/WAN. Leider wurde die Weiterentwicklung von FreeS/WAN in 2004 eingestellt. Aufgrund der langsamen Entwicklungsgeschwindigkeit in der Vergangenheit entstanden zwei Spin-Offs: strongSwan und Openswan. Heutzutage stehen installationsfertige Pakete bereit, u.a. von Openswan (in Fedora Core 3 beinhaltet). -Ein großer Unterschied zu “racoon” ist, dass nur eine Konfigurationsdatei notwendig ist. Zudem steht ein initscript für automatisches Starten beim Booten zur Verfügung. -Konfiguration des IKE-Daemon “pluto” -Die Konfiguration ist der zu IPv4 sehr ähnlich, nur eine wichtige Option ist notwendig. -Datei: /etc/ipsec.conf -Zudem muss das gemeinsame Geheimnis definiert werden: -Datei: /etc/ipsec.secrets - -IPsec mit IKE daemon “pluto” starten -Wenn die Installation von Openswan erfolgreich war, sollte ein initscript zum Starten von IPsec zur Verfügung stehen. Dann einfach auf jedem Partner folgendes ausführen: -Danach kann die Verbindung auf einem Partner gestartet werden. Wenn im folgenden die Zeile “IPsec SA established” erscheint, hat die Aushandlung funktioniert. -0xa98b7710 <0xa51e1f22} -]]>Weil *S/WAN und setkey/racoon die gleiche IPsec-Implementation im Linux kernel 2.6.x benutzen, zeigt “setkey” auch hier die aktiven Parameter: - -Anmerkungen: -Bei Linux Kernel 2.6.x kann der IPsec-Status und die Policy auch mit “ip” angezeigt werden: - -<!-- anchor id="chapter-qos" -->Quality of Service (QoS) -IPv6 unterstützt QoS durch die Anwendung von Flow Labels und Traffic Classes. -Zusätzliche Infos: -RFC 3697 / IPv6 Flow Label Specification -General -Vernünftig funktionierendes QoS ist nur an der ausgehenden Schnittstelle eines Routers oder Host möglich, wo der Flaschenhals anfängt. Alles andere bereitet nur Probleme und funktioniert wahrscheinlich nicht so, wie erwartet. -------- - Queue 1 \ - --->--- ---->--------->--------->------------------- -Dicke Leitung Queue 2 Queue 1 / Queue 2 / Queue 3 Dünne Leitung - --->---- ---->--------->--------->------------------- - Queue 3 / -------------------->------- -]]> -Linux QoS mit “tc” -Linux benutzt “tc” vom Paket “iproute2”, um das Bandbreitenmanagement zu konfigurieren, allgemein beschrieben in Linux Advanced Routing & Traffic Control HOWTO. -Beispiel für eine Warteschlange mit konstanter Bitrate -Mit dem “cbq” Planer können Röhren mit konstanter Bitrate definiert werden. -Root qdisc Definition -Definition einer root qdisc mit einer Bandbreite von 1000 MBit/s an eth1 - -QoS class Definition -Definition einer Klasse 1:1 mit 1 MBit/s -Definition einer Klasse 1:2 mit 50 MBit/s -Definition einer Klasse 1:3 mit 10 MBit/s -Definition einer Klasse 1:4 mit 200 kBit/s - -QoS filter Definition -Definition eines Filters für IPv4 (protocol ip), TCP (match ip protocol 6 0xff) Zielport 5001 (match ip dport 5001 0xffff) unter Benutzung der Klasse 1:2 von oben -Definition eines Filters für IPv6 (protocol ip), TCP (match ip6 protocol 6 0xff) Zielport 5001 unter der Benutzung der Klasse 1:2 von oben -Definition eines Filters für IPv6 für Pakete mit Flowlabel 12345 (match ip6 flowlabel 0x12345 0x3ffff) unter der Benutzung der Klasse 1:3 von oben -Definition eines Filters für IPv6 für Pakete mit der Linux iptables Markierung 32 (handle 32 fw) unter der Benutzung der Klasse 1:4 von oben -Die letzte Filterdefinition benötigt auch einen Eintrag in ip6tables um das Paket zu markieren - -Testen der Filterdefinition mit iperf -Starten auf Serverseite in separaten Konsolen: -Starten auf Clientseite und Vergleichen der Ergebnisse: -> 50 MBit/s && <= 1000 MBit/s) -# iperf -V -c SERVER-IPv6 -p 5002 (erwartet: >> 50 MBit/s && <= 1000 MBit/s) -# iperf -V -c SERVER-IPv4 -p 5003 (erwartet: >> 50 MBit/s && <= 1000 MBit/s) -# iperf -V -c SERVER-IPv6 -p 5003 (erwartet: 200 kBit/s) -]]>Das Ergebnis der Transferraten sollten der Definitionen von oben entsprechen, das Ergebnis auf Port 5002 sollte ziemlich identisch unabhängig von der benutzten IP-Version sein. - -<!-- anchor id="chapter-hints-daemons" -->Hinweise zu IPv6 kompatiblen Daemons -Im folgenden Kapitel werden einige Hinweise zu IPv6 kompatiblen Daemons gegeben. -<!-- anchor id="hints-daemons-bind" -->Berkeley Internet Name Domain (BIND) daemon “named” -Seit der Version 9 wird IPv6 unterstützt. Setzen Sie immer die neuest verfügbare Version ein. Zumindest muss Version 9.1.3 eingesetzt werden, da ältere Versionen Sicherheitslöcher beinhalten können, die von Remote entsprechend ausgenutzt werden können. -Auf IPv6 Adressen hören -Anmerkung: Im Gegensatz zu IPv4 können bei aktuellen Versionen Server Sockets nicht an dedizierte IPv6 Adressen gebunden werden, es ist folglich jede oder keine Adresse gültig. Da dies ein Sicherheitsproblem sein kann, lesen Sie diesbezüglich ebenfalls den Abschnitt Access Control Lists (ACL) weiter unten! -BIND named konfigurieren, damit er auf IPv6 Adressen antwortet -Folgende Optionen müssen geändert werden, damit IPv6 aktiviert wird -Nach einem Neustart (des Dienstes) sollte z.B. Folgendes zu sehen sein: -Ein kleiner Test sieht wie folgt aus: -und sollte Ihnen ein Ergebnis anzeigen... -BIND named konfigurieren, damit er auf IPv6 Adressen nicht antwortet -Folgende Optionen müssen geändert werden, damit IPv6 deaktiviert wird: - -Access Control Lists (ACL) mit IPv6 Unterstützung -ACLs mit IPv6 Adressen sind realisierbar und sollten wann immer möglich eingesetzt werden. Ein Beispiel: -Diese ACLs können für Client-Anfragen und Zonentransfers zu Secondary Nameserver eingesetzt werden. Es kann auch unterbunden werden, dass ihr Caching-Nameserver mittels IPv6 von der Außenwelt verwendet wird. -Es ist ebenfalls möglich, dass die Optionen allow-query und allow-transfer bei den meisten Single-Zonen-Definitionen verwendet werden. -Anfragen mit festen IPv6 Adressen senden -Diese Option ist nicht verpflichtend, ev. aber benötigt: - port ; -]]> -Pro Zone definierte feste IPv6 Adressen -Es ist möglich pro Zone mehrere IPv6 Adressen zu definieren. -Transfer source Adresse -Die Transfer source Adresse wird für ausgehende Zonentransfers verwendet: - [port port]; -]]> -Notify source Adresse -Die Notify source Adresse wird für ausgehende notify Mitteilungen verwendet: - [port port]; -]]> -IPv6 DNS zone files Beispiele -Einige Informationen finden Sie auch unter IPv6 DNS Setup Information (article). Eventuell ebenfalls hilfreich ist folgendes Tool: IPv6 Reverse DNS zone builder for BIND 8/9 (webtool). -IPv6 bezogene DNS-Daten bereitstellen -Für IPv6 wurden neue Reverse Lookup Arten und Root Zonen definiert: -AAAA und reverse IP6.INT: beschrieben in RFC 1886 / DNS Extensions to support IP version 6 sowie seit BIND Version 4.9.6 in VerwendungA6, DNAME (WURDE ABGELEHNT!) und reverse IP6.ARPA: beschrieben in RFC 2874 / DNS Extensions to Support IPv6 Address Aggregation and Renumbering sowie seit BIND 9 in Verwendung. Informationen zum aktuellen Stand sind unter Domain Name System Extension (dnsext) zu finden.Mehr Inhalt zu diesem Thema wird eventuell in späteren Versionen eingearbeitet, inzwischen können Sie in den RFCs und in folgenden Quellen nachlesen: -AAAA und reverse IP6.INT: IPv6 DNS Setup InformationA6, DNAME (WURDE ABGELEHNT!) und reverse IP6.ARPA: lesen Sie im Kapitel 4 und 6 des BIND 9 Administrator Reference Manual (ARM) nach, welches mit dem bind-Paket mitgeliefert wird. Sie können es auch hier lesen: BIND manual version 9.3Da IP6.INT (ebenfalls) ABGELEHNT WURDE, (jedoch nach wie vor in Verwendung ist,) muss ein DNS Server, der IPv6 Informationen anbieten will, beide reverse Zonen bereitstellen. -Aktuell beste Praxis -Da es mit den neuen Formaten noch Probleme gibt, ist die aktuell beste Praxis: -Vorwärts-Auflösung mit: -AAAARückwärts-Auflösung mit: -Reverse nibble format für die Zone ip6.int (FÜR RÜCKWÄRTSKOMPATIBILITÄT)Reverse nibble format für die Zone ip6.arpa (EMPFHOHLEN) -IPv6 Verbindung überprüfen -Ob BIND auf einen IPv6 socket hört bzw. IPv6 Daten bereitstellt, können Sie anhand folgender Beispiele überprüfen. -IPv6 Verbindung durch ACL abgelehnt -Eine IPv6 Verbindung kann durch Angabe eines dedizierten Server, der abgefragt werden soll, erzwungen werden: -Ein entsprechender Log-Eintrag sieht wie folgt aus: -Wenn Sie diesen Eintrag in der Logdatei finden, prüfen Sie, ob von diesem Client Anfragen akzeptiert werden sollen und ggf. ändern Sie Ihre ACL Konfiguration. -Erfolgreiche IPv6 Verbindung -Eine erfolgreiche IPv6 Verbindung sieht wie folgt aus: - -<!-- anchor id="hints-daemons-xinetd" -->Internet super daemon (xinetd) -IPv6 wird ungefähr seit der xinetd Version 1.8.9 unterstützt. Verwenden sie immer die neueste Version, zumindest aber Version 2.3.3, da ältere Versionen Sicherheitslöcher beinhalten können, die von Remote entsprechend ausgenutzt werden können. -Einige Linux Distributionen beinhalten ein separates IPv6 kompatibles Paket des xinetd, bei anderen Distributionen wird der IPv6 kompatible xinetd mit folgender Variable zumeist in der Datei /etc/sysconfig/network (bei Red Hat kompatible Distributionen) gestartet: NETWORKING_IPV6="yes". In neuere Versionen unterstützt eine Binärdatei sowohl IPv4 als auch IPv6. -Wenn Sie nun einen "eingebauten" Service wie z.B. daytime durch folgende Änderung der Konfigurationsdatei /etc/xinetd.d/daytime aktivieren -dann sollten Sie nach einem Neustart des xinetd-Dienstes z.B. folgendes positive Ergebnis sehen: -Das Beispiel zeigt auch die xinetd Dienste IMAP und IMAP-SSL, die nur auf IPv4 Adressen hören. -Hinweis: frühere Versionen hatten ein Problem, dass der nur für IPv4 kompilierte xinetd nicht bei einem IPv6-aktivierten Knoten startete, und eine IPv6-aktivierte nicht bei einem Knoten, der nur IPv4 aktiv hatte. Dies sollte aber mindestens seit Version 2.3.11 gefixt sein. -<!-- anchor id="hints-daemons-apache2." -->Webserver Apache2 (httpd2) -IPv6 wird beim Apache Webserver durch die Entwickler seit der Version 2.0.14 unterstützt. Verfügbare Patches für die alte 1.3.x Serie sind inzwischen nicht mehr aktuell und sollten nicht mehr in öffentlich zugänglichen Umgebungen eingesetzt werden. Verfügbar sind die Patches noch unter KAME / Misc. -Auf IPv6 Adressen hören -Anmerkung: Virtuelle Hosts mit IPv6 Adressen sind bis zur Version 2.0.28 nicht operabel (es gibt für die Version 2.0.28 einen Patch). Testen Sie aber immer zuerst die neueste Version, da ältere Versionen mitunter auch Sicherheitsprobleme mit sich bringen können. -Virtueller Host mit IPv6 Adresse - - - ServerName ipv6only.yourdomain.yourtopleveldomain - # ...sure more config lines - -]]> -Virtueller Host mit IPv4 und IPv6 Adresse - - - ServerName ipv6andipv4.yourdomain.yourtopleveldomain - # ...sure more config lines - -]]>Das Ergebnis sollten nach einen Neustart des Dienstes etwa Folgendes sein: -Für einfache Tests können Sie auf das bereits gezeigte telnet-Beispiel zurückgreifen. -Zusätzliche Anmerkungen -Apache2 unterstützt eine Methode namens “sendfile”, um die Auslieferung von Datenn zu beschleunigen. Einige NIC-Treiber unterstützen auch offline das Berechnen der Checksumme. In einigen Fällen kann dies zu Verbindungsproblemen und ungültigen TCP-Checksummen führen. In diesen Fällen ist “sendfile” zu deaktivieren, entweder durch Rekompilieren unter der Benützung der configure-Option “--without-sendfile” oder durch Benützung der Direktive "EnableSendfile off" in der Konfigurationsdatei. -<!-- anchor id="hints-daemons-radvd" -->Router Advertisement Daemon (radvd) -Der Router Advertisement Daemon ist auf einem LAN dann sehr sinnvoll, wenn die Clients automatisch konfiguriert werden sollen. Der Daemon selbst sollte auf einem Linux Gateway Router eingerichtet sein (es hat nicht notwendigerweise das default IPv4 Gateway zu sein, Vorsicht also wer am LAN Router Advertisements versendet). -Sie können einige Flags und Informationen im Advertisement spezifizieren. Allgemein werden verwendet: -Präfix (notwendige Angabe)Lebensdauer des PräfixIntervall der Advertisements (optional)Nach der korrekten Konfiguration sendet der Daemon die Advertisements über angegebene Interfaces. Die Clients empfangen die Advertisements und konfigurieren automatisch Ihre Adressen mit dem empfangenen Präfix und der Default-Route. -radvd konfigurieren - -Einfache Konfiguration -Die Konfigurationsdatei des radvd ist normalerweise die Datei /etc/radvd.conf. Eine einfache Konfiguration sieht wie folgt aus: -Als Ergebnis auf der Client-Seite ergibt sich hieraus: - mtu 1500 qdisc pfifo_fast qlen 100 - inet6 2001:0db8:100:f101:2e0:12ff:fe34:1234/64 scope global dynamic - valid_lft 2591992sec preferred_lft 604792sec - inet6 fe80::2e0:12ff:fe34:1234/10 scope link -]]>Ein hoher Wert für die Lebensdauer wurde verwendet, da der Wert nicht manuell konfiguriert wurde. -Spezielle 6to4 Konfiguration -Seit der Version 0.6.2pl3 wird die automatische (Neu)-Erstellung des Präfixes abhängig von der IPv4 Adresse eines angegebenen Interfaces unterstützt. Dies kann dazu eingesetzt werden, die Advertisements dann in einem LAN zu verteilen, nachdem das 6to4 tunneling geändert wurde. Zumeist eingesetzt wird dies hinter einem dynamischen dial-on-demand Linux Router. Wegen der sicherlich kürzeren Lebensdauer dieser Präfixe (nach jedem dial-up ist ein anderes Präfix gültig), wird der Wert der Lebensdauer auf einen minimalen Wert gesetzt: -Das Ergebnis auf Clientseite ist (unter der Annahme, dass ppp0 die lokale IPv4 Adresse 1.2.3.4 hat): - mtu 1500 qdisc pfifo_fast qlen 100 - inet6 2002:0102:0304:f101:2e0:12ff:fe34:1234/64 scope global dynamic - valid_lft 22sec preferred_lft 12sec - inet6 fe80::2e0:12ff:fe34:1234/10 scope link -]]>Da eine kurze Lebensdauer definiert wurde, wird das Präfix bald verworfen werden, sollte kein entsprechendes Advertisement empfangen werden. -Achtung: wenn keine spezielle 6to4-Unterstützung der initscripts benutzt wird, ist eine spezielle Route am internen Interface des Routers notwendig, sonst gibt es Probleme bei eingehenden Paketen. Für das gezeigte Beispiel lautet diese: -Diese Route muß jedesmal, wenn der Prefix wechselt, ersetzt werden. Die ist dann der Fall, wenn das Dial-Up-Interface eine neue IPv4-Adresse bekommen hat. -Fehlersuche -Mit dem Programm “radvdump” können Sie gesendete und empfangene Advertisements detailliert betrachten. Die Anwendung ist einfach: -Im Output wird jedes Advertisement in einem lesbarem Format dargestellt. Zu sehen sollten die von Ihnen eingestellten Werte sein; falls dem nicht so ist, wurde das Advertisement eventuell nicht von Ihrem radvd gesendet... (für die Rückverfolgung des Routers können Sie die LLAddress, die MAC Adresse des Routers, verwenden...) -<!-- anchor id="hints-daemons-dhcpv6." -->Dynamic Host Configuration v6 Server (dhcp6s) -dhcp6s kann für stateful Konfiguration benutzt werden. Der Daemon selbst muß nicht unbedingt auf dem Linux-Standard-Router laufen. -Man kann hier mehr Informationen als bei radvd spezifizieren. Die meisten sind denen des IPv4 DHCP-Servers ähnlich. -Nach einer passenden Konfiguration reagiert der Daemon auf empfangene IPv6-Multicast-Pakete, die von einem Client an die Adresse ff02::1:2 gesendet werden. -Konfiguration des DHCPv6-Servers (dhcp6s) - -Einfache Konfiguration -Die Konfigurationsdatei des dhcp6s ist normalerweise /etc/dhcp6s.conf. Ein einfaches Beispiel sieht wie folgt aus: - -Konfiguration des DHCPv6-Client (dhcp6s) - -Einfache Konfiguration -Die Konfigurationsdatei von dhcp6c ist normalerweise /etc/dhcp6c.conf. Ein einfaches Beispiel sieht wie folgt aus: - -Benutzung - -dhcp6s -Starten des Servers, z.B. durch - -dhcp6c -Starten des Clients im Vordergrund, z.B. durch - -Fehlersuche - -dhcp6s -Der Server hat einen Vordergrund und zwei Debug-Schalter (von denen beide benutzt werden sollten), hier ein Beispiel: - -dhcp6c -Mit einem IPv6 Ping an die DHCP Multicast-Adresse kann getestet werden, ob der IPv6 DHCP Server überhaupt erreichbar ist am Link. -Der Client hat einen Vordergrund und zwei Debug-Schalter, hier ein Beispiel: -Bemerkung: die netlink-Fehlermeldungen haben keinen Einfluß auf die Funktionalität. -<!-- anchor id="hints-daemons-isc-dhcp" -->ISC Dynamic Host Configuration Server (dhcpd) -ISC DHCP unterstützt IPv6 seit der Version 4.x. -Konfiguration des ISC DHCP Server für IPv6 (dhcpd) -Es ist zu beachten, daß der ISC DHCP Server aktuell entweder IPv4 oder IPv6 bedienen kann, nicht beides, d.h. der Daemon muß zweimal gestartet werden (für IPv6 mit Option “-6”) um beide Protokolle zu unterstützen. -Einfache Configuration -Erstellen einer eigenen Konfigurationsdatei /etc/dhcp/dhcpd6.conf für den IPv6-Teil des dhcpd. Es ist zu beachten, daß der router natürlich eine Schnittstelle mit einer IPv6-Adresse aus dem definierten Subnetz konfiguriert haben muß. -Es ist zu beachten, dass die “dhcp.client-id” nicht länger die MAC-Adresse ist, sondern eine per System eindeutige ID! “dhcp6c” (siehe oben) benutzt die Datei /var/lib/dhcpv6/dhcp6c_duid (wird beim ersten Start erstellt, falls nicht vorhanden) als eindeutige ID. Es ist eine 14 Byte lange ID, welche mit einer 2 Byte Längeninformation startet (üblicherweise “0x000e”): - -Benutzung - -dhcpd -Starte den Server im Vordergrund: - -<!-- anchor id="hints-daemons-dibbler" -->DHCP Server Dibbler -Dibbler ist auch ein DHCP server. -Konfiguration des Dibbler DHCP server für IPv6 - -Einfache Konfuration -Erstellen der Konfigurationsdatei /etc/dibbler/server.conf . Es ist zu beachten, daß der router natürlich eine Schnittstelle mit einer IPv6-Adresse aus dem definierten Subnetz konfiguriert haben muß. - -Benutzung - -dibbler-server -Start Server im Vorgergrund: -,Marek Senderski -| Licence : GNU GPL v2 only. Developed at Gdansk University of Technology. -| Homepage: http://klub.com.pl/dhcpv6/ -2009.05.28 10:18:48 Server Notice My pid (1789) is stored in /var/lib/dibbler/server.pid -2009.05.28 10:18:48 Server Notice Detected iface eth0/3, MAC=54:52:00:01:23:45. -2009.05.28 10:18:48 Server Notice Detected iface eth1/2, MAC=54:52:00:67:89:ab. -2009.05.28 10:18:48 Server Notice Detected iface lo/1, MAC=00:00:00:00:00:00. -2009.05.28 10:18:48 Server Debug Skipping database loading. -2009.05.28 10:18:48 Server Debug Cache:server-cache.xml file: parsing started, expecting 0 entries. -2009.05.28 10:18:48 Server Notice Parsing /etc/dibbler/server.conf config file... -18:48 Server Debug Setting 0 generic option(s). -18:48 Server Debug 0 per-client configurations (exceptions) added. -18:48 Server Debug Parsing /etc/dibbler/server.conf done. -18:48 Server Info 0 client class(es) defined. -18:48 Server Debug 1 interface(s) specified in /etc/dibbler/server.conf -18:48 Server Info Mapping allow, deny list to class 0:0 allow/deny entries in total. -18:48 Server Info Interface eth1/2 configuration has been loaded. -18:48 Server Notice Running in stateful mode. -18:48 Server Info My DUID is 00:01:00:01:11:aa:6d:a7:54:52:00:67:89:ab. -18:48 Server Notice Creating multicast (ff02::1:2) socket on eth1/2 (eth1/2) interface. -18:48 Server Debug Cache: size set to 1048576 bytes, 1 cache entry size is 87 bytes, so maximum 12052 address-client pair(s) may be cached. -18:48 Server Notice Accepting connections. Next event in 4294967295 second(s). -]]> -<!-- anchor id="hints-daemons-tcpwrapper" -->tcp_wrapper -Mit der tcp_wrapper Programmbibliothek können Sie Ihre Dienste gegen Missbrauch schützen. -Filter-Funktionalität -Sie können tcp_wrapper für folgende Zwecke einsetzen: -Nach Source-Adressen filtern (IPv4 oder IPv6)Nach Benutzern filtern (benötigt einen aktiven ident Daemon auf der Client-Seite) -Welches Programm benützt tcp_wrapper -Folgende Programme sind bekannt: -Jeder Dienst, der durch den xinetd aufgerufen wird (und wenn der xinetd mit der tcp_wrapper Bibliothek kompiliert wurde)sshd (wenn der mit der tcp_wrapper Bibliothek kompiliert wurde) -Anwendung -Der tcp_wrapper wird durch zwei Dateien konfiguriert und kontrolliert: /etc/hosts.allow sowie /etc/hosts.deny. Weitere Informationen finden Sie mit: - -Beispiel für /etc/hosts.allow -In dieser Datei wird ein Dienst pro Zeile eingetragen, der positiv gefiltert werden soll (d.h. Verbindungen werden erlaubt). -Achtung: es existieren fehlerhafte Implementierungen, welche folgende fehlerhafte IPv6-Netzwerk-Beschreibung unterstützen: [2001:0db8:100:200::/64]. Hoffentlich werden diese Versionen bald gefixt. -Beispiel für /etc/hosts.deny -In dieser Datei werden alle Einträge negativ gefiltert. Und normalerweise sollen alle Verbindungen unterbunden werden: -Sie können bei Bedarf obige Standardzeile auch durch Folgende ersetzen, jedoch wird dadurch bei zu vielen Verbindungen in kurzer Zeitz eine DoS Angriff möglich (Last des Mailers sowie des Spool-Verzeichnisses). Ein logwatch ist somit wahrscheinlich die bessere Lösung. - -Protokollierung -Entsprechend der Syslog Daemon Konfiguration in der Datei /etc/syslog.conf protokolliert der tcp_wrapper normalerweise in die Datei /var/log/secure. -Abgelehnte Verbindung -Das Logging einer abgelehnten IPv4-Verbindung zu einem durch den xinetd überwachten Daytime Dienst sieht wie folgt aus: -Das Logging einer abgelehnten IPv4-Verbindung zu einem durch den xinetd überwachten sshd Daemon (auf IPv4 und IPv6 auf Verbindungen wartend) sieht wie folgt aus: - -Akzeptierte Verbindung -Das Logging einer akzeptierten IPv4-Verbindung zu einem durch den xinetd überwachten Daytime Dienst sieht wie folgt aus: -Das Logging einer akzeptierten IPv4-Verbindung zu einem auf zwei Ports hörenden sshd sieht wie folgt aus: - -<!-- anchor id="hints-daemons-vsftpd" -->vsftpd - -Auf IPv6-Adressen lauschen -Editiere die Konfigurationsdatei, üblicherweise /etc/vsftpd/vsftpd.conf, und setze die Option für das “listen” wie folgt: -Mehr ist nicht zu tun. -<!-- anchor id="hints-daemons-proftpd" -->proftpd - -Auf IPv6-Adressen lauschen -Editiere die Konfigurationsdatei, üblicherweise /etc/proftpd.conf, allerdings ist hier zu beachten, daß dies in der Konfigurationsart virtueller Host nicht 100% logisch ist - - ... - Bind 2001:0DB8::1 - ... - -]]>Mehr ist nicht zu tun. -<!-- anchor id="hints-daemons-others" -->Andere Daemons -Seit einiger Zeit ist dies meist einfach, suchen Sie einfach nach einer Kommandozeilen-Option oder einer Konfigurationsvariable, um das Lauschen an IPv6-Adressen zu aktivieren. Schauen Sie dazu in den Manual-Seiten des Daemons oder in den entsprechenden FAQs nach. Es kann allerdings durchaus sein, daß sich der Daemon nur an die IPv6-“any”-Adresse (::) binden läßt und kein dediziertes Binden an eine spezielle IPv6-Adresse möglich ist (das hängt von der Unterstützung des Programmierers ab). -<!-- anchor id="chapter-programming" -->Programmierung - -<!-- anchor id="chapter-section-using-API" --><!-- anchor id="chapter-programming-using-API" -->Programmierung mit Nutzung der C-API -Dieser Abschnitt ist momentan nicht in Deutsch verfügbar, die englische Version ist verfügbar unter: TLDP / Linux+IPv6-HOWTO / Programming using C-API -Andere Programmiersprachen - -JAVA -In Sun Java Versionen ab 1.4 ist Unterstützung für IPv6 vorhanden, siehe dazu auch die Klasse Inet6Address (1.5/5.0). Weitere Tipps sind verfügbar im Networking IPv6 User Guide for JDK/JRE 1.4 und 1.5 (5.0). -Perl -Stand Mai 2007 ist nichts bekannt, daß der Kern von Perl IPv6 nativ unterstützt. Dies kann allerdings aktiviert werden durch Benützung des folgenden Moduls: -Socket6Zudem existieren weitere Module für/mit IPv6 Unterstützung (z.B. Net::IP), suche nach “IPv6” bei http://search.cpan.org/. -<!-- anchor id="chapter-interoperability" -->Interoperabilität -Das TAHI Project prüft das Zusammenspiel der verschiedenen Betriebssysteme in Hinblick auf IPv6 Funktionalität und Implementierung. Der Linux Kernel hat bereits das IPv6 Ready Logo Phase 1 bekommen. -<!-- anchor id="chapter-information" -->Weitere Informationen und URLs - -<!-- anchor id="information-books" -->Gedruckte Bücher, Artikel, Onlinerezensionen - -Gedruckte Bücher (Englisch) - -Cisco - -Cisco Self-Study: Implementing IPv6 Networks (IPV6), von Regis Desmeules. Cisco Press; ISBN 1587050862; 500 Seiten; 1. Edition (April 11, 2003). -Anmerkung: Dieser Titel wird am 11. April 2003 publiziert.Configuring IPv6 with Cisco IOS, von Sam Brown, Sam Browne, Neal Chen, Robbie Harrell, Edgar, Jr. Parenti (Editor), Eric Knipp (Editor), Paul Fong (Editor) 362 Seiten; Syngress Media Inc; ISBN 1928994849; (July 12, 2002). -Allgemein - -IPv6 in Practice: A Unixer's Guide to the Next Generation Internet von Benedikt Stockebrand, November 2006; ISBN 3-540-24524-3IPv6 Essentials von Silvia Hagen, zweite Auflage, Mai 2006; ISBN 0-5961-0058-2 -ToC, Index, Sample Chapter etc.; O'Reilly PressreleaseIPv6: The New Internet Protocol. Von Christian Huitema; Publiziert von Prentice-Hall; ISBN 0138505055. -Beschreibung: Dieses Buch, geschrieben von Christian Huitema - einem Mitglied des Internet Architecture Board, bietet eine exzellente Beschreibung von IPv6, die Unterschiede zu IPv4 sowie die 'wies' und 'warums' der IPv6 Entwicklung. -Quelle: http://www.cs.uu.nl/wais/html/na-dir/internet/tcp-ip/resource-list.htmlIPv6 Networks von Niles, Kitty; (ISBN 0070248079); 550 Seiten; Datum der Veröffentlichung: 05/01/1998.Implementing IPV6. Supporting the Next Generation Internet Protocols von P. E. Miller, Mark A. Miller; Hrsg.: John Wiley & Sons; ISBN 0764545892; 2. Edition (15.März 2000); 402 Seiten.Big Book of Ipv6 Addressing Rfcs von Peter H. Salus (Compiler), Morgan Kaufmann (Hrsg.), April 2000, 450 Seiten ISBN 0126167702. Understanding IPV6 von Davies, Joseph; ISBN 0735612455; Datum der Veröffentlichung: 05/01/2001; 350 Seiten.Migrating to IPv6 - IPv6 in Practice von Marc Blanchet; John Wiley & Sons (Hrsg.); ISBN 0471498920; 1. Edition (November 2002); 368 Seiten.Ipv6 Network Programming von Jun-ichiro Hagino; ISBN 1555583180Wireless boosting IPv6 von Carolyn Duffy Marsan, 10/23/2000.O'reilly Network search for keyword IPv6 ergibt 29 Treffer (28. Januar 2002) -Artikel, eBooks, Online Rezensionen - -Getting Connected with 6to4 von Huber Feyrer, 06/01/2001Transient Addressing for Related Processes: Improved Firewalling by Using IPv6 and Multiple Addresses per Host; geschrieben von Peter M. Gleiz, Steven M. Bellovin (PC-PDF-Version; Palm-PDF-Version; PDB-Version)Internetworking IPv6 with Cisco Routers von Silvano Gai, McGrawHill Italia, 1997. Die 13 Kapitel und der Anhang A-D sind als PDF-Dokument 'downladbar'.Migration and Co-existence of IPv4 and IPv6 in Residential Networks von Pekka Savola, CSC/FUNET, 2002 -<!-- anchor id="information-sciencepublication" -->Wissenschaftliche Publikationen (Kurzbeschreibungen, Bibliographien, Online Quellen) -Siehe auch: liinwww.ira.uka.de/ipv6 bzw. Google / Scholar / IPv6 -GEANT IPv6 WorkplanIPv6 Trials on UK Academic Networks: Bermuda Project Aug.2002: Participants - Getting connected - Project deliverables - Network topology - Address assignments - Wireless IPv6 access - IPv6 migration - Project presentations - Internet 2 - Other IPv6 projects - IPv6 fora and standards Bermuda 2...http://www.ipv6.ac.uk/IPv6 at the University of SouthamptonMicrosoft Research IPv6 Implementation (MSRIPv6): MSRIPv6 Configuring 6to4 - Connectivity with MSR IPv6 - Our 6Bone Node... -Sonstiges -Mehr Infos gibt es unter: SWITCH IPv6 Pilot / References -<!-- anchor id="information-conferences" -->Konferenzen und Meetings -Fehlt etwas? Vorschläge sind willkommen! -2004 - -1st Global IPv6 Summit in Sao Paul, Brasil -<!-- anchor id="information-onlineinformation" -->Online-Informationen - -<!-- anchor id="information-joinipv6." -->Mit dem IPv6 Backbone verbinden -Mehr Infos in späteren Versionen... Vorschläge sind Willkommen! -<!-- anchor id="information-globalregistries" -->Globale Registrierungsstellen -Siehe regionale Registrierungsstellen. -<!-- anchor id="information-majorregionregistries" -->Regionale Haupt-Registrierungsstellen - -Amerika: ARIN, ARIN / registration page, ARIN / IPv6 guidelinesEMEA: Ripe NCC, Ripe NCC / registration page, Ripe NCC / IPv6 registrationAsien/Pazifik: APNIC, APNIC / IPv6 ressource guideLatein Amerika und Karikik: LACNIC, IPv6 Registration Services, IPv6 Allocation PolicyAfrika: AfriNICEs existiert auch eine Liste der größten Zuteilungen sortiert nach lokalen Registrierungsstellen: Ripe NCC / IPv6 allocations. -<!-- anchor id="information-joinipv6-tunnelbrokers" -->Tunnel-Broker -Anmerkung: Eine Tunnel-Broker Liste ist im Abschnitt Tunnel broker weiter unten zu finden. -Former IPng. Tunnelbroker and IPv6 resources, now migrated to the SixXs System.Eckes IPv6-with-Linux Seite.tunnelc - ein Perl basiertes Tunnel Client Script: -freshmeat.net: Project details for tunnel client -SourceForge: Project Info - tunnelc (also here)Linux Advanced Routing & Traffic Control HOWTO, Chapter 6: IPv6 tunneling with Cisco and/or 6bone. -<!-- anchor id="information-joinipv6-6to4-tunneling" -->6to4 - -NSayer's 6to4 informationRFC 3068 / An Anycast Prefix for 6to4 Relay Routers -<!-- anchor id="information-joinipv6-isatap-tunneling" -->ISATAP - -ISATAP (Intra-Site Automatic Tunnel Access Protocol) Information by JOIN -Neueste Nachrichten und URLs zu anderen Dokumenten - -Viele URLs zu anderen Dokumenten von Anil Edatharago6 - The IPv6 Portal: ein IPv6 Online-Portal mit einem WIKI-basierenden IPv6-Know-How-Schwerpunkt, einem IPv6-Diskussionsforum, einer aktuellen Sammlung von IPv6-Events und Nachrichten, freiem IPv6-Zugang und Services, IPv6 Software-Applikationen und viel mehr -Protokoll-Informationen - -IPv6 bezogene Request For Comments (RFCs) -Das veröffentlichen einer Liste mit IPv6 relevanter RFCs geht über den Rahmen dieses Dokumentes hinaus, unter folgenden Links können Sie jedenfalls diverse Listen finden: -sortierte Liste:IPng Standardization Status oder IPng Current Specifications von Robert HindenIPv6 Related Specifications auf IPv6.org -Aktuelle Entwürfe diverser Arbeitsgruppen -Aktuelle (auch) IPv6-bezogene Drafts finden Sie hier: -IP Version 6 (ipv6)Next Generation Transition (ngtrans)Dynamic Host Configuration (dhc)Domain Name System Extension (dnsext)IPv6 Operations (v6ops)Mobile IP (mobileip)Get any information about IPv6, from overviews, through RFCs & drafts, to implementations (inklusive Verfügbarkeit der Stacks auf verschiedenen Plattformen & Quellcode diverser IPv6 Stacks) -Sonstige - -SWITCH IPv6 Pilot / References, umfangreiche Liste mit IPv6 Quellen betreut von Simon Leinen -Weitere Informationen -DeepSpace6 / Weitere interessante Links -Linux Informationen - -DeepSpace6 / (Not only) Linux IPv6 Portal - Italien (Spiegel)IPv6-HowTo for Linux by Peter Bieringer - Deutschland, und sein Bieringer / IPv6 - software archiveLinux+IPv6 status by Peter Bieringer - DeutschlandDeepSpace6 / IPv6 Status Page - Italien (Spiegel) (ersetzt das oben genannte in Zukunft)USAGI project - Japan, und deren USAGI project - software archiveLinux Optimized Link State Routing Protocol (OLSR) IPv6 HOWTOLinShim6 -Informationen zu Linux-Distributionen - -PLDPLD Linux Distribution (“Marktführer” bei inkludierten IPv6 fähigen Paketen))Red HatRed Hat Enterprise Linux, Pekka Savola's IPv6 packages (historisch)FedoraFedora (Project) LinuxDebianDebian Linux, IPv6 with Debian LinuxSuSESuSE LinuxMandrivaMandriva (historisch)Weitere Details siehe unter IPv6+Linux Status Distributions. -Allgemeine Informationen - -IPv6.org6boneWIDE project - JapanSWITCH IPv6 Pilot - SchweizIPv6 Corner of Hubert Feyrer - DeutschlandIPv6 Forum - ein weltweites Konsortium führender Internet-Hersteller, Forschungs- & Bildungseinrichtungen... Playground.sun.com / IPv6 Info Page - betreut von Robert Hinden, Nokia. Hier gibt es jede Information zum Thema IPv6: Zusammenfassungen, RFCs & Drafts, Implementierungen (Verfügbarkeit der Stacks auf verschiedenen Plattformen & Quellcode diverser IPv6 Stacks). 6INIT - IPv6 Internet Initiative - ein Fifth Framework Projekt der EU im Rahmen des IST Programmes.IPv6 Task Force (European Union)6init - IPv6 INternet IniTiative IPv6: The New Version of the Internet Protocol, von Steve Deering.IPv6: The Next Generation Internet Protocol, von Gary C. Kessler. IPv6: Next Generation Internet Protocol - 3Cominternet || site und internet2 Working GroupNetworkWorldFusion: Search / Doc Finder: searched for IPv6 (102 Dokumente gefunden - 22.12.2002) The Register (Suche nach IPv6 ergab 30 Dokumente, 22.12.2002) ZDNet Search for IPv6TechTarget Search for IPv6IPv6 & TCP Resources ListFehlt etwas? Vorschläge sind Willkommen! -<!-- anchor id="information-marketresearch" -->Marktforschung - -statista - The Statistics PortalMarket Research -<!-- anchor id="information-patents" -->Patente - -Delphion Research: Patent Search Page. Basic (kostenlose) Registrierung ist notwendig. Beispiele für die Suche nach IPv6 (vom 21.12.2002): -Communicating method between IPv4 terminal and IPv6 terminal and IPv4-IPv6 converting apparatus -Translator for IP networks, network system using the translator, and IP network coupling method therefor -Sortiert nach Ländern - -Europa - -www.ist-ipv6.org: IST IPv6 Cluster, European IPv6 Research and Development ProjectsEuro6IX: European IPv6 Internet Exchanges Backbone -Australien - -Carl's Australian IPv6 Pages (alter Inhalt) -Belgien -Vorschläge sind Willkommen! -Brasilien - -IPv6 do Brasil -China -Vorschläge sind Willkommen! -Deutschland - -OpenBC / IPv6 -Frankreich - -Renater: Renater IPv6 Projekt SeiteIPv6 - RSVP - ATM at INRIANetBSD IPv6 Dokumentation -Großbritannien - -British Telecom IPv6 Home: BT's ISP IPv6 Versuch, Englands erster IPv6 Internet Exchange etc. -Indien -Vorschläge sind willkommen! -Italien - -Project6: IPv6 mit Linux -Japan - -Yamaha IPv6 (sorry, alles in japanischer Sprache ...) -Korea - -ETRI: Electronics and Telecommunications Research InstitutIPv6 Forum Korea: IPv6 Infrastruktur Projekt in Korea -Mexiko - -IPv6 Mexico (spanische & englische Version) - IPv6 Projekt Homepage der National Autonomous University of Mexico (UNAM) -Niederlande - -SURFnet: SURFnet IPv6 BackboneSTACK, STACK (IPv6): Computer-Studendten-Verband der Eindhoven University of Technology, Niederlande. IPng.nl: Zusammenarbeit zwischen WiseGuys und Intouch. -Österreich - -IPv6@IKNnet and MIPv6 Research Group: TU Vienna, Austria (IPv6: Projekte, Publikationen, Diplom- / Doktorarbeiten, Konferenzunterlagen etc.) -Portugal -Vorschläge sind willkommen! -Russland - -IPv6 Forum for Russia: Yaroslavl State University Internet Center -Schweiz -Vorschläge sind willkommen! -Sortiert nach Betriebssystemen - -*BSD - -KAME project (*BSD)NetBSD's IPv6 Networking FAQFreeBSD Ports: Ipv6 -Cisco IOS - -Cisco IOS IPv6 Entry PageIPv6 for Cisco IOS Software, Datei 2 von 3: Aug 2002 -- Inhalt: IPv6 for Cisco IOS Software; Configuring Documentation Specifics; Enabling IPv6 Routing and Configuring; IPv6 Addressing; Enabling IPv6 Processing Globally.Cisco Internet Networking Handbook, Chapter IPv6 -HPUX - -comp.sys.hp.hpux FAQ -IBM - -Now that IBM's announced the availability of z/OS V1.4, what's new in this release? Die Frage wurde am 15. August 2002 'geposted'. -Microsoft - -Microsoft Windows 2000 IPv6 MSRIPv6 - Microsoft Research Network - IPv6 Homepage Internet Connection Firewall Does Not Block Internet Protocol Version 6 Traffic (6.11.2001)Internet Protocol Numbers (8.10.2002)IPv6 Technology Preview Refresh (16.10.2002)HOW TO: Install and Configure IP Version 6 in Windows .NET Enterprise Server (26.10.2002)Windows .NET Server 6to4 Router Service Quits When You Advertise a 2002 Address on the Public Interface (28.10.2002)msdn - Microsoft Windows CE .NET - IPv6 commands -Solaris - -Sun Microsystems SolarisSolaris 2 Frequently Asked Questions (FAQ) 1.73 -Sumitoma - -Sumitomo Electric has implemented IPv6 on Suminet 3700 family routers -ZebOS - -IpInfusion's ZebOS Server Routing Software -<!-- anchor id="information-ipv6andsecurity" -->IPv6 Sicherheit - -Internet Security Systems: Security Center, X-Force Database Search (21.12.2002 - 6 Themen bez. IPv6 gefunden)NIST IPsec Project ( National Institute of Standards and Technology, NIST)Information SecurityNewOrder.box.sk (search for IPv6) (Artikel, Exploits, Datei-Datenbank etc.) -Programm-Listen - -DeepSpace6 / IPv6 Status Page (Mirror)IPv6.org / IPv6 enabled applicationsFreshmeat / IPv6 search, aktuell (14 Dez. 2002) 62 ProjekteIPv6 Forum / Web Links -Analyse-Werkzeuge - -Wireshark (ehemals Ethereal) is ein kostenloser Netzwerkprotokoll-Analyseprogramm für Unix und Windows Radcom RC100-WL - Download Radcom RC100-WL Protokollanalyseprogramm version 3.20 -IPv6 Produkte - -6wind - Lösungen für IPv4/IPv6 Router, QoS, Multicast, Mobility, Security/VPN/Firewall.Fefe's patches for IPv6 with djbdns - Aug 2002 - Was ist djbdns und warum es IPv6 benötigt? djbdns ist ein vollwertiger DNS Server, welcher “outperforms BIND in nearly all respects”.ZebOS Server Routing Suite Inframail (Advantage Server Edition)HTTrack Website CopierCommViewPosadis -<!-- anchor id="information-snmp" -->SNMP - -comp.protocpols.snmp SNMP FAQ Part 1 of 2 -IPv6 Infrastruktur - -Statistiken - -IPv6 routing table history erstellt von Gert Döring, Space.NetOfficial 6bone Webserver list Statisic -Internet Exchanges -Eine weitere Liste von IPv6 Internet Exchanges gibt es unter: IPv6 status of IXPs in Europe -<!-- anchor id="information-ipv6exchanges-germany" -->Deutschland - -INXS: (Cable & Wireless) München und Hamburg -<!-- anchor id="information-ipv6exchanges-estonia" -->Estlanda - -TIX (Tallinn Interneti eXchange mit IPv6 Support) -<!-- anchor id="information-ipv6exchanges-europe" -->Europa - -Euro6IX, European IPv6 Internet Exchange Backbone -<!-- anchor id="information-ipv6exchanges-france" -->Frankreich - -French National Internet Exchange IPv6 (seit 1.11.2002 aktiv). -FNIX6 bietet ISPs im Großraum Paris den Dienst eines kostenlosen und zuverlässlichen High Speed FastEthernet Internet Exchange. -<!-- anchor id="information-ipv6exchanges-uk" -->Großbritannien - -UK6X: LondonXchangePoint: London -<!-- anchor id="information-ipv6exchanges-japan" -->Japan - -NSPIXP-6: IPv6--basierter Internet Exchange in TokioJPIX, Tokio -<!-- anchor id="information-ipv6exchanges-korea" -->Korea - -6NGIX -<!-- anchor id="information-ipv6exchanges-netherlands" -->Niederlande - -AMS-IX: Amsterdam Internet Exchange -<!-- anchor id="information-ipv6exchanges-usa" -->USA - -6TAP: Chicago. Bietet weltweit Peerings an.PAIX: Palo Alto -<!-- anchor id="information-Tunnelbroker" -->Tunnel broker -Auch interessant: http://www.deepspace6.net/docs/tunnelbrokers.html -<!-- anchor id="information-tunnelbroker-belgium" -->Belgien -Fehlt etwas? Vorschläge sind willkommen! -<!-- anchor id="information-tunnelbroker-canada" -->Canada - -Freenet6 - /48 Delegation, Canada -Getting IPv6 Using Freenet6 on Debian -Freenet6 creater -<!-- anchor id="information-tunnelbroker-china" -->China -Fehlt etwas? Vorschläge sind willkommen! -<!-- anchor id="information-tunnelbroker-germany" -->Deutschland - -6bone Knoten Leipzig -Info bez. Hackangriff (2001) -<!-- anchor id="information-tunnelbroker-estonia" -->Estlanda - -Estpak -<!-- anchor id="information-tunnelbroker-uk" -->Großbritannien - -NTT, Großbritannien - IPv6 Versuch. IPv4 Tunnel und native IPv6 Standleitungs-Verbindungen. POPs gibt es in: London, Düsseldorf, New Jersey (USA, East Coast) Cupertino (USA, West Coast) Tokio -<!-- anchor id="information-tunnelbroker-italy" -->Italien - -Comv6Bersafe (italienische Sprache) -<!-- anchor id="information-tunnelbroker-japan" -->Japan -Fehlt etwas? Vorschläge sind willkommen! -<!-- anchor id="information-tunnelbroker-malaysia" -->Malaysia -Fehlt etwas? Vorschläge sind willkommen! -<!-- anchor id="information-tunnelbroker-netherlands" -->Niederlande - -IPng Netherland - Intouch, SurfNet, AMS-IX, UUNet, Cistron, RIPE NCC und AT&T sind am AMS-IX angeschlossen. Unter bestimmten Voraussetzungen ist es möglich, einen statischen Tunnel zu bekommen.SURFnet Customers -<!-- anchor id="information-tunnelbroker-norway" -->Norwegen - -UNINETT - Pilot IPv6 Service (für Kunden): tunnelbroker & address allocation -Uninett-Autoupdate-HOWTO -<!-- anchor id="information-tunnelbroker-spain" -->Spanien - -Consulintel -<!-- anchor id="information-tunnelbroker-switzerland" -->Schweiz -Fehlt etwas? Vorschläge sind willkommen! -<!-- anchor id="information-tunnelbroker-usa" -->USA - -ESnet, USA - Energy Sciences Network: Tunnel Registry & Address Delegation für direkt angeschlossene ESnet Sites und ESnet Partner.Hurricane Electric, US backbone; -Hurrican Electric Tunnelbroker (also available under http://tunnelbroker.com/) -Presseaussendung: Hurricane Electric Upgrades IPv6 Tunnel Broker -Tunnel Broker Endpoint Autoupdate, Perl Skript -<!-- anchor id="information-tunnelbroker-singapore" -->Singapore -Fehlt etwas? Vorschläge sind Willkommen! -<!-- anchor id="information-tunnelbroker-more" -->Weitere Tunnel broker... - -Public 6to4 relay routers (MS IIE Boycott!) -<!-- anchor id="information-infrastructure-nativeipv6service" -->Native IPv6 Dienste -Anmerkung: Die folgenden Dienste sind meist nur mit einer gültigen IPv6 Verbbindung erreichbar! -<!-- anchor id="information-nativeipv6nntp" -->Net News (NNTP) -Fehlt etwas? Vorschläge sind Willkommen! -<!-- anchor id="information-nativeipv6gameserver" -->Spiele Server - -Quake2 über IPv6 -<!-- anchor id="information-nativeipv6ircserver" -->IRC Server -Fehlt etwas? Vorschläge sind Willkommen! -Radiosender, Musik-Streams -Fehlt etwas? Vorschläge sind Willkommen! -<!-- anchor id="information-nativeipv6webserver" -->Web Server - -Peter Bieringer's Home of Linux IPv6 HOWTO Fehlt etwas? Vorschläge sind Willkommen! -<!-- anchor id="information-maillists" -->Mailinglisten -Weitere Listen von Mailinglisten sind verfügbar unter: -DeepSpace6 / Mailling ListsDie größten Mailinglisten sind in folgender Tabelle zusammengefasst: -. - - - - - - - - - -Schwerpunkt -Request e-mail Adresse -Abonnieren -e-mail Adresse der Mailingliste -Sprache -Zugang via WWW - - -Linux Kernel Networking inkl. IPv6 -majordomo (at) vger.kernel.org -netdev -netdev (at) vger.kernel.org -Englisch -Info, Archive - - -Mobile IP(v6) für Linux -Web-based, see URL -mipl -mipl (at) mobile-ipv6.org -Englisch -Info, Archive - - -Linux IPv6 User & USAGI -usagi-users-ctl (at) linux-ipv6.org - -usagi-users (at) linux-ipv6.org -Englisch -Info / Search, Archive - - -IPv6 und Debian Linux -Web-based, siehe URL - -debian-ipv6 (at) lists.debian.org -Englisch -Info/Subscription/Archive - - -6bone -majordomo (at) isi.edu -6bone -6bone (at) isi.edu -Englisch -Info, Archive - - -IPv6 User allgemein -majordomo (at) ipv6.org -users -users (at) ipv6.org -Englisch -Info, Archive - - -Bugtracking Internet Programme (1) -bugtraq-subscribe (at) securityfocus.com - -bugtraq (at) securityfocus.com (3) -Englisch -Info, Archive - - - -. -(1) sehr empfohlen wenn Sie Server-Programme zur Verfügung stellen. -(2) Mailingliste ist moderiert. - -Fehlt etwas? Vorschläge sind Willkommen! - -Via Web sind auch folgende Mailinglisten & Newsgroups verfügbar: -student-ipv6 (India) -Beschreibung: Dies ist eine Newsgruppe für die 'Student Awareness group of IPv6' in Indiensun-ipv6-users -Beschreibung: Bitte berichten Sie Probleme/Vorschläge in Bezug auf die IPng Implementation von SUN MicrosystemsIPv6-BITS -Beschreibung: Diese Liste dient der Koordination des Projekts Vertebrae.linux-bangalore-ipv6 -Beschreibung: Die IPv6 deployment Liste der Bangalore Linux User Grouppacket-switching -Beschreibung: Dies Liste behandelt folgende Themen: packet switching theory, technology, implementation and application in any relevant aspect including without limitation LAPB, X.25, SDLC, P802.1d, LLC, IP, IPv6, IPX, DECNET, APPLETALK, FR, PPP, IP Telephony, LAN PBX systems, management protocols like SNMP, e-mail, network transparent window systems, protocol implementation, protocol verification, conformance testing and tools used in maintaining or developing packet switching systems.de.comm.protocols.tcp-ip -Beschreibung: Umstellung auf IPv6 -Quelle: Chartas der Newsgruppen in de.*Google Group: comp.protocols.tcp-ipGoogle Group: linux.debian.maint.ipv6Google Group: microsoft.public.platformsdk.networking.ipv6Google Group: fa.openbsd.ipv6 -<!-- anchor id="information-onlinetesttools" -->Online-Werkzeuge - -Test-Werkzeuge - -ping, traceroute, tracepath, 6bone registry, DNS: JOIN / Testtools (nur in deutscher Sprache, sollte aber keine Probleme für nicht Deutsch sprechende Personen sein)traceroute6, whois: IPng.nlAAAA Lookup Checker http://www.cnri.dit.ie/cgi-bin/check_aaaa.pl -Informationsbeschaffung - -List of worldwide all IPv6-aggregated IP-Blocks -IPv6 Looking Glasses - -DRENv6 Looking Glass -Hilfsapplikationen - -IPv6 Prefix Calculator von TDOIDNS record checker -<!-- anchor id="information-trainingsandseminars" -->Trainings, Seminare - -CIW Internetworking Professional Training CBT CDTraining Pages, U.K. - Suche nach IPv6 (8 Kurse, 2006-08-21)Erion IPv6 Training. UKFehlt etwas? Vorschläge sind willkommen! -<!-- anchor id="information-onlinediscovery" -->'Die Online Entdeckung' ... -IPv6: Addressing The Needs Of the Future von Yankee Group (Autor) -Listenpreis: $595.00 -Edition: e-book (Acrobat Reader) -Seiten: 3 (drei) -Hrsg.: MarketResearch.com; ISBN B00006334Y; (1. November 2001) - -;-) Die Auflagenhöhe dieses eBooks wäre doch sehr interessant... - -Versions-Überblick / Danksagung / Zum Schluss - -<!-- anchor id="revision-history" -->Versions-Überblick -Die Versionen x.y. werden im Internet veröffentlicht. -Die Versionen x.y.z stellen Zwischenschritte dar, die nur als LyX- und SGML-Datei im TLDP-CVS veröffentlicht werden. Dadurch, dass allerdings Deep Space 6 diese SGML-Dateien spiegelt und daraus öffentliche Versionen generiert, sind diese auch dort und auf den Servern, die Deep Space 6 spiegeln, verfügbar. -Ausgabe 0.x - -Englische Sprachversion (Peter Bieringer's Original) -Die Historie der Änderungen der englischen Sprachversion finden Sie dort: TLDP / Linux+IPv6-HOWTO / Revision History. -Deutsche Sprachversion - -0.66.de.12010-04-20/PB: Sync mit Original0.65.de.12009-12-13/PB: Sync mit Original0.64.de.12009-06-11/PB: Sync mit Original0.63.de.22009-03-13/PB: remove original transator contact address, no longer responsible for further changes0.63.de.12009-02-14/PB: Sync mit Original0.62.de.12008-11-09/PB: Sync mit Original0.61.1.de.32007-08-25/PB: Fix Typo0.61.1.de.22007-08-17/PB: Fix Typo0.61.1.de.12007-11-11/PB: Sync mit Original0.61.de.12007-10-06/PB: Sync mit Original, kleine Korrekturen0.60.de.12007-05-31/PB: Sync mit Original (bis auf C-API), kleine Korrekturen0.51.de.12006-11-08/PB: Sync mit Original0.50.2.de.12006-10-25/PB: Sync mit Original0.50.1.de.12006-09-23/PB: Sync mit Original0.50.de.12006-08-24/PB: Sync mit Original0.49.5.de.12006-08-23/PB: Sync mit Original0.49.4.de.12006-08-21/PB: Sync mit Original, Korrektur bei Adresstypen (Übersetzungsfehler)0.49.3.de.12006-08-20/PB: Sync mit Original0.49.2.de.12006-08-20/PB: Sync mit Original0.49.1.de.12006-06-13/PB: Sync mit Original0.49.de.12005-10-03/PB: Sync mit Original0.48.de.12005-01-11/PB: Sync mit Original0.47.de.12004-08-30/PB: Sync mit Original0.46.5.de.12004-07-22/PB: Sync mit Original0.46.4.de.12004-07-19/PB: Sync mit Original und kleine Korrekturen der Übersetzung0.46.2.de.12004-05-22/PB: Sync mit Original0.46.1.de.12004-04-18/PB: Sync mit Original0.46.de.12004-04-04/PB: Sync mit Original (Italienische Übersetzung verfügbar, Informationen über DHCPv6, kleinere Updates)0.45.1.de.12004-01-12/PB: Sync mit Original (kleine Erweiterung)0.45.de.12004-01-11/PB: Sync mit Original (kleine Korrekturen, URL-Korrekturen und Erweiterungen)0.44.2.de.12003-10-30/PB: Sync mit Original (kleine Korrektur)0.44.de.12003-08-15/PB: Sync mit Original (URL-Korrekturen, Tipp bei tcp_wrappers und Apache2)0.43.2.de.22003-07-26/PB: Sync mit Original (URL-Korrekturen)0.43.2.de.12003-06-11/PB: Sync mit Original (URL-Korrekturen)0.43.1.de.22003-06-11/PB: Typo gefixt0.43.1.de.12003-06-07/PB: Sync mit Original (Links, IPsec)0.43.de.12003-06-05/PB: Sync mit Original (SuSe-Linux-Tipps)0.41.4.de.12003-05-02/PB: Sync mit Original (URL-Korrekturen)0.41.3.de.12003-04-23/PB: Sync mit Original (URL-Korrektur)0.41.1.de.12003-03-31/PB: Sync mit Original (URL-Korrektur)0.41.de.12003-03-22/PB: Angabe der URL dieser Übersetzung0.40.2.de.12003-02-27/PB: Sync mit Original (URL-Korrektur)0.40.1.de.12003-02-12/PB: Sync mit Original (Debian-Linux-Konfiguration), Ersetzen der Info über verfügbare Übersetzungen durch einen Link zum Original.0.40.de.12003-02-10/PB: Kleine sprachliche Änderungen und paar kleine Verbesserungen.0.39.2.de.12003-02-10/GK: Erste öffentliche Version in deutscher Sprache. Diese Version entspricht inhaltlich der englischen Version 0.39.2. Der Zusatz de.1 bezeichnet die Revision der deutschen Sprachversion. Diese Version wurde unter Mandrake Linux 9.0 mit LyX Version 1.2.1 und der Klasse DocBook book (SGML) erstellt. -<!-- anchor id="credits" -->Danksagung -Dieser feinen Liste hinzugefügt werden können Sie am schnellsten, indem Sie mir Bug fixes, Korrekturen und/oder Updates schicken ;-) -Wenn Sie eine größere Überarbeitung vornehmen wollen, können Sie dazu die LyX Datei (siehe original source) verwenden und mir entsprechende diffs dann zusenden, diffs der SGML-Version sind hingegen nicht sehr nützlich. -<!-- anchor id="major-credits" -->Primärer Dank... - -David Ranch <dranch at trinnet dot net>: Er ermutigte mich zum Schreiben dieses HOWTOs, für seine Anmerkungen zu den ersten englischen Versionen, für seine Beiträge zu den IPv6 Test-Ergebnissen auf der IPv6-Homepage des Autors. Ebenfalls für seine größeren Überarbeitungen und Vorschläge.Pekka Savola <pekkas at netcore dot fi>: Für größere Überarbeitungen der englischen Version, seinen Input und Vorschläge.Georg Käfer <gkaefer at gmx dot at>: Für das Aufspüren eines Fehlers bei der PDF Erstellung (durch LDP Betreuer Greg Ferguson behoben), den Input betreff deutscher Bücher, einer großen URL-Liste, die Überprüfung aller Links und vieler weiterer Vorschläge, Korrekturen und Beiträge. -Sonstiger Dank... - -Verwaltung des Dokuments -Als Neuling ein LDP HOWTO zu schreiben (in LyX schreiben sowie SGML konformer Export zu DocBook) ist nicht so einfach, wie von so manchem behauptet wird. Es gibt einige sonderbare Fallen... Nichtsdestoweniger Dank an: -Autoren des LDP Author GuideB. Guillon: Für sein DocBook with LyX HOWTO -<!-- anchor id="content-related-credits" -->Inhalt des Dokuments -Mein Dank für Fixes und Hinweise ist hier aufgelistet - und die Liste wird mit der Zeit sicherlich länger werden... -Bezüglich der englischen Version finden Sie in dieser, hier werden nur diejenigen, die die deutsche Version betreffen, aufgelistet. -Nico Schottelius, Oliver Kraus, Götz Bauermann: Typo gefundenJens Nachtigall: Fehler gefunden -Zum Schluss -Danke für's Lesen. Hoffentlich ist es von Nutzen! -Falls Sie irgendeine Frage haben, abonnieren sie eine entsprechende maillist und diskutieren Sie ihr Problem unter Angabe möglichst vieler Informationen. \ No newline at end of file diff --git a/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.fr.html b/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.fr.html deleted file mode 100644 index 5f0ce611..00000000 --- a/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.fr.html +++ /dev/null @@ -1,17785 +0,0 @@ - -Linux IPv6 HOWTO (fr)

    Linux IPv6 HOWTO (fr)

    Peter Bieringer

    pb at bieringer dot de

    Historique des versions
    Version 0.49.fr.3wip2015-08-18Revu par : PB
    Version 0.49.fr.22007-10-06Revu par : PB
    Version 0.49.fr.12006-02-26Revu par : MB
    Version 0.48.1.fr.12005-01-20Revu par : MB
    Version 0.47.fr.12004-09-05Revu par : MB
    Version 0.44.fr.12003-05-09Revu par : MB

    L'objet de cet HOWTO IPv6 Linux est de répondre à la fois aux questions basiques et avancées au sujet d'IPv6 sur le système d'exploitation Linux. Cet HOWTO fournira au lecteur assez d'information pour installer, configurer et utiliser les applications IPv6 sur les machines Linux. l'historique des révisions


    Table des matières
    1. Généralités
    1.1. Copyright, licence et autres
    1.2. Catégorie
    1.3. La version, l'historique et ce qu'il reste à faire
    1.4. Les traductions
    1.5. Un peu de technique
    1.6. Préface
    1.7. Termes employés, glossaire et abréviations
    1.8. Pré-requis à l'usage de cet HOWTO
    2. Les bases
    2.1. Qu'est-ce qu'IPv6?
    2.2. Historique d'IPv6 pour Linux
    2.3. A quoi ressemblent les adresses IPv6?
    2.4. FAQ (Les bases)
    3. Les types d'adresse IPv6
    3.1. Les adresses sans préfixe spécial
    3.2. La partie réseau, aussi appelée préfixe
    3.3. Les types d'adresse (partie hôte)
    3.4. La longueur de préfixe nécessaire au routage
    4. La vérification d'un système prêt pour IPv6
    4.1. Un noyau prêt pour IPv6
    4.2. Les outils de configuration réseau prêts pour IPv6
    4.3. Les programmes de test/déboguage prêts pour IPv6
    4.4. Les programmes prêts pour IPv6
    4.5. Les programmes client prêts pour IPv6 (une sélection)
    4.6. Les programmes serveur prêts pour IPv6
    4.7. FAQ (vérification d'un système prêt pour IPv6)
    5. Configurer les interfaces
    5.1. Les différents périphériques réseau
    5.2. (dé)Montage des interfaces
    6. Configurer les adresses IPv6
    6.1. Affichage des adresses IPv6 existantes
    6.2. Ajouter une adresse IPv6
    6.3. Ôter une adresse IPv6
    7. Configurer les routes IPv6 courantes
    7.1. Afficher les routes IPv6 existantes
    7.2. Ajouter une route IPv6 traversant une passerelle
    7.3. Ôter une route IPv6 traversant une passerelle
    7.4. Ajouter une route IPv6 traversant une interface
    7.5. Ôter une route IPv6 traversant une interface
    7.6. FAQ concernant les routes IPv6
    8. La découverte de voisinage
    8.1. Afficher le voisinage en utilisant "ip"
    8.2. Manipuler la table de voisinage en utilisant "ip"
    9. Configurer les tunnels IPv6-in-IPv4
    9.1. Les types de tunnel
    9.2. Afficher les tunnels existants
    9.3. Montage d'un tunnel point-à-point
    9.4. Installation des tunnels 6to4
    10. Configurer les tunnels IPv4-in-IPv6
    11. Les réglages du noyau dans le système de fichiers /proc
    11.1. Comment accéder au système de fichiers /proc
    11.2. Les entrées de /proc/sys/net/ipv6/
    11.3. Les entrées relatives à IPv6 dans /proc/sys/net/ipv4/
    11.4. Les entrées relatives à IPv6 dans /proc/net/
    12. L'interface de netlink vers le noyau
    13. Le déboguage réseau
    13.1. Les sockets d'écoute de serveur
    13.2. Des exemples de dump provenant de tcpdump
    14. Support à la configuration persistante IPv6 dans les distributions Linux
    14.1. Linux Red Hat et ses "clones"
    14.2. Linux SuSE
    14.3. Linux Debian
    15. L'auto-configuration et la mobilité
    15.1. L'auto-configuration sans état
    15.2. L'auto-configuration avec état utilisant le Démon d'Annonce de Routeur
    15.3. Le Protocole de Configuration Dynamique d'Hôte version 6 (DHCPv6)
    15.4. La mobilité
    16. Mettre en place le pare-feu
    16.1. Mettre en place un pare-feu grâce à netfilter
    16.2. Préparation
    16.3. Utilisation
    17. La sécurité
    17.1. La sécurité d'un noeud
    17.2. Les limitations d'accès
    17.3. L'audit de sécurité IPv6
    18. L'encryptage et l'authentification
    18.1. Les modes d'emploi de l'encryptage et de l'authentification
    18.2. Son support dans le noyau (ESP et AH)
    18.3. Echange automatique de clés (IKE)
    18.4. Informations complémentaires
    19. La Qualité de Service (QoS)
    20. Eléments d'installation des démons prêts pour IPv6
    20.1. Le Démon de Nom Internet Berkeley (named)
    20.2. Le super démon Internet (xinetd)
    20.3. Le serveur web Apache2 (httpd2)
    20.4. Le Démon d'Annonce de Routeur (radvd)
    20.5. Le serveur de Configuration Dynamique d'Hôte v6 (dhcp6s)
    20.6. tcp_wrapper
    20.7. vsftpd
    20.8. proftpd
    20.9. Autres démons
    21. Programmer (en utilisant l'API)
    22. L'interopérabilité
    23. Plus d'information et d'URL
    23.1. Livres en édition papier, articles, revues en ligne (mélangés)
    23.2. Conférences, rencontres, sommets
    23.3. L'information en ligne
    23.4. L'infrastructure IPv6
    23.5. Les listes de diffusion
    23.6. Outils en ligne
    23.7. Pratique, séminaires
    23.8. 'La découverte en ligne'...
    24. Historique des Révisions / Crédits / La Fin
    24.1. Historique des Révisions
    24.2. Crédits
    24.3. La Fin

    Chapitre 1. Généralités

    Vous trouverez les informations concernant les différentes traductions disponibles dans la section Traductions.


    1.1. Copyright, licence et autres

    1.1.1. Copyright

    Rédaction et Copyright (C) 2001-2007 Peter Bieringer, traduction francophone et Copyright (C) 2003-2006 Michel Boucey


    1.1.2. Licence

    Cet HOWTO IPv6 Linux est publié sous GPL GNU version 2: - -

    L'HOWTO IPv6 Linux, un guide sur la façon de configurer et d'utiliser IPv6 sur les systèmes Linux.

    Copyright (C) 2001-2007 Peter Bieringer

    Ce document est libre; vous pouvez le redistribuer et/ou le modifier dans les termes de la Licence Publique Générale GNU, telle que publiée par la Free Software Foundation; soit dans sa version 2, ou (c'est à votre convenance) une quelconque version postérieure.

    Ce programme est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE GARANTIE; sans même de garantie impliquée par une COMMERCIALISATION ou d'ADÉQUATION A UNE FIN PARTICULIÈRE. Voir la Licence Publique Générale GNU pour de plus amples détails.

    Vous devriez avoir reçu une copie de la Licence Publique Générale GNU allant de paire avec ce programme; sinon, écrivez à la Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.


    1.1.3. A propos de l'auteur

    1.1.3.1. L'auteur, Internet et IPv6

    • 1993: J'ai pris contact avec l'Internet par la pratique du mél et des news sur un client en mode texte (par exemple, rechercher "e91abier" sur groups.google.com, c'est moi).

    • 1996: J'ai été sollicité pour concevoir un cours sur IPv6, incluant des travaux pratiques sur le système d'exploitation Linux.

    • 1997: Début de la rédaction d'un guide sur la façon d'installer, de configurer et d'utiliser IPv6 sur les systèmes Linux, appelé HowTo - IPv6 & Linux (voir IPv6 & Linux - HowTo/History pour plus d'information).

    • 2001: Début de la rédaction de cet HOWTO IPv6 Linux.


    1.1.3.2. Contact

    L'auteur peut être contacté par mél à <pb chez bieringer point de> mais aussi via sa page personnelle.

    Il vit actuellement à Munich [dans la partie nord du Schwabing] / Bavière / Allemagne (sud) / Europe (centrale) / Terre (surface/continent).


    1.2. Catégorie

    Cet HOWTO relève de la catégorie "Réseau/Protocoles".


    1.3. La version, l'historique et ce qu'il reste à faire

    1.3.1. La version

    La version actuelle est visible dès le début de ce document.

    En ce qui concerne les autres versions/traductions, voir égalementhttp://www.bieringer.de/linux/IPv6/.


    1.3.2. L'historique

    1.3.2.1. L'essentiel de l'historique

    30-11-2001:Début de la conception du nouvel HOWTO.

    02-01-2002: Une quantité importante du contenu est achevée, publication de la première version du premier chapitre (version 0.10).

    14-01-2002: Plus achevé, avec relectures, publication de la première version complète du document (version 0.14).

    16-08-2002: La traduction polonaise est en cours

    31-10-2002: La traduction chinoise est disponible (voir les traductions pour en savoir plus)

    10-11-2002: La traduction allemande est en cours

    10-02-2003: La traduction allemande est disponible

    09-04-2003: La traduction francophone est en cours

    09-05-2003: La traduction francophone est disponible

    15-08-2003: La traduction espagnole est en cours

    16-10-2003: La traduction italienne est en cours

    12-03-2004: La traduction italienne est disponible

    18-06-2004: La traduction grecque est en cours


    1.3.3. Ce qu'il reste à faire

    • Rédiger les contenus manquants

    • Achever la correction orthographique


    1.4. Les traductions

    Les traductions doivent toujours contenir l'URL, le numéro de version et le copyright du document original (le vôtre aussi). Merci de ne pas traduire le journal original des modifications, ce n'est vraiment pas utile. Il apparaît que la fréquence des modifications apportées à ce document est, la plupart du temps, inférieure à une fois par mois. Depuis la version 0.27, il apparaît aussi que la plus grande part du contenu fourni par moi-même a été rédigée. Les traductions doivent toujours prendre comme source la version anglo-saxonne.


    1.4.1. Traductions disponibles

    1.4.1.1. En langue française

    La traduction francophone par Michel Boucey a été mise en chantier le 9 avril 2003, à partir de la révision 0.41.1. Elle est disponible depuis le 9 mai 2003 sur Deep Space 6, avec pour URL original mirrors.deepspace6.net / Linux+IPv6-HOWTO-fr. Je (Michel Boucey) remercie par avance toute personne qui aidera, de quelque façon, à améliorer cette traduction. On peut me contacter à l'adresse mél <mboucey chez free point fr>.


    1.4.1.2. Les autres traductions disponibles

    L'information concernant les traductions disponibles en d'autres langues que l'anglais et le français peut être trouvée dans le document original: TLDP / Linux+IPv6-HOWTO / Translations


    1.5. Un peu de technique

    1.5.1. Le document original de cet HOWTO

    Cet HOWTO est actuellement rédigé avec la version 1.2.0 de LyX sur un système Linux Red Hat 7.3 avec un patron SGML (livre DocBook). Il est disponible en vue des contributions à l'URL github / tLDP / LDP / users / Peter-Bieringer.


    1.5.1.1. Modification des lignes de code propres à LyX

    Les modifications des lignes de code propres à LyX sont réalisées par un script “maison”, “lyxcodelinewrapper.pl”, que vous pouvez obtenir par CVS pour votre propre compte: TLDP-CVS / users / Peter-Bieringer (NdT: ces lignes ne gênent pas la génération au format SGML, mais celles aux formats PS et PDF à partir du SGML généré couramment, i.e. sans ce script).


    1.5.1.2. La génération du SGML

    Le code SGML est généré en utilisant la fonction d'exportation de LyX.

    Des solutions ont été apportées afin de créer un code SGML plus propre (voir aussi ici pour le programme Perl, TLDP-CVS / users / Peter-Bieringer):

    • L'exportation du document LyX ne créait pas proprement les balises “colspan” - l'outil qui règle le problème: “sgmllyxtabletagfix.pl” (le problème est définitivement réglé depuis la version 1.2.0 de LyX)

    • LyX utilise parfois des entités spéciales gauche/droite, à la place des guillemets habituels, qui seront présentes dans le code HTML. Certains navigateurs n'interprètent pas très bien ces balises (Opéra 6 TP 2 ou Konquéror sont connus pour ce problème) - l'outil qui règle le problème: “sgmllyxquotefix.pl”


    1.5.2. Les références en ligne à la version HTML de cet HOWTO (lien/ancrage)

    1.5.2.1. La page d'index maître

    Généralement, une référence vers la page d'index maître est recommandée.


    1.5.2.2. Les pages dédiées

    Parce que les pages HTML sont générées à partir du fichier SGML, le nommage des fichiers HTML prend une tournure aléatoire. Et cependant, certaines pages ont des balises assignées par LyX, dont il résulte un nommage constant. Ces balises sont très utiles aux références et ne devraient pas être changées à l'avenir.

    Si vous pensez que j'ai oublié une balise, merci de me le faire savoir, et je l'ajouterai.


    1.6. Préface

    Quelques petites choses d'abord:


    1.6.1. Combien se promène-t-il de versions de l'HOWTO Linux & IPv6?

    En incluant celui-ci, il y a trois documents HOWTO disponibles. Mes excuses si cela vous semble de trop ;)


    1.6.1.1. La FAQ/HOWTO IPv6 Linux (obsolète)

    Le premier document relatif à IPv6 a été écrit par Eric Osborne, et s'appelle FAQ/HOWTO IPv6 Linux (merci de ne l'utiliser que pour des raisons historiques). La dernière version fut la 3.2.1, publiée le 14 juillet 1997.

    Merci de m'aider: si quelqu'un connaît la date anniversaire de cet HOWTO, merci de m'envoyer un mél (cette information est nécessaire à "l'historique").


    1.6.1.2. L'HowTo - IPv6 & Linux (maintenu)

    Il existe une seconde version appelée HowTo - IPv6 & Linux - écrite par moi-même (Peter Bieringer) en pur HTML. Elle est née en avril 1997 et la première version anglo-saxonne a été publiée en juin 1997. Je continuerais à la maintenir, mais cela déclinera lentement (mais pas complètement) en faveur de l'HOWTO IPv6 Linux que vous lisez en ce moment.


    1.6.1.3. L'HOWTO IPv6 Linux (ce document)

    Parce que l'HowTo - IPv6 & Linux est écrit en HTML pur, il n'est vraiment pas compatible avec le Projet de Documentation Linux (Linux Documentation Project, ou TLDP). J'ai (Peter Bieringer) reçu une demande fin novembre 2001 de réécriture de l'HowTo -IPv6 & Linux en SGML. Cependant, à cause de la discontinuité de cet HOWTO (le future de l'HowTo - IPv6 & Linux), et de la standardisation croissante d'IPv6, je décidais d'écrire un nouveau document couvrant aussi bien les questions simples ou avancées qui resteront importantes dans les toutes prochaines années. Plus dynamique, un contenu plus avancé s'y trouvera en plus, par rapport au second HOWTO (HowTo - IPv6 & Linux).


    1.7. Termes employés, glossaire et abréviations

    1.7.1. Relatifs aux réseaux

    Base 10

    Le système bien connu des nombres décimaux, représentant n'importe quelle valeur avec les chiffres 0-9.

    Base 16

    Habituellement utilisée dans les langages de programmation de bas et haut niveaux, connue encore en tant que système numérique hexadécimal, représentant les valeurs avec les chiffres 0-9 et les caractères A-F (insensible à la casse).

    Base 85

    Représentation d'une valeur grâce à 85 différents chiffres/caractères, cela permet des chaînes de caractères plus courtes mais jamais vue dans la pratique.

    Bit

    Unité minimale de stockage, allumée(on)/vraie (1) ou éteinte(off)/fausse (0).

    Byte

    Le plus souvent, une collection de 8 bits (mais ce n'est pas réellement une nécessité - regardez les systèmes des anciens ordinateurs).

    Périphérique

    ici, matériel de connexion réseau, voir aussi NIC.

    Hôte à double résidence

    Un hôte à double résidence est un noeud ayant deux interfaces réseau (physique ou virtuelle) sur deux liens différents, mais qui ne réalise pas de renvoi de paquets entre les interfaces.

    Hôte

    Généralement, un hôte simple résident, présent sur un lien. Normalement, il n'a seulement qu'une interface réseau active, par exemple Ethernet ou (non pas et) PPP.

    Interface

    quasi-synonyme de “périphérique”, voir aussi NIC.

    En-tête IP

    En-tête d'un paquet IP (chaque paquet réseau a un en-tête, son type dépendant de la couche réseau).

    Lien

    Un lien est un médium de transport de paquet réseau de la couche 2, des exemples en sont Ethernet, PPP, SLIP, ATM, RNIS, Frame Relay, etc.

    Noeud

    Un noeud est soit un hôte, soit un routeur.

    Octet

    Une collection véritable de 8 bits, aujourd'hui synonyme de "byte".

    Port

    Information destinée au distributeur TCP/UDP (couche 4) afin de transporter l'information à la couche supérieure.

    Protocole

    Chaque couche réseau contient la plupart du temps un champ “protocole” facilitant la distribution de l'information transportée à la couche supérieure, comme cela peut se voir dans la couche 2 (MAC) et 3 (IP)

    Routeur

    Un routeur est un noeud possédant une ou plusieurs interface(s) réseau, capable d'envoyer les paquets entre ses interfaces.

    Socket

    Une socket IP est définie par ses adresses source et destination, ses ports et (association)

    Pile

    Une collection de couches relative au réseau.

    Masque de sous-réseau

    Les réseaux IP utilisent un masque de bits afin de distinguer le réseau local de ceux qui sont distants.

    Tunnel

    Un tunnel est typiquement une connexion point-à-point sur laquelle les paquets échangés transportent les données d'un autre protocole, un tunnel IPv6-in-IPv4 en est un exemple.


    1.7.1.1. Abréviations

    ACL

    Access Control List, Liste de Contrôle d'Accès

    API

    Application Programming Interface, Interface de Programmation d'Application

    ASIC

    Application Specified Integrated Circuit, Circuit Intégré d'Application Spécifique

    BSD

    Berkeley Software Distribution, Distribution des Logiciels Berkeley

    Bus CAN

    Système de bus physique contrôlant un réseau (NdT: voir par exemple ici pour plus d'information)

    ISP

    Internet Service Provider, Fournisseur d'Accès à Internet (FAI)

    KAME

    Projet - effort conjoint de six entreprises au Japon pour fournir, mondialement et dans le cadre du logiciel libre, une pile IPv6 et IPsec (pour IPv4 et IPv6) pour les variantes de BSD www.kame.net

    LIR

    Local Internet Registry, Bureau local d'enregistrement Internet

    NIC

    Network Interface Card, Carte d'interface réseau

    RFC

    Request for comments, Appel à commentaires - jeu de notes techniques et organisationnelles au sujet d'Internet.

    USAGI

    Projet “UniverSAl playGround for IPv6” - travaille à rendre disponible une pile protocolaire IPv6 destinée au système Linux qui soit d'une qualité apte à la production.


    1.7.2. Relatifs à ce document

    1.7.2.1. Balisage en vue de l'encodage PDF/PS

    Le caractère “¬” est utilisé pour signaler que le code est enveloppé en vue d'un meilleur affichage dans les fichiers PDF et PS.


    1.7.2.2. Conventions

    Dans les exemples génériques vous trouverez parfois ce qui suit:

    <monadresseip>

    Pour une utilisation réelle sur votre système, en ligne de commande ou dans des scripts, cela doit être remplacé par le contenu adéquate (ôtez bien sûr les chevrons), et le résultat devrait être par exemple

    1.2.3.4

    1.7.2.3. Les commandes dans l'interpréteur de commandes (le shell)

    Les commandes exécutables en tant qu'utilisateur non-root commencent avec un $, par exemple

    $ whoami

    Les commandes exécutables en tant qu'utilisateur root commencent avec un #, par exemple

    # whoami

    1.8. Pré-requis à l'usage de cet HOWTO

    1.8.1. Pré-requis personnels

    1.8.1.1. Une expérience des outils Unix

    Vous devriez être familiarisé avec les outils essentiels d'Unix comme grep, awk, find, etc, et connaître les options de ligne de commande les plus communément employées.


    1.8.1.2. Une expérience de la théorie des réseaux

    Vous devriez connaître les notions de couche, de protocole, d'adresse, de câble, de socket, etc. Si vous êtes nouveau, voici un bon point de départ pour vous: linuxports/howto/intro_to_networking


    1.8.1.3. Une expérience de la configuration IPv4

    Vous devriez absolument avoir quelque expérience de la configuration IPv4, sinon ce sera difficile pour vous de comprendre ce qui se passe réellement.


    1.8.1.4. Une expérience du Système des Noms de Domaine (DNS)

    Vous devriez aussi comprendre en quoi consiste le Système des Noms de Domaine (DNS), ce qu'il fournit et comment s'en servir.


    1.8.1.5. Une expérience des stratégies de déboguage réseau

    Vous devriez au moins savoir comment utiliser tcpdump et avoir connaissance de ce qu'il peut vous montrer. Sinon, le déboguage réseau sera très difficile pour vous.


    1.8.2. Le matériel compatible avec le système d'exploitation Linux

    Vous espérez certainement pouvoir expérimenter tout cela avec du vrai matériel, et pas seulement lire cet HOWTO jusqu'à tomber de sommeil. ;-7)


    Chapitre 2. Les bases

    2.1. Qu'est-ce qu'IPv6?

    IPv6 est un nouveau protocole de la couche 3 (voir le modèle OSI) qui supplantera à terme IPv4 (plus connu sous le nom d'IP). IPv4 a été conçu il y a déjà un certain de temps (RFC 760 / Le protocole Internet à partir de janvier 1980), et, dès le début, il y a eu de nombreuses demandes pour accroître la quantité d'adresses disponible et augmenter les capacités. Le RFC le plus récent est le RFC 2460 / spécification du protocole Internet version 6 (NdT: une version francophone de ce RFC). Le changement essentiel apporté par IPv6 est la nouvelle conception de l'en-tête, incluant une augmentation de la taille de l'adresse, passant de 32 à 128 bits. Parce que la couche 3 est responsable de bout en bout du transport des paquets dont le routage est basé sur des adresses, elle doit inclure les nouvelles adresses IPv6, comme pour IPv4.

    Pour en savoir plus sur l'histoire d'IPv6, jetez un oeil aux anciens RFC concernant IPv6, par exemple dans le Guide / Références IPv6 SWITCH .


    2.2. Historique d'IPv6 pour Linux

    Les années 1992, 1993 et 1994 de l'histoire d'IPv6 (dans ses généralités) sont couvertes par le document suivant: IPv6 ou IPng (IP nouvelle génération).

    A faire: plus de détails historiques, plus de contenu...


    2.2.1. Au début

    Le premier code réseau relatif à IPv6 a été ajouté au noyau Linux 2.1.8 en novembre 1996 par Pedro Roque. Il était fondé sur l'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 
    -+ * <draft-ietf-ipngwg-bsd-api-05.txt>

    Les lignes présentées sont copiées du patch-2.1.8 (l'adresse mél a été effacée au copier&coller).


    2.2.2. Après

    A cause du manque de bras, l'implémentation d'IPv6 dans le noyau était incapable de suivre les projets discutés ou les RFC nouvellement mis à jour. En novembre 2000, un projet débute au Japon, appelé USAGI, dont le but était d'implémenter dans Linux tout le support IPv6 manquant ou obsolète. Ce projet suit en cela la trace de l'implémentation courante d'IPv6 pour FreeBSD, réalisée par le projet KAME . De temps à autre, ils créaient des archives de développement (snapshots) à partir des sources courantes du noyau Linux.


    2.2.3. Actuellement

    Malheureusement, le patch USAGI est très volumineux, à tel point que les personnes s'occupant actuellement de maintenir les fonctionnalités réseau de Linux sont incapables de l'inclure dans les sources, aptes à la production, de la série des noyaux Linux 2.4.x. En conséquence, la série 2.4.x manque de certaines (et même de nombreuses) extensions, et elle n'applique pas non plus les brouillons et RFC courants (voir le groupe de travail IP Version 6 (ipv6)). Cela peut poser des problèmes d'interopérabilité avec les autres systèmes d'exploitation.


    2.2.4. A l'avenir

    USAGI fait maintenant usage de la série des noyaux de développement Linux 2.5.x afin d'incorporer toutes les extensions actuelles dans cette version de développement; dans l'espoir que la série des noyaux 2.6.x comprenne une véritable implémentation à jour d'IPv6.


    2.3. A quoi ressemblent les adresses IPv6?

    Comme cela a été mentionné précédemment, les adresses IPv6 ont une longueur de 128 bits. Ce nombre de bits génère de très grands nombres, dont la quantité de chiffres est supérieure à 39:

    2^128-1: 340282366920938463463374607431768211455

    De tels nombres ne sont vraiment pas des adresses pouvant être mémorisées. L'adresse IPv6 en elle-même est faite à partir d'une collection de bits (comme pour IPv4, bien que cela soit rarement su). Il y a une meilleure notation pour de si grands nombres, qui est l'hexadécimal. En hexadécimal, 4 bits (mot aussi connu sous la dénomination de "nibble") sont représentés par un chiffre ou un caractère de 0-9 et a-f (10-15). Ce format réduit la longueur de l'adresse IPv6 à 32 caractères.

    2^128-1: 0xffffffffffffffffffffffffffffffff

    Cette représentation est encore peu praticable (possibilité de confusion ou de perte d'un simple chiffre hexadécimal), c'est pourquoi les concepteurs d'IPv6 ont choisi un format hexadécimal scindé en blocs de 16 bits, avec comme séparateur le caractère ":". De plus, le préfixe "0x" (le marqueur des valeurs hexadécimales utilisé dans les langages de programmation) est ôté:

    2^128-1: ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff

    Une adresse utilisable (nous verrons les différents types d'adresse plus tard) est par exemple:

    3ffe:ffff:0100:f101:0210:a4ff:fee3:9566

    Dans un but de simplification, les zéros non significatifs de chaque bloc de 16 bits sont omis:

    3ffe:ffff:0100:f101:0210:a4ff:fee3:9566  -> 
    -¬ 3ffe:ffff:100:f101:210:a4ff:fee3:9566

    Une séquence de blocs de 16 bits ne comprenant que des zéros peut être remplacée par “::“. Mais pas plus d'une fois par adresse, sinon il ne s'agirait plus d'une représentation unique.

    3ffe:ffff:100:f101:0:0:0:1  ->  3ffe:ffff:100:f101::1

    La plus importante réduction qui peut être observée est celle de l'adresse localhost d'IPv6:

    0000:0000:0000:0000:0000:0000:0000:0001  ->  ::1

    Il existe aussi une représentation dite compacte, encodée en base85 (RFC 1924 / A Compact Representation of IPv6 Addresses, publié le 1er avril 1996), jamais vue véritablement employée, sans doute une blague de 1er avril; en voici cependant un exemple:

    # ipv6calc --addr_to_base85 3ffe:ffff:0100:f101:0210:a4ff:fee3:9566 
    -Itu&-ZQ82s>J%s99FJXT

    Info: ipv6calc est un programme de formatage d'adresse IPv6 et de conversion pouvant être trouvé ici: ipv6calc ( miroir )


    2.4. FAQ (Les bases)

    2.4.1. Pourquoi IPv6 et non pas IPv5 comme successeur d'IPv4?

    Dans tout en-tête IP, les 4 premiers bits sont réservés à la version du protocole. C'est ainsi qu'un numéro de protocole entre 0 et 15 est théoriquement possible:

    Le prochain numéro libre était 6. Et voilà comment IPv6 était né!


    2.4.2. L'adresse IPv6: pourquoi un tel nombre de bits?

    Lors de la conception d'IPv4, les gens pensaient que 32 bits seraient suffisants pour le monde, dans sa globalité. Rétrospectivement, 32 bits ont été jusqu'à maintenant suffisants, et seront sans doute suffisants pour encore quelques années. Cependant, 32 bits seront insuffisants à fournir dans le futur une adresse globale à chaque périphérique réseau. Pensez aux téléphones mobiles, aux voitures (incluant les périphériques électroniques sur bus CAN), aux grille-pain, aux réfrigérateurs, aux interrupteurs d'éclairage, etc.

    Les concepteurs ont alors choisi 128 bits, 4 fois plus en longueur et une quantité 2^96 fois plus importante qu'IPv4 aujourd'hui.

    La quantité utilisable est cependant inférieure à ce qu'il semble. La raison en est que, dans le schéma d'adresse défini actuellement, 64 bits sont utilisés pour l'identifiant d'interface, les 64 autres bits sont utilisés pour le routage. Compte tenu des niveaux stricts actuels d'agrégation (/48, /32, ...), il est encore possible d'"épuiser" cette quantité, mais bien heureusement, pas dans un avenir proche.

    Voir aussi pour plus d'information le RFC 1715 / The H Ratio for Address Assignment Efficiency et le RFC 3194 / The Host-Density Ratio for Address Assignment Efficiency.


    2.4.3. L'adresse IPv6: pourquoi un si petit nombre de bits pour sa nouvelle conception?

    Pendant ce temps, il y a (c'est possible) des gens sur Internet (je n'en connais qu'un, Jim Fleming...) qui pensent déjà à IPv8, et même jusqu'à IPv16, dont les conceptions sont loin d'être couramment reçues et implémentées. En attendant, 128 bits était le meilleur choix qui pouvait être fait au regard de l'en-tête placé au-dessus des données transportées. En considérant le minimum de la taille de l'Unité Maximale de Transfert (Maximum Transfer Unit, ou MTU), la longueur de l'en-tête en IPv4 est de 20 octets (c'est le minimum, car elle peut monter à 60 octets avec les options IPv4), et en IPv6, elle est de 48 octets (longueur constante). C'est 3,4 % de la MTU en IPv4 et 3,8 % de la MTU en IPv6. Cela signifie que le surplus de taille dû à l'en-tête est quasiment le même. Plus de bits dans les adresses auraient réclamé un en-tête de plus grande taille, et par conséquent, un plus grand surplus. Et si l'on prend aussi en compte la MTU maximale sur un lien courant (tel Ethernet aujourd'hui): soit 1500 octets (dans des cas particuliers: 9 Ko pour de grosses trames). Finalement, cela n'aurait pas été d'une conception correcte si 10% ou 20% des données transférées dans un paquet de la couche 3 avaient été utilisés pour les adresses et non pas pour la charge utile.


    Chapitre 3. Les types d'adresse IPv6

    Comme pour IPv4, l'adresse IPv6 peut être scindée en une partie réseau et une partie hôte, par l'usage d'un masque de sous-réseau.

    IPv4 a montré que parfois cela serait bien si plus d'une adresse IP pouvaient être assignées à une interface, chacune à un but bien précis (alias, multi-cast). Afin de demeurer ouvert à l'avenir, IPv6 offre davantage en permettant à plus d'une adresse IPv6 d'être assignées à une interface. Il n'y a actuellement aucune limite définie par aucun RFC, mais seulement par l'implémentation de la pile IPv6 (afin de prévenir les attaques DoS).

    Pour employer le grand nombre de bits constitutifs de son adresse, IPv6 définit des types d'adresse basés sur certains regroupements de ces bits, qui, avec un peu de chance, ne devraient pas être modifiés à l'avenir (à la différence d'aujourd'hui avec IPv4, et l'histoire des classes A, B et C).

    C'est ainsi que la totalité des bits est divisée en une partie réseau (les 64 supérieurs) et en une partie hôte (les 64 inférieurs), afin de faciliter l'auto-configuration.


    3.1. Les adresses sans préfixe spécial

    3.1.1. L'adresse localhost

    C'est une adresse spéciale pour l'interface de bouclage (loopback), similaire à IPv4 avec sa "127.0.0.1".

    0000:0000:0000:0000:0000:0000:0000:0001 

    ou compressée:

    ::1

    Les paquets ayant cette adresse comme source ou destination ne devraient jamais quittés l'hôte émetteur.


    3.1.2. L'adresse non spécifiée

    C'est une adresse spéciale telle que “n'importe laquelle” (“any”) ou “0.0.0.0” en IPv4 . Il s'agit pour IPv6 de:

    0000:0000:0000:0000:0000:0000:0000:0000 

    ou:

    ::

    Ces adresses sont essentiellement utilisées/vues dans les sockets d'écoute (à toute adresse IPv6) ou dans les tables de routage.

    Note: l'adresse non spécifiée ne peut pas être utilisée comme adresse de destination.


    3.1.3. L'adresse IPv6 avec adresse IPv4 intégrée

    Il y a deux types d'adresse contenant une adresse IPv4


    3.1.3.1. L'adresse IPv6 mappée IPv4

    Les adresses IPv6 compatibles seulement avec IPv4 sont parfois utilisées/vues pour la création de socket par un démon disposant d'IPv6, mais à l'écoute d'une adresse IPv4.

    Ces adresses sont définies par un préfixe spécial d'une longueur de 96 (a.b.c.d est l'adresse IPv4):

    0:0:0:0:0:ffff:a.b.c.d/96

    ou en format compressé:

    ::ffff:a.b.c.d/96

    Par exemple, l'adresse IPv4 1.2.3.4 ressemble à ceci:

    ::ffff:1.2.3.4

    3.1.3.2. L'adresse IPv6 compatible IPv4

    Utilisée pour le tunnelage automatique (RFC 2893 / Transition Mechanisms for IPv6 Hosts and Routers), en cours de remplacement par le tunnelage 6to4.

    0:0:0:0:0:0:a.b.c.d/96

    ou en format compressé:

    ::a.b.c.d/96

    3.2. La partie réseau, aussi appelée préfixe

    Les concepteurs ont défini certains types d'adresse et laissé un vaste champ libre à de futures définitions, telles que l'émergence de nouvelles exigences encore aujourd'hui inconnues. L'architecture d'adressage IPv6 (RFC 2373 de juillet 1998) définit le schéma d'adressage actuel, mais il y a déjà un nouveau brouillon disponible: draft-ietf-ipngwg-addr-arch-*.txt.

    Jetons maintenant un coup d'oeil aux différents types de préfixe (et par conséquent aux différents types d'adresse IPv6):


    3.2.1. Le type d'adresse lien-local

    Ce sont des adresses particulières qui n'auront de validité que sur le lien d'une interface. En utilisant cette adresse comme adresse de destination le paquet ne devrait jamais franchir un routeur. C'est utile pour des communications sur un lien telles que:

    • Y a-t-il quelqu'un d'autre sur ce lien?

    • Y a-t-il quelqu'un d'autre sur ce lien ayant une adresse spéciale (on cherche par exemple à détecter la présence d'un routeur)?

    Elles commencent par (où “x” est n'importe quel caractère hexadécimal, couramment “0”)

    fe8x:  <- actuellement le seul en usage.
    -fe9x:
    -feax:
    -febx:

    Ce type d'adresse se trouve sur chaque interface disposant d'IPv6 après une auto-configuration sans état (ce qui est couramment le cas).


    3.2.2. Le type d'adresse site-local

    Ces adresses sont similaires à ce que le RFC 1918 (RFC 1918 / Address Allocation for Private Internets) définit aujourd'hui pour IPv4, avec en plus l'avantage que celui qui utilise ce type d'adresse a la capacité d'utiliser les 16 bits fournis pour un maximum de 65536 sous-réseaux. Comparable au 10.0.0.0/8 aujourd'hui en IPv4.

    Autre avantage: parce qu'il est possible avec IPv6 d'assigner plus d'une seule adresse par interface, vous pouvez assigner une telle adresse site-local en plus de l'adresse globale.

    Il commence par:

    fecx:  <- le plus couramment utilisé.
    -fedx:
    -feex:
    -fefx:

    (où “x” est n'importe quel caractère hexadécimal, couramment “0”)

    Notez que des discussions sont en cours concernant la dépréciation de ce type d'adresse en raison de nombreux problèmes. Pour en savoir plus, lire: draft-ietf-ipv6-deprecate-site-local-XY.txt.

    Pour des tests en laboratoire, de telles adresses restent un bon choix, à mon humble avis.


    3.2.3. Le type d'adresse ”unicast globale (agrégeable) "

    Aujourd'hui, il y a un type d'adresse globale de défini (la première conception, appelée “basée sur le fournisseur” a été abandonnée il y a déjà quelques années (RFC 1884 / IP Version 6 Addressing Architecture [obsolete]), vous en trouverez des traces dans des sources anciennes du noyau Linux).

    Il commence par (les x étant des caractères hexadécimaux)

    2xxx: 
    -3xxx:

    Note: la dénomination “agrégeable” est abandonnée dans les brouillons actuels. -Il y a quelques sous-types définis en plus, ci-dessous:


    3.2.3.1. Les adresses de test 6bone

    Elles ont été les premières adresses globales à être définies et mises en usage. Elles commencent toutes par

    3ffe:

    Exemple:

    3ffe:ffff:100:f102::1

    Une adresse spéciale de test 6bone, qui ne sera jamais globalement unique, commence par

    3ffe:ffff: 

    Et elle est la plupart du temps montrée dans les exemples passés, car si des adresses réelles sont montrées, il est possible à quelqu'un de les copier/coller dans ses propres fichiers de configuration. Ce type d'inadvertance cause des duplications d'adresse globalement unique. Cela pose de graves problèmes à l'hôte d'origine (par exemple recevoir des paquets en réponse de requêtes qu'il n'a pas émises). -Parce qu'IPv6 est maintenant en production, ce préfixe ne sera plus délégué et probablement retiré du routage après 6 juin 2006 (voirRFC 3701 / 6bone Phaseoutpour plus d'information).


    3.2.3.2. Les adresses 6to4

    Ce type d'adresse, conçu pour un mécanisme précis de tunnelage (RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds et RFC 2893 / Transition Mechanisms for IPv6 Hosts and Routers), encode une adresse IPv4 donnée et un sous-réseau possible. Il commence par

    2002:

    Par exemple, pour représenter 92.168.1.1/5:

    2002:c0a8:0101:5::1

    Une petite ligne de commande peut vous aider à générer une telle adresse à partir d'une adresse IPv4 donnée:

    ipv4="1.2.3.4"; sla="5"; printf "2002:%02x%02x:%02x%02x:%04x::1" `echo $ipv4
    -¬ | tr "." " "` $sla

    Voir aussi le tunnelage utilisant 6to4 et information concernant le relayage de 6to4 par les routeurs.


    3.2.3.3. Les adresses assignées par un fournisseur dans la hiérarchie de routage

    Ces adresses sont déléguées aux Fournisseurs d'Accès à Internet (FAI) et commencent par

    2001:

    Les préfixes fournis aux FAI (aussi connus en tant que LIR) les plus importants (propriétaires de backbone) sont délégués par les centres locaux d'enregistrement (local registries) et ils possèdent actuellement un préfixe d'une longueur de 32.

    Tout client peut obtenir de son FAI un préfixe d'une longueur de 48.


    3.2.3.4. Adresses réservées aux exemples et à la documentation

    Actuellement, deux blocs d'adresses sont réservés aux exemples et à la documentation:

    3ffe:ffff::/32
    -2001:0DB8::/32   EXAMPLENET-WF

    Ces blocs d'adresses devraient être filtrés sur la base des adresses source et, si possible, NE devraient PAS être acheminés par les routeurs en bordure d'Internet vers ce dernier.


    3.2.4. Les adresses multicast

    Les adresses multicast sont utilisées pour les services y afférents.

    Elles commencent par (xx est la valeur de la portée)

    ffxy:

    Elles se répartissent en différentes portées et types:


    3.2.4.1. La portée multicast

    La portée multicast est un paramètre spécifiant la distance maximale qu'un paquet multicast peut prendre vis-à-vis de son entité émettrice.

    Actuellement, les régions suivantes (portées) sont définies:

    • ffx1: noeud-local, ces paquets ne quittent jamais le noeud.

    • ffx2: lien-local, ces paquets ne sont jamais transmis par les routeurs, ils ne quittent par conséquent jamais le lien spécifié.

    • ffx5: site-local, ces paquets ne quittent jamais le site.

    • ffx8: organisation-locale, ces paquets ne quittent jamais l'organisation (pas si simple à implémenter, cela doit être par le protocole de routage).

    • ffxe: portée globale.

    • les autres sont réservées.


    3.2.4.2. Les types multicast

    Il y a déjà de nombreux types définis/réservés (voir le RFC 2373 / IP Version 6 Addressing Architecture pour les détails). Quelques exemples en sont:

    • Adresse de tous les noeuds: ID = 1h, correspond aux adresses de tous les hôtes présents sur le noeud local (ff01:0:0:0:0:0:0:1) ou au lien connecté (ff02:0:0:0:0:0:0:1).

    • Adresse de tous les routeurs: ID = 2h, correspond aux adresses de tous les routeurs présents sur le noeud local (ff01:0:0:0:0:0:0:2), sur le lien connecté (ff02:0:0:0:0:0:0:2), ou encore sur le site local (ff05:0:0:0:0:0:0:2).


    3.2.4.3. L'adresse multicast de sollicitation du lien-local

    Adresse multicast spéciale utilisée comme adresse de destination dans la découverte de voisinage, car à la différence d'IPv4, ARP n'existe plus dans IPv6.

    Un exemple de cette adresse ressemble à ceci

    ff02::1:ff00:1234

    Le préfixe utilisé montre qu'il s'agit d'une adresse multicast lien-local. Le suffixe est généré à partir de l'adresse de destination. Dans cet exemple, un paquet devrait être envoyé à l'adresse “fe80::1234”, mais la pile réseau ne connaît pas l'actuelle adresse MAC de la couche 2. Elle remplace les 104 bits supérieurs par “ff02:0:0:0:0:1:ff00::/104” et laisse les 24 bits inférieurs inchangés. Cette adresse est maintenant utilisée 'sur le lien' afin de trouver le noeud correspondant, lequel va devoir émettre une réponse contenant son adresse MAC de couche 2.


    3.2.5. Les adresses anycast

    Les adresses anycast sont des adresses spéciales utilisées pour couvrir des besoins tels que déterminer le serveur DNS le plus proche, le serveur DHCP le plus proche, ou tout groupe dynamique similaire. Les adresses sont prises dans l'espace d'adressage unicast (agrégeable ou site-local pour le moment). Le mécanisme anycast (au regard du client) sera pris en compte par un protocole de routage dynamique.

    Note: Les adresses anycast ne peuvent être utilisées comme adresse source, elles sont utilisables uniquement comme adresse de destination.


    3.2.5.1. L'adresse anycast de routeur de sous-réseau

    Un simple exemple d'une adresse anycast est celle d'un routeur de sous-réseau. Soit un noeud avec l'adresse IPv6 suivante assignée:

    3ffe:ffff:100:f101:210:a4ff:fee3:9566/64  <- L'adresse du noeud

    L'adresse anycast de routeur de sous-réseau sera créée en laissant totalement blanc le suffixe (les 64 bits inférieurs):

    3ffe:ffff:100:f101::/64  <- l'adresse anycast de routeur de sous-réseau

    3.3. Les types d'adresse (partie hôte)

    En ce qui concerne les questions d'auto-configuration et de mobilité, Il a été décidé d'utiliser les 64 bits inférieurs de la partie hôte de l'adresse pour la plupart des types d'adresse actuels. Conséquemment, chaque sous-réseau détient une grande quantité d'adresses.

    Cette partie hôte peut être différemment considérée:


    3.3.1. L'adresse calculée automatiquement (dite aussi “sans état”)

    Avec l'auto-configuration, la partie hôte de l'adresse est calculée en convertissant l'adresse MAC d'une interface (si disponible), avec la méthode EUI-64, en une adresse IPv6 unique. Si aucune adresse MAC n'est disponible pour le périphérique en question (ce qui arrive par exemple sur les périphériques virtuels), quelque chose d'autre (comme l'adresse IPv4 ou l'adresse MAC d'une interface physique) est utilisée à la place.

    Considérons à nouveau le premier exemple:

    3ffe:ffff:100:f101:210:a4ff:fee3:9566

    ici,

    210:a4ff:fee3:9566 

    est la partie hôte calculée à partir de l'adresse MAC de la NIC

    00:10:A4:E3:95:66 

    en utilisant IEEE EUI-64 conçue pour les identifiants EUI-48.


    3.3.1.1. Le problème d'incursion possible dans la sphère privée (privacy problem) avec les adresses automatiquement calculées, et une solution

    Parce que la partie hôte "automatiquement calculée” est globalement unique (sauf lorsqu'un fabriquant de NIC utilise la même adresse MAC sur plus d'une NIC), la traque grâce à un client (client tracking) est possible sur l'hôte, dès lors qu'aucun proxy d'aucune sorte n'est utilisé.

    C'est un problème connu, et une solution a été apportée: l'extension “sphère privée”, définie dans le RFC 3041 (RFC 3041 / Privacy Extensions for Stateless Address; il y a déjà aussi un brouillon plus récent disponible: draft-ietf-ipngwg-temp-addresses-*.txt). Le principe est d'utiliser une valeur aléatoire et une valeur statique à partir desquelles un nouveau suffixe est généré à intervalle régulier. Note: ce n'est raisonnable que pour des connexions client sortantes, et n'est pas vraiment utile pour des machines réputées être des serveurs.


    3.3.2. La configuration manuelle

    Pour les serveurs, il est probablement plus aisé de se rappeler d'adresses plus simples; cela peut aussi se faire. Il est possible d'assigner une adresse IPv6 additionnelle à une interface, par exemple

    3ffe:ffff:100:f101::1

    Pour les suffixes tels que “::1”, montré dans l'exemple ci-dessus, il est requis que le septième bit le plus significatif soit positionné à 0 (le bit universel/local d'un identifiant automatiquement généré). Certaines autres (à part celles qui n'ont pas étaient choisies) combinaisons de bits sont réservées aux adresses anycast.


    3.4. La longueur de préfixe nécessaire au routage

    Dans les premières phases de la conception, il était prévu d'utiliser une approche intégrale de routage hiérarchique, et ce, afin de réduire au maximum la taille des tables de routage. A la base du raisonnement sous-tendu par cette approche, il y a la prise en compte du nombre grandissant des entrées de routage IPv4 au coeur des routeurs (supérieur à 104 000 en mai 2001), la nécessité de réduire ce nombre afin de diminuer le besoin en mémoire du matériel (piloté par Circuit Intégré d'Application Spécifique, Application Specified Integrated Circuit, ou ASIC) maintenant les tables de routage, et, en conséquence, d'accroître la vitesse (dans l'espoir que moins d'entrées génèrent des recherches plus rapides).

    Aujourd'hui, le point de vue est que le routage sera conçu quasi-hiérarchiquement pour les réseaux ayant seulement un fournisseur de service. Pour plus d'une connexion à un ISP, ce n'est pas possible, et cela relève du problème de la multi-résidence (des informations sur la multi-résidence:drafts*multi6* IPv6 Multihoming Solutions


    3.4.1. La longueur du préfixe (aussi connue en tant que "masque de réseau")

    Comme pour IPv4, la notion de chemin de réseau routable nécessaire au routage a ici sa place. Parce que la notation standard d'un masque réseau n'est pas très agréable pour un adressage sur 128 bits, les concepteurs ont employé le schéma du Routage Inter-Domaines IPv4 Sans Classe (IPv4 Classless Inter Domain Routing, ou CIDR, défini dans le RFC 1519 / Classless Inter-Domain Routing), dans lequel est spécifié le nombre de bits de l'adresse devant être utilisé pour le routage. Il est aussi connu comme notation “slash”.

    Un exemple:

    3ffe:ffff:100:1:2:3:4:5/48

    De cette notation seront extraits:

    • le réseau:

    3ffe:ffff:0100:0000:0000:0000:0000:0000

    • le masque de réseau:

    ffff:ffff:ffff:0000:0000:0000:0000:0000

    3.4.2. La correspondance à une route

    Dans des conditions normales (i.e. sans QoS), de la recherche dans une table de routage résulte la route ayant le plus grand nombre de bits d'adresse significatifs; autrement dit, la route avec le plus grand préfixe correspond la première.

    Par exemple, si une table de routage affiche les entrées suivantes (la liste est incomplète):

    3ffe:ffff:100::/48     ::            U  1 0 0 sit1 
    -2000::/3               ::192.88.99.1 UG 1 0 0 tun6to4

    Ci-dessous, les adresses de destination des paquets IPv6 dont le trafic sera routé au travers du périphérique désigné

    3ffe:ffff:100:1:2:3:4:5/48  ->  trafic routé au travers du périphérique sit1
    -3ffe:ffff:200:1:2:3:4:5/48  ->  trafic routé au travers du périphérique tun6to4

    Chapitre 4. La vérification d'un système prêt pour IPv6

    Avant de commencer à utiliser IPv6 sur votre hôte Linux, vous avez à tester si votre système est prêt pour IPv6. Pour ce faire, vous aurez peut-être d'abord un peu de travail.


    4.1. Un noyau prêt pour IPv6

    Les distributions contemporaines de Linux comportent déjà un noyau prêt pour IPv6, les capacités IPv6 sont en général compilées dans un module, mais il est possible que ce module ne soit pas chargé automatiquement au démarrage.

    Voir la page IPv6+Linux-status-distributions pour obtenir les informations les plus à jour.

    Note: vous ne devriez plus utiliser les noyaux de la série 2.2.x; car ils ne sont pas assez à jour vis-à-vis d'IPv6.


    4.1.1. Vérifier la présence du support IPv6 dans le noyau actuellement en cours d'utilisation

    Afin de vérifier si oui ou non votre actuel noyau supporte IPv6, jetez un coup d'oeil dans votre système de fichiers /proc. Les entrées qui suivent doivent être présentes:

    /proc/net/if_inet6

    Un bref test automatique ressemble à:

    # test -f /proc/net/if_inet6 && echo "Running kernel is IPv6 ready"

    Si cela échoue, cela peut être parce que le module IPv6 n'est pas chargé.


    4.1.2. Essayer de charger le module IPv6

    Vous pouvez tenter de charger le module IPv6 en exécutant

    # modprobe ipv6

    Si c'est un succès, la présence de ce module sera testée comme par magie par la ligne suivante:

    # lsmod |grep -w 'ipv6' && echo "IPv6 module successfully loaded"

    Et la vérification montrée plus haut devrait maintenant se faire elle aussi avec succès.

    Note: enlever le module n'est actuellement pas supporté et peut aboutir, sous certaines conditions, au crash du noyau.


    4.1.2.1. Le chargement automatique du module

    Il est possible d'automatiser le chargement du module IPv6 à la demande. Vous avez juste à ajouter les lignes qui suivent dans le fichier de configuration du chargeur de modules du noyau (normalement /etc/modules.conf ou /etc/conf.modules):

    alias net-pf-10 ipv6  # chargement automatique du module IPv6 à la demande

    Il est aussi possible de mettre hors service le chargement automatique du module IPv6 en utilisant la ligne suivante

    alias net-pf-10 off   # rend indisponible le chargement automatique du module IPv6

    Note additionnelle: pour les noyaux de la série 2.6,le mécanisme du chargeur de modules a été repensé. Le nouveau fichier de configuration s'appellera /etc/modprobe.conf au lieu de /etc/modules.conf. Pour de plus amples détails voir le module-init-tool

    • Compiler un noyau à partir des seules sources brutes (facile, si vous connaissez les options dont vous avez besoin)

    • Recompiler les sources du noyau fournies par votre distribution Linux (parfois, ce n'est si simple que ça)

    • Compiler un noyau avec l'extension USAGI

    Si vous vous décidez à compiler un noyau, vous devriez avoir une certaine expérience dans la compilation de noyau et lire l'HOWTO sur le noyau Linux.

    La comparaison pratiquement la plus à jour entre un noyau original et un noyau comprenant USAGI est disponible dans IPv6+Linux-status-kernel.


    4.1.2.2. Compiler un noyau uniquement à partir des sources originales (vanille)

    Plus d'éléments concernant la compilation d'un noyau disposant d'IPv6 peuvent par exemple être trouvés dans IPv6-HOWTO-2#kernel.

    Note: vous devriez autant que possible utiliser les noyaux de la série 2.6.x ou supérieures,car le support IPv6 de la série 2.4.x n'obtiendra qu'un portage partielet celui de la série 2.2.x est désespérément obsolète.).


    4.1.2.3. Compiler un noyau avec l'extension USAGI

    Comme pour le noyau vanille, seulement recommandé aux utilisateurs avancés, déjà familiarisés avec IPv6 et la compilation noyau. Voir aussi la FAQ du projet USAGI et comment obtenir le meilleur support IPv6 avec Linux (article) (miroir).


    4.1.3. Les périphériques réseau prêts pour IPv6

    Les périphériques réseau n'ont pas tous déjà (ou n'auront jamais, pour certains) la capacité de transporter des paquets IPv6. L'état actuel de la situation quant à ce sujet peut être trouvé ici.

    A cause de l'implémentation de la structure de la couche réseau du noyau, un problème majeur est qu'un paquet IPv6 n'est pas réellement reconnu par son numéro d'en-tête IP (6 au lieu de 4). Il est reconnu par le numéro de protocole de la couche transport 2. En conséquence, tout protocole n'utilisant pas un tel numéro de protocole ne peut pas distribuer les paquets IPv6. Note: le paquet est bien encore transporté sur le lien, mais, côté récepteur, la distribution ne fonctionne pas (vous pouvez observer cela par exemple avec tcpdump).


    4.1.3.1. Actuellement connus pour ne jamais être “capables de lien IPv6”

    • IP sur Ligne Série (Serial Line IP, SLIP, RFC 1055 / SLIP), serait aujourd'hui mieux dénommé SLIPv4, noms de périphérique: slX

    • IP sur Ligne Parallèle, comme pour SLIP, noms de périphérique: plipX

    • RNIS avec encapsulation rawip, noms de périphérique: isdnX


    4.1.3.2. Actuellement connu pour ne pas être “capable de lien IPv6”

    • RNIS avec encapsulation syncppp, noms de périphérique: ipppX (au sujet de la conception de ipppd, il fusionnera dans une couche PPP plus abstraite dans la série des noyaux 2.5.x)


    4.2. Les outils de configuration réseau prêts pour IPv6

    Vous n'irez pas loin si vous faites tourner un noyau prêt pour IPv6 mais sans avoir d'outils pour configurer IPv6. Il existe plusieurs paquetages pouvant servir à cette tâche.


    4.2.1. Le paquetage net-tools

    Le paquetage net-tools inclut certains outils tels que ifconfig et route qui vous aideront à configurer IPv6 sur une interface. Regardez la sortie d'ifconfig? ou celle de route?, et si vous y voyez quelque chose comme IPv6, ou inet6, c'est que l'outil est prêt pour IPv6.

    Vérification magique:

    # /sbin/ifconfig -? 2>& 1 | grep -qw 'inet6' && echo "utility 'ifconfig' is
    -¬ IPv6-ready"

    La même vérification peut être réalisée pour route:

    # /sbin/route -? 2>& 1 | grep -qw 'inet6' && echo "utility 'route' is IPv6-ready"

    4.2.2. Le paquetage iproute

    Alexey N. Kuznetsov (actuellement la personne qui maintient le code réseau de Linux) a créé un jeu d'outils qui configure le réseau à travers le périphérique netlink. Vous aurez plus de fonctionnalités en utilisant ce jeu d'outils que n'en fournit net-tools, mais il n'est pas très bien documenté et n'est pas vraiment fait pour les êtres pusillanimes.

    # /sbin/ip 2>&1 | grep -qw 'inet6' && echo "utility 'ip' is IPv6-ready"

    Si le programme /sbin/ip n'est pas trouvé, je vous recommande alors d'installer le paquetage iproute.

    • Vous pouvez le récupérer à partir de votre distribution Linux (s'il s'y trouve)

    • Vous pouvez télécharger l'archive tar et recompiler: sources sur le FTP d'origine et miroir (manquant)

    • Vous pouvez rechercher le bon paquetage RPM ici, RPMfind pour iproute (parfois la reconstruction d'un paquetage SRPM est recommandée)


    4.3. Les programmes de test/déboguage prêts pour IPv6

    Après avoir préparé votre système pour IPv6, vous voudrez établir des communications en utilisant IPv6. Vous devriez d'abord apprendre comment examiner les paquets IPv6 avec un programme dit “renifleur” (un sniffer). Cela est fortement conseillé, car cela peut aider à fournir très rapidement un diagnostic en cas de déboguage/dépannage.


    4.3.1. ping IPv6

    Ce programme est normalement inclus dans le paquetage iputils. Il est conçu pour réaliser de simples tests du transport en émettant des paquets de requête d'écho (echo-request) ICMPv6 et en attendant les paquets de réponse en écho (echo-reply) ICMPv6.

    Usage

    # ping6 <hôteavecadresseipv6>
    -# ping6 <adresseipv6>
    -# ping6 [-I <périphérique>] <adresseipv6-lien-local>

    Exemple

    # 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

    Info: ping6 a besoin d'un accès brut à la socket, il faut donc les permissions root. Par conséquent, s'il n'y a pas d'utilisateur root pouvant utiliser ping6, deux problèmes peuvent se poser ici:

    1. ping6 n'est pas sur le chemin de l'utilisateur (probablement, car ping6 est généralement stocké dans /usr/sbin -> ajouter au chemin (pas vraiment recommandé)

    2. ping6 ne s'exécute pas proprement, généralement, c'est qu'il y a des permissions root manquantes -> chmod u+s /usr/sbin/ping6


    4.3.1.1. Spécifier une interface à ping IPv6

    En spécifiant uniquement une adresse lien-local à ping IPv6, le noyau ne sait pas par quel périphérique (physique ou virtuel) il doit émettre le paquet - chaque périphérique a une adresse lien-local. Un essai aura pour résultat un message d'erreur:

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

    Dans ce cas vous devez en plus spécifier l'interface comme ci-dessous:

    # 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 et les adresses multicast

    Un mécanisme intéressant pour détecter les hôtes IPv6 actifs sur un lien est de lancer ping6 sur l'adresse multicast lien-local tous-noeuds (all-node):

    # ping6 -I eth0 ff02::1
    -PING ff02::1(ff02::1) from fe80:::2ab:cdff:feef:012356 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!) 

    A la différence d'IPv4, où les réponses à un ping sur l'adresse de diffusion (broadcast) peuvent être rendues indisponibles, en IPv6, ce comportement ne peut pas être actuellement rendu indisponible, sauf par un pare-feu IPv6 local.


    4.3.2. traceroute6 IPv6

    Ce programme est normalement inclus dans le paquetage iputils. C'est un programme similaire au traceroute d'IPv4. En voici un exemple:

    # 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

    Note: à la différence de certaines versions contemporaines du traceroute d'IPv4, qui peuvent utiliser les paquets de requête d'écho ICMPv4 aussi bien que les paquets UDP (défaut), l'actuel traceroute IPv6 ne peut qu'émettre des paquets UDP. Comme vous le savez peut-être, les paquets de requête d'écho ICMP sont mieux acceptés par les pare-feu ou les ACL sur les routeurs intermédiaires que les paquets UDP.


    4.3.3. tracepath6 IPv6

    Ce programme est normalement inclus dans le paquetage iputils. C'est un programme comme traceroute6, il trace le chemin vers une destination donnée, découvrant la MTU le long de ce chemin. En voici un exemple:

    # 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

    Sur Linux, tcpdump est l'outil majeur pour la capture de paquets. Vous allez trouver ci-dessous quelques exemples. Le support IPv6 est normalement intégré aux éditions actuelles de la version 3.6.

    tcpdump utilise des expressions pour filtrer les paquets, minimisant le bruit:

    • icmp6: filtre le trafic ICMPv6 natif

    • ip6: filtre le trafic IPv6 natif (incluant ICMPv6)

    • proto ipv6: filtre le trafic IPv6-in-IPv4 tunnelé

    • not port ssh: supprime l'affichage des paquets SSH, pour lancer tcpdump à partir d'une session distante SSH

    Certaines options en ligne de commande sont très utiles pour capter et afficher plus d'information concernant les paquets, essentiellement intéressant pour approfondir l'information des paquets ICMPv6:

    • “-s 512”: augmente la quantité d'information capturée pour un paquet à 512 octets

    • “-vv”: sortie vraiment verbeuse

    • “-n”: ne pas résoudre les adresses en noms, utile si la résolution inversée ne fonctionne pas proprement


    4.3.4.1. Ping IPv6 vers l'adresse native 3ffe:ffff:100:f101::1 sur un lien-local

    # 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 vers 3ffe:ffff:100::1 routée au travers d'un tunnel IPv6-in-IPv4

    1.2.3.4 et 5.6.7.8 sont les extrémités du tunnel (toutes les adresses sont des exemples)

    # 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. Les programmes prêts pour IPv6

    Les distributions actuelles comportent déjà les clients et les serveurs IPv6 les plus couramment utilisés. Allez d'abord voir sur IPv6 & Linux / l'état actuel des distributions. Si ce que vous cherchez n'y est pas encore, vous pouvez vérifier sur IPv6 & Linux / l'état actuel des applications disponibles, où sont répertoriés les programmes déjà portés sur IPv6 et utilisables sous Linux. Pour les programmes les plus communément employés, il y a quelques éléments disponibles dans la troisième partie et la quatrième partie de l'HowTo - IPv6 & Linux.


    4.5. Les programmes client prêts pour IPv6 (une sélection)

    Pour lancer les tests qui vont suivre, il est nécessaire que votre système dispose d'IPv6, et certains exemples montrent des adresses ne pouvant être atteintes que si une connexion au 6bone est disponible.


    4.5.1. Vérifier la résolution DNS des adresses IPv6

    A cause des mises à jour de sécurité ces dernières années, tout serveur du Système des Noms de Domaine (DNS) devrait fonctionner avec un logiciel récent comprenant déjà le type (intermédiaire) d'adresse IPv6 AAAA (le nouveau, nommé A6 n'est pas encore assez répandu pour le moment, car uniquement supporté par BIND9 et supérieurs, mais aussi à cause de la non existence de support du domaine racine IP6.ARPA). Un simple test pour savoir si le système utilisé peut résoudre les adresses IPv6 est

    # host -t AAAA www.join.uni-muenster.de

    et cela devrait affiché quelque chose comme ce qui suit:

    www.join.uni-muenster.de. is an alias for tolot.join.uni-muenster.de. 
    -tolot.join.uni-muenster.de. has AAAA address 2001:638:500:101:2e0:81ff:fe24:37c6

    4.5.2. Le client telnet prêt pour IPv6

    Des clients telnet prêts pour IPv6 sont disponibles. Un simple test peut être effectué par

    $ 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.

    Si le client telnet ne comprend pas l'adresse IPv6 et dit quelque chose comme “ne peut résoudre le nom d'hôte” (“cannot resolve hostname”), IPv6 n'est alors pas disponible.


    4.5.3. Les clients ssh prêts pour IPv6

    4.5.3.1. openssh

    Les versions actuelles d'openssh sont prêtes pour IPv6. Selon la configuration précédant la compilation, il y a deux comportements possibles.

    • --without-ipv4-default: le client essaie automatiquement une connexion IPv6 en premier et revient à IPv4 en cas d'échec.

    • --with-ipv4-default: la connexion par défaut est IPv4, la connexion IPv6 doit être forcée comme dans l'exemple qui suit:

    $ ssh -6 ::1 
    -user@::1's password: ****** 
    -[user@ipv6host user]$

    Si votre client ssh ne comprend pas l'option “-6”, c'est qu'il n'a pas IPv6 de disponible, comme la plupart des paquetages de ssh version 1.


    4.5.3.2. ssh.com

    Le client et le serveur SSH de chez SSH.com sont aussi prêts pour IPv6, et gratuits pour les machines Linux et FreeBSD selon l'usage - commercial ou personnel - qui en est fait.


    4.5.4. Les navigateurs web prêts pour IPv6

    L'état actuel de la liste des navigateurs web IPv6 est disponible.

    La plupart ont des problèmes irrésolues pour le moment

    1. Si un seul proxy IPv4 est utilisé dans les réglages, les requêtes IPv6 seront bien envoyées vers le proxy, mais celui-ci échouera à comprendre la requête, laquelle échouera. Solution: mettre à jour le logiciel proxy (à voir plus tard).

    2. Les réglages de configuration automatique de proxy (*.pac) ne peuvent être étendus afin de prendre en charge différemment les requêtes IPv6 (par exemple ne pas utiliser le proxy) à cause de leur nature (écrits en Java-script et bien encodés en dur dans les sources, comme cela peut être observé pour le code source de Maxilla).

    C'est ainsi que les anciennes versions ne comprennent pas un URL avec une adresse encodée en IPv6 comme http://[2001:4dd0:f838:a006::6]/ (cet URL ne fonctionne qu'avec un navigateur disposant d'IPv6!).

    Un bref test est d'essayer l'URL fourni avec un navigateur donné, sans utiliser de proxy.


    4.5.4.1. Un URL de test

    Un bon point de départ pour tester la navigation IPv6 est http://www.kame.net/. Si la tortue sur la page est animée, la connexion se fait via IPv6, sinon la tortue est statique.


    4.6. Les programmes serveur prêts pour IPv6

    Dans cette partie, de nombreuses questions concernant des clients spécifiques ont été mentionnées. En conséquence, les éléments pour les serveurs prêts pour IPv6 sont fournis plus bas dans la section Eléments d'installation des démons prêts pour IPv6.


    4.7. FAQ (vérification d'un système prêt pour IPv6)

    4.7.1. Utiliser les outils

    4.7.1.1. Q: impossible d'utiliser ping6 avec des adresses lien-local

    Message d'erreur: "connect: Invalid argument"

    Le noyau ne sait pas sur quel lien (physique ou virtuel) vous voulez l'utiliser et envoyer des paquets ICMPv6. C'est pourquoi est affiché un message d'erreur.

    Solution: spécifier l'interface de cette façon: “ping6 -I eth0 fe80::2e0:18ff:fe90:9205”, voir aussi l'usage du programme ping6.


    4.7.1.2. Q: impossible d'utiliser ping6 ou traceroute en tant qu'utilisateur courant

    Message d'erreur: “icmp socket: Operation not permitted

    Ces utilitaires créent des paquets spéciaux ICMPv6 et les émettent en dehors. Ceci est réalisé par l'emploi des sockets brutes du noyau. Ces dernières ne peuvent être utilisées que par l'utilisateur “root”. C'est pourquoi les utilisateurs courants obtiennent un tel message d'erreur.

    Solution: s'il est vraiment nécessaire que tous les utilisateurs puissent utiliser ces utilitaires, vous pouvez ajouter le bit “suid” en faisant ”chmod u+s /chemin/vers/le/programme”, voir aussi l'usage du programme. Si tous les utilisateurs ne doivent pas en être capables, vous pouvez changer ce programme de groupe, par exemple au profit du groupe “wheel”, ajouter les utilisateurs nécessaires à ce groupe et ôter le bit d'exécution aux autres utilisateurs par “chmod o-rwx /chemin/vers/le/programme”, ou bien configurer “sudo” pour mettre en place votre politique de sécurité.


    Chapitre 5. Configurer les interfaces

    5.1. Les différents périphériques réseau

    Sur un noeud, il existe différents périphériques réseau. Ils peuvent être

    • Physiquement rattachés, comme eth0, tr0

    • Virtuellement existants, comme ppp0, tun0, tap0, sit0, isdn0, ippp0


    5.1.1. Physiquement rattachés

    Les interfaces physiquement rattachées, comme Ethernet ou Token-Ring, sont la norme et n'ont pas besoin d'un traitement particulier.


    5.1.2. Virtuellement existants

    Les interfaces virtuellement rattachées ont toujours besoin d'un traitement particulier.


    5.1.2.1. Les interfaces de tunnelage IPv6-in-IPv4

    Ces interfaces sont normalement dénommées sitx. sit est l'abréviation mise pour Simple Transition Internet (Simple Internet Transition). Ce périphérique a la capacité d'encapsuler les paquets IPv6 à l'intérieur de paquets IPv4 et de les tunneler vers une extrémité étrangère.

    sit0 a une signification particulière et ne peut être utilisée pour des tunnels dédiés.


    5.1.2.2. Les interfaces PPP

    Les interfaces PPP acquièrent leur capacité IPv6 grâce à un démon PPP disposant d'IPv6.


    5.1.2.3. Les interfaces RNIS HDLC

    La capacité IPv6 pour HDLC avec encapsulation ip est déjà intégrée au noyau.


    5.1.2.4. Les interfaces PPP RNIS

    Les interfaces PPP RNIS (ippp) ne sont pas disponibles pour IPv6 dans le noyau. Il n'est pas prévu que cela se fasse, puisqu'elles seront remplacées par une couche d'interface ppp plus générique.


    5.1.2.5. SLIP + PLIP

    Comme il a déjà été dit, ces interfaces ne supportent pas le transport IPv6 (l'émission est OK, mais la distribution à la réception ne fonctionne pas).


    5.1.2.6. Le périphérique Ether-tap

    Les périphériques Ether-tap sont prêts pour IPv6, et sont de plus configurables sans état. Pour être utilisés, le module “ethertap” doit être chargé au préalable.


    5.1.2.7. Les périphériques tun

    Actuellement, je ne les ai pas encore testés par moi-même.


    5.1.2.8. ATM

    01/2002: non supporté par l'actuel noyau vanille, supporté par l'extension USAGI.


    5.1.2.9. Autres

    Ai-je oublié une interface?...


    5.2. (dé)Montage des interfaces

    Deux méthodes peuvent être utilisées pour (dé)monter les interfaces.


    5.2.1. Utiliser "ip"

    Usage:

    # ip link set dev <interface> up
    -# ip link set dev <interface> down

    Exemple:

    # ip link set dev eth0 up
    -# ip link set dev eth0 down

    5.2.2. Utiliser "ifconfig"

    Usage:

    # /sbin/ifconfig <interface> up
    -# /sbin/ifconfig <interface> down

    Exemple:

    # /sbin/ifconfig eth0 up
    -# /sbin/ifconfig eth0 down

    Chapitre 6. Configurer les adresses IPv6

    Il y a différentes façons de configurer une adresse IPv6 sur une interface. Vous pouvez utiliser "ifconfig" ou "ip".


    6.1. Affichage des adresses IPv6 existantes

    Vous devriez d'abord vérifier s'il existe des adresses IPv6 configurées, et combien (peut-être y en a-t-il qui l'ont été, comme par magie, pendant l'auto-configuration sans état).


    6.1.1. Utiliser "ip"

    Usage:

    # /sbin/ip -6 addr show dev <interface>

    Exemple pour un hôte configuré statiquement:

    # /sbin/ip -6 addr show dev eth0
    -2: eth0: <BROADCAST,MULTICAST,UP&gt; mtu 1500 qdisc pfifo_ fast qlen 100
    -inet6 fe80::210:a4ff:fee3:9566/10 scope link
    -inet6 3ffe:ffff:0:f101::1/64 scope global
    -inet6 fec0:0:0:f101::1/64 scope site 

    Exemple pour un hôte auto-configuré

    Ici vous pouvez voir des adresses auto-configurées comme par magie et leurs durées de vie.

    # /sbin/ip -6 addr show dev eth0 
    -3: eth0: <BROADCAST,MULTICAST,PROMISC,UP&gt; mtu 1500 qdisc pfifo_fast qlen
    -¬ 100 
    -inet6 2002:d950:f5f8:f101:2e0:18ff:fe90:9205/64 scope global dynamic 
    -valid_lft 16sec preferred_lft 6sec 
    -inet6 3ffe:400:100:f101:2e0:18ff:fe90:9205/64 scope global dynamic 
    -valid_lft 2591997sec preferred_lft 604797sec inet6 fe80::2e0:18ff:fe90:9205/10
    -¬ scope link

    6.1.2. Utiliser "ifconfig"

    Usage:

    # /sbin/ifconfig <interface>

    Exemple (la sortie est filtrée avec grep pour n'afficher que les adresses IPv6). vous pouvez voir ici des adresses IPv6 ayant des portées différentes.

    # /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. Ajouter une adresse IPv6

    Ajouter une adresse IPv6 est similaire au mécanisme des adresses “ALIAS IP” sur les interfaces configurées par IPv4 Linux.


    6.2.1. Utiliser "ip"

    Usage:

    # /sbin/ip -6 addr add <adresseipv6>/<longueurdupréfixe> dev <interface> 

    Exemple:

    # /sbin/ip -6 addr add 3ffe:ffff:0:f101::1/64 dev eth0 

    6.2.2. Utiliser "ifconfig"

    Usage:

    # /sbin/ifconfig <interface> inet6 add <adresseipv6>/<longueurdupréfixe>

    Exemple:

    # /sbin/ifconfig eth0 inet6 add 3ffe:ffff:0:f101::1/64 

    6.3. Ôter une adresse IPv6

    Rarement nécessaire, prenez garde de ne pas ôter une adresse IPv6 n'existant pas, il en résulte parfois un crash sur les anciens noyaux.


    6.3.1. Utiliser "ip"

    Usage:

    # /sbin/ip -6 addr del <adresseipv6ipv6address>/<longueurdupréfixe> dev <interface> 

    Exemple:

    # /sbin/ip -6 addr del 3ffe:ffff:0:f101::1/64 dev eth0 

    6.3.2. Utiliser "ifconfig"

    Usage:

    # /sbin/ifconfig <interface> inet6 del <adresseipv6>/<longueurdupréfixe>

    Exemple:

    # /sbin/ifconfig eth0 inet6 del 3ffe:ffff:0:f101::1/64

    Chapitre 7. Configurer les routes IPv6 courantes

    Si vous voulez quitter votre lien et voulez émettre des paquets vers l'Internet mondial IPv6, vous avez besoin de routage. S'il existe déjà un routeur disposant d'IPv6 sur votre lien, il est possible que cela soit suffisant pour ajouter des routes IPv6.


    7.1. Afficher les routes IPv6 existantes

    Vous devriez d'abord vérifier s'il existe des routes IPv6 configurées, et combien (peut-être y en a-t-il qui l'ont été, comme par magie, pendant l'auto-configuration sans état).


    7.1.1. Utiliser "ip"

    Usage:

    # /sbin/ip -6 route show [dev <périphérique>]

    Exemple:

    # /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. Utiliser "route"

    Usage:

    # /sbin/route -A inet6 

    Exemple (la sortie est filtrée sur l'interface eth0). Ici vous pouvez voir différentes routes IPv6 pour différentes adresses sur une même interface.

    # /sbin/route -A inet6 |grep -w "eth0"
    -3ffe:ffff:0:f101 ::/64 :: UA  256 0 0 eth0 <- Route de l'interface de portée globale
    -¬ address
    -fe80::/10        ::       UA  256 0 0 eth0 <- Route de l'interface de portée lien-local
    -¬ address
    -ff00::/8         ::       UA  256 0 0 eth0 <- Route de l'interface destiné à tout le trafic multicast
    -¬ addresses
    -::/0             ::       UDA 256 0 0 eth0 <- Route automatique par défaut

    7.2. Ajouter une route IPv6 traversant une passerelle

    Nécessaire la plupart du temps pour atteindre l'extérieur grâce à IPv6 en utilisant un routeur IPv6 sur votre lien.


    7.2.1. Utiliser "ip"

    Usage:

    # /sbin/ip -6 route add <réseauipv6>/<longueurdupréfixe> via <adresseipv6>
    -¬ [dev <périphérique>]

    Exemple:

    # /sbin/ip -6 route add 2000::/3 via 3ffe:ffff:0:f101::1

    7.2.2. Utiliser "route"

    Usage:

    # /sbin/route -A inet6 add <réseauipv6>/<longueurdupréfixe> gw
    -¬ <adresseipv6> [dev <périphérique>] 

    Un périphérique peut être nécessaire également, si l'adresse IPv6 de la passerelle est un lien-local.

    Suivre l'exemple montré ajoute une route à toutes les adresses globales actuelles (2000::/3) à travers la passerelle 3ffe:ffff:0:f101::1

    # /sbin/route -A inet6 add 2000::/3 gw 3ffe:ffff:0:f101::1

    7.3. Ôter une route IPv6 traversant une passerelle

    Rarement nécessaire manuellement, la plupart du temps effectué par les scripts configurant le réseau à l'extinction (totale ou par interface)


    7.3.1. Utiliser "ip"

    Usage:

    # /sbin/ip -6 route del <réseauipv6>/<longueurdupréfixe> via <ipv6address>
    -¬ [dev <périphérique>]

    Exemple:

    # /sbin/ip -6 route del 2000::/3 via 3ffe:ffff:0:f101::1

    7.3.2. Utiliser "route"

    Usage:

    # /sbin/route -A inet6 del <réseau>/<longueurdupréfixe> [dev <périphérique>]

    Exemple pour de nouveau ôter la route précédemment ajoutée:

    # /sbin/route -A inet6 del 2000::/3 gw 3ffe:ffff:0:f101::1

    7.4. Ajouter une route IPv6 traversant une interface

    Pas si fréquent, parfois en cas de création de lien point-à-point.


    7.4.1. Utiliser "ip"

    Usage:

    # /sbin/ip -6 route add <réseauipv6>/<longueurdupréfixe> dev <périphérique>
    -¬ metric 1

    Exemple:

    # /sbin/ip -6 route add 2000::/3 dev eth0 metric 1

    La distance (metric) “1” est utilisée ici par soucis de compatibilité avec la distance utilisée par route, car la distance par défaut fixée par “ip” est “1024”.


    7.4.2. Utiliser "route"

    Usage:

    # /sbin/route -A inet6 add <réseau>/<longueurdupréfixe> dev <périphérique>

    Exemple:

    # /sbin/route -A inet6 add 2000::/3 dev eth0 

    7.5. Ôter une route IPv6 traversant une interface

    Rarement utiliser manuellement, les scripts de configuration font cela à l'extinction.


    7.5.1. Utiliser "ip"

    Usage:

    # /sbin/ip -6 route del <réseauipv6>/<longueurdupréfixe> dev <périphérique>

    Exemple:

    # /sbin/ip -6 route del 2000::/3 dev eth0 

    7.5.2. Utiliser "route"

    Usage:

    # /sbin/route -A inet6 del <réseau>/<longueurdupréfixe> dev <périphérique>

    Exemple:

    # /sbin/route -A inet6 del 2000::/3 dev eth0

    7.6. FAQ concernant les routes IPv6

    7.6.1. Support d'une route par défaut IPv6

    Une idée d'IPv6 était le routage hiérarchique, avec pour conséquence une quantité moindre d'entrées dans les tables de routage nécessaires aux routeurs.

    Il y a certains problèmes dans les noyaux Linux actuels:


    7.6.1.1. Les clients (ne routent aucun paquet!)

    Les clients peuvent installer une route par défaut avec pour préfixe “::/0”, ils peuvent aussi apprendre une telle route par auto-configuration, en utilisant par exemple radvd s'il est présent sur le lien, comme le montre ce qui suit:

    # 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. Les routeurs en cas de renvoi de paquets

    Dans ses grandes lignes, l'actuel noyau Linux (au moins <= 2.4.17) ne supporte pas les routes par défaut. Vous pouvez les installées, mais la recherche échouera quand un paquet devra être renvoyé (une intention normale pour un routeur).

    Pour l'heure, le “routage par défaut” peut être installé en utilisant l'actuel et unique préfixe d'adresse globale “2000::/3”.

    Le projet USAGI supporte déjà cela dans leurs extensions grâce à une astuce de programmation (NdT: a hack, i.e. littéralement, une”bidouille”).

    Note: prenez garde au routage par défaut sans filtrage d'adresse sur les routeurs de bordure, sinon du trafic multicast ou site-local quittera l'environnement.


    Chapitre 8. La découverte de voisinage

    La découverte de voisinage est le successeur IPv6 de ARP (Address Resolution Protocol, protocole de résolution d'adresse) pour IPv4. Vous pouvez récupérer l'information concernant le voisinage actuel, de plus, vous pouvez fixer ou détruire des entrées. Le noyau garde la trace de la détection d'un voisin (comme ARP pour IPv4). Vous pouvez faire des recherches dans la table apprise, en utilisant “ip”.


    8.1. Afficher le voisinage en utilisant "ip"

    Avec la commande qui suit vous pouvez afficher les voisins IPv6 appris ou configurés

    # ip -6 neigh show [dev <périphérique>]

    L'exemple suivant montre un voisin, qui est un routeur pouvant être atteint

    # ip -6 neigh show
    -fe80::201:23ff:fe45:6789 dev eth0 lladdr 00:01:23:45:67:89 router nud reachable

    8.2. Manipuler la table de voisinage en utilisant "ip"

    8.2.1. Ajouter manuellement une entrée

    La commande suivante vous permet d'ajouter manuellement une entrée

    # ip -6 neigh add <adresseIPv6> lladdr <adressedelacouche-lien> dev <périphérique>

    Exemple:

    # ip -6 neigh add fec0::1 lladdr 02:01:02:03:04:05 dev eth0

    8.2.2. Détruire manuellement une entrée

    De même qu'une entrée peut être ajoutée, une entrée peut être détruite:

    # ip -6 neigh del <adresseipv6> lladdr <adressedelacouche-lien> dev <périphérique>

    Exemple:

    # ip -6 neigh del fec0::1 lladdr 02:01:02:03:04:05 dev eth0

    8.2.3. Pour plus de réglages avancés

    L'outil “ip” est sous-documenté, mais il est très puissant. Voir l'aide en ligne pour en savoir plus

    # 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 ]

    Il semble que certaines options soient uniquement pour IPv4... si vous pouvez contribuer à en dire plus sur les drapeaux et l'emploi avancé, merci d'envoyer vos informations.


    Chapitre 9. Configurer les tunnels IPv6-in-IPv4

    Si vous souhaitez quitter votre lien incapable d'accéder à IPv6 à partir de votre réseau local, vous avez besoin d'un tunnelage IPv6-in-IPv4 afin de rejoindre l'Internet mondial IPv6.

    Il y a différents mécanismes de tunnelage, et conséquemment, différentes façons d'installer des tunnels.


    9.1. Les types de tunnel

    Il y a plus d'une façon de tunneler des paquets IPv6 sur des liens uniquement IPv4.


    9.1.1. Tunnelage statique point-à-point: 6bone

    Un tunnel point-à-point est un tunnel dédié à un point de connexion terminal, qui connaît votre réseau IPv6 (pour le routage en retour) et l'adresse IPv4 de votre point de connexion (terminale), comme défini dans la RFC 2893 / Transition Mechanisms for IPv6 Hosts and Routers. Pré-requis:

    • L'adresse IPv4 de votre point de connexion terminal doit être globalement unique, statique, et accessible à partir de l'autre point de connexion terminal distant

    • Un préfixe IPv6 vous est assigné (voir le bureau d'enregistrement 6bone)

    • Une extrémité distante du tunnel capable de router votre préfixe IPv6 jusqu'à votre extrémité locale du tunnel (la plupart du temps, une configuration manuelle distante est requise)


    9.1.2. Le tunnelage automatique

    Le cas du tunnelage automatique se présente quand un noeud se connecte directement à un autre noeud en ayant obtenu au préalable l'adresse IPv4 de l'autre noeud.


    9.1.3. Le tunnelage 6to4

    Le tunnelage 6to4 (RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds) utilise un mécanisme simple pour créer des tunnels automatiques. Tout noeud ayant une adresse unique globale IPv4 est capable d'être le point de connexion terminal d'un tunnel 6to4 (si aucun pare-feu IPv4 ne prohibe ce trafic). Foncièrement, le tunnelage 6to4 n'est pas un tunnel en binôme (one-to-one tunnel). Ce tunnelage se subdivise en un tunnelage d'un flux montant et d'un flux descendant. Une adresse IPv6 spéciale indique que ce noeud utilisera un tunnelage 6to4 pour se connnecter au réseau mondial IPv6.


    9.1.3.1. La génération d'un préfixe 6to4

    Une adresse 6to4 est définie comme suit (le schéma provient du RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds):

    |   3+13   |    32     |    16  |            64 bits             | 
    -+---+------+-----------+--------+--------------------------------+ 
    -|  FP+TLA  |  V4ADDR   | SLA ID |           Interface ID         | 
    -|  0x2002  |           |        |                                | 
    -+---+------+-----------+--------+--------------------------------+

    FP et TLA ensemble (16 bits) ont la valeur 0x2002. V4ADDR est l'adresse IPv4 globale et unique du noeud (en notation hexadécimale). SLA est l'identifiant de sous-réseau (65536 sous-réseaux locaux possibles). Ils sont utilisés pour représenter la structure locale de votre réseau.

    Pour les passerelles, un tel préfixe est généré en utilisant normalement pour SLA “0000”, et pour suffixe “::1” (ce n'est pas une nécessité, il peut être déterminé arbitrairement, mais d'une portée locale) et assigné à l'interface de tunnelage 6to4. Notez que Windows Microsoft utilise aussi V4ADDR comme préfixe.


    9.1.3.2. Le flux de tunnelage ascendant 6to4

    Le noeud doit savoir à quel point de connexion terminal étranger ses paquets IPv6 dans IPv4 doivent être envoyés. Aux tout premiers jours du tunnelage 6to4, des routeurs dédiés au tunnelage de flux ascendant avaient été définis. Voir l'information 6to4 de NSayer pour une liste de ses routeurs.

    De nos jours, les routeurs de flux ascendant 6to4 peuvent être découverts comme par magie par l'emploi de l'adresse anycast 192.88.99.1. Les protocoles de routage s'occupent de cela en arrière-plan, voir le RFC 3068 / An Anycast Prefix for 6to4 Relay Routers pour les détails.


    9.1.3.3. Le flux de tunnelage descendant 6to4

    La méthode servant au flux descendant (du 6bone vers votre noeud disposant de 6to4) n'est pas vraiment bien fixée et peut varier selon l'hôte étranger vers qui sont envoyés les paquets originaux. Il existe deux possibilités:

    • l'hôte étranger utilise 6to4 et émet directement en retour les paquets à votre noeud (voir plus bas)

    • l'hôte étranger émet les paquets en retour vers le réseau mondial IPv6 et selon le routage dynamique qui a lieu alors, un routeur relais créera un tunnel automatique de retour vers votre noeud.


    9.1.3.4. Le trafic possible avec 6to4

    • de 6to4 vers 6to4: est normalement tunnelé directement entre chacun des hôtes disposant de 6to4

    • de 6to4 vers un trafic non 6to4: est émis via le flux ascendant du tunnelage

    • un trafic non 6to4 vers 6to4: est émis via le flux descendant du tunnelage


    9.2. Afficher les tunnels existants

    9.2.1. Utiliser "ip"

    Usage:

    # /sbin/ip -6 tunnel show [<périphérique>]

    Exemple:

    # /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. Utiliser "route"

    Usage:

    # /sbin/route -A inet6 

    Exemple (la sortie est filtrée afin de ne laisser apparaître que les tunnels empreintant l'interface 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. Montage d'un tunnel point-à-point

    Il y a 3 possibilités pour ajouter ou ôter un tunnel point-à-point.

    Une bonne source d'information additionnelle à propos de l'installation de tunnel grâce à “ip” est configurer les tunnels avec iproute2 (article) (miroir).


    9.3.1. Ajouter un tunnel point-à-point

    9.3.1.1. Utiliser "ip"

    La méthode la plus commune actuellement pour une petite quantité de tunnels.

    Usage en vue de créer un périphérique de tunnelage (mais il n'est pas monté pour autant, une TTL doit également être spécifiée, car la valeur par défaut est 0)

    # /sbin/ip tunnel add <périphérique> mode sit ttl <ttlpardéfaut> remote
    -¬ <adresseipv4dutunnelétranger> local <adresseipv4locale>

    Usage (exemple générique pour trois tunnels):

    # /sbin/ip tunnel add sit1 mode sit ttl <ttlpardéfaut> remote
    -¬ <adresseipv4dutunnelétranger1> local <adresseipv4locale>
    -# /sbin/ip link set dev sit1 up
    -# /sbin/ip -6 route add <préfixepourlaroute1> dev sit1 metric 1
    -
    -# /sbin/ip tunnel add sit2 mode sit ttl <ttlpardéfaut>
    -¬ <adresseipv4dutunnelétranger2> local <adresseipv4locale>
    -# /sbin/ip link set dev sit2 up
    -# /sbin/ip -6 route add <préfixepourlaroute2> dev sit2 metric 1
    -
    -# /sbin/ip tunnel add sit3 mode sit ttl <ttlpardéfaut>
    -¬ <adresseipv4dutunnelétranger3> local <adresseipv4locale>
    -# /sbin/ip link set dev sit3 up
    -# /sbin/ip -6 route add <préfixepourlaroute3> dev sit3 metric 1

    9.3.1.2. Utiliser "ifconfig" et "route" (méthode dépréciée)

    Ce n'est véritablement pas une méthode recommandée pour ajouter un tunnel, car elle est plutôt étrange. Pas de problème lors de l'ajout d'un seul tunnel, mais si vous en montez plus d'un, il ne vous est pas possible facilement de démonter le premier tout en laissant les autres fonctionner.

    Usage (exemple générique pour trois tunnels):

    # /sbin/ifconfig sit0 up
    -
    -# /sbin/ifconfig sit0 tunnel <adresseipv4dutunnelétranger1>
    -# /sbin/ifconfig sit1 up
    -# /sbin/route -A inet6 add <préfixepourlaroute1> dev sit1
    -
    -# /sbin/ifconfig sit0 tunnel <adresseipv4dutunnelétranger2>
    -# /sbin/ifconfig sit2 up
    -# /sbin/route -A inet6 add <préfixepourlaroute2> dev sit2
    -
    -# /sbin/ifconfig sit0 tunnel <adresseipv4dutunnelétranger3>
    -# /sbin/ifconfig sit3 up
    -# /sbin/route -A inet6 add <préfixepourlaroute3> dev sit3

    Important: NE JAMAIS FAIRE DE LA SORTE, car cette façon de faire rend implicitement disponible le "tunnelage automatique" à partir de n'importe où dans l'Internet, c'est un risque, et cela ne devrait jamais être préconisé.


    9.3.1.3. Utiliser seulement "route"

    Il est aussi possible d'installer des tunnels dans le style Accès Multiple Sans Diffusion (Non Broadcast Multiple Access, ou NBMA), c'est un moyen facile d'ajouter de nombreux tunnels en une fois.

    Usage (exemple générique pour trois tunnels):

    # /sbin/ifconfig sit0 up
    -
    -# /sbin/route -A inet6 add <préfixepourlaroute1> gw
    -¬ ::<adresseipv4dutunnelétranger1> dev sit0
    -# /sbin/route -A inet6 add <préfixepourlaroute2> gw
    -¬ ::<adresseipv4dutunnelétranger2> dev sit0
    -# /sbin/route -A inet6 add <préfixepourlaroute3> gw
    -¬ ::<adresseipv4dutunnelétranger3> dev sit0

    Important: NE JAMAIS FAIRE DE LA SORTE, car cette façon de faire rend implicitement disponible le "tunnelage automatique" à partir de n'importe où dans l'Internet, c'est un risque, et cela ne devrait jamais être préconisé.


    9.3.2. Ôter des tunnels point-à-point

    Rarement réalisé manuellement, mais utilisé par les scripts pour une extinction propre ou un redémarrage de la configuration IPv6.


    9.3.2.1. Utiliser "ip"

    Pour ôter un périphérique de tunnelage:

    # /sbin/ip tunnel del <périphérique>

    Usage (exemple générique pour trois tunnels):

    # /sbin/ip -6 route del <préfixepourlaroute1> dev sit1
    -# /sbin/ip link set sit1 down
    -# /sbin/ip tunnel del sit1
    -
    -# /sbin/ip -6 route del <préfixepourlaroute2> dev sit2
    -# /sbin/ip link set sit2 down
    -# /sbin/ip tunnel del sit2
    -
    -# /sbin/ip -6 route del <préfixepourlaroute3> dev sit3
    -# /sbin/ip link set sit3 down
    -# /sbin/ip tunnel del sit3

    9.3.2.2. Utiliser "ifconfig" et "route" (méthode dépréciée parce qu'elle n'est pas très drôle)

    Ce n'est pas seulement la création qui est étrange, mais l'extinction aussi... vous devez ôter les tunnels dans l'ordre inverse, ce qui signifie que le premier créé doit être le dernier ôté.

    Usage (exemple générique pour trois tunnels):

    # /sbin/route -A inet6 del <préfixepourlaroute3> dev sit3
    -# /sbin/ifconfig sit3 down
    -
    -# /sbin/route -A inet6 del <préfixepourlaroute2> dev sit2
    -# /sbin/ifconfig sit2 down
    -
    -# /sbin/route -A inet6 add <préfixepourlaroute1> dev sit1
    -# /sbin/ifconfig sit1 down
    -
    -# /sbin/ifconfig sit0 down

    9.3.2.3. Utiliser "route"

    Comme pour ôter des routes IPv6 courantes

    Usage (exemple générique pour trois tunnels):

    # /sbin/route -A inet6 del <préfixepourlaroute1> gw
    -¬ ::<adresseipv4dutunnelétranger1> dev sit0
    -# /sbin/route -A inet6 del <préfixepourlaroute2> gw
    -¬ ::<adresseipv4dutunnelétranger2> dev sit0
    -# /sbin/route -A inet6 del <préfixepourlaroute3> gw
    -¬ ::<adresseipv4dutunnelétranger3> dev sit0
    -
    -# /sbin/ifconfig sit0 down

    9.3.3. Attribution d'une adresse (numbered) à un tunnel point-à-point

    Il est parfois nécessaire de configurer un tunnel point-à-point avec des adresses IPv6 comme pour IPv4 aujourd'hui. C'est seulement possible avec la première méthode (ifconfig+route - dépréciée) et la troisième méthode (ip+route) d'installation de tunnel. Dans de tels cas, vous pouvez ajouter l'adresse IPv6 à l'interface de tunnelage comme montré dans la configuration d'interface.


    9.4. Installation des tunnels 6to4

    Prenez garde au fait que le support des tunnels 6to4 est actuellement manquant sur la série des noyaux vanille 2.2.x (voir la vérification du système / noyau pour plus de détails). Notez aussi que la longueur du préfixe d'une adresse 6to4 est de 16, car, du point de vue du réseau, tous les autres hôtes 6to4 sont sur la même couche 2.


    9.4.1. Ajouter un tunnel 6to4

    Vous avez premièrement à calculer votre préfixe 6to4 en utilisant votre adresse IPv4 routable assignée localement (si votre hôte n'a pas d'adresse IPv4 routable, dans des cas précis, NAT sur une passerelle est possible):

    En considérant que votre adresse IPv4 soit

    1.2.3.4

    le préfixe 6to4 généré sera

    2002:0102:0304::

    Les passerelles locales 6to4 devraient (mais cela n'est pas une nécessité, vous pouvez choisir un préfixe arbitraire de portée locale, si cela vous sied mieux) toujours assigner le suffixe “::1”, ce qui vous donnera comme adresse 6to4 locale

    2002:0102:0304::1

    Utiliser par exemple ce qui suit pour une génération automatique:

    ipv4="1.2.3.4"; printf "2002:%02x%02x:%02x%02x::1" `echo $ipv4 | tr "." " "`

    Il y a maintenant deux façons possibles de mettre en place un tunnelage 6to4.


    9.4.1.1. Utiliser "ip" et un périphérique tunnel dédié

    C'est dorénavant la façon de faire qui est recommandée (une TTL doit être spécifiée, car le défaut est 0).

    Créez un nouveau périphérique tunnel

    # /sbin/ip tunnel add tun6to4 mode sit ttl <ttlpardéfaut> remote any local <adresseipv4locale> 

    Montez l'interface

    # /sbin/ip link set dev tun6to4 up 

    Ajouter une adresse 6to4 locale à l'interface (note: la longueur du préfixe, 16, est importante!)

    # /sbin/ip -6 addr add <adresse6to4locale>/16 dev tun6to4 

    Ajouter une route (par défaut) au réseau global IPv6 en utilisant l'adresse anycast tous-routeurs-6to4 (all-6to4-routers)

    # /sbin/ip -6 route add 2000::/3 via ::192.88.99.1 dev tun6to4 metric 1

    Il a été rapporté que certaines versions de “ip” (par exemple Linux SuSe 9.0) ne prennent pas en charge les adresses IPv6 compatibles IPv4 pour les passerelles. Dans ce cas, l'adresse IPv6 correspondante doit être employée:

    # /sbin/ip -6 route add 2000::/3 via 2002:c058:6301::1 dev tun6to4 metric 1

    9.4.1.2. Utiliser "ifconfig", "route" et le périphérique de tunnelage “sit0” (méthode dépréciée)

    Cela est déprécié car le périphérique de tunnel générique sit0 ne permet pas de spécifier un filtrage par périphérique.

    Monter l'interface de tunnelage générique sit0

    # /sbin/ifconfig sit0 up 

    Ajouter une adresse 6to4 locale à une interface

    # /sbin/ifconfig sit0 add <adresse6to4locale>/16

    Ajouter une route (par défaut) au réseau global IPv6 en utilisant l'adresse anycast IPv4 tous-relais-6to4 (all-6to4-relays)

    # /sbin/route -A inet6 add 2000::/3 gw ::192.88.99.1 dev sit0

    9.4.2. Ôter un tunnel 6to4

    9.4.2.1. Utiliser "ip" et un périphérique de tunnelage dédié

    Ôter toutes les routes traversant ce périphérique de tunnelage spécifique

    # /sbin/ip -6 route flush dev tun6to4

    Démonter l'interface

    # /sbin/ip link set dev tun6to4 down

    Ôter un périphérique tunnel

    # /sbin/ip tunnel del tun6to4 

    9.4.2.2. Utiliser “ifconfig”, “route” et un périphérique de tunnel générique “sit0” (déprécié)

    Ôter une route (par défaut) traversant une interface tunnel 6to4

    # /sbin/route -A inet6 del 2000::/3 gw ::192.88.99.1 dev sit0

    Ôter une adresse locale 6to4 d'une interface

    # /sbin/ifconfig sit0 del <adresse6to4locale>/16

    Démontage d'un périphérique de tunnelage générique (prenez garde, peut-être est-il utilisé...)

    # /sbin/ifconfig sit0 down 

    Chapitre 10. Configurer les tunnels IPv4-in-IPv6

    Cela sera complété à l'avenir. Pour le moment, de tels tunnels sont essentiellement employés en environnement de test, mais il semble que le support soit actuellement manquant pour linux (03/2004).

    Pour l'heure, plus d'information dans le RFC 2473 / Generic Packet Tunneling in IPv6 Specification


    Chapitre 11. Les réglages du noyau dans le système de fichiers /proc

    Note: la source de cette section est essentiellement le fichier "ip-sysctl.txt", qui est inclus dans les sources du noyau actuel, dans le répertoire "Documentation/networking". Le crédit va à Pekka Savola qui maintient la partie de ce fichier relative à IPv6. D'autres textes sont aussi plus ou moins copier/coller dans cette partie de document.


    11.1. Comment accéder au système de fichiers /proc

    11.1.1. Utiliser “cat” et “echo”

    Utiliser "cat" et "echo" est le moyen le plus simple d'accéder au système de fichiers /proc, mais certains pré-requis sont nécessaires à cela

    • Le système de fichiers /proc doit être rendu disponible dans le noyau, ce qui signifie qu'à la compilation le commutateur suivant doit avoir été positionné

    CONFIG_PROC_FS=y

    • Le système de fichiers /proc doit être auparavant monté, ce qui peut être testé en faisant

    # mount | grep "type proc"
    -none on /proc type proc (rw)

    • Vous devez pouvoir lire le système de fichiers /proc et parfois aussi y écrire (normalement seul root le peut)

    Normalement, seules les entrées dans /proc/sys/* sont en écriture, les autres sont en lecture seule et servent seulement à la récupération de l'information.


    11.1.1.1. Récupérer une valeur

    La valeur de l'entrée peut être récupérée en utilisant "cat":

    # cat /proc/sys/net/ipv6/conf/all/forwarding
    -0

    11.1.1.2. Fixer une valeur

    Une nouvelle valeur peut être fixée (si l'entrée est en écriture) en utilisant echo:

    # echo "1" >/proc/sys/net/ipv6/conf/all/forwarding

    11.1.2. Utiliser “sysctl”

    Utiliser le programme "sysctl" pour accéder aux commutateurs du noyau est une méthode moderne aujourd'hui. Vous pouvez aussi l'utiliser même si le système de fichiers /proc n'est pas monté. Mais vous n'avez alors accès qu'à /proc/sys/*!

    Le programme “sysctl” est compris dans le paquetage “procps” (sur le système Red Hat).

    • L'interface sysctl doit être disponible dans le noyau, ce qui signifie qu'à la compilation le commutateur suivant a à être fixé

    CONFIG_SYSCTL=y

    11.1.2.1. Récupérer une valeur

    La valeur de l'entrée peut maintenant être récupérée:

    # sysctl net.ipv6.conf.all.forwarding
    -net.ipv6.conf.all.forwarding = 0

    11.1.2.2. Fixer une valeur

    Une nouvelle valeur peut être fixée (si l'entrée est en écriture):

    # sysctl -w net.ipv6.conf.all.forwarding=1
    -net.ipv6.conf.all.forwarding = 1

    Note: n'utilisez pas d'espaces autour du signe "=" lorsque vous fixez les valeurs. De même pour une valeur multiple sur une même ligne, mettez des guillemets comme ceci

    # sysctl -w net.ipv4.ip_local_port_range="32768 61000"
    -net.ipv4.ip_local_port_range = 32768 61000

    11.1.2.3. En plus

    Note: il existe dans la pratique certaines versions de sysctl qui affichent “/” au lieu de “.”

    Pour plus de détails jetez un coup d'oeil dans la page de manuel de sysctl.

    une astuce: pour une recherche rapide parmi les réglages, utiliser “-a” (afficher toutes les entrées) en conjonction avec “grep”.


    11.1.3. Les types de valeur trouvés dans le système de fichiers /proc

    IL y a plusieurs formats observés dans le système de fichiers /proc:

    • BOOLÉEN: simple “0” (faux) ou “1” (vrai)

    • ENTIER: une valeur entière, peut être également non signée

    • Des lignes plus sophistiquées avec plusieurs valeurs: parfois un en-tête est aussi affiché, sinon, jetez un coup d'oeil aux sources du noyau pour savoir quel sens possède telle ou telle valeur...


    11.2. Les entrées de /proc/sys/net/ipv6/

    11.2.1. conf/default/*

    Changer les réglages par défaut spécifiques à chaque interface.


    11.2.2. conf/all/*

    Changer tous les réglages spécifiques aux interfaces.

    Exception: “conf/all/forwarding” a une signification différente ici


    11.2.2.1. conf/all/forwarding

    • Type: BOOLÉEN

    Ceci rend disponible le renvoi global IPv6 entre toutes les interfaces.

    En IPv6, vous ne pouvez contrôler le renvoi par périphérique, le contrôle du renvoi doit être réalisé en utilisant les jeux de règles de netfilter-IPv6 (contrôlés grâce à ip6tables) en spécifiant les périphériques d'entrée et de sortie (voir comment mettre en place un pare-feu/Netfilter6 pour plus d'information); à la différence d'IPv4, où vous pouvez contrôler le renvoi périphérique par périphérique (la décision est prise sur l'interface qui reçoit des paquets).

    Ceci fixe aussi le réglage du renvoi Hôte/Routeur de toutes les interfaces à la valeur spécifiée. Voir plus bas pour plus de détails. Tout ceci relève du renvoi global.

    Si cette valeur est à 0, aucun renvoi IPv6 n'est disponible, jamais aucun paquet ne part vers une autre interface, ni physique, ni logique, comme par exemple un tunnel.


    11.2.3. conf/interface/*

    Changer les réglages spécifiques à chaque interface.

    Le comportement fonctionnel de certains réglages est dépendant du positionnement du renvoi local, disponible ou non.


    11.2.3.1. accept_ra

    • Type: BOOLÉEN

    • Défaut fonctionnel: disponible si le renvoi local est disponible; indisponible si le renvoi local est disponible.

    Accepter les annonces de routeur, et auto-configurer cette interface avec les données reçues.


    11.2.3.2. accept_redirects

    • Type: BOOLÉEN

    • Défaut fonctionnel: disponible si le renvoi local est indisponible. Indisponible si le renvoi local est disponible.

    Accepter les redirections émises par un routeur IPv6.


    11.2.3.3. autoconf

    • Type: BOOLÉEN

    • Défaut: VRAI

    Configurer les adresses lien-local (voir aussi Les types d'adresse) utilisant les adresses matérielles L2. Par exemple, ceci génère, comme par magie, une adresse telle que “fe80::201:23ff:fe45:6789” sur une interface ayant une adresse MAC-L2.


    11.2.3.4. dad_transmits

    • Type: ENTIER

    • Défaut: 1

    Quantité de message de détection d'adresse dupliquée à émettre.


    11.2.3.5. forwarding

    • Type: BOOLÉEN

    • Défaut: FAUX si le renvoi global est indisponible (défaut), sinon VRAI

    Configurer le comportement spécifique à chaque interface Hôte/Routeur.

    Note: Il est recommandé d'avoir le même réglage sur toutes les interfaces; mélanger les scénarii routeur/hôte est plutôt atypique.

    • Valeur FAUX: Par défaut, le comportement d'hôte est assumé. Cela signifie que:

    1. Le drapeau IsRouter n'est pas positionné dans les annonces de voisinage.

    2. Les sollicitations de routeur sont envoyées dès que nécessaires.

    3. Si accept_ra est VRAI (défaut), accepte les annonces de routeur (et réalise une auto-configuration).

    4. Si accept_redirects est VRAI (défaut), accepte les redirections.

    • Valeur VRAI: si le renvoi local est disponible, le comportement d'un routeur est assumé. Ceci signifie l'opposé de ce qui précéde:

    1. Le drapeau IsRouter est positionné dans les annonces de voisinage.

    2. Les sollicitations de routeur ne sont pas émises.

    3. Les annonces de routeur sont ignorées.

    4. Les redirections sont ignorées.


    11.2.3.6. hop_limit

    • Type: ENTIER

    • Défaut: 64

    Nombre limite de sauts par défaut.


    11.2.3.7. mtu

    • Type: ENTIER

    • Défaut: 1280 (minimum requis pour IPv6)

    Unité de transfert maximum par défaut


    11.2.3.8. router_solicitation_delay

    • Type: ENTIER

    • Défaut: 1

    Nombre de secondes à attendre après le montage d'une interface avant d'émettre des sollicitations de routeur.


    11.2.3.9. router_solicitation_interval

    • Type: ENTIER

    • Défaut: 4

    Nombre de secondes d'attente entre les émissions de sollicitations de routeur.


    11.2.3.10. router_solicitations

    • Type: ENTIER

    • Défaut: 3

    Nombre de sollicitation(s) de routeur à émettre avant de considérer qu'aucun routeur n'est présent.


    11.2.4. neigh/default/*

    Changer les réglages par défaut pour la détection de voisinage et certaines valeurs d'intervalle global et de déclenchement (threshold):


    11.2.4.1. gc_thresh1

    • Type: ENTIER

    • Défaut: 128

    A remplir plus avant.


    11.2.4.2. gc_thresh2

    • Type: ENTIER

    • Défaut: 512

    A remplir plus avant.


    11.2.4.3. gc_thresh3

    • Type: ENTIER

    • Défaut: 1024

    Paramètre de réglage de la taille de la table du voisinage.

    Augmenter cette valeur si vous avez de nombreuses interfaces et un problème avec des routes qui commencent à mystérieusement s'activer et échouer. Ou si un démon de routage Zebra en cours d'activité rapporte cette erreur:

    ZEBRA: netlink-listen error: No buffer space available, type=RTM_NEWROUTE(24), seq=426, pid=0

    11.2.4.4. gc_interval

    • Type: ENTIER

    • Défaut: 30

    A remplir plus avant.


    11.2.5. neigh/interface/*

    Changez ces réglages spécifiques à chaque interface pour la détection de voisinage.


    11.2.5.1. anycast_delay

    • Type: ENTIER

    • Défaut: 100

    A remplir plus avant.


    11.2.5.2. gc_stale_time

    • Type: ENTIER

    • Défaut: 60

    A remplir plus avant.


    11.2.5.3. proxy_qlen

    • Type: ENTIER

    • Défaut: 64

    A remplir plus avant.


    11.2.5.4. unres_qlen

    • Type: ENTIER

    • Défaut: 3

    A remplir plus avant.


    11.2.5.5. app_solicit

    • Type: ENTIER

    • Défaut: 0

    A remplir plus avant.


    11.2.5.6. locktime

    • Type: ENTIER

    • Défaut: 0

    A remplir plus avant.


    11.2.5.7. retrans_time

    • Type: ENTIER

    • Défaut: 100

    A remplir plus avant.


    11.2.5.8. base_reachable_time

    • Type: ENTIER

    • Défaut: 30

    A remplir plus avant.


    11.2.5.9. mcast_solicit

    • Type: ENTIER

    • Défaut: 3

    A remplir plus avant.


    11.2.5.10. ucast_solicit

    • Type: ENTIER

    • Défaut: 3

    A remplir plus avant.


    11.2.5.11. delay_first_probe_time

    • Type: ENTIER

    • Défaut: 5

    A remplir plus avant.


    11.2.5.12. proxy_delay

    • Type: ENTIER

    • Défaut: 80

    A remplir plus avant.


    11.2.6. route/*

    Changer les réglages globaux du routage.


    11.2.6.1. flush

    Retiré des nouvelles versions du noyau .


    11.2.6.2. gc_interval

    • Type: ENTIER

    • Défaut: 30

    A remplir plus avant.


    11.2.6.3. gc_thresh

    • Type: ENTIER

    • Défaut: 1024

    A remplir plus avant.


    11.2.6.4. mtu_expires

    • Type: ENTIER

    • Défaut: 600

    A remplir plus avant.


    11.2.6.5. gc_elasticity

    • Type: ENTIER

    • Défaut: 0

    A remplir plus avant.


    11.2.6.6. gc_min_interval

    • Type: ENTIER

    • Défaut: 5

    A remplir plus avant.


    11.2.6.7. gc_timeout

    • Type: ENTIER

    • Défaut: 60

    A remplir plus avant.


    11.2.6.8. min_adv_mss

    • Type: ENTIER

    • Défaut: 12

    A remplir plus avant.


    11.2.6.9. max_size

    • Type: ENTIER

    • Défaut: 4096

    A remplir plus avant.


    11.3. Les entrées relatives à IPv6 dans /proc/sys/net/ipv4/

    Pour le moment (et cela sera valable jusqu'à ce qu'IPv4 soit complètement converti en un module indépendant du noyau), certains commutateurs IPv4 sont aussi utilisés par IPv6.


    11.3.1. ip_*

    11.3.1.1. ip_local_port_range

    Ce réglage sont aussi utilisé par IPv6.


    11.3.2. tcp_*

    Ces réglages sont aussi utilisés par IPv6.


    11.3.3. icmp_*

    Ces réglages ne sont pas utilisés par IPv6. Pour réaliser une limitation du trafic ICMPv6 (ce qui est très recommandé compte tenu de possibles engorgements ICMPv6), des règles netfilter-v6 doivent être utilisées.


    11.3.4. autre(s)

    Inconnu(s), mais probablement inutilisé(s) par IPv6.


    11.4. Les entrées relatives à IPv6 dans /proc/net/

    Dans /proc/net il y a plusieurs entrées disponibles en lecture seule. Vous ne pouvez pas utiliser ici “sysctl” afin de récupérer des informations, utiliser “cat”.


    11.4.1. if_inet6

    • Type: Une ligne par adresse comporte plusieurs valeurs

    Ici toutes les adresses IPv6 configurées sont montrées sous un format particulier. L'exemple affiche seulement l'interface loopback. Sa signification est détaillée ci-dessous (voir “net/ipv6/addrconf.c” pour en savoir plus).

    # cat /proc/net/if_inet6
    -00000000000000000000000000000001 01 80 10 80 lo
    -+------------------------------+ ++ ++ ++ ++ ++
    -|                                |  |  |  |  |
    -1                                2  3  4  5  6

    1. L'adresse IPv6 affichée grâce à 32 caractères hexadécimaux sans le séparateur ":"

    2. Numéro de périphérique Netlink (index d'interface) in hexadécimal (voir aussi “ip addr”)

    3. La longueur du préfixe en hexadécimal

    4. La valeur de la portée (voir les sources du noyau "include/net/ipv6.h" et "net/ipv6/addrconf.c" pour plus de détails)

    5. Les drapeaux de l'interface (voir “include/linux/rtnetlink.h” et “net/ipv6/addrconf.c” pour en savoir plus)

    6. Le nom du périphérique


    11.4.2. ipv6_route

    • Type: Une ligne par route comporte plusieurs valeurs

    Ici toutes les routes IPv6 configurées sont montrées dans un format particulier. L'exemple affiche seulement l'interface loopback. Sa signification est détaillée ci-dessous (voir “net/ipv6/route.c” pour en savoir plus).

    # 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. Le réseau de destination IPv6 affiché grâce à 32 caractères hexadécimaux sans le séparateur ":"

    2. La longueur du préfixe de destination IPv6 en hexadécimal

    3. Le réseau source IPv6 affiché grâce à 32 caractères hexadécimaux sans le séparateur ":"

    4. La longueur du préfixe de la source IPv6 en hexadécimal

    5. Le prochain saut IPv6 affiché grâce à 32 caractères hexadécimaux sans le séparateur ":"

    6. La distance en hexadécimal

    7. Compteur de référence

    8. Compteur d'utilisation

    9. Les drapeaux

    10. Nom du périphérique


    11.4.3. sockstat6

    • Type: Une ligne par protocole avec description et valeur

    Statistiques à propos de l'utilisation des sockets IPv6. Exemple:

    # cat /proc/net/sockstat6
    -TCP6: inuse 7 
    -UDP6: inuse 2 
    -RAW6: inuse 1 
    -FRAG6: inuse 0 memory 0

    11.4.4. tcp6

    A remplir.


    11.4.5. udp6

    A remplir.


    11.4.6. igmp6

    A remplir.


    11.4.7. raw6

    A remplir.


    11.4.10. snmp6

    • Type: Une ligne par description et valeur SNMP

    Statistiques SNMP, peuvent être récupérées par un serveur SNMP et mis en rapport à une tableau MIB grâce à un logiciel d'administration réseau.


    11.4.11. ip6_tables_names

    Tables netfilter6 disponibles


    Chapitre 12. L'interface de netlink vers le noyau

    A remplir... je n'ai en cela pas d'expérience...


    Chapitre 13. Le déboguage réseau

    13.1. Les sockets d'écoute de serveur

    13.1.1. Utiliser “netstat” pour vérifier les sockets d'écoute de serveur

    C'est toujours intéressant de savoir quelles sockets de serveur sont actives à un moment donné sur un noeud. Utiliser “netstat” est le moyen le plus court pour obtenir une telle information:

    options employées: -nlptu

    Exemple:

    # 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. Des exemples de dump provenant de tcpdump

    Suivent quelques exemples de paquets capturés, cela sera peut-être utile pour vos propres déboguages...

    ...plus d'info à venir...


    13.2.1. La découverte de routeur

    13.2.1.1. Une annonce de routeur

    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)

    Un routeur, avec pour adresse lien-local “fe80::212:34ff:fe12:3450”, émet une annonce à l'adresse multicast tous-les-noeuds-du-lien (all-node-on-link) “ff02::1”, contenant deux préfixes, “2002:0102:0304:1::/64” (d'une durée de vie de 30 s) et “3ffe:ffff:0:1::/64” (d'une durée de vie de 2592000 s), incluant sa propre adresse MAC de couche 2, “0:12:34:12:34:50”.


    13.2.1.2. Une sollicitation de routeur

    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)

    Un noeud, avec pour adresse lien-local “fe80::212:34ff:fe12:3456” et comme adresse de couche 2 “0:12:34:12:34:56”, est en quête d'un routeur présent sur le lien, en conséquence il émet cette sollicitation à l'adresse multicast tous-routeurs-présents-sur-le-lien (all-router-on-link) “ff02::2”.


    13.2.2. La découverte de voisinage

    13.2.2.1. Une sollicitation de découverte de voisinage afin de détecter une possible duplication d'adresse

    Les paquets suivants sont émis par un noeud sur la couche 2, adresse MAC “0:12:34:12:34:56”, pendant l'auto-configuration, afin de vérifier si une adresse potentielle est déjà employée ou non par un autre noeud sur le lien permettant d'émettre ces paquets, via l'adresse multicast lien-local du noeud sollicité.

    • Le noeud veut configurer son lien-local avec l'adresse “fe80::212:34ff:fe12:3456”, il est en train de vérifier s'il y a duplication

    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)

    • Le noeud veut configurer son adresse globale “2002:0102:0304:1:212:34ff:fe12:3456” (après avoir reçu l'annonce montrée plus haut), il est en train de vérifier s'il y a ou non duplication

    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)

    • Le noeud veut configurer son adresse globale “3ffe:ffff:0:1:212:34ff:fe12:3456” (après avoir reçu l'annonce montrée plus haut), il est en train de vérifier s'il y a ou non duplication

    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. Une sollicitation de découverte de voisinage à la recherche d'hôte(s) ou de passerelle(s)

    • Un noeud veut émettre des paquets à “3ffe:ffff:0:1::10” mais il n'a aucune adresse MAC de la couche 2 vers laquelle il pourrait émettre, il émet alors maintenant une sollicitation

    13:07:47.664538 2002:0102:0304:1:2e0:18ff:fe90:9205 > ff02::1:ff00:10: icmp6:
    -¬ neighbor sol: who has 3ffe:ffff:0:1::10(src lladdr: 0:e0:18:90:92:5) (len 32,
    -¬ hlim 255)

    • Ce noeud recherche maintenant “fe80::10”

    13:11:20.870070 fe80::2e0:18ff:fe90:9205 > ff02::1:ff00:10: icmp6: neighbor
    -¬ sol: who has fe80::10(src lladdr: 0:e0:18:90:92:5) (len 32, hlim 255)

    Chapitre 14. Support à la configuration persistante IPv6 dans les distributions Linux

    Certaines distributions Linux contiennent déjà un support à la configuration persistante IPv6 utilisant une configuration nouvelle ou préexistante, des fichiers de script, et des accroches dans les fichiers de script IPv4.


    14.1. Linux Red Hat et ses "clones"

    Depuis que j'ai commencé à écrire l'Howto -IPv6 & Linux , il était dans mon intention de rendre disponible une configuration convenant aux cas les plus fréquents tels que hôte simple, routeur simple, hôte à double résidence, routeur avec un second tronçon réseau, tunnel typique, tunnel 6to4, etc. De nos jours, il existe des fichiers de configuration et des scripts qui font très bien ce travail (je n'ai jamais entendu parler de vrais problèmes, mais je ne sais pas s'ils sont beaucoup utilisés). Parce que cette configuration et ces scripts augmentent régulièrement en volume, ils ont leur propre page HOWTO: initscripts-ipv6 (miroir). Parce que j'ai commencé mon expérience IPv6 sur un clone de la Linux Red Hat 5.0, mes développements concernant IPv6 sont encore essentiellement basés sur Linux Red Hat, il est par conséquent un peu logique que ces scripts soient développés sur ce type de distribution (on appelle ça une raison historique). Il est ainsi très facile d'étendre certains de ces fichiers de configuration, d'en créer de nouveaux et de créer de simples accroches d'appel à l'installation d'IPv6 à partir de l'installation d'IPV4.

    Depuis la Red Hat 7.1, une archive de mes scripts y est incluse. Cela est dû, et cela sera encore vrai à l'avenir, à l'assistance de Pekka Savola.

    La Mandrake, depuis la version 8.0, inclut aussi un paquetage initscript prêt pour IPv6, cependant un bogue mineur retient de l'employer (il manque 'inet6” à “ifconfig” avant “add”).


    14.1.1. Tester la présence des scripts de configuration IPv6

    Vous pouvez tester si votre distribution Linux contient le support pour la configuration persistante IPv6 utilisant mon jeu d'outils. Le script de la bibliothèque devrait exister:

    /etc/sysconfig/network-scripts/network-functions-ipv6

    Un test magique:

    # test -f /etc/sysconfig/network-scripts/network-functions-ipv6 && echo "Main
    -¬ IPv6 script library exists"

    La version de la bibliothèque est importante s'il vous manque certaines fonctionnalités. Vous pouvez l'obtenir en exécutant ce qui suit (ou d'une façon encore plus aisée en regardant le haut du fichier):

    # source /etc/sysconfig/network-scripts/network-functions-ipv6 &&
    -¬ getversion_ipv6_functions 
    -20011124

    Dans l'exemple montré, la version utilisée est la 20011124. Vérifiez cela par rapport à l'information la plus à jour sur la page initscripts-ipv6 (miroir) afin de voir ce qui a changé. Vous y trouverez aussi un journal des modifications.


    14.1.2. Quelques éléments pour rendre disponible IPv6 sur les actuelles RHL 7.1, 7.2, 7.3,...

    • Vérifiez si votre système a déjà le module IPv6 chargé

    # modprobe -c | grep net-pf-10
    -alias net-pf-10 off

    • Si le résultat est “off”, alors rendez disponible la mise en réseau IPv6 en éditant /etc/sysconfig/network, ajoutez la nouvelle ligne

    NETWORKING_IPV6=yes

    • Redémarrez la machine, ou simplement le réseau par

    # service network restart

    • Maintenant le module IPv6 devrait être chargé

    # modprobe -c | grep ipv6
    -alias net-pf-10 ipv6

    Si votre système est sur un lien fournissant l'annonce de routeur, la configuration sera réalisée automatiquement. Pour plus d'information sur les réglages supportées, voir /usr/share/doc/initscripts-$version/sysconfig.txt.


    14.2. Linux SuSE

    Dans les nouvelles versions, il n'y a véritablement qu'un support rudimentaire disponible, voir /etc/rc.config pour les détails.

    A cause de sa configuration très différente et de la structure de ses scripts, il est difficile (voire impossible) d'utiliser le jeu d'outils de Linux Red Hat et de ses clones avec cette distribution. -Dans les versions 8.x, SuSE va complétement modifier l'installation de sa configuration.


    14.2.2. Linux SuSE 8.0

    14.2.2.1. Configuration d'adresse IPv6

    Editez le fichier /etc/sysconfig/network/ifcfg-<nom-de-l'interface> et fixez la valeur suivante

    IP6ADDR="<Adresse-ipv6>/<préfixe>"

    14.2.2.2. Information supplémentaire

    Voir le fichier /usr/share/doc/packages/sysconfig/README


    14.2.3. Linux SuSE 8.1

    14.2.3.1. Configuration d'adresse IPv6

    Editez le fichier /etc/sysconfig/network/ifcfg-<nom-de-l'interface> et fixez la valeur suivante

    IPADDR="<Adresse-ipv6>/<préfixe>"

    14.2.3.2. Information supplémentaire

    Voir le fichier /usr/share/doc/packages/sysconfig/Network


    14.3. Linux Debian

    Les informations qui suivent sont une contribution de Stéphane Bortzmeyer <bortzmeyer chez nic point fr>

    1. Assurez-vous qu'IPv6 soit chargé; soit il est compilé dans le noyau, soit il est chargé comme module. Dans ce dernier cas, trois solutions, l'ajouter à /etc/modules, utiliser la configuration ci-dessous, ou utiliser kmod (non détaillé ici).

    2. Configurez votre interface. Par exemple, ici, nous considérons la prise en compte de eth0, avec pour adresse “3ffe:ffff:1234:5::1:1”. Editez /etc/network/interfaces :

    iface eth0 inet6 static
    -        pre-up modprobe ipv6
    -        address 3ffe:ffff:1234:5::1:1
    -        # Pour rendre complètement indisponible l'auto-configuration:
    -        # up echo 0 > /proc/sys/net/ipv6/conf/all/autoconf
    -        netmask 64
    -        # Le routeur est auto-configuré, et n'a pas d'adresse fixe.
    -        # Il est déterminé comme par magie
    -        # (/proc/sys/net/ipv6/conf/all/accept_ra). Sinon:
    -        # gateway 3ffe:ffff:1234:5::1

    Puis vous rebootez, ou alors vous faites juste

    # ifup --force eth0

    Et vous avez votre adresse statique.


    14.3.1. Plus d'information


    Chapitre 15. L'auto-configuration et la mobilité

    15.1. L'auto-configuration sans état

    Est supportée et observée sur l'adresse lien-local assignée après le montage d'une interface sur laquelle IPv6 est disponible.

    Exemple:

      # ip -6 addr show dev eth0 scope link 
    -  2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qlen1000 
    -      inet6 fe80::211:d8ff:fe6b:f0f5/64 scope link 
    -           valid_lft forever preferred_lft forever

    15.3. Le Protocole de Configuration Dynamique d'Hôte version 6 (DHCPv6)

    Après de longues discussions concernant les difficultés, le RFC 3315 / Dynamic Host Configuration Protocol for IPv6 (DHCPv6) a finalement vu le jour. Au moment de la mise à jour de ce passage (10/2005), il existe deux implémentations:


    15.4. La mobilité

    A compléter.

    Pour le moment, voir la page d'accueil sur la mobilité IPv6 sur Linux (MIPL) pour plus de détails. Plus d'information peut être trouvée ici (merci de signaler les liens brisés):


    Chapitre 16. Mettre en place le pare-feu

    Mettre en place un pare-feu IPv6 est très important, tout spécialement si IPv6 est utilisé sur un intranet avec des adresses IPv6 globales. Car, à la différence des réseaux IPv4 où les hôtes internes courants sont protégés par l'usage d'adresses IPv4 privées comme défini par le RFC 1918 / Address Allocation for Private Internets ou l'adressage IP privée automatique (Automatic Private IP Addressing, ou APIPA) recherche Google "Microsoft + APIPA", en IPv6, les adresses globales sont normalement utilisées, et quelqu'un possédant une connectivité IPv6 peut atteindre tous les noeuds propres à un intranet disposant d'IPv6.


    16.1. Mettre en place un pare-feu grâce à netfilter

    La mise en place d'un pare-feu IPv6 est nativement supportée par les noyaux dont la version est supérieure à 2.4. Avec les anciennes versions inférieures à 2.2, vous pouvez seulement filtrer IPv6-in-IPv4 par le protocole 41.

    Attention: il n'y a aucune garantie que les règles décrites ou les exemples fournis puissent protéger votre système!

    Faites un audit de votre jeu de règles après son installation, voir l'audit de sécurité sur IPv6 pour en savoir plus.

    Notez aussi que le projet USAGI finalise actuellement son travail sur la traque de connexion pour IPv6! Cela rendra la création de jeu de règles plus simple et plus sûre à l'avenir!


    16.2. Préparation

    16.2.1. Récupérer les sources

    Récupérez les dernières sources du noyau: http://www.kernel.org/

    Récupérez le dernier paquetage d'iptables:


    16.2.2. Extraire les sources

    Déplacez-vous dans le répertoire des sources:

    # cd /chemin/vers/les/sources 

    Décompactez et renommez les sources du noyau

    # tar z|jxf kernel-version.tar.gz|bz2 
    -# mv linux linux-version-iptables-version+IPv6 

    Décompactez les sources d'iptables

    # tar z|jxf iptables-version.tar.gz|bz2 

    16.2.3. Appliquer les derniers patchs relatifs à iptables/IPv6 aux sources du noyau

    Déplacez-vous dans le répertoire iptables

    # cd iptables-version 

    Appliquez les patchs en attente

    # make pending-patches KERNEL_DIR=/chemin/vers/les/sources/linux-version-iptables-version+IPv6/ 

    Appliquez les patchs additionnels relatifs à IPv6 (pas encore inclus dans le noyau vanille)

    # make patch-o-matic KERNEL_DIR=/path/to/src/linux-version-iptables-version/ 

    Répondez par l'affirmative aux options suivantes (iptables-1.2.2)

    • ah-esp.patch

    • masq-dynaddr.patch (nécessaire seulement sur les systèmes ayant une adresse IP dynamique à la connexion au WAN, comme pour PPP ou PPPoE)

    • ipv6-agr.patch.ipv6

    • ipv6-ports.patch.ipv6

    • LOG.patch.ipv6

    • REJECT.patch.ipv6

    Vérifier la présence des extensions IPv6

    # make print-extensions 
    -Extensions found: IPv6:owner IPv6:limit IPv6:mac IPv6:multiport

    16.2.4. Configurer, construire et installer un nouveau noyau

    Déplacez-vous dans les sources du noyau

    # cd /chemin/vers/les/sources/linux-version-iptables-version/ 

    Editez Makefile

    - EXTRAVERSION = 
    -+ EXTRAVERSION = -iptables-version+IPv6-try 

    Lancez configure, avec IPv6 de disponible

                Code maturity level options 
    -                  Prompt for development and/or incomplete code/drivers : yes 
    -            Networking options 
    -                  Network packet filtering: yes 
    -                  The IPv6 protocol: module 
    -                       IPv6: Netfilter Configuration 
    -                             IP6 tables support: module 
    -                             All new options like following: 
    -                                   limit match support: module 
    -                                   MAC address match support: module 
    -                                   Multiple port match support: module 
    -                                   Owner match support: module 
    -                                   netfilter MARK match support: module 
    -                                   Aggregated address check: module 
    -                                   Packet filtering: module 
    -                                        REJECT target support: module 
    -                                        LOG target support: module 
    -                                   Packet mangling: module 
    -                                   MARK target support: module 

    Configurez aussi tout ce qui concerne votre système

    Compilez et installez: voir ici même la section noyau et autres HOWTO


    16.2.5. Reconstruire et installer les binaires d'iptables

    Assurez-vous que l'arborescence des sources du noyau existe aussi dans /usr/src/linux/

    Renommez l'ancien répertoire

    # mv /usr/src/linux /usr/src/linux.old 

    Créez un nouveau lien symbolique

    # ln -s /chemin/vers/src/linux-version-iptables-version /usr/src/linux 

    Reconstruisez le SRPM

    # rpm --rebuild /chemin/vers/SRPM/iptables-version-release.src.rpm 

    Installez les nouveaux paquetages iptables (iptables + iptables-ipv6)

    • Sur les systèmes RH 7.1, normalement, une ancienne version est installée, en conséquence utiliser "freshen"

    # rpm -Fhv /chemin/vers/RPMS/cpu/iptables*-version-release.cpu.rpm 

    • Si elle n'était pas installée, utiliser "install"

    # rpm -ihv /chemin/vers/RPMS/cpu/iptables*-version-release.cpu.rpm 

    • Sur les systèmes RH 6.2, normalement, aucun noyau 2.4.x n'est installé, conséquemment les pré-requis ne correspondent pas. Utiliser "--nodeps" pour l'installer

    # rpm -ihv --nodeps /chemin/vers/RPMS/cpu/iptables*-version-release.cpu.rpm 

    Il sera peut-être nécessaire de créer un lien symbolique vers le lieu où les bibliothèques iptables sont

    # ln -s /lib/iptables/ /usr/lib/iptables 

    16.3. Utilisation

    16.3.1. Vérifier le support

    Chargez le module, s'il est compilé

    # modprobe ip6_tables 

    Vérifiez si le noyau courant prend en charge iptables

    # [ ! -f /proc/net/ip6_tables_names ] && echo "Current kernel doesn't support
    -¬ 'ip6tables' firewalling (IPv6)!" 

    16.3.2. Apprendre à utiliser ip6tables

    16.3.2.1. Lister toutes les entrées netfilter IPv6

    • de façon abrégée

    # ip6tables -L 

    • de façon détaillée

    # ip6tables -n -v --line-numbers -L 

    16.3.2.2. Lister un filtre spécifique

    # ip6tables -n -v --line-numbers -L INPUT 

    16.3.2.3. Insérer une règle de journal au filtre entrant, avec des options

    # ip6tables --table filter --append INPUT  -j LOG --log-prefix "INPUT:"
    -¬ --log-level 7 

    16.3.2.4. Insérer une règle de destruction (drop rule) au filtre entrant

    # ip6tables --table filter --append INPUT  -j DROP 

    16.3.2.5. Détruire une règle par son numéro

    # ip6tables --table filter --delete INPUT 1 

    16.3.2.6. Autoriser ICMPv6

    Avec les plus anciens noyaux (noyau non patché 2.4.5 et iptables-1.2.2), aucun type ne peut être spécifié

    • Accepter le trafic ICMPv6 entrant dans les tunnels

    # ip6tables -A INPUT -i sit+ -p icmpv6 -j ACCEPT 

    • Autoriser le trafic ICMPv6 sortant des tunnels

    # ip6tables -A OUTPUT -o sit+ -p icmpv6 -j ACCEPT 

    Les nouveaux noyaux permettent de spécifier les types ICMPv6:

    # ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j ACCEPT

    16.3.2.7. La limitation du débit

    Il peut arriver (l'auteur l'a déjà vu) qu'un engorgement ICMPv6 se produise, c'est pourquoi vous devriez utiliser la limitation de débit, puisqu'elle est disponible, et ce, au moins pour le jeu de règles ICMPv6. De plus, des règles de journalisation devraient aussi être mises en place pour garder trace d'attaques DoS, grâce à syslog et au stockage des fichiers de log. Un exemple de limitation du débit ICMPv6 ressemble à ceci:

    # ip6tables -A INPUT --protocol icmpv6 --icmpv6-type echo-request
    -¬ -j ACCEPT --match limit --limit 30/minute

    16.3.2.8. Permettre le trafic entrant SSH

    Ici l'exemple montré est un jeu de règles permettant les connexions entrantes SSH par une adresse IPv6 donnée

    • Autoriser le trafic entrant SSH provenant de 3ffe:ffff:100::1/128

    # ip6tables -A INPUT -i sit+ -p tcp -s 3ffe:ffff:100::1/128 --sport 512:65535
    -¬ --dport 22 -j ACCEPT 

    • Autoriser les paquets réponse (pour le moment, la traque du trafic IPv6 n'est pas au coeur de l'implémentation de netfilter)

    # ip6tables -A OUTPUT -o sit+ -p tcp -d 3ffe:ffff:100::1/128 --dport 512:65535
    -¬ --sport 22 ! --syn j ACCEPT 

    16.3.2.9. Rendre disponible le trafic tunnelé IPv6-in-IPv4

    Pour accepter les paquets tunnelés IPv6-in-IPv4, vous devez insérer des règles dans votre installation de pare-feu IPv4 relatives à de tels paquets, pour exemple

    • Accepter le trafic entrant IPv6-in-IPv4 sur l'interface ppp0

    # iptables -A INPUT -i ppp0 -p ipv6 -j ACCEPT 

    • Permettre au trafic IPv6-in-IPv4 de sortir par l'interface ppp0

    # iptables -A OUTPUT -o ppp0 -p ipv6 -j ACCEPT 

    Si vous avez seulement un tunnel statique, vous pouvez aussi spécifier l'adresse IPv4, comme ici

    • Accepter le trafic entrant IPv6-in-IPv4 sur l'interface ppp0 et provenant de l'extrémité du tunnel 1.2.3.4

    # iptables -A INPUT -i ppp0 -p ipv6 -s 1.2.3.4 -j ACCEPT 

    • Autoriser le trafic sortant IPv6-in-IPv4 vers l'interface ppp0 pour l'extrémité du tunnel 1.2.3.4

    # iptables -A OUTPUT -o ppp0 -p ipv6 -d 1.2.3.4 -j ACCEPT 

    16.3.2.10. Protection contre les requêtes de connexion entrante TCP

    TRÈS RECOMMANDÉ! Pour des questions de sécurité, vous devriez vraiment insérer une règle qui bloque les requêtes de connexion TCP entrante. Ajouter l'option "-i", si d'autres noms d'interface sont utilisés!

    • Bloquer les requêtes de connexion entrante TCP vers cet hôte

    # ip6tables -I INPUT -i sit+ -p tcp --syn -j DROP 

    • Bloquer les requêtes de connexion entrante TCP allant vers les hôtes placés derrière ce routeur

    # ip6tables -I FORWARD -i sit+ -p tcp --syn -j DROP 

    Peut-être ces règles doivent-elles être placées sous d'autres, mais ça, c'est votre travail. La meilleure façon de faire est de créer un script et d'exécuter les règles d'une manière spécifique.


    16.3.2.11. Protection contre les requêtes de connexion entrante UDP

    TRÈS RECOMMANDÉ AUSSI! Comme il a été dit dans la section concernant la mise en place d'un pare-feu, il est possible de contrôler les ports des sessions sortantes UDP/TCP. Si tous vos systèmes IPv6 locaux utilisent les ports locaux, par exemple de 32768 à 60999, vous êtes aussi capables de filtrer les connexions UDP (jusqu'à ce que la traque des connexions fonctionnent) comme suit:

    • Bloquer les paquets entrants UDP qui ne peuvent être des réponses de requêtes sortantes de cet hôte

    # ip6tables -I INPUT -i sit+ -p udp ! --dport 32768:60999 -j DROP 

    • Bloquer les paquets entrants UDP qui ne peuvent être des réponses de requêtes d'hôtes placés derrière ce routeur, et transitant à travers lui

    # ip6tables -I FORWARD -i sit+ -p udp ! --dport 32768:60999 -j DROP 

    16.3.3. Un exemple plus conséquent

    Les lignes qui suivent montrent en exemple une installation plus sophistiquée. Bonne création de jeux de règles netfilter6...

    # ip6tables -n -v -L 
    -Chain INPUT (policy DROP 0 packets, 0 bytes) 
    - pkts bytes target     prot opt in     out     source               destination
    -    0     0 extIN      all      sit+   *       ::/0                 ::/0 
    -    4   384 intIN      all      eth0   *       ::/0                 ::/0 
    -    0     0 ACCEPT     all      *      *       ::1/128              ::1/128 
    -    0     0 ACCEPT     all      lo     *       ::/0                 ::/0 
    -    0     0 LOG        all      *      *       ::/0                 ::/0       
    -¬        LOG flags 0 level 7 prefix `INPUT-default:' 
    -    0     0 DROP       all      *      *       ::/0                 ::/0 
    - 
    -Chain FORWARD (policy DROP 0 packets, 0 bytes) 
    - pkts bytes target     prot opt in     out     source               destination
    -¬ 
    -    0     0 int2ext    all      eth0   sit+    ::/0                 ::/0 
    -    0     0 ext2int    all      sit+   eth0    ::/0                 ::/0 
    -    0     0 LOG        all      *      *       ::/0                 ::/0       
    -¬        LOG flags 0 level 7 prefix `FORWARD-default:' 
    -    0     0 DROP       all      *      *       ::/0                 ::/0 
    - 
    -Chain OUTPUT (policy DROP 0 packets, 0 bytes) 
    - pkts bytes target     prot opt in     out     source               destination
    -¬ 
    -    0     0 extOUT     all      *      sit+    ::/0                 ::/0 
    -    4   384 intOUT     all      *      eth0    ::/0                 ::/0 
    -    0     0 ACCEPT     all      *      *       ::1/128              ::1/128 
    -    0     0 ACCEPT     all      *      lo      ::/0                 ::/0 
    -    0     0 LOG        all      *      *       ::/0                 ::/0       
    -¬        LOG flags 0 level 7 prefix `OUTPUT-default:' 
    -    0     0 DROP       all      *      *       ::/0                 ::/0 
    - 
    -Chain ext2int (1 references) 
    - pkts bytes target     prot opt in     out     source               destination
    -¬ 
    -    0     0 ACCEPT     icmpv6    *      *       ::/0                 ::/0 
    -    0     0 ACCEPT     tcp      *      *       ::/0                 ::/0       
    -¬        tcp spts:1:65535 dpts:1024:65535 flags:!0x16/0x02 
    -    0     0 LOG        all      *      *       ::/0                 ::/0       
    -¬        LOG flags 0 level 7 prefix `ext2int-default:' 
    -    0     0 DROP       tcp      *      *       ::/0                 ::/0 
    -    0     0 DROP       udp      *      *       ::/0                 ::/0 
    -    0     0 DROP       all      *      *       ::/0                 ::/0 
    - 
    -Chain extIN (1 references) 
    - pkts bytes target     prot opt in     out     source               destination
    -¬ 
    -    0     0 ACCEPT     tcp      *      *       3ffe:400:100::1/128  ::/0       
    -¬        tcp spts:512:65535 dpt:22 
    -    0     0 ACCEPT     tcp      *      *       3ffe:400:100::2/128  ::/0       
    -¬        tcp spts:512:65535 dpt:22 
    -    0     0 ACCEPT     icmpv6    *      *       ::/0                 ::/0 
    -    0     0 ACCEPT     tcp      *      *       ::/0                 ::/0       
    -¬        tcp spts:1:65535 dpts:1024:65535 flags:!0x16/0x02 
    -    0     0 ACCEPT     udp      *      *       ::/0                 ::/0       
    -¬        udp spts:1:65535 dpts:1024:65535 
    -    0     0 LOG        all      *      *       ::/0                 ::/0       
    -¬        limit: avg 5/min burst 5 LOG flags 0 level 7 prefix `extIN-default:' 
    -    0     0 DROP       all      *      *       ::/0                 ::/0 
    - 
    -Chain extOUT (1 references) 
    - pkts bytes target     prot opt in     out     source               destination
    -¬ 
    -    0     0 ACCEPT     tcp      *      *       ::/0                
    -¬ 3ffe:ffff:100::1/128tcp spt:22 dpts:512:65535 flags:!0x16/0x02 
    -    0     0 ACCEPT     tcp      *      *       ::/0                
    -¬ 3ffe:ffff:100::2/128tcp spt:22 dpts:512:65535 flags:!0x16/0x02 
    -    0     0 ACCEPT     icmpv6    *      *       ::/0                 ::/0 
    -    0     0 ACCEPT     tcp      *      *       ::/0                 ::/0       
    -¬        tcp spts:1024:65535 dpts:1:65535 
    -    0     0 ACCEPT     udp      *      *       ::/0                 ::/0       
    -¬        udp spts:1024:65535 dpts:1:65535 
    -    0     0 LOG        all      *      *       ::/0                 ::/0       
    -¬        LOG flags 0 level 7 prefix `extOUT-default:' 
    -    0     0 DROP       all      *      *       ::/0                 ::/0 
    - 
    -Chain int2ext (1 references) 
    - pkts bytes target     prot opt in     out     source               destination
    -¬ 
    -    0     0 ACCEPT     icmpv6    *      *       ::/0                 ::/0 
    -    0     0 ACCEPT     tcp      *      *       ::/0                 ::/0       
    -¬        tcp spts:1024:65535 dpts:1:65535 
    -    0     0 LOG        all      *      *       ::/0                 ::/0       
    -¬        LOG flags 0 level 7 prefix `int2ext:' 
    -    0     0 DROP       all      *      *       ::/0                 ::/0 
    -    0     0 LOG        all      *      *       ::/0                 ::/0       
    -¬        LOG flags 0 level 7 prefix `int2ext-default:' 
    -    0     0 DROP       tcp      *      *       ::/0                 ::/0 
    -    0     0 DROP       udp      *      *       ::/0                 ::/0 
    -    0     0 DROP       all      *      *       ::/0                 ::/0 
    - 
    -Chain intIN (1 references) 
    - pkts bytes target     prot opt in     out     source               destination
    -¬ 
    -    0     0 ACCEPT     all      *      *       ::/0                
    -¬ fe80::/ffc0:: 
    -    4   384 ACCEPT     all      *      *       ::/0                 ff02::/16 
    - 
    -Chain intOUT (1 references) 
    - pkts bytes target     prot opt in     out     source               destination
    -¬ 
    -    0     0 ACCEPT     all      *      *       ::/0                
    -¬ fe80::/ffc0:: 
    -    4   384 ACCEPT     all      *      *       ::/0                 ff02::/16 
    -    0     0 LOG        all      *      *       ::/0                 ::/0       
    -¬        LOG flags 0 level 7 prefix `intOUT-default:' 
    -    0     0 DROP       all      *      *       ::/0                 ::/0 

    Chapitre 17. La sécurité

    17.1. La sécurité d'un noeud

    Il est très recommandé d'appliquer tous les patchs disponibles, de rendre indisponibles tous les services inutiles, d'associer les services nécessaires aux adresses IPv4/IPv6 et d'installer un pare-feu local.

    A remplir plus avant...


    17.2. Les limitations d'accès

    De nombreux services utilisent la bibliothèque tcp_wrapper pour contrôler l'accès. Plus bas est décrite l'utilisation de tcp_wrapper.

    A remplir plus avant...


    17.3. L'audit de sécurité IPv6

    Actuellement, il n'existe pas d'outil véritablement adéquate aux questions de sécurité IPv6 et capable de vérifier un système monté sur le réseau. Ni Nessus ni aucun autre scanner de sécurité provenant du commerce n'est capable, autant que je sache, de scanner les adresses IPv6.


    17.3.1. Question d'ordre légal

    ATTENTION: Prenez bien garde d'uniquement scanner vos propres systèmes, ou alors seulement après avoir reçu une autorisation écrite, sinon des problèmes d'ordre juridique risquent de vous arriver. -VERIFIER A DEUX FOIS les adresses IPv6 avant de lancer un scan.


    17.3.2. Audit de sécurité par l'emploi de netcat disposant d'IPv6

    Avec netcat disposant d'IPv6 (voir IPv6+Linux-status-apps/security-auditing pour en savoir plus), vous pouvez lancer un scan de ports via un script qui balaiera un intervalle de ports, captera des bannières, etc. Un exemple d'utilisation:

    # nc6 ::1 daytime
    -13 JUL 2002 11:22:22 CEST

    17.3.3. Audit de sécurité par l'emploi de nmap disposant d'IPv6

    NMap, l'un des meilleurs scanners de ports à travers le monde, supporte IPv6 depuis la version 3.10ALPHA1. Un exemple d'utilisation:

    # nmap -6 -sT ::1
    -Starting nmap V. 3.10ALPHA3 ( www.insecure.org/nmap/ ) 
    -Interesting ports on localhost6 (::1): 
    -(The 1600 ports scanned but not shown below are in state: closed) 
    -Port       State       Service 
    -22/tcp     open        ssh 
    -53/tcp     open        domain 
    -515/tcp    open        printer 
    -2401/tcp   open        cvspserver
    -Nmap run completed -- 1 IP address (1 host up) scanned in 0.525 seconds

    17.3.4. Audit de sécurité par l'emploi de strobe disposant d'IPv6

    Strobe est (comparé à NMap) un scanner de ports pour les petits budgets, mais il y a un patch disponible pour le rendre prêt pour IPv6 (voir IPv6+Linux-status-apps/security-auditing pour plus d'information). Un exemple d'utilisation:

    # ./strobe ::1 strobe 1.05 (c) 1995-1999 Julian Assange <proff@iq.org>.
    -::1 2401 unassigned unknown
    -::1 22 ssh Secure Shell - RSA encrypted rsh 
    -::1 515 printer spooler (lpd)
    -::1 6010 unassigned unknown 
    -::1 53 domain Domain Name Server

    Note: strobe n'est plus véritablement en développement, le numéro de version montré n'est pas le bon.


    17.3.5. Le résultat de l'audit

    Si le résultat de l'audit ne correspond pas à votre politique de sécurité IPv6, mettez en place le pare-feu IPv6 pour combler les trous de sécurité, par exemple en utilisant netfilter6 (voir Mettre en place un pare-feu grâce à Netfilter6 pour plus de détails).

    Info: une information plus détaillée concernant la sécurité IPv6 peut être trouvée ici:


    Chapitre 18. L'encryptage et l'authentification

    A la différence d'IPv4, l'encryptage et l'authentification sont des fonctionnalités que ne fournit pas IPv6 lui-même. Elles sont normalement implémentées par l'utilisation d'IPsec (qui peut également être employé par IPv4).


    18.1. Les modes d'emploi de l'encryptage et de l'authentification

    Deux modes d'encryptage et d'authentification sont possibles:


    18.1.1. Le mode transport

    Le mode transport est un mode de connexion réellement de bout-en-bout. Ici, seule la charge utile (généralement ICMP, TCP ou UDP) est encryptée avec son en-tête particulier, tandis que l'en-tête IP n'est pas encrypté (mais couramment inclus dans l'authentification).

    Utilisant AES-128 pour l'encryptage et SHA1 pour l'authentification, ce mode diminue la MTU de 42 octets.


    18.1.2. Le mode tunnel

    Le mode tunnel peut être utilisé soit dans un mode de connexion de bout-en-bout soit dans un mode de connexion de passerelle-à-passerelle. Ici, le paquet IP complet est encrypté et prend un nouvel en-tête IP, le tout constituant un nouveau paquet (ce mécanisme étant connu sous le nom d'encapsulation).

    Cependant, à cause de l'indépendance de l'encryptage et de l'authentification à l'égard du protocole d'échange de clés, il existe actuellement des problèmes d'interopérabilité. Ce mode diminue actuellement de 40 octets par rapport au mode transport. Utiliser AES-128 pour l'encryptage et SHA1 pour l'authentification diminue donc au total de 82 octets la MTU courante.


    18.2. Son support dans le noyau (ESP et AH)

    18.2.1. Son support dans les noyaux Linux vanille 2.4.x

    Manquant à ce jour jusqu'au noyau 2.4.28 vanille, le problème était de garder les sources du noyau Linux éloignées des questions de contrôles légaux d'import/export concernant le code d'encryptage en général. C'est une des raisons pour lesquelles le projet FreeS/WAN (IPsec pour IPv4 seulement) n'était pas compris dans les sources vanille. Un rétro-portage à partir de 2.6.x sera peut-être réalisé un jour.


    18.2.2. Son support dans les noyaux Linux vanille 2.6.x

    Les versions actuelles (2.6.9 et supérieures, au moment de la rédaction) supportent nativement IPsec pour IPv4 et IPv6.

    Le projet USAGI a aidé à l'implémentation.


    18.3. Echange automatique de clés (IKE)

    IPsec requière un échange de clés afin de partager un secret. Ceci est essentiellement réalisé de façon automatisée par les démons IKE. Ils prennent également en charge l'authentification des entités en présence, soit par un secret commun (nommé “secret pré-partagé”), soit par clés RSA (qui peuvent provenir de certificats X.509).

    Actuellement, deux démons IKE sont disponibles pour Linux, lesquels différent totalement par la configuration et l'emploi.

    Je préfère “pluto” à l'implémentation *S/WAN à cause de son installation plus simple et à son unique fichier de configuration.


    18.3.1. Le démon IKE “racoon”

    Le démon IKE “racoon” provient du projet KAME et a été porté sur Linux. Les distributions contemporaines de Linux comportent ce démon dans le paquetage “ipsec-tools”. Deux exécutables sont requis pour bien installer IPsec. Jetez aussi un oeil à Linux Advanced Routing & Traffic Control HOWTO / IPSEC.


    18.3.1.1. Manipulation de la base de données IPsec SA/SP grâce à l'outil “setkey”

    Le rôle important de “setkey” est de définir la politique de sécurité (SP, security policy) pour le noyau.

    Fichier: /etc/racoon/setkey.sh

    • Exemple d'une connexion encryptée de boute-en-bout en mode transport

    #!/sbin/setkey -f
    -flush;
    -spdflush;
    -spdadd 2001:db8:1:1::1 2001:db8:2:2::2 any -P out ipsec esp/transport//require;
    -spdadd 2001:db8:2:2::2 2001:db8:1:1::1 any -P in  ipsec esp/transport//require;

    • Exemple d'une connexion encryptée de boute-en-bout en mode tunnel

    #!/sbin/setkey -f
    -flush;
    -spdflush;
    -spdadd 2001:db8:1:1::1 2001:db8:2:2::2 any -P out ipsec
    -¬ esp/tunnel/2001:db8:1:1::1-2001:db8:2:2::2/require;
    -spdadd 2001:db8:2:2::2 2001:db8:1:1::1 any -P in  ipsec
    -¬ esp/tunnel/2001:db8:2:2::2-2001:db8:1:1::1/require;

    Pour l'autre machine, vous avez juste à échanger “in” et “out”.


    18.3.1.2. La configuration du démon IKE “racoon”

    Pour sa bonne exécution, “racoon” requière d'être configuré. Ceci inclus les réglages relatifs à la politique de sécurité, qui doit être précédemment mise en place grâce à “setkey”.

    Fichier: /etc/racoon/racoon.conf

    # Fichier de configuration du démon IKE racoon.
    -# Voir 'man racoon.conf' pour une description du format et des entrées.
    -path include "/etc/racoon";
    -path pre_shared_key "/etc/racoon/psk.txt";
    -
    -listen
    -            {
    -                    isakmp 2001:db8:1:1::1;
    -            }
    -            
    -remote 2001:db8:2:2::2
    -{
    -        exchange_mode main;
    -        lifetime time 24 hour;
    -        proposal
    -        {
    -                encryption_algorithm 3des;
    -                hash_algorithm md5;
    -                authentication_method pre_shared_key;
    -                dh_group 2;
    -        }
    -}
    -
    -# De passerelle-à-passerelle
    -sainfo address 2001:db8:1:1::1 any address 2001:db8:2:2::2 any
    -{
    -        lifetime time 1 hour;
    -        encryption_algorithm 3des;
    -        authentication_algorithm hmac_md5;
    -        compression_algorithm deflate;
    -}
    -
    -sainfo address 2001:db8:2:2::2 any address 2001:db8:1:1::1 any
    -{
    -        lifetime time 1 hour;
    -        encryption_algorithm 3des;
    -        authentication_algorithm hmac_md5;
    -        compression_algorithm deflate;
    -}

    Fixez aussi un secret pré-partagé:

    Fichier: /etc/racoon/psk.txt

    # Fichier des clés pré-partagées utilisées pour l'authentification IKE
    -# Le format est: 'identificateur' 'clé'
    -
    -2001:db8:2:2::2 absolumentsecret

    18.3.1.3. Démarrer IPsec grâce au démon IKE “racoon”

    Il faut pour le moins que le démon soit démarré. Au premier démarrage, utiliser les modes déboguage et premier plan (debug and foreground). L'exemple suivant montre une négociation IKE réussie dans ses phases 1 (ISAKMP-SA, Internet Security Association Key Management Security Association) and 2 (IPsec-SA, IPsec Security Association):

    # racoon -F -v -f /etc/racoon/racoon.conf
    -Foreground mode.
    -2005-01-01 20:30:15: INFO: @(#)ipsec-tools 0.3.3 (http://ipsec-tools.sourceforge.net)
    -2005-01-01 20:30:15: INFO: @(#)This product linked
    -¬ OpenSSL 0.9.7a Feb 19 2003 (http://www.openssl.org/)
    -2005-01-01 20:30:15: INFO: 2001:db8:1:1::1[500] used as isakmp port (fd=7)
    -2005-01-01 20:31:06: INFO: IPsec-SA request for 2001:db8:2:2::2
    -¬ queued due to no phase1 found.
    -2005-01-01 20:31:06: INFO: initiate new phase 1 negotiation:
    -¬ 2001:db8:1:1::1[500]<=>2001:db8:2:2::2[500]
    -2005-01-01 20:31:06: INFO: begin Identity Protection mode.
    -2005-01-01 20:31:09: INFO: ISAKMP-SA established
    -¬ 2001:db8:1:1::1[500]-2001:db8:2:2::2[500] spi:da3d3693289c9698:ac039a402b2db401
    -2005-01-01 20:31:09: INFO: initiate new phase 2 negotiation:
    -¬ 2001:6f8:900:94::2[0]<=>2001:db8:2:2::2[0]
    -2005-01-01 20:31:10: INFO: IPsec-SA established:
    -¬ ESP/Tunnel 2001:db8:2:2::2->2001:db8:1:1::1 spi=253935531(0xf22bfab)
    -2005-01-01 20:31:10: INFO: IPsec-SA established:
    -¬ ESP/Tunnel 2001:db8:1:1::1->2001:db8:2:2::2 spi=175002564(0xa6e53c4)

    Chaque direction a sa propre IPsec-SA (comme définie dans le standard IPsec). Avec “tcpdump” à l'écoute de la bonne interface, vous devriez voir comme résultat d'un ping IPv6:

    20:35:55.305707 2001:db8:1:1::1 > 2001:db8:2:2::2: ESP(spi=0x0a6e53c4,seq=0x3)
    -20:35:55.537522 2001:db8:2:2::2 > 2001:db8:1:1::1: ESP(spi=0x0f22bfab,seq=0x3)

    Comme prévu, les SPI (Security Parameter Index) négociés sont utilisés ici.

    Et en utilisant “setkey”, les paramètres actifs courants:

    # setkey -D
    -2001:db8:1:1::1 2001:db8:2:2::2
    -        esp mode=tunnel spi=175002564(0x0a6e53c4) reqid=0(0x00000000)
    -        E: 3des-cbc  bd26bc45 aea0d249 ef9c6b89 7056080f 5d9fa49c 924e2edd
    -        A: hmac-md5  60c2c505 517dd8b7 c9609128 a5efc2db
    -        seq=0x00000000 replay=4 flags=0x00000000 state=mature
    -        created: Jan  1 20:31:10 2005   current: Jan  1 20:40:47 2005
    -        diff: 577(s)    hard: 3600(s)   soft: 2880(s)
    -        last: Jan  1 20:35:05 2005      hard: 0(s)      soft: 0(s)
    -        current: 540(bytes)     hard: 0(bytes)  soft: 0(bytes)
    -        allocated: 3    hard: 0 soft: 0
    -        sadb_seq=1 pid=22358 refcnt=0
    -2001:db8:2:2::2 2001:db8:1:1::1
    -        esp mode=tunnel spi=253935531(0x0f22bfab) reqid=0(0x00000000)
    -        E: 3des-cbc  c1ddba65 83debd62 3f6683c1 20e747ac 933d203f 4777a7ce
    -        A: hmac-md5  3f957db9 9adddc8c 44e5739d 3f53ca0e
    -        seq=0x00000000 replay=4 flags=0x00000000 state=mature
    -        created: Jan  1 20:31:10 2005   current: Jan  1 20:40:47 2005
    -        diff: 577(s)    hard: 3600(s)   soft: 2880(s)
    -        last: Jan  1 20:35:05 2005      hard: 0(s)      soft: 0(s)
    -        current: 312(bytes)     hard: 0(bytes)  soft: 0(bytes)
    -        allocated: 3    hard: 0 soft: 0
    -        sadb_seq=0 pid=22358 refcnt=0

    18.3.2. Le démon IKE “pluto”

    Le démon IKE “pluto” est inclus dans les distributions des projets *S/WAN, qui ont pour origine FreeS/WAN. Le développement du projet FreeS/WAN a malheureusement été stoppé en 2004. A cause de la lenteur du développement dans le passé, deux projets en découlèrent: strongSwan et Openswan. Aujourd'hui, des paquetages d'installation sont disponibles, au moins pour Openswan (inclus dans Fedora Core 3).

    Une différence importante par rapport à “racoon”, un seul et unique fichier de configuration est requis. Il y a bien sûr un script d'initialisation qui automatise le lancement au démarrage de la machine.


    18.3.2.1. La configuration du démon IKE “pluto”

    La configuration est très similaire à celle nécessaire pour IPv4, à part une importante et nécessaire option.

    Fichier: /etc/ipsec.conf

    # /etc/ipsec.conf - Fichier de configuration d'IPsec Openswan
    -#
    -# Manuel:     ipsec.conf.5
    -version 2.0     # conforme à la seconde version de la spécification d'ipsec.conf
    -
    -# configuration de base
    -config setup
    -        # Contrôles du déboguage / journalisation :  "none" pour (presque) rien, "all" pour beaucoup.
    -        # klipsdebug=none
    -        # plutodebug="control parsing"
    -
    -#Rendre indisponible l'encryptage opportuniste
    -include /etc/ipsec.d/examples/no_oe.conf
    -
    -conn ipv6-p1-p2
    -        connaddrfamily=ipv6       # Important pour IPv6!
    -        left=2001:db8:1:1::1
    -        right=2001:db8:2:2::2
    -        authby=secret
    -        esp=aes128-sha1
    -        ike=aes128-sha-modp1024
    -        type=transport
    -        #type=tunnel
    -        compress=no
    -        #compress=yes
    -        auto=add
    -        #auto=start

    N'oubliez pas ici également de définir un secret pré-partagé.

    Fichier: /etc/ipsec.secrets

    2001:db8:1:1::1 2001:db8:2:2::2 : PSK      "absolumentsecret"

    18.3.2.2. Démarrer IPsec grâce au démon IKE “pluto”

    Si l'installation d'Openswan s'est achevée avec succès, un script d'initialisation doit exister permettant le démarrage d'IPsec, lancez simplement (sur chaque machine) par:

    # /etc/rc.d/init.d/ipsec start

    Ensuite, démarrez une connexion sur l'une des machines. Si vous pouvez voir la ligne “IPsec SA established”, c'est que tout fonctionne parfaitement.

    # ipsec auto --up ipv6-peer1-peer2
    -104 "ipv6-p1-p2" #1: STATE_MAIN_I1: initiate
    -106 "ipv6-p1-p2" #1: STATE_MAIN_I2: sent MI2, expecting MR2
    -108 "ipv6-p1-p2" #1: STATE_MAIN_I3: sent MI3, expecting MR3
    -004 "ipv6-p1-p2" #1: STATE_MAIN_I4: ISAKMP SA established
    -112 "ipv6-p1-p2" #2: STATE_QUICK_I1: initiate
    -004 "ipv6-p1-p2" #2: STATE_QUICK_I2: sent QI2,
    -¬ IPsec SA established {ESP=>0xa98b7710 <0xa51e1f22}

    Parce que *S/WAN et setkey/racoon sont basés sur la même implémentation d'IPsec dans les noyaux 2.6.x,“setkey” peut être utilisé pour afficher les paramètres actifs courants:

    # setkey -D
    -2001:db8:1:1::1 2001:db8:2:2::2
    -        esp mode=transport spi=2844489488(0xa98b7710) reqid=16385(0x00004001)
    -        E: aes-cbc  082ee274 2744bae5 7451da37 1162b483
    -        A: hmac-sha1  b7803753 757417da 477b1c1a 64070455 ab79082c
    -        seq=0x00000000 replay=64 flags=0x00000000 state=mature
    -        created: Jan  1 21:16:32 2005   current: Jan  1 21:22:20 2005
    -        diff: 348(s)    hard: 0(s)      soft: 0(s)
    -        last:                           hard: 0(s)      soft: 0(s)
    -        current: 0(bytes)       hard: 0(bytes)  soft: 0(bytes)
    -        allocated: 0    hard: 0 soft: 0
    -        sadb_seq=1 pid=23825 refcnt=0
    -2001:db8:2:2::2 2001:db8:1:1::1
    -        esp mode=transport spi=2770214690(0xa51e1f22) reqid=16385(0x00004001)
    -        E: aes-cbc  6f59cc30 8d856056 65e07b76 552cac18
    -        A: hmac-sha1  c7c7d82b abfca8b1 5440021f e0c3b335 975b508b
    -        seq=0x00000000 replay=64 flags=0x00000000 state=mature
    -        created: Jan  1 21:16:31 2005   current: Jan  1 21:22:20 2005
    -        diff: 349(s)    hard: 0(s)      soft: 0(s)
    -        last:                           hard: 0(s)      soft: 0(s)
    -        current: 0(bytes)       hard: 0(bytes)  soft: 0(bytes)
    -        allocated: 0    hard: 0 soft: 0
    -        sadb_seq=0 pid=23825 refcnt=0

    18.4. Informations complémentaires

    Pour les noyaux Linux 2.6.x, vous pouvez également obtenir la politique et l'état d'IPsec en utilisant “ip”:

    # ip xfrm policy
    -...
    -
    -# ip xfrm state
    -...

    Chapitre 19. La Qualité de Service (QoS)

    IPv6 supporte QoS par l'utilisation des labels de flux et des classes de trafic. Ceci peut être contrôlé en utilisant “tc” (compris dans le paquetage “iproute”).

    Information complémentaire:

    A remplir plus avant...


    Chapitre 20. Eléments d'installation des démons prêts pour IPv6

    Ici quelques éléments d'installation des démons prêts pour IPv6 sont exposés.


    20.1. Le Démon de Nom Internet Berkeley (named)

    IPv6 est supporté depuis la version 9. Utilisez toujours la dernière version disponible. Il faut au moins utiliser la version 9, les versions plus anciennes peuvent contenir des trous de sécurité exploitables à distance.


    20.1.1. A l'écoute des adresses IPv6

    Note: à la différence d'IPv4, les versions actuelles ne permettent pas d'associer une socket de serveur à des adresses IPv6 données, par conséquent, seule l'alternative toutes ou aucune adresse(s) IPv6 est valide. Parce que cela peut poser un problème de sécurité, consultez aussi plus bas la section concernant la liste de contrôle d'accès (ACL)!


    20.1.1.1. Rendre disponible l'écoute sur adresse IPv6

    Pour rendre disponible à named l'écoute IPv6, les options suivantes demandent à être modifiées

    options {
    -        # certainement que d'autres options sont aussi ici
    -        listen-on-v6 { any; };
    -};

    Il doit en résulter après redémarrage

    # netstat -lnptu |grep "named\W*$" 
    -tcp 0 0 :::53         :::*      LISTEN 1234/named
    -¬ # incoming TCP requests
    -udp 0 0 1.2.3.4:53    0.0.0.0:*        1234/named
    -¬ # incoming UDP requests to IPv4 1.2.3.4
    -udp 0 0 127.0.0.1:53  0.0.0.0:*        1234/named
    -¬ # incoming UDP requests to IPv4 localhost
    -udp 0 0 0.0.0.0:32868 0.0.0.0:*        1234/named
    -¬ # dynamic chosen port for outgoing queries
    -udp 0 0 :::53         :::*             1234/named
    -¬ # incoming UDP request to any IPv6

    Un test simple ressemble à

    # dig localhost @::1

    et doit vous afficher un résultat.


    20.1.1.2. Rendre indisponible l'écoute sur adresse IPv6

    Pour rendre indisponible l'écoute IPv6, l'option suivante demande à être modifiée

    options {
    -        # certainement que d'autres options sont aussi ici
    -        listen-on-v6 { none; };
    -};

    20.1.2. Les Listes de Contrôle d'Accès IPv6 (ACL)

    Les ACL IPv6 sont disponibles et devraient être utilisées dès que possible. Un exemple ressemble à ce qui suit:

    acl internal-net { 
    -        127.0.0.1; 
    -        1.2.3.0/24;  
    -        3ffe:ffff:100::/56; 
    -        ::1/128; 
    -        ::ffff:1.2.3.4/128; 
    -};
    -acl ns-internal-net { 
    -        1.2.3.4;  
    -        1.2.3.5;  
    -        3ffe:ffff:100::4/128; 
    -        3ffe:ffff:100::5/128; 
    -};

    Ces ACL peuvent être utilisées par exemple pour les requêtes des clients ou pour le transfert de zones aux serveurs de noms de domaine secondaires. Ceci prévient aussi contre l'utilisation de votre serveur cache de noms de domaine à partir de l'extérieur grâce à IPv6.

    options {
    -        # certainement que d'autres options sont aussi ici
    -        listen-on-v6 { none; };
    -        allow-query { internal-net; }; 
    -        allow-transfer { ns-internal-net; }; 
    -};

    Il est aussi possible de positionner les options allow-query et allow-transfer pour la plupart des définitions par fichier de zone.


    20.1.3. Emettre des requêtes avec une adresse IPv6 dédiée

    Cette option n'est pas requise, mais peut être nécessaire:

    query-source-v6 address <adresseipv6|*> port <port|*>;

    20.1.4. Adresses IPv6 dédiées définies par zone

    Il est aussi possible de définir des adresses IPv6 par zone.


    20.1.4.1. Adresse de la source de transfert

    L'adresse de la source de transfert est utilisée pour aller chercher les zones transférées:

    transfer-source-v6 <adresseipv6|*> [port port];

    20.1.4.2. Adresse de la source à notifier

    L'adresse de la source à notifier est utilisée pour les messages de notification:

    notify-source-v6 <adresseipv6|*> [port port];

    20.1.5. Des exemples de fichiers de zone DNS IPv6

    Des informations peuvent être aussi trouvées dans cet article concernant l'information d'installation d'un DNS IPv6. Le constructeur de zone inverse IPv6 pour BIND 8/9 (outil web) peut aussi être d'une aide précieuse.


    20.1.6. Servir des données DNS relatives à IPv6

    Pour IPv6, de nouveaux types et la zone racine nécessaire à la recherche inversée sont définis:

    Peut-être complété plus tard, pour le moment, jetez un coup d'oeil aux RFC fournis et

    • AAAA et IP6.INT inversé: l'installation d'un DNS IPv6

    • A6, DNAME (DORÉNAVANT DÉPRECIÉ!) et IP6.ARPA inversé: jetez un coup d'oeil aux chapitres 4 et 6 du manuel de référence de l'administrateur BIND 9 (ARM), distributé avec le paquetage bind, ou bien récupérez-le : BIND version 9 ARM (PDF)

    Parce que IP6.INT est déprécié (mais encore en usage), un serveur DNS qui supportera l'information IPv6 aura à servir tous les types de zones inversées.


    20.1.6.1. La meilleure pratique courante

    Parce qu'il y a encore quelques problèmes qui existent lorsque les nouveaux formats sont utilisés, la meilleure pratique courante est:

    Support de recherche:

    • AAAA

    La recherche inversée supporte:

    • Le format réduit inversé (reverse nibble format) pour la zone ip6.int (POUR LA COMPATIBILITÉ ASCENDANTE)

    • Le format réduit inversé (reverse nibble format) pour la zone ip6.arpa (RECOMMANDÉ)


    20.1.7. Vérifier la connectivité IPv6

    Pour vérifier si BIND est à l'écoute sur une socket IPv6 et sert des données, voir les exemples suivants.


    20.1.7.1. Connecté via IPv6, mais refusé par les ACL

    En spécifiant un serveur pour les requêtes, une connexion IPv6 peut être forcée:

    $ host -t aaaa www.6bone.net 3ffe:ffff:200:f101::1 
    -Using domain server: 
    -Name: 3ffe:ffff:200:f101::1 
    -Address: 3ffe:ffff:200:f101::1#53 
    -Aliases:
    -
    -Host www.6bone.net. not found: 5(REFUSED)

    L'entrée relative dans le journal ressemble à ce qui suit:

    Jan 3 12:43:32 gate named[12347]: client
    -¬ 3ffe:ffff:200:f101:212:34ff:fe12:3456#32770: 
    - query denied

    Si vous observez de telles entrées dans le journal, vérifiez si les requêtes provenant de ce client doivent être autorisées, pour revoir, si nécessaire, votre configuration ACL.


    20.1.7.2. Une connexion IPv6 réussie

    Une connexion IPv6 réussie ressemble à ce qui suit:

    $ host -t aaaa www.6bone.net 3ffe:ffff:200:f101::1 
    -Using domain server: 
    -Name: 3ffe:ffff:200:f101::1 
    -Address: 3ffe:ffff:200:f101::1#53 
    -Aliases:
    -
    -www.6bone.net. is an alias for 6bone.net. 
    -6bone.net. has AAAA address 3ffe:b00:c18:1::10

    20.2. Le super démon Internet (xinetd)

    IPv6 est supporté, approximativement, depuis la version 1.8.9 de xinetd. Utilisez toujours la version disponible la plus récente. Seules les versions antérieures à la version 2.3.3 doivent être utilisées, les versions plus anciennes peuvent contenir des trous de sécurité exploitables à distance.

    Certaines distributions Linux contiennent un paquetage supplémentaire pour xinetd prêt pour IPv6, d'autres démarrent xinetd prêt pour IPv6 si la variable suivante est positionnée: NETWORKING_IPV6="yes", chose normalement réalisée par /etc/sysconfig/network (valide uniquement pour la distribution Red Hat et ses dérivées). Dans les nouvelles livraisons des distributions, un binaire supporte à la fois IPv4 et IPv6.

    Si vous rendez disponible un service fourni avec xinetd, comme par exemple daytime, en modifiant la configuration dans le fichier /etc/xinetd.d/daytime comme suit

    # diff -u /etc/xinetd.d/daytime.orig /etc/xinetd.d/daytime 
    ---- /etc/xinetd.d/daytime.orig Sun Dec 16 19:00:14 2001 
    -+++ /etc/xinetd.d/daytime Sun Dec 16 19:00:22 2001 
    -@@ -10,5 +10,5 @@ 
    -        protocol = tcp 
    -        user = root 
    -        wait = no 
    --       disable = yes 
    -+       disable = no 
    - }

    vous devriez recevoir, après le redémarrage de xinetd, une réponse positive telle que:

    # netstat -lnptu -A inet6 |grep "xinetd*" 
    -tcp 0 0 ::ffff:192.168.1.1:993  :::*  LISTEN  12345/xinetd-ipv6 
    -tcp 0 0 :::13                   :::*  LISTEN  12345/xinetd-ipv6 <- service
    -¬ daytime/tcp
    -tcp 0 0 ::ffff:192.168.1.1:143  :::*  LISTEN  12345/xinetd-ipv6

    L'exemple montre aussi que xinetd écoute pour IMAP et IMAP-SSL sur IPv4 seulement.

    Note: un serveur xinetd uniquement IPv4 ne démarrera pas sur un noeud disposant d'IPv6 et inversement, un serveur xinetd IPv6 ne démarrera pas sur un noeud uniquement IPv4. Ce problème est réputé réglé dans les versions postérieures, au moins à partir de la version 2.3.11.


    20.3. Le serveur web Apache2 (httpd2)

    Le serveur web Apache supporte nativement IPv6 depuis la version 2.0.14. Des patchs disponibles pour l'ancienne série 1.3.x ne sont pas courants et ne devraient pas être employés dans un contexte public, mais ils sont disponibles sur ce serveur ftp, KAME / Misc.


    20.3.1. A l'écoute sur les adresses IPv6

    Note: Les hôtes virtuels sur adresses IPv6 ne fonctionnent pas pour les versions inférieures à la 2.0.28 (un patch est disponible pour la 2.0.28). Mais en tout premier lieu, récupérez toujours la dernière version disponible, parce que les premières versions ont des problèmes de sécurité.


    20.3.1.1. Un hôte virtuel écoute sur une adresse IPv6 uniquement

    Listen [3ffe:ffff:100::1]:80
    -<VirtualHost [3ffe:ffff:100::1]:80>
    -        ServerName ipv6seul.votredomaine.votretld
    -        # certainement des lignes de configuration en plus...
    -</VirtualHost>

    20.3.1.2. Un hôte virtuel écoute sur une adresse IPv6 et sur une adresse IPv4

    Listen [3ffe:ffff:100::2]:80 
    -Listen 1.2.3.4:80
    -<VirtualHost [3ffe:ffff:100::2]:80 1.2.3.4:80>
    -        ServerName ipv6etipv4.votredomaine.votretld
    -        # certainement des lignes de configuration en plus...
    -</VirtualHost>

    Il devrait en résulter après redémarrage

    # netstat -lnptu | grep "httpd2\W*$" 
    -tcp 0 0 1.2.3.4:80          0.0.0.0:* LISTEN 12345/httpd2 
    -tcp 0 0 3ffe:ffff:100::1:80 :::*      LISTEN 12345/httpd2 
    -tcp 0 0 3ffe:ffff:100::2:80 :::*      LISTEN 12345/httpd2

    Pour de simples tests, utiliser l'exemple telnet déjà montré.


    20.3.1.3. Note additionnelle

    • D'une part, Apache2 supporte une méthode appelée “sendfile”, accélérant la fourniture des données. D'autre part, certains pilotes de NIC supportent la vérification différée des sommes de contrôle (offline checksumming). Dans certains cas, cela peut conduire à des problèmes de connexion et invalider les sommes de contrôle TCP. Il faut alors rendre indisponible “sendfile”, ou bien en recompilant par l'utilisation de l'option de configure “--without-sendfile”, ou bien en utilisant la directive du fichier de configuration "EnableSendfile off".


    20.4. Le Démon d'Annonce de Routeur (radvd)

    Le Démon d'Annonce de Routeur est très utile sur un LAN, à partir du moment où les clients doivent être auto-configurés. Le démon lui-même doit tourner sur la passerelle par défaut IPv6 Linux (il n'est pas requis qu'elle soit aussi la passerelle IPv4, aussi prenez garde à qui émet des annonces de routeur sur votre LAN).

    Vous avez à spécifier certaines informations et drapeaux qui doivent être compris dans l'annonce. Les plus employés sont

    • Le préfixe (nécessaire)

    • La durée de vie du préfixe

    • La fréquence des envois d'annonce (optionnelle)

    Après une configuration convenable, le démon émet des annonces au travers des interfaces spécifiées, dans l'espoir que les clients les reçoivent et auto-configurent comme par magie leurs adresses avec le préfixe reçu et le routeur par défaut.


    20.4.1. Configurer radvd

    20.4.1.1. Configuration simple

    Le fichier de configuration de radvd est généralement /etc/radvd.conf. Un exemple simple ressemble à ce qui suit:

    interface eth0 { 
    -        AdvSendAdvert on;
    -        MinRtrAdvInterval 3; 
    -        MaxRtrAdvInterval 10;
    -        prefix 3ffe:ffff:0100:f101::/64 { 
    -                AdvOnLink on; 
    -                AdvAutonomous on; 
    -                AdvRouterAddr on; 
    -        };
    -};

    Ce qui a pour résultat côté client

    # /sbin/ip -6 addr show eth0 
    -3: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 100 
    -    inet6 3ffe:ffff:100:f101:2e0:12ff:fe34:1234/64 scope global dynamic 
    -       valid_lft 2591992sec preferred_lft 604792sec 
    -    inet6 fe80::2e0:12ff:fe34:1234/10 scope link

    Parce qu'aucune limite de vie n'a été définie, une très grande valeur est utilisée.


    20.4.1.2. Configuration spéciale 6to4

    Les versions à partir de la 0.6.2pl3 supportent la (ré)génération des préfixes dépendant d'une adresse IPv4 propre à une interface spécifique. Ceci peut être utilisé afin de distribuer les annonces dans un LAN après que le tunnelage 6to4 ait changé. Surtout employé derrière un routeur de connexion dynamique à la demande (dial-on-demand). Avec l'assurance d'un temps de vie très bref pour un tel préfixe (après chaque reconnexion, dial-up, un autre préfixe est valide), la durée de vie est configurée aux valeurs minimales:

    interface eth0 { 
    -        AdvSendAdvert on;
    -        MinRtrAdvInterval 3; 
    -        MaxRtrAdvInterval 10;
    -        prefix 0:0:0:f101::/64 { 
    -                AdvOnLink off; 
    -                AdvAutonomous on; 
    -                AdvRouterAddr on; 
    -                Base6to4Interface ppp0;
    -                AdvPreferredLifetime 20; 
    -                AdvValidLifetime 30;
    -        };
    -};

    Il en résulte pour le client situé à l'intérieur (en considérant que ppp0 a actuellement 1.2.3.4 comme adresse IPv4 locale):

    # /sbin/ip -6 addr show eth0 
    -3: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 100 
    -   inet6 2002:0102:0304:f101:2e0:12ff:fe34:1234/64 scope global dynamic 
    -      valid_lft 22sec preferred_lft 12sec
    -   inet6 fe80::2e0:12ff:fe34:1234/10 scope link

    Parce qu'un bref temps de vie a été défini, un tel préfixe sera rapidement jeté si aucune annonce s'y rapportant n'est reçue.

    Note additionnelle: si vous n'utilisez pas de support spécifique 6to4 dans les scripts d'initialisation, vous avez à mettre en place une route spécifique sur l'interface interne du routeur, sinon vous aurez des problèmes de routage retour. En ce qui concerne l'exemple ci-après:

    # /sbin/ip -6 route add 2002:0102:0304:f101::/64 dev eth0 metric 1

    Cette route a besoin d'être remplacée chaque fois que le préfixe change, ce qui est le cas à chaque fois qu'une nouvelle adresse IPv4 est assignée à une interface numérotée automatiquement (dial-up interface).


    20.4.2. Le déboguage

    Un programme appelé “radvdump” peut vous aider à observer les annonces émises ou reçues. Simple à utiliser:

    # radvdump 
    -Router advertisement from fe80::280:c8ff:feb9:cef9 (hoplimit 255) 
    -        AdvCurHopLimit: 64 
    -        AdvManagedFlag: off 
    -        AdvOtherConfigFlag: off 
    -        AdvHomeAgentFlag: off 
    -        AdvReachableTime: 0 
    -        AdvRetransTimer: 0 
    -        Prefix 2002:0102:0304:f101::/64 
    -                AdvValidLifetime: 30 
    -                AdvPreferredLifetime: 20 
    -                AdvOnLink: off 
    -                AdvAutonomous: on 
    -                AdvRouterAddr: on 
    -        Prefix 3ffe:ffff:100:f101::/64 
    -                AdvValidLifetime: 2592000 
    -                AdvPreferredLifetime: 604800 
    -                AdvOnLink: on 
    -                AdvAutonomous: on 
    -                AdvRouterAddr: on 
    -        AdvSourceLLAddress: 00 80 12 34 56 78

    Cette sortie vous montre que chaque paquetage d'annonce se présente dans un format lisible. Vous devriez voir à nouveau ici vos valeurs configurées, sinon, ce n'est peut-être pas votre radvd qui émet l'annonce... vérifiez s'il n'y a pas un autre routeur sur le lien (pour traquer ce routeur, prenez l'adresse LL, AdvSourceLLAddress, qui est son adresse MAC).


    20.5. Le serveur de Configuration Dynamique d'Hôte v6 (dhcp6s)

    DHCPv6 peut être utilisé pour réaliser des configurations avec état. Le démon par lui-même n'a pas nécessairement à tourner sur la passerelle routeur Linux par défaut.

    Vous pouvez spécifier plus d'information qu'avec radvd. Il est plus similaire à un serveur DHCP IPv4.

    Après une configuration correcte, le démon réagit lors de la réception de paquets multicast envoyés par un client à l'adresse ff02::16.


    20.5.1. La configuration du serveur DHCPv6 (dhcp6s)

    20.5.1.1. Une configuration simple

    Le fichier de configuration de dhcp6s est normalement /etc/dhcp6s.conf. Un exemple simple ressemble à ce qui suit:

    interface eth0 {
    -        server-preference 255;
    -        renew-time 60;
    -        rebind-time 90;
    -        prefer-life-time 130;
    -        valid-life-time 200;
    -        allow rapid-commit;
    -        option dns_servers 2001:db8:0:f101::1 sub.domain.example;
    -        link AAA {
    -                range 2001:db8:0:f101::1000 to 2001:db8:0:f101::ffff/64;
    -                prefix 2001:db8:0:f101::/64;
    -        };
    -};

    20.5.2. La configuration du client DHCPv6 (dhcp6c)

    20.5.2.1. Une configuration simple

    Le fichier de configuration de dhcp6c est normalement /etc/dhcp6c.conf. Un exemple simple ressemble à ce qui suit:

    interface eth0 {
    -        send rapid-commit;
    -        request domain-name-servers;
    -};

    20.5.3. Usage

    20.5.3.1. dhcpv6_server

    Démarrage du serveur,

    # service dhcp6s start

    20.5.3.2. dhcpv6_client

    Démarrage du client en premier plan,

    # dhcp6c -f eth0

    20.5.4. Déboguage

    20.5.4.1. dhcpv6_server

    Le serveur a un drapeau pour passer en premier plan et deux pour le déboguage (tout deux devraient être utilisés pour le déboguage). Voici un exemple:

    # dhcp6c -d -D -f eth0

    20.5.4.2. dhcpv6_client

    Le client a un drapeau pour passer en premier plan et deux pour le déboguage. Voici un exemple:

       # dhcp6c -d -f eth0
    -   Oct/03/2005 17:18:16 dhcpv6 doesn't support hardware type 776
    -   Oct/03/2005 17:18:16 doesn't support sit0 address family 0
    -   Oct/03/2005 17:18:16 netlink_recv_rtgenmsg error
    -   Oct/03/2005 17:18:16 netlink_recv_rtgenmsg error
    -   Oct/03/2005 17:18:17 status code for this address is: success
    -   Oct/03/2005 17:18:17 status code: success
    -   Oct/03/2005 17:18:17 netlink_recv_rtgenmsg error
    -   Oct/03/2005 17:18:17 netlink_recv_rtgenmsg error
    -   Oct/03/2005 17:18:17 assigned address 2001:db8:0:f101::1002 prefix len isnot    in any RAs prefix length using 64 bit instead
    -   Oct/03/2005 17:18:17 renew time 60, rebind time 9

    Notez que les messages d'erreur n'ont aucun impact.


    20.6. tcp_wrapper

    tcp_wrapper est une bibliothèque qui peut vous aider à protéger vos services contre les usages abusifs.


    20.6.1. Les capacités de filtrage

    Vous pouvez utiliser tcp_wrapper pour

    • Le filtrage à partir des adresses source (IPv4 ou IPv6)

    • Le filtrage des utilisateurs (réclame un démon ident en état de fonctionnement sur le client)


    20.6.2. Les programmes utilisant tcp_wrapper

    Les suivants sont connus:

    • Chaque service appelé par xinetd (si xinetd est compilé en utilisant la bibliothèque tcp_wrapper)

    • sshd (si compilé en utilisant tcp_wrapper)


    20.6.3. Utilisation

    tcp_wrapper est contrôlé par deux fichiers nommés /etc/hosts.allow et /etc/hosts.deny. Pour plus d'information voir

    $ man hosts.allow

    20.6.3.1. Exemple de fichier /etc/hosts.allow

    Dans ce fichier, chaque service qui doit être positivement filtré (i.e., dont les connexions doivent être acceptées) a besoin d'une ligne.

    sshd:           1.2.3. [3ffe:ffff:100:200::]/64
    -daytime-stream: 1.2.3. [3ffe:ffff:100:200::]/64

    Note: ils existent des implémentations cassées qui utilisent la mauvaise description réseau IPv6 suivante: [3ffe:ffff:100:200::/64].

    Heureusement, de telles versions seront rapidement corrigées.


    20.6.3.2. Exemple de fichier /etc/hosts.deny

    Ce fichier contient toutes les entrées de filtre négative et devrait dénier l'accès à tout le reste en utilisant

    ALL: ALL

    Si ce noeud est très sensible, vous pouvez remplacer la ligne stantard ci-dessus par celle-ci, mais cela peut être cause d'attaque DoS (charge de serveur de courrier et répertoire spool), si trop de connexions sont réalisées en un temps très bref. Peut-être un observateur de journaux (a logwatch) serait-il meilleur dans de tels cas.

    ALL: ALL: spawn (echo "Attempt from %h %a to %d at `date`" 
    - | tee -a /var/log/tcp.deny.log | mail root@localhost)

    20.6.4. La journalisation

    Selon l'entrée du fichier de configuration du démon syslog /etc/syslog.conf, la journalisation de tcp_wrapper se fait normalement dans /var/log/secure.


    20.6.4.1. Connexion refusée

    Une connexion refusée via IPv4 au service daytime, couvert par xinetd, produit des lignes telles que celles de l'exemple suivant

    Jan 2 20:40:44 gate xinetd-ipv6[12346]: FAIL: daytime-stream libwrap
    -¬ from=::ffff:1.2.3.4
    -Jan 2 20:32:06 gate xinetd-ipv6[12346]: FAIL: daytime-stream libwrap 
    - from=3ffe:ffff:100:200::212:34ff:fe12:3456

    Une connexion refusée via IPv4 à sshd en double écoute produit des lignes telles que celles de l'exemple suivant

    Jan 2 20:24:17 gate sshd[12345]: refused connect from ::ffff:1.2.3.4
    -¬ (::ffff:1.2.3.4)
    -Jan 2 20:39:33 gate sshd[12345]: refused connect 
    - from 3ffe:ffff:100:200::212:34ff:fe12:3456
    -¬ (3ffe:ffff:100:200::212:34ff:fe12:3456)

    20.6.4.2. Connexion autorisée

    Une connexion autorisée via IPv4 vers le service daytime, couvert par xinetd, produit des lignes telles que celles de l'exemple suivant

    Jan 2 20:37:50 gate xinetd-ipv6[12346]: START: daytime-stream pid=0
    -¬ from=::ffff:1.2.3.4 
    -Jan 2 20:37:56 gate xinetd-ipv6[12346]: START: daytime-stream pid=0 
    - from=3ffe:ffff:100:200::212:34ff:fe12:3456

    Une connexion autorisée via IPv4 vers sshd en double écoute produit des lignes telles que celles de l'exemple suivant

    Jan 2 20:43:10 gate sshd[21975]: Accepted password for user from ::ffff:1.2.3.4
    -¬ port 33381 ssh2
    -Jan 2 20:42:19 gate sshd[12345]: Accepted password for user 
    - from 3ffe:ffff:100:200::212:34ff:fe12:3456 port 33380 ssh2

    20.7. vsftpd

    20.7.1. A l'écoute des adresses IPv6

    Editer le fichier de configuration, couramment /etc/vsftpd/vsftpd.conf, et ajuster l'option “listen”

    listen_ipv6=yes

    C'est tout.


    20.8. proftpd

    20.8.1. A l'écoute des adresses IPv6

    Editer le fichier de configuration, couramment /etc/proftpd.conf, mais prenez garde, tout n'est pas tout à fait logique dans la mise en place des hôtes virtuels

    <VirtualHost 192.0.2.1>
    -        ...
    -        Bind 2001:0DB8::1
    -        ...
    -</VirtualHost>

    C'est tout.


    20.9. Autres démons

    De nos jours c'est généralement simple, cherchez une ligne de commande d'option ou bien une valeur de configuration pour rendre disponible l'écoute IPv6. Cherchez dans la page du manuel du démon ou dans les FAQ concernées. Il peut arriver que vous ne puissiez lier le démon qu'à une adresse IPv6 “any” (::) et pas à une adresse IPv6 précise, par manque de support (ça dépend de la façon dont le développeur à implémenter...).


    Chapitre 21. Programmer (en utilisant l'API)

    Je n'ai aucune expérience de la programmation IPv6, peut-être que ce chapitre sera rempli par d'autres, ou déplacé vers un autre HOWTO

    Plus d'information peut être trouvée ici:

    Porting applications to IPv6 HowTo by Eva M. Castro


    Chapitre 22. L'interopérabilité

    Il y a à travers le monde quelques projets qui vérifient l'interopérabilité des différents systèmes d'exploitation vis-à-vis de l'implémentation des fonctionnalités d'IPv6: Voici un URL:

    D'autres arriveront prochainement...


    Chapitre 23. Plus d'information et d'URL

    23.1. Livres en édition papier, articles, revues en ligne (mélangés)

    23.1.1. Livres édités (en anglais)

    23.1.1.1. Cisco

    • Cisco Self-Study: Implementing IPv6 Networks (IPV6), par Regis Desmeules. Cisco Press; ISBN 1587050862; 500 pages; 1ère édition (11 avril 11 2003). -Note: cet ouvrage sera publié le 11 avril 2003.

    • Configuring IPv6 with Cisco IOS, par Sam Brown, Sam Browne, Neal Chen, Robbie Harrell, Edgar, Jr. Parenti (Editeur), Eric Knipp (Editeur), Paul Fong (Editeur) 362 pages; Syngress Media Inc; ISBN 1928994849; (12 juillet 2002).


    23.1.1.2. Généraux


    23.1.2. Livres édités (en allemand)

    • Technik der IP-Netze (TCP/IP incl. IPv6) bei Amazon.de -Anatol Badach, Erwin Hoffmann -Carl Hanser Verlag München, Wien, 2001 ISBN 3-446-21501-8 -Kap. 6: Protokoll IPv6 S.205-242 -Kap. 7: Plug&Play-Unterstützung bei IPv6 S.243-276 -Kap. 8: Migration zum IPv6-Einsatz S.277-294 -Kap. 9.3.4: RIP für das Protokoll IPv6 (RIPng) S.349-351 -Kap. 9.4.6: OSPF für IPv6 S.384-385 -Kommentar: tw. nicht ganz up-to-date bzw. nicht ganz fehlerfreie Abbildungen -Homepage des Buches und Tabelle mit Fixes

    • Internet-Sicherheit (Browser, Firewalls und Verschlüsselung) bei Amazon.de -Kai Fuhrberg -2. akt. Auflage 2000 Carl Hanser Verlag München, Wien, ISBN 3-446-21333-3 -Kap.2.3.1.4. IPv6 S.18-22 -Kurz angerissen werden: RFC 1825 - Security Association Konzept RFC1826 - IP authentication Header RFC 1827 - IP Encapsulation Security Payload

    • IPv6. Das neue Internet- Protokoll. Technik, Anwendung, Migration bei Amazon -Hans Peter Dittler -2. akt. und erweiterte Auflage 2002 dpunkt.verlag, ISBN 3-89864-149-X

    • Das neue Internetprotokoll IPv6 bei Amazon -Herbert Wiese -2002 Carl Hanser Verlag, ISBN 3446216855


    23.1.3. Articles, livres électroniques, revues en ligne (mélangés)


    23.1.4. Publications scientifiques (résumés, bibliographies, ressources en ligne)


    23.1.5. Autres

    Voir l'URL suivant pour en savoir plus: SWITCH Pilote IPv6 Pilot / Références


    23.2. Conférences, rencontres, sommets

    23.2.1. 2002

    Quelque chose manque? Les suggestions sont les bienvenues!


    23.2.2. 2003

    Les suggestions sont les bienvenues!


    23.3. L'information en ligne

    23.3.1. Rejoindre le backbone IPv6

    A remplir plus avant et plus tard... Les suggestions sont les bienvenues!


    23.3.1.3. Les fournisseurs de tunnel (tunnel brokers)

    Note: une liste de fournisseurs de tunnel peut être trouvée plus bas dans l'information concernant les fournisseurs de tunnel.

    Voir aussi ici pour plus d'information et d'URL: ipv6-net.org.


    23.3.2. Les dernières nouvelles

    A remplir plus avant et plus tard... Les suggestions sont les bienvenues!


    23.3.3. Les références aux protocoles

    23.3.3.1. Les appels à commentaires (RFC) relatifs à IPv6

    La publication de la liste des RFC relatifs à IPv6 outrepasse la portée de ce document, mais les URL fournis vous guiderons vers de telles listes:


    23.3.3.3. Autres


    23.3.4. Plus d'information

    A remplir plus avant et plus tard... les suggestions sont les bienvenues!

    DeepSpace6 / plus de liens intéressants


    23.3.4.3. Général

    Quelque chose manque? Les suggestions sont les bienvenues!


    23.3.4.4. Etudes de marché


    23.3.4.5. Les brevets


    23.3.5. Par pays

    23.3.5.1. Europe

    • www.ist-ipv6.org: IST IPv6 Cluster, recherche européenne IPv6 et développement de projets

    • Euro6IX: Backbone européenne d'interconnexion Internet IPv6


    23.3.5.2. Autriche


    23.3.5.5. Allemagne


    23.3.5.9. Corée

    • ETRI: Institut de Recherche en Electronique et Télécommunications

    • Forum IPv6 koréen: Projet de déploiement coréen d'IPv6


    23.3.5.10. Mexique

    • Mexique IPv6 (versions espagnole et anglaise): Accueil du projet IPv6 de l'Université nationale autonome du Mexique (UNAM)


    23.3.5.11. Pays-Bas

    • SURFnet: Backbone IPv6 SURFnet

    • STACK, STACK (IPv6): Association d'étudiants en informatique de l' Université de Technologie, Pays-Bas

    • IPng.nl: collaboration entre WiseGuys et Intouch


    23.3.5.13. Russie


    23.3.5.14. Suisse

    • SWITCH: L'éducation suisse & les recherches réseau


    23.3.5.15. Royaume-Uni


    23.3.6. Par systèmes d'exploitation


    23.3.6.2. Cisco IOS

    • Cisco IOS IPv6

    • IPv6 pour IOS de Cisco, Fichier 2 sur 3: août 2002 -- Table des Matières: IPv6 pour IOS de Cisco; documentation des caractéristiques de configuration; Rendre disponible et configurer le routage IPv6; l'adressage IPv6; Rendre globalement le fonctionnement IPv6 disponible.

    • Manuel de la mise en réseau Internet Cisco, chapitre IPv6


    23.3.6.3. Compaq


    23.3.6.5. IBM


    23.3.7. La sécurité IPv6


    23.3.8. Les listes d'applications


    23.3.8.1. Les outils d'analyse

    • Ethereal - Ethereal est un analyseur libre de protocoles réseaux pour Unix et Windows

    • Radcom RC100-WL - Téléchargez l'analyseur de protocoles RC100-WL Radcom version 3.20


    23.3.8.2. Les produits IPv6


    23.4. L'infrastructure IPv6


    23.4.2. Points d'interconnexion Internet

    Une autre liste de points d'interconnexion IPv6 peut être trouvée ici: Site web des points d'interconnexion IPv6 ou Statut IPv6 des IXP en Europe


    23.4.2.1. Estonie

    • TIX (point d'interconnexion Internet Tallinn avec support IPv6)


    23.4.2.2. Europe

    • Euro6IX, Backbone des points d'interconnexion Internet IPv6 européen


    23.4.2.3. France


    23.4.2.4. Allemagne

    • INXS: Munich et Hamburg (câble & sans fil)


    23.4.2.5. Japon

    • NSPIXP-6: point d'interconnexion Internet basé sur IPv6, à Tokyo

    • JPIX, Tokyo


    23.4.2.7. Les Pays-Bas

    • AMS-IX: Point d'interconnexion à Amsterdam


    23.4.2.9. USA

    • 6TAP: Chicago. Supporte le peering à travers tout le globe

    • NY6IX: Point d'interconnexion IPv6 basé à New York

    • PAIX: Palo Alto


    23.4.3. Les fournisseurs de tunnel (tunnelbrokers)

    Voir aussi: http://www.deepspace6.net/docs/tunnelbrokers.html


    23.4.3.8. Japon


    23.4.3.10. Les Pays-Bas

    • XS26 - "Accès à Six" - avec des POP (Points De Présence) en République slovaque, en République Tchèque, aux Pays-Bas, en Allemagne et en Hongrie.

    • IPng Pays-Bas - Intouch, SurfNet, AMS-IX, UUNet, Cistron, RIPE NCC et AT&T sont connectés au AMS-IX. Il est possible (sous certaines conditions) d'obtenir un tunnel statique.

    • Clients SURFnet


    23.4.3.11. Norvège


    23.4.3.13. Suisse


    23.4.3.14. Royaume-Uni


    23.4.3.15. USA


    23.4.4. Services nativement accessibles par IPv6

    Note: Ces services sont uniquement disponibles grâce à une connexion IPv6 valide!


    23.4.4.2. IRC Server

    • Cyconet (serveurs IRCnet Cyconet sur IPv6)


    23.4.4.4. Serveur web

    Quelque chose manque? Les suggestions sont les bienvenues!


    23.5. Les listes de diffusion

    Des listes de listes de diffusion sont disponibles:

    Les listes de diffusion essentielles sont listées dans le tableau suivant:

    Centre d'intérêtAdresse mél de la requête d'inscriptionA quoi souscrireAdresse mél de la liste de diffusionLangueaccès par WWW
    L'activité réseau du noyau Linux incluant IPv6majordomo (chez) oss.sgi.comnetdevnetdev (chez) oss.sgi.comAnglaiseArchive
    Linux et IPv6 en général (1)majordomo (chez) list.f00f.orglinux-ipv6linux-ipv6 (chez) list.f00f.org (modérée)Anglaise 
    L'implémentation Linux du protocole IPv6interface web, voir l'URL project6 (chez) ferrara.linux.itAnglaiseInfo, Subscription
    La mobilité IP(v6) sur Linuxmajordomo (chez) list.mipl.mediapoli.commiplmipl (chez) list.mipl.mediapoli.comAnglaiseInfo, Archive
    Utilisateurs Linux IPv6 avec l'extension USAGIusagi-users-ctl (chez) linux-ipv6.org usagi-users (chez) linux-ipv6.orgAnglaiseInfo / Recherche, Archive
    IPv6 sur Debian Linuxinterface web, voir l'URL debian-ipv6 (chez) lists.debian.orgAnglaiseInfo/Souscription/Archive
    IPv6/6bone en Allemagnemajordomo (chez) atlan.uni-muenster.deipv6ipv6 (chez) uni-muenster.deGerman/EnglishInfo, Archive
    6bonemajordomo (chez) isi.edu6bone6bone (chez) isi.eduAnglaiseInfo, Archive
    Discussions IPv6majordomo (chez) sunroof.eng.sun.comipngipng (chez) sunroof.eng.sun.comAnglaiseInfo, Archive, Mirroir des archives
    Les utilisateurs d'IPv6 en généralmajordomo (chez) ipv6.orgusersusers (chez) ipv6.orgAnglaiseInfo, Archive
    Recherche des bogues des applications Internet (2)bugtraq-subscribe (chez) securityfocus.com bugtraq (chez) securityfocus.com (moderated)AnglaiseInfo, Archive
    IPv6 en généralinterface web, voir l'URL ipv6 (chez) ipng.nlAnglaiseInfo/Subscription, Archive
    majordomo (chez) mfa.eti.brmajordomo (chez) mfa.eti.bripv6ipv6 (chez) mfa.eti.brPortugaiseInfo

    (1) recommandé pour les questions d'ordre général Linux & IPv6.

    (2) très recommandé si vous êtes fournisseur d'applications serveur.

    Quelque chose manque? Les suggestions sont les bienvenues!

    Les listes de diffusion et newsgroups suivants sont disponibles via le web:

    • ipv6 (France) -Description: Cette liste IPv6 permet de discuter d'IPv6 en langue française. Elle s'adresse aux personnes désirant démarrer dès aujourd'hui des tests IPv6. Ce n'est en aucun cas un substitut aux listes de l'IETF. Pour de plus amples informations: http://www.urec.fr/IPng

    • Tunnelbroker Maillingliste (Allemagne)

    • ipv6 (Hongrie) -Description: ipv6 Az IPv6 protokoll listaja Konfiguracios es adminisztracios kerdesek az IPv6-al kapcsolatban. (Archivum)

    • student-ipv6 (Inde) -Description: groupe d'étudiants intéressé par IPv6

    • IPV6-CNR@LISTSERV.CNR.IT (Italie) -Description: Groupe IPv6 au CNR

    • ipv6-jp (Japon)

    • ipv6 (Japon)

    • sun-ipv6-users -Description: Merci de rapporter les problèmes/suggestions concernant l'implémentation IPng SUN Microsystems

    • IPv6-BITS -Description: Cette liste coordonnera le travail du Verebrae.

    • openbsd-ipv6

    • IPv6 -Description: Cette liste de diffusion consiste en discussions techniques au sujet des possibilités d'IPv6/IPsec WRT OpenBSD.

    • linux-bangalore-ipv6 -Description: La liste concernant le déploiement d'IPv6 du groupe d'utilisateurs Linux Bangalore

    • gab -Description: L'intention est de discuter du plan géographique d'adressage IPv6.

    • ipv6-bsd-user -Description: Cette liste de diffusion concerne l”implémentation INéRIA/IMAG d'IPv6. Elle est bilingue, Francais/Anglais. Si vous souhaitez contacter les implémenteurs, essayez ipv6-bsd-core@imag.fr

    • gated-ipv6

    • La commutation de paquets -Description: cette liste de diffusion fournit un forum de discussion au sujet de l'implémentation, de la technologie et de la théorie de la commutation de paquets et l'application à tout domaine, LAPB, X.25, SDLC, P802.1d, LLC, IP, IPv6, IPX, DECNET, APPLETALK, FR, PPP, téléphonie IP, les systèmes PBX LAN, les protocoles d'administration comme SNMP, e-mail, système de fenêtre transparent au réseau, implémentation de protocoles, vérification de protocoles, tests de conformité et outils utilisés dans la maintenance ou dans le développement des systèmes de commutation de paquets.

    • mumbaiinternetgroup -Description: Ce forum discutera des problèmes et des développements actuels concernant Internet dans la région de l'Asie pacifique. Cela couvrira IPv4, IPv6, le DNS multilingue, les numéros de systèmes autonomes, la gouvernance Internet et bien plus...

    • de.comm.protocols.tcp-ip -Description: Umstellung auf IPv6 -Source: Chartas der Newsgruppen in de.*

    • Groupe Google: comp.protocols.tcp-ip

    • Groupe Google: linux.debian.maint.ipv6

    • Groupe Google: microsoft.public.platformsdk.networking.ipv6

    • Groupe Google: fa.openbsd.ipv6


    23.6. Outils en ligne

    23.6.1. Outils de test


    23.7. Pratique, séminaires

    Quelque chose manque? Les suggestions sont les bienvenues!


    23.8. 'La découverte en ligne'...

    IPv6: Addressing The Needs Of the Future [DOWNLOAD: PDF] -par le groupe Yankee (Auteur) -Prix: $595.00 -Edition: e-book (Acrobat Reader) -Pages: 3 (trois) -Editeur: MarketResearch.com; ISBN B00006334Y; (1 novembre 2001)

    ;-) Le nombre de copies serait intéressant à connaître...


    Chapitre 24. Historique des Révisions / Crédits / La Fin

    24.1. Historique des Révisions

    24.1.1. Révisions 0.x

    24.1.1.1. La version anglo-saxonne (document original de Peter Bieringer)

    Un historique des modifications de la version anglo-saxonne originale peut être trouvé ici: TLDP / Linux+IPv6-HOWTO / Revision History.


    24.1.1.2. La version francophone

    0.49.fr.2

    2007-10-06/PB: fix broken URLs to TLDP-CVS, minor fixes for proper SGML validation.

    0.49.fr.1

    2006-02-26/MB: Mise à jour au profit de la révision 0.49.

    0.48.1.fr.1

    2005-01-20/MB: Mise à jour au profit de la révision 0.48.1.

    0.47.fr.1

    2004-09-05/MB: Mise à jour au profit de la révision 0.47.

    0.45.1.fr.1

    2004-03-14/MB: Mise à jour au profit de la révision 0.45.1. Corrections et améliorations diverses.

    0.44.fr.1

    2003-09-05/MB: Mise à jour au profit de la révision 0.44. A cette occasion, une révision non systématique est réalisée.

    0.43.2.fr.2

    2003-07-17/MB: Correction de quelques coquilles, amélioration de la traduction de quelques passages.

    0.43.2.fr.1

    2003-06-20/MB: Mise à jour au profit de la révision 0.43.2. A cette occasion, une révision non systématique est réalisée.

    0.41.1.fr.2

    2003-06-06/MB: Première révision générale; à savoir, correction de coquilles, bogues, fautes d'orthographe, etc.

    0.41.1.fr.1

    2003-05-09/MB: Cette version est la première. Son contenu, rédigé sur LyX version 1.3.2, est basé sur celui de la version anglo-saxonne 0.41.1. Cependant un certain nombre de mes suggestions (Michel Boucey) ayant été prises en compte par Peter Bieringer lors du travail de traduction, il existe d'ores et déjà, ça et là, des modifications mineures qui seront présentes dans les futures versions du document original. Le suffixe .fr.x indique le numéro de révision de la traduction francophone.


    24.2. Crédits

    Le moyen le plus rapide d'être ajouté à cette sympathique liste est de m'envoyer des corrections (de bogue), et/ou mises à jour ;-).

    Si vous voulez réaliser un réexamen important, vous pouvez utiliser le fichier natif LyX (voir le document original) et envoyez les diffs s'y rapportant, car les diffs en rapport au code SGML ne sont pas d'une grande utilité (NdT: merci d'envoyer les diffs à l'adresse <mboucey chez free point fr>).


    24.2.1. Crédits majeurs

    • David Ranch <dranch chez trinnet point net>: pour m'avoir encouragé à écrire cet HOWTO, pour ses commentaires sur quelques premières des révisions, et ses contributions à de différents résultats de test IPv6 sur mon site web IPv6. Mais aussi pour ses relectures et suggestions.

    • Pekka Savola <pekkas chez netcore point fi>: pour ses relectures essentielles, apports et suggestions.

    • Martin F. Krafft <madduck chez madduck point net>: pour la vérification orthographique et sa relecture générale du document.

    • John Ronan <j0n chez tssg point wit point ie>: pour la vérification orthographique.

    • Georg Käfer <gkaefer chez gmx point at>: pour la détection de la création défectueuse au format PDF (problème réglé maintenant par Greg Ferguson, travaillant au LDP), les références de livres en langue allemande, une grande liste d'URL, leurs vérifications, une grande quantité de suggestions, de corrections, de contributions, et pour sa traduction en langue allemande.

    • Michel Boucey <mboucey chez free point fr>: pour la correction orthographique, la découverte de liens brisés, sa contribution grâce à ses suggestions, ses apports de nouveaux liens, et pour sa traduction en langue française.

    • Michele Ferritto <m dot ferritto at virgilio dot it>: pour avoir découvert des bogues, et pour sa traduction en langue italienne.

    • Daniel Roesen <dr at cluenet dot de>: pour ses vérifications orthographiques.


    24.2.2. Autres crédits

    24.2.2.1. Crédits relatifs aux documents techniques

    Ecrire, en étant débutant, un HOWTO LDP (dans LyX et en exportant le travail vers DocBook pour se conformer au SGML) n'est pas si facile que certains pourraient le dire. Il y a d'étranges pièges... malgré tout, merci:


    24.2.2.2. Crédits relatifs à la traduction francophone

    Les crédits concernant les corrections/suggestions apportées à la version francophone viendront ici (peut-être un jour...). Merci par avance pour vos contributions.


    24.3. La Fin

    Merci de m'avoir lu. Dans l'espoir que cela puisse aider!

    Si vous avez des questions, souscrivez à la bonne liste de diffusion et décrivez votre problème en fournissant autant d'information que possible.

    \ No newline at end of file diff --git a/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.fr.lyx b/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.fr.lyx deleted file mode 100644 index 475cbcf4..00000000 --- a/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.fr.lyx +++ /dev/null @@ -1,21639 +0,0 @@ -#LyX 2.2 created this file. For more info see http://www.lyx.org/ -\lyxformat 508 -\begin_document -\begin_header -\save_transient_properties true -\origin unavailable -\textclass docbook-book -\begin_preamble - - -\end_preamble -\use_default_options false -\maintain_unincluded_children false -\language french -\language_package default -\inputencoding default -\fontencoding global -\font_roman "default" "default" -\font_sans "default" "default" -\font_typewriter "default" "default" -\font_math "auto" "auto" -\font_default_family default -\use_non_tex_fonts false -\font_sc false -\font_osf false -\font_sf_scale 100 100 -\font_tt_scale 100 100 -\graphics default -\default_output_format default -\output_sync 0 -\bibtex_command default -\index_command default -\paperfontsize default -\spacing single -\use_hyperref false -\papersize default -\use_geometry false -\use_package amsmath 1 -\use_package amssymb 1 -\use_package cancel 1 -\use_package esint 0 -\use_package mathdots 1 -\use_package mathtools 1 -\use_package mhchem 0 -\use_package stackrel 1 -\use_package stmaryrd 1 -\use_package undertilde 1 -\cite_engine basic -\cite_engine_type default -\biblio_style plain -\use_bibtopic false -\use_indices false -\paperorientation portrait -\suppress_date false -\justification true -\use_refstyle 0 -\index Index -\shortcut idx -\color #008000 -\end_index -\secnumdepth 3 -\tocdepth 3 -\paragraph_separation indent -\paragraph_indentation default -\quotes_language swedish -\papercolumns 1 -\papersides 1 -\paperpagestyle default -\tracking_changes false -\output_changes false -\html_math_output 0 -\html_css_as_file 0 -\html_be_strict false -\end_header - -\begin_body - -\begin_layout Title - -\lang ngerman -Linux IPv6 HOWTO -\lang french - (fr) -\end_layout - -\begin_layout Standard - -\lang english -\begin_inset ERT -status open - -\begin_layout Plain Layout - -PeterBieringerpb at bieringer dot de
  • -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - -0.49.fr.3wip2015-08-18 PB -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - -0.49.fr.22007-10-06 P -B -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - -0.49.fr.12006-02-26 M -B -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - -0.48.1.fr.12005-01-20 -MB -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - -0.47.fr.12004-09-05 M -B -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - -0.44.fr.12003-05-09 M -B -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Abstract -L'objet de cet HOWTO IPv6 Linux est de répondre à la fois aux questions - basiques et avancées au sujet d'IPv6 sur le système d'exploitation Linux. - Cet HOWTO fournira au lecteur assez d'information pour installer, configurer - et utiliser les applications IPv6 sur les machines Linux. - -\begin_inset CommandInset ref -LatexCommand ref -name "l'historique des révisions" -reference "revision-history" - -\end_inset - - -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-general" - -\end_inset - -Généralités -\end_layout - -\begin_layout Standard -Vous trouverez les informations concernant les différentes traductions disponibl -es dans la section -\begin_inset CommandInset ref -LatexCommand ref -name "Traductions" -reference "general-translations" - -\end_inset - -. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "general-copright" - -\end_inset - -Copyright, licence et autres -\end_layout - -\begin_layout Subsection -Copyright -\end_layout - -\begin_layout Standard -Rédaction et Copyright (C) 2001-2007 Peter Bieringer, traduction francophone - et Copyright (C) 2003-2006 Michel Boucey -\end_layout - -\begin_layout Subsection -Licence -\end_layout - -\begin_layout Standard - -\series bold -Cet HOWTO IPv6 Linux est publié sous GPL GNU version 2 -\series default -: -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\end_layout - -\begin_layout Standard -L'HOWTO IPv6 Linux, un guide sur la façon de configurer et d'utiliser IPv6 - sur les systèmes Linux. - -\begin_inset Newline newline -\end_inset - - -\end_layout - -\begin_layout Standard -Copyright (C) 2001-2007 Peter Bieringer -\begin_inset Newline newline -\end_inset - - -\end_layout - -\begin_layout Standard -Ce document est libre; vous pouvez le redistribuer et/ou le modifier dans - les termes de la Licence Publique Générale GNU, telle que publiée par la - Free Software Foundation; soit dans sa version 2, ou (c'est à votre convenance) - une quelconque version postérieure. -\end_layout - -\begin_layout Standard -Ce programme est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE - GARANTIE; sans même de garantie impliquée par une COMMERCIALISATION ou - d'ADÉQUATION A UNE FIN PARTICULIÈRE. - Voir la Licence Publique Générale GNU pour de plus amples détails. -\end_layout - -\begin_layout Standard -Vous devriez avoir reçu une copie de la Licence Publique Générale GNU allant - de paire avec ce programme; sinon, écrivez à la Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -\end_layout - -\begin_layout Subsection -A propos de l'auteur -\end_layout - -\begin_layout Subsubsection -L'auteur, Internet et IPv6 -\end_layout - -\begin_layout Itemize -1993: J'ai pris contact avec l'Internet par la pratique du mél et des news - sur un client en mode texte (par exemple, rechercher "e91abier" sur groups.googl -e.com, c'est moi). -\end_layout - -\begin_layout Itemize -1996: J'ai été sollicité pour concevoir un cours sur IPv6, incluant des - travaux pratiques sur le système d'exploitation Linux. -\end_layout - -\begin_layout Itemize -1997: Début de la rédaction d'un guide sur la façon d'installer, de configurer - et d'utiliser IPv6 sur les systèmes Linux, appelé -\begin_inset CommandInset href -LatexCommand href -name "HowTo - IPv6 & Linux " -target "http://www.bieringer.de/linux/IPv6/" - -\end_inset - - (voir -\begin_inset CommandInset href -LatexCommand href -name "IPv6 & Linux - HowTo/History" -target "http://www.bieringer.de/linux/IPv6/IPv6-HOWTO/IPv6-HOWTO-0.html#history" - -\end_inset - - pour plus d'information). -\end_layout - -\begin_layout Itemize -2001: Début de la rédaction de cet HOWTO IPv6 Linux. -\end_layout - -\begin_layout Subsubsection -Contact -\end_layout - -\begin_layout Standard -L'auteur peut être contacté par mél à mais - aussi -\emph on -via -\emph default - -\begin_inset CommandInset href -LatexCommand href -name "sa page personnelle" -target "http://www.bieringer.de/pb/" - -\end_inset - -. -\end_layout - -\begin_layout Standard -Il vit actuellement à Munich [dans la partie nord du Schwabing] / Bavière - / Allemagne (sud) / Europe (centrale) / Terre (surface/continent). -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "general-category" - -\end_inset - -Catégorie -\end_layout - -\begin_layout Standard -Cet HOWTO relève de la catégorie " -\emph on -Réseau/Protocoles -\emph default -". -\end_layout - -\begin_layout Section -La version, l'historique et ce qu'il reste à faire -\end_layout - -\begin_layout Subsection -La version -\end_layout - -\begin_layout Standard -La version actuelle est visible dès le début de ce document. -\end_layout - -\begin_layout Standard -En ce qui concerne les autres versions/traductions, voir également -\begin_inset CommandInset href -LatexCommand href -name "http://www.bieringer.de/linux/IPv6/" -target "http://www.bieringer.de/linux/IPv6/" - -\end_inset - -. -\end_layout - -\begin_layout Subsection -L'historique -\end_layout - -\begin_layout Subsubsection -L'essentiel de l'historique -\end_layout - -\begin_layout Standard -30-11-2001:Début de la conception du nouvel HOWTO. -\end_layout - -\begin_layout Standard -02-01-2002: Une quantité importante du contenu est achevée, publication - de la première version du premier chapitre (version 0.10). -\end_layout - -\begin_layout Standard -14-01-2002: Plus achevé, avec relectures, publication de la première version - complète du document (version 0.14). -\end_layout - -\begin_layout Standard -16-08-2002: La traduction polonaise est en cours -\end_layout - -\begin_layout Standard -31-10-2002: La traduction chinoise est disponible (voir -\begin_inset CommandInset ref -LatexCommand ref -name "les traductions" -reference "general-translations" - -\end_inset - - pour en savoir plus) -\end_layout - -\begin_layout Standard -10-11-2002: La traduction allemande est en cours -\end_layout - -\begin_layout Standard -10-02-2003: La traduction allemande est disponible -\end_layout - -\begin_layout Standard -09-04-2003: La traduction francophone est en cours -\end_layout - -\begin_layout Standard -09-05-2003: La traduction francophone est disponible -\end_layout - -\begin_layout Standard -15-08-2003: La traduction espagnole est en cours -\end_layout - -\begin_layout Standard -16-10-2003: La traduction italienne est en cours -\end_layout - -\begin_layout Standard -12-03-2004: La traduction italienne est disponible -\end_layout - -\begin_layout Standard -18-06-2004: La traduction grecque est en cours -\end_layout - -\begin_layout Subsubsection -L'historique complet -\end_layout - -\begin_layout Standard -Voir -\begin_inset CommandInset ref -LatexCommand ref -name "l'historique des révisions" -reference "revision-history" - -\end_inset - - à la fin de ce document. -\end_layout - -\begin_layout Subsection -Ce qu'il reste à faire -\end_layout - -\begin_layout Itemize -Rédiger les contenus manquants -\end_layout - -\begin_layout Itemize -Achever la correction orthographique -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "general-translations" - -\end_inset - -Les traductions -\end_layout - -\begin_layout Standard -Les traductions doivent toujours contenir l'URL, le numéro de version et - le copyright du document original (le vôtre aussi). - Merci de ne pas traduire le journal original des modifications, ce n'est - vraiment pas utile. - Il apparaît que la fréquence des modifications apportées à ce document - est, la plupart du temps, inférieure à une fois par mois. - Depuis la version 0.27, il apparaît aussi que la plus grande part du contenu - fourni par moi-même a été rédigée. - Les traductions doivent toujours prendre comme source la version anglo-saxonne. -\end_layout - -\begin_layout Subsection -Traductions disponibles -\end_layout - -\begin_layout Subsubsection -En langue française -\end_layout - -\begin_layout Standard -La traduction francophone par Michel Boucey a été mise en chantier le 9 - avril 2003, à partir de la révision 0.41.1. - Elle est disponible depuis le 9 mai 2003 sur Deep Space 6, avec pour URL - original -\begin_inset CommandInset href -LatexCommand href -name "mirrors.deepspace6.net / Linux+IPv6-HOWTO-fr" -target "http://mirrors.deepspace6.net/Linux+IPv6-HOWTO-fr/" - -\end_inset - -. - Je ( -\emph on -Michel Boucey -\emph default -) remercie par avance toute personne qui aidera, de quelque façon, à améliorer - cette traduction. - On peut me contacter à l'adresse mél . -\end_layout - -\begin_layout Subsubsection -Les autres traductions disponibles -\end_layout - -\begin_layout Standard -L'information concernant les traductions disponibles en d'autres langues - que l'anglais et le français peut être trouvée dans le document original: - -\begin_inset CommandInset href -LatexCommand href -name "TLDP / Linux+IPv6-HOWTO / Translations" -target "http://www.tldp.org/HOWTO/Linux+IPv6-HOWTO/general-translations.html" - -\end_inset - - -\end_layout - -\begin_layout Section -Un peu de technique -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "general-original-source" - -\end_inset - -Le document original de cet HOWTO -\end_layout - -\begin_layout Standard -Cet HOWTO est actuellement rédigé avec la version 1.2.0 de LyX sur un système - Linux Red Hat 7.3 avec un patron SGML (livre DocBook). - Il est disponible en vue des contributions à l'URL -\lang english - -\begin_inset CommandInset href -LatexCommand href -name "github / tLDP / LDP / users / Peter-Bieringer" -target "https://github.com/tLDP/LDP/tree/master/LDP/users/Peter-Bieringer/" - -\end_inset - - -\lang french -. -\end_layout - -\begin_layout Subsubsection -Modification des lignes de code propres à LyX -\end_layout - -\begin_layout Standard -Les modifications des lignes de code propres à LyX sont réalisées par un - script -\begin_inset Quotes sld -\end_inset - -maison -\begin_inset Quotes srd -\end_inset - -, -\begin_inset Quotes sld -\end_inset - -lyxcodelinewrapper.pl -\begin_inset Quotes srd -\end_inset - -, que vous pouvez obtenir par CVS pour votre propre compte: -\begin_inset CommandInset href -LatexCommand href -name "TLDP-CVS / users / Peter-Bieringer" -target "http://cvs.tldp.org/go.to/LDP/LDP/users/Peter-Bieringer/" - -\end_inset - - ( -\emph on -NdT -\emph default -: ces lignes ne gênent pas la génération au format SGML, mais celles aux - formats PS et PDF à partir du SGML généré couramment, -\emph on -i.e. - -\emph default - sans ce script). -\end_layout - -\begin_layout Subsubsection -La génération du SGML -\end_layout - -\begin_layout Standard -Le code SGML est généré en utilisant la fonction d'exportation de LyX. -\end_layout - -\begin_layout Standard -Des solutions ont été apportées afin de créer un code SGML plus propre (voir - aussi ici pour le programme Perl, -\begin_inset CommandInset href -LatexCommand href -name "TLDP-CVS / users / Peter-Bieringer" -target "http://cvs.tldp.org/go.to/LDP/LDP/users/Peter-Bieringer/" - -\end_inset - -): -\end_layout - -\begin_layout Itemize -L'exportation du document LyX ne créait pas proprement les balises -\begin_inset Quotes sld -\end_inset - -colspan -\begin_inset Quotes srd -\end_inset - - - l'outil qui règle le problème: -\begin_inset Quotes sld -\end_inset - -sgmllyxtabletagfix.pl -\begin_inset Quotes srd -\end_inset - - (le problème est définitivement réglé depuis la version 1.2.0 de LyX) -\end_layout - -\begin_layout Itemize -LyX utilise parfois des entités spéciales gauche/droite, à la place des - guillemets habituels, qui seront présentes dans le code HTML. - Certains navigateurs n'interprètent pas très bien ces balises (Opéra 6 - TP 2 ou Konquéror sont connus pour ce problème) - l'outil qui règle le - problème: -\begin_inset Quotes sld -\end_inset - -sgmllyxquotefix.pl -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Subsection -Les références en ligne à la version HTML de cet HOWTO (lien/ancrage) -\end_layout - -\begin_layout Subsubsection -La page d'index maître -\end_layout - -\begin_layout Standard -Généralement, une référence vers la page d'index maître est recommandée. -\end_layout - -\begin_layout Subsubsection -Les pages dédiées -\end_layout - -\begin_layout Standard -Parce que les pages HTML sont générées à partir du fichier SGML, le nommage - des fichiers HTML prend une tournure aléatoire. - Et cependant, certaines pages ont des balises assignées par LyX, dont il - résulte un nommage constant. - Ces balises sont très utiles aux références et ne devraient pas être changées - à l'avenir. -\end_layout - -\begin_layout Standard -Si vous pensez que j'ai oublié une balise, merci de me le faire savoir, - et je l'ajouterai. -\end_layout - -\begin_layout Section -Préface -\end_layout - -\begin_layout Standard -Quelques petites choses d'abord: -\end_layout - -\begin_layout Subsection -Combien se promène-t-il de versions de l'HOWTO Linux & IPv6? -\end_layout - -\begin_layout Standard -En incluant celui-ci, il y a trois documents HOWTO disponibles. - Mes excuses si cela vous semble de trop ;) -\end_layout - -\begin_layout Subsubsection -La FAQ/HOWTO IPv6 Linux (obsolète) -\end_layout - -\begin_layout Standard -Le premier document relatif à IPv6 a été écrit par -\emph on -Eric Osborne, -\emph default - et s'appelle -\begin_inset CommandInset href -LatexCommand href -name "FAQ/HOWTO IPv6 Linux" -target "http://www.linuxhq.com/IPv6/" - -\end_inset - - (merci de ne l'utiliser que pour des raisons historiques). - -\series bold -La dernière version -\series default - fut la 3.2.1, publiée le 14 juillet -\series bold -1997 -\series default -. -\end_layout - -\begin_layout Standard -Merci de m'aider: si quelqu'un connaît la date anniversaire de cet HOWTO, - merci de m'envoyer un mél (cette information est nécessaire à "l'historique"). -\end_layout - -\begin_layout Subsubsection -L'HowTo - IPv6 & Linux (maintenu) -\end_layout - -\begin_layout Standard -Il existe une seconde version appelée -\begin_inset CommandInset href -LatexCommand href -name "HowTo - IPv6 & Linux - " -target "http://www.bieringer.de/linux/IPv6/" - -\end_inset - - écrite par moi-même ( -\emph on -Peter Bieringer -\emph default -) en pur HTML. - -\series bold -Elle est née en -\series default - avril -\series bold -1997 -\series default - et la première version anglo-saxonne a été publiée en juin 1997. - Je continuerais à la -\series bold -maintenir -\series default -, mais cela déclinera lentement (mais pas complètement) en faveur de l'HOWTO - IPv6 Linux que vous lisez en ce moment. -\end_layout - -\begin_layout Subsubsection -L'HOWTO IPv6 Linux (ce document) -\end_layout - -\begin_layout Standard -Parce que l' -\begin_inset CommandInset href -LatexCommand href -name "HowTo - IPv6 & Linux" -target "http://www.bieringer.de/linux/IPv6/" - -\end_inset - - est écrit en HTML pur, il n'est vraiment pas compatible avec le -\begin_inset CommandInset href -LatexCommand href -name "Projet de Documentation Linux" -target "http://www.tldp.org/" - -\end_inset - - ( -\emph on -Linux Documentation Project, -\emph default - ou TLDP). - J'ai ( -\emph on -Peter Bieringer -\emph default -) reçu une demande fin novembre 2001 de réécriture de l' -\begin_inset CommandInset href -LatexCommand href -name "HowTo -IPv6 & Linux" -target "http://www.bieringer.de/linux/IPv6/" - -\end_inset - - en SGML. - Cependant, à cause de la discontinuité de cet HOWTO ( -\begin_inset CommandInset href -LatexCommand href -name "le future de l'HowTo - IPv6 & Linux" -target "http://www.bieringer.de/linux/IPv6/IPv6-HOWTO/IPv6-HOWTO-0.html#history" - -\end_inset - -), et de la standardisation croissante d'IPv6, je décidais d'écrire un nouveau - document couvrant aussi bien les questions simples ou avancées qui resteront - importantes dans les toutes prochaines années. - Plus dynamique, un contenu plus avancé s'y trouvera en plus, par rapport - au second HOWTO ( -\begin_inset CommandInset href -LatexCommand href -name "HowTo - IPv6 & Linux" -target "http://www.bieringer.de/linux/IPv6/" - -\end_inset - -). -\end_layout - -\begin_layout Section -Termes employés, glossaire et abréviations -\end_layout - -\begin_layout Subsection -Relatifs aux réseaux -\end_layout - -\begin_layout Description -Base -\begin_inset space ~ -\end_inset - -10 Le système bien connu des nombres décimaux, représentant n'importe quelle - valeur avec les chiffres 0-9. -\end_layout - -\begin_layout Description -Base -\begin_inset space ~ -\end_inset - -16 Habituellement utilisée dans les langages de programmation de bas et - haut niveaux, connue encore en tant que système numérique hexadécimal, - représentant les valeurs avec les chiffres 0-9 et les caractères A-F (insensibl -e à la casse). -\end_layout - -\begin_layout Description -Base -\begin_inset space ~ -\end_inset - -85 Représentation d'une valeur grâce à 85 différents chiffres/caractères, - cela permet des chaînes de caractères plus courtes mais jamais vue dans - la pratique. -\end_layout - -\begin_layout Description -Bit Unité minimale de stockage, allumée( -\emph on -on -\emph default -)/vraie (1) ou éteinte( -\emph on -off -\emph default -)/fausse (0). -\end_layout - -\begin_layout Description -Byte Le plus souvent, une collection de 8 bits (mais ce n'est pas réellement - une nécessité - regardez les systèmes des anciens ordinateurs). -\end_layout - -\begin_layout Description -Périphérique ici, matériel de connexion réseau, voir aussi NIC. -\end_layout - -\begin_layout Description -Hôte -\begin_inset space ~ -\end_inset - -à -\begin_inset space ~ -\end_inset - -double -\begin_inset space ~ -\end_inset - -résidence Un hôte à double résidence est un noeud ayant deux interfaces - réseau (physique ou virtuelle) sur deux liens différents, mais qui ne réalise - pas de renvoi de paquets entre les interfaces. -\end_layout - -\begin_layout Description -Hôte Généralement, un hôte simple résident, présent sur un lien. - Normalement, il n'a seulement qu'une interface réseau active, par exemple - Ethernet ou (non pas -\emph on -et -\emph default -) PPP. -\end_layout - -\begin_layout Description -Interface quasi-synonyme de -\begin_inset Quotes sld -\end_inset - -périphérique -\begin_inset Quotes srd -\end_inset - -, voir aussi NIC. -\end_layout - -\begin_layout Description -En-tête -\begin_inset space ~ -\end_inset - -IP En-tête d'un paquet IP (chaque paquet réseau a un en-tête, son type dépendant - de la couche réseau). -\end_layout - -\begin_layout Description -Lien Un lien est un médium de transport de paquet réseau de la couche 2, - des exemples en sont Ethernet, PPP, SLIP, ATM, RNIS, Frame Relay, -\emph on -etc. -\end_layout - -\begin_layout Description -Noeud Un noeud est soit un hôte, soit un routeur. -\end_layout - -\begin_layout Description -Octet Une collection véritable de 8 bits, aujourd'hui synonyme de "byte". -\end_layout - -\begin_layout Description -Port Information destinée au distributeur TCP/UDP (couche 4) afin de transporter - l'information à la couche supérieure. -\end_layout - -\begin_layout Description -Protocole Chaque couche réseau contient la plupart du temps un champ -\begin_inset Quotes sld -\end_inset - -protocole -\begin_inset Quotes srd -\end_inset - - facilitant la distribution de l'information transportée à la couche supérieure, - comme cela peut se voir dans la couche 2 (MAC) et 3 (IP) -\end_layout - -\begin_layout Description -Routeur Un routeur est un noeud possédant une ou plusieurs interface(s) - réseau, capable d'envoyer les paquets entre ses interfaces. -\end_layout - -\begin_layout Description -Socket Une socket IP est définie par ses adresses source et destination, - ses ports et (association) -\end_layout - -\begin_layout Description -Pile Une collection de couches relative au réseau. -\end_layout - -\begin_layout Description -Masque -\begin_inset space ~ -\end_inset - - -\series bold -de -\series default - -\begin_inset space ~ -\end_inset - - -\series bold -sous-réseau -\series default - Les réseaux IP utilisent un masque de bits afin de distinguer le réseau - local de ceux qui sont distants. -\end_layout - -\begin_layout Description -Tunnel Un tunnel est typiquement une connexion point-à-point sur laquelle - les paquets échangés transportent les données d'un autre protocole, un - tunnel IPv6-in-IPv4 en est un exemple. -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "Glossaire" - -\end_inset - -Abréviations -\end_layout - -\begin_layout Description -ACL -\emph on -Access Control List -\emph default -, Liste de Contrôle d'Accès -\end_layout - -\begin_layout Description -API -\emph on -Application Programming Interface -\emph default -, Interface de Programmation d'Application -\end_layout - -\begin_layout Description -ASIC -\emph on -Application Specified Integrated Circuit -\emph default -, Circuit Intégré d'Application Spécifique -\end_layout - -\begin_layout Description -BSD -\emph on -Berkeley Software Distribution -\emph default -, Distribution des Logiciels Berkeley -\end_layout - -\begin_layout Description -Bus -\begin_inset space ~ -\end_inset - -CAN Système de bus physique contrôlant un réseau ( -\emph on -NdT -\emph default -: voir par exemple -\begin_inset CommandInset href -LatexCommand href -name "ici" -target "http://edelaunay.chez.tiscali.fr/buscan.htm" - -\end_inset - - pour plus d'information) -\end_layout - -\begin_layout Description -ISP -\emph on -Internet Service Provider -\emph default -, Fournisseur d'Accès à Internet (FAI) -\end_layout - -\begin_layout Description -KAME Projet - effort conjoint de six entreprises au Japon pour fournir, - mondialement et dans le cadre du logiciel libre, une pile IPv6 et IPsec - (pour IPv4 et IPv6) pour les variantes de BSD -\begin_inset CommandInset href -LatexCommand href -name "www.kame.net" -target "http://www.kame.net/" - -\end_inset - - -\end_layout - -\begin_layout Description -LIR -\emph on -Local Internet Registry -\emph default -, Bureau local d'enregistrement Internet -\end_layout - -\begin_layout Description -NIC -\emph on -Network Interface Card -\emph default -, Carte d'interface réseau -\end_layout - -\begin_layout Description -RFC -\emph on -Request for comments -\emph default -, Appel à commentaires - jeu de notes techniques et organisationnelles au - sujet d'Internet. -\end_layout - -\begin_layout Description -USAGI Projet -\begin_inset Quotes sld -\end_inset - -UniverSAl playGround for IPv6 -\begin_inset Quotes srd -\end_inset - - - travaille à rendre disponible une pile protocolaire IPv6 destinée au - système Linux qui soit d'une qualité apte à la production. -\end_layout - -\begin_layout Subsection -Relatifs à ce document -\end_layout - -\begin_layout Subsubsection -Balisage en vue de l'encodage PDF/PS -\end_layout - -\begin_layout Standard -Le caractère -\begin_inset Quotes sld -\end_inset - -¬ -\begin_inset Quotes srd -\end_inset - - est utilisé pour signaler que le code est enveloppé en vue d'un meilleur - affichage dans les fichiers PDF et PS. -\end_layout - -\begin_layout Subsubsection -Conventions -\end_layout - -\begin_layout Standard -Dans les exemples génériques vous trouverez parfois ce qui suit: -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Standard -Pour une utilisation réelle sur votre système, en ligne de commande ou dans - des scripts, cela doit être remplacé par le contenu adéquate (ôtez bien - sûr les chevrons), et le résultat devrait être par exemple -\end_layout - -\begin_layout Code - -1.2.3.4 -\end_layout - -\begin_layout Subsubsection -Les commandes dans l'interpréteur de commandes (le -\emph on - shell -\emph default -) -\end_layout - -\begin_layout Standard -Les commandes exécutables en tant qu'utilisateur non-root commencent avec - un $, par exemple -\end_layout - -\begin_layout Code - -$ whoami -\end_layout - -\begin_layout Standard -Les commandes exécutables en tant qu'utilisateur root commencent avec un - #, par exemple -\end_layout - -\begin_layout Code - -# whoami -\end_layout - -\begin_layout Section -Pré-requis à l'usage de cet HOWTO -\end_layout - -\begin_layout Subsection -Pré-requis personnels -\end_layout - -\begin_layout Subsubsection -Une expérience des outils Unix -\end_layout - -\begin_layout Standard -Vous devriez être familiarisé avec les outils essentiels d'Unix comme -\emph on -grep -\emph default -, -\emph on -awk -\emph default -, -\emph on -find -\emph default -, -\emph on -etc -\emph default -, et connaître les options de ligne de commande les plus communément employées. -\end_layout - -\begin_layout Subsubsection -Une expérience de la théorie des réseaux -\end_layout - -\begin_layout Standard -Vous devriez connaître les notions de couche, de protocole, d'adresse, de - câble, de socket, -\emph on -etc -\emph default -. - Si vous êtes nouveau, voici un bon point de départ pour vous: -\begin_inset CommandInset href -LatexCommand href -name "linuxports/howto/intro_to_networking" -target "http://www.linuxports.com/howto/intro_to_networking/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Une expérience de la configuration IPv4 -\end_layout - -\begin_layout Standard -Vous devriez absolument avoir quelque expérience de la configuration IPv4, - sinon ce sera difficile pour vous de comprendre ce qui se passe réellement. -\end_layout - -\begin_layout Subsubsection -Une expérience du Système des Noms de Domaine (DNS) -\end_layout - -\begin_layout Standard -Vous devriez aussi comprendre en quoi consiste le Système des Noms de Domaine - (DNS), ce qu'il fournit et comment s'en servir. -\end_layout - -\begin_layout Subsubsection -Une expérience des stratégies de déboguage réseau -\end_layout - -\begin_layout Standard -Vous devriez au moins savoir comment utiliser -\emph on -tcpdump -\emph default - et avoir connaissance de ce qu'il peut vous montrer. - Sinon, le déboguage réseau sera très difficile pour vous. -\end_layout - -\begin_layout Subsection -Le matériel compatible avec le système d'exploitation Linux -\end_layout - -\begin_layout Standard -Vous espérez certainement pouvoir expérimenter tout cela avec du vrai matériel, - et pas seulement lire cet HOWTO jusqu'à tomber de sommeil. - ;-7) -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-basics" - -\end_inset - -Les bases -\end_layout - -\begin_layout Section -Qu'est-ce qu'IPv6? -\end_layout - -\begin_layout Standard -IPv6 est un nouveau protocole de la couche 3 (voir -\color red - -\begin_inset CommandInset href -LatexCommand href -name "le modèle OSI" -target "http://www.linuxports.com/howto/intro_to_networking/c4412.htm#PAGE103HTML" - -\end_inset - - -\color none -) qui supplantera à terme IPv4 (plus connu sous le nom d'IP). - IPv4 a été conçu il y a déjà un certain de temps ( -\begin_inset CommandInset href -LatexCommand href -name "RFC 760 / Le protocole Internet" -target "http://www.faqs.org/rfcs/rfc760.html" - -\end_inset - - à partir de janvier 1980), et, dès le début, il y a eu de nombreuses demandes - pour accroître la quantité d'adresses disponible et augmenter les capacités. - Le RFC le plus récent est le -\begin_inset CommandInset href -LatexCommand href -name "RFC 2460 / spécification du protocole Internet version 6" -target "http://www.faqs.org/rfcs/rfc2460.html" - -\end_inset - - ( -\emph on -NdT -\emph default -: -\begin_inset CommandInset href -LatexCommand href -name "une version francophone de ce RFC" -target "http://abcdrfc.free.fr/rfc-vf/rfc2460.html" - -\end_inset - -). - Le changement essentiel apporté par IPv6 est la nouvelle conception de - l'en-tête, incluant une augmentation de la taille de l'adresse, passant - de 32 à 128 bits. - Parce que la couche 3 est responsable de bout en bout du transport des - paquets dont le routage est basé sur des adresses, elle doit inclure les - nouvelles adresses IPv6, comme pour IPv4. -\end_layout - -\begin_layout Standard -Pour en savoir plus sur l'histoire d'IPv6, jetez un oeil aux anciens RFC - concernant IPv6, par exemple dans le -\begin_inset CommandInset href -LatexCommand href -name "Guide / Références IPv6 SWITCH " -target "http://www.switch.ch/lan/ipv6/references.html" - -\end_inset - -. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "basic-history-IPv6-Linux" - -\end_inset - -Historique d'IPv6 pour Linux -\end_layout - -\begin_layout Standard -Les années 1992, 1993 et 1994 de l'histoire d'IPv6 (dans ses généralités) - sont couvertes par le document suivant: -\begin_inset CommandInset href -LatexCommand href -name "IPv6 ou IPng (IP nouvelle génération)" -target "http://www.laynetworks.com/IPv6.htm#CH3" - -\end_inset - -. -\end_layout - -\begin_layout Standard -A faire: plus de détails historiques, plus de contenu... -\end_layout - -\begin_layout Subsection -Au début -\end_layout - -\begin_layout Standard -Le premier code réseau relatif à IPv6 a été ajouté au noyau Linux 2.1.8 en - novembre 1996 par Pedro Roque. - Il était fondé sur l'API BSD: -\end_layout - -\begin_layout Code - -diff -u --recursive --new-file v2.1.7/linux/include/linux/in6.h -\end_layout - -\begin_layout Code - -¬ linux/include/linux/in6.h -\end_layout - -\begin_layout Code - ---- v2.1.7/linux/include/linux/in6.h Thu Jan 1 02:00:00 1970 -\end_layout - -\begin_layout Code - -+++ linux/include/linux/in6.h Sun Nov 3 11:04:42 1996 -\end_layout - -\begin_layout Code - -@@ -0,0 +1,99 @@ -\end_layout - -\begin_layout Code - -+/* -\end_layout - -\begin_layout Code - -+ * Types and definitions for AF_INET6 -\end_layout - -\begin_layout Code - -+ * Linux INET6 implementation -\end_layout - -\begin_layout Code - -+ * + * Authors: -\end_layout - -\begin_layout Code - -+ * Pedro Roque <******> -\end_layout - -\begin_layout Code - -+ * -\end_layout - -\begin_layout Code - -+ * Source: -\end_layout - -\begin_layout Code - -+ * IPv6 Program Interfaces for BSD Systems -\end_layout - -\begin_layout Code - -+ * -\end_layout - -\begin_layout Standard -Les lignes présentées sont copiées du patch-2.1.8 (l'adresse mél a été effacée - au copier&coller). -\end_layout - -\begin_layout Subsection -Après -\end_layout - -\begin_layout Standard -A cause du manque de bras, l'implémentation d'IPv6 dans le noyau était incapable - de suivre les projets discutés ou les RFC nouvellement mis à jour. - En novembre 2000, un projet débute au Japon, appelé -\begin_inset CommandInset href -LatexCommand href -name "USAGI" -target "http://www.linux-ipv6.org/" - -\end_inset - -, dont le but était d'implémenter dans Linux tout le support IPv6 manquant - ou obsolète. - Ce projet suit en cela la trace de l'implémentation courante d'IPv6 pour - FreeBSD, réalisée par le -\begin_inset CommandInset href -LatexCommand href -name "projet KAME " -target "http://www.kame.net/" - -\end_inset - -. - De temps à autre, ils créaient des archives de développement ( -\emph on -snapshots -\emph default -) à partir des sources courantes du noyau Linux. -\end_layout - -\begin_layout Subsection -Actuellement -\end_layout - -\begin_layout Standard -Malheureusement, le patch -\begin_inset CommandInset href -LatexCommand href -name "USAGI" -target "http://www.linux-ipv6.org/" - -\end_inset - - est très volumineux, à tel point que les personnes s'occupant actuellement - de maintenir les fonctionnalités réseau de Linux sont incapables de l'inclure - dans les sources, aptes à la production, de la série des noyaux Linux 2.4.x. - En conséquence, la série 2.4.x manque de certaines (et même de nombreuses) - extensions, et elle n'applique pas non plus les brouillons et RFC courants - (voir -\begin_inset CommandInset href -LatexCommand href -name "le groupe de travail IP Version 6 (ipv6)" -target "http://www.ietf.org/html.charters/ipv6-charter.html" - -\end_inset - -). - Cela peut poser des problèmes d'interopérabilité avec les autres systèmes - d'exploitation. -\end_layout - -\begin_layout Subsection -A l'avenir -\end_layout - -\begin_layout Standard -\begin_inset CommandInset href -LatexCommand href -name "USAGI" -target "http://www.linux-ipv6.org/" - -\end_inset - - fait maintenant usage de la série des noyaux de développement Linux 2.5.x - afin d'incorporer toutes les extensions actuelles dans cette version de - développement; dans l'espoir que la série des noyaux 2.6.x comprenne une - véritable implémentation à jour d'IPv6. -\end_layout - -\begin_layout Section -A quoi ressemblent les adresses IPv6? -\end_layout - -\begin_layout Standard -\align left -Comme cela a été mentionné précédemment, les adresses IPv6 ont une longueur - de 128 bits. - Ce nombre de bits génère de très grands nombres, dont la quantité de chiffres - est supérieure à 39: -\end_layout - -\begin_layout Code - -2^128-1: 340282366920938463463374607431768211455 -\end_layout - -\begin_layout Standard -\align left -De tels nombres ne sont vraiment pas des adresses pouvant être mémorisées. - L'adresse IPv6 en elle-même est faite à partir d'une collection de bits - (comme pour IPv4, bien que cela soit rarement su). - Il y a une meilleure notation pour de si grands nombres, qui est l'hexadécimal. - En hexadécimal, 4 bits (mot aussi connu sous la dénomination de "nibble") - sont représentés par un chiffre ou un caractère de 0-9 et a-f (10-15). - Ce format réduit la longueur de l'adresse IPv6 à 32 caractères. -\end_layout - -\begin_layout Code - -2^128-1: 0xffffffffffffffffffffffffffffffff -\end_layout - -\begin_layout Standard -\align left -Cette représentation est encore peu praticable (possibilité de confusion - ou de perte d'un simple chiffre hexadécimal), c'est pourquoi les concepteurs - d'IPv6 ont choisi un format hexadécimal scindé en blocs de 16 bits, avec - comme séparateur le caractère ":". - De plus, le préfixe "0x" (le marqueur des valeurs hexadécimales utilisé - dans les langages de programmation) est ôté: -\end_layout - -\begin_layout Code - -2^128-1: ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff -\end_layout - -\begin_layout Standard -\align left -Une adresse utilisable (nous verrons les différents types d'adresse plus - tard) est par exemple: -\end_layout - -\begin_layout Code - -3ffe:ffff:0100:f101:0210:a4ff:fee3:9566 -\end_layout - -\begin_layout Standard -Dans un but de simplification, les zéros non significatifs de chaque bloc - de 16 bits sont omis: -\end_layout - -\begin_layout Code - -3ffe:ffff:0100:f101:0210:a4ff:fee3:9566 -> -\end_layout - -\begin_layout Code - -¬ 3ffe:ffff:100:f101:210:a4ff:fee3:9566 -\end_layout - -\begin_layout Standard -\align left -Une séquence de blocs de 16 bits ne comprenant que des zéros peut être remplacée - par -\begin_inset Quotes eld -\end_inset - - -\family typewriter -:: -\family default - -\begin_inset Quotes eld -\end_inset - -. - Mais pas plus d'une fois par adresse, sinon il ne s'agirait plus d'une - représentation unique. - -\end_layout - -\begin_layout Code - -3ffe:ffff:100:f101:0:0:0:1 -> 3ffe:ffff:100:f101::1 -\end_layout - -\begin_layout Standard -\align left -La plus importante réduction qui peut être observée est celle de l'adresse - localhost d'IPv6: -\end_layout - -\begin_layout Code - -0000:0000:0000:0000:0000:0000:0000:0001 -> ::1 -\end_layout - -\begin_layout Standard -\align left -Il existe aussi une représentation dite -\emph on -compacte -\emph default -, encodée en base85 ( -\begin_inset CommandInset href -LatexCommand href -name "RFC 1924 / A Compact Representation of IPv6 Addresses" -target "http://www.faqs.org/rfcs/rfc1924.html" - -\end_inset - -, publié le 1er avril 1996), jamais vue véritablement employée, sans doute - une blague de 1er avril; en voici cependant un exemple: -\end_layout - -\begin_layout Code - -# ipv6calc --addr_to_base85 3ffe:ffff:0100:f101:0210:a4ff:fee3:9566 -\end_layout - -\begin_layout Code - -Itu&-ZQ82s>J%s99FJXT -\end_layout - -\begin_layout Quotation -Info: -\emph on -ipv6calc -\emph default - est un programme de formatage d'adresse IPv6 et de conversion pouvant être - trouvé ici: -\lang ngerman - -\begin_inset CommandInset href -LatexCommand href -name "ipv6calc" -target "http://www.deepspace6.net/projects/ipv6calc.html" - -\end_inset - - ( -\begin_inset CommandInset href -LatexCommand href -name "miroir" -target "http://mirrors.bieringer.de/www.deepspace6.net/projects/ipv6calc.html" - -\end_inset - - ) -\end_layout - -\begin_layout Section -FAQ (Les bases) -\end_layout - -\begin_layout Subsection -Pourquoi IPv6 et non pas IPv5 comme successeur d'IPv4? -\end_layout - -\begin_layout Standard -\align left -Dans tout en-tête IP, les 4 premiers bits sont réservés à la version du - protocole. - C'est ainsi qu'un numéro de protocole entre 0 et 15 est théoriquement possible: -\end_layout - -\begin_layout Itemize -\align left -4: est déjà pris pour IPv4 -\end_layout - -\begin_layout Itemize -\align left -5: est réservé au protocole de flux ( -\emph on -Stream Protocol -\emph default -, ou STP - -\begin_inset CommandInset href -LatexCommand href -name "RFC 1819 / Internet Stream Protocol Version 2" -target "http://www.faqs.org/rfcs/rfc1819.html" - -\end_inset - -) (qui n'a jamais véritablement conquis le public) -\end_layout - -\begin_layout Standard -\align left -Le prochain numéro libre était 6. - Et voilà comment IPv6 était né! -\end_layout - -\begin_layout Subsection -L'adresse IPv6: pourquoi un tel nombre de bits? -\end_layout - -\begin_layout Standard -\align left -Lors de la conception d'IPv4, les gens pensaient que 32 bits seraient suffisants - pour le monde, dans sa globalité. - Rétrospectivement, 32 bits ont été jusqu'à maintenant suffisants, et seront - sans doute suffisants pour encore quelques années. - Cependant, 32 bits seront insuffisants à fournir dans le futur une adresse - globale à chaque périphérique réseau. - Pensez aux téléphones mobiles, aux voitures (incluant les périphériques - électroniques sur bus CAN), aux grille-pain, aux réfrigérateurs, aux interrupte -urs d'éclairage, -\emph on -etc -\emph default -. -\end_layout - -\begin_layout Standard -\align left -Les concepteurs ont alors choisi 128 bits, 4 fois plus en longueur et une - quantité 2^96 fois plus importante qu'IPv4 aujourd'hui. -\end_layout - -\begin_layout Standard -La quantité utilisable est cependant inférieure à ce qu'il semble. - La raison en est que, dans le schéma d'adresse défini actuellement, 64 - bits sont utilisés pour l'identifiant d'interface, les 64 autres bits sont - utilisés pour le routage. - Compte tenu des niveaux stricts actuels d'agrégation (/48, /32, ...), il est - encore possible d'"épuiser" cette quantité, mais bien heureusement, pas - dans un avenir proche. -\end_layout - -\begin_layout Standard -Voir aussi pour plus d'information le -\begin_inset CommandInset href -LatexCommand href -name "RFC 1715 / The H Ratio for Address Assignment Efficiency" -target "http://www.faqs.org/rfcs/rfc1715.html" - -\end_inset - - et le -\begin_inset CommandInset href -LatexCommand href -name "RFC 3194 / The Host-Density Ratio for Address Assignment Efficiency" -target "http://www.faqs.org/rfcs/rfc3194.html" - -\end_inset - -. -\end_layout - -\begin_layout Subsection -L'adresse IPv6: pourquoi un si petit nombre de bits pour sa nouvelle conception? -\end_layout - -\begin_layout Standard -Pendant ce temps, il y a (c'est possible) des gens sur Internet (je n'en - connais qu'un, Jim Fleming...) qui pensent déjà à IPv8, et même jusqu'à IPv16, - dont les conceptions sont loin d'être couramment reçues et implémentées. - En attendant, 128 bits était le meilleur choix qui pouvait être fait au - regard de l'en-tête placé au-dessus des données transportées. - En considérant le minimum de la taille de l'Unité Maximale de Transfert - ( -\emph on -Maximum Transfer Uni -\emph default -t, ou MTU), la longueur de l'en-tête en IPv4 est de 20 octets (c'est le - minimum, car elle peut monter à 60 octets avec les options IPv4), et en - IPv6, elle est de 48 octets (longueur constante). - C'est 3,4 % de la MTU en IPv4 et 3,8 % de la MTU en IPv6. - Cela signifie que le surplus de taille dû à l'en-tête est quasiment le - même. - Plus de bits dans les adresses auraient réclamé un en-tête de plus grande - taille, et par conséquent, un plus grand surplus. - Et si l'on prend aussi en compte la MTU maximale sur un lien courant (tel - Ethernet aujourd'hui): soit 1500 octets (dans des cas particuliers: 9 Ko - pour de grosses trames). - Finalement, cela n'aurait pas été d'une conception correcte si 10% ou 20% - des données transférées dans un paquet de la couche 3 avaient été utilisés - pour les adresses et non pas pour la charge utile. -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-addresstypes" - -\end_inset - -Les types d'adresse IPv6 -\end_layout - -\begin_layout Standard -Comme pour IPv4, l'adresse IPv6 peut être scindée en une partie réseau et - une partie hôte, par l'usage d'un masque de sous-réseau. -\end_layout - -\begin_layout Standard -IPv4 a montré que parfois cela serait bien si plus d'une adresse IP pouvaient - être assignées à une interface, chacune à un but bien précis (alias, multi-cast -). - Afin de demeurer ouvert à l'avenir, IPv6 offre davantage en permettant - à plus d'une adresse IPv6 d'être assignées à une interface. - Il n'y a actuellement aucune limite définie par aucun RFC, mais seulement - par l'implémentation de la pile IPv6 (afin de prévenir les attaques DoS). -\end_layout - -\begin_layout Standard -Pour employer le grand nombre de bits constitutifs de son adresse, IPv6 - définit des types d'adresse basés sur certains regroupements de ces bits, - qui, avec un peu de chance, ne devraient pas être modifiés à l'avenir (à - la différence d'aujourd'hui avec IPv4, et l'histoire des classes A, B et - C). -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_layout Standard -\align left -C'est ainsi que la totalité des bits est divisée en une partie réseau (les - 64 supérieurs) et en une partie hôte (les 64 inférieurs), afin de faciliter - l'auto-configuration. -\end_layout - -\begin_layout Section -Les adresses sans préfixe spécial -\end_layout - -\begin_layout Subsection -L'adresse localhost -\end_layout - -\begin_layout Standard -C'est une adresse spéciale pour l'interface de bouclage ( -\emph on -loopback -\emph default -), similaire à IPv4 avec sa "127.0.0.1". -\end_layout - -\begin_layout Code - -0000:0000:0000:0000:0000:0000:0000:0001 -\end_layout - -\begin_layout Standard -ou compressée: -\end_layout - -\begin_layout Code - -::1 -\end_layout - -\begin_layout Standard -\align left -Les paquets ayant cette adresse comme source ou destination ne devraient - jamais quittés l'hôte émetteur. -\end_layout - -\begin_layout Subsection -L'adresse non spécifiée -\end_layout - -\begin_layout Standard -C'est une adresse spéciale telle que -\begin_inset Quotes sld -\end_inset - -n'importe laquelle -\begin_inset Quotes srd -\end_inset - - ( -\begin_inset Quotes sld -\end_inset - -any -\begin_inset Quotes srd -\end_inset - -) ou -\begin_inset Quotes sld -\end_inset - -0.0.0.0 -\begin_inset Quotes srd -\end_inset - - en IPv4 . - Il s'agit pour IPv6 de: -\end_layout - -\begin_layout Code - -0000:0000:0000:0000:0000:0000:0000:0000 -\end_layout - -\begin_layout Standard -ou: -\end_layout - -\begin_layout Code - -:: -\end_layout - -\begin_layout Standard -Ces adresses sont essentiellement utilisées/vues dans les sockets d'écoute - (à toute adresse IPv6) ou dans les tables de routage. -\end_layout - -\begin_layout Standard -Note: l'adresse non spécifiée ne peut pas être utilisée comme adresse de - destination. -\end_layout - -\begin_layout Subsection -L'adresse IPv6 avec adresse IPv4 intégrée -\end_layout - -\begin_layout Standard -Il y a deux types d'adresse contenant une adresse IPv4 -\end_layout - -\begin_layout Subsubsection -L'adresse IPv6 mappée IPv4 -\end_layout - -\begin_layout Standard -Les adresses IPv6 compatibles seulement avec IPv4 sont parfois utilisées/vues - pour la création de socket par un démon disposant d'IPv6, mais à l'écoute - d'une adresse IPv4. -\end_layout - -\begin_layout Standard -Ces adresses sont définies par un préfixe spécial d'une longueur de 96 (a.b.c.d - est l'adresse IPv4): -\end_layout - -\begin_layout Code - -0:0:0:0:0:ffff:a.b.c.d/96 -\end_layout - -\begin_layout Standard -ou en format compressé: -\end_layout - -\begin_layout Code - -::ffff:a.b.c.d/96 -\end_layout - -\begin_layout Standard -Par exemple, l'adresse IPv4 1.2.3.4 ressemble à ceci: -\end_layout - -\begin_layout Code - -::ffff:1.2.3.4 -\end_layout - -\begin_layout Subsubsection -L'adresse IPv6 compatible IPv4 -\end_layout - -\begin_layout Standard -Utilisée pour le tunnelage automatique ( -\begin_inset CommandInset href -LatexCommand href -name "RFC 2893 / Transition Mechanisms for IPv6 Hosts and Routers" -target "http://www.faqs.org/rfcs/rfc2893.html" - -\end_inset - -), en cours de remplacement par -\begin_inset CommandInset ref -LatexCommand ref -name "le tunnelage 6to4" -reference "tunneling-6to4" - -\end_inset - -. -\end_layout - -\begin_layout Code - -0:0:0:0:0:0:a.b.c.d/96 -\end_layout - -\begin_layout Standard -ou en format compressé: -\end_layout - -\begin_layout Code - -::a.b.c.d/96 -\end_layout - -\begin_layout Section -La partie réseau, aussi appelée préfixe -\end_layout - -\begin_layout Standard -Les concepteurs ont défini certains types d'adresse et laissé un vaste champ - libre à de futures définitions, telles que l'émergence de nouvelles exigences - encore aujourd'hui inconnues. - L'architecture d'adressage IPv6 ( -\begin_inset CommandInset href -LatexCommand href -name "RFC 2373 de juillet 1998" -target "http://www.faqs.org/rfcs/rfc2373.html" - -\end_inset - -) définit le schéma d'adressage actuel, mais il y a déjà un nouveau brouillon - disponible: -\begin_inset CommandInset href -LatexCommand href -name "draft-ietf-ipngwg-addr-arch-*.txt" -target "ftp://ftp.ietf.org/internet-drafts/" - -\end_inset - -. -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_layout Standard -\align left -Jetons maintenant un coup d'oeil aux différents types de préfixe (et par - conséquent aux différents types d'adresse IPv6): -\end_layout - -\begin_layout Subsection -Le type d'adresse lien-local -\end_layout - -\begin_layout Standard -\align left -Ce sont des adresses particulières qui n'auront de validité que sur le lien - d'une interface. - En utilisant cette adresse comme adresse de destination le paquet ne devrait - jamais franchir un routeur. - C'est utile pour des communications sur un lien telles que: -\end_layout - -\begin_layout Itemize -\align left -Y a-t-il quelqu'un d'autre sur ce lien? -\end_layout - -\begin_layout Itemize -\align left -Y a-t-il quelqu'un d'autre sur ce lien ayant une adresse spéciale (on cherche - par exemple à détecter la présence d'un routeur)? -\end_layout - -\begin_layout Standard -\align left -Elles commencent par (où -\emph on - -\begin_inset Quotes sld -\end_inset - -x -\begin_inset Quotes srd -\end_inset - - -\emph default - est n'importe quel caractère hexadécimal, couramment -\emph on - -\begin_inset Quotes sld -\end_inset - -0 -\emph default - -\begin_inset Quotes srd -\end_inset - -) -\end_layout - -\begin_layout Code - -fe8x: <- actuellement le seul en usage. -\end_layout - -\begin_layout Code - -fe9x: -\end_layout - -\begin_layout Code - -feax: -\end_layout - -\begin_layout Code - -febx: -\end_layout - -\begin_layout Standard -Ce type d'adresse se trouve sur chaque interface disposant d'IPv6 après - une auto-configuration sans état (ce qui est couramment le cas). -\end_layout - -\begin_layout Subsection -Le type d'adresse site-local -\end_layout - -\begin_layout Standard -\align left -Ces adresses sont similaires à ce que le RFC 1918 ( -\begin_inset CommandInset href -LatexCommand href -name "RFC 1918 / Address Allocation for Private Internets" -target "http://www.faqs.org/rfcs/rfc1918.html" - -\end_inset - -) définit aujourd'hui pour IPv4, avec en plus l'avantage que celui qui utilise - ce type d'adresse a la capacité d'utiliser les 16 bits fournis pour un - maximum de 65536 sous-réseaux. - Comparable au 10.0.0.0/8 aujourd'hui en IPv4. -\end_layout - -\begin_layout Standard -\align left -Autre avantage: parce qu'il est possible avec IPv6 d'assigner plus d'une - seule adresse par interface, vous pouvez assigner une telle adresse site-local - en plus de l'adresse globale. -\end_layout - -\begin_layout Standard -\align left -Il commence par: -\end_layout - -\begin_layout Code - -fecx: <- le plus couramment utilisé. -\end_layout - -\begin_layout Code - -fedx: -\end_layout - -\begin_layout Code - -feex: -\end_layout - -\begin_layout Code - -fefx: -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Standard -(où -\emph on - -\begin_inset Quotes sld -\end_inset - -x -\begin_inset Quotes srd -\end_inset - - -\emph default - est n'importe quel caractère hexadécimal, couramment -\emph on - -\begin_inset Quotes sld -\end_inset - -0 -\emph default - -\begin_inset Quotes srd -\end_inset - -) -\end_layout - -\begin_layout Standard - -\lang english -Notez que des discussions sont en cours concernant la dépréciation de ce - type d'adresse en raison de nombreux problèmes. - Pour en savoir plus, lire: -\begin_inset CommandInset href -LatexCommand href -name "draft-ietf-ipv6-deprecate-site-local-XY.txt" -target "http://www.ietf.org/internet-drafts/" - -\end_inset - -. -\end_layout - -\begin_layout Standard - -\lang english -Pour des tests en laboratoire, de telles adresses restent un bon choix, - à mon humble avis. -\end_layout - -\begin_layout Subsection -Le type d'adresse -\begin_inset Quotes srd -\end_inset - -unicast globale (agrégeable) " -\end_layout - -\begin_layout Standard -\align left -Aujourd'hui, il y a un type d'adresse globale de défini (la première conception, - appelée -\begin_inset Quotes sld -\end_inset - -basée sur le fournisseur -\begin_inset Quotes srd -\end_inset - - a été abandonnée il y a déjà quelques années ( -\begin_inset CommandInset href -LatexCommand href -name "RFC 1884 / IP Version 6 Addressing Architecture [obsolete]" -target "http://www.faqs.org/rfcs/rfc1884.html" - -\end_inset - -), vous en trouverez des traces dans des sources anciennes du noyau Linux). -\end_layout - -\begin_layout Standard -\align left -Il commence par (les -\emph on -x -\emph default - étant des caractères hexadécimaux) -\end_layout - -\begin_layout Code - -2xxx: -\end_layout - -\begin_layout Code - -3xxx: -\end_layout - -\begin_layout Standard -Note: la dénomination -\begin_inset Quotes sld -\end_inset - -agrégeable -\begin_inset Quotes srd -\end_inset - - est abandonnée dans les brouillons actuels. -\begin_inset Newline newline -\end_inset - -Il y a quelques sous-types définis en plus, ci-dessous: -\end_layout - -\begin_layout Subsubsection -Les adresses de test 6bone -\end_layout - -\begin_layout Standard -\align left -Elles ont été les premières adresses globales à être définies et mises en - usage. - Elles commencent toutes par -\end_layout - -\begin_layout Code - -3ffe: -\end_layout - -\begin_layout Standard -Exemple: -\end_layout - -\begin_layout Code - -3ffe:ffff:100:f102::1 -\end_layout - -\begin_layout Standard -Une adresse spéciale de test 6bone, qui ne sera jamais globalement unique, - commence par -\end_layout - -\begin_layout Code - -3ffe:ffff: -\end_layout - -\begin_layout Standard -Et elle est la plupart du temps montrée dans les exemples passés, car si - des adresses réelles sont montrées, il est possible à quelqu'un de les - copier/coller dans ses propres fichiers de configuration. - Ce type d'inadvertance cause des duplications d'adresse globalement unique. - Cela pose de graves problèmes à l'hôte d'origine (par exemple recevoir - des paquets en réponse de requêtes qu'il n'a pas émises). -\begin_inset Newline newline -\end_inset - -Parce qu'IPv6 est maintenant en production, ce préfixe ne sera plus délégué - et probablement retiré du routage après 6 juin 2006 (voir -\begin_inset CommandInset href -LatexCommand href -name "RFC 3701 / 6bone Phaseout" -target "http://www.faqs.org/rfcs/rfc3701.html" - -\end_inset - -pour plus d'information). -\end_layout - -\begin_layout Subsubsection -Les adresses 6to4 -\end_layout - -\begin_layout Standard -\align left -Ce type d'adresse, conçu pour un mécanisme précis de tunnelage ( -\begin_inset CommandInset href -LatexCommand href -name "RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds" -target "http://www.faqs.org/rfcs/rfc3056.html" - -\end_inset - - et -\begin_inset CommandInset href -LatexCommand href -name "RFC 2893 / Transition Mechanisms for IPv6 Hosts and Routers" -target "http://www.faqs.org/rfcs/rfc2893.html" - -\end_inset - -), encode une adresse IPv4 donnée et un sous-réseau possible. - Il commence par -\end_layout - -\begin_layout Code - -2002: -\end_layout - -\begin_layout Standard -Par exemple, pour représenter 92.168.1.1/5: -\end_layout - -\begin_layout Code - -2002:c0a8:0101:5::1 -\end_layout - -\begin_layout Standard -Une petite ligne de commande peut vous aider à générer une telle adresse - à partir d'une adresse IPv4 donnée: -\end_layout - -\begin_layout Code - -ipv4="1.2.3.4"; sla="5"; printf "2002:%02x%02x:%02x%02x:%04x::1" `echo $ipv4 -\end_layout - -\begin_layout Code - -¬ | tr "." " "` $sla -\end_layout - -\begin_layout Standard -Voir aussi -\begin_inset CommandInset ref -LatexCommand ref -name "le tunnelage utilisant 6to4" -reference "tunneling-6to4" - -\end_inset - - et -\begin_inset CommandInset ref -LatexCommand ref -name "information concernant le relayage de 6to4 par les routeurs" -reference "information-joinipv6-6to4-tunneling" - -\end_inset - -. -\end_layout - -\begin_layout Subsubsection -Les adresses assignées par un fournisseur dans la hiérarchie de routage -\end_layout - -\begin_layout Standard -Ces adresses sont déléguées aux Fournisseurs d'Accès à Internet (FAI) et - commencent par -\end_layout - -\begin_layout Code - -2001: -\end_layout - -\begin_layout Standard -Les préfixes fournis aux FAI (aussi connus en tant que LIR) les plus importants - (propriétaires de backbone) sont délégués par les -\begin_inset CommandInset ref -LatexCommand ref -name "centres locaux d'enregistrement" -reference "information-majorregionregistries" - -\end_inset - - ( -\emph on -local registries -\emph default -) et ils possèdent actuellement un préfixe d'une longueur de 32. -\end_layout - -\begin_layout Standard -Tout client peut obtenir de son FAI un préfixe d'une longueur de 48. -\end_layout - -\begin_layout Subsubsection - -\lang english -Adresses réservées aux exemples et à la documentation -\end_layout - -\begin_layout Standard - -\lang english -Actuellement, deux blocs d'adresses sont réservés aux exemples et à la documenta -tion: -\end_layout - -\begin_layout Code - -3ffe:ffff::/32 -\end_layout - -\begin_layout Code - -2001:0DB8::/32 EXAMPLENET-WF -\end_layout - -\begin_layout Standard - -\lang english -Ces blocs d'adresses devraient être filtrés sur la base des adresses source - et, si possible, NE devraient PAS être acheminés par les routeurs en bordure - d'Internet vers ce dernier. -\end_layout - -\begin_layout Subsection -Les adresses multicast -\end_layout - -\begin_layout Standard -\align left -Les adresses multicast sont utilisées pour les services y afférents. -\end_layout - -\begin_layout Standard -\align left -Elles commencent par (xx est la valeur de la portée) -\end_layout - -\begin_layout Code - -ffxy: -\end_layout - -\begin_layout Standard -Elles se répartissent en différentes portées et types: -\end_layout - -\begin_layout Subsubsection -La portée multicast -\end_layout - -\begin_layout Standard -La portée multicast est un paramètre spécifiant la distance maximale qu'un - paquet multicast peut prendre vis-à-vis de son entité émettrice. -\end_layout - -\begin_layout Standard -Actuellement, les régions suivantes (portées) sont définies: -\end_layout - -\begin_layout Itemize -ffx1: noeud-local, ces paquets ne quittent jamais le noeud. -\end_layout - -\begin_layout Itemize -ffx2: lien-local, ces paquets ne sont jamais transmis par les routeurs, - ils ne quittent par conséquent jamais le lien spécifié. -\end_layout - -\begin_layout Itemize -ffx5: site-local, ces paquets ne quittent jamais le site. -\end_layout - -\begin_layout Itemize -ffx8: organisation-locale, ces paquets ne quittent jamais l'organisation - (pas si simple à implémenter, cela doit être par le protocole de routage). -\end_layout - -\begin_layout Itemize -ffxe: portée globale. -\end_layout - -\begin_layout Itemize -les autres sont réservées. -\end_layout - -\begin_layout Subsubsection -Les types multicast -\end_layout - -\begin_layout Standard -Il y a déjà de nombreux types définis/réservés (voir le -\begin_inset CommandInset href -LatexCommand href -name "RFC 2373 / IP Version 6 Addressing Architecture" -target "http://www.faqs.org/rfcs/rfc2373.html" - -\end_inset - - pour les détails). - Quelques exemples en sont: -\end_layout - -\begin_layout Itemize -Adresse de tous les noeuds: ID = 1h, correspond aux adresses de tous les - hôtes présents sur le noeud local (ff01:0:0:0:0:0:0:1) ou au lien connecté - (ff02:0:0:0:0:0:0:1). -\end_layout - -\begin_layout Itemize -Adresse de tous les routeurs: ID = 2h, correspond aux adresses de tous les - routeurs présents sur le noeud local (ff01:0:0:0:0:0:0:2), sur le lien - connecté (ff02:0:0:0:0:0:0:2), ou encore sur le site local (ff05:0:0:0:0:0:0:2). -\end_layout - -\begin_layout Subsubsection -L'adresse multicast de sollicitation du lien-local -\end_layout - -\begin_layout Standard -Adresse multicast spéciale utilisée comme adresse de destination dans la - découverte de voisinage, car à la différence d'IPv4, ARP n'existe plus - dans IPv6. -\end_layout - -\begin_layout Standard -Un exemple de cette adresse ressemble à ceci -\end_layout - -\begin_layout Code - -ff02::1:ff00:1234 -\end_layout - -\begin_layout Standard -Le préfixe utilisé montre qu'il s'agit d'une adresse multicast lien-local. - Le suffixe est généré à partir de l'adresse de destination. - Dans cet exemple, un paquet devrait être envoyé à l'adresse -\begin_inset Quotes eld -\end_inset - -fe80::1234 -\begin_inset Quotes erd -\end_inset - -, mais la pile réseau ne connaît pas l'actuelle adresse MAC de la couche - 2. - Elle remplace les 104 bits supérieurs par -\begin_inset Quotes eld -\end_inset - -ff02:0:0:0:0:1:ff00::/104 -\begin_inset Quotes erd -\end_inset - - et laisse les 24 bits inférieurs inchangés. - Cette adresse est maintenant utilisée 'sur le lien' afin de trouver le - noeud correspondant, lequel va devoir émettre une réponse contenant son - adresse MAC de couche 2. -\end_layout - -\begin_layout Subsection -Les adresses anycast -\end_layout - -\begin_layout Standard -Les adresses anycast sont des adresses spéciales utilisées pour couvrir - des besoins tels que déterminer le serveur DNS le plus proche, le serveur - DHCP le plus proche, ou tout groupe dynamique similaire. - Les adresses sont prises dans l'espace d'adressage unicast (agrégeable - ou site-local pour le moment). - Le mécanisme anycast (au regard du client) sera pris en compte par un protocole - de routage dynamique. -\end_layout - -\begin_layout Standard -Note: Les adresses anycast ne peuvent être utilisées comme adresse source, - elles sont utilisables uniquement comme adresse de destination. -\end_layout - -\begin_layout Subsubsection -L'adresse anycast de routeur de sous-réseau -\end_layout - -\begin_layout Standard -Un simple exemple d'une adresse anycast est celle d'un routeur de sous-réseau. - Soit un noeud avec l'adresse IPv6 suivante assignée: -\end_layout - -\begin_layout Code - -3ffe:ffff:100:f101:210:a4ff:fee3:9566/64 <- L'adresse du noeud -\end_layout - -\begin_layout Standard -L'adresse anycast de routeur de sous-réseau sera créée en laissant totalement - blanc le suffixe (les 64 bits inférieurs): -\end_layout - -\begin_layout Code - -3ffe:ffff:100:f101::/64 <- l'adresse anycast de routeur de sous-réseau -\end_layout - -\begin_layout Section -Les types d'adresse (partie hôte) -\end_layout - -\begin_layout Standard -\align left -En ce qui concerne les questions d'auto-configuration et de mobilité, Il - a été décidé d'utiliser les 64 bits inférieurs de la partie hôte de l'adresse - pour la plupart des types d'adresse actuels. - Conséquemment, chaque sous-réseau détient une grande quantité d'adresses. - -\end_layout - -\begin_layout Standard -\align left -Cette partie hôte peut être différemment considérée: -\end_layout - -\begin_layout Subsection -L'adresse calculée automatiquement (dite aussi -\begin_inset Quotes sld -\end_inset - -sans état -\begin_inset Quotes srd -\end_inset - -) -\end_layout - -\begin_layout Standard -Avec l'auto-configuration, la partie hôte de l'adresse est calculée en convertis -sant l'adresse MAC d'une interface (si disponible), avec la méthode EUI-64, - en une adresse IPv6 unique. - Si aucune adresse MAC n'est disponible pour le périphérique en question - (ce qui arrive par exemple sur les périphériques virtuels), quelque chose - d'autre (comme l'adresse IPv4 ou l'adresse MAC d'une interface physique) - est utilisée à la place. -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_layout Standard -\align left -Considérons à nouveau le premier exemple: -\end_layout - -\begin_layout Code - -3ffe:ffff:100:f101:210:a4ff:fee3:9566 -\end_layout - -\begin_layout Standard -\align left -ici, -\end_layout - -\begin_layout Code - -210:a4ff:fee3:9566 -\end_layout - -\begin_layout Standard -\align left -est la partie hôte calculée à partir de l'adresse MAC de la NIC -\end_layout - -\begin_layout Code - -00:10:A4:E3:95:66 -\end_layout - -\begin_layout Standard -\align left -en utilisant -\begin_inset CommandInset href -LatexCommand href -name "IEEE EUI-64" -target "http://standards.ieee.org/regauth/oui/tutorials/EUI64.html" - -\end_inset - - conçue pour les identifiants EUI-48. -\end_layout - -\begin_layout Subsubsection -Le problème d'incursion possible dans la sphère privée ( -\emph on -privacy problem -\emph default -) avec les adresses automatiquement calculées, et une solution -\end_layout - -\begin_layout Standard -\align left -Parce que la partie hôte "automatiquement calculée -\begin_inset Quotes srd -\end_inset - - est globalement unique (sauf lorsqu'un fabriquant de NIC utilise la même - adresse MAC sur plus d'une NIC), la traque grâce à un client ( -\emph on -client tracking -\emph default -) est possible sur l'hôte, dès lors qu'aucun proxy d'aucune sorte n'est - utilisé. -\end_layout - -\begin_layout Standard -\align left -C'est un problème connu, et une solution a été apportée: l'extension -\begin_inset Quotes sld -\end_inset - -sphère privée -\begin_inset Quotes srd -\end_inset - -, définie dans le RFC 3041 ( -\begin_inset CommandInset href -LatexCommand href -name "RFC 3041 / Privacy Extensions for Stateless Address" -target "http://www.faqs.org/rfcs/rfc3041.html" - -\end_inset - -; il y a déjà aussi un brouillon plus récent disponible: -\begin_inset CommandInset href -LatexCommand href -name "draft-ietf-ipngwg-temp-addresses-*.txt" -target "ftp://ftp.ietf.org/internet-drafts/" - -\end_inset - -). - Le principe est d'utiliser une valeur aléatoire et une valeur statique - à partir desquelles un nouveau suffixe est généré à intervalle régulier. - Note: ce n'est raisonnable que pour des connexions client sortantes, et - n'est pas vraiment utile pour des machines réputées être des serveurs. -\end_layout - -\begin_layout Subsection -La configuration manuelle -\end_layout - -\begin_layout Standard -Pour les serveurs, il est probablement plus aisé de se rappeler d'adresses - plus simples; cela peut aussi se faire. - Il est possible d'assigner une adresse IPv6 additionnelle à une interface, - par exemple -\end_layout - -\begin_layout Code - -3ffe:ffff:100:f101::1 -\end_layout - -\begin_layout Standard -Pour les suffixes tels que -\begin_inset Quotes sld -\end_inset - -::1 -\begin_inset Quotes srd -\end_inset - -, montré dans l'exemple ci-dessus, il est requis que le septième bit le - plus significatif soit positionné à 0 (le bit universel/local d'un identifiant - automatiquement généré). - Certaines autres (à part celles qui n'ont pas étaient choisies) combinaisons - de bits sont réservées aux adresses anycast. -\end_layout - -\begin_layout Section -La longueur de préfixe nécessaire au routage -\end_layout - -\begin_layout Standard -Dans les premières phases de la conception, il était prévu d'utiliser une - approche intégrale de routage hiérarchique, et ce, afin de réduire au maximum - la taille des tables de routage. - A la base du raisonnement sous-tendu par cette approche, il y a la prise - en compte du nombre grandissant des entrées de routage IPv4 au coeur des - routeurs (supérieur à 104 000 en mai 2001), la nécessité de réduire ce - nombre afin de diminuer le besoin en mémoire du matériel (piloté par Circuit - Intégré d'Application Spécifique, -\emph on -Application Specified Integrated Circuit -\emph default -, ou ASIC) maintenant les tables de routage, et, en conséquence, d'accroître - la vitesse (dans l'espoir que moins d'entrées génèrent des recherches plus - rapides). -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_layout Standard -\align left -Aujourd'hui, le point de vue est que le routage sera conçu quasi-hiérarchiquemen -t pour les réseaux ayant seulement un fournisseur de service. - Pour plus d'une connexion à un ISP, ce n'est pas possible, et cela relève - du problème de la multi-résidence (des informations sur la multi-résidence: -\begin_inset CommandInset href -LatexCommand href -name "drafts*multi6*" -target "http://www.ietf.org/internet-drafts/" - -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name " IPv6 Multihoming Solutions" -target "http://arneill-py.sacramento.ca.us/ipv6mh/" - -\end_inset - - -\end_layout - -\begin_layout Subsection -La longueur du préfixe (aussi connue en tant que "masque de réseau") -\end_layout - -\begin_layout Standard -\align left -Comme pour IPv4, la notion de chemin de réseau routable nécessaire au routage - a ici sa place. - Parce que la notation standard d'un masque réseau n'est pas très agréable - pour un adressage sur 128 bits, les concepteurs ont employé le schéma du - Routage Inter-Domaines IPv4 Sans Classe ( -\emph on -IPv4 Classless Inter Domain Routing -\emph default -, ou CIDR, défini dans le -\begin_inset CommandInset href -LatexCommand href -name " RFC 1519 / Classless Inter-Domain Routing" -target "http://www.faqs.org/rfcs/rfc1519.html" - -\end_inset - -), dans lequel est spécifié le nombre de bits de l'adresse devant être utilisé - pour le routage. - Il est aussi connu comme notation -\begin_inset Quotes sld -\end_inset - -slash -\begin_inset Quotes srd -\end_inset - -. -\end_layout - -\begin_layout Standard -\align left -Un exemple: -\end_layout - -\begin_layout Code - -3ffe:ffff:100:1:2:3:4:5/48 -\end_layout - -\begin_layout Standard -\align left -De cette notation seront extraits: -\end_layout - -\begin_layout Itemize -le réseau: -\end_layout - -\begin_layout Code - -3ffe:ffff:0100:0000:0000:0000:0000:0000 -\end_layout - -\begin_layout Itemize -le masque de réseau: -\end_layout - -\begin_layout Code - -ffff:ffff:ffff:0000:0000:0000:0000:0000 -\end_layout - -\begin_layout Subsection -La correspondance à une route -\end_layout - -\begin_layout Standard -Dans des conditions normales ( -\emph on -i.e. - -\emph default - sans QoS), de la recherche dans une table de routage résulte la route ayant - le plus grand nombre de bits d'adresse significatifs; autrement dit, la - route avec le plus grand préfixe correspond la première. -\end_layout - -\begin_layout Standard -Par exemple, si une table de routage affiche les entrées suivantes (la liste - est incomplète): -\end_layout - -\begin_layout Code - -3ffe:ffff:100::/48 :: U 1 0 0 sit1 -\end_layout - -\begin_layout Code - -2000::/3 ::192.88.99.1 UG 1 0 0 tun6to4 -\end_layout - -\begin_layout Standard -Ci-dessous, les adresses de destination des paquets IPv6 dont le trafic - sera routé au travers du périphérique désigné -\end_layout - -\begin_layout Code - -3ffe:ffff:100:1:2:3:4:5/48 -> trafic routé au travers du périphérique - sit1 -\end_layout - -\begin_layout Code - -3ffe:ffff:200:1:2:3:4:5/48 -> trafic routé au travers du périphérique - tun6to4 -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-systemcheck" - -\end_inset - -La vérification d'un système prêt pour IPv6 -\end_layout - -\begin_layout Standard -\align left -Avant de commencer à utiliser IPv6 sur votre hôte Linux, vous avez à tester - si votre système est prêt pour IPv6. - Pour ce faire, vous aurez peut-être d'abord un peu de travail. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "systemcheck-kernel" - -\end_inset - -Un noyau prêt pour IPv6 -\end_layout - -\begin_layout Standard -\align left -Les distributions contemporaines de Linux comportent déjà un noyau prêt - pour IPv6, les capacités IPv6 sont en général compilées dans un module, - mais il est possible que ce module ne soit pas chargé automatiquement au - démarrage. -\end_layout - -\begin_layout Standard -Voir la page -\begin_inset CommandInset href -LatexCommand href -name "IPv6+Linux-status-distributions" -target "http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status-distributions.html" - -\end_inset - - pour obtenir les informations les plus à jour. -\end_layout - -\begin_layout Standard - -\series bold -Note: vous ne devriez plus utiliser les noyaux de la série 2.2.x; car ils - ne sont pas assez à jour vis-à-vis d'IPv6. -\end_layout - -\begin_layout Subsection -Vérifier la présence du support IPv6 dans le noyau actuellement en cours - d'utilisation -\end_layout - -\begin_layout Standard -\align left -Afin de vérifier si oui ou non votre actuel noyau supporte IPv6, jetez un - coup d'oeil dans votre système de fichiers /proc. - Les entrées qui suivent doivent être présentes: -\end_layout - -\begin_layout Code - -/proc/net/if_inet6 -\end_layout - -\begin_layout Standard -\align left -Un bref test automatique ressemble à: -\end_layout - -\begin_layout Code - -# test -f /proc/net/if_inet6 && echo "Running kernel is IPv6 ready" -\end_layout - -\begin_layout Standard -\align left -Si cela échoue, cela peut être parce que le module IPv6 n'est pas chargé. -\end_layout - -\begin_layout Subsection -Essayer de charger le module IPv6 -\end_layout - -\begin_layout Standard -\align left -Vous pouvez tenter de charger le module IPv6 en exécutant -\end_layout - -\begin_layout Code - -# modprobe ipv6 -\end_layout - -\begin_layout Standard -\align left -Si c'est un succès, la présence de ce module sera testée comme par magie - par la ligne suivante: -\end_layout - -\begin_layout Code - -# lsmod |grep -w 'ipv6' && echo "IPv6 module successfully loaded" -\end_layout - -\begin_layout Standard -\align left -Et la vérification montrée plus haut devrait maintenant se faire elle aussi - avec succès. -\end_layout - -\begin_layout Standard -Note: enlever le module n'est actuellement pas supporté et peut aboutir, - sous certaines conditions, au -\emph on -crash -\emph default - du noyau. -\end_layout - -\begin_layout Subsubsection -Le chargement automatique du module -\end_layout - -\begin_layout Standard -Il est possible d'automatiser le chargement du module IPv6 à la demande. - Vous avez juste à ajouter les lignes qui suivent dans le fichier de configurati -on du chargeur de modules du noyau (normalement /etc/modules.conf ou /etc/conf.mod -ules): -\end_layout - -\begin_layout Code - -alias net-pf-10 ipv6 # chargement automatique du module IPv6 à la demande -\end_layout - -\begin_layout Standard -Il est aussi possible de mettre hors service le chargement automatique du - module IPv6 en utilisant la ligne suivante -\end_layout - -\begin_layout Code - -alias net-pf-10 off # rend indisponible le chargement automatique du module - IPv6 -\end_layout - -\begin_layout Standard -Note additionnelle: pour les noyaux de la série 2.6,le mécanisme du chargeur - de modules a été repensé. - Le nouveau fichier de configuration s'appellera /etc/modprobe.conf au lieu - de /etc/modules.conf. - Pour de plus amples détails voir -\begin_inset CommandInset href -LatexCommand href -name "le module-init-tool" -target "http://his.luky.org/ftp/mirrors/linux/kernel/people/rusty/modules/" - -\end_inset - - -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_layout Itemize -\align left -Compiler un noyau à partir des seules sources brutes (facile, si vous connaissez - les options dont vous avez besoin) -\end_layout - -\begin_layout Itemize -Recompiler les sources du noyau fournies par votre distribution Linux (parfois, - ce n'est si simple que ça) -\end_layout - -\begin_layout Itemize -\align left -Compiler un noyau avec l'extension USAGI -\end_layout - -\begin_layout Standard -\align left -Si vous vous décidez à compiler un noyau, vous devriez avoir une certaine - expérience dans la compilation de noyau et lire l' -\begin_inset CommandInset href -LatexCommand href -name "HOWTO sur le noyau Linux" -target "http://www.tldp.org/HOWTO/Kernel-HOWTO.html" - -\end_inset - -. -\end_layout - -\begin_layout Standard -La comparaison pratiquement la plus à jour entre un noyau original et un - noyau comprenant USAGI est disponible dans -\begin_inset CommandInset href -LatexCommand href -name "IPv6+Linux-status-kernel" -target "http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status-kernel.html" - -\end_inset - -. -\end_layout - -\begin_layout Subsubsection -Compiler un noyau uniquement à partir des sources originales (vanille) -\end_layout - -\begin_layout Standard -Plus d'éléments concernant la compilation d'un noyau disposant d'IPv6 peuvent - par exemple être trouvés dans -\begin_inset CommandInset href -LatexCommand href -name "IPv6-HOWTO-2#kernel" -target "http://www.bieringer.de/linux/IPv6/IPv6-HOWTO/IPv6-HOWTO-2.html#kernel" - -\end_inset - -. -\end_layout - -\begin_layout Standard -Note: vous devriez autant que possible utiliser les noyaux de la série 2.6.x - ou supérieures,car le support IPv6 de la série 2.4.x n'obtiendra qu'un portage - partielet celui de la série 2.2.x est désespérément obsolète.). -\end_layout - -\begin_layout Subsubsection -Compiler un noyau avec l'extension USAGI -\end_layout - -\begin_layout Standard -\align left -Comme pour le noyau vanille, seulement recommandé aux utilisateurs avancés, - déjà familiarisés avec IPv6 et la compilation noyau. - Voir aussi -\begin_inset CommandInset href -LatexCommand href -name "la FAQ du projet USAGI" -target "http://www.linux-ipv6.org/faq.html" - -\end_inset - - et -\begin_inset CommandInset href -LatexCommand href -name "comment obtenir le meilleur support IPv6 avec Linux (article)" -target "http://www.deepspace6.net/docs/best_ipv6_support.html" - -\end_inset - - ( -\begin_inset CommandInset href -LatexCommand href -name "miroir" -target "http://mirrors.bieringer.de/www.deepspace6.net/docs/best_ipv6_support.html" - -\end_inset - -). -\end_layout - -\begin_layout Subsection -Les périphériques réseau prêts pour IPv6 -\end_layout - -\begin_layout Standard -Les périphériques réseau n'ont pas tous déjà (ou n'auront jamais, pour certains) - la capacité de transporter des paquets IPv6. - L'état actuel de la situation quant à ce sujet peut être trouvé -\begin_inset CommandInset href -LatexCommand href -name "ici" -target "http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status-kernel.html#transport" - -\end_inset - -. -\end_layout - -\begin_layout Standard -A cause de l'implémentation de la structure de la couche réseau du noyau, - un problème majeur est qu'un paquet IPv6 n'est pas réellement reconnu par - son numéro d'en-tête IP (6 au lieu de 4). - Il est reconnu par le numéro de protocole de la couche transport 2. - En conséquence, tout protocole n'utilisant pas un tel numéro de protocole - ne peut pas distribuer les paquets IPv6. - Note: le paquet est bien encore transporté sur le lien, mais, côté récepteur, - la distribution ne fonctionne pas (vous pouvez observer cela par exemple - avec tcpdump). -\end_layout - -\begin_layout Subsubsection -Actuellement connus pour ne jamais être -\begin_inset Quotes sld -\end_inset - -capables de lien IPv6 -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Itemize -IP sur Ligne Série ( -\emph on -Serial Line IP -\emph default -, SLIP, -\begin_inset CommandInset href -LatexCommand href -name "RFC 1055 / SLIP" -target "http://www.faqs.org/rfcs/rfc1055.html" - -\end_inset - -), serait aujourd'hui mieux dénommé SLIPv4, noms de périphérique: slX -\end_layout - -\begin_layout Itemize -IP sur Ligne Parallèle, comme pour SLIP, noms de périphérique: plipX -\end_layout - -\begin_layout Itemize -RNIS avec encapsulation -\emph on -rawip -\emph default -, noms de périphérique: isdnX -\end_layout - -\begin_layout Subsubsection -Actuellement connu pour ne pas être -\begin_inset Quotes sld -\end_inset - -capable de lien IPv6 -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Itemize -RNIS avec encapsulation -\emph on -syncppp -\emph default -, noms de périphérique: ipppX (au sujet de la conception de ipppd, il fusionnera - dans une couche PPP plus abstraite dans la série des noyaux 2.5.x) -\end_layout - -\begin_layout Section -Les outils de configuration réseau prêts pour IPv6 -\end_layout - -\begin_layout Standard -\align left -Vous n'irez pas loin si vous faites tourner un noyau prêt pour IPv6 mais - sans avoir d'outils pour configurer IPv6. - Il existe plusieurs paquetages pouvant servir à cette tâche. -\end_layout - -\begin_layout Subsection -Le paquetage net-tools -\end_layout - -\begin_layout Standard -\align left -Le paquetage net-tools inclut certains outils tels que ifconfig et route - qui vous aideront à configurer IPv6 sur une interface. - Regardez la sortie d'ifconfig? ou celle de route?, et si vous y voyez quelque - chose comme IPv6, ou inet6, c'est que l'outil est prêt pour IPv6. -\end_layout - -\begin_layout Standard -\align left -Vérification magique: -\end_layout - -\begin_layout Code - -# /sbin/ifconfig -? 2>& 1 | grep -qw 'inet6' && echo "utility 'ifconfig' - is -\end_layout - -\begin_layout Code - -¬ IPv6-ready" -\end_layout - -\begin_layout Standard -\align left -La même vérification peut être réalisée pour route: -\end_layout - -\begin_layout Code - -# /sbin/route -? 2>& 1 | grep -qw 'inet6' && echo "utility 'route' is IPv6-ready -" -\end_layout - -\begin_layout Subsection -Le paquetage iproute -\end_layout - -\begin_layout Standard -\align left -Alexey N. - Kuznetsov (actuellement la personne qui maintient le code réseau de Linux) - a créé un jeu d'outils qui configure le réseau à travers le périphérique - netlink. - Vous aurez plus de fonctionnalités en utilisant ce jeu d'outils que n'en - fournit net-tools, mais il n'est pas très bien documenté et n'est pas vraiment - fait pour les êtres pusillanimes. -\end_layout - -\begin_layout Code - -# /sbin/ip 2>&1 | grep -qw 'inet6' && echo "utility 'ip' is IPv6-ready" -\end_layout - -\begin_layout Standard -Si le programme /sbin/ip n'est pas trouvé, je vous recommande alors d'installer - le paquetage iproute. -\end_layout - -\begin_layout Itemize -Vous pouvez le récupérer à partir de votre distribution Linux (s'il s'y - trouve) -\end_layout - -\begin_layout Itemize -Vous pouvez télécharger l'archive tar et recompiler: -\begin_inset CommandInset href -LatexCommand href -name "sources sur le FTP d'origine" -target "ftp://ftp.inr.ac.ru/ip-routing/" - -\end_inset - - et miroir (manquant) -\end_layout - -\begin_layout Itemize -Vous pouvez rechercher le bon paquetage RPM ici, -\begin_inset CommandInset href -LatexCommand href -name "RPMfind pour iproute" -target "http://rpmfind.net/linux/rpm2html/search.php?query=iproute" - -\end_inset - - (parfois la reconstruction d'un paquetage SRPM est recommandée) -\end_layout - -\begin_layout Section -Les programmes de test/déboguage prêts pour IPv6 -\end_layout - -\begin_layout Standard -\align left -Après avoir préparé votre système pour IPv6, vous voudrez établir des communicat -ions en utilisant IPv6. - Vous devriez d'abord apprendre comment examiner les paquets IPv6 avec un - programme dit -\begin_inset Quotes sld -\end_inset - -renifleur -\begin_inset Quotes srd -\end_inset - - (un -\emph on -sniffer -\emph default -). - Cela est fortement conseillé, car cela peut aider à fournir très rapidement - un diagnostic en cas de déboguage/dépannage. -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "program-ping6" - -\end_inset - - ping IPv6 -\end_layout - -\begin_layout Standard -Ce programme est normalement inclus dans le paquetage -\emph on -iputils -\emph default -. - Il est conçu pour réaliser de simples tests du transport en émettant des - paquets de requête d'écho ( -\emph on -echo-request -\emph default -) ICMPv6 et en attendant les paquets de réponse en écho ( -\emph on -echo-reply -\emph default -) ICMPv6. -\end_layout - -\begin_layout Standard -Usage -\end_layout - -\begin_layout Code - -# ping6 -\end_layout - -\begin_layout Code - -# ping6 -\end_layout - -\begin_layout Code - -# ping6 [-I ] -\end_layout - -\begin_layout Standard -Exemple -\end_layout - -\begin_layout Code - -# ping6 -c 1 ::1 -\end_layout - -\begin_layout Code - -PING ::1(::1) from ::1 : 56 data bytes -\end_layout - -\begin_layout Code - -64 bytes from ::1: icmp_seq=0 hops=64 time=292 usec -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - ---- ::1 ping statistics --- -\end_layout - -\begin_layout Code - -1 packets transmitted, 1 packets received, 0% packet loss -\end_layout - -\begin_layout Code - -round-trip min/avg/max/mdev = 0.292/0.292/0.292/0.000 ms -\end_layout - -\begin_layout Standard -Info: ping6 a besoin d'un accès brut à la socket, il faut donc les permissions - root. - Par conséquent, s'il n'y a pas d'utilisateur root pouvant utiliser ping6, - deux problèmes peuvent se poser ici: -\end_layout - -\begin_layout Enumerate -ping6 n'est pas sur le chemin de l'utilisateur (probablement, car ping6 - est généralement stocké dans /usr/sbin -> ajouter au chemin (pas vraiment - recommandé) -\end_layout - -\begin_layout Enumerate -ping6 ne s'exécute pas proprement, généralement, c'est qu'il y a des permissions - root manquantes -> chmod u+s /usr/sbin/ping6 -\end_layout - -\begin_layout Subsubsection -Spécifier une interface à ping IPv6 -\end_layout - -\begin_layout Standard -En spécifiant uniquement une adresse lien-local à ping IPv6, le noyau ne - sait pas par quel périphérique (physique ou virtuel) il doit émettre le - paquet - chaque périphérique a une adresse lien-local. - Un essai aura pour résultat un message d'erreur: -\end_layout - -\begin_layout Code - -# ping6 fe80::212:34ff:fe12:3456 -\end_layout - -\begin_layout Code - -connect: Invalid argument -\end_layout - -\begin_layout Standard -Dans ce cas vous devez en plus spécifier l'interface comme ci-dessous: -\end_layout - -\begin_layout Code - -# ping6 -I eth0 -c 1 fe80::2e0:18ff:fe90:9205 -\end_layout - -\begin_layout Code - -PING fe80::212:23ff:fe12:3456(fe80::212:23ff:fe12:3456) from -\end_layout - -\begin_layout Code - -¬ fe80::212:34ff:fe12:3478 eth0: 56 data bytes -\end_layout - -\begin_layout Code - -64 bytes from fe80::212:23ff:fe12:3456: icmp_seq=0 hops=64 time=445 usec -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - ---- fe80::2e0:18ff:fe90:9205 ping statistics --- -\end_layout - -\begin_layout Code - -1 packets transmitted, 1 packets received, 0% packet loss round-trip -\end_layout - -\begin_layout Code - -¬ min/avg/max/mdev = 0.445/0.445/0.445/0.000 ms -\end_layout - -\begin_layout Subsubsection -Ping6 et les adresses multicast -\end_layout - -\begin_layout Standard -Un mécanisme intéressant pour détecter les hôtes IPv6 actifs sur un lien - est de lancer ping6 sur l'adresse multicast lien-local tous-noeuds ( -\emph on -all-node -\emph default -): -\end_layout - -\begin_layout Code - -# ping6 -I eth0 ff02::1 -\end_layout - -\begin_layout Code - -PING ff02::1(ff02::1) from fe80:::2ab:cdff:feef:012356 eth0: 56 data bytes -\end_layout - -\begin_layout Code - -64 bytes from ::1: icmp_seq=1 ttl=64 time=0.104 ms -\end_layout - -\begin_layout Code - -64 bytes from fe80::212:34ff:fe12:3450: icmp_seq=1 ttl=64 time=0.549 ms (DUP!) - -\end_layout - -\begin_layout Standard -A la différence d'IPv4, où les réponses à un ping sur l'adresse de diffusion - ( -\emph on -broadcast -\emph default -) peuvent être rendues indisponibles, en IPv6, ce comportement ne peut pas - être actuellement rendu indisponible, sauf par un pare-feu IPv6 local. -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "program-traceroute6" - -\end_inset - - traceroute6 IPv6 -\end_layout - -\begin_layout Standard -Ce programme est normalement inclus dans le paquetage -\emph on -iputils -\emph default -. - C'est un programme similaire au traceroute d'IPv4. - En voici un exemple: -\end_layout - -\begin_layout Code - -# traceroute6 www.6bone.net -\end_layout - -\begin_layout Code - -traceroute to 6bone.net (3ffe:b00:c18:1::10) from 3ffe:ffff:0000:f101::2, - 30 -\end_layout - -\begin_layout Code - -¬ hops max, 16 byte packets -\end_layout - -\begin_layout Code - - 1 localipv6gateway (3ffe:ffff:0000:f101::1) 1.354 ms 1.566 ms 0.407 ms -\end_layout - -\begin_layout Code - - 2 swi6T1-T0.ipv6.switch.ch (3ffe:2000:0:400::1) 90.431 ms 91.956 ms 92.377 ms - -\end_layout - -\begin_layout Code - - 3 3ffe:2000:0:1::132 (3ffe:2000:0:1::132) 118.945 ms 107.982 ms 114.557 ms - -\end_layout - -\begin_layout Code - - 4 3ffe:c00:8023:2b::2 (3ffe:c00:8023:2b::2) 968.468 ms 993.392 ms 973.441 - ms -\end_layout - -\begin_layout Code - - 5 3ffe:2e00:e:c::3 (3ffe:2e00:e:c::3) 507.784 ms 505.549 ms 508.928 ms -\end_layout - -\begin_layout Code - - 6 www.6bone.net (3ffe:b00:c18:1::10) 1265.85 ms * 1304.74 ms -\end_layout - -\begin_layout Standard -Note: à la différence de certaines versions contemporaines du traceroute - d'IPv4, qui peuvent utiliser les paquets de requête d'écho ICMPv4 aussi - bien que les paquets UDP (défaut), l'actuel traceroute IPv6 ne peut qu'émettre - des paquets UDP. - Comme vous le savez peut-être, les paquets de requête d'écho ICMP sont - mieux acceptés par les pare-feu ou les ACL sur les routeurs intermédiaires - que les paquets UDP. -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "program-tracepath6" - -\end_inset - -tracepath6 IPv6 -\end_layout - -\begin_layout Standard -Ce programme est normalement inclus dans le paquetage -\emph on -iputils -\emph default -. - C'est un programme comme traceroute6, il trace le chemin vers une destination - donnée, découvrant la MTU le long de ce chemin. - En voici un exemple: -\end_layout - -\begin_layout Code - -# tracepath6 www.6bone.net -\end_layout - -\begin_layout Code - - 1?: [LOCALHOST] pmtu 1480 -\end_layout - -\begin_layout Code - - 1: 3ffe:401::2c0:33ff:fe02:14 150.705ms -\end_layout - -\begin_layout Code - - 2: 3ffe:b00:c18::5 267.864ms -\end_layout - -\begin_layout Code - - 3: 3ffe:b00:c18::5 asymm 2 266.145ms pmtu 1280 -\end_layout - -\begin_layout Code - - 3: 3ffe:3900:5::2 asymm 4 346.632ms -\end_layout - -\begin_layout Code - - 4: 3ffe:28ff:ffff:4::3 asymm 5 365.965ms -\end_layout - -\begin_layout Code - - 5: 3ffe:1cff:0:ee::2 asymm 4 534.704ms -\end_layout - -\begin_layout Code - - 6: 3ffe:3800::1:1 asymm 4 578.126ms !N -\end_layout - -\begin_layout Code - -Resume: pmtu 1280 -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "program-tcpdump" - -\end_inset - -tcpdump IPv6 -\end_layout - -\begin_layout Standard -Sur Linux, tcpdump est l'outil majeur pour la capture de paquets. - Vous allez trouver ci-dessous quelques exemples. - Le support IPv6 est normalement intégré aux éditions actuelles de la version - 3.6. -\end_layout - -\begin_layout Standard -tcpdump utilise des expressions pour filtrer les paquets, minimisant le - bruit: -\end_layout - -\begin_layout Itemize -icmp6: filtre le trafic ICMPv6 natif -\end_layout - -\begin_layout Itemize -ip6: filtre le trafic IPv6 natif (incluant ICMPv6) -\end_layout - -\begin_layout Itemize -proto ipv6: filtre le trafic IPv6-in-IPv4 tunnelé -\end_layout - -\begin_layout Itemize -not port ssh: supprime l'affichage des paquets SSH, pour lancer tcpdump - à partir d'une session distante SSH -\end_layout - -\begin_layout Standard -Certaines options en ligne de commande sont très utiles pour capter et afficher - plus d'information concernant les paquets, essentiellement intéressant - pour approfondir l'information des paquets ICMPv6: -\end_layout - -\begin_layout Itemize -\begin_inset Quotes eld -\end_inset - --s 512 -\begin_inset Quotes erd -\end_inset - -: augmente la quantité d'information capturée pour un paquet à 512 octets -\end_layout - -\begin_layout Itemize -\begin_inset Quotes eld -\end_inset - --vv -\begin_inset Quotes erd -\end_inset - -: sortie vraiment verbeuse -\end_layout - -\begin_layout Itemize -\begin_inset Quotes eld -\end_inset - --n -\begin_inset Quotes erd -\end_inset - -: ne pas résoudre les adresses en noms, utile si la résolution inversée - ne fonctionne pas proprement -\end_layout - -\begin_layout Subsubsection -Ping IPv6 vers -\size footnotesize - l'adresse native 3ffe:ffff:100:f101::1 -\size default - sur un lien-local -\end_layout - -\begin_layout Code - -# tcpdump -t -n -i eth0 -s 512 -vv ip6 or proto ipv6 -\end_layout - -\begin_layout Code - -tcpdump: listening on eth0 -\end_layout - -\begin_layout Code - -3ffe:ffff:100:f101:2e0:18ff:fe90:9205 > 3ffe:ffff:100:f101::1: icmp6: echo -\end_layout - -\begin_layout Code - -¬ request (len 64, hlim 64) -\end_layout - -\begin_layout Code - -3ffe:ffff:100:f101::1 > 3ffe:ffff:100:f101:2e0:18ff:fe90:9205: icmp6: echo -\end_layout - -\begin_layout Code - -¬ reply (len 64, hlim 64) -\end_layout - -\begin_layout Subsubsection -Ping IPv6 vers -\size footnotesize -3ffe:ffff:100::1 -\size default - routée au travers d'un tunnel IPv6-in-IPv4 -\end_layout - -\begin_layout Standard -1.2.3.4 et 5.6.7.8 sont les extrémités du tunnel (toutes les adresses sont des - exemples) -\end_layout - -\begin_layout Code - -# tcpdump -t -n -i ppp0 -s 512 -vv ip6 or proto ipv6 -\end_layout - -\begin_layout Code - -tcpdump: listening on ppp0 -\end_layout - -\begin_layout Code - -1.2.3.4 > 5.6.7.8: 2002:ffff:f5f8::1 > 3ffe:ffff:100::1: icmp6: echo request -\end_layout - -\begin_layout Code - -¬ (len 64, hlim 64) (DF) (ttl 64, id 0, len 124) -\end_layout - -\begin_layout Code - -5.6.7.8 > 1.2.3.4: 3ffe:ffff:100::1 > 2002:ffff:f5f8::1: icmp6: echo reply (len -\end_layout - -\begin_layout Code - -¬ 64, hlim 61) (ttl 23, id 29887, len 124) -\end_layout - -\begin_layout Code - -1.2.3.4 > 5.6.7.8: 2002:ffff:f5f8::1 > 3ffe:ffff:100::1: icmp6: echo request -\end_layout - -\begin_layout Code - -¬ (len 64, hlim 64) (DF) (ttl 64, id 0, len 124) -\end_layout - -\begin_layout Code - -5.6.7.8 > 1.2.3.4: 3ffe:ffff:100::1 > 2002:ffff:f5f8::1: icmp6: echo reply (len -\end_layout - -\begin_layout Code - -¬ 64, hlim 61) (ttl 23, id 29919, len 124) -\end_layout - -\begin_layout Section -Les programmes prêts pour IPv6 -\end_layout - -\begin_layout Standard -Les distributions actuelles comportent déjà les clients et les serveurs - IPv6 les plus couramment utilisés. - Allez d'abord voir sur -\begin_inset CommandInset href -LatexCommand href -name "IPv6 & Linux / l'état actuel des distributions" -target "http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status-distributions.html" - -\end_inset - -. - Si ce que vous cherchez n'y est pas encore, vous pouvez vérifier sur -\begin_inset CommandInset href -LatexCommand href -name "IPv6 & Linux / l'état actuel des applications disponibles" -target "http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status-apps.html" - -\end_inset - -, où sont répertoriés les programmes déjà portés sur IPv6 et utilisables - sous Linux. - Pour les programmes les plus communément employés, il y a quelques éléments - disponibles dans -\begin_inset CommandInset href -LatexCommand href -name "la troisième partie" -target "http://www.bieringer.de/linux/IPv6/IPv6-HOWTO/IPv6-HOWTO-3.html" - -\end_inset - - et -\begin_inset CommandInset href -LatexCommand href -name "la quatrième partie" -target "http://www.bieringer.de/linux/IPv6/IPv6-HOWTO/IPv6-HOWTO-4.html" - -\end_inset - - de l'HowTo - IPv6 & Linux. -\end_layout - -\begin_layout Section -Les programmes client prêts pour IPv6 (une sélection) -\end_layout - -\begin_layout Standard -Pour lancer les tests qui vont suivre, il est nécessaire que votre système - dispose d'IPv6, et certains exemples montrent des adresses ne pouvant être - atteintes que si une connexion au 6bone est disponible. -\end_layout - -\begin_layout Subsection -Vérifier la résolution DNS des adresses IPv6 -\end_layout - -\begin_layout Standard -A cause des mises à jour de sécurité ces dernières années, tout serveur - du Système des Noms de Domaine (DNS) devrait fonctionner avec un logiciel - récent comprenant déjà le type (intermédiaire) d'adresse IPv6 AAAA (le - nouveau, nommé A6 n'est pas encore assez répandu pour le moment, car uniquement - supporté par BIND9 et supérieurs, mais aussi à cause de la non existence - de support du domaine racine IP6.ARPA). - Un simple test pour savoir si le système utilisé peut résoudre les adresses - IPv6 est -\end_layout - -\begin_layout Code - -# host -t AAAA www.join.uni-muenster.de -\end_layout - -\begin_layout Standard -et cela devrait affiché quelque chose comme ce qui suit: -\end_layout - -\begin_layout Code - -www.join.uni-muenster.de. - is an alias for tolot.join.uni-muenster.de. - -\end_layout - -\begin_layout Code - -tolot.join.uni-muenster.de. - has AAAA address 2001:638:500:101:2e0:81ff:fe24:37c6 -\end_layout - -\begin_layout Subsection -Le client telnet prêt pour IPv6 -\end_layout - -\begin_layout Standard -Des clients telnet prêts pour IPv6 sont disponibles. - Un simple test peut être effectué par -\end_layout - -\begin_layout Code - -$ telnet 3ffe:400:100::1 80 -\end_layout - -\begin_layout Code - -Trying 3ffe:400:100::1... - -\end_layout - -\begin_layout Code - -Connected to 3ffe:400:100::1. - -\end_layout - -\begin_layout Code - -Escape character is '^]'. - -\end_layout - -\begin_layout Code - -HEAD / HTTP/1.0 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -HTTP/1.1 200 OK -\end_layout - -\begin_layout Code - -Date: Sun, 16 Dec 2001 16:07:21 -\end_layout - -\begin_layout Code - -GMT Server: Apache/2.0.28 (Unix) -\end_layout - -\begin_layout Code - -Last-Modified: Wed, 01 Aug 2001 21:34:42 GMT -\end_layout - -\begin_layout Code - -ETag: "3f02-a4d-b1b3e080" -\end_layout - -\begin_layout Code - -Accept-Ranges: bytes -\end_layout - -\begin_layout Code - -Content-Length: 2637 -\end_layout - -\begin_layout Code - -Connection: close -\end_layout - -\begin_layout Code - -Content-Type: text/html; charset=ISO-8859-1 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -Connection closed by foreign host. -\end_layout - -\begin_layout Standard -Si le client telnet ne comprend pas l'adresse IPv6 et dit quelque chose - comme -\begin_inset Quotes sld -\end_inset - -ne peut résoudre le nom d'hôte -\begin_inset Quotes srd -\end_inset - - ( -\begin_inset Quotes sld -\end_inset - - -\emph on -cannot resolve hostname -\emph default - -\begin_inset Quotes srd -\end_inset - -), IPv6 n'est alors pas disponible. -\end_layout - -\begin_layout Subsection -Les clients ssh prêts pour IPv6 -\end_layout - -\begin_layout Subsubsection -openssh -\end_layout - -\begin_layout Standard -Les versions actuelles d'openssh sont prêtes pour IPv6. - Selon la configuration précédant la compilation, il y a deux comportements - possibles. -\end_layout - -\begin_layout Itemize ---without-ipv4-default: le client essaie automatiquement une connexion IPv6 - en premier et revient à IPv4 en cas d'échec. -\end_layout - -\begin_layout Itemize ---with-ipv4-default: la connexion par défaut est IPv4, la connexion IPv6 - doit être forcée comme dans l'exemple qui suit: -\end_layout - -\begin_layout Code - -$ ssh -6 ::1 -\end_layout - -\begin_layout Code - -user@::1's password: ****** -\end_layout - -\begin_layout Code - -[user@ipv6host user]$ -\end_layout - -\begin_layout Standard -Si votre client ssh ne comprend pas l'option -\begin_inset Quotes sld -\end_inset - --6 -\begin_inset Quotes srd -\end_inset - -, c'est qu'il n'a pas IPv6 de disponible, comme la plupart des paquetages - de ssh version 1. -\end_layout - -\begin_layout Subsubsection -ssh.com -\end_layout - -\begin_layout Standard -Le client et le serveur SSH de chez SSH.com sont aussi prêts pour IPv6, et - gratuits pour les machines Linux et FreeBSD selon l'usage - -\begin_inset space ~ -\end_inset - -commercial ou personnel -\begin_inset space ~ -\end_inset - -- qui en est fait. -\end_layout - -\begin_layout Subsection -Les navigateurs web prêts pour IPv6 -\end_layout - -\begin_layout Standard -\begin_inset CommandInset href -LatexCommand href -name "L'état actuel de la liste des navigateurs web IPv6" -target "http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status-apps.html#HTTP" - -\end_inset - - est disponible. -\end_layout - -\begin_layout Standard -La plupart ont des problèmes irrésolues pour le moment -\end_layout - -\begin_layout Enumerate -Si un seul proxy IPv4 est utilisé dans les réglages, les requêtes IPv6 seront - bien envoyées vers le proxy, mais celui-ci échouera à comprendre la requête, - laquelle échouera. - Solution: mettre à jour le logiciel proxy (à voir plus tard). -\end_layout - -\begin_layout Enumerate -Les réglages de configuration automatique de proxy (*.pac) ne peuvent être - étendus afin de prendre en charge différemment les requêtes IPv6 (par exemple - ne pas utiliser le proxy) à cause de leur nature (écrits en Java-script - et bien encodés en dur dans les sources, comme cela peut être observé pour - le code source de Maxilla). -\end_layout - -\begin_layout Standard -C'est ainsi que les anciennes versions ne comprennent pas un URL avec une - adresse encodée en IPv6 comme -\lang english - -\begin_inset CommandInset href -LatexCommand href -name "http://[2001:4dd0:f838:a006::6]/" -target "http://[2001:4dd0:f838:a006::6]/" - -\end_inset - - -\lang french - (cet URL ne fonctionne qu'avec un navigateur disposant d'IPv6!). -\end_layout - -\begin_layout Standard -Un bref test est d'essayer l'URL fourni avec un navigateur donné, sans utiliser - de proxy. -\end_layout - -\begin_layout Subsubsection -Un URL de test -\end_layout - -\begin_layout Standard -Un bon point de départ pour tester la navigation IPv6 est -\begin_inset CommandInset href -LatexCommand href -name "http://www.kame.net/" -target "http://www.kame.net/" - -\end_inset - -. - Si la tortue sur la page est animée, la connexion se fait -\emph on -via -\emph default - IPv6, sinon la tortue est statique. -\end_layout - -\begin_layout Section -Les programmes serveur prêts pour IPv6 -\end_layout - -\begin_layout Standard -Dans cette partie, de nombreuses questions concernant des clients spécifiques - ont été mentionnées. - En conséquence, les éléments pour les serveurs prêts pour IPv6 sont fournis - plus bas dans la section -\begin_inset CommandInset ref -LatexCommand ref -name "Eléments d'installation des démons prêts pour IPv6" -reference "chapter-hints-daemons" - -\end_inset - -. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "faq-ipv6-ready-system-check" - -\end_inset - -FAQ (vérification d'un système prêt pour IPv6) -\end_layout - -\begin_layout Subsection -Utiliser les outils -\end_layout - -\begin_layout Subsubsection -Q: impossible d'utiliser ping6 avec des adresses lien-local -\end_layout - -\begin_layout Standard -Message d'erreur: " -\emph on -connect: Invalid argument -\emph default -" -\end_layout - -\begin_layout Standard -Le noyau ne sait pas sur quel lien (physique ou virtuel) vous voulez l'utiliser - et envoyer des paquets ICMPv6. - C'est pourquoi est affiché un message d'erreur. -\end_layout - -\begin_layout Standard -Solution: spécifier l'interface de cette façon: -\begin_inset Quotes sld -\end_inset - -ping6 -\series bold --I eth0 -\series default - fe80::2e0:18ff:fe90:9205 -\begin_inset Quotes srd -\end_inset - -, voir aussi -\begin_inset CommandInset ref -LatexCommand ref -name "l'usage du programme ping6" -reference "program-ping6" - -\end_inset - -. -\end_layout - -\begin_layout Subsubsection -Q: impossible d'utiliser ping6 ou traceroute en tant qu'utilisateur courant -\end_layout - -\begin_layout Standard -Message d'erreur: -\begin_inset Quotes sld -\end_inset - - -\emph on -icmp socket: Operation not permitted -\emph default - -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -Ces utilitaires créent des paquets spéciaux ICMPv6 et les émettent en dehors. - Ceci est réalisé par l'emploi des sockets brutes du noyau. - Ces dernières ne peuvent être utilisées que par l'utilisateur -\begin_inset Quotes sld -\end_inset - -root -\begin_inset Quotes srd -\end_inset - -. - C'est pourquoi les utilisateurs courants obtiennent un tel message d'erreur. -\end_layout - -\begin_layout Standard -Solution: s'il est vraiment nécessaire que tous les utilisateurs puissent - utiliser ces utilitaires, vous pouvez ajouter le bit -\begin_inset Quotes sld -\end_inset - -suid -\begin_inset Quotes srd -\end_inset - - en faisant -\begin_inset Quotes srd -\end_inset - -chmod u+s /chemin/vers/le/programme -\begin_inset Quotes srd -\end_inset - -, voir aussi -\begin_inset CommandInset ref -LatexCommand ref -name "l'usage du programme" -reference "program-ping6" - -\end_inset - -. - Si tous les utilisateurs ne doivent pas en être capables, vous pouvez changer - ce programme de groupe, par exemple au profit du groupe -\begin_inset Quotes sld -\end_inset - -wheel -\begin_inset Quotes srd -\end_inset - -, ajouter les utilisateurs nécessaires à ce groupe et ôter le bit d'exécution - aux autres utilisateurs par -\begin_inset Quotes sld -\end_inset - -chmod o-rwx /chemin/vers/le/programme -\begin_inset Quotes srd -\end_inset - -, ou bien configurer -\begin_inset Quotes sld -\end_inset - -sudo -\begin_inset Quotes srd -\end_inset - - pour mettre en place votre politique de sécurité. - -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-configuration-interface" - -\end_inset - -Configurer les interfaces -\end_layout - -\begin_layout Section -Les différents périphériques réseau -\end_layout - -\begin_layout Standard -Sur un noeud, il existe différents périphériques réseau. - Ils peuvent être -\end_layout - -\begin_layout Itemize -Physiquement rattachés, comme eth0, tr0 -\end_layout - -\begin_layout Itemize -Virtuellement existants, comme ppp0, tun0, tap0, sit0, isdn0, ippp0 -\end_layout - -\begin_layout Subsection -Physiquement rattachés -\end_layout - -\begin_layout Standard -Les interfaces physiquement rattachées, comme Ethernet ou Token-Ring, sont - la norme et n'ont pas besoin d'un traitement particulier. -\end_layout - -\begin_layout Subsection -Virtuellement existants -\end_layout - -\begin_layout Standard -Les interfaces virtuellement rattachées ont toujours besoin d'un traitement - particulier. -\end_layout - -\begin_layout Subsubsection -Les interfaces de tunnelage IPv6-in-IPv4 -\end_layout - -\begin_layout Standard -Ces interfaces sont normalement dénommées -\series bold -sit -\emph on -x -\series default -\emph default -. - -\emph on -sit -\emph default - est l'abréviation mise pour -\series bold -S -\series default -imple -\series bold - T -\series default -ransition -\series bold - I -\series default -nternet -\series bold - ( -\emph on -S -\series default -imple -\series bold -I -\series default -nternet -\series bold -T -\series default -ransition -\emph default -). - Ce périphérique a la capacité d'encapsuler les paquets IPv6 à l'intérieur - de paquets IPv4 et de les tunneler vers une extrémité étrangère. -\end_layout - -\begin_layout Standard - -\series bold -sit0 -\series default - a une signification particulière et ne peut être utilisée pour des tunnels - dédiés. -\end_layout - -\begin_layout Subsubsection -Les interfaces PPP -\end_layout - -\begin_layout Standard -Les interfaces PPP acquièrent leur capacité IPv6 grâce à un démon PPP disposant - d'IPv6. -\end_layout - -\begin_layout Subsubsection -Les interfaces RNIS HDLC -\end_layout - -\begin_layout Standard -La capacité IPv6 pour HDLC avec encapsulation -\series bold -ip -\series default - est déjà intégrée au noyau. -\end_layout - -\begin_layout Subsubsection -Les interfaces PPP RNIS -\end_layout - -\begin_layout Standard -Les interfaces PPP RNIS (ippp) ne sont pas disponibles pour IPv6 dans le - noyau. - Il n'est pas prévu que cela se fasse, puisqu'elles seront remplacées par - une couche d'interface ppp plus générique. -\end_layout - -\begin_layout Subsubsection -SLIP + PLIP -\end_layout - -\begin_layout Standard -Comme il a déjà été dit, ces interfaces ne supportent pas le transport IPv6 - (l'émission est OK, mais la distribution à la réception ne fonctionne pas). -\end_layout - -\begin_layout Subsubsection -Le périphérique Ether-tap -\end_layout - -\begin_layout Standard -Les périphériques Ether-tap sont prêts pour IPv6, et sont de plus configurables - sans état. - Pour être utilisés, le module -\begin_inset Quotes sld -\end_inset - -ethertap -\begin_inset Quotes srd -\end_inset - - doit être chargé au préalable. -\end_layout - -\begin_layout Subsubsection -Les périphériques tun -\end_layout - -\begin_layout Standard -Actuellement, je ne les ai pas encore testés par moi-même. -\end_layout - -\begin_layout Subsubsection -ATM -\end_layout - -\begin_layout Standard -01/2002: non supporté par l'actuel noyau vanille, supporté par l'extension - USAGI. -\end_layout - -\begin_layout Subsubsection -Autres -\end_layout - -\begin_layout Standard -Ai-je oublié une interface?... -\end_layout - -\begin_layout Section -(dé)Montage des interfaces -\end_layout - -\begin_layout Standard -Deux méthodes peuvent être utilisées pour (dé)monter les interfaces. -\end_layout - -\begin_layout Subsection -Utiliser "ip" -\end_layout - -\begin_layout Standard -Usage: -\end_layout - -\begin_layout Code - -# ip link set dev up -\end_layout - -\begin_layout Code - -# ip link set dev down -\end_layout - -\begin_layout Standard -Exemple: -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# ip link set dev eth0 up -\end_layout - -\begin_layout Code - -# ip link set dev eth0 down -\end_layout - -\begin_layout Subsection -Utiliser "ifconfig" -\end_layout - -\begin_layout Standard -\align left -Usage: -\end_layout - -\begin_layout Code - -# /sbin/ifconfig up -\end_layout - -\begin_layout Code - -# /sbin/ifconfig down -\end_layout - -\begin_layout Standard -Exemple: -\end_layout - -\begin_layout Code - -# /sbin/ifconfig eth0 up -\end_layout - -\begin_layout Code - -# /sbin/ifconfig eth0 down -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-configuration-address" - -\end_inset - -Configurer les adresses IPv6 -\end_layout - -\begin_layout Standard -\align left -Il y a différentes façons de configurer une adresse IPv6 sur une interface. - Vous pouvez utiliser "ifconfig" ou "ip". -\end_layout - -\begin_layout Section -Affichage des adresses IPv6 existantes -\end_layout - -\begin_layout Standard -\align left -Vous devriez d'abord vérifier s'il existe des adresses IPv6 configurées, - et combien (peut-être y en a-t-il qui l'ont été, comme par magie, pendant - l'auto-configuration sans état). -\end_layout - -\begin_layout Subsection -Utiliser "ip" -\end_layout - -\begin_layout Standard -Usage: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 addr show dev -\end_layout - -\begin_layout Standard -Exemple pour un hôte configuré statiquement: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 addr show dev eth0 -\end_layout - -\begin_layout Code - -2: eth0: -\end_layout - -\begin_layout Standard -Exemple (la sortie est filtrée avec grep pour n'afficher que les adresses - IPv6). - vous pouvez voir ici des adresses IPv6 ayant des portées différentes. -\end_layout - -\begin_layout Code - -# /sbin/ifconfig eth0 |grep "inet6 addr:" -\end_layout - -\begin_layout Code - -inet6 addr: fe80::210:a4ff:fee3:9566/10 Scope:Link -\end_layout - -\begin_layout Code - -inet6 addr: 3ffe:ffff:0:f101::1/64 Scope:Global -\end_layout - -\begin_layout Code - -inet6 addr: fec0:0:0:f101::1/64 Scope:Site -\end_layout - -\begin_layout Section -Ajouter une adresse IPv6 -\end_layout - -\begin_layout Standard -Ajouter une adresse IPv6 est similaire au mécanisme des adresses -\begin_inset Quotes sld -\end_inset - -ALIAS IP -\begin_inset Quotes srd -\end_inset - - sur les interfaces configurées par IPv4 Linux. -\end_layout - -\begin_layout Subsection -Utiliser "ip" -\end_layout - -\begin_layout Standard -Usage: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 addr add / dev - -\end_layout - -\begin_layout Standard -Exemple: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 addr add 3ffe:ffff:0:f101::1/64 dev eth0 -\end_layout - -\begin_layout Subsection -Utiliser "ifconfig" -\end_layout - -\begin_layout Standard -\align left -Usage: -\end_layout - -\begin_layout Code - -# /sbin/ifconfig inet6 add / -\end_layout - -\begin_layout Standard -Exemple: -\end_layout - -\begin_layout Code - -# /sbin/ifconfig eth0 inet6 add 3ffe:ffff:0:f101::1/64 -\end_layout - -\begin_layout Section -Ôter une adresse IPv6 -\end_layout - -\begin_layout Standard -\align left -Rarement nécessaire, prenez garde de ne pas ôter une adresse IPv6 n'existant - pas, il en résulte parfois un -\emph on -crash -\emph default - sur les anciens noyaux. -\end_layout - -\begin_layout Subsection -Utiliser "ip" -\end_layout - -\begin_layout Standard -Usage: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 addr del / dev - -\end_layout - -\begin_layout Standard -Exemple: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 addr del 3ffe:ffff:0:f101::1/64 dev eth0 -\end_layout - -\begin_layout Subsection -Utiliser "ifconfig" -\end_layout - -\begin_layout Standard -\align left -Usage: -\end_layout - -\begin_layout Code - -# /sbin/ifconfig inet6 del / -\end_layout - -\begin_layout Standard -Exemple: -\end_layout - -\begin_layout Code - -# /sbin/ifconfig eth0 inet6 del 3ffe:ffff:0:f101::1/64 -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-configuration-route" - -\end_inset - -Configurer les routes IPv6 courantes -\end_layout - -\begin_layout Standard -\align left -Si vous voulez quitter votre lien et voulez émettre des paquets vers l'Internet - mondial IPv6, vous avez besoin de routage. - S'il existe déjà un routeur disposant d'IPv6 sur votre lien, il est possible - que cela soit suffisant pour ajouter des routes IPv6. -\end_layout - -\begin_layout Section -Afficher les routes IPv6 existantes -\end_layout - -\begin_layout Standard -Vous devriez d'abord vérifier s'il existe des routes IPv6 configurées, et - combien (peut-être y en a-t-il qui l'ont été, comme par magie, pendant - l'auto-configuration sans état). -\end_layout - -\begin_layout Subsection -Utiliser "ip" -\end_layout - -\begin_layout Standard -Usage: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route show [dev ] -\end_layout - -\begin_layout Standard -\align left -Exemple: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route show dev eth0 -\end_layout - -\begin_layout Code - -3ffe:ffff:0:f101::/64 proto kernel metric 256 mtu 1500 advmss 1440 -\end_layout - -\begin_layout Code - -fe80::/10 proto kernel metric 256 mtu 1500 advmss 1440 -\end_layout - -\begin_layout Code - -ff00::/8 proto kernel metric 256 mtu 1500 advmss 1440 -\end_layout - -\begin_layout Code - -default proto kernel metric 256 mtu 1500 advmss 1440 -\end_layout - -\begin_layout Subsection -Utiliser "route" -\end_layout - -\begin_layout Standard -\align left -Usage: -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 -\end_layout - -\begin_layout Standard -\align left -Exemple (la sortie est filtrée sur l'interface eth0). - Ici vous pouvez voir différentes routes IPv6 pour différentes adresses - sur une même interface. -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 |grep -w "eth0" -\end_layout - -\begin_layout Code - -3ffe:ffff:0:f101 ::/64 :: UA 256 0 0 eth0 <- Route de l'interface de portée - globale -\end_layout - -\begin_layout Code - -¬ address -\end_layout - -\begin_layout Code - -fe80::/10 :: UA 256 0 0 eth0 <- Route de l'interface de portée - lien-local -\end_layout - -\begin_layout Code - -¬ address -\end_layout - -\begin_layout Code - -ff00::/8 :: UA 256 0 0 eth0 <- Route de l'interface destiné - à tout le trafic multicast -\end_layout - -\begin_layout Code - -¬ addresses -\end_layout - -\begin_layout Code - -::/0 :: UDA 256 0 0 eth0 <- Route automatique par défaut -\end_layout - -\begin_layout Section -Ajouter une route IPv6 traversant une passerelle -\end_layout - -\begin_layout Standard -\align left -Nécessaire la plupart du temps pour atteindre l'extérieur grâce à IPv6 en - utilisant un routeur IPv6 sur votre lien. -\end_layout - -\begin_layout Subsection -Utiliser "ip" -\end_layout - -\begin_layout Standard -Usage: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route add / via -\end_layout - -\begin_layout Code - -¬ [dev ] -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Standard -Exemple: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route add 2000::/3 via 3ffe:ffff:0:f101::1 -\end_layout - -\begin_layout Subsection -Utiliser "route" -\end_layout - -\begin_layout Standard -\align left -Usage: -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 add / gw -\end_layout - -\begin_layout Code - -¬ [dev ] -\end_layout - -\begin_layout Standard -\align left -Un périphérique peut être nécessaire également, si l'adresse IPv6 de la - passerelle est un lien-local. -\end_layout - -\begin_layout Standard -Suivre l'exemple montré ajoute une route à toutes les adresses globales - actuelles (2000::/3) à travers la passerelle -\family typewriter -\lang afrikaans -3ffe:ffff:0:f101::1 -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 add 2000::/3 gw 3ffe:ffff:0:f101::1 -\end_layout - -\begin_layout Section -Ôter une route IPv6 traversant une passerelle -\end_layout - -\begin_layout Standard -\align left -Rarement nécessaire manuellement, la plupart du temps effectué par les scripts - configurant le réseau à l'extinction (totale ou par interface) -\end_layout - -\begin_layout Subsection -Utiliser "ip" -\end_layout - -\begin_layout Standard -\align left -Usage: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route del / via -\end_layout - -\begin_layout Code - -¬ [dev ] -\end_layout - -\begin_layout Standard -Exemple: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route del 2000::/3 via 3ffe:ffff:0:f101::1 -\end_layout - -\begin_layout Subsection -Utiliser "route" -\end_layout - -\begin_layout Standard -\align left -Usage: -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 del / [dev ] -\end_layout - -\begin_layout Standard -Exemple pour de nouveau ôter la route précédemment ajoutée: -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 del 2000::/3 gw 3ffe:ffff:0:f101::1 -\end_layout - -\begin_layout Section -Ajouter une route IPv6 traversant une interface -\end_layout - -\begin_layout Standard -Pas si fréquent, parfois en cas de création de lien point-à-point. -\end_layout - -\begin_layout Subsection -Utiliser "ip" -\end_layout - -\begin_layout Standard -\align left -Usage: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route add / dev -\end_layout - -\begin_layout Code - -¬ metric 1 -\end_layout - -\begin_layout Standard -Exemple: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route add 2000::/3 dev eth0 metric 1 -\end_layout - -\begin_layout Standard -La distance ( -\emph on -metric -\emph default -) -\begin_inset Quotes sld -\end_inset - -1 -\begin_inset Quotes srd -\end_inset - - est utilisée ici par soucis de compatibilité avec la distance utilisée - par route, car la distance par défaut fixée par -\begin_inset Quotes sld -\end_inset - -ip -\begin_inset Quotes srd -\end_inset - - est -\begin_inset Quotes sld -\end_inset - -1024 -\begin_inset Quotes srd -\end_inset - -. -\end_layout - -\begin_layout Subsection -Utiliser "route" -\end_layout - -\begin_layout Standard -\align left -Usage: -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 add / dev -\end_layout - -\begin_layout Standard -Exemple: -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 add 2000::/3 dev eth0 -\end_layout - -\begin_layout Section -Ôter une route IPv6 traversant une interface -\end_layout - -\begin_layout Standard -Rarement utiliser manuellement, les scripts de configuration font cela à - l'extinction. -\end_layout - -\begin_layout Subsection -Utiliser "ip" -\end_layout - -\begin_layout Standard -Usage: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route del / dev -\end_layout - -\begin_layout Standard -Exemple: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route del 2000::/3 dev eth0 -\end_layout - -\begin_layout Subsection -Utiliser "route" -\end_layout - -\begin_layout Standard -\align left -Usage: -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 del / dev -\end_layout - -\begin_layout Standard -\align left -Exemple: -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 del 2000::/3 dev eth0 -\end_layout - -\begin_layout Section -FAQ concernant les routes IPv6 -\end_layout - -\begin_layout Subsection -Support d'une route par défaut IPv6 -\end_layout - -\begin_layout Standard -Une idée d'IPv6 était le routage hiérarchique, avec pour conséquence une - quantité moindre d'entrées dans les tables de routage nécessaires aux routeurs. -\end_layout - -\begin_layout Standard -Il y a certains problèmes dans les noyaux Linux actuels: -\end_layout - -\begin_layout Subsubsection -Les clients (ne routent aucun paquet!) -\end_layout - -\begin_layout Standard -Les clients peuvent installer une route par défaut avec pour préfixe -\begin_inset Quotes sld -\end_inset - -::/0 -\begin_inset Quotes srd -\end_inset - -, ils peuvent aussi apprendre une telle route par auto-configuration, en - utilisant par exemple radvd s'il est présent sur le lien, comme le montre - ce qui suit: -\end_layout - -\begin_layout Code - -# ip -6 route show | grep ^default -\end_layout - -\begin_layout Code - -default via fe80::212:34ff:fe12:3450 dev eth0 proto kernel metric 1024 expires -\end_layout - -\begin_layout Code - -¬ 29sec mtu 1500 advmss 1440 -\end_layout - -\begin_layout Subsubsection -Les routeurs en cas de renvoi de paquets -\end_layout - -\begin_layout Standard -Dans ses grandes lignes, l'actuel noyau Linux (au moins <= 2.4.17) ne supporte - pas les routes par défaut. - Vous pouvez les installées, mais la recherche échouera quand un paquet - devra être renvoyé (une intention normale pour un routeur). -\end_layout - -\begin_layout Standard -Pour l'heure, le -\begin_inset Quotes sld -\end_inset - -routage par défaut -\begin_inset Quotes srd -\end_inset - - peut être installé en utilisant l'actuel et unique préfixe d'adresse globale - -\begin_inset Quotes sld -\end_inset - -2000::/3 -\begin_inset Quotes srd -\end_inset - -. -\end_layout - -\begin_layout Standard -Le projet USAGI supporte déjà cela dans leurs extensions grâce à une astuce - de programmation ( -\emph on -NdT -\emph default -: -\emph on -a hack -\emph default -, -\emph on -i.e. - -\emph default - littéralement, une -\begin_inset Quotes srd -\end_inset - -bidouille -\begin_inset Quotes srd -\end_inset - -). -\end_layout - -\begin_layout Standard -Note: prenez garde au routage par défaut sans filtrage d'adresse sur les - routeurs de bordure, sinon du trafic multicast ou site-local quittera l'environ -nement. -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-Neighbor-Discovery" - -\end_inset - -La découverte de voisinage -\end_layout - -\begin_layout Standard -La découverte de voisinage est le successeur IPv6 de ARP ( -\emph on -Address Resolution Protocol -\emph default -, protocole de résolution d'adresse) pour IPv4. - Vous pouvez récupérer l'information concernant le voisinage actuel, de - plus, vous pouvez fixer ou détruire des entrées. - Le noyau garde la trace de la détection d'un voisin (comme ARP pour IPv4). - Vous pouvez faire des recherches dans la table apprise, en utilisant -\begin_inset Quotes sld -\end_inset - -ip -\begin_inset Quotes srd -\end_inset - -. -\end_layout - -\begin_layout Section -Afficher le voisinage en utilisant "ip" -\end_layout - -\begin_layout Standard -Avec la commande qui suit vous pouvez afficher les voisins IPv6 appris ou - configurés -\end_layout - -\begin_layout Code - -# ip -6 neigh show [dev ] -\end_layout - -\begin_layout Standard -L'exemple suivant montre un voisin, qui est un routeur pouvant être atteint -\end_layout - -\begin_layout Code - -# ip -6 neigh show -\end_layout - -\begin_layout Code - -fe80::201:23ff:fe45:6789 dev eth0 lladdr 00:01:23:45:67:89 router nud reachable -\end_layout - -\begin_layout Section -Manipuler la table de voisinage en utilisant "ip" -\end_layout - -\begin_layout Subsection -Ajouter manuellement une entrée -\end_layout - -\begin_layout Standard -La commande suivante vous permet d'ajouter manuellement une entrée -\end_layout - -\begin_layout Code - -# ip -6 neigh add lladdr dev -\end_layout - -\begin_layout Standard -Exemple: -\end_layout - -\begin_layout Code - -# ip -6 neigh add fec0::1 lladdr 02:01:02:03:04:05 dev eth0 -\end_layout - -\begin_layout Subsection -Détruire manuellement une entrée -\end_layout - -\begin_layout Standard -De même qu'une entrée peut être ajoutée, une entrée peut être détruite: -\end_layout - -\begin_layout Code - -# ip -6 neigh del lladdr dev -\end_layout - -\begin_layout Standard -Exemple: -\end_layout - -\begin_layout Code - -# ip -6 neigh del fec0::1 lladdr 02:01:02:03:04:05 dev eth0 -\end_layout - -\begin_layout Subsection -Pour plus de réglages avancés -\end_layout - -\begin_layout Standard -L'outil -\begin_inset Quotes sld -\end_inset - -ip -\begin_inset Quotes srd -\end_inset - - est sous-documenté, mais il est très puissant. - Voir l'aide en ligne pour en savoir plus -\end_layout - -\begin_layout Code - -# ip -6 neigh help -\end_layout - -\begin_layout Code - -Usage: ip neigh { add | del | change | replace } { ADDR [ lladdr LLADDR - ] -\end_layout - -\begin_layout Code - - [ nud { permanent | noarp | stale | reachable } ] -\end_layout - -\begin_layout Code - - | proxy ADDR } [ dev DEV ] -\end_layout - -\begin_layout Code - - ip neigh {show|flush} [ to PREFIX ] [ dev DEV ] [ nud STATE ] -\end_layout - -\begin_layout Standard -Il semble que certaines options soient uniquement pour IPv4... - si vous pouvez contribuer à en dire plus sur les drapeaux et l'emploi avancé, - merci d'envoyer vos informations. -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-configuring-ipv6-in-ipv4-tunnels" - -\end_inset - -Configurer les tunnels IPv6-in-IPv4 -\end_layout - -\begin_layout Standard -\align left -Si vous souhaitez quitter votre lien incapable d'accéder à IPv6 à partir - de votre réseau local, vous avez besoin d'un tunnelage IPv6-in-IPv4 afin - de rejoindre l'Internet mondial IPv6. -\end_layout - -\begin_layout Standard -\align left -Il y a différents mécanismes de tunnelage, et conséquemment, différentes - façons d'installer des tunnels. -\end_layout - -\begin_layout Section -Les types de tunnel -\end_layout - -\begin_layout Standard -Il y a plus d'une façon de tunneler des paquets IPv6 sur des liens uniquement - IPv4. -\end_layout - -\begin_layout Subsection -Tunnelage statique point-à-point: 6bone -\end_layout - -\begin_layout Standard -\align left -Un tunnel point-à-point est un tunnel dédié à un point de connexion terminal, - qui connaît votre réseau IPv6 (pour le routage en retour) et l'adresse - IPv4 de votre point de connexion (terminale), comme défini dans la -\begin_inset CommandInset href -LatexCommand href -name "RFC 2893 / Transition Mechanisms for IPv6 Hosts and Routers" -target "http://www.faqs.org/rfcs/rfc2893.html" - -\end_inset - -. - Pré-requis: -\end_layout - -\begin_layout Itemize -\align left -L'adresse IPv4 de votre point de connexion terminal doit être globalement - unique, statique, et accessible à partir de l'autre point de connexion - terminal distant -\end_layout - -\begin_layout Itemize -\align left -Un préfixe IPv6 vous est assigné (voir le bureau d'enregistrement 6bone) -\end_layout - -\begin_layout Itemize -\align left -Une extrémité distante du tunnel capable de router votre préfixe IPv6 jusqu'à - votre extrémité locale du tunnel (la plupart du temps, une configuration - manuelle distante est requise) -\end_layout - -\begin_layout Subsection -Le tunnelage automatique -\end_layout - -\begin_layout Standard -Le cas du tunnelage automatique se présente quand un noeud se connecte directeme -nt à un autre noeud en ayant obtenu au préalable l'adresse IPv4 de l'autre - noeud. -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "tunneling-6to4" - -\end_inset - -Le tunnelage 6to4 -\end_layout - -\begin_layout Standard -Le tunnelage 6to4 ( -\begin_inset CommandInset href -LatexCommand href -name "RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds" -target "http://www.faqs.org/rfcs/rfc3056.html" - -\end_inset - -) utilise un mécanisme simple pour créer des tunnels automatiques. - Tout noeud ayant une adresse unique globale IPv4 est capable d'être le - point de connexion terminal d'un tunnel 6to4 (si aucun pare-feu IPv4 ne - prohibe ce trafic). - Foncièrement, le tunnelage 6to4 n'est pas un tunnel en binôme ( -\emph on -one-to-one tunnel -\emph default -). - Ce tunnelage se subdivise en un tunnelage d'un flux montant et d'un flux - descendant. - Une adresse IPv6 spéciale indique que ce noeud utilisera un tunnelage 6to4 - pour se connnecter au réseau mondial IPv6. -\end_layout - -\begin_layout Subsubsection -La génération d'un préfixe 6to4 -\end_layout - -\begin_layout Standard -Une adresse 6to4 est définie comme suit (le schéma provient du -\begin_inset CommandInset href -LatexCommand href -name "RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds" -target "http://www.faqs.org/rfcs/rfc3056.html" - -\end_inset - -): -\end_layout - -\begin_layout Code - -| 3+13 | 32 | 16 | 64 bits | -\end_layout - -\begin_layout Code - -+---+------+-----------+--------+--------------------------------+ -\end_layout - -\begin_layout Code - -| FP+TLA | V4ADDR | SLA ID | Interface ID | -\end_layout - -\begin_layout Code - -| 0x2002 | | | | -\end_layout - -\begin_layout Code - -+---+------+-----------+--------+--------------------------------+ -\end_layout - -\begin_layout Standard -FP et TLA ensemble (16 bits) ont la valeur 0x2002. - V4ADDR est l'adresse IPv4 globale et unique du noeud (en notation hexadécimale). - SLA est l'identifiant de sous-réseau (65536 sous-réseaux locaux possibles). - Ils sont utilisés pour représenter la structure locale de votre réseau. -\end_layout - -\begin_layout Standard -Pour les passerelles, un tel préfixe est généré en utilisant normalement - pour SLA -\begin_inset Quotes sld -\end_inset - -0000 -\begin_inset Quotes srd -\end_inset - -, et pour suffixe -\begin_inset Quotes sld -\end_inset - -::1 -\begin_inset Quotes srd -\end_inset - - (ce n'est pas une nécessité, il peut être déterminé arbitrairement, mais - d'une portée locale) et assigné à l'interface de tunnelage 6to4. - Notez que Windows Microsoft utilise aussi V4ADDR comme préfixe. -\end_layout - -\begin_layout Subsubsection -Le flux de tunnelage ascendant 6to4 -\end_layout - -\begin_layout Standard -Le noeud doit savoir à quel point de connexion terminal étranger ses paquets - IPv6 dans IPv4 doivent être envoyés. - Aux tout premiers jours du tunnelage 6to4, des routeurs dédiés au tunnelage - de flux ascendant avaient été définis. - Voir -\begin_inset CommandInset href -LatexCommand href -name "l'information 6to4 de NSayer" -target "http://www.kfu.com/~nsayer/6to4/" - -\end_inset - - pour une liste de ses routeurs. -\end_layout - -\begin_layout Standard -De nos jours, les routeurs de flux ascendant 6to4 peuvent être découverts - comme par magie par l'emploi de l'adresse anycast 192.88.99.1. - Les protocoles de routage s'occupent de cela en arrière-plan, voir le -\begin_inset CommandInset href -LatexCommand href -name "RFC 3068 / An Anycast Prefix for 6to4 Relay Routers" -target "http://www.faqs.org/rfcs/rfc3068.html" - -\end_inset - - pour les détails. - -\end_layout - -\begin_layout Subsubsection -Le flux de tunnelage descendant 6to4 -\end_layout - -\begin_layout Standard -La méthode servant au flux descendant (du 6bone vers votre noeud disposant - de 6to4) n'est pas vraiment bien fixée et peut varier selon l'hôte étranger - vers qui sont envoyés les paquets originaux. - Il existe deux possibilités: -\end_layout - -\begin_layout Itemize -l'hôte étranger utilise 6to4 et émet directement en retour les paquets à - votre noeud (voir plus bas) -\end_layout - -\begin_layout Itemize -l'hôte étranger émet les paquets en retour vers le réseau mondial IPv6 et - selon le routage dynamique qui a lieu alors, un routeur relais créera un - tunnel automatique de retour vers votre noeud. -\end_layout - -\begin_layout Subsubsection -Le trafic possible avec 6to4 -\end_layout - -\begin_layout Itemize -de 6to4 vers 6to4: est normalement tunnelé directement entre chacun des - hôtes disposant de 6to4 -\end_layout - -\begin_layout Itemize -de 6to4 vers un trafic non 6to4: est émis -\emph on -via -\emph default - le flux ascendant du tunnelage -\end_layout - -\begin_layout Itemize -un trafic non 6to4 vers 6to4: est émis -\emph on -via -\emph default - le flux descendant du tunnelage -\end_layout - -\begin_layout Section -Afficher les tunnels existants -\end_layout - -\begin_layout Subsection -Utiliser "ip" -\end_layout - -\begin_layout Standard -Usage: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 tunnel show [] -\end_layout - -\begin_layout Standard -Exemple: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 tunnel show -\end_layout - -\begin_layout Code - -sit0: ipv6/ip remote any local any ttl 64 nopmtudisc -\end_layout - -\begin_layout Code - -sit1: ipv6/ip remote 195.226.187.50 local any ttl 64 -\end_layout - -\begin_layout Subsection -Utiliser "route" -\end_layout - -\begin_layout Standard -Usage: -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 -\end_layout - -\begin_layout Standard -Exemple (la sortie est filtrée afin de ne laisser apparaître que les tunnels - empreintant l'interface sit0): -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 | grep " -\backslash -Wsit0 -\backslash -W*$" -\end_layout - -\begin_layout Code - -::/96 :: U 256 2 0 sit0 -\end_layout - -\begin_layout Code - -2002::/16 :: UA 256 0 0 sit0 -\end_layout - -\begin_layout Code - -2000::/3 ::193.113.58.75 UG 1 0 0 sit0 -\end_layout - -\begin_layout Code - -fe80::/10 :: UA 256 0 0 sit0 -\end_layout - -\begin_layout Code - -ff00::/8 :: UA 256 0 0 sit0 -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "conf-ipv6-in-ipv4-point-to-point-tunnels" - -\end_inset - -Montage d'un tunnel point-à-point -\end_layout - -\begin_layout Standard -\align left -Il y a 3 possibilités pour ajouter ou ôter un tunnel point-à-point. -\end_layout - -\begin_layout Standard -Une bonne source d'information additionnelle à propos de l'installation - de tunnel grâce à -\begin_inset Quotes sld -\end_inset - -ip -\begin_inset Quotes srd -\end_inset - - est -\begin_inset CommandInset href -LatexCommand href -name "configurer les tunnels avec iproute2 (article)" -target "http://www.deepspace6.net/docs/iproute2tunnel-en.html" - -\end_inset - - ( -\begin_inset CommandInset href -LatexCommand href -name "miroir" -target "http://mirrors.bieringer.de/www.deepspace6.net/docs/iproute2tunnel-en.html" - -\end_inset - -). -\end_layout - -\begin_layout Subsection -Ajouter un tunnel point-à-point -\end_layout - -\begin_layout Subsubsection -Utiliser "ip" -\end_layout - -\begin_layout Standard -\align left -La méthode la plus commune actuellement pour une petite quantité de tunnels. -\end_layout - -\begin_layout Standard -Usage en vue de créer un périphérique de tunnelage (mais il n'est pas monté - pour autant, une TTL doit également être spécifiée, car la valeur par défaut - est 0) -\end_layout - -\begin_layout Code - -# /sbin/ip tunnel add mode sit ttl remote -\end_layout - -\begin_layout Code - -¬ local -\end_layout - -\begin_layout Standard -Usage (exemple générique pour trois tunnels): -\end_layout - -\begin_layout Code - -# /sbin/ip tunnel add sit1 mode sit ttl remote -\end_layout - -\begin_layout Code - -¬ local -\end_layout - -\begin_layout Code - -# /sbin/ip link set dev sit1 up -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route add dev sit1 metric 1 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/ip tunnel add sit2 mode sit ttl -\end_layout - -\begin_layout Code - -¬ local -\end_layout - -\begin_layout Code - -# /sbin/ip link set dev sit2 up -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route add dev sit2 metric 1 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/ip tunnel add sit3 mode sit ttl -\end_layout - -\begin_layout Code - -¬ local -\end_layout - -\begin_layout Code - -# /sbin/ip link set dev sit3 up -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route add dev sit3 metric 1 -\end_layout - -\begin_layout Subsubsection -Utiliser "ifconfig" et "route" (méthode dépréciée) -\end_layout - -\begin_layout Standard -\align left -Ce n'est véritablement pas une méthode recommandée pour ajouter un tunnel, - car elle est plutôt étrange. - Pas de problème lors de l'ajout d'un seul tunnel, mais si vous en montez - plus d'un, il ne vous est pas possible facilement de démonter le premier - tout en laissant les autres fonctionner. -\end_layout - -\begin_layout Standard -Usage (exemple générique pour trois tunnels): -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit0 up -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit0 tunnel -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit1 up -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 add dev sit1 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit0 tunnel -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit2 up -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 add dev sit2 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit0 tunnel -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit3 up -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 add dev sit3 -\end_layout - -\begin_layout Standard -Important: NE JAMAIS FAIRE DE LA SORTE, car cette façon de faire rend implicitem -ent disponible le "tunnelage automatique" à partir de n'importe où dans - l'Internet, c'est un risque, et cela ne devrait jamais être préconisé. -\end_layout - -\begin_layout Subsubsection -Utiliser seulement "route" -\end_layout - -\begin_layout Standard -\align left -Il est aussi possible d'installer des tunnels dans le style Accès Multiple - Sans Diffusion ( -\emph on -Non Broadcast Multiple Access -\emph default -, ou NBMA), c'est un moyen facile d'ajouter de nombreux tunnels en une fois. -\end_layout - -\begin_layout Standard -Usage (exemple générique pour trois tunnels): -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit0 up -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 add gw -\end_layout - -\begin_layout Code - -¬ :: dev sit0 -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 add gw -\end_layout - -\begin_layout Code - -¬ :: dev sit0 -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 add gw -\end_layout - -\begin_layout Code - -¬ :: dev sit0 -\end_layout - -\begin_layout Standard -Important: NE JAMAIS FAIRE DE LA SORTE, car cette façon de faire rend implicitem -ent disponible le "tunnelage automatique" à partir de n'importe où dans - l'Internet, c'est un risque, et cela ne devrait jamais être préconisé. -\end_layout - -\begin_layout Subsection -Ôter des tunnels point-à-point -\end_layout - -\begin_layout Standard -\align left -Rarement réalisé manuellement, mais utilisé par les scripts pour une extinction - propre ou un redémarrage de la configuration IPv6. -\end_layout - -\begin_layout Subsubsection -Utiliser "ip" -\end_layout - -\begin_layout Standard -Pour ôter un périphérique de tunnelage: -\end_layout - -\begin_layout Code - -# /sbin/ip tunnel del -\end_layout - -\begin_layout Standard -Usage (exemple générique pour trois tunnels): -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route del dev sit1 -\end_layout - -\begin_layout Code - -# /sbin/ip link set sit1 down -\end_layout - -\begin_layout Code - -# /sbin/ip tunnel del sit1 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route del dev sit2 -\end_layout - -\begin_layout Code - -# /sbin/ip link set sit2 down -\end_layout - -\begin_layout Code - -# /sbin/ip tunnel del sit2 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route del dev sit3 -\end_layout - -\begin_layout Code - -# /sbin/ip link set sit3 down -\end_layout - -\begin_layout Code - -# /sbin/ip tunnel del sit3 -\end_layout - -\begin_layout Subsubsection -Utiliser "ifconfig" et "route" (méthode dépréciée parce qu'elle n'est pas - très drôle) -\end_layout - -\begin_layout Standard -\align left -Ce n'est pas seulement la création qui est étrange, mais l'extinction aussi... - vous devez ôter les tunnels dans l'ordre inverse, ce qui signifie que le - premier créé doit être le dernier ôté. -\end_layout - -\begin_layout Standard -Usage (exemple générique pour trois tunnels): -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 del dev sit3 -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit3 down -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 del dev sit2 -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit2 down -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 add dev sit1 -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit1 down -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit0 down -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Subsubsection -Utiliser "route" -\end_layout - -\begin_layout Standard -Comme pour ôter des routes IPv6 courantes -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_layout Standard -\align left -Usage (exemple générique pour trois tunnels): -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 del gw -\end_layout - -\begin_layout Code - -¬ :: dev sit0 -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 del gw -\end_layout - -\begin_layout Code - -¬ :: dev sit0 -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 del gw -\end_layout - -\begin_layout Code - -¬ :: dev sit0 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit0 down -\end_layout - -\begin_layout Subsection -Attribution d'une adresse ( -\emph on -numbered -\emph default -) à un tunnel point-à-point -\end_layout - -\begin_layout Standard -Il est parfois nécessaire de configurer un tunnel point-à-point avec des - adresses IPv6 comme pour IPv4 aujourd'hui. - C'est seulement possible avec la première méthode (ifconfig+route - dépréciée) - et la troisième méthode (ip+route) d'installation de tunnel. - Dans de tels cas, vous pouvez ajouter l'adresse IPv6 à l'interface de tunnelage - comme montré dans la configuration d'interface. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "configuring-ipv6to4-tunnels" - -\end_inset - -Installation des tunnels 6to4 -\end_layout - -\begin_layout Standard -Prenez garde au fait que le support des tunnels 6to4 est actuellement manquant - sur la série des noyaux vanille 2.2.x (voir -\begin_inset CommandInset ref -LatexCommand ref -name "la vérification du système / noyau" -reference "systemcheck-kernel" - -\end_inset - - pour plus de détails). - Notez aussi que la longueur du préfixe d'une adresse 6to4 est de 16, car, - du point de vue du réseau, tous les autres hôtes 6to4 sont sur la même - couche 2. -\end_layout - -\begin_layout Subsection -Ajouter un tunnel 6to4 -\end_layout - -\begin_layout Standard -Vous avez premièrement à calculer votre préfixe 6to4 en utilisant votre - adresse IPv4 routable assignée localement (si votre hôte n'a pas d'adresse - IPv4 routable, dans des cas précis, NAT sur une passerelle est possible): -\end_layout - -\begin_layout Standard -En considérant que votre adresse IPv4 soit -\end_layout - -\begin_layout Code - -1.2.3.4 -\end_layout - -\begin_layout Standard -le préfixe 6to4 généré sera -\end_layout - -\begin_layout Code - -2002:0102:0304:: -\end_layout - -\begin_layout Standard -Les passerelles locales 6to4 devraient (mais cela n'est pas une nécessité, - vous pouvez choisir un préfixe arbitraire de portée locale, si cela vous - sied mieux) toujours assigner le suffixe -\begin_inset Quotes sld -\end_inset - -::1 -\begin_inset Quotes srd -\end_inset - -, ce qui vous donnera comme adresse 6to4 locale -\end_layout - -\begin_layout Code - -2002:0102:0304::1 -\end_layout - -\begin_layout Standard -Utiliser par exemple ce qui suit pour une génération automatique: -\end_layout - -\begin_layout Code - -ipv4="1.2.3.4"; printf "2002:%02x%02x:%02x%02x::1" `echo $ipv4 | tr "." " "` -\end_layout - -\begin_layout Standard -Il y a maintenant deux façons possibles de mettre en place un tunnelage - 6to4. -\end_layout - -\begin_layout Subsubsection -Utiliser "ip" et un périphérique tunnel dédié -\end_layout - -\begin_layout Standard -C'est dorénavant la façon de faire qui est recommandée (une TTL doit être - spécifiée, car le défaut est 0). -\end_layout - -\begin_layout Standard -Créez un nouveau périphérique tunnel -\end_layout - -\begin_layout Code - -# /sbin/ip tunnel add tun6to4 mode sit ttl remote any local - -\end_layout - -\begin_layout Standard -Montez l'interface -\end_layout - -\begin_layout Code - -# /sbin/ip link set dev tun6to4 up -\end_layout - -\begin_layout Standard -Ajouter une adresse 6to4 locale à l'interface (note: la longueur du préfixe, - 16, est importante!) -\end_layout - -\begin_layout Code - -# /sbin/ip -6 addr add /16 dev tun6to4 -\end_layout - -\begin_layout Standard -Ajouter une route (par défaut) au réseau global IPv6 en utilisant l'adresse - anycast tous-routeurs-6to4 ( -\emph on -all-6to4-routers -\emph default -) -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route add 2000::/3 via ::192.88.99.1 dev tun6to4 metric 1 -\end_layout - -\begin_layout Standard -Il a été rapporté que certaines versions de -\begin_inset Quotes sld -\end_inset - -ip -\begin_inset Quotes srd -\end_inset - - (par exemple Linux SuSe 9.0) ne prennent pas en charge les adresses IPv6 - compatibles IPv4 pour les passerelles. - Dans ce cas, l'adresse IPv6 correspondante doit être employée: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route add 2000::/3 via 2002:c058:6301::1 dev tun6to4 metric - 1 -\end_layout - -\begin_layout Subsubsection -Utiliser "ifconfig", "route" et le périphérique de tunnelage -\begin_inset Quotes sld -\end_inset - -sit0 -\begin_inset Quotes srd -\end_inset - - (méthode dépréciée) -\end_layout - -\begin_layout Standard -Cela est déprécié car le périphérique de tunnel générique sit0 ne permet - pas de spécifier un filtrage par périphérique. -\end_layout - -\begin_layout Standard -Monter l'interface de tunnelage générique sit0 -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit0 up -\end_layout - -\begin_layout Standard -Ajouter une adresse 6to4 locale à une interface -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit0 add /16 -\end_layout - -\begin_layout Standard -Ajouter une route (par défaut) au réseau global IPv6 en utilisant l'adresse - anycast IPv4 tous-relais-6to4 ( -\emph on -all-6to4-relays -\emph default -) -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 add 2000::/3 gw ::192.88.99.1 dev sit0 -\end_layout - -\begin_layout Subsection -Ôter un tunnel 6to4 -\end_layout - -\begin_layout Subsubsection -Utiliser "ip" et un périphérique de tunnelage dédié -\end_layout - -\begin_layout Standard -Ôter toutes les routes traversant ce périphérique de tunnelage spécifique -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route flush dev tun6to4 -\end_layout - -\begin_layout Standard -Démonter l'interface -\end_layout - -\begin_layout Code - -# /sbin/ip link set dev tun6to4 down -\end_layout - -\begin_layout Standard -Ôter un périphérique tunnel -\end_layout - -\begin_layout Code - -# /sbin/ip tunnel del tun6to4 -\end_layout - -\begin_layout Subsubsection -Utiliser -\begin_inset Quotes sld -\end_inset - -ifconfig -\begin_inset Quotes srd -\end_inset - -, -\begin_inset Quotes sld -\end_inset - -route -\begin_inset Quotes srd -\end_inset - - et un périphérique de tunnel générique -\begin_inset Quotes sld -\end_inset - -sit0 -\begin_inset Quotes srd -\end_inset - - (déprécié) -\end_layout - -\begin_layout Standard -Ôter une route (par défaut) traversant une interface tunnel 6to4 -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 del 2000::/3 gw ::192.88.99.1 dev sit0 -\end_layout - -\begin_layout Standard -Ôter une adresse locale 6to4 d'une interface -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit0 del /16 -\end_layout - -\begin_layout Standard -Démontage d'un périphérique de tunnelage générique (prenez garde, peut-être - est-il utilisé...) -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit0 down -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-configuring-ipv4-in-ipv6-tunnels" - -\end_inset - -Configurer les tunnels IPv4-in-IPv6 -\end_layout - -\begin_layout Standard -\align left -Cela sera complété à l'avenir. - Pour le moment, de tels tunnels sont essentiellement employés en environnement - de test, mais il semble que le support soit actuellement manquant pour - linux (03/2004). -\end_layout - -\begin_layout Standard -Pour l'heure, plus d'information dans le -\begin_inset CommandInset href -LatexCommand href -name "RFC 2473 / Generic Packet Tunneling in IPv6 Specification" -target "http://www.faqs.org/rfcs/rfc2473.html" - -\end_inset - - -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-kernel-settings" - -\end_inset - -Les réglages du noyau dans le système de fichiers /proc -\end_layout - -\begin_layout Standard -\begin_inset CommandInset label -LatexCommand label -name "proc-filesystem" - -\end_inset - -Note: la source de cette section est essentiellement le fichier "ip-sysctl.txt", - qui est inclus dans les sources du noyau actuel, dans le répertoire "Documentat -ion/networking". - Le crédit va à Pekka Savola qui maintient la partie de ce fichier relative - à IPv6. - D'autres textes sont aussi plus ou moins copier/coller dans cette partie - de document. -\end_layout - -\begin_layout Section -Comment accéder au système de fichiers /proc -\end_layout - -\begin_layout Subsection -Utiliser -\begin_inset Quotes sld -\end_inset - -cat -\begin_inset Quotes srd -\end_inset - - et -\begin_inset Quotes sld -\end_inset - -echo -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -Utiliser "cat" et "echo" est le moyen le plus simple d'accéder au système - de fichiers /proc, mais certains pré-requis sont nécessaires à cela -\end_layout - -\begin_layout Itemize -Le système de fichiers /proc doit être rendu disponible dans le noyau, ce - qui signifie qu'à la compilation le commutateur suivant doit avoir été - positionné -\end_layout - -\begin_layout Code - -CONFIG_PROC_FS=y -\end_layout - -\begin_layout Itemize -Le système de fichiers /proc doit être auparavant monté, ce qui peut être - testé en faisant -\end_layout - -\begin_layout Code - -# mount | grep "type proc" -\end_layout - -\begin_layout Code - -none on /proc type proc (rw) -\end_layout - -\begin_layout Itemize -Vous devez pouvoir lire le système de fichiers /proc et parfois aussi y - écrire (normalement seul root le peut) -\end_layout - -\begin_layout Standard -Normalement, seules les entrées dans /proc/sys/* sont en écriture, les autres - sont en lecture seule et servent seulement à la récupération de l'information. -\end_layout - -\begin_layout Subsubsection -Récupérer une valeur -\end_layout - -\begin_layout Standard -La valeur de l'entrée peut être récupérée en utilisant "cat": -\end_layout - -\begin_layout Code - -# cat /proc/sys/net/ipv6/conf/all/forwarding -\end_layout - -\begin_layout Code - -0 -\end_layout - -\begin_layout Subsubsection -Fixer une valeur -\end_layout - -\begin_layout Standard -Une nouvelle valeur peut être fixée (si l'entrée est en écriture) en utilisant - echo: -\end_layout - -\begin_layout Code - -# echo "1" >/proc/sys/net/ipv6/conf/all/forwarding -\end_layout - -\begin_layout Subsection -Utiliser -\begin_inset Quotes sld -\end_inset - -sysctl -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -Utiliser le programme "sysctl" pour accéder aux commutateurs du noyau est - une méthode moderne aujourd'hui. - Vous pouvez aussi l'utiliser même si le système de fichiers /proc n'est - pas monté. - Mais vous n'avez alors accès qu'à /proc/sys/*! -\end_layout - -\begin_layout Standard -Le programme -\begin_inset Quotes sld -\end_inset - -sysctl -\begin_inset Quotes srd -\end_inset - - est compris dans le paquetage -\begin_inset Quotes sld -\end_inset - -procps -\begin_inset Quotes srd -\end_inset - - (sur le système Red Hat). -\end_layout - -\begin_layout Itemize -L'interface sysctl doit être disponible dans le noyau, ce qui signifie qu'à - la compilation le commutateur suivant a à être fixé -\end_layout - -\begin_layout Code - -CONFIG_SYSCTL=y -\end_layout - -\begin_layout Subsubsection -Récupérer une valeur -\end_layout - -\begin_layout Standard -La valeur de l'entrée peut maintenant être récupérée: -\end_layout - -\begin_layout Code - -# sysctl net.ipv6.conf.all.forwarding -\end_layout - -\begin_layout Code - -net.ipv6.conf.all.forwarding = 0 -\end_layout - -\begin_layout Subsubsection -Fixer une valeur -\end_layout - -\begin_layout Standard -Une nouvelle valeur peut être fixée (si l'entrée est en écriture): -\end_layout - -\begin_layout Code - -# sysctl -w net.ipv6.conf.all.forwarding=1 -\end_layout - -\begin_layout Code - -net.ipv6.conf.all.forwarding = 1 -\end_layout - -\begin_layout Standard -Note: n'utilisez pas d'espaces autour du signe "=" lorsque vous fixez les - valeurs. - De même pour une valeur multiple sur une même ligne, mettez des guillemets - comme ceci -\end_layout - -\begin_layout Code - -# sysctl -w net.ipv4.ip_local_port_range="32768 61000" -\end_layout - -\begin_layout Code - -net.ipv4.ip_local_port_range = 32768 61000 -\end_layout - -\begin_layout Subsubsection -En plus -\end_layout - -\begin_layout Standard -Note: il existe dans la pratique certaines versions de sysctl qui affichent - -\begin_inset Quotes sld -\end_inset - -/ -\begin_inset Quotes srd -\end_inset - - au lieu de -\begin_inset Quotes sld -\end_inset - -. -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -Pour plus de détails jetez un coup d'oeil dans la page de manuel de sysctl. -\end_layout - -\begin_layout Standard -une astuce: pour une recherche rapide parmi les réglages, utiliser -\begin_inset Quotes sld -\end_inset - --a -\begin_inset Quotes srd -\end_inset - - (afficher toutes les entrées) en conjonction avec -\begin_inset Quotes sld -\end_inset - -grep -\begin_inset Quotes srd -\end_inset - -. -\end_layout - -\begin_layout Subsection -Les types de valeur trouvés dans le système de fichiers /proc -\end_layout - -\begin_layout Standard -IL y a plusieurs formats observés dans le système de fichiers /proc: -\end_layout - -\begin_layout Itemize -BOOLÉEN: simple -\begin_inset Quotes sld -\end_inset - -0 -\begin_inset Quotes srd -\end_inset - - (faux) ou -\begin_inset Quotes sld -\end_inset - -1 -\begin_inset Quotes srd -\end_inset - - (vrai) -\end_layout - -\begin_layout Itemize -ENTIER: une valeur entière, peut être également non signée -\end_layout - -\begin_layout Itemize -Des lignes plus sophistiquées avec plusieurs valeurs: parfois un en-tête - est aussi affiché, sinon, jetez un coup d'oeil aux sources du noyau pour - savoir quel sens possède telle ou telle valeur... -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "proc-sys-net-ipv6" - -\end_inset - -Les entrées de /proc/sys/net/ipv6/ -\end_layout - -\begin_layout Subsection -conf/default/* -\end_layout - -\begin_layout Standard -Changer les réglages par défaut spécifiques à chaque interface. -\end_layout - -\begin_layout Subsection -conf/all/* -\end_layout - -\begin_layout Standard -Changer tous les réglages spécifiques aux interfaces. -\end_layout - -\begin_layout Standard -Exception: -\begin_inset Quotes sld -\end_inset - -conf/all/forwarding -\begin_inset Quotes srd -\end_inset - - a une signification différente ici -\end_layout - -\begin_layout Subsubsection -conf/all/forwarding -\end_layout - -\begin_layout Itemize -Type: BOOLÉEN -\end_layout - -\begin_layout Standard -Ceci rend disponible le renvoi global IPv6 entre toutes les interfaces. -\end_layout - -\begin_layout Standard -En IPv6, vous ne pouvez contrôler le renvoi par périphérique, le contrôle - du renvoi doit être réalisé en utilisant les jeux de règles de netfilter-IPv6 - (contrôlés grâce à ip6tables) en spécifiant les périphériques d'entrée - et de sortie (voir -\begin_inset CommandInset ref -LatexCommand ref -name "comment mettre en place un pare-feu/Netfilter6" -reference "firewalling-netfilter6" - -\end_inset - - pour plus d'information); à la différence d'IPv4, où vous pouvez contrôler - le renvoi périphérique par périphérique (la décision est prise sur l'interface - qui reçoit des paquets). -\end_layout - -\begin_layout Standard -Ceci fixe aussi le réglage du renvoi Hôte/Routeur de toutes les interfaces - à la valeur spécifiée. - Voir plus bas pour plus de détails. - Tout ceci relève du renvoi global. -\end_layout - -\begin_layout Standard -Si cette valeur est à 0, aucun renvoi IPv6 n'est disponible, jamais aucun - paquet ne part vers une autre interface, ni physique, ni logique, comme - par exemple un tunnel. -\end_layout - -\begin_layout Subsection -conf/interface/* -\end_layout - -\begin_layout Standard -Changer les réglages spécifiques à chaque interface. -\end_layout - -\begin_layout Standard -Le comportement fonctionnel de certains réglages est dépendant du positionnement - du renvoi local, disponible ou non. -\end_layout - -\begin_layout Subsubsection -accept_ra -\end_layout - -\begin_layout Itemize -Type: BOOLÉEN -\end_layout - -\begin_layout Itemize -Défaut fonctionnel: disponible si le renvoi local est disponible; indisponible - si le renvoi local est disponible. -\end_layout - -\begin_layout Standard -Accepter les annonces de routeur, et auto-configurer cette interface avec - les données reçues. -\end_layout - -\begin_layout Subsubsection -accept_redirects -\end_layout - -\begin_layout Itemize -Type: BOOLÉEN -\end_layout - -\begin_layout Itemize -Défaut fonctionnel: disponible si le renvoi local est indisponible. - Indisponible si le renvoi local est disponible. -\end_layout - -\begin_layout Standard -Accepter les redirections émises par un routeur IPv6. -\end_layout - -\begin_layout Subsubsection -autoconf -\end_layout - -\begin_layout Itemize -Type: BOOLÉEN -\end_layout - -\begin_layout Itemize -Défaut: VRAI -\end_layout - -\begin_layout Standard -Configurer les adresses lien-local (voir aussi -\begin_inset CommandInset ref -LatexCommand ref -name "Les types d'adresse" -reference "chapter-addresstypes" - -\end_inset - -) utilisant les adresses matérielles L2. - Par exemple, ceci génère, comme par magie, une adresse telle que -\begin_inset Quotes sld -\end_inset - -fe80::201:23ff:fe45:6789 -\begin_inset Quotes srd -\end_inset - - sur une interface ayant une adresse MAC-L2. -\end_layout - -\begin_layout Subsubsection -dad_transmits -\end_layout - -\begin_layout Itemize -Type: ENTIER -\end_layout - -\begin_layout Itemize -Défaut: 1 -\end_layout - -\begin_layout Standard -Quantité de message de détection d'adresse dupliquée à émettre. -\end_layout - -\begin_layout Subsubsection -forwarding -\end_layout - -\begin_layout Itemize -Type: BOOLÉEN -\end_layout - -\begin_layout Itemize -Défaut: FAUX si le renvoi global est indisponible (défaut), sinon VRAI -\end_layout - -\begin_layout Standard -Configurer le comportement spécifique à chaque interface Hôte/Routeur. -\end_layout - -\begin_layout Standard -Note: Il est recommandé d'avoir le même réglage sur toutes les interfaces; - mélanger les scénarii routeur/hôte est plutôt atypique. -\end_layout - -\begin_layout Itemize -Valeur FAUX: Par défaut, le comportement d'hôte est assumé. - Cela signifie que: -\end_layout - -\begin_layout Enumerate -Le drapeau IsRouter n'est pas positionné dans les annonces de voisinage. -\end_layout - -\begin_layout Enumerate -Les sollicitations de routeur sont envoyées dès que nécessaires. -\end_layout - -\begin_layout Enumerate -Si accept_ra est VRAI (défaut), accepte les annonces de routeur (et réalise - une auto-configuration). -\end_layout - -\begin_layout Enumerate -Si accept_redirects est VRAI (défaut), accepte les redirections. -\end_layout - -\begin_layout Itemize -Valeur VRAI: si le renvoi local est disponible, le comportement d'un routeur - est assumé. - Ceci signifie l'opposé de ce qui précéde: -\end_layout - -\begin_layout Enumerate -Le drapeau IsRouter est positionné dans les annonces de voisinage. -\end_layout - -\begin_layout Enumerate -Les sollicitations de routeur ne sont pas émises. -\end_layout - -\begin_layout Enumerate -Les annonces de routeur sont ignorées. -\end_layout - -\begin_layout Enumerate -Les redirections sont ignorées. -\end_layout - -\begin_layout Subsubsection -hop_limit -\end_layout - -\begin_layout Itemize -Type: ENTIER -\end_layout - -\begin_layout Itemize -Défaut: 64 -\end_layout - -\begin_layout Standard -Nombre limite de sauts par défaut. -\end_layout - -\begin_layout Subsubsection -mtu -\end_layout - -\begin_layout Itemize -Type: ENTIER -\end_layout - -\begin_layout Itemize -Défaut: 1280 (minimum requis pour IPv6) -\end_layout - -\begin_layout Standard -Unité de transfert maximum par défaut -\end_layout - -\begin_layout Subsubsection -router_solicitation_delay -\end_layout - -\begin_layout Itemize -Type: ENTIER -\end_layout - -\begin_layout Itemize -Défaut: 1 -\end_layout - -\begin_layout Standard -Nombre de secondes à attendre après le montage d'une interface avant d'émettre - des sollicitations de routeur. -\end_layout - -\begin_layout Subsubsection -router_solicitation_interval -\end_layout - -\begin_layout Itemize -Type: ENTIER -\end_layout - -\begin_layout Itemize -Défaut: 4 -\end_layout - -\begin_layout Standard -Nombre de secondes d'attente entre les émissions de sollicitations de routeur. -\end_layout - -\begin_layout Subsubsection -router_solicitations -\end_layout - -\begin_layout Itemize -Type: ENTIER -\end_layout - -\begin_layout Itemize -Défaut: 3 -\end_layout - -\begin_layout Standard -Nombre de sollicitation(s) de routeur à émettre avant de considérer qu'aucun - routeur n'est présent. -\end_layout - -\begin_layout Subsection -neigh/default/* -\end_layout - -\begin_layout Standard -Changer les réglages par défaut pour la détection de voisinage et certaines - valeurs d'intervalle global et de déclenchement ( -\emph on -threshold -\emph default -): -\end_layout - -\begin_layout Subsubsection -gc_thresh1 -\end_layout - -\begin_layout Itemize -Type: ENTIER -\end_layout - -\begin_layout Itemize -Défaut: 128 -\end_layout - -\begin_layout Standard -A remplir plus avant. -\end_layout - -\begin_layout Subsubsection -gc_thresh2 -\end_layout - -\begin_layout Itemize -Type: ENTIER -\end_layout - -\begin_layout Itemize -Défaut: 512 -\end_layout - -\begin_layout Standard -A remplir plus avant. -\end_layout - -\begin_layout Subsubsection -gc_thresh3 -\end_layout - -\begin_layout Itemize -Type: ENTIER -\end_layout - -\begin_layout Itemize -Défaut: 1024 -\end_layout - -\begin_layout Standard -Paramètre de réglage de la taille de la table du voisinage. -\end_layout - -\begin_layout Standard -Augmenter cette valeur si vous avez de nombreuses interfaces et un problème - avec des routes qui commencent à mystérieusement s'activer et échouer. - Ou si un -\begin_inset CommandInset href -LatexCommand href -name "démon de routage Zebra" -target "http://www.zebra.org/" - -\end_inset - - en cours d'activité rapporte cette erreur: -\end_layout - -\begin_layout Code - -ZEBRA: netlink-listen error: No buffer space available, type=RTM_NEWROUTE(24), - seq=426, pid=0 -\end_layout - -\begin_layout Subsubsection -gc_interval -\end_layout - -\begin_layout Itemize -Type: ENTIER -\end_layout - -\begin_layout Itemize -Défaut: 30 -\end_layout - -\begin_layout Standard -A remplir plus avant. -\end_layout - -\begin_layout Subsection -neigh/interface/* -\end_layout - -\begin_layout Standard -Changez ces réglages spécifiques à chaque interface pour la détection de - voisinage. -\end_layout - -\begin_layout Subsubsection -anycast_delay -\end_layout - -\begin_layout Itemize -Type: ENTIER -\end_layout - -\begin_layout Itemize -Défaut: 100 -\end_layout - -\begin_layout Standard -A remplir plus avant. -\end_layout - -\begin_layout Subsubsection -gc_stale_time -\end_layout - -\begin_layout Itemize -Type: ENTIER -\end_layout - -\begin_layout Itemize -Défaut: 60 -\end_layout - -\begin_layout Standard -A remplir plus avant. -\end_layout - -\begin_layout Subsubsection -proxy_qlen -\end_layout - -\begin_layout Itemize -Type: ENTIER -\end_layout - -\begin_layout Itemize -Défaut: 64 -\end_layout - -\begin_layout Standard -A remplir plus avant. -\end_layout - -\begin_layout Subsubsection -unres_qlen -\end_layout - -\begin_layout Itemize -Type: ENTIER -\end_layout - -\begin_layout Itemize -Défaut: 3 -\end_layout - -\begin_layout Standard -A remplir plus avant. -\end_layout - -\begin_layout Subsubsection -app_solicit -\end_layout - -\begin_layout Itemize -Type: ENTIER -\end_layout - -\begin_layout Itemize -Défaut: 0 -\end_layout - -\begin_layout Standard -A remplir plus avant. -\end_layout - -\begin_layout Subsubsection -locktime -\end_layout - -\begin_layout Itemize -Type: ENTIER -\end_layout - -\begin_layout Itemize -Défaut: 0 -\end_layout - -\begin_layout Standard -A remplir plus avant. -\end_layout - -\begin_layout Subsubsection -retrans_time -\end_layout - -\begin_layout Itemize -Type: ENTIER -\end_layout - -\begin_layout Itemize -Défaut: 100 -\end_layout - -\begin_layout Standard -A remplir plus avant. -\end_layout - -\begin_layout Subsubsection -base_reachable_time -\end_layout - -\begin_layout Itemize -Type: ENTIER -\end_layout - -\begin_layout Itemize -Défaut: 30 -\end_layout - -\begin_layout Standard -A remplir plus avant. -\end_layout - -\begin_layout Subsubsection -mcast_solicit -\end_layout - -\begin_layout Itemize -Type: ENTIER -\end_layout - -\begin_layout Itemize -Défaut: 3 -\end_layout - -\begin_layout Standard -A remplir plus avant. -\end_layout - -\begin_layout Subsubsection -ucast_solicit -\end_layout - -\begin_layout Itemize -Type: ENTIER -\end_layout - -\begin_layout Itemize -Défaut: 3 -\end_layout - -\begin_layout Standard -A remplir plus avant. -\end_layout - -\begin_layout Subsubsection -delay_first_probe_time -\end_layout - -\begin_layout Itemize -Type: ENTIER -\end_layout - -\begin_layout Itemize -Défaut: 5 -\end_layout - -\begin_layout Standard -A remplir plus avant. -\end_layout - -\begin_layout Subsubsection -proxy_delay -\end_layout - -\begin_layout Itemize -Type: ENTIER -\end_layout - -\begin_layout Itemize -Défaut: 80 -\end_layout - -\begin_layout Standard -A remplir plus avant. -\end_layout - -\begin_layout Subsection -route/* -\end_layout - -\begin_layout Standard -Changer les réglages globaux du routage. -\end_layout - -\begin_layout Subsubsection -flush -\end_layout - -\begin_layout Standard -Retiré des nouvelles versions du noyau . -\end_layout - -\begin_layout Subsubsection -gc_interval -\end_layout - -\begin_layout Itemize -Type: ENTIER -\end_layout - -\begin_layout Itemize -Défaut: 30 -\end_layout - -\begin_layout Standard -A remplir plus avant. -\end_layout - -\begin_layout Subsubsection -gc_thresh -\end_layout - -\begin_layout Itemize -Type: ENTIER -\end_layout - -\begin_layout Itemize -Défaut: 1024 -\end_layout - -\begin_layout Standard -A remplir plus avant. -\end_layout - -\begin_layout Subsubsection -mtu_expires -\end_layout - -\begin_layout Itemize -Type: ENTIER -\end_layout - -\begin_layout Itemize -Défaut: 600 -\end_layout - -\begin_layout Standard -A remplir plus avant. -\end_layout - -\begin_layout Subsubsection -gc_elasticity -\end_layout - -\begin_layout Itemize -Type: ENTIER -\end_layout - -\begin_layout Itemize -Défaut: 0 -\end_layout - -\begin_layout Standard -A remplir plus avant. -\end_layout - -\begin_layout Subsubsection -gc_min_interval -\end_layout - -\begin_layout Itemize -Type: ENTIER -\end_layout - -\begin_layout Itemize -Défaut: 5 -\end_layout - -\begin_layout Standard -A remplir plus avant. -\end_layout - -\begin_layout Subsubsection -gc_timeout -\end_layout - -\begin_layout Itemize -Type: ENTIER -\end_layout - -\begin_layout Itemize -Défaut: 60 -\end_layout - -\begin_layout Standard -A remplir plus avant. -\end_layout - -\begin_layout Subsubsection -min_adv_mss -\end_layout - -\begin_layout Itemize -Type: ENTIER -\end_layout - -\begin_layout Itemize -Défaut: 12 -\end_layout - -\begin_layout Standard -A remplir plus avant. -\end_layout - -\begin_layout Subsubsection -max_size -\end_layout - -\begin_layout Itemize -Type: ENTIER -\end_layout - -\begin_layout Itemize -Défaut: 4096 -\end_layout - -\begin_layout Standard -A remplir plus avant. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "proc-sys-net-ipv4" - -\end_inset - -Les entrées relatives à IPv6 dans /proc/sys/net/ipv4/ -\end_layout - -\begin_layout Standard -Pour le moment (et cela sera valable jusqu'à ce qu'IPv4 soit complètement - converti en un module indépendant du noyau), certains commutateurs IPv4 - sont aussi utilisés par IPv6. -\end_layout - -\begin_layout Subsection -ip_* -\end_layout - -\begin_layout Subsubsection -ip_local_port_range -\end_layout - -\begin_layout Standard -Ce réglage sont aussi utilisé par IPv6. -\end_layout - -\begin_layout Subsection -tcp_* -\end_layout - -\begin_layout Standard -Ces réglages sont aussi utilisés par IPv6. -\end_layout - -\begin_layout Subsection -icmp_* -\end_layout - -\begin_layout Standard -Ces réglages ne sont pas utilisés par IPv6. - Pour réaliser une limitation du trafic ICMPv6 (ce qui est très recommandé - compte tenu de possibles engorgements ICMPv6), des règles netfilter-v6 - doivent être utilisées. -\end_layout - -\begin_layout Subsection -autre(s) -\end_layout - -\begin_layout Standard -Inconnu(s), mais probablement inutilisé(s) par IPv6. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "proc-net" - -\end_inset - -Les entrées relatives à IPv6 dans /proc/net/ -\end_layout - -\begin_layout Standard -Dans /proc/net il y a plusieurs entrées disponibles en lecture seule. - Vous ne pouvez pas utiliser ici -\begin_inset Quotes sld -\end_inset - -sysctl -\begin_inset Quotes srd -\end_inset - - afin de récupérer des informations, utiliser -\begin_inset Quotes sld -\end_inset - -cat -\begin_inset Quotes srd -\end_inset - -. -\end_layout - -\begin_layout Subsection -if_inet6 -\end_layout - -\begin_layout Itemize -Type: Une ligne par adresse comporte plusieurs valeurs -\end_layout - -\begin_layout Standard -Ici toutes les adresses IPv6 configurées sont montrées sous un format particulie -r. - L'exemple affiche seulement l'interface loopback. - Sa signification est détaillée ci-dessous (voir -\begin_inset Quotes sld -\end_inset - -net/ipv6/addrconf.c -\begin_inset Quotes srd -\end_inset - - pour en savoir plus). -\end_layout - -\begin_layout Code - -# cat /proc/net/if_inet6 -\end_layout - -\begin_layout Code - -00000000000000000000000000000001 01 80 10 80 lo -\end_layout - -\begin_layout Code - -+------------------------------+ ++ ++ ++ ++ ++ -\end_layout - -\begin_layout Code - -| | | | | | -\end_layout - -\begin_layout Code - -1 2 3 4 5 6 -\end_layout - -\begin_layout Enumerate -L'adresse IPv6 affichée grâce à 32 caractères hexadécimaux sans le séparateur - ":" -\end_layout - -\begin_layout Enumerate -Numéro de périphérique Netlink (index d'interface) in hexadécimal (voir - aussi -\begin_inset Quotes sld -\end_inset - -ip addr -\begin_inset Quotes srd -\end_inset - -) -\end_layout - -\begin_layout Enumerate -La longueur du préfixe en hexadécimal -\end_layout - -\begin_layout Enumerate -La valeur de la portée (voir les sources du noyau "include/net/ipv6.h" et - "net/ipv6/addrconf.c" pour plus de détails) -\end_layout - -\begin_layout Enumerate -Les drapeaux de l'interface (voir -\begin_inset Quotes sld -\end_inset - -include/linux/rtnetlink.h -\begin_inset Quotes srd -\end_inset - - et -\begin_inset Quotes sld -\end_inset - -net/ipv6/addrconf.c -\begin_inset Quotes srd -\end_inset - - pour en savoir plus) -\end_layout - -\begin_layout Enumerate -Le nom du périphérique -\end_layout - -\begin_layout Subsection -ipv6_route -\end_layout - -\begin_layout Itemize -Type: Une ligne par route comporte plusieurs valeurs -\end_layout - -\begin_layout Standard -Ici toutes les routes IPv6 configurées sont montrées dans un format particulier. - L'exemple affiche seulement l'interface loopback. - Sa signification est détaillée ci-dessous (voir -\begin_inset Quotes sld -\end_inset - -net/ipv6/route.c -\begin_inset Quotes srd -\end_inset - - pour en savoir plus). -\end_layout - -\begin_layout Code - -# cat /proc/net/ipv6_route -\end_layout - -\begin_layout Code - -00000000000000000000000000000000 00 00000000000000000000000000000000 00 -\end_layout - -\begin_layout Code - -+------------------------------+ ++ +------------------------------+ ++ -\end_layout - -\begin_layout Code - -| | | | -\end_layout - -\begin_layout Code - -1 2 3 4 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -¬ 00000000000000000000000000000000 ffffffff 00000001 00000001 00200200 lo -\end_layout - -\begin_layout Code - -¬ +------------------------------+ +------+ +------+ +------+ +------+ ++ -\end_layout - -\begin_layout Code - -¬ | | | | | | -\end_layout - -\begin_layout Code - -¬ 5 6 7 8 9 10 -\end_layout - -\begin_layout Enumerate -Le réseau de destination IPv6 affiché grâce à 32 caractères hexadécimaux - sans le séparateur ":" -\end_layout - -\begin_layout Enumerate -La longueur du préfixe de destination IPv6 en hexadécimal -\end_layout - -\begin_layout Enumerate -Le réseau source IPv6 affiché grâce à 32 caractères hexadécimaux sans le - séparateur ":" -\end_layout - -\begin_layout Enumerate -La longueur du préfixe de la source IPv6 en hexadécimal -\end_layout - -\begin_layout Enumerate -Le prochain saut IPv6 affiché grâce à 32 caractères hexadécimaux sans le - séparateur ":" -\end_layout - -\begin_layout Enumerate -La distance en hexadécimal -\end_layout - -\begin_layout Enumerate -Compteur de référence -\end_layout - -\begin_layout Enumerate -Compteur d'utilisation -\end_layout - -\begin_layout Enumerate -Les drapeaux -\end_layout - -\begin_layout Enumerate -Nom du périphérique -\end_layout - -\begin_layout Subsection -sockstat6 -\end_layout - -\begin_layout Itemize -Type: Une ligne par protocole avec description et valeur -\end_layout - -\begin_layout Standard -Statistiques à propos de l'utilisation des sockets IPv6. - Exemple: -\end_layout - -\begin_layout Code - -# cat /proc/net/sockstat6 -\end_layout - -\begin_layout Code - -TCP6: inuse 7 -\end_layout - -\begin_layout Code - -UDP6: inuse 2 -\end_layout - -\begin_layout Code - -RAW6: inuse 1 -\end_layout - -\begin_layout Code - -FRAG6: inuse 0 memory 0 -\end_layout - -\begin_layout Subsection -tcp6 -\end_layout - -\begin_layout Standard -A remplir. -\end_layout - -\begin_layout Subsection -udp6 -\end_layout - -\begin_layout Standard -A remplir. -\end_layout - -\begin_layout Subsection -igmp6 -\end_layout - -\begin_layout Standard -A remplir. -\end_layout - -\begin_layout Subsection -raw6 -\end_layout - -\begin_layout Standard -A remplir. -\end_layout - -\begin_layout Subsection -ip6_flowlabel -\end_layout - -\begin_layout Standard -A remplir. -\end_layout - -\begin_layout Subsection -rt6_stats -\end_layout - -\begin_layout Standard -A remplir. -\end_layout - -\begin_layout Subsection -snmp6 -\end_layout - -\begin_layout Itemize -Type: Une ligne par description et valeur SNMP -\end_layout - -\begin_layout Standard -Statistiques SNMP, peuvent être récupérées par un serveur SNMP et mis en - rapport à une tableau MIB grâce à un logiciel d'administration réseau. -\end_layout - -\begin_layout Subsection -ip6_tables_names -\end_layout - -\begin_layout Standard -Tables netfilter6 disponibles -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "netlink" - -\end_inset - -L'interface de netlink vers le noyau -\end_layout - -\begin_layout Standard -A remplir... - je n'ai en cela pas d'expérience... -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "network-debugging" - -\end_inset - -Le déboguage réseau -\end_layout - -\begin_layout Section -Les sockets d'écoute de serveur -\end_layout - -\begin_layout Subsection -Utiliser -\begin_inset Quotes sld -\end_inset - -netstat -\begin_inset Quotes srd -\end_inset - - pour vérifier les sockets d'écoute de serveur -\end_layout - -\begin_layout Standard -C'est toujours intéressant de savoir quelles sockets de serveur sont actives - à un moment donné sur un noeud. - Utiliser -\begin_inset Quotes sld -\end_inset - -netstat -\begin_inset Quotes srd -\end_inset - - est le moyen le plus court pour obtenir une telle information: -\end_layout - -\begin_layout Standard -options employées: -nlptu -\end_layout - -\begin_layout Standard -Exemple: -\end_layout - -\begin_layout Code - -# netstat -nlptu -\end_layout - -\begin_layout Code - -Active Internet connections (only servers) -\end_layout - -\begin_layout Code - -Proto Recv-Q Send-Q Local Address Foreign Address State - -\end_layout - -\begin_layout Code - -¬ PID/Program name -\end_layout - -\begin_layout Code - -tcp 0 0 0.0.0.0:32768 0.0.0.0:* LISTEN - -\end_layout - -\begin_layout Code - -¬ 1258/rpc.statd -\end_layout - -\begin_layout Code - -tcp 0 0 0.0.0.0:32769 0.0.0.0:* LISTEN - -\end_layout - -\begin_layout Code - -¬ 1502/rpc.mountd -\end_layout - -\begin_layout Code - -tcp 0 0 0.0.0.0:515 0.0.0.0:* LISTEN - -\end_layout - -\begin_layout Code - -¬ 22433/lpd Waiting -\end_layout - -\begin_layout Code - -tcp 0 0 1.2.3.1:139 0.0.0.0:* LISTEN - -\end_layout - -\begin_layout Code - -¬ 1746/smbd -\end_layout - -\begin_layout Code - -tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN - -\end_layout - -\begin_layout Code - -¬ 1230/portmap -\end_layout - -\begin_layout Code - -tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN - -\end_layout - -\begin_layout Code - -¬ 3551/X -\end_layout - -\begin_layout Code - -tcp 0 0 1.2.3.1:8081 0.0.0.0:* LISTEN - -\end_layout - -\begin_layout Code - -¬ 18735/junkbuster -\end_layout - -\begin_layout Code - -tcp 0 0 1.2.3.1:3128 0.0.0.0:* LISTEN - -\end_layout - -\begin_layout Code - -¬ 18822/(squid) -\end_layout - -\begin_layout Code - -tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN - -\end_layout - -\begin_layout Code - -¬ 30734/named -\end_layout - -\begin_layout Code - -tcp 0 0 ::ffff:1.2.3.1:993 :::* LISTEN - -\end_layout - -\begin_layout Code - -¬ 6742/xinetd-ipv6 -\end_layout - -\begin_layout Code - -tcp 0 0 :::13 :::* LISTEN - -\end_layout - -\begin_layout Code - -¬ 6742/xinetd-ipv6 -\end_layout - -\begin_layout Code - -tcp 0 0 ::ffff:1.2.3.1:143 :::* LISTEN - -\end_layout - -\begin_layout Code - -¬ 6742/xinetd-ipv6 -\end_layout - -\begin_layout Code - -tcp 0 0 :::53 :::* LISTEN - -\end_layout - -\begin_layout Code - -¬ 30734/named -\end_layout - -\begin_layout Code - -tcp 0 0 :::22 :::* LISTEN - -\end_layout - -\begin_layout Code - -¬ 1410/sshd -\end_layout - -\begin_layout Code - -tcp 0 0 :::6010 :::* LISTEN - -\end_layout - -\begin_layout Code - -¬ 13237/sshd -\end_layout - -\begin_layout Code - -udp 0 0 0.0.0.0:32768 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 1258/rpc.statd -\end_layout - -\begin_layout Code - -udp 0 0 0.0.0.0:2049 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ - -\end_layout - -\begin_layout Code - -udp 0 0 0.0.0.0:32770 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 1502/rpc.mountd -\end_layout - -\begin_layout Code - -udp 0 0 0.0.0.0:32771 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ - -\end_layout - -\begin_layout Code - -udp 0 0 1.2.3.1:137 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 1751/nmbd -\end_layout - -\begin_layout Code - -udp 0 0 0.0.0.0:137 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 1751/nmbd -\end_layout - -\begin_layout Code - -udp 0 0 1.2.3.1:138 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 1751/nmbd -\end_layout - -\begin_layout Code - -udp 0 0 0.0.0.0:138 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 1751/nmbd -\end_layout - -\begin_layout Code - -udp 0 0 0.0.0.0:33044 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 30734/named -\end_layout - -\begin_layout Code - -udp 0 0 1.2.3.1:53 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 30734/named -\end_layout - -\begin_layout Code - -udp 0 0 127.0.0.1:53 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 30734/named -\end_layout - -\begin_layout Code - -udp 0 0 0.0.0.0:67 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 1530/dhcpd -\end_layout - -\begin_layout Code - -udp 0 0 0.0.0.0:67 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 1530/dhcpd -\end_layout - -\begin_layout Code - -udp 0 0 0.0.0.0:32858 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 18822/(squid) -\end_layout - -\begin_layout Code - -udp 0 0 0.0.0.0:4827 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 18822/(squid) -\end_layout - -\begin_layout Code - -udp 0 0 0.0.0.0:111 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 1230/portmap -\end_layout - -\begin_layout Code - -udp 0 0 :::53 :::* - -\end_layout - -\begin_layout Code - -¬ 30734/named -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "examples-tcpdump" - -\end_inset - -Des exemples de dump provenant de tcpdump -\end_layout - -\begin_layout Standard -Suivent quelques exemples de paquets capturés, cela sera peut-être utile - pour vos propres déboguages... -\end_layout - -\begin_layout Standard -...plus d'info à venir... -\end_layout - -\begin_layout Subsection -La découverte de routeur -\end_layout - -\begin_layout Subsubsection -Une annonce de routeur -\end_layout - -\begin_layout Code - -15:43:49.484751 fe80::212:34ff:fe12:3450 > ff02::1: icmp6: router -\end_layout - -\begin_layout Code - -¬ advertisement(chlim=64, router_ltime=30, reachable_time=0, -\end_layout - -\begin_layout Code - -¬ retrans_time=0)(prefix info: AR valid_ltime=30, preffered_ltime=20, -\end_layout - -\begin_layout Code - -¬ prefix=2002:0102:0304:1::/64)(prefix info: LAR valid_ltime=2592000, -\end_layout - -\begin_layout Code - -¬ preffered_ltime=604800, prefix=3ffe:ffff:0:1::/64)(src lladdr: -\end_layout - -\begin_layout Code - -¬ 0:12:34:12:34:50) (len 88, hlim 255) -\end_layout - -\begin_layout Standard -Un routeur, avec pour adresse lien-local -\begin_inset Quotes sld -\end_inset - -fe80::212:34ff:fe12:3450 -\begin_inset Quotes srd -\end_inset - -, émet une annonce à l'adresse multicast tous-les-noeuds-du-lien ( -\emph on -all-node-on-link -\emph default -) -\begin_inset Quotes sld -\end_inset - -ff02::1 -\begin_inset Quotes srd -\end_inset - -, contenant deux préfixes, -\begin_inset Quotes sld -\end_inset - -2002:0102:0304:1::/64 -\begin_inset Quotes srd -\end_inset - - (d'une durée de vie de 30 s) et -\begin_inset Quotes sld -\end_inset - -3ffe:ffff:0:1::/64 -\begin_inset Quotes srd -\end_inset - - (d'une durée de vie de 2592000 s), incluant sa propre adresse MAC de couche - 2, -\begin_inset Quotes sld -\end_inset - -0:12:34:12:34:50 -\begin_inset Quotes srd -\end_inset - -. -\end_layout - -\begin_layout Subsubsection -Une sollicitation de routeur -\end_layout - -\begin_layout Code - -15:44:21.152646 fe80::212:34ff:fe12:3456 > ff02::2: icmp6: router solicitation -\end_layout - -\begin_layout Code - -¬ (src lladdr: 0:12:34:12:34:56) (len 16, hlim 255) -\end_layout - -\begin_layout Standard -Un noeud, avec pour adresse lien-local -\begin_inset Quotes sld -\end_inset - -fe80::212:34ff:fe12:3456 -\begin_inset Quotes srd -\end_inset - - et comme adresse de couche 2 -\begin_inset Quotes sld -\end_inset - -0:12:34:12:34:56 -\begin_inset Quotes srd -\end_inset - -, est en quête d'un routeur présent sur le lien, en conséquence il émet - cette sollicitation à l'adresse multicast tous-routeurs-présents-sur-le-lien - ( -\emph on -all-router-on-link -\emph default -) -\begin_inset Quotes sld -\end_inset - -ff02::2 -\begin_inset Quotes srd -\end_inset - -. -\end_layout - -\begin_layout Subsection -La découverte de voisinage -\end_layout - -\begin_layout Subsubsection -Une sollicitation de découverte de voisinage afin de détecter une possible - duplication d'adresse -\end_layout - -\begin_layout Standard -Les paquets suivants sont émis par un noeud sur la couche 2, adresse MAC - -\begin_inset Quotes sld -\end_inset - -0:12:34:12:34:56 -\begin_inset Quotes srd -\end_inset - -, pendant l'auto-configuration, afin de vérifier si une adresse potentielle - est déjà employée ou non par un autre noeud sur le lien permettant d'émettre - ces paquets, -\emph on -via -\emph default - l'adresse multicast lien-local du noeud sollicité. -\end_layout - -\begin_layout Itemize -Le noeud veut configurer son lien-local avec l'adresse -\begin_inset Quotes sld -\end_inset - -fe80::212:34ff:fe12:3456 -\begin_inset Quotes srd -\end_inset - -, il est en train de vérifier s'il y a duplication -\end_layout - -\begin_layout Code - -15:44:17.712338 :: > ff02::1:ff12:3456: icmp6: neighbor sol: who has -\end_layout - -\begin_layout Code - -¬ fe80::212:34ff:fe12:3456(src lladdr: 0:12:34:12:34:56) (len 32, hlim 255) -\end_layout - -\begin_layout Itemize -Le noeud veut configurer son adresse globale -\begin_inset Quotes sld -\end_inset - -2002:0102:0304:1:212:34ff:fe12:3456 -\begin_inset Quotes srd -\end_inset - - (après avoir reçu l'annonce montrée plus haut), il est en train de vérifier - s'il y a ou non duplication -\end_layout - -\begin_layout Code - -15:44:21.905596 :: > ff02::1:ff12:3456: icmp6: neighbor sol: who has -\end_layout - -\begin_layout Code - -¬ 2002:0102:0304:1:212:34ff:fe12:3456(src lladdr: 0:12:34:12:34:56) (len - 32, -\end_layout - -\begin_layout Code - -¬ hlim 255) -\end_layout - -\begin_layout Itemize -Le noeud veut configurer son adresse globale -\begin_inset Quotes sld -\end_inset - -3ffe:ffff:0:1:212:34ff:fe12:3456 -\begin_inset Quotes srd -\end_inset - - (après avoir reçu l'annonce montrée plus haut), il est en train de vérifier - s'il y a ou non duplication -\end_layout - -\begin_layout Code - -15:44:22.304028 :: > ff02::1:ff12:3456: icmp6: neighbor sol: who has -\end_layout - -\begin_layout Code - -¬ 3ffe:ffff:0:1:212:34ff:fe12:3456(src lladdr: 0:12:34:12:34:56) (len 32, - hlim -\end_layout - -\begin_layout Code - -¬ 255) -\end_layout - -\begin_layout Subsubsection -Une sollicitation de découverte de voisinage à la recherche d'hôte(s) ou - de passerelle(s) -\end_layout - -\begin_layout Itemize -Un noeud veut émettre des paquets à -\begin_inset Quotes sld -\end_inset - -3ffe:ffff:0:1::10 -\begin_inset Quotes srd -\end_inset - - mais il n'a aucune adresse MAC de la couche 2 vers laquelle il pourrait - émettre, il émet alors maintenant une sollicitation -\end_layout - -\begin_layout Code - -13:07:47.664538 2002:0102:0304:1:2e0:18ff:fe90:9205 > ff02::1:ff00:10: icmp6: -\end_layout - -\begin_layout Code - -¬ neighbor sol: who has 3ffe:ffff:0:1::10(src lladdr: 0:e0:18:90:92:5) (len - 32, -\end_layout - -\begin_layout Code - -¬ hlim 255) -\end_layout - -\begin_layout Itemize -Ce noeud recherche maintenant -\begin_inset Quotes sld -\end_inset - -fe80::10 -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Code - -13:11:20.870070 fe80::2e0:18ff:fe90:9205 > ff02::1:ff00:10: icmp6: neighbor -\end_layout - -\begin_layout Code - -¬ sol: who has fe80::10(src lladdr: 0:e0:18:90:92:5) (len 32, hlim 255) -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-support-persistent-configuration" - -\end_inset - -Support à la configuration persistante IPv6 dans les distributions Linux -\end_layout - -\begin_layout Standard -Certaines distributions Linux contiennent déjà un support à la configuration - persistante IPv6 utilisant une configuration nouvelle ou préexistante, - des fichiers de script, et des accroches dans les fichiers de script IPv4. -\end_layout - -\begin_layout Section -Linux Red Hat et ses "clones" -\end_layout - -\begin_layout Standard -Depuis que j'ai commencé à écrire l' -\begin_inset CommandInset href -LatexCommand href -name "Howto -IPv6 & Linux " -target "http://www.bieringer.de/linux/IPv6/" - -\end_inset - -, il était dans mon intention de rendre disponible une configuration convenant - aux cas les plus fréquents tels que hôte simple, routeur simple, hôte à - double résidence, routeur avec un second tronçon réseau, tunnel typique, - tunnel 6to4, -\emph on -etc -\emph default -. - De nos jours, il existe des fichiers de configuration et des scripts qui - font très bien ce travail (je n'ai jamais entendu parler de vrais problèmes, - mais je ne sais pas s'ils sont beaucoup utilisés). - Parce que cette configuration et ces scripts augmentent régulièrement en - volume, ils ont leur propre page HOWTO: -\begin_inset CommandInset href -LatexCommand href -name "initscripts-ipv6" -target "http://www.deepspace6.net/projects/initscripts-ipv6.html" - -\end_inset - - ( -\begin_inset CommandInset href -LatexCommand href -name "miroir" -target "http://mirrors.bieringer.de/www.deepspace6.net/projects/initscripts-ipv6.html" - -\end_inset - -). - Parce que j'ai commencé mon expérience IPv6 sur un clone de la Linux Red - Hat 5.0, mes développements concernant IPv6 sont encore essentiellement - basés sur Linux Red Hat, il est par conséquent un peu logique que ces scripts - soient développés sur ce type de distribution (on appelle ça une raison - historique). - Il est ainsi très facile d'étendre certains de ces fichiers de configuration, - d'en créer de nouveaux et de créer de simples accroches d'appel à l'installatio -n d'IPv6 à partir de l'installation d'IPV4. -\end_layout - -\begin_layout Standard -Depuis la Red Hat 7.1, une archive de mes scripts y est incluse. - Cela est dû, et cela sera encore vrai à l'avenir, à l'assistance de Pekka - Savola. -\end_layout - -\begin_layout Standard -La Mandrake, depuis la version 8.0, inclut aussi un paquetage initscript - prêt pour IPv6, cependant un bogue mineur retient de l'employer (il manque - 'inet6 -\begin_inset Quotes srd -\end_inset - - à -\begin_inset Quotes sld -\end_inset - -ifconfig -\begin_inset Quotes srd -\end_inset - - avant -\begin_inset Quotes sld -\end_inset - -add -\begin_inset Quotes srd -\end_inset - -). -\end_layout - -\begin_layout Subsection -Tester la présence des scripts de configuration IPv6 -\end_layout - -\begin_layout Standard -Vous pouvez tester si votre distribution Linux contient le support pour - la configuration persistante IPv6 utilisant mon jeu d'outils. - Le script de la bibliothèque devrait exister: -\end_layout - -\begin_layout Code - -/etc/sysconfig/network-scripts/network-functions-ipv6 -\end_layout - -\begin_layout Standard -Un test magique: -\end_layout - -\begin_layout Code - -# test -f /etc/sysconfig/network-scripts/network-functions-ipv6 && echo - "Main -\end_layout - -\begin_layout Code - -¬ IPv6 script library exists" -\end_layout - -\begin_layout Standard -La version de la bibliothèque est importante s'il vous manque certaines - fonctionnalités. - Vous pouvez l'obtenir en exécutant ce qui suit (ou d'une façon encore plus - aisée en regardant le haut du fichier): -\end_layout - -\begin_layout Code - -# source /etc/sysconfig/network-scripts/network-functions-ipv6 && -\end_layout - -\begin_layout Code - -¬ getversion_ipv6_functions -\end_layout - -\begin_layout Code - -20011124 -\end_layout - -\begin_layout Standard -Dans l'exemple montré, la version utilisée est la -\series bold -20011124 -\series default -. - Vérifiez cela par rapport à l'information la plus à jour sur la page -\begin_inset CommandInset href -LatexCommand href -name "initscripts-ipv6" -target "http://www.deepspace6.net/projects/initscripts-ipv6.html" - -\end_inset - - ( -\begin_inset CommandInset href -LatexCommand href -name "miroir" -target "http://mirrors.bieringer.de/www.deepspace6.net/projects/initscripts-ipv6.html" - -\end_inset - -) afin de voir ce qui a changé. - Vous y trouverez aussi un journal des modifications. -\end_layout - -\begin_layout Subsection -Quelques éléments pour rendre disponible IPv6 sur les actuelles RHL 7.1, - 7.2, 7.3,... -\end_layout - -\begin_layout Itemize -Vérifiez si votre système a déjà le module IPv6 chargé -\end_layout - -\begin_layout Code - -# modprobe -c | grep net-pf-10 -\end_layout - -\begin_layout Code - -alias net-pf-10 off -\end_layout - -\begin_layout Itemize -Si le résultat est -\begin_inset Quotes sld -\end_inset - -off -\begin_inset Quotes srd -\end_inset - -, alors rendez disponible la mise en réseau IPv6 en éditant /etc/sysconfig/netwo -rk, ajoutez la nouvelle ligne -\end_layout - -\begin_layout Code - -NETWORKING_IPV6=yes -\end_layout - -\begin_layout Itemize -Redémarrez la machine, ou simplement le réseau par -\end_layout - -\begin_layout Code - -# service network restart -\end_layout - -\begin_layout Itemize -Maintenant le module IPv6 devrait être chargé -\end_layout - -\begin_layout Code - -# modprobe -c | grep ipv6 -\end_layout - -\begin_layout Code - -alias net-pf-10 ipv6 -\end_layout - -\begin_layout Standard -Si votre système est sur un lien fournissant l'annonce de routeur, la configurat -ion sera réalisée automatiquement. - Pour plus d'information sur les réglages supportées, voir /usr/share/doc/initsc -ripts-$version/sysconfig.txt. -\end_layout - -\begin_layout Section -Linux SuSE -\end_layout - -\begin_layout Standard -Dans les nouvelles versions, il n'y a véritablement qu'un support rudimentaire - disponible, voir /etc/rc.config pour les détails. -\end_layout - -\begin_layout Standard -A cause de sa configuration très différente et de la structure de ses scripts, - il est difficile (voire impossible) d'utiliser le jeu d'outils de Linux - Red Hat et de ses clones avec cette distribution. -\begin_inset Newline newline -\end_inset - -Dans les versions 8.x, SuSE va complétement modifier l'installation de sa - configuration. - -\end_layout - -\begin_layout Subsection -Linux SuSE 7.3 -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Comment installer IPv6 6to4 pour la SuSE 7.3" -target "http://www.feyrer.de/IPv6/SuSE73-IPv6+6to4-setup.html" - -\end_inset - - -\end_layout - -\begin_layout Subsection -Linux SuSE 8.0 -\end_layout - -\begin_layout Subsubsection -Configuration d'adresse IPv6 -\end_layout - -\begin_layout Standard -Editez le fichier /etc/sysconfig/network/ifcfg- et fixez - la valeur suivante -\end_layout - -\begin_layout Code - -IP6ADDR="/" -\end_layout - -\begin_layout Subsubsection -Information supplémentaire -\end_layout - -\begin_layout Standard -Voir le fichier /usr/share/doc/packages/sysconfig/README -\end_layout - -\begin_layout Subsection -Linux SuSE 8.1 -\end_layout - -\begin_layout Subsubsection -Configuration d'adresse IPv6 -\end_layout - -\begin_layout Standard -Editez le fichier /etc/sysconfig/network/ifcfg- et fixez - la valeur suivante -\end_layout - -\begin_layout Code - -IPADDR="/" -\end_layout - -\begin_layout Subsubsection -Information supplémentaire -\end_layout - -\begin_layout Standard -Voir le fichier /usr/share/doc/packages/sysconfig/Network -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "Configuration-Debian-Linux" - -\end_inset - -Linux Debian -\end_layout - -\begin_layout Standard -Les informations qui suivent sont une contribution de Stéphane Bortzmeyer - -\end_layout - -\begin_layout Enumerate -Assurez-vous qu'IPv6 soit chargé; soit il est compilé dans le noyau, soit - il est chargé comme module. - Dans ce dernier cas, trois solutions, l'ajouter à /etc/modules, utiliser - la configuration ci-dessous, ou utiliser kmod (non détaillé ici). -\end_layout - -\begin_layout Enumerate -Configurez votre interface. - Par exemple, ici, nous considérons la prise en compte de eth0, avec pour - adresse -\begin_inset Quotes sld -\end_inset - -3ffe:ffff:1234:5::1:1 -\begin_inset Quotes srd -\end_inset - -. - Editez /etc/network/interfaces : -\end_layout - -\begin_layout Code - -iface eth0 inet6 static -\end_layout - -\begin_layout Code - - pre-up modprobe ipv6 -\end_layout - -\begin_layout Code - - address 3ffe:ffff:1234:5::1:1 -\end_layout - -\begin_layout Code - - # Pour rendre complètement indisponible l'auto-configuration: -\end_layout - -\begin_layout Code - - # up echo 0 > /proc/sys/net/ipv6/conf/all/autoconf -\end_layout - -\begin_layout Code - - netmask 64 -\end_layout - -\begin_layout Code - - # Le routeur est auto-configuré, et n'a pas d'adresse fixe. -\end_layout - -\begin_layout Code - - # Il est déterminé comme par magie -\end_layout - -\begin_layout Code - - # (/proc/sys/net/ipv6/conf/all/accept_ra). - Sinon: -\end_layout - -\begin_layout Code - - # gateway 3ffe:ffff:1234:5::1 -\end_layout - -\begin_layout Standard -Puis vous rebootez, ou alors vous faites juste -\end_layout - -\begin_layout Code - -# ifup --force eth0 -\end_layout - -\begin_layout Standard -Et vous avez votre adresse statique. -\end_layout - -\begin_layout Subsection -Plus d'information -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 sur Linux Debian" -target "http://people.debian.org/~csmall/ipv6/" - -\end_inset - - par Craig Small -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "HowTo pour Freenet6 & les utilisateurs Debian" -target "http://www.ruwenzori.net/ipv6/Jims_LAN_IPv6_global_connectivity_howto.html" - -\end_inset - - de Jean-Marc Liotier (annoncé le 24.12.2002 sur -\begin_inset CommandInset ref -LatexCommand ref -name "la liste de diffusion" -reference "information-maillists" - -\end_inset - - users@ipv6.org ) -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-autoconfiguration" - -\end_inset - -L'auto-configuration et la mobilité -\end_layout - -\begin_layout Section -L'auto-configuration sans état -\end_layout - -\begin_layout Standard -Est supportée et observée sur l'adresse lien-local assignée après le montage - d'une interface sur laquelle IPv6 est disponible. -\end_layout - -\begin_layout Standard -Exemple: -\end_layout - -\begin_layout Code - - # ip -6 addr show dev eth0 scope link -\end_layout - -\begin_layout Code - - 2: eth0: mtu 1500 qlen1000 -\end_layout - -\begin_layout Code - - inet6 fe80::211:d8ff:fe6b:f0f5/64 scope link -\end_layout - -\begin_layout Code - - valid_lft forever preferred_lft forever -\end_layout - -\begin_layout Section -L'auto-configuration avec état utilisant le Démon d'Annonce de Routeur -\end_layout - -\begin_layout Standard -A compléter. - Voir plus bas -\begin_inset CommandInset ref -LatexCommand ref -name "l'auto-configuration par le démon radvd" -reference "hints-daemons-radvd" - -\end_inset - - ( -\emph on -Router Advertisement Daemon -\emph default -). -\end_layout - -\begin_layout Section -Le Protocole de Configuration Dynamique d'Hôte version 6 (DHCPv6) -\end_layout - -\begin_layout Standard -Après de longues discussions concernant les difficultés, le -\begin_inset CommandInset href -LatexCommand href -name "RFC 3315 / Dynamic Host Configuration Protocol for IPv6 (DHCPv6)" -target "http://www.faqs.org/rfcs/rfc3315.html" - -\end_inset - - a finalement vu le jour. - Au moment de la mise à jour de ce passage (10/2005), il existe deux implémentat -ions: -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Dibbler" -target "http://klub.com.pl/dhcpv6/" - -\end_inset - - par Tomasz Mrugalski -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "DHCPv6 chez Sourceforge" -target "http://dhcpv6.sourceforge.net/" - -\end_inset - - -\end_layout - -\begin_layout Section -La mobilité -\end_layout - -\begin_layout Standard -A compléter. -\end_layout - -\begin_layout Standard -Pour le moment, voir -\begin_inset CommandInset href -LatexCommand href -name "la page d'accueil sur la mobilité IPv6 sur Linux (MIPL)" -target "http://www.mipl.mediapoli.com/" - -\end_inset - - pour plus de détails. - Plus d'information peut être trouvée ici (merci de signaler les liens brisés): -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "draft-oneill-mipv6-cao-??.txt / MIPv6 Care of Address Option" -target "http://www.ietf.org/internet-drafts/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "draft-mccann-mobileip-80211fh-??.txt / Mobile IPv6 Fast Handovers for 802.11 Networks" -target "http://www.ietf.org/internet-drafts/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "draft-haberman-ipv6-anycast-rr-??.txt / IPv6 Anycast Binding using Return Routability" -target "http://www.ietf.org/internet-drafts/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "draft-mun-aaa-localkm-mobileipv6-??.txt / Localized Key Management for AAA in MobileIPv6" -target "http://www.ietf.org/internet-drafts/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "draft-thubert-nemo-ro-taxonomy-??.txt / Taxonomy of Route Optimization Models in the NEMO Context" -target "http://www.ietf.org/internet-drafts/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "draft-le-aaa-diameter-mobileipv6-??.txt / Diameter Mobile IPv6 Application" -target "http://www.ietf.org/internet-drafts/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "draft-wakikawa-manet-globalv6-??.txt / Global Connectivity for IPv6 Mobile Ad Hoc Networks" -target "http://www.ietf.org/internet-drafts/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "draft-ietf-mobileip-fast-mipv6-??.txt / Fast Handovers for Mobile IPv6" -target "http://www.ietf.org/internet-drafts/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "draft-ietf-mobileip-ipv6-??.txt / Mobility Support in IPv6" -target "http://www.ietf.org/internet-drafts/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "draft-ohnishi-mobileip-v6vpngateway-??.txt / Mobile IPv6 VPN using Gateway Home Agent" -target "http://www.ietf.org/internet-drafts/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "draft-ietf-mobileip-hmipv6-??.txt / Hierarchical MIPv6 mobility management (HMIPv6)" -target "http://www.ietf.org/internet-drafts/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "draft-mkhalil-ipv6-fastra-??.txt / IPv6 Fast Router Advertisement" -target "http://www.ietf.org/internet-drafts/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "draft-okazaki-mobileip-abk-??.txt / Securing MIPv6 Binding Updates Using Address Based Keys (ABKs)" -target "http://www.ietf.org/internet-drafts/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "draft-vriz-mobileip-hbhlmap-??.txt / Hop-by-Hop Local Mobility Agents Probing for Mobile IPv6" -target "http://www.ietf.org/internet-drafts/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "draft-thubert-nemo-reverse-routing-header-??.txt / IPv6 Reverse Routing Header and its application to Mobile Networks" -target "http://www.ietf.org/internet-drafts/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "draft-ietf-mobileip-mipv6-ha-ipsec-??.txt / Using IPsec to Protect Mobile IPv6 Signaling between Mobile Nodes and Home Agents" -target "http://www.ietf.org/internet-drafts/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "draft-suh-rmm-??.txt / Regional Mobile IPv6 mobility management" -target "http://www.ietf.org/internet-drafts/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "draft-mccann-mobileip-ipv6mipv4-??.txt / IPv6 over Mobile IPv4" -target "http://www.ietf.org/internet-drafts/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "draft-kempf-mobileip-fmipv6-sem-??.txt / Improving the Architectural Alignment for FMIPv6" -target "http://www.ietf.org/internet-drafts/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "draft-le-aaa-mipv6-requirements-??.txt / Mobile IPv6 Authentication, Authorization, and Accounting Requirements" -target "http://www.ietf.org/internet-drafts/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "draft-hwang-rohc-mipv6-??.txt / RObust Header Compression (ROHC): A Compression Profile for Mobile IPv6" -target "http://www.ietf.org/internet-drafts/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "LANCASTER MOBILE IPv6 PACKAGE" -target "http://www.cs-ipv6.lancs.ac.uk/ipv6/MobileIP/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "Testbed for MIND project on IPv6" -target "http://gsyc.escet.urjc.es/Mobiquo/Mind/documentacion/MontajeMaquetaIPv6_en/MontajeMaquetaIPv6_en.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Mobile IPv6 Issue List" -target "http://www.piuha.net/~jarkko/publications/mipv6/MIPv6-Issues.html" - -\end_inset - - -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-firewalling-security" - -\end_inset - -Mettre en place le pare-feu -\end_layout - -\begin_layout Standard -Mettre en place un pare-feu IPv6 est très important, tout spécialement si - IPv6 est utilisé sur un intranet avec des adresses IPv6 globales. - Car, à la différence des réseaux IPv4 où les hôtes internes courants sont - protégés par l'usage d'adresses IPv4 privées comme défini par le -\begin_inset CommandInset href -LatexCommand href -name "RFC 1918 / Address Allocation for Private Internets" -target "http://www.faqs.org/rfcs/rfc1918.html" - -\end_inset - - ou l'adressage IP privée automatique ( -\emph on -Automatic Private IP Addressin -\emph default -g, ou APIPA) -\begin_inset CommandInset href -LatexCommand href -name "recherche Google \"Microsoft + APIPA\"" -target "http://www.google.com/search?q=apipa+microsoft" - -\end_inset - -, en IPv6, les adresses globales sont normalement utilisées, et quelqu'un - possédant une connectivité IPv6 peut atteindre tous les noeuds propres - à un intranet disposant d'IPv6. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "firewalling-netfilter6" - -\end_inset - -Mettre en place un pare-feu grâce à netfilter -\end_layout - -\begin_layout Standard -La mise en place d'un pare-feu IPv6 est nativement supportée par les noyaux - dont la version est supérieure à 2.4. - Avec les anciennes versions inférieures à 2.2, vous pouvez seulement filtrer - IPv6-in-IPv4 par le protocole 41. - -\end_layout - -\begin_layout Standard -Attention: il n'y a aucune garantie que les règles décrites ou les exemples - fournis puissent protéger votre système! -\end_layout - -\begin_layout Standard -Faites un audit de votre jeu de règles après son installation, voir -\begin_inset CommandInset ref -LatexCommand ref -name "l'audit de sécurité sur IPv6" -reference "IPv6-security-auditing" - -\end_inset - - pour en savoir plus. -\end_layout - -\begin_layout Standard -Notez aussi que le projet USAGI finalise actuellement son travail sur la - traque de connexion pour IPv6! Cela rendra la création de jeu de règles - plus simple et plus sûre à l'avenir! -\end_layout - -\begin_layout Subsection -Plus d'information -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Le projet Netfilter" -target "http://www.netfilter.org/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "maillist archive of netfilter users" -target "https://lists.netfilter.org/mailman/listinfo/netfilter" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "maillist archive of netfilter developers" -target "https://lists.netfilter.org/mailman/listinfo/netfilter-devel" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Information non officielle concernant l'état de netfilter" -target "http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status-kernel.html#netfilter6 " - -\end_inset - - -\end_layout - -\begin_layout Section -Préparation -\end_layout - -\begin_layout Subsection -Récupérer les sources -\end_layout - -\begin_layout Standard -Récupérez les dernières sources du noyau: -\begin_inset CommandInset href -LatexCommand href -name "http://www.kernel.org/" -target "http://www.kernel.org/" - -\end_inset - - -\end_layout - -\begin_layout Standard -Récupérez le dernier paquetage d'iptables: -\end_layout - -\begin_layout Itemize -Les sources en archive tar (pour patcher le noyau): -\begin_inset CommandInset href -LatexCommand href -name "http://www.netfilter.org/" -target "http://www.netfilter.org/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Les sources en RPM pour reconstruire les binaires (pour les systèmes RedHat): - -\begin_inset CommandInset href -LatexCommand href -name "ftp://ftp.redhat.com/redhat/linux/rawhide/SRPMS/SRPMS/" -target "ftp://ftp.redhat.com/redhat/linux/rawhide/SRPMS/SRPMS/" - -\end_inset - - ou peut-être encore dans -\begin_inset CommandInset href -LatexCommand href -name "http://www.netcore.fi/pekkas/linux/ipv6/ " -target "http://www.netcore.fi/pekkas/linux/ipv6/ " - -\end_inset - - -\end_layout - -\begin_layout Subsection -Extraire les sources -\end_layout - -\begin_layout Standard -Déplacez-vous dans le répertoire des sources: -\end_layout - -\begin_layout Code - -# cd /chemin/vers/les/sources -\end_layout - -\begin_layout Standard -Décompactez et renommez les sources du noyau -\end_layout - -\begin_layout Code - -# tar z|jxf kernel-version.tar.gz|bz2 -\end_layout - -\begin_layout Code - -# mv linux linux-version-iptables-version+IPv6 -\end_layout - -\begin_layout Standard -Décompactez les sources d'iptables -\end_layout - -\begin_layout Code - -# tar z|jxf iptables-version.tar.gz|bz2 -\end_layout - -\begin_layout Subsection -Appliquer les derniers patchs relatifs à iptables/IPv6 aux sources du noyau -\end_layout - -\begin_layout Standard -Déplacez-vous dans le répertoire iptables -\end_layout - -\begin_layout Code - -# cd iptables-version -\end_layout - -\begin_layout Standard -Appliquez les patchs en attente -\end_layout - -\begin_layout Code - -# make pending-patches KERNEL_DIR=/chemin/vers/les/sources/linux-version-iptable -s-version+IPv6/ -\end_layout - -\begin_layout Standard -Appliquez les patchs additionnels relatifs à IPv6 (pas encore inclus dans - le noyau vanille) -\end_layout - -\begin_layout Code - -# make patch-o-matic KERNEL_DIR=/path/to/src/linux-version-iptables-version/ - -\end_layout - -\begin_layout Standard -Répondez par l'affirmative aux options suivantes (iptables-1.2.2) -\end_layout - -\begin_layout Itemize -ah-esp.patch -\end_layout - -\begin_layout Itemize -masq-dynaddr.patch (nécessaire seulement sur les systèmes ayant une adresse - IP dynamique à la connexion au WAN, comme pour PPP ou PPPoE) -\end_layout - -\begin_layout Itemize -ipv6-agr.patch.ipv6 -\end_layout - -\begin_layout Itemize -ipv6-ports.patch.ipv6 -\end_layout - -\begin_layout Itemize -LOG.patch.ipv6 -\end_layout - -\begin_layout Itemize -REJECT.patch.ipv6 -\end_layout - -\begin_layout Standard -Vérifier la présence des extensions IPv6 -\end_layout - -\begin_layout Code - -# make print-extensions -\end_layout - -\begin_layout Code - -Extensions found: IPv6:owner IPv6:limit IPv6:mac IPv6:multiport -\end_layout - -\begin_layout Subsection -Configurer, construire et installer un nouveau noyau -\end_layout - -\begin_layout Standard -Déplacez-vous dans les sources du noyau -\end_layout - -\begin_layout Code - -# cd /chemin/vers/les/sources/linux-version-iptables-version/ -\end_layout - -\begin_layout Standard -Editez Makefile -\end_layout - -\begin_layout Code - -- EXTRAVERSION = -\end_layout - -\begin_layout Code - -+ EXTRAVERSION = -iptables-version+IPv6-try -\end_layout - -\begin_layout Standard -Lancez configure, avec IPv6 de disponible -\end_layout - -\begin_layout Code - - Code maturity level options -\end_layout - -\begin_layout Code - - Prompt for development and/or incomplete code/drivers - : yes -\end_layout - -\begin_layout Code - - Networking options -\end_layout - -\begin_layout Code - - Network packet filtering: yes -\end_layout - -\begin_layout Code - - The IPv6 protocol: module -\end_layout - -\begin_layout Code - - IPv6: Netfilter Configuration -\end_layout - -\begin_layout Code - - IP6 tables support: module -\end_layout - -\begin_layout Code - - All new options like following: -\end_layout - -\begin_layout Code - - limit match support: module -\end_layout - -\begin_layout Code - - MAC address match support: module -\end_layout - -\begin_layout Code - - Multiple port match support: module -\end_layout - -\begin_layout Code - - Owner match support: module -\end_layout - -\begin_layout Code - - netfilter MARK match support: module - -\end_layout - -\begin_layout Code - - Aggregated address check: module -\end_layout - -\begin_layout Code - - Packet filtering: module -\end_layout - -\begin_layout Code - - REJECT target support: module -\end_layout - -\begin_layout Code - - LOG target support: module -\end_layout - -\begin_layout Code - - Packet mangling: module -\end_layout - -\begin_layout Code - - MARK target support: module -\end_layout - -\begin_layout Standard -Configurez aussi tout ce qui concerne votre système -\end_layout - -\begin_layout Standard -Compilez et installez: voir ici même la section noyau et autres HOWTO -\end_layout - -\begin_layout Subsection -Reconstruire et installer les binaires d'iptables -\end_layout - -\begin_layout Standard -Assurez-vous que l'arborescence des sources du noyau existe aussi dans /usr/src/ -linux/ -\end_layout - -\begin_layout Standard -Renommez l'ancien répertoire -\end_layout - -\begin_layout Code - -# mv /usr/src/linux /usr/src/linux.old -\end_layout - -\begin_layout Standard -Créez un nouveau lien symbolique -\end_layout - -\begin_layout Code - -# ln -s /chemin/vers/src/linux-version-iptables-version /usr/src/linux -\end_layout - -\begin_layout Standard -Reconstruisez le SRPM -\end_layout - -\begin_layout Code - -# rpm --rebuild /chemin/vers/SRPM/iptables-version-release.src.rpm -\end_layout - -\begin_layout Standard -Installez les nouveaux paquetages iptables (iptables + iptables-ipv6) -\end_layout - -\begin_layout Itemize -Sur les systèmes RH 7.1, normalement, une ancienne version est installée, - en conséquence utiliser "freshen" -\end_layout - -\begin_layout Code - -# rpm -Fhv /chemin/vers/RPMS/cpu/iptables*-version-release.cpu.rpm -\end_layout - -\begin_layout Itemize -Si elle n'était pas installée, utiliser "install" -\end_layout - -\begin_layout Code - -# rpm -ihv /chemin/vers/RPMS/cpu/iptables*-version-release.cpu.rpm -\end_layout - -\begin_layout Itemize -Sur les systèmes RH 6.2, normalement, aucun noyau 2.4.x n'est installé, conséquemme -nt les pré-requis ne correspondent pas. - Utiliser "--nodeps" pour l'installer -\end_layout - -\begin_layout Code - -# rpm -ihv --nodeps /chemin/vers/RPMS/cpu/iptables*-version-release.cpu.rpm - -\end_layout - -\begin_layout Standard -Il sera peut-être nécessaire de créer un lien symbolique vers le lieu où - les bibliothèques iptables sont -\end_layout - -\begin_layout Code - -# ln -s /lib/iptables/ /usr/lib/iptables -\end_layout - -\begin_layout Section -Utilisation -\end_layout - -\begin_layout Subsection -Vérifier le support -\end_layout - -\begin_layout Standard -Chargez le module, s'il est compilé -\end_layout - -\begin_layout Code - -# modprobe ip6_tables -\end_layout - -\begin_layout Standard -Vérifiez si le noyau courant prend en charge iptables -\end_layout - -\begin_layout Code - -# [ ! -f /proc/net/ip6_tables_names ] && echo "Current kernel doesn't support -\end_layout - -\begin_layout Code - -¬ 'ip6tables' firewalling (IPv6)!" -\end_layout - -\begin_layout Subsection -Apprendre à utiliser ip6tables -\end_layout - -\begin_layout Subsubsection -Lister toutes les entrées netfilter IPv6 -\end_layout - -\begin_layout Itemize -de façon abrégée -\end_layout - -\begin_layout Code - -# ip6tables -L -\end_layout - -\begin_layout Itemize -de façon détaillée -\end_layout - -\begin_layout Code - -# ip6tables -n -v --line-numbers -L -\end_layout - -\begin_layout Subsubsection -Lister un filtre spécifique -\end_layout - -\begin_layout Code - -# ip6tables -n -v --line-numbers -L INPUT -\end_layout - -\begin_layout Subsubsection -Insérer une règle de journal au filtre entrant, avec des options -\end_layout - -\begin_layout Code - -# ip6tables --table filter --append INPUT -j LOG --log-prefix "INPUT:" -\end_layout - -\begin_layout Code - -¬ --log-level 7 -\end_layout - -\begin_layout Subsubsection -Insérer une règle de destruction ( -\emph on -drop rule -\emph default -) au filtre entrant -\end_layout - -\begin_layout Code - -# ip6tables --table filter --append INPUT -j DROP -\end_layout - -\begin_layout Subsubsection -Détruire une règle par son numéro -\end_layout - -\begin_layout Code - -# ip6tables --table filter --delete INPUT 1 -\end_layout - -\begin_layout Subsubsection -Autoriser ICMPv6 -\end_layout - -\begin_layout Standard -Avec les plus anciens noyaux (noyau non patché 2.4.5 et iptables-1.2.2), aucun - type ne peut être spécifié -\end_layout - -\begin_layout Itemize -Accepter le trafic ICMPv6 entrant dans les tunnels -\end_layout - -\begin_layout Code - -# ip6tables -A INPUT -i sit+ -p icmpv6 -j ACCEPT -\end_layout - -\begin_layout Itemize -Autoriser le trafic ICMPv6 sortant des tunnels -\end_layout - -\begin_layout Code - -# ip6tables -A OUTPUT -o sit+ -p icmpv6 -j ACCEPT -\end_layout - -\begin_layout Standard -Les nouveaux noyaux permettent de spécifier les types ICMPv6: -\end_layout - -\begin_layout Code - -# ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j ACCEPT -\end_layout - -\begin_layout Subsubsection -La limitation du débit -\end_layout - -\begin_layout Standard -Il peut arriver (l'auteur l'a déjà vu) qu'un engorgement ICMPv6 se produise, - c'est pourquoi vous devriez utiliser la limitation de débit, puisqu'elle - est disponible, et ce, au moins pour le jeu de règles ICMPv6. - De plus, des règles de journalisation devraient aussi être mises en place - pour garder trace d'attaques DoS, grâce à syslog et au stockage des fichiers - de log. - Un exemple de limitation du débit ICMPv6 ressemble à ceci: -\end_layout - -\begin_layout Code - -# ip6tables -A INPUT --protocol icmpv6 --icmpv6-type echo-request -\end_layout - -\begin_layout Code - -¬ -j ACCEPT --match limit --limit 30/minute -\end_layout - -\begin_layout Subsubsection -Permettre le trafic entrant SSH -\end_layout - -\begin_layout Standard -Ici l'exemple montré est un jeu de règles permettant les connexions entrantes - SSH par une adresse IPv6 donnée -\end_layout - -\begin_layout Itemize -Autoriser le trafic entrant SSH provenant de 3ffe:ffff:100::1/128 -\end_layout - -\begin_layout Code - -# ip6tables -A INPUT -i sit+ -p tcp -s 3ffe:ffff:100::1/128 --sport 512:65535 -\end_layout - -\begin_layout Code - -¬ --dport 22 -j ACCEPT -\end_layout - -\begin_layout Itemize -Autoriser les paquets réponse (pour le moment, la traque du trafic IPv6 - n'est pas au coeur de l'implémentation de netfilter) -\end_layout - -\begin_layout Code - -# ip6tables -A OUTPUT -o sit+ -p tcp -d 3ffe:ffff:100::1/128 --dport 512:65535 -\end_layout - -\begin_layout Code - -¬ --sport 22 ! --syn j ACCEPT -\end_layout - -\begin_layout Subsubsection -Rendre disponible le trafic tunnelé IPv6-in-IPv4 -\end_layout - -\begin_layout Standard -Pour accepter les paquets tunnelés IPv6-in-IPv4, vous devez insérer des - règles dans votre -\series bold -installation de pare-feu IPv4 -\series default - relatives à de tels paquets, pour exemple -\end_layout - -\begin_layout Itemize -Accepter le trafic entrant IPv6-in-IPv4 sur l'interface ppp0 -\end_layout - -\begin_layout Code - -# iptables -A INPUT -i ppp0 -p ipv6 -j ACCEPT -\end_layout - -\begin_layout Itemize -Permettre au trafic IPv6-in-IPv4 de sortir par l'interface ppp0 -\end_layout - -\begin_layout Code - -# iptables -A OUTPUT -o ppp0 -p ipv6 -j ACCEPT -\end_layout - -\begin_layout Standard -Si vous avez seulement un tunnel statique, vous pouvez aussi spécifier l'adresse - IPv4, comme ici -\end_layout - -\begin_layout Itemize -Accepter le trafic entrant IPv6-in-IPv4 sur l'interface ppp0 et provenant - de l'extrémité du tunnel 1.2.3.4 -\end_layout - -\begin_layout Code - -# iptables -A INPUT -i ppp0 -p ipv6 -s 1.2.3.4 -j ACCEPT -\end_layout - -\begin_layout Itemize -Autoriser le trafic sortant IPv6-in-IPv4 vers l'interface ppp0 pour l'extrémité - du tunnel 1.2.3.4 -\end_layout - -\begin_layout Code - -# iptables -A OUTPUT -o ppp0 -p ipv6 -d 1.2.3.4 -j ACCEPT -\end_layout - -\begin_layout Subsubsection -Protection contre les requêtes de connexion entrante TCP -\end_layout - -\begin_layout Standard - -\series bold -TRÈS RECOMMANDÉ! -\series default - Pour des questions de sécurité, vous devriez vraiment insérer une règle - qui bloque les requêtes de connexion TCP entrante. - Ajouter l'option "-i", si d'autres noms d'interface sont utilisés! -\end_layout - -\begin_layout Itemize -Bloquer les requêtes de connexion entrante TCP vers cet hôte -\end_layout - -\begin_layout Code - -# ip6tables -I INPUT -i sit+ -p tcp --syn -j DROP -\end_layout - -\begin_layout Itemize -Bloquer les requêtes de connexion entrante TCP allant vers les hôtes placés - derrière ce routeur -\end_layout - -\begin_layout Code - -# ip6tables -I FORWARD -i sit+ -p tcp --syn -j DROP -\end_layout - -\begin_layout Standard -Peut-être ces règles doivent-elles être placées sous d'autres, mais ça, - c'est votre travail. - La meilleure façon de faire est de créer un script et d'exécuter les règles - d'une manière spécifique. -\end_layout - -\begin_layout Subsubsection -Protection contre les requêtes de connexion entrante UDP -\end_layout - -\begin_layout Standard - -\series bold -TRÈS RECOMMANDÉ AUSSI! -\series default - Comme il a été dit dans la section concernant la mise en place d'un pare-feu, - il est possible de contrôler les ports des sessions sortantes UDP/TCP. - Si tous vos systèmes IPv6 locaux utilisent les ports locaux, par exemple - de 32768 à 60999, vous êtes aussi capables de filtrer les connexions UDP - (jusqu'à ce que la traque des connexions fonctionnent) comme suit: -\end_layout - -\begin_layout Itemize -Bloquer les paquets entrants UDP qui ne peuvent être des réponses de requêtes - sortantes de cet hôte -\end_layout - -\begin_layout Code - -# ip6tables -I INPUT -i sit+ -p udp ! --dport 32768:60999 -j DROP -\end_layout - -\begin_layout Itemize -Bloquer les paquets entrants UDP qui ne peuvent être des réponses de requêtes - d'hôtes placés derrière ce routeur, et transitant à travers lui -\end_layout - -\begin_layout Code - -# ip6tables -I FORWARD -i sit+ -p udp ! --dport 32768:60999 -j DROP -\end_layout - -\begin_layout Subsection -Un exemple plus conséquent -\end_layout - -\begin_layout Standard -Les lignes qui suivent montrent en exemple une installation plus sophistiquée. - Bonne création de jeux de règles netfilter6... -\end_layout - -\begin_layout Code - -# ip6tables -n -v -L -\end_layout - -\begin_layout Code - -Chain INPUT (policy DROP 0 packets, 0 bytes) -\end_layout - -\begin_layout Code - - pkts bytes target prot opt in out source destination -\end_layout - -\begin_layout Code - - 0 0 extIN all sit+ * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 4 384 intIN all eth0 * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 ACCEPT all * * ::1/128 ::1/128 - -\end_layout - -\begin_layout Code - - 0 0 ACCEPT all lo * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 LOG all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ LOG flags 0 level 7 prefix `INPUT-default:' -\end_layout - -\begin_layout Code - - 0 0 DROP all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Code - -Chain FORWARD (policy DROP 0 packets, 0 bytes) -\end_layout - -\begin_layout Code - - pkts bytes target prot opt in out source destination -\end_layout - -\begin_layout Code - -¬ -\end_layout - -\begin_layout Code - - 0 0 int2ext all eth0 sit+ ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 ext2int all sit+ eth0 ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 LOG all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ LOG flags 0 level 7 prefix `FORWARD-default:' -\end_layout - -\begin_layout Code - - 0 0 DROP all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Code - -Chain OUTPUT (policy DROP 0 packets, 0 bytes) -\end_layout - -\begin_layout Code - - pkts bytes target prot opt in out source destination -\end_layout - -\begin_layout Code - -¬ -\end_layout - -\begin_layout Code - - 0 0 extOUT all * sit+ ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 4 384 intOUT all * eth0 ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 ACCEPT all * * ::1/128 ::1/128 - -\end_layout - -\begin_layout Code - - 0 0 ACCEPT all * lo ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 LOG all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ LOG flags 0 level 7 prefix `OUTPUT-default:' -\end_layout - -\begin_layout Code - - 0 0 DROP all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Code - -Chain ext2int (1 references) -\end_layout - -\begin_layout Code - - pkts bytes target prot opt in out source destination -\end_layout - -\begin_layout Code - -¬ -\end_layout - -\begin_layout Code - - 0 0 ACCEPT icmpv6 * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 ACCEPT tcp * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ tcp spts:1:65535 dpts:1024:65535 flags:!0x16/0x02 -\end_layout - -\begin_layout Code - - 0 0 LOG all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ LOG flags 0 level 7 prefix `ext2int-default:' -\end_layout - -\begin_layout Code - - 0 0 DROP tcp * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 DROP udp * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 DROP all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Code - -Chain extIN (1 references) -\end_layout - -\begin_layout Code - - pkts bytes target prot opt in out source destination -\end_layout - -\begin_layout Code - -¬ -\end_layout - -\begin_layout Code - - 0 0 ACCEPT tcp * * 3ffe:400:100::1/128 ::/0 - -\end_layout - -\begin_layout Code - -¬ tcp spts:512:65535 dpt:22 -\end_layout - -\begin_layout Code - - 0 0 ACCEPT tcp * * 3ffe:400:100::2/128 ::/0 - -\end_layout - -\begin_layout Code - -¬ tcp spts:512:65535 dpt:22 -\end_layout - -\begin_layout Code - - 0 0 ACCEPT icmpv6 * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 ACCEPT tcp * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ tcp spts:1:65535 dpts:1024:65535 flags:!0x16/0x02 -\end_layout - -\begin_layout Code - - 0 0 ACCEPT udp * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ udp spts:1:65535 dpts:1024:65535 -\end_layout - -\begin_layout Code - - 0 0 LOG all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ limit: avg 5/min burst 5 LOG flags 0 level 7 prefix `extIN-default:' - -\end_layout - -\begin_layout Code - - 0 0 DROP all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Code - -Chain extOUT (1 references) -\end_layout - -\begin_layout Code - - pkts bytes target prot opt in out source destination -\end_layout - -\begin_layout Code - -¬ -\end_layout - -\begin_layout Code - - 0 0 ACCEPT tcp * * ::/0 -\end_layout - -\begin_layout Code - -¬ 3ffe:ffff:100::1/128tcp spt:22 dpts:512:65535 flags:!0x16/0x02 -\end_layout - -\begin_layout Code - - 0 0 ACCEPT tcp * * ::/0 -\end_layout - -\begin_layout Code - -¬ 3ffe:ffff:100::2/128tcp spt:22 dpts:512:65535 flags:!0x16/0x02 -\end_layout - -\begin_layout Code - - 0 0 ACCEPT icmpv6 * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 ACCEPT tcp * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ tcp spts:1024:65535 dpts:1:65535 -\end_layout - -\begin_layout Code - - 0 0 ACCEPT udp * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ udp spts:1024:65535 dpts:1:65535 -\end_layout - -\begin_layout Code - - 0 0 LOG all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ LOG flags 0 level 7 prefix `extOUT-default:' -\end_layout - -\begin_layout Code - - 0 0 DROP all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Code - -Chain int2ext (1 references) -\end_layout - -\begin_layout Code - - pkts bytes target prot opt in out source destination -\end_layout - -\begin_layout Code - -¬ -\end_layout - -\begin_layout Code - - 0 0 ACCEPT icmpv6 * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 ACCEPT tcp * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ tcp spts:1024:65535 dpts:1:65535 -\end_layout - -\begin_layout Code - - 0 0 LOG all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ LOG flags 0 level 7 prefix `int2ext:' -\end_layout - -\begin_layout Code - - 0 0 DROP all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 LOG all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ LOG flags 0 level 7 prefix `int2ext-default:' -\end_layout - -\begin_layout Code - - 0 0 DROP tcp * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 DROP udp * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 DROP all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Code - -Chain intIN (1 references) -\end_layout - -\begin_layout Code - - pkts bytes target prot opt in out source destination -\end_layout - -\begin_layout Code - -¬ -\end_layout - -\begin_layout Code - - 0 0 ACCEPT all * * ::/0 -\end_layout - -\begin_layout Code - -¬ fe80::/ffc0:: -\end_layout - -\begin_layout Code - - 4 384 ACCEPT all * * ::/0 ff02::/16 - -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Code - -Chain intOUT (1 references) -\end_layout - -\begin_layout Code - - pkts bytes target prot opt in out source destination -\end_layout - -\begin_layout Code - -¬ -\end_layout - -\begin_layout Code - - 0 0 ACCEPT all * * ::/0 -\end_layout - -\begin_layout Code - -¬ fe80::/ffc0:: -\end_layout - -\begin_layout Code - - 4 384 ACCEPT all * * ::/0 ff02::/16 - -\end_layout - -\begin_layout Code - - 0 0 LOG all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ LOG flags 0 level 7 prefix `intOUT-default:' -\end_layout - -\begin_layout Code - - 0 0 DROP all * * ::/0 ::/0 - -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-security" - -\end_inset - -La sécurité -\end_layout - -\begin_layout Section -La sécurité d'un noeud -\end_layout - -\begin_layout Standard -Il est très recommandé d'appliquer tous les patchs disponibles, de rendre - indisponibles tous les services inutiles, d'associer les services nécessaires - aux adresses IPv4/IPv6 et d'installer un pare-feu local. -\end_layout - -\begin_layout Standard -A remplir plus avant... -\end_layout - -\begin_layout Section -Les limitations d'accès -\end_layout - -\begin_layout Standard -De nombreux services utilisent la bibliothèque tcp_wrapper pour contrôler - l'accès. - Plus bas est décrite -\begin_inset CommandInset ref -LatexCommand ref -name "l'utilisation de tcp_wrapper" -reference "hints-daemons-tcpwrapper" - -\end_inset - -. -\end_layout - -\begin_layout Standard -A remplir plus avant... -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "IPv6-security-auditing" - -\end_inset - -L'audit de sécurité IPv6 -\end_layout - -\begin_layout Standard -Actuellement, il n'existe pas d'outil véritablement adéquate aux questions - de sécurité IPv6 et capable de vérifier un système monté sur le réseau. - Ni -\begin_inset CommandInset href -LatexCommand href -name "Nessus" -target "http://www.nessus.org/" - -\end_inset - - ni aucun autre scanner de sécurité provenant du commerce n'est capable, - autant que je sache, de scanner les adresses IPv6. -\end_layout - -\begin_layout Subsection -Question d'ordre légal -\end_layout - -\begin_layout Standard -ATTENTION: Prenez bien garde d'uniquement scanner vos propres systèmes, - ou alors seulement après avoir reçu une autorisation écrite, sinon des - problèmes d'ordre juridique risquent de vous arriver. -\begin_inset Newline newline -\end_inset - -VERIFIER A DEUX FOIS les adresses IPv6 avant de lancer un scan. -\end_layout - -\begin_layout Subsection -Audit de sécurité par l'emploi de netcat disposant d'IPv6 -\end_layout - -\begin_layout Standard -Avec netcat disposant d'IPv6 (voir -\begin_inset CommandInset href -LatexCommand href -name "IPv6+Linux-status-apps/security-auditing" -target "http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status-apps.html#security-auditing" - -\end_inset - - pour en savoir plus), vous pouvez lancer un scan de ports -\emph on -via -\emph default - un script qui balaiera un intervalle de ports, captera des bannières, -\emph on -etc -\emph default -. - Un exemple d'utilisation: -\end_layout - -\begin_layout Code - -# nc6 ::1 daytime -\end_layout - -\begin_layout Code - -13 JUL 2002 11:22:22 CEST -\end_layout - -\begin_layout Subsection -Audit de sécurité par l'emploi de nmap disposant d'IPv6 -\end_layout - -\begin_layout Standard -\begin_inset CommandInset href -LatexCommand href -name "NMap" -target "http://www.insecure.org/nmap/" - -\end_inset - -, l'un des meilleurs scanners de ports à travers le monde, supporte IPv6 - depuis la version 3.10ALPHA1. - Un exemple d'utilisation: -\end_layout - -\begin_layout Code - -# nmap -6 -sT ::1 -\end_layout - -\begin_layout Code - -Starting nmap V. - 3.10ALPHA3 ( www.insecure.org/nmap/ ) -\end_layout - -\begin_layout Code - -Interesting ports on localhost6 (::1): -\end_layout - -\begin_layout Code - -(The 1600 ports scanned but not shown below are in state: closed) -\end_layout - -\begin_layout Code - -Port State Service -\end_layout - -\begin_layout Code - -22/tcp open ssh -\end_layout - -\begin_layout Code - -53/tcp open domain -\end_layout - -\begin_layout Code - -515/tcp open printer -\end_layout - -\begin_layout Code - -2401/tcp open cvspserver -\end_layout - -\begin_layout Code - -Nmap run completed -- 1 IP address (1 host up) scanned in 0.525 seconds -\end_layout - -\begin_layout Subsection -Audit de sécurité par l'emploi de strobe disposant d'IPv6 -\end_layout - -\begin_layout Standard -Strobe est (comparé à NMap) un scanner de ports pour les petits budgets, - mais il y a un patch disponible pour le rendre prêt pour IPv6 (voir -\begin_inset CommandInset href -LatexCommand href -name "IPv6+Linux-status-apps/security-auditing" -target "http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status-apps.html#security-auditing" - -\end_inset - - pour plus d'information). - Un exemple d'utilisation: -\end_layout - -\begin_layout Code - -# ./strobe ::1 strobe 1.05 (c) 1995-1999 Julian Assange . -\end_layout - -\begin_layout Code - -::1 2401 unassigned unknown -\end_layout - -\begin_layout Code - -::1 22 ssh Secure Shell - RSA encrypted rsh -\end_layout - -\begin_layout Code - -::1 515 printer spooler (lpd) -\end_layout - -\begin_layout Code - -::1 6010 unassigned unknown -\end_layout - -\begin_layout Code - -::1 53 domain Domain Name Server -\end_layout - -\begin_layout Standard -Note: strobe n'est plus véritablement en développement, le numéro de version - montré n'est pas le bon. -\end_layout - -\begin_layout Subsection -Le résultat de l'audit -\end_layout - -\begin_layout Standard -Si le résultat de l'audit ne correspond pas à votre politique de sécurité - IPv6, mettez en place le pare-feu IPv6 pour combler les trous de sécurité, - par exemple en utilisant netfilter6 (voir -\begin_inset CommandInset ref -LatexCommand ref -name "Mettre en place un pare-feu grâce à Netfilter6" -reference "firewalling-netfilter6" - -\end_inset - - pour plus de détails). -\end_layout - -\begin_layout Standard -Info: une information plus détaillée concernant la sécurité IPv6 peut être - trouvée ici: -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Firewalling Considerations for IPv6 / draft-savola-v6ops-firewalling-??.txt" -target "http://www.ietf.org/internet-drafts/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Neighbour Discovery trust models and threats" -target "http://www.ietf.org/internet-drafts/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Security Considerations for 6to4" -target "http://www.ietf.org/internet-drafts/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Access Control Prefix Router Advertisement Option for IPv6" -target "http://www.ietf.org/internet-drafts/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Requirements for Plug and Play IPsec for IPv6 applications" -target "http://www.ietf.org/internet-drafts/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Security of IPv6 Routing Header and Home Address Options" -target "http://www.ietf.org/internet-drafts/" - -\end_inset - - -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-encryption-authentication" - -\end_inset - -L'encryptage et l'authentification -\end_layout - -\begin_layout Standard -A la différence d'IPv4, l'encryptage et l'authentification sont des fonctionnali -tés que ne fournit pas IPv6 lui-même. - Elles sont normalement implémentées par l'utilisation d'IPsec (qui peut - également être employé par IPv4). -\end_layout - -\begin_layout Section -Les modes d'emploi de l'encryptage et de l'authentification -\end_layout - -\begin_layout Standard -Deux modes d'encryptage et d'authentification sont possibles: -\end_layout - -\begin_layout Subsection -Le mode transport -\end_layout - -\begin_layout Standard -Le mode transport est un mode de connexion réellement de bout-en-bout. - Ici, seule la charge utile (généralement ICMP, TCP ou UDP) est encryptée - avec son en-tête particulier, tandis que l'en-tête IP n'est pas encrypté - (mais couramment inclus dans l'authentification). -\end_layout - -\begin_layout Standard -Utilisant AES-128 pour l'encryptage et SHA1 pour l'authentification, ce - mode diminue la MTU de 42 octets. -\end_layout - -\begin_layout Subsection -Le mode tunnel -\end_layout - -\begin_layout Standard -Le mode tunnel peut être utilisé soit dans un mode de connexion de bout-en-bout - soit dans un mode de connexion de passerelle-à-passerelle. - Ici, le paquet IP complet est encrypté et prend un nouvel en-tête IP, le - tout constituant un nouveau paquet (ce mécanisme étant connu sous le nom - d'encapsulation). - -\end_layout - -\begin_layout Standard -Cependant, à cause de l'indépendance de l'encryptage et de l'authentification - à l'égard du protocole d'échange de clés, il existe actuellement des problèmes - d'interopérabilité. - Ce mode diminue actuellement de 40 octets par rapport au mode transport. - Utiliser AES-128 pour l'encryptage et SHA1 pour l'authentification diminue - donc au total de 82 octets la MTU courante. -\end_layout - -\begin_layout Section -Son support dans le noyau (ESP et AH) -\end_layout - -\begin_layout Subsection -Son support dans les noyaux Linux vanille 2.4.x -\end_layout - -\begin_layout Standard -Manquant à ce jour jusqu'au noyau 2.4.28 vanille, le problème était de garder - les sources du noyau Linux éloignées des questions de contrôles légaux - d'import/export concernant le code d'encryptage en général. - C'est une des raisons pour lesquelles -\begin_inset CommandInset href -LatexCommand href -name "le projet FreeS/WAN" -target "http://www.freeswan.org/" - -\end_inset - - (IPsec pour IPv4 seulement) n'était pas compris dans les sources vanille. - Un rétro-portage à partir de 2.6.x sera peut-être réalisé un jour. -\end_layout - -\begin_layout Subsection -Son support dans les noyaux Linux vanille 2.6.x -\end_layout - -\begin_layout Standard -Les versions actuelles (2.6.9 et supérieures, au moment de la rédaction) supporten -t nativement IPsec pour IPv4 et IPv6. -\end_layout - -\begin_layout Standard -Le projet USAGI a aidé à l'implémentation. - -\end_layout - -\begin_layout Section -Echange automatique de clés (IKE) -\end_layout - -\begin_layout Standard -IPsec requière un échange de clés afin de partager un secret. - Ceci est essentiellement réalisé de façon automatisée par les démons IKE. - Ils prennent également en charge l'authentification des entités en présence, - soit par un secret commun (nommé -\begin_inset Quotes sld -\end_inset - -secret pré-partagé -\begin_inset Quotes srd -\end_inset - -), soit par clés RSA (qui peuvent provenir de certificats X.509). -\end_layout - -\begin_layout Standard -Actuellement, deux démons IKE sont disponibles pour Linux, lesquels différent - totalement par la configuration et l'emploi. -\end_layout - -\begin_layout Standard -Je préfère -\begin_inset Quotes sld -\end_inset - -pluto -\begin_inset Quotes srd -\end_inset - - à l'implémentation *S/WAN à cause de son installation plus simple et à - son unique fichier de configuration. - -\end_layout - -\begin_layout Subsection -Le démon IKE -\begin_inset Quotes sld -\end_inset - -racoon -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -Le démon IKE -\begin_inset Quotes sld -\end_inset - -racoon -\begin_inset Quotes srd -\end_inset - - provient du projet KAME et a été porté sur Linux. - Les distributions contemporaines de Linux comportent ce démon dans le paquetage - -\begin_inset Quotes sld -\end_inset - -ipsec-tools -\begin_inset Quotes srd -\end_inset - -. - Deux exécutables sont requis pour bien installer IPsec. - Jetez aussi un oeil à -\begin_inset CommandInset href -LatexCommand href -name "Linux Advanced Routing & Traffic Control HOWTO / IPSEC" -target "http://lartc.org/howto/lartc.ipsec.html" - -\end_inset - -. -\end_layout - -\begin_layout Subsubsection -Manipulation de la base de données IPsec SA/SP grâce à l'outil -\begin_inset Quotes sld -\end_inset - -setkey -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -Le rôle important de -\begin_inset Quotes sld -\end_inset - -setkey -\begin_inset Quotes srd -\end_inset - - est de définir la politique de sécurité ( -\emph on -SP -\emph default -, -\emph on -security policy -\emph default -) pour le noyau. -\end_layout - -\begin_layout Standard -Fichier: /etc/racoon/setkey.sh -\end_layout - -\begin_layout Itemize -Exemple d'une connexion encryptée de boute-en-bout en mode transport -\end_layout - -\begin_layout Code - -#!/sbin/setkey -f -\end_layout - -\begin_layout Code - -flush; -\end_layout - -\begin_layout Code - -spdflush; -\end_layout - -\begin_layout Code - -spdadd 2001:db8:1:1::1 2001:db8:2:2::2 any -P out ipsec esp/transport//require; -\end_layout - -\begin_layout Code - -spdadd 2001:db8:2:2::2 2001:db8:1:1::1 any -P in ipsec esp/transport//require; -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Itemize -Exemple d'une connexion encryptée de boute-en-bout en mode tunnel -\end_layout - -\begin_layout Code - -#!/sbin/setkey -f -\end_layout - -\begin_layout Code - -flush; -\end_layout - -\begin_layout Code - -spdflush; -\end_layout - -\begin_layout Code - -spdadd 2001:db8:1:1::1 2001:db8:2:2::2 any -P out ipsec -\end_layout - -\begin_layout Code - -¬ esp/tunnel/2001:db8:1:1::1-2001:db8:2:2::2/require; -\end_layout - -\begin_layout Code - -spdadd 2001:db8:2:2::2 2001:db8:1:1::1 any -P in ipsec -\end_layout - -\begin_layout Code - -¬ esp/tunnel/2001:db8:2:2::2-2001:db8:1:1::1/require; -\end_layout - -\begin_layout Standard -Pour l'autre machine, vous avez juste à échanger -\begin_inset Quotes sld -\end_inset - -in -\begin_inset Quotes srd -\end_inset - - et -\begin_inset Quotes sld -\end_inset - -out -\begin_inset Quotes srd -\end_inset - -. -\end_layout - -\begin_layout Subsubsection -La configuration du démon IKE -\begin_inset Quotes sld -\end_inset - -racoon -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -Pour sa bonne exécution, -\begin_inset Quotes sld -\end_inset - -racoon -\begin_inset Quotes srd -\end_inset - - requière d'être configuré. - Ceci inclus les réglages relatifs à la politique de sécurité, qui doit - être précédemment mise en place grâce à -\begin_inset Quotes sld -\end_inset - -setkey -\begin_inset Quotes srd -\end_inset - -. -\end_layout - -\begin_layout Standard -Fichier: /etc/racoon/racoon.conf -\end_layout - -\begin_layout Code - -# Fichier de configuration du démon IKE racoon. -\end_layout - -\begin_layout Code - -# Voir 'man racoon.conf' pour une description du format et des entrées. -\end_layout - -\begin_layout Code - -path include "/etc/racoon"; -\end_layout - -\begin_layout Code - -path pre_shared_key "/etc/racoon/psk.txt"; -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -listen -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - isakmp 2001:db8:1:1::1; -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Code - -remote 2001:db8:2:2::2 -\end_layout - -\begin_layout Code - -{ -\end_layout - -\begin_layout Code - - exchange_mode main; -\end_layout - -\begin_layout Code - - lifetime time 24 hour; -\end_layout - -\begin_layout Code - - proposal -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - encryption_algorithm 3des; -\end_layout - -\begin_layout Code - - hash_algorithm md5; -\end_layout - -\begin_layout Code - - authentication_method pre_shared_key; -\end_layout - -\begin_layout Code - - dh_group 2; -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - -} -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# De passerelle-à-passerelle -\end_layout - -\begin_layout Code - -sainfo address 2001:db8:1:1::1 any address 2001:db8:2:2::2 any -\end_layout - -\begin_layout Code - -{ -\end_layout - -\begin_layout Code - - lifetime time 1 hour; -\end_layout - -\begin_layout Code - - encryption_algorithm 3des; -\end_layout - -\begin_layout Code - - authentication_algorithm hmac_md5; -\end_layout - -\begin_layout Code - - compression_algorithm deflate; -\end_layout - -\begin_layout Code - -} -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -sainfo address 2001:db8:2:2::2 any address 2001:db8:1:1::1 any -\end_layout - -\begin_layout Code - -{ -\end_layout - -\begin_layout Code - - lifetime time 1 hour; -\end_layout - -\begin_layout Code - - encryption_algorithm 3des; -\end_layout - -\begin_layout Code - - authentication_algorithm hmac_md5; -\end_layout - -\begin_layout Code - - compression_algorithm deflate; -\end_layout - -\begin_layout Code - -} -\end_layout - -\begin_layout Standard -Fixez aussi un secret pré-partagé: -\end_layout - -\begin_layout Standard -Fichier: /etc/racoon/psk.txt -\end_layout - -\begin_layout Code - -# Fichier des clés pré-partagées utilisées pour l'authentification IKE -\end_layout - -\begin_layout Code - -# Le format est: 'identificateur' 'clé' -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -2001:db8:2:2::2 absolumentsecret -\end_layout - -\begin_layout Subsubsection -Démarrer IPsec grâce au démon IKE -\begin_inset Quotes sld -\end_inset - -racoon -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -Il faut pour le moins que le démon soit démarré. - Au premier démarrage, utiliser les modes déboguage et premier plan ( -\emph on -debug and foreground -\emph default -). - L'exemple suivant montre une négociation IKE réussie dans ses phases 1 - (ISAKMP-SA, -\emph on -Internet Security Association Key Management Security Association -\emph default -) and 2 (IPsec-SA, -\emph on -IPsec -\emph default - -\emph on -Security Association -\emph default -): -\end_layout - -\begin_layout Code - -# racoon -F -v -f /etc/racoon/racoon.conf -\end_layout - -\begin_layout Code - -Foreground mode. -\end_layout - -\begin_layout Code - -2005-01-01 20:30:15: INFO: @(#)ipsec-tools 0.3.3 (http://ipsec-tools.sourceforge.net -) -\end_layout - -\begin_layout Code - -2005-01-01 20:30:15: INFO: @(#)This product linked -\end_layout - -\begin_layout Code - -¬ OpenSSL 0.9.7a Feb 19 2003 (http://www.openssl.org/) -\end_layout - -\begin_layout Code - -2005-01-01 20:30:15: INFO: 2001:db8:1:1::1[500] used as isakmp port (fd=7) -\end_layout - -\begin_layout Code - -2005-01-01 20:31:06: INFO: IPsec-SA request for 2001:db8:2:2::2 -\end_layout - -\begin_layout Code - -¬ queued due to no phase1 found. -\end_layout - -\begin_layout Code - -2005-01-01 20:31:06: INFO: initiate new phase 1 negotiation: -\end_layout - -\begin_layout Code - -¬ 2001:db8:1:1::1[500]<=>2001:db8:2:2::2[500] -\end_layout - -\begin_layout Code - -2005-01-01 20:31:06: INFO: begin Identity Protection mode. -\end_layout - -\begin_layout Code - -2005-01-01 20:31:09: INFO: ISAKMP-SA established -\end_layout - -\begin_layout Code - -¬ 2001:db8:1:1::1[500]-2001:db8:2:2::2[500] spi:da3d3693289c9698:ac039a402b2db40 -1 -\end_layout - -\begin_layout Code - -2005-01-01 20:31:09: INFO: initiate new phase 2 negotiation: -\end_layout - -\begin_layout Code - -¬ 2001:6f8:900:94::2[0]<=>2001:db8:2:2::2[0] -\end_layout - -\begin_layout Code - -2005-01-01 20:31:10: INFO: IPsec-SA established: -\end_layout - -\begin_layout Code - -¬ ESP/Tunnel 2001:db8:2:2::2->2001:db8:1:1::1 spi=253935531(0xf22bfab) -\end_layout - -\begin_layout Code - -2005-01-01 20:31:10: INFO: IPsec-SA established: -\end_layout - -\begin_layout Code - -¬ ESP/Tunnel 2001:db8:1:1::1->2001:db8:2:2::2 spi=175002564(0xa6e53c4) -\end_layout - -\begin_layout Standard -Chaque direction a sa propre IPsec-SA (comme définie dans le standard IPsec). - Avec -\begin_inset Quotes sld -\end_inset - -tcpdump -\begin_inset Quotes srd -\end_inset - - à l'écoute de la bonne interface, vous devriez voir comme résultat d'un - ping IPv6: -\end_layout - -\begin_layout Code - -20:35:55.305707 2001:db8:1:1::1 > 2001:db8:2:2::2: ESP(spi=0x0a6e53c4,seq=0x3) -\end_layout - -\begin_layout Code - -20:35:55.537522 2001:db8:2:2::2 > 2001:db8:1:1::1: ESP(spi=0x0f22bfab,seq=0x3) -\end_layout - -\begin_layout Standard -Comme prévu, les SPI ( -\emph on -Security Parameter Index -\emph default -) négociés sont utilisés ici. -\end_layout - -\begin_layout Standard -Et en utilisant -\begin_inset Quotes sld -\end_inset - -setkey -\begin_inset Quotes srd -\end_inset - -, les paramètres actifs courants: -\end_layout - -\begin_layout Code - -# setkey -D -\end_layout - -\begin_layout Code - -2001:db8:1:1::1 2001:db8:2:2::2 -\end_layout - -\begin_layout Code - - esp mode=tunnel spi=175002564(0x0a6e53c4) reqid=0(0x00000000) -\end_layout - -\begin_layout Code - - E: 3des-cbc bd26bc45 aea0d249 ef9c6b89 7056080f 5d9fa49c 924e2edd -\end_layout - -\begin_layout Code - - A: hmac-md5 60c2c505 517dd8b7 c9609128 a5efc2db -\end_layout - -\begin_layout Code - - seq=0x00000000 replay=4 flags=0x00000000 state=mature -\end_layout - -\begin_layout Code - - created: Jan 1 20:31:10 2005 current: Jan 1 20:40:47 2005 -\end_layout - -\begin_layout Code - - diff: 577(s) hard: 3600(s) soft: 2880(s) -\end_layout - -\begin_layout Code - - last: Jan 1 20:35:05 2005 hard: 0(s) soft: 0(s) -\end_layout - -\begin_layout Code - - current: 540(bytes) hard: 0(bytes) soft: 0(bytes) -\end_layout - -\begin_layout Code - - allocated: 3 hard: 0 soft: 0 -\end_layout - -\begin_layout Code - - sadb_seq=1 pid=22358 refcnt=0 -\end_layout - -\begin_layout Code - -2001:db8:2:2::2 2001:db8:1:1::1 -\end_layout - -\begin_layout Code - - esp mode=tunnel spi=253935531(0x0f22bfab) reqid=0(0x00000000) -\end_layout - -\begin_layout Code - - E: 3des-cbc c1ddba65 83debd62 3f6683c1 20e747ac 933d203f 4777a7ce -\end_layout - -\begin_layout Code - - A: hmac-md5 3f957db9 9adddc8c 44e5739d 3f53ca0e -\end_layout - -\begin_layout Code - - seq=0x00000000 replay=4 flags=0x00000000 state=mature -\end_layout - -\begin_layout Code - - created: Jan 1 20:31:10 2005 current: Jan 1 20:40:47 2005 -\end_layout - -\begin_layout Code - - diff: 577(s) hard: 3600(s) soft: 2880(s) -\end_layout - -\begin_layout Code - - last: Jan 1 20:35:05 2005 hard: 0(s) soft: 0(s) -\end_layout - -\begin_layout Code - - current: 312(bytes) hard: 0(bytes) soft: 0(bytes) -\end_layout - -\begin_layout Code - - allocated: 3 hard: 0 soft: 0 -\end_layout - -\begin_layout Code - - sadb_seq=0 pid=22358 refcnt=0 -\end_layout - -\begin_layout Subsection -Le démon IKE -\begin_inset Quotes sld -\end_inset - -pluto -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -Le démon IKE -\begin_inset Quotes sld -\end_inset - -pluto -\begin_inset Quotes srd -\end_inset - - est inclus dans les distributions des projets *S/WAN, qui ont pour origine - -\begin_inset CommandInset href -LatexCommand href -name "FreeS/WAN" -target "http://www.freeswan.org/" - -\end_inset - -. - Le développement du projet FreeS/WAN a malheureusement été stoppé en 2004. - A cause de la lenteur du développement dans le passé, deux projets en découlère -nt: -\begin_inset CommandInset href -LatexCommand href -name "strongSwan" -target "http://www.strongswan.org/" - -\end_inset - - et -\begin_inset CommandInset href -LatexCommand href -name "Openswan" -target "http://www.openswan.org/" - -\end_inset - -. - Aujourd'hui, des paquetages d'installation sont disponibles, au moins pour - Openswan (inclus dans Fedora Core 3). -\end_layout - -\begin_layout Standard -Une différence importante par rapport à -\begin_inset Quotes sld -\end_inset - -racoon -\begin_inset Quotes srd -\end_inset - -, un seul et unique fichier de configuration est requis. - Il y a bien sûr un script d'initialisation qui automatise le lancement - au démarrage de la machine. -\end_layout - -\begin_layout Subsubsection -La configuration du démon IKE -\begin_inset Quotes sld -\end_inset - -pluto -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -La configuration est très similaire à celle nécessaire pour IPv4, à part - une importante et nécessaire option. -\end_layout - -\begin_layout Standard -Fichier: /etc/ipsec.conf -\end_layout - -\begin_layout Code - -# /etc/ipsec.conf - Fichier de configuration d'IPsec Openswan -\end_layout - -\begin_layout Code - -# -\end_layout - -\begin_layout Code - -# Manuel: ipsec.conf.5 -\end_layout - -\begin_layout Code - -version 2.0 # conforme à la seconde version de la spécification d'ipsec.conf -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# configuration de base -\end_layout - -\begin_layout Code - -config setup -\end_layout - -\begin_layout Code - - # Contrôles du déboguage / journalisation : "none" pour (presque) - rien, "all" pour beaucoup. -\end_layout - -\begin_layout Code - - # klipsdebug=none -\end_layout - -\begin_layout Code - - # plutodebug="control parsing" -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -#Rendre indisponible l'encryptage opportuniste -\end_layout - -\begin_layout Code - -include /etc/ipsec.d/examples/no_oe.conf -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -conn ipv6-p1-p2 -\end_layout - -\begin_layout Code - - connaddrfamily=ipv6 # Important pour IPv6! -\end_layout - -\begin_layout Code - - left=2001:db8:1:1::1 -\end_layout - -\begin_layout Code - - right=2001:db8:2:2::2 -\end_layout - -\begin_layout Code - - authby=secret -\end_layout - -\begin_layout Code - - esp=aes128-sha1 -\end_layout - -\begin_layout Code - - ike=aes128-sha-modp1024 -\end_layout - -\begin_layout Code - - type=transport -\end_layout - -\begin_layout Code - - #type=tunnel -\end_layout - -\begin_layout Code - - compress=no -\end_layout - -\begin_layout Code - - #compress=yes -\end_layout - -\begin_layout Code - - auto=add -\end_layout - -\begin_layout Code - - #auto=start -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Standard -N'oubliez pas ici également de définir un secret pré-partagé. -\end_layout - -\begin_layout Standard -Fichier: /etc/ipsec.secrets -\end_layout - -\begin_layout Code - -2001:db8:1:1::1 2001:db8:2:2::2 : PSK "absolumentsecret" -\end_layout - -\begin_layout Subsubsection -Démarrer IPsec grâce au démon IKE -\begin_inset Quotes sld -\end_inset - -pluto -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -Si l'installation d'Openswan s'est achevée avec succès, un script d'initialisati -on doit exister permettant le démarrage d'IPsec, lancez simplement (sur - chaque machine) par: -\end_layout - -\begin_layout Code - -# /etc/rc.d/init.d/ipsec start -\end_layout - -\begin_layout Standard -Ensuite, démarrez une connexion sur l'une des machines. - Si vous pouvez voir la ligne -\begin_inset Quotes sld -\end_inset - -IPsec SA established -\begin_inset Quotes srd -\end_inset - -, c'est que tout fonctionne parfaitement. -\end_layout - -\begin_layout Code - -# ipsec auto --up ipv6-peer1-peer2 -\end_layout - -\begin_layout Code - -104 "ipv6-p1-p2" #1: STATE_MAIN_I1: initiate -\end_layout - -\begin_layout Code - -106 "ipv6-p1-p2" #1: STATE_MAIN_I2: sent MI2, expecting MR2 -\end_layout - -\begin_layout Code - -108 "ipv6-p1-p2" #1: STATE_MAIN_I3: sent MI3, expecting MR3 -\end_layout - -\begin_layout Code - -004 "ipv6-p1-p2" #1: STATE_MAIN_I4: ISAKMP SA established -\end_layout - -\begin_layout Code - -112 "ipv6-p1-p2" #2: STATE_QUICK_I1: initiate -\end_layout - -\begin_layout Code - -004 "ipv6-p1-p2" #2: STATE_QUICK_I2: sent QI2, -\end_layout - -\begin_layout Code - -¬ IPsec SA established {ESP=>0xa98b7710 <0xa51e1f22} -\end_layout - -\begin_layout Standard -Parce que *S/WAN et setkey/racoon sont basés sur la même implémentation - d'IPsec dans les noyaux 2.6.x, -\begin_inset Quotes sld -\end_inset - -setkey -\begin_inset Quotes srd -\end_inset - - peut être utilisé pour afficher les paramètres actifs courants: -\end_layout - -\begin_layout Code - -# setkey -D -\end_layout - -\begin_layout Code - -2001:db8:1:1::1 2001:db8:2:2::2 -\end_layout - -\begin_layout Code - - esp mode=transport spi=2844489488(0xa98b7710) reqid=16385(0x00004001) -\end_layout - -\begin_layout Code - - E: aes-cbc 082ee274 2744bae5 7451da37 1162b483 -\end_layout - -\begin_layout Code - - A: hmac-sha1 b7803753 757417da 477b1c1a 64070455 ab79082c -\end_layout - -\begin_layout Code - - seq=0x00000000 replay=64 flags=0x00000000 state=mature -\end_layout - -\begin_layout Code - - created: Jan 1 21:16:32 2005 current: Jan 1 21:22:20 2005 -\end_layout - -\begin_layout Code - - diff: 348(s) hard: 0(s) soft: 0(s) -\end_layout - -\begin_layout Code - - last: hard: 0(s) soft: 0(s) -\end_layout - -\begin_layout Code - - current: 0(bytes) hard: 0(bytes) soft: 0(bytes) -\end_layout - -\begin_layout Code - - allocated: 0 hard: 0 soft: 0 -\end_layout - -\begin_layout Code - - sadb_seq=1 pid=23825 refcnt=0 -\end_layout - -\begin_layout Code - -2001:db8:2:2::2 2001:db8:1:1::1 -\end_layout - -\begin_layout Code - - esp mode=transport spi=2770214690(0xa51e1f22) reqid=16385(0x00004001) -\end_layout - -\begin_layout Code - - E: aes-cbc 6f59cc30 8d856056 65e07b76 552cac18 -\end_layout - -\begin_layout Code - - A: hmac-sha1 c7c7d82b abfca8b1 5440021f e0c3b335 975b508b -\end_layout - -\begin_layout Code - - seq=0x00000000 replay=64 flags=0x00000000 state=mature -\end_layout - -\begin_layout Code - - created: Jan 1 21:16:31 2005 current: Jan 1 21:22:20 2005 -\end_layout - -\begin_layout Code - - diff: 349(s) hard: 0(s) soft: 0(s) -\end_layout - -\begin_layout Code - - last: hard: 0(s) soft: 0(s) -\end_layout - -\begin_layout Code - - current: 0(bytes) hard: 0(bytes) soft: 0(bytes) -\end_layout - -\begin_layout Code - - allocated: 0 hard: 0 soft: 0 -\end_layout - -\begin_layout Code - - sadb_seq=0 pid=23825 refcnt=0 -\end_layout - -\begin_layout Section -Informations complémentaires -\end_layout - -\begin_layout Standard -Pour les noyaux Linux 2.6.x, vous pouvez également obtenir la politique et - l'état d'IPsec en utilisant -\begin_inset Quotes sld -\end_inset - -ip -\begin_inset Quotes srd -\end_inset - -: -\end_layout - -\begin_layout Code - -# ip xfrm policy -\end_layout - -\begin_layout Code - -... -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# ip xfrm state -\end_layout - -\begin_layout Code - -... -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-qos" - -\end_inset - -La Qualité de Service (QoS) -\end_layout - -\begin_layout Standard -IPv6 supporte QoS par l'utilisation des labels de flux et des classes de - trafic. - Ceci peut être contrôlé en utilisant -\begin_inset Quotes sld -\end_inset - -tc -\begin_inset Quotes srd -\end_inset - - (compris dans le paquetage -\begin_inset Quotes sld -\end_inset - -iproute -\begin_inset Quotes srd -\end_inset - -). -\end_layout - -\begin_layout Standard -Information complémentaire: -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "RFC 3697 / IPv6 Flow Label Specification" -target "http://www.faqs.org/rfcs/rfc3697.html" - -\end_inset - - -\end_layout - -\begin_layout Standard -A remplir plus avant... -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-hints-daemons" - -\end_inset - -Eléments d'installation des démons prêts pour IPv6 -\end_layout - -\begin_layout Standard -Ici quelques éléments d'installation des démons prêts pour IPv6 sont exposés. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-bind" - -\end_inset - -Le Démon de Nom Internet Berkeley (named) -\end_layout - -\begin_layout Standard -IPv6 est supporté depuis la version 9. - Utilisez toujours la dernière version disponible. - Il faut au moins utiliser la version 9, les versions plus anciennes peuvent - contenir des trous de sécurité exploitables à distance. -\end_layout - -\begin_layout Subsection -A l'écoute des adresses IPv6 -\end_layout - -\begin_layout Standard -Note: à la différence d'IPv4, les versions actuelles ne permettent pas d'associe -r une socket de serveur à des adresses IPv6 données, par conséquent, seule - l'alternative -\emph on -toutes -\emph default - ou -\emph on -aucune -\emph default - adresse(s) IPv6 est valide. - Parce que cela peut poser un problème de sécurité, consultez aussi plus - bas la section concernant la liste de contrôle d'accès (ACL)! -\end_layout - -\begin_layout Subsubsection -Rendre disponible l'écoute sur adresse IPv6 -\end_layout - -\begin_layout Standard -Pour rendre disponible à named l'écoute IPv6, les options suivantes demandent - à être modifiées -\end_layout - -\begin_layout Code - -options { -\end_layout - -\begin_layout Code - - # certainement que d'autres options sont aussi ici -\end_layout - -\begin_layout Code - - listen-on-v6 { any; }; -\end_layout - -\begin_layout Code - -}; -\end_layout - -\begin_layout Standard -Il doit en résulter après redémarrage -\end_layout - -\begin_layout Code - -# netstat -lnptu |grep "named -\backslash -W*$" -\end_layout - -\begin_layout Code - -tcp 0 0 :::53 :::* LISTEN 1234/named -\end_layout - -\begin_layout Code - -¬ # incoming TCP requests -\end_layout - -\begin_layout Code - -udp 0 0 1.2.3.4:53 0.0.0.0:* 1234/named -\end_layout - -\begin_layout Code - -¬ # incoming UDP requests to IPv4 1.2.3.4 -\end_layout - -\begin_layout Code - -udp 0 0 127.0.0.1:53 0.0.0.0:* 1234/named -\end_layout - -\begin_layout Code - -¬ # incoming UDP requests to IPv4 localhost -\end_layout - -\begin_layout Code - -udp 0 0 0.0.0.0:32868 0.0.0.0:* 1234/named -\end_layout - -\begin_layout Code - -¬ # dynamic chosen port for outgoing queries -\end_layout - -\begin_layout Code - -udp 0 0 :::53 :::* 1234/named -\end_layout - -\begin_layout Code - -¬ # incoming UDP request to any IPv6 -\end_layout - -\begin_layout Standard -Un test simple ressemble à -\end_layout - -\begin_layout Code - -# dig localhost @::1 -\end_layout - -\begin_layout Standard -et doit vous afficher un résultat. -\end_layout - -\begin_layout Subsubsection -Rendre indisponible l'écoute sur adresse IPv6 -\end_layout - -\begin_layout Standard -Pour rendre indisponible l'écoute IPv6, l'option suivante demande à être - modifiée -\end_layout - -\begin_layout Code - -options { -\end_layout - -\begin_layout Code - - # certainement que d'autres options sont aussi ici -\end_layout - -\begin_layout Code - - listen-on-v6 { none; }; -\end_layout - -\begin_layout Code - -}; -\end_layout - -\begin_layout Subsection -Les Listes de Contrôle d'Accès IPv6 (ACL) -\end_layout - -\begin_layout Standard -Les ACL IPv6 sont disponibles et devraient être utilisées dès que possible. - Un exemple ressemble à ce qui suit: -\end_layout - -\begin_layout Code - -acl internal-net { -\end_layout - -\begin_layout Code - - 127.0.0.1; -\end_layout - -\begin_layout Code - - 1.2.3.0/24; -\end_layout - -\begin_layout Code - - 3ffe:ffff:100::/56; -\end_layout - -\begin_layout Code - - ::1/128; -\end_layout - -\begin_layout Code - - ::ffff:1.2.3.4/128; -\end_layout - -\begin_layout Code - -}; -\end_layout - -\begin_layout Code - -acl ns-internal-net { -\end_layout - -\begin_layout Code - - 1.2.3.4; -\end_layout - -\begin_layout Code - - 1.2.3.5; -\end_layout - -\begin_layout Code - - 3ffe:ffff:100::4/128; -\end_layout - -\begin_layout Code - - 3ffe:ffff:100::5/128; -\end_layout - -\begin_layout Code - -}; -\end_layout - -\begin_layout Standard -Ces ACL peuvent être utilisées par exemple pour les requêtes des clients - ou pour le transfert de zones aux serveurs de noms de domaine secondaires. - Ceci prévient aussi contre l'utilisation de votre serveur cache de noms - de domaine à partir de l'extérieur grâce à IPv6. -\end_layout - -\begin_layout Code - -options { -\end_layout - -\begin_layout Code - - # certainement que d'autres options sont aussi ici -\end_layout - -\begin_layout Code - - listen-on-v6 { none; }; -\end_layout - -\begin_layout Code - - allow-query { internal-net; }; -\end_layout - -\begin_layout Code - - allow-transfer { ns-internal-net; }; -\end_layout - -\begin_layout Code - -}; -\end_layout - -\begin_layout Standard -Il est aussi possible de positionner les options -\emph on -allow-query -\emph default -et -\emph on -allow-transfer -\emph default - pour la plupart des définitions par fichier de zone. - -\end_layout - -\begin_layout Subsection -Emettre des requêtes avec une adresse IPv6 dédiée -\end_layout - -\begin_layout Standard -Cette option n'est pas requise, mais peut être nécessaire: -\end_layout - -\begin_layout Code - -query-source-v6 address port ; -\end_layout - -\begin_layout Subsection -Adresses IPv6 dédiées définies par zone -\end_layout - -\begin_layout Standard -Il est aussi possible de définir des adresses IPv6 par zone. -\end_layout - -\begin_layout Subsubsection -Adresse de la source de transfert -\end_layout - -\begin_layout Standard -L'adresse de la source de transfert est utilisée pour aller chercher les - zones transférées: -\end_layout - -\begin_layout Code - -transfer-source-v6 [port port]; -\end_layout - -\begin_layout Subsubsection -Adresse de la source à notifier -\end_layout - -\begin_layout Standard -L'adresse de la source à notifier est utilisée pour les messages de notification -: -\end_layout - -\begin_layout Code - -notify-source-v6 [port port]; -\end_layout - -\begin_layout Subsection -Des exemples de fichiers de zone DNS IPv6 -\end_layout - -\begin_layout Standard -Des informations peuvent être aussi trouvées dans cet article concernant - l' -\begin_inset CommandInset href -LatexCommand href -name "information d'installation d'un DNS IPv6" -target "http://www.isi.edu/~bmanning/v6DNS.html" - -\end_inset - -. - Le -\begin_inset CommandInset href -LatexCommand href -name "constructeur de zone inverse IPv6 pour BIND 8/9 (outil web)" -target "http://tools.fpsn.net/ipv6-inaddr/" - -\end_inset - - peut aussi être d'une aide précieuse. -\end_layout - -\begin_layout Subsection -Servir des données DNS relatives à IPv6 -\end_layout - -\begin_layout Standard -Pour IPv6, de nouveaux types et la zone racine nécessaire à la recherche - inversée sont définis: -\end_layout - -\begin_layout Itemize -AAAA et IP6.INT inversée: specifiés dans le -\begin_inset CommandInset href -LatexCommand href -name "RFC 1886 / DNS Extensions to support IP version 6" -target "http://www.faqs.org/rfcs/rfc1886.html" - -\end_inset - -, utilisés depuis BIND version 4.9.6 -\end_layout - -\begin_layout Itemize -A6, DNAME (DORÉNAVANT DÉPRECIÉ!) et IP6.ARPA inversé: spécifiés dans le -\begin_inset CommandInset href -LatexCommand href -name "RFC 2874 / DNS Extensions to Support IPv6 Address Aggregation and Renumbering" -target "http://www.faqs.org/rfcs/rfc2874.html" - -\end_inset - -, utilisable depuis BIND 9, mais vous pouvez trouver de l'information sur - l'état actuel dans -\begin_inset CommandInset href -LatexCommand href -name "draft-ietf-dnsext-ipv6-addresses-00.txt" -target "http://www.ietf.org/internet-drafts/" - -\end_inset - - -\end_layout - -\begin_layout Standard -Peut-être complété plus tard, pour le moment, jetez un coup d'oeil aux RFC - fournis et -\end_layout - -\begin_layout Itemize -AAAA et IP6.INT inversé: -\begin_inset CommandInset href -LatexCommand href -name "l'installation d'un DNS IPv6" -target "http://www.isi.edu/~bmanning/v6DNS.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -A6, DNAME (DORÉNAVANT DÉPRECIÉ!) et IP6.ARPA inversé: jetez un coup d'oeil - aux chapitres 4 et 6 du manuel de référence de l'administrateur BIND 9 - (ARM), distributé avec le paquetage bind, ou bien récupérez-le : -\begin_inset CommandInset href -LatexCommand href -name "BIND version 9 ARM (PDF)" -target "http://www.nominum.com/content/documents/bind9arm.pdf" - -\end_inset - - -\end_layout - -\begin_layout Standard -Parce que IP6.INT est déprécié (mais encore en usage), un serveur DNS qui - supportera l'information IPv6 aura à servir tous les types de zones inversées. -\end_layout - -\begin_layout Subsubsection -La meilleure pratique courante -\end_layout - -\begin_layout Standard -Parce qu'il y a encore quelques problèmes qui existent lorsque les nouveaux - formats sont utilisés, la meilleure pratique courante est: -\end_layout - -\begin_layout Standard -Support de recherche: -\end_layout - -\begin_layout Itemize -AAAA -\end_layout - -\begin_layout Standard -La recherche inversée supporte: -\end_layout - -\begin_layout Itemize -Le format réduit inversé ( -\emph on -reverse nibble format -\emph default -) pour la zone ip6.int (POUR LA COMPATIBILITÉ ASCENDANTE) -\end_layout - -\begin_layout Itemize -Le format réduit inversé ( -\emph on -reverse nibble format -\emph default -) pour la zone ip6.arpa (RECOMMANDÉ) -\end_layout - -\begin_layout Subsection -Vérifier la connectivité IPv6 -\end_layout - -\begin_layout Standard -Pour vérifier si BIND est à l'écoute sur une socket IPv6 et sert des données, - voir les exemples suivants. -\end_layout - -\begin_layout Subsubsection -Connecté -\emph on -via -\emph default - IPv6, mais refusé par les ACL -\end_layout - -\begin_layout Standard -En spécifiant un serveur pour les requêtes, une connexion IPv6 peut être - forcée: -\end_layout - -\begin_layout Code - -$ host -t aaaa www.6bone.net 3ffe:ffff:200:f101::1 -\end_layout - -\begin_layout Code - -Using domain server: -\end_layout - -\begin_layout Code - -Name: 3ffe:ffff:200:f101::1 -\end_layout - -\begin_layout Code - -Address: 3ffe:ffff:200:f101::1#53 -\end_layout - -\begin_layout Code - -Aliases: -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -Host www.6bone.net. - not found: 5(REFUSED) -\end_layout - -\begin_layout Standard -L'entrée relative dans le journal ressemble à ce qui suit: -\end_layout - -\begin_layout Code - -Jan 3 12:43:32 gate named[12347]: client -\end_layout - -\begin_layout Code - -¬ 3ffe:ffff:200:f101:212:34ff:fe12:3456#32770: -\end_layout - -\begin_layout Code - - query denied -\end_layout - -\begin_layout Standard -Si vous observez de telles entrées dans le journal, vérifiez si les requêtes - provenant de ce client doivent être autorisées, pour revoir, si nécessaire, - votre configuration ACL. -\end_layout - -\begin_layout Subsubsection -Une connexion IPv6 réussie -\end_layout - -\begin_layout Standard -Une connexion IPv6 réussie ressemble à ce qui suit: -\end_layout - -\begin_layout Code - -$ host -t aaaa www.6bone.net 3ffe:ffff:200:f101::1 -\end_layout - -\begin_layout Code - -Using domain server: -\end_layout - -\begin_layout Code - -Name: 3ffe:ffff:200:f101::1 -\end_layout - -\begin_layout Code - -Address: 3ffe:ffff:200:f101::1#53 -\end_layout - -\begin_layout Code - -Aliases: -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -www.6bone.net. - is an alias for 6bone.net. - -\end_layout - -\begin_layout Code - -6bone.net. - has AAAA address 3ffe:b00:c18:1::10 -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-xinetd" - -\end_inset - -Le super démon Internet (xinetd) -\end_layout - -\begin_layout Standard -IPv6 est supporté, approximativement, depuis la version 1.8.9 de -\begin_inset CommandInset href -LatexCommand href -name "xinetd" -target "http://www.xinetd.org/" - -\end_inset - -. - Utilisez toujours la version disponible la plus récente. - Seules les versions antérieures à la version 2.3.3 doivent être utilisées, - les versions plus anciennes peuvent contenir des trous de sécurité exploitables - à distance. -\end_layout - -\begin_layout Standard -Certaines distributions Linux contiennent un paquetage supplémentaire pour - xinetd prêt pour IPv6, d'autres démarrent xinetd prêt pour IPv6 si la variable - suivante est positionnée: NETWORKING_IPV6="yes", chose normalement réalisée - par /etc/sysconfig/network (valide uniquement pour la distribution Red - Hat et ses dérivées). - Dans les nouvelles livraisons des distributions, un binaire supporte à - la fois IPv4 et IPv6. -\end_layout - -\begin_layout Standard -Si vous rendez disponible un service fourni avec xinetd, comme par exemple - daytime, en modifiant la configuration dans le fichier /etc/xinetd.d/daytime - comme suit -\end_layout - -\begin_layout Code - -# diff -u /etc/xinetd.d/daytime.orig /etc/xinetd.d/daytime -\end_layout - -\begin_layout Code - ---- /etc/xinetd.d/daytime.orig Sun Dec 16 19:00:14 2001 -\end_layout - -\begin_layout Code - -+++ /etc/xinetd.d/daytime Sun Dec 16 19:00:22 2001 -\end_layout - -\begin_layout Code - -@@ -10,5 +10,5 @@ -\end_layout - -\begin_layout Code - - protocol = tcp -\end_layout - -\begin_layout Code - - user = root -\end_layout - -\begin_layout Code - - wait = no -\end_layout - -\begin_layout Code - -- disable = yes -\end_layout - -\begin_layout Code - -+ disable = no -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Standard -vous devriez recevoir, après le redémarrage de xinetd, une réponse positive - telle que: -\end_layout - -\begin_layout Code - -# netstat -lnptu -A inet6 |grep "xinetd*" -\end_layout - -\begin_layout Code - -tcp 0 0 ::ffff:192.168.1.1:993 :::* LISTEN 12345/xinetd-ipv6 -\end_layout - -\begin_layout Code - -tcp 0 0 :::13 :::* LISTEN 12345/xinetd-ipv6 <- service -\end_layout - -\begin_layout Code - -¬ daytime/tcp -\end_layout - -\begin_layout Code - -tcp 0 0 ::ffff:192.168.1.1:143 :::* LISTEN 12345/xinetd-ipv6 -\end_layout - -\begin_layout Standard -L'exemple montre aussi que xinetd écoute pour IMAP et IMAP-SSL sur IPv4 - seulement. -\end_layout - -\begin_layout Standard -Note: un serveur xinetd uniquement IPv4 ne démarrera pas sur un noeud disposant - d'IPv6 et inversement, un serveur xinetd IPv6 ne démarrera pas sur un noeud - uniquement IPv4. - Ce problème est réputé réglé dans les versions postérieures, au moins à - partir de la version 2.3.11. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-apache2" - -\end_inset - -Le serveur web Apache2 (httpd2) -\end_layout - -\begin_layout Standard -Le serveur web Apache supporte nativement IPv6 depuis la version 2.0.14. - Des patchs disponibles pour l'ancienne série 1.3.x ne sont pas courants et - ne devraient pas être employés dans un contexte public, mais ils sont disponibl -es sur ce serveur ftp, -\begin_inset CommandInset href -LatexCommand href -name "KAME / Misc" -target "ftp://ftp.kame.net/pub/kame/misc/" - -\end_inset - -. -\end_layout - -\begin_layout Subsection -A l'écoute sur les adresses IPv6 -\end_layout - -\begin_layout Standard -Note: Les hôtes virtuels sur adresses IPv6 ne fonctionnent pas pour les - versions inférieures à la 2.0.28 (un patch est disponible pour la 2.0.28). - Mais en tout premier lieu, récupérez toujours la dernière version disponible, - parce que les premières versions ont des problèmes de sécurité. -\end_layout - -\begin_layout Subsubsection -Un hôte virtuel écoute sur une adresse IPv6 uniquement -\end_layout - -\begin_layout Code - -Listen [3ffe:ffff:100::1]:80 -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Code - - ServerName ipv6seul.votredomaine.votretld -\end_layout - -\begin_layout Code - - # certainement des lignes de configuration en plus... -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Subsubsection -Un hôte virtuel écoute sur une adresse IPv6 et sur une adresse IPv4 -\end_layout - -\begin_layout Code - -Listen [3ffe:ffff:100::2]:80 -\end_layout - -\begin_layout Code - -Listen 1.2.3.4:80 -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Code - - ServerName ipv6etipv4.votredomaine.votretld -\end_layout - -\begin_layout Code - - # certainement des lignes de configuration en plus... -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Standard -Il devrait en résulter après redémarrage -\end_layout - -\begin_layout Code - -# netstat -lnptu | grep "httpd2 -\backslash -W*$" -\end_layout - -\begin_layout Code - -tcp 0 0 1.2.3.4:80 0.0.0.0:* LISTEN 12345/httpd2 -\end_layout - -\begin_layout Code - -tcp 0 0 3ffe:ffff:100::1:80 :::* LISTEN 12345/httpd2 -\end_layout - -\begin_layout Code - -tcp 0 0 3ffe:ffff:100::2:80 :::* LISTEN 12345/httpd2 -\end_layout - -\begin_layout Standard -Pour de simples tests, utiliser l'exemple telnet déjà montré. -\end_layout - -\begin_layout Subsubsection -Note additionnelle -\end_layout - -\begin_layout Itemize -D'une part, Apache2 supporte une méthode appelée -\begin_inset Quotes sld -\end_inset - -sendfile -\begin_inset Quotes srd -\end_inset - -, accélérant la fourniture des données. - D'autre part, certains pilotes de NIC supportent la vérification différée - des sommes de contrôle ( -\emph on -offline checksumming -\emph default -). - Dans certains cas, cela peut conduire à des problèmes de connexion et invalider - les sommes de contrôle TCP. - Il faut alors rendre indisponible -\begin_inset Quotes sld -\end_inset - -sendfile -\begin_inset Quotes srd -\end_inset - -, ou bien en recompilant par l'utilisation de l'option de configure -\begin_inset Quotes sld -\end_inset - ---without-sendfile -\begin_inset Quotes srd -\end_inset - -, ou bien en utilisant la directive du fichier de configuration "EnableSendfile - off". -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-radvd" - -\end_inset - -Le Démon d'Annonce de Routeur (radvd) -\end_layout - -\begin_layout Standard -Le Démon d'Annonce de Routeur est très utile sur un LAN, à partir du moment - où les clients doivent être auto-configurés. - Le démon lui-même doit tourner sur la passerelle par défaut IPv6 Linux - (il n'est pas requis qu'elle soit aussi la passerelle IPv4, aussi prenez - garde à qui émet des annonces de routeur sur votre LAN). -\end_layout - -\begin_layout Standard -Vous avez à spécifier certaines informations et drapeaux qui doivent être - compris dans l'annonce. - Les plus employés sont -\end_layout - -\begin_layout Itemize -Le préfixe (nécessaire) -\end_layout - -\begin_layout Itemize -La durée de vie du préfixe -\end_layout - -\begin_layout Itemize -La fréquence des envois d'annonce (optionnelle) -\end_layout - -\begin_layout Standard -Après une configuration convenable, le démon émet des annonces au travers - des interfaces spécifiées, dans l'espoir que les clients les reçoivent - et auto-configurent comme par magie leurs adresses avec le préfixe reçu - et le routeur par défaut. -\end_layout - -\begin_layout Subsection -Configurer radvd -\end_layout - -\begin_layout Subsubsection -Configuration simple -\end_layout - -\begin_layout Standard -Le fichier de configuration de radvd est généralement /etc/radvd.conf. - Un exemple simple ressemble à ce qui suit: -\end_layout - -\begin_layout Code - -interface eth0 { -\end_layout - -\begin_layout Code - - AdvSendAdvert on; -\end_layout - -\begin_layout Code - - MinRtrAdvInterval 3; -\end_layout - -\begin_layout Code - - MaxRtrAdvInterval 10; -\end_layout - -\begin_layout Code - - prefix 3ffe:ffff:0100:f101::/64 { -\end_layout - -\begin_layout Code - - AdvOnLink on; -\end_layout - -\begin_layout Code - - AdvAutonomous on; -\end_layout - -\begin_layout Code - - AdvRouterAddr on; -\end_layout - -\begin_layout Code - - }; -\end_layout - -\begin_layout Code - -}; -\end_layout - -\begin_layout Standard -Ce qui a pour résultat côté client -\end_layout - -\begin_layout Code - -# /sbin/ip -6 addr show eth0 -\end_layout - -\begin_layout Code - -3: eth0: mtu 1500 qdisc pfifo_fast qlen 100 -\end_layout - -\begin_layout Code - - inet6 3ffe:ffff:100:f101:2e0:12ff:fe34:1234/64 scope global dynamic - -\end_layout - -\begin_layout Code - - valid_lft 2591992sec preferred_lft 604792sec -\end_layout - -\begin_layout Code - - inet6 fe80::2e0:12ff:fe34:1234/10 scope link -\end_layout - -\begin_layout Standard -Parce qu'aucune limite de vie n'a été définie, une très grande valeur est - utilisée. -\end_layout - -\begin_layout Subsubsection -Configuration spéciale 6to4 -\end_layout - -\begin_layout Standard -Les versions à partir de la 0.6.2pl3 supportent la (ré)génération des préfixes - dépendant d'une adresse IPv4 propre à une interface spécifique. - Ceci peut être utilisé afin de distribuer les annonces dans un LAN après - que le tunnelage 6to4 ait changé. - Surtout employé derrière un routeur de connexion dynamique à la demande - ( -\emph on -dial-on-demand -\emph default -). - Avec l'assurance d'un temps de vie très bref pour un tel préfixe (après - chaque reconnexion -\emph on -, dial-up -\emph default -, un autre préfixe est valide), la durée de vie est configurée aux valeurs - minimales: -\end_layout - -\begin_layout Code - -interface eth0 { -\end_layout - -\begin_layout Code - - AdvSendAdvert on; -\end_layout - -\begin_layout Code - - MinRtrAdvInterval 3; -\end_layout - -\begin_layout Code - - MaxRtrAdvInterval 10; -\end_layout - -\begin_layout Code - - prefix 0:0:0:f101::/64 { -\end_layout - -\begin_layout Code - - AdvOnLink off; -\end_layout - -\begin_layout Code - - AdvAutonomous on; -\end_layout - -\begin_layout Code - - AdvRouterAddr on; -\end_layout - -\begin_layout Code - - Base6to4Interface ppp0; -\end_layout - -\begin_layout Code - - AdvPreferredLifetime 20; -\end_layout - -\begin_layout Code - - AdvValidLifetime 30; -\end_layout - -\begin_layout Code - - }; -\end_layout - -\begin_layout Code - -}; -\end_layout - -\begin_layout Standard -Il en résulte pour le client situé à l'intérieur (en considérant que ppp0 - a actuellement 1.2.3.4 comme adresse IPv4 locale): -\end_layout - -\begin_layout Code - -# /sbin/ip -6 addr show eth0 -\end_layout - -\begin_layout Code - -3: eth0: mtu 1500 qdisc pfifo_fast qlen 100 -\end_layout - -\begin_layout Code - - inet6 2002:0102:0304:f101:2e0:12ff:fe34:1234/64 scope global dynamic - -\end_layout - -\begin_layout Code - - valid_lft 22sec preferred_lft 12sec -\end_layout - -\begin_layout Code - - inet6 fe80::2e0:12ff:fe34:1234/10 scope link -\end_layout - -\begin_layout Standard -Parce qu'un bref temps de vie a été défini, un tel préfixe sera rapidement - jeté si aucune annonce s'y rapportant n'est reçue. -\end_layout - -\begin_layout Standard -Note additionnelle: si vous n'utilisez pas de support spécifique 6to4 dans - les scripts d'initialisation, vous avez à mettre en place une route spécifique - sur l'interface interne du routeur, sinon vous aurez des problèmes de routage - retour. - En ce qui concerne l'exemple ci-après: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route add 2002:0102:0304:f101::/64 dev eth0 metric 1 -\end_layout - -\begin_layout Standard -Cette route a besoin d'être remplacée chaque fois que le préfixe change, - ce qui est le cas à chaque fois qu'une nouvelle adresse IPv4 est assignée - à une interface numérotée automatiquement ( -\emph on -dial-up interface -\emph default -). -\end_layout - -\begin_layout Subsection -Le déboguage -\end_layout - -\begin_layout Standard -Un programme appelé -\begin_inset Quotes sld -\end_inset - -radvdump -\begin_inset Quotes srd -\end_inset - - peut vous aider à observer les annonces émises ou reçues. - Simple à utiliser: -\end_layout - -\begin_layout Code - -# radvdump -\end_layout - -\begin_layout Code - -Router advertisement from fe80::280:c8ff:feb9:cef9 (hoplimit 255) -\end_layout - -\begin_layout Code - - AdvCurHopLimit: 64 -\end_layout - -\begin_layout Code - - AdvManagedFlag: off -\end_layout - -\begin_layout Code - - AdvOtherConfigFlag: off -\end_layout - -\begin_layout Code - - AdvHomeAgentFlag: off -\end_layout - -\begin_layout Code - - AdvReachableTime: 0 -\end_layout - -\begin_layout Code - - AdvRetransTimer: 0 -\end_layout - -\begin_layout Code - - Prefix 2002:0102:0304:f101::/64 -\end_layout - -\begin_layout Code - - AdvValidLifetime: 30 -\end_layout - -\begin_layout Code - - AdvPreferredLifetime: 20 -\end_layout - -\begin_layout Code - - AdvOnLink: off -\end_layout - -\begin_layout Code - - AdvAutonomous: on -\end_layout - -\begin_layout Code - - AdvRouterAddr: on -\end_layout - -\begin_layout Code - - Prefix 3ffe:ffff:100:f101::/64 -\end_layout - -\begin_layout Code - - AdvValidLifetime: 2592000 -\end_layout - -\begin_layout Code - - AdvPreferredLifetime: 604800 -\end_layout - -\begin_layout Code - - AdvOnLink: on -\end_layout - -\begin_layout Code - - AdvAutonomous: on -\end_layout - -\begin_layout Code - - AdvRouterAddr: on -\end_layout - -\begin_layout Code - - AdvSourceLLAddress: 00 80 12 34 56 78 -\end_layout - -\begin_layout Standard -Cette sortie vous montre que chaque paquetage d'annonce se présente dans - un format lisible. - Vous devriez voir à nouveau ici vos valeurs configurées, sinon, ce n'est - peut-être pas votre radvd qui émet l'annonce... - vérifiez s'il n'y a pas un autre routeur sur le lien (pour traquer ce routeur, - prenez l'adresse LL, AdvSourceLLAddress, qui est son adresse MAC). -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-dhcpv6" - -\end_inset - - Le serveur de Configuration Dynamique d'Hôte v6 (dhcp6s) -\end_layout - -\begin_layout Standard -DHCPv6 peut être utilisé pour réaliser des configurations avec état. - Le démon par lui-même n'a pas nécessairement à tourner sur la passerelle - routeur Linux par défaut. -\end_layout - -\begin_layout Standard -Vous pouvez spécifier plus d'information qu'avec radvd. - Il est plus similaire à un serveur DHCP IPv4. -\end_layout - -\begin_layout Standard -Après une configuration correcte, le démon réagit lors de la réception de - paquets multicast envoyés par un client à l'adresse ff02::16. -\end_layout - -\begin_layout Subsection -La configuration du serveur DHCPv6 (dhcp6s) -\end_layout - -\begin_layout Subsubsection -Une configuration simple -\end_layout - -\begin_layout Standard -Le fichier de configuration de dhcp6s est normalement /etc/dhcp6s.conf. - Un exemple simple ressemble à ce qui suit: -\end_layout - -\begin_layout Code - -interface eth0 { -\end_layout - -\begin_layout Code - - server-preference 255; -\end_layout - -\begin_layout Code - - renew-time 60; -\end_layout - -\begin_layout Code - - rebind-time 90; -\end_layout - -\begin_layout Code - - prefer-life-time 130; -\end_layout - -\begin_layout Code - - valid-life-time 200; -\end_layout - -\begin_layout Code - - allow rapid-commit; -\end_layout - -\begin_layout Code - - option dns_servers 2001:db8:0:f101::1 sub.domain.example; -\end_layout - -\begin_layout Code - - link AAA { -\end_layout - -\begin_layout Code - - range 2001:db8:0:f101::1000 to 2001:db8:0:f101::ffff/64; -\end_layout - -\begin_layout Code - - prefix 2001:db8:0:f101::/64; -\end_layout - -\begin_layout Code - - }; -\end_layout - -\begin_layout Code - -}; -\end_layout - -\begin_layout Subsection -La configuration du client DHCPv6 (dhcp6c) -\end_layout - -\begin_layout Subsubsection -Une configuration simple -\end_layout - -\begin_layout Standard -Le fichier de configuration de dhcp6c est normalement /etc/dhcp6c.conf. - Un exemple simple ressemble à ce qui suit: -\end_layout - -\begin_layout Code - -interface eth0 { -\end_layout - -\begin_layout Code - - send rapid-commit; -\end_layout - -\begin_layout Code - - request domain-name-servers; -\end_layout - -\begin_layout Code - -}; -\end_layout - -\begin_layout Subsection -Usage -\end_layout - -\begin_layout Subsubsection -dhcpv6_server -\end_layout - -\begin_layout Standard -Démarrage du serveur, -\end_layout - -\begin_layout Code - -# service dhcp6s start -\end_layout - -\begin_layout Subsubsection -dhcpv6_client -\end_layout - -\begin_layout Standard -Démarrage du client en premier plan, -\end_layout - -\begin_layout Code - -# dhcp6c -f eth0 -\end_layout - -\begin_layout Subsection -Déboguage -\end_layout - -\begin_layout Subsubsection -dhcpv6_server -\end_layout - -\begin_layout Standard -Le serveur a un drapeau pour passer en premier plan et deux pour le déboguage - (tout deux devraient être utilisés pour le déboguage). - Voici un exemple: -\end_layout - -\begin_layout Code - -# dhcp6c -d -D -f eth0 -\end_layout - -\begin_layout Subsubsection -dhcpv6_client -\end_layout - -\begin_layout Standard -Le client a un drapeau pour passer en premier plan et deux pour le déboguage. - Voici un exemple: -\end_layout - -\begin_layout Code - - # dhcp6c -d -f eth0 -\end_layout - -\begin_layout Code - - Oct/03/2005 17:18:16 dhcpv6 doesn't support hardware type 776 -\end_layout - -\begin_layout Code - - Oct/03/2005 17:18:16 doesn't support sit0 address family 0 -\end_layout - -\begin_layout Code - - Oct/03/2005 17:18:16 netlink_recv_rtgenmsg error -\end_layout - -\begin_layout Code - - Oct/03/2005 17:18:16 netlink_recv_rtgenmsg error -\end_layout - -\begin_layout Code - - Oct/03/2005 17:18:17 status code for this address is: success -\end_layout - -\begin_layout Code - - Oct/03/2005 17:18:17 status code: success -\end_layout - -\begin_layout Code - - Oct/03/2005 17:18:17 netlink_recv_rtgenmsg error -\end_layout - -\begin_layout Code - - Oct/03/2005 17:18:17 netlink_recv_rtgenmsg error -\end_layout - -\begin_layout Code - - Oct/03/2005 17:18:17 assigned address 2001:db8:0:f101::1002 prefix len - isnot in any RAs prefix length using 64 bit instead -\end_layout - -\begin_layout Code - - Oct/03/2005 17:18:17 renew time 60, rebind time 9 -\end_layout - -\begin_layout Standard -Notez que les messages d'erreur n'ont aucun impact. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-tcpwrapper" - -\end_inset - -tcp_wrapper -\end_layout - -\begin_layout Standard -tcp_wrapper est une bibliothèque qui peut vous aider à protéger vos services - contre les usages abusifs. -\end_layout - -\begin_layout Subsection -Les capacités de filtrage -\end_layout - -\begin_layout Standard -Vous pouvez utiliser tcp_wrapper pour -\end_layout - -\begin_layout Itemize -Le filtrage à partir des adresses source (IPv4 ou IPv6) -\end_layout - -\begin_layout Itemize -Le filtrage des utilisateurs (réclame un démon ident en état de fonctionnement - sur le client) -\end_layout - -\begin_layout Subsection -Les programmes utilisant tcp_wrapper -\end_layout - -\begin_layout Standard -Les suivants sont connus: -\end_layout - -\begin_layout Itemize -Chaque service appelé par xinetd (si xinetd est compilé en utilisant la - bibliothèque tcp_wrapper) -\end_layout - -\begin_layout Itemize -sshd (si compilé en utilisant tcp_wrapper) -\end_layout - -\begin_layout Subsection -Utilisation -\end_layout - -\begin_layout Standard -tcp_wrapper est contrôlé par deux fichiers nommés /etc/hosts.allow et /etc/hosts.d -eny. - Pour plus d'information voir -\end_layout - -\begin_layout Code - -$ man hosts.allow -\end_layout - -\begin_layout Subsubsection -Exemple de fichier /etc/hosts.allow -\end_layout - -\begin_layout Standard -Dans ce fichier, chaque service qui doit être positivement filtré ( -\emph on -i.e., -\emph default - dont les connexions doivent être acceptées) a besoin d'une ligne. -\end_layout - -\begin_layout Code - -sshd: 1.2.3. - [3ffe:ffff:100:200::]/64 -\end_layout - -\begin_layout Code - -daytime-stream: 1.2.3. - [3ffe:ffff:100:200::]/64 -\end_layout - -\begin_layout Standard -Note: ils existent des implémentations cassées qui utilisent la mauvaise - description réseau IPv6 suivante: [3ffe:ffff:100:200::/64]. -\end_layout - -\begin_layout Standard -Heureusement, de telles versions seront rapidement corrigées. -\end_layout - -\begin_layout Subsubsection -Exemple de fichier /etc/hosts.deny -\end_layout - -\begin_layout Standard -Ce fichier contient toutes les entrées de filtre négative et devrait dénier - l'accès à tout le reste en utilisant -\end_layout - -\begin_layout Code - -ALL: ALL -\end_layout - -\begin_layout Standard -Si ce noeud est très sensible, vous pouvez remplacer la ligne stantard ci-dessus - par celle-ci, mais cela peut être cause d'attaque DoS (charge de serveur - de courrier et répertoire spool), si trop de connexions sont réalisées - en un temps très bref. - Peut-être un observateur de journaux ( -\emph on -a logwatch -\emph default -) serait-il meilleur dans de tels cas. -\end_layout - -\begin_layout Code - -ALL: ALL: spawn (echo "Attempt from %h %a to %d at `date`" -\end_layout - -\begin_layout Code - - | tee -a /var/log/tcp.deny.log | mail root@localhost) -\end_layout - -\begin_layout Subsection -La journalisation -\end_layout - -\begin_layout Standard -Selon l'entrée du fichier de configuration du démon syslog /etc/syslog.conf, - la journalisation de tcp_wrapper se fait normalement dans /var/log/secure. -\end_layout - -\begin_layout Subsubsection -Connexion refusée -\end_layout - -\begin_layout Standard -Une connexion refusée -\emph on -via -\emph default - IPv4 au service daytime, couvert par xinetd, produit des lignes telles - que celles de l'exemple suivant -\end_layout - -\begin_layout Code - -Jan 2 20:40:44 gate xinetd-ipv6[12346]: FAIL: daytime-stream libwrap -\end_layout - -\begin_layout Code - -¬ from=::ffff:1.2.3.4 -\end_layout - -\begin_layout Code - -Jan 2 20:32:06 gate xinetd-ipv6[12346]: FAIL: daytime-stream libwrap -\end_layout - -\begin_layout Code - - from=3ffe:ffff:100:200::212:34ff:fe12:3456 -\end_layout - -\begin_layout Standard -Une connexion refusée -\emph on -via -\emph default -IPv4 à sshd en double écoute produit des lignes telles que celles de l'exemple - suivant -\end_layout - -\begin_layout Code - -Jan 2 20:24:17 gate sshd[12345]: refused connect from ::ffff:1.2.3.4 -\end_layout - -\begin_layout Code - -¬ (::ffff:1.2.3.4) -\end_layout - -\begin_layout Code - -Jan 2 20:39:33 gate sshd[12345]: refused connect -\end_layout - -\begin_layout Code - - from 3ffe:ffff:100:200::212:34ff:fe12:3456 -\end_layout - -\begin_layout Code - -¬ (3ffe:ffff:100:200::212:34ff:fe12:3456) -\end_layout - -\begin_layout Subsubsection -Connexion autorisée -\end_layout - -\begin_layout Standard -Une connexion autorisée -\emph on -via -\emph default - IPv4 vers le service daytime, couvert par xinetd, produit des lignes telles - que celles de l'exemple suivant -\end_layout - -\begin_layout Code - -Jan 2 20:37:50 gate xinetd-ipv6[12346]: START: daytime-stream pid=0 -\end_layout - -\begin_layout Code - -¬ from=::ffff:1.2.3.4 -\end_layout - -\begin_layout Code - -Jan 2 20:37:56 gate xinetd-ipv6[12346]: START: daytime-stream pid=0 -\end_layout - -\begin_layout Code - - from=3ffe:ffff:100:200::212:34ff:fe12:3456 -\end_layout - -\begin_layout Standard -Une connexion autorisée -\emph on -via -\emph default - IPv4 vers sshd en double écoute produit des lignes telles que celles de - l'exemple suivant -\end_layout - -\begin_layout Code - -Jan 2 20:43:10 gate sshd[21975]: Accepted password for user from ::ffff:1.2.3.4 -\end_layout - -\begin_layout Code - -¬ port 33381 ssh2 -\end_layout - -\begin_layout Code - -Jan 2 20:42:19 gate sshd[12345]: Accepted password for user -\end_layout - -\begin_layout Code - - from 3ffe:ffff:100:200::212:34ff:fe12:3456 port 33380 ssh2 -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-vsftpd" - -\end_inset - -vsftpd -\end_layout - -\begin_layout Subsection -A l'écoute des adresses IPv6 -\end_layout - -\begin_layout Standard -Editer le fichier de configuration, couramment /etc/vsftpd/vsftpd.conf, et - ajuster l'option -\begin_inset Quotes sld -\end_inset - -listen -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Code - -listen_ipv6=yes -\end_layout - -\begin_layout Standard -C'est tout. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-proftpd" - -\end_inset - - proftpd -\end_layout - -\begin_layout Subsection -A l'écoute des adresses IPv6 -\end_layout - -\begin_layout Standard -Editer le fichier de configuration, couramment /etc/proftpd.conf, mais prenez - garde, tout n'est pas tout à fait logique dans la mise en place des hôtes - virtuels -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Code - - ... -\end_layout - -\begin_layout Code - - Bind 2001:0DB8::1 -\end_layout - -\begin_layout Code - - ... -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Standard -C'est tout. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-others" - -\end_inset - -Autres démons -\end_layout - -\begin_layout Standard -De nos jours c'est généralement simple, cherchez une ligne de commande d'option - ou bien une valeur de configuration pour rendre disponible l'écoute IPv6. - Cherchez dans la page du manuel du démon ou dans les FAQ concernées. - Il peut arriver que vous ne puissiez lier le démon qu'à une adresse IPv6 - -\begin_inset Quotes sld -\end_inset - -any -\begin_inset Quotes srd -\end_inset - - (::) et pas à une adresse IPv6 précise, par manque de support (ça dépend - de la façon dont le développeur à implémenter...). -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-programming-using-API" - -\end_inset - -Programmer (en utilisant l'API) -\end_layout - -\begin_layout Standard -Je n'ai aucune expérience de la programmation IPv6, peut-être que ce chapitre - sera rempli par d'autres, ou déplacé vers un autre HOWTO -\end_layout - -\begin_layout Standard -Plus d'information peut être trouvée ici: -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "RFC 2553 / Basic Socket Interface Extensions for IPv6" -target "http://www.faqs.org/rfcs/rfc2553.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Draft / Advanced Sockets API for IPv6 / draft-ietf-ipngwg-rfc2292bis-XY.txt" -target "http://www.ietf.org/internet-drafts/" - -\end_inset - - -\end_layout - -\begin_layout Standard - -\lang ngerman -\begin_inset CommandInset href -LatexCommand href -name "Porting applications to IPv6 HowTo" -target "http://jungla.dit.upm.es/~ecastro/IPv6-web/" - -\end_inset - - by Eva M. - Castro -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-interoperability" - -\end_inset - -L'interopérabilité -\end_layout - -\begin_layout Standard -Il y a à travers le monde quelques projets qui vérifient l'interopérabilité - des différents systèmes d'exploitation vis-à-vis de l'implémentation des - fonctionnalités d'IPv6: Voici un URL: -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Le projet TAHI" -target "http://www.tahi.org/" - -\end_inset - - -\end_layout - -\begin_layout Standard -D'autres arriveront prochainement... -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-information" - -\end_inset - -Plus d'information et d'URL -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "information-books" - -\end_inset - -Livres en édition papier, articles, revues en ligne (mélangés) -\end_layout - -\begin_layout Subsection -Livres édités (en anglais) -\end_layout - -\begin_layout Subsubsection -Cisco -\end_layout - -\begin_layout Itemize -Cisco Self-Study: -\begin_inset CommandInset href -LatexCommand href -name "Implementing IPv6 Networks (IPV6)" -target "http://www.amazon.com/exec/obidos/tg/detail/-/1587050862/copernicshopper/103-1420916-1341420" - -\end_inset - -, par Regis Desmeules. - Cisco Press; ISBN 1587050862; 500 pages; 1ère édition (11 avril 11 2003). -\begin_inset Newline newline -\end_inset - -Note: cet ouvrage sera publié le 11 avril 2003. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Configuring IPv6 with Cisco IOS" -target "http://www.amazon.com/exec/obidos/tg/detail/-/1928994849/copernicshopper/103-1420916-1341420" - -\end_inset - -, par Sam Brown, Sam Browne, Neal Chen, Robbie Harrell, Edgar, Jr. - Parenti (Editeur), Eric Knipp (Editeur), Paul Fong (Editeur) 362 pages; - Syngress Media Inc; ISBN 1928994849; (12 juillet 2002). -\end_layout - -\begin_layout Subsubsection -Généraux -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Essentials" -target "http://www.sunny.ch/publications/f_ipv6.htm" - -\end_inset - - par Silvia Hagen, juillet 2002, O'Reilly, -\begin_inset CommandInset href -LatexCommand href -name "référence pour la commande: 1258" -target "http://www.oreilly.com/catalog/ipv6ess/" - -\end_inset - -, ISBN 0-5960-0125-8, 352 pages. -\begin_inset Newline newline -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name "Table des matières, index, exemple de chapitre, etc." -target "http://www.oreilly.com/catalog/ipv6ess/" - -\end_inset - -; -\begin_inset CommandInset href -LatexCommand href -name "Les derniers livres sortis chez O'Reilly" -target "http://press.oreilly.com/ipv6ess.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -IPv6: The New Internet Protocol. - Par Christian Huitema; Publié chez Prentice-Hall; ISBN 0138505055. - -\begin_inset Newline newline -\end_inset - -Description: Ce livre, écrit par Christian Huitema - membre du Comité Architectu -re Internet ( -\emph on -Internet Architecture Board -\emph default -, ou IAB), offre une excellente description d'IPv6, de ses différences d'avec - IPv4, du comment et du pourquoi de son développement. -\begin_inset Newline newline -\end_inset - -Source: -\begin_inset CommandInset href -LatexCommand href -name "http://www.cs.uu.nl/wais/html/na-dir/internet/tcp-ip/resource-list.html" -target "http://www.cs.uu.nl/wais/html/na-dir/internet/tcp-ip/resource-list.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Networks" -target "http://www.epinions.com/book_mu-3402412/display_~full_specs" - -\end_inset - - par Niles, Kitty; (ISBN 0070248079); 550 pages; Date de publication 05/01/1998. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Implementing IPV6. Supporting the Next Generation Internet Protocols" -target "http://www.amazon.com/exec/obidos/tg/detail/-/0764545892/copernicshopper/103-1420916-1341420" - -\end_inset - - par P. - E. - Miller, Mark A. - Miller; éd. - John Wiley & Sons; ISBN 0764545892; 2ème édition (15 mars 2000); 402 pages. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Big Book of Ipv6 Addressing Rfcs" -target "http://www.amazon.com/exec/obidos/tg/detail/-/0126167702/copernicshopper/103-1420916-1341420" - -\end_inset - - par Peter H. - Salus (compilateur), Morgan Kaufmann Publishers, avril 2000, 450 pages, - ISBN 0126167702. - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Understanding IPV6" -target "http://www.epinions.com/book_mu-3922588/display_~full_specs" - -\end_inset - - par Davies, Joseph; ISBN 0735612455; Date de publication 01/05/2001; 350 - pages. -\begin_inset Newline newline -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name "Understanding IPV6" -target "http://www.microsoft.com/MSPress/books/4883.asp" - -\end_inset - - par Davies, Joseph; ISBN 0735612455; Date de publication 11/13/2002; 544 - pages. - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Migrating to IPv6 - IPv6 in Practice" -target "http://www.amazon.com/exec/obidos/tg/detail/-/0471498920/copernicshopper/103-1420916-1341420" - -\end_inset - -. - par Marc Blanchet; éd. - John Wiley & Sons; ISBN 0471498920; 1ère édition (novembre 2002); 368 pages. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Ipv6 Network Programming" -target "http://www.amazon.com/exec/obidos/ASIN/1555583180/" - -\end_inset - - par Jun-ichiro Hagino; ISBN 1555583180 -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Wireless boosting IPv6" -target "http://www.nwfusion.com/news/2000/1023ipv6.html" - -\end_inset - - par Carolyn Duffy Marsan, 23/10/2000. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "la recherche avec le mot clé IPv6 sur O'reilly réseau" -target "http://www.oreillynet.com/search/index.ncsp?sp-q=IPv6" - -\end_inset - - donne 29 résultats (au 28 Janvier 2002). -\end_layout - -\begin_layout Subsection -Livres édités (en allemand) -\end_layout - -\begin_layout Itemize -Technik der IP-Netze (TCP/IP incl. - IPv6) -\begin_inset CommandInset href -LatexCommand href -name "bei Amazon.de" -target "http://www.amazon.de/exec/obidos/ASIN/3446215018/" - -\end_inset - - -\begin_inset Newline newline -\end_inset - -Anatol Badach, Erwin Hoffmann -\begin_inset Newline newline -\end_inset - -Carl Hanser Verlag München, Wien, 2001 ISBN 3-446-21501-8 -\begin_inset Newline newline -\end_inset - -Kap. - 6: Protokoll IPv6 S.205-242 -\begin_inset Newline newline -\end_inset - -Kap. - 7: Plug&Play-Unterstützung bei IPv6 S.243-276 -\begin_inset Newline newline -\end_inset - -Kap. - 8: Migration zum IPv6-Einsatz S.277-294 -\begin_inset Newline newline -\end_inset - -Kap. - 9.3.4: RIP für das Protokoll IPv6 (RIPng) S.349-351 -\begin_inset Newline newline -\end_inset - -Kap. - 9.4.6: OSPF für IPv6 S.384-385 -\begin_inset Newline newline -\end_inset - -Kommentar: tw. - nicht ganz up-to-date bzw. - nicht ganz fehlerfreie Abbildungen -\begin_inset Newline newline -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name "Homepage des Buches und Tabelle mit Fixes" -target "http://www.fehcom.de/tipn/tipn.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Internet-Sicherheit (Browser, Firewalls und Verschlüsselung) -\begin_inset CommandInset href -LatexCommand href -name "bei Amazon.de" -target "http://www.amazon.de/exec/obidos/ASIN/3446217258/" - -\end_inset - - -\begin_inset Newline newline -\end_inset - -Kai Fuhrberg -\begin_inset Newline newline -\end_inset - -2. - akt. - Auflage 2000 Carl Hanser Verlag München, Wien, ISBN 3-446-21333-3 -\begin_inset Newline newline -\end_inset - -Kap.2.3.1.4. - IPv6 S.18-22 -\begin_inset Newline newline -\end_inset - -Kurz angerissen werden: RFC 1825 - Security Association Konzept RFC1826 - - IP authentication Header RFC 1827 - IP Encapsulation Security Payload -\end_layout - -\begin_layout Itemize -IPv6. - Das neue Internet- Protokoll. - Technik, Anwendung, Migration -\begin_inset CommandInset href -LatexCommand href -name "bei Amazon" -target "http://www.amazon.de/exec/obidos/ASIN/389864149X" - -\end_inset - - -\begin_inset Newline newline -\end_inset - -Hans Peter Dittler -\begin_inset Newline newline -\end_inset - -2. - akt. - und erweiterte Auflage 2002 dpunkt.verlag, ISBN 3-89864-149-X -\end_layout - -\begin_layout Itemize -Das neue Internetprotokoll IPv6 -\begin_inset CommandInset href -LatexCommand href -name "bei Amazon" -target "http://www.amazon.de/exec/obidos/ASIN/3446216855" - -\end_inset - - -\begin_inset Newline newline -\end_inset - -Herbert Wiese -\begin_inset Newline newline -\end_inset - -2002 Carl Hanser Verlag, ISBN 3446216855 -\end_layout - -\begin_layout Subsection -Articles, livres électroniques, revues en ligne (mélangés) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Getting Connected with 6to4" -target "http://www.onlamp.com/pub/a/onlamp/2001/06/01/ipv6_tutorial.html" - -\end_inset - - par Huber Feyrer, 01/06/2001 -\end_layout - -\begin_layout Itemize -Transient Addressing for Related Processes: Improved Firewalling by Using - IPv6 and Multiple Addresses per Host; écrit par Peter M. - Gleiz, Steven M. - Bellovin ( -\begin_inset CommandInset href -LatexCommand href -name "version PDF pour PC" -target "http://www.securiteinfo.com/ebooks/pdf/tarp.pdf" - -\end_inset - -; -\begin_inset CommandInset href -LatexCommand href -name "version PDF pour Palm" -target "http://www.securiteinfo.com/ebooks/palm/tarp.pdf" - -\end_inset - -; -\begin_inset CommandInset href -LatexCommand href -name "version PDB" -target "http://www.securiteinfo.com/ebooks/pdb/tarp.pdb" - -\end_inset - -) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6, théorie et pratique" -target "http://www.oreilly.fr/catalogue/ipv6-3ed.html" - -\end_inset - - (en français) 3ème édition, mars 2002, O'Reilly, ISBN 2-84177-139-3 -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPSec" -target "http://www.securiteinfo.com/crypto/IPSec.shtml" - -\end_inset - - (en langue française) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Internetworking IPv6 with Cisco Routers" -target "http://www.ip6.com/index.html" - -\end_inset - - par Silvano Gai, McGrawHill Italia, 1997. - Le chapitre 13 et les appendices A-D sont téléchargables au format PDF. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Secure and Dynamic Tunnel Broker" -target "http://www.vermicelli.pasta.cs.uit.no/ipv6/students/vegars/" - -\end_inset - - par Vegar Skaerven Wang, thèse de maîtrise en sciences informatiques, 2 - Juin 2000, Faculté des Sciences, Département des sciences informatiques, - Université de Tromso, Norvège. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Aufbruch in die neue Welt - IPv6 in IPv4 Netzen" -target "http://www.old.netobjectdays.org/pdf/99/stja/doering.pdf" - -\end_inset - - par Dipl.Ing. - Ralf Döring, TU Illmenau, 1999 -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Migration and Co-existence of IPv4 and IPv6 in Residential Networks" -target "http://www.csc.fi/~psavola/residential.html" - -\end_inset - - par Pekka Savola, CSC/FUNET, 2002 -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "information-sciencepublication" - -\end_inset - -Publications scientifiques (résumés, bibliographies, ressources en ligne) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Plan de travail du projet IPv6 GEANT" -target "http://www.ipv6.ac.uk/gtpv6/workplan.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "A simulation study on the performance of Mobile IPv6 in a WLAN-based cellular network" -target "http://www.ingenta.com/isis/searching/ExpandSearch/ingenta?year_to=2002&year_from=1997&date_type=range&title=IPv6&title_type=tka&database=1&newMatches=false&pageStart=1&index=1" - -\end_inset - -, par Perez Costa X.; Hartenstein H. - -- Computer Networks, Septembre 2002, vol. - 40, no. - 1, pp. - 191-204(14) -- Elsevier Science. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Tests IPv6 sur le réseau universitaire britannique: Projet Bermudes 2 Août 2002" -target "http://www.ipv6.ac.uk/bermuda2/" - -\end_inset - -: Participants - Se connecter - Project deliverables - Network topology - - adresse assignments - Wireless IPv6 access - IPv6 migration - Project - presentations - Internet 2 - Other IPv6 projects - IPv6 fora and standards - Bermuda 2... -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "http://www.ipv6.ac.uk/" -target "http://www.ipv6.ac.uk/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "A scalable parallel internet router that enables the QoS through merging ATM with IPv6" -target "http://www.ingenta.com/isis/searching/ExpandSearch/ingenta?year_to=2002&year_from=1997&date_type=range&title=IPv6&title_type=tka&database=1&newMatches=false&pageStart=1&index=2" - -\end_inset - -. - par Song S. - -- Computer Communications, 1 mai 2002, vol. - 25, no. - 7, pp. - 647-651(5) -- Elsevier Science. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Linux IPv6: Which One to Deploy?" -target "http://liinwww.ira.uka.de/mpsbib?query=ti%3D(Linux+IPv6+Which+One+Deploy)" - -\end_inset - - journal Linux, Vol. - 96, p. - 86, 88-90, April 2002. - (pour plus d'information, voir aussi -\begin_inset CommandInset href -LatexCommand href -name "liinwww.ira.uka.de/ipv6" -target "http://liinwww.ira.uka.de/mpsbib?query=ipv6&maxnum=200" - -\end_inset - - ) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "An overview and analysis of mobile Internet protocols in cellular environments" -target "http://www.ingenta.com/isis/searching/ExpandSearch/ingenta?year_to=2002&year_from=1997&date_type=range&title=IPv6&title_type=tka&database=1&newMatches=false&pageStart=1&index=3" - -\end_inset - -. - Chao H-C. - -- Internet Research: Electronic Networking Applications and Policy, 24 - Octobre 2001, vol. - 11, no. - 5, pp. - 435-450(16) -- MCB University Press -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 for Future Wireless networks" -target "http://www.ingenta.com/isis/searching/ExpandSearch/ingenta?year_to=2002&year_from=1997&date_type=range&title=IPv6&title_type=tka&database=1&newMatches=false&pageStart=1&index=5" - -\end_inset - -Toftegaard Nielsen T. - -- Wireless Personal Communications, Juin 2001, vol. - 17, no. - 2/3, pp. - 237-247(11) -- éd. - Kluwer Academic, Dordrecht, Les Pays-Bas -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 at the University of Southampton" -target "http://www.ipv6.ecs.soton.ac.uk/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Seamless Support for Mobile Internet Protocol Based Cellular Environments" -target "http://www.ingenta.com/isis/searching/ExpandSearch/ingenta?year_to=2002&year_from=1997&date_type=range&title=IPv6&title_type=tka&database=1&newMatches=false&pageStart=1&index=4" - -\end_inset - -Chao H-C.; Chu Y-M. - -- International Journal of Wireless Information Networks, Juillet 2001, - vol. - 8, no. - 3, pp. - 133-153(21) -- éd. - Kluwer Academic/Plenum, New York, U.S.A. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6: The Solution for Future Universal Networks" -target "http://liinwww.ira.uka.de/cgi-bin/bibshow?e=Njtd0MODT0modt3111/vojrvf" - -\end_inset - -. - Lecture Notes in Computer Science, Vol. - 1818, p. - 82-??, 2000. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Modeling and performance analysis for IPv6 traffic with multiple QoS classes" -target "http://www.ingenta.com/isis/searching/ExpandSearch/ingenta?year_to=2002&year_from=1997&date_type=range&title=IPv6&title_type=tka&database=1&newMatches=false&pageStart=1&index=8" - -\end_inset - -. - Zhang L.; Zheng L. - -- Computer Communications, 1 octobre 2001, vol. - 24, no. - 15, pp. - 1626-1636(11) -- Elsevier Science. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Threshold-Based Registration (TBR) in Mobile IPv6" -target "http://liinwww.ira.uka.de/cgi-bin/bibshow?e=Njtd0MODT0modt3111/vojrvf" - -\end_inset - -. - Lecture Notes in Computer Science, Vol. - 1818, p. - 150-??, 2000. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Performance Analysis on FreeBSD Workstation Using Simple Applications" -target "http://liinwww.ira.uka.de/cgi-bin/bibshow?e=Njtd0MODT0modt3111/vojrvf" - -\end_inset - -. - Lecture Notes in Computer Science, Vol. - 1961, p. - 33-??, 2000. -\end_layout - -\begin_layout Itemize -Microsoft Research IPv6 Implementation (MSRIPv6): -\begin_inset CommandInset href -LatexCommand href -name "MSRIPv6 Configuring 6to4 - Connectivity with MSR IPv6 - Our 6Bone Node... " -target "http://www.research.microsoft.com/msripv6/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "New frontiers in cybersegmentation: marketing success in cyberspace depends on IP address" -target "http://www.ingenta.com/isis/searching/ExpandSearch/ingenta?year_to=2002&year_from=1997&date_type=range&title=IPv6&title_type=tka&database=1&newMatches=false&pageStart=1&index=9" - -\end_inset - -. - Louvieris P.; Driver J. - --Qualitative Market Research: An International Journal, 27 juin 2001, - vol. - 4, no. - 3, pp. - 169-181(13) -- MCB University Press. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "QoS-Conditionalized Handoff for Mobile IPv6" -target "http://liinwww.ira.uka.de/cgi-bin/bibshow?e=Njtd0MODT0modt3113c/vojrvf" - -\end_inset - -. - Notes de conférence en sciences informatiques, Vol. - 2345, p. - 721-??, 2002. -\end_layout - -\begin_layout Subsection -Autres -\end_layout - -\begin_layout Standard -Voir l'URL suivant pour en savoir plus: -\begin_inset CommandInset href -LatexCommand href -name "SWITCH Pilote IPv6 Pilot / Références" -target "http://www.switch.ch/lan/ipv6/references.html" - -\end_inset - - -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "information-conferences" - -\end_inset - -Conférences, rencontres, sommets -\end_layout - -\begin_layout Subsection -2002 -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Renater - Conférence IPv6 2002" -target "http://www.renater.fr/IPv6-2002/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Sommet déploiement IPv6 à INET 2002" -target "http://www.ipv6summit.com/" - -\end_inset - - -\end_layout - -\begin_layout Standard -Quelque chose manque? Les suggestions sont les bienvenues! -\end_layout - -\begin_layout Subsection -2003 -\end_layout - -\begin_layout Standard -Les suggestions sont les bienvenues! -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "information-onlineinformation" - -\end_inset - -L'information en ligne -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "information-joinipv6" - -\end_inset - -Rejoindre le backbone IPv6 -\end_layout - -\begin_layout Standard -A remplir plus avant et plus tard... - Les suggestions sont les bienvenues! -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-globalregistries" - -\end_inset - -Les bureaux d'enregistrement global -\end_layout - -\begin_layout Itemize -Backbone de test IPv6: -\begin_inset CommandInset href -LatexCommand href -name "6bone" -target "http://www.6bone.net/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "Comment rejoindre 6bone" -target "http://www.6bone.net/6bone_hookup.html" - -\end_inset - -, -\begin_inset Newline newline -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name "Teilnahme am 6bone" -target "http://www.join.uni-muenster.de/6bone/6bone-teilnahme.html" - -\end_inset - - (en langue allemande), -\begin_inset Newline newline -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name "La participation au 6bone" -target "http://www.join.uni-muenster.de/6bone/6bone-participation.html" - -\end_inset - - (en langue anglaise) -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-majorregionregistries" - -\end_inset - -Les centres d'enregistrement de noms de domaine les plus importants, par - régions -\end_layout - -\begin_layout Itemize -Amérique: -\begin_inset CommandInset href -LatexCommand href -name "ARIN" -target "http://www.arin.net/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "ARIN / page d'enregistement" -target "http://www.arin.net/registration/ipv6/index.html" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "ARIN / IPv6 guidelines" -target "http://www.arin.net/registration/ipv6/index.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -EMEA: -\begin_inset CommandInset href -LatexCommand href -name "Ripe NCC" -target "http://www.ripe.net/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "Ripe NCC / page d'enregistrement" -target "http://www.ripe.net/ripencc/mem-services/registration/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "Ripe NCC / IPv6 registration" -target "http://www.ripe.net/ripencc/mem-services/registration/ipv6/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Asie/Pacifique: -\begin_inset CommandInset href -LatexCommand href -name "APNIC" -target "http://www.apnic.net/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "APNIC / guide de ressources IPv6" -target "http://www.apnic.net/services/ipv6_guide.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Amérique latine et les Caraïbes: -\begin_inset CommandInset href -LatexCommand href -name "LACNIC" -target "http://lacnic.org/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "Service d'enregistrement IPv6" -target "http://lacnic.net/en/bt-IPv6.html" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "Politique d'allocation IPv6" -target "http://lacnic.net/en/chapter-4-en.pdf" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Afrique: -\begin_inset CommandInset href -LatexCommand href -name "AfriNIC" -target "http://www.afrinic.org/" - -\end_inset - - -\end_layout - -\begin_layout Standard -Il existe aussi une liste des principales allocations (préfixe de 32 bits) - par bureau d'enregistrement régional ici: -\begin_inset CommandInset href -LatexCommand href -name "Ripe NCC / allocations IPv6" -target "http://www.ripe.net/ripencc/mem-services/registration/ipv6/ipv6allocs.html" - -\end_inset - -. -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-joinipv6-tunnelbrokers" - -\end_inset - -Les fournisseurs de tunnel ( -\emph on -tunnel brokers -\emph default -) -\end_layout - -\begin_layout Standard -Note: une liste de fournisseurs de tunnel peut être trouvée plus bas dans - l' -\begin_inset CommandInset ref -LatexCommand ref -name "information concernant les fournisseurs de tunnel" -reference "information-Tunnelbroker" - -\end_inset - -. - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Code source" -target "http://www.vermicelli.pasta.cs.uit.no/ipv6/students/vegars/TunnelBroker/" - -\end_inset - - utilisé dans une thèse de maîtrise dans le cadre du projet Vermicelli au - sujet des fournisseurs de tunnels, Université de Tromso. -\end_layout - -\begin_layout Itemize -Fondation IPng. - Fournisseurs de tunnel et ressources IPv6, dorénavant migré au -\begin_inset CommandInset href -LatexCommand href -name "système SixXs" -target "http://www.sixxs.net/main/" - -\end_inset - -. -\end_layout - -\begin_layout Itemize -La page de Eckes -\begin_inset CommandInset href -LatexCommand href -name "Linux-avec-IPv6" -target "http://sites.inka.de/lina/linux/ipv6.html" - -\end_inset - -. -\end_layout - -\begin_layout Itemize -tunnelc - client de tunnelage basé sur perl: -\begin_inset Newline newline -\end_inset - -freshmeat.net: -\begin_inset CommandInset href -LatexCommand href -name "détails sur ce client de tunnelage" -target "http://freshmeat.net/projects/tunnelc" - -\end_inset - - -\begin_inset Newline newline -\end_inset - -SourceForge: -\begin_inset CommandInset href -LatexCommand href -name "Projet Info - tunnelc" -target "http://sourceforge.net/projects/tunnelc" - -\end_inset - - (aussi -\begin_inset CommandInset href -LatexCommand href -name "ici" -target "http://tunnelc.sourceforge.net/" - -\end_inset - -) -\end_layout - -\begin_layout Itemize -L'HOWTO Routage avancée Linux & contrôle du trafic, -\begin_inset CommandInset href -LatexCommand href -name "Chapitre 6: Le tunnelage IPv6 avec Cisco et/ou 6bone" -target "http://howtos.linuxbroker.com/howtoreader.shtml?file=Adv-Routing-HOWTO.html#LARTC.TUNNEL-IPV6.ADDRESSING" - -\end_inset - -. -\end_layout - -\begin_layout Standard -Voir aussi ici pour plus d'information et d'URL: -\begin_inset CommandInset href -LatexCommand href -name "ipv6-net.org" -target "http://www.ipv6-net.de/" - -\end_inset - -. -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-joinipv6-6to4-tunneling" - -\end_inset - -6to4 -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "information 6to4 de NSayer" -target "http://www.kfu.com/~nsayer/6to4/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "RFC 3068 / An Anycast Prefix for 6to4 Relay Routers" -target "http://www.faqs.org/rfcs/rfc3068.html" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-joinipv6-isatap-tunneling" - -\end_inset - -ISATAP -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "ISATAP (Intra-Site Automatic Tunnel Access Protocol) Information" -target "http://www.join.uni-muenster.de/Dokumente/Howtos/Howto_ISATAP.php?lang=en" - -\end_inset - - by -\begin_inset CommandInset href -LatexCommand href -name "JOIN" -target "http://www.join.uni-muenster.de/" - -\end_inset - - -\end_layout - -\begin_layout Subsection -Les dernières nouvelles -\end_layout - -\begin_layout Standard -A remplir plus avant et plus tard... - Les suggestions sont les bienvenues! -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "ipv6-net.org" -target "http://www.ipv6-net.de/" - -\end_inset - -, est aussi la page d'accueil du canal #IPv6 sur EFnet -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Nombreux URLs vers d'autres documents" -target "http://www.estoile.com/links/ipv6" - -\end_inset - - par Anil Edathara -\end_layout - -\begin_layout Subsection -Les références aux protocoles -\end_layout - -\begin_layout Subsubsection -Les appels à commentaires (RFC) relatifs à IPv6 -\end_layout - -\begin_layout Standard -La publication de la liste des RFC relatifs à IPv6 outrepasse la portée - de ce document, mais les URL fournis vous guiderons vers de telles listes: -\end_layout - -\begin_layout Itemize -Listes classées par -\begin_inset CommandInset href -LatexCommand href -name "Etat de la standardisation IPng" -target "http://playground.sun.com/pub/ipng/html/specs/standards.html" - -\end_inset - - ou -\begin_inset CommandInset href -LatexCommand href -name "Spécifications actuelles d'IPng" -target "http://playground.sun.com/pub/ipng/html/specs/specifications.html" - -\end_inset - - par Robert Hinden -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Spécifications relatives à IPv6" -target "http://www.ipv6.org/specs.html" - -\end_inset - - on IPv6.org -\end_layout - -\begin_layout Subsubsection -Les brouillons actuels des groupes de travail -\end_layout - -\begin_layout Standard -Les brouillons actuels concernant (aussi) IPv6 peuvent être trouvés ici: -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IP Version 6 (ipv6)" -target "http://www.ietf.org/ids.by.wg/ipv6.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Transition vers la nouvelle génération (ngtrans)" -target "http://www.ietf.org/ids.by.wg/ngtrans.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Dynamic Host Configuration (dhc)" -target "http://www.ietf.org/ids.by.wg/dhc.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Extension du Système des Noms de Domaine" -target "http://www.ietf.org/ids.by.wg/dnsext.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Mobile IP (mobileip)" -target "http://www.ietf.org/ids.by.wg/mobileip.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Obtenir toute l'information à propos d'IPv6, depuis des vues d'ensemble, en passant par les brouillons et les RFC, jusqu'aux implémentations" -target "http://playground.sun.com/pub/ipng/html/ipng-main.html" - -\end_inset - - (comprenant la disponibilité de la pile sur différentes plates-formes & - le code source de la pile IPv6) -\end_layout - -\begin_layout Subsubsection -Autres -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Network Sorcery / IPv6, Protocole Internet IP version 6" -target "http://www.networksorcery.com/enp/protocol/ipv6.htm" - -\end_inset - -, l'en-tête du protocole IPv6 -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Guide / Références IPv6 SWITCH" -target "http://www.switch.ch/lan/ipv6/references.html" - -\end_inset - -, importante liste de références IPv6, maintenue par Simon Leinen -\end_layout - -\begin_layout Subsection -Plus d'information -\end_layout - -\begin_layout Standard -A remplir plus avant et plus tard... - les suggestions sont les bienvenues! -\end_layout - -\begin_layout Standard - -\lang ngerman -\begin_inset CommandInset href -LatexCommand href -name "DeepSpace6 / plus de liens intéressants" -target "http://www.deepspace6.net/sections/links.html" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Relative à Linux -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "DeepSpace6 / Portail Linux IPv6 (pas uniquement)" -target "http://www.deepspace6.net/" - -\end_inset - - - Italie ( -\begin_inset CommandInset href -LatexCommand href -name "miroir" -target "http://mirrors.bieringer.de/www.deepspace6.net/" - -\end_inset - -) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6-HowTo pour Linux par Peter Bieringer" -target "http://www.bieringer.de/linux/IPv6/" - -\end_inset - - - Allemagne et son -\begin_inset CommandInset href -LatexCommand href -name "archive logiciel - Bieringer / IPv6" -target "ftp://ftp.bieringer.de/pub/linux/IPv6/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "L'état de Linux+IPv6 par Peter Bieringer" -target "http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status.html" - -\end_inset - - - Allemagne (en cours d'obsolescence) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "DeepSpace6 / La page concernant l'état IPv6" -target "ttp://www.deepspace6.net/docs/ipv6_status_page_apps.html" - -\end_inset - - - Italie ( -\begin_inset CommandInset href -LatexCommand href -name "mirroir" -target "http://mirrors.bieringer.de/www.deepspace6.net/docs/ipv6_status_page_apps.html" - -\end_inset - -) (remplacera la page ci-dessus) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Projet USAGI" -target "http://www.linux-ipv6.org/" - -\end_inset - - - Japon, et son -\begin_inset CommandInset href -LatexCommand href -name "archive logiciel - projet USAGI" -target "ftp://ftp.linux-ipv6.org/pub/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "HOWTO IPv6 Protocole de routage à état de lien optimisé (OLSR)" -target "http://www.tldp.org/HOWTO/OLSR-IPv6-HOWTO/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Relative à Linux, par distribution -\end_layout - -\begin_layout Description -PLD -\begin_inset CommandInset href -LatexCommand href -name "PLD Linux Distribution" -target "http://www.pld-linux.org/" - -\end_inset - - ( -\begin_inset Quotes sld -\end_inset - -leader du marché -\begin_inset Quotes srd -\end_inset - - quant aux paquetages disposant d'IPv6) -\end_layout - -\begin_layout Description -Red -\begin_inset space ~ -\end_inset - -Hat -\begin_inset CommandInset href -LatexCommand href -name "Linux Red Hat" -target "http://www.redhat.com/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name " les paquetages IPv6 de Pekka Savola (historic)" -target "http://www.netcore.fi/pekkas/linux/ipv6/" - -\end_inset - - -\end_layout - -\begin_layout Description - -\lang ngerman -Fedora -\begin_inset CommandInset href -LatexCommand href -name "Fedora (Project) Linux" -target "https://fedoraproject.org/" - -\end_inset - - -\end_layout - -\begin_layout Description -Debian -\begin_inset CommandInset href -LatexCommand href -name "Linux Debian" -target "http://www.debian.org/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "Etat et information IPv6 par Craig Small" -target "http://people.debian.org/~csmall/ipv6/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "HOWTO Connectivité globale d'un LAN IPv6" - -\end_inset - - -\end_layout - -\begin_layout Description - -\lang ngerman -SuSE -\begin_inset CommandInset href -LatexCommand href -name "SuSE Linux" -target "https://www.suse.com/" - -\end_inset - - -\end_layout - -\begin_layout Description - -\lang english -Mandriva -\begin_inset CommandInset href -LatexCommand href -name "Mandriva (Historic)" -target "http://wiht.link/mandrivalinux" - -\end_inset - - -\end_layout - -\begin_layout Standard -Pour en savoir plus voir la page -\begin_inset CommandInset href -LatexCommand href -name "état des distributions Linux+IPv6" -target "http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status-distributions.html" - -\end_inset - -. -\end_layout - -\begin_layout Subsubsection -Général -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6.org" -target "http://www.ipv6.org/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "6bone" -target "http://www.6bone.net/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Centre de ressources britanique IPv6" -target "http://www.cs-ipv6.lancs.ac.uk/" - -\end_inset - - - Royaume-Uni -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Projet WIDE" -target "http://www.v6.wide.ad.jp/" - -\end_inset - - - Japon -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "SWITCH IPv6 Pilot" -target "http://www.switch.ch/lan/ipv6/" - -\end_inset - - - Suisse -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Le coin IPv6 de Hubert Feyrer" -target "http://www.feyrer.de/IPv6/" - -\end_inset - - - Allemagne -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Projet Vermicelli" -target "http://www.vermicelli.pasta.cs.uit.no/ipv6/" - -\end_inset - - - Norvège -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Forum" -target "http://www.ipv6forum.com/" - -\end_inset - - - un consortium mondial d'importants fournisseurs Internet, Research & - Education Networks... -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Playground.sun.com / Page d'info IPv6" -target "http://playground.sun.com/pub/ipng/html/ipng-main.html" - -\end_inset - - - maintenu par Robert Hinden, Nokia. - Obtenir toute information au sujet d'IPv6, depuis de simples vues d'ensemble, - en passant par les RFC et brouillons, jusqu'aux implémentations (incluant - la disponibilité des piles sur différentes plates-formes & le code source - des piles IPv6). -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "6INIT" -target "http://www.6init.com/" - -\end_inset - - - Initiative Internet IPv6 - le 5ème programme-cadre européenne R&D de - l'IST. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Task Force (Union Européenne)" -target "http://www.ipv6-taskforce.org/" - -\end_inset - - ( -\emph on -NdT -\emph default -: -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Task Force France" -target "http://www.france.ipv6tf.org/index.php" - -\end_inset - -) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Projet de Documentation IPv6" -target "http://www.v6.sfc.wide.ad.jp/v6doc/" - -\end_inset - - (langue japonaise) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "6init" -target "http://www.6init.org/" - -\end_inset - - - IniTiative INternet IPv6 -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Vue d'ensemble d'IP Nouvelle Génération" -target "http://www.isoc.org/HMP/PAPER/PT1/html/pt1.html.hinden" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6: La nouvelle version du protocole Internet" -target "http://www.usenix.org/publications/library/proceedings/ana97/summaries/deering.html" - -\end_inset - -, par Steve Deering. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6: Le protocole Internet Nouvelle Génération" -target "http://www.garykessler.net/library/ipv6_exp.html" - -\end_inset - -, par Gary C. - Kessler. - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6: Le protocole Internet Nouvelle Génération" -target "http://www.3com.com/nsc/ipv6.html" - -\end_inset - - - 3Com -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Initiative Internet Nouvelle Génération" -target "http://www.ngi.gov/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "internet || site" -target "http://www.internet2.org/" - -\end_inset - - et -\begin_inset CommandInset href -LatexCommand href -name "Groupe de travail internet2" -target "http://ipv6.internet2.edu/" - -\end_inset - - - -\begin_inset CommandInset href -LatexCommand href -name "Presentation (HTML + PPT)" -target "http://ipv6.internet2.edu/presentations/" - -\end_inset - - de l'atelier IPv6: (auto-configuration sans état, adressage IPv6, USAGI, - fournisseur d'adressage IPv6 indépendant et autres thèmes). -\end_layout - -\begin_layout Itemize -NetworkWorldFusion: -\begin_inset CommandInset href -LatexCommand href -name "rechercher IPv6" -target "http://search.nwfusion.com/query.html?qt=IPv6&qp=&ch=cn&" - -\end_inset - - (102 documents trouvés au 22.12.2002) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "The Register" -target "http://www.theregister.co.uk/" - -\end_inset - - (la recherche pour IPv6 donne 30 documents, 22.12.2002) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "recherche chez ZDNet pour IPv6" -target "http://zdnet.search.com/search?cat=279&q=IPv6" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Recherche chez TechTarget pour IPv6" -target "http://whatis.techtarget.com/wsearchResults/1,290214,sid9,00.html?query=IPv6" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Liste de resssources IPv6 & TCP" -target "http://www.faqs.org/faqs/internet/tcp-ip/resource-list/index.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Les outils IPv6 Klingon" -target "http://ipv6.klingon.nl/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "les outils IPv6 Klingon (accessible seulement en IPv6 natif)" -target "http://www.ipv6.klingon.nl/" - -\end_inset - -: exemples de pare-feu IPv6, test de bande passante et scanner de ports -\end_layout - -\begin_layout Standard -Quelque chose manque? Les suggestions sont les bienvenues! -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-marketresearch" - -\end_inset - -Etudes de marché -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "A Tale of Two Wireless Technology Trends: Processor Development Outsourcing and IPv6" -target "http://www.seminarinformation.com/wconnect/wc.dll?sis~details0~194045~TSN" - -\end_inset - -Groupe Yankee - 1/4/2002 - 12 Pages - ID: YANL768881 -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "The World Atlas of the Internet: Americas" -target "http://www.marketresearch.com/product/display.asp?SID=88602378-241489274-186851952&ProductID=803907" - -\end_inset - -; IDATE - 2/1/2002 - 242 Pages - ID: IDT803907. - Les pays couverts: Amérique Centrale, Amérique du Nord, Amérique du Sud; - Liste: Prix: $ 3,500.00; à l'exception: Panorama du marché des accès à l'Interne -t à travers le monde. - Estimation du marché et prévions jusqu'en 2006 pour 34 pays: structure - du marché: les principaux ISP et le partage du marché; nombre de souscripteurs, - d'ISP. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Earlier Interest Rising for IPv6" -target "http://www.amazon.com/exec/obidos/tg/detail/-/B000065T8E/copernicshopper/103-1420916-1341420" - -\end_inset - - par IDC (Auteur); prix: $1,500.00; support: e-book (Acrobat Reader); éd. - IDC; ISBN B000065T8E; ( 1 mars 2002) -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-patents" - -\end_inset - -Les brevets -\end_layout - -\begin_layout Itemize -Base de données des brevets canadiens: -\begin_inset CommandInset href -LatexCommand href -name "Accueil" -target "http://patents1.ic.gc.ca/intro-e.html" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "Recherche" -target "http://patents1.ic.gc.ca/srch_sim-e.html" - -\end_inset - - (Recherche simple, entrez juste -\begin_inset Quotes sld -\end_inset - -IPv6 -\begin_inset Quotes srd -\end_inset - - dans le champs recherche ;-); 84 documents trouvés au 22.12.2002) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Espacenet" -target "http://www.european-patent-office.org/espacenet/info/index.htm" - -\end_inset - - - information sur les brevets européens: -\begin_inset Newline newline -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name "Offices nationaux, membres d'Espacenet" -target "http://www.european-patent-office.org/espacenet/info/access.htm" - -\end_inset - -(IPv6: 84 documents, au 22.12.2002) -\end_layout - -\begin_layout Itemize -Delphion: -\begin_inset CommandInset href -LatexCommand href -name "Recherche de brevets" -target "http://www.delphion.com/research/" - -\end_inset - -. - Un simple enregistrement (gratuit) est nécessaire. - Exemples trouvés au 21.12.2002 par une recherche sur l'expression IPv6: -\begin_inset Newline newline -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name "Méthode de communication entre terminal IPv4 et terminal IPv6, mécanisme de conversion IPv4-IPv6" -target "http://www.delphion.com/details?pn=US06118784__" - -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name "Traducteur pour réseaux IP, système réseau utilisant le traducteur, mais aussi une méthode de couplage de réseaux IP" -target "http://www.delphion.com/details?pn=US06038233__" - -\end_inset - - -\end_layout - -\begin_layout Subsection -Par pays -\end_layout - -\begin_layout Subsubsection -Europe -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "www.ist-ipv6.org" -target "http://www.ist-ipv6.org/" - -\end_inset - -: IST IPv6 Cluster, recherche européenne IPv6 et développement de projets -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Euro6IX" -target "http://www.euro6ix.org/" - -\end_inset - -: Backbone européenne d'interconnexion Internet IPv6 -\end_layout - -\begin_layout Subsubsection -Autriche -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6@IKNnet et le groupe de recherche MIPv6" -target "http://www.ikn.tuwien.ac.at/~ipv6/" - -\end_inset - -: Vienne , Autriche (IPv6: projets, publications, diplômes / thèses de doctorat, - actes de conférence, -\emph on -etc. -\emph default -)é -\end_layout - -\begin_layout Subsubsection -Australie -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Les pages IPv6 australiennes de Carl" -target "http://oversteer.bl.echidna.id.au/IPv6/" - -\end_inset - - (contenu ancien) -\end_layout - -\begin_layout Subsubsection -Brésil -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "BR6bone" -target "http://www.6bone.rnp.br/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Summit in Brazil" -target "http://www.ipv6summit.com.br/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "IPv6 do Brasil" -target "http://www.ipv6dobrasil.com.br/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Allemagne -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6-net.org" -target "http://www.ipv6-net.de/" - -\end_inset - -: Forum IPv6 allemand -\end_layout - -\begin_layout Subsubsection -France -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Renater" -target "http://www.renater.fr/Projets/IPv6/index.htm" - -\end_inset - -: La page d'accueil du projet IPv6 Renater -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 - RSVP - ATM à l'INRIA" -target "http://www.inria.fr/recherche/equipes/ipv6.fr.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Documentation IPv6 NetBSD IPv6" -target "http://www.netbsd.org/fr/Documentation/network/ipv6/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Hongrie -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Tester la technologie expérimentale IPv6 et ses services en Hongrie" -target "http://tipster6.ik.bme.hu/tipster6_en.html" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Japon -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Groupe d'utilisateurs IPv6 Linux JP" -target "http://www.v6.linux.or.jp/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Yamaha IPv6" -target "http://www.rtpro.yamaha.co.jp/RT/ipv6/" - -\end_inset - - (désolès, tout en japonais...) -\end_layout - -\begin_layout Subsubsection -Corée -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "ETRI" -target "http://www.krv6.net/" - -\end_inset - -: Institut de Recherche en Electronique et Télécommunications -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Forum IPv6 koréen" -target "http://www.ipv6.or.kr/english/index.new.htm" - -\end_inset - -: Projet de déploiement coréen d'IPv6 -\end_layout - -\begin_layout Subsubsection -Mexique -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Mexique IPv6" -target "http://www.ipv6.unam.mx/" - -\end_inset - - (versions espagnole et anglaise): Accueil du projet IPv6 de l'Université - nationale autonome du Mexique (UNAM) -\end_layout - -\begin_layout Subsubsection -Pays-Bas -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "SURFnet" -target "http://www.ipv6.surfnet.nl/" - -\end_inset - -: Backbone IPv6 SURFnet -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "STACK" -target "http://www.stack.nl/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "STACK (IPv6)" -target "http://www.stack.nl/ipv6/" - -\end_inset - -: Association d'étudiants en informatique de l' Université de Technologie, - Pays-Bas -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPng.nl" -target "http://www.ipng.nl/" - -\end_inset - -: collaboration entre WiseGuys et Intouch -\end_layout - -\begin_layout Subsubsection -Portugal -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "FCCN (Fondation Nationale pour le Calcul Scientifique)" -target "http://www.fccn.pt/projectos/ipv6/index_html" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Russie -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Forum IPv6 pour la Russie" -target "http://www.ipv6.ru/" - -\end_inset - -: Centre Internet de l'Université publique de Yaroslavl -\end_layout - -\begin_layout Subsubsection -Suisse -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "SWITCH" -target "http://www.switch.ch/network/ipv6/references.html" - -\end_inset - -: L'éducation suisse & les recherches réseau -\end_layout - -\begin_layout Subsubsection -Royaume-Uni -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 au Royaume-Uni" -target "http://www.ipv6.org.uk/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Centre de resources IPv6 britanique" -target "http://www.cs-ipv6.lancs.ac.uk/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "La page d'accueil de British Telecom IPv6" -target "http://www.bt.com/ipv6/" - -\end_inset - -: essai de BT en tant que fournisseur de service IPv6, premier point d'interconn -exion Internet au Royaume-Uni, ... -\end_layout - -\begin_layout Subsection -Par systèmes d'exploitation -\end_layout - -\begin_layout Subsubsection -*BSD -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Le projet KAME " -target "http://www.kame.net/" - -\end_inset - - (*BSD) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "FAQ de la mise en réseau IPv6 de NetBSD" -target "http://www.netbsd.org/Documentation/network/ipv6/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Le port FreeBSD d'Ipv6" -target "http://www.freebsd.org/ports/ipv6.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -BUGAT - Groupe d'utilisateurs Australiens BSD - -\begin_inset CommandInset href -LatexCommand href -name "www.bugat.at" -target "http://www.bugat.at/" - -\end_inset - -: -\begin_inset CommandInset href -LatexCommand href -name "Tunnel IPv6 FreeBSD" -target "http://www.bugat.at/inforum/contentview.php/mini-howto/freebsd-ipv6.ihtml" - -\end_inset - - (langue allemande) -\end_layout - -\begin_layout Subsubsection -Cisco IOS -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Cisco IOS IPv6" -target "http://www.cisco.com/warp/public/732/Tech/ipv6/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 pour IOS de Cisco" -target "http://www.cisco.com/univercd/cc/td/doc/product/software/ios122/122newft/122t/122t2/ipv6/ftipv6c.htm" - -\end_inset - -, Fichier 2 sur 3: août 2002 -- Table des Matières: IPv6 pour IOS de Cisco; - documentation des caractéristiques de configuration; Rendre disponible - et configurer le routage IPv6; l'adressage IPv6; Rendre globalement le - fonctionnement IPv6 disponible. -\end_layout - -\begin_layout Itemize -Manuel de la mise en réseau Internet Cisco, -\begin_inset CommandInset href -LatexCommand href -name "chapitre IPv6" -target "http://www.cisco.com/univercd/cc/td/doc/cisintwk/ito_doc/ipv6.htm" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Compaq -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 chez Compaq" -target "http://www.compaq.com/ipv6/" - -\end_inset - - - Présentations, livres blancs, documentation, ... -\end_layout - -\begin_layout Subsubsection -HPUX -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "FAQ comp.sys.hp.hpux" -target "http://www.faqs.org/faqs/hp/hpux-faq/index.html" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -IBM -\end_layout - -\begin_layout Itemize -Maintenant c'est IBM qui annonce la disponibilité de z/OS V1.4, -\begin_inset CommandInset href -LatexCommand href -name "Quoi de neuf dans cette version?" -target "http://search390.techtarget.com/ateQuestionNResponse/0,289625,sid10_cid486367_tax292523,00.html" - -\end_inset - - Cette question a été posée le 15 août 2002 -\end_layout - -\begin_layout Subsubsection -Microsoft -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Microsoft Windows 2000 IPv6" -target "http://www.microsoft.com/windows2000/technologies/communications/ipv6/default.asp" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "MSRIPv6" -target "http://www.research.microsoft.com/msripv6" - -\end_inset - - - Accueil IPv6 des recherches réseau de Microsoft -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Débuter avec la technologie IPv6 Microsoft prévue pour Windows 2000" -target "http://msdn.microsoft.com/downloads/sdks/platform/tpipv6/start.asp" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Le pare-feu servant à la connexion Internet ne bloque pas le trafic IPv6" -target "http://support.microsoft.com/default.aspx?scid=kb;en-us;306203" - -\end_inset - - (au 6.11.2001) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Internet Protocol Numbers" -target "http://support.microsoft.com/default.aspx?scid=kb;en-us;289892" - -\end_inset - - (au 8.10.2002) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Technology Preview Refresh" -target "http://support.microsoft.com/default.aspx?scid=kb;en-us;273826" - -\end_inset - - (au 16.10.2002) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Comment: installer et configurer IP version 6 pour Windows .NET Enterprise Server" -target "http://support.microsoft.com/default.aspx?scid=kb;en-us;325449" - -\end_inset - - (au 26.10.2002) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Le service de routage 6to4 du serveur Windows .NET quitte lorsque vous publiez une adresse 2002 sur une interface publique" -target "http://support.microsoft.com/default.aspx?scid=kb;en-us;329984" - -\end_inset - - (au 28.10.2002) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "msdn - Microsoft Windows CE .NET - commandes IPv6" -target "http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcetcpip/htm/cmconIPv6exe.asp" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "msdn - recherche pour IPv6" -target "http://search.microsoft.com/default.asp?qu=IPv6&boolean=ALL&nq=NEW&so=RECCNT&p=1&ig=01&i=00&i=01&i=02&i=03&i=04&i=05&i=06&i=07&i=08&i=09&i=10&i=11&i=12&i=13&i=14&i=15&i=16&i=17&i=18&i=19&i=20&i=21&i=22&i=23&i=24&i=25&i=26&i=27&i=28&i=29&i=30&i=31&i=32&i=33&i=34&i=35&i=36&i=37&i=38&i=39&i=40&i=41&siteid=us/dev" - -\end_inset - - (100 résultats, au 22.12.2002) -\end_layout - -\begin_layout Subsubsection -Solaris -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Solaris Sun Microsystems" -target "http://www.sun.com/software/solaris/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Solaris 2 Frequently Asked Questions (FAQ) 1.73" -target "http://www.cs.uu.nl/wais/html/na-dir/Solaris2/FAQ.html" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Sumitoma é -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Sumitomo Electric a implémenté IPv6 sur la famille des routeurs Suminet 3700" -target "http://playground.sun.com/pub/ipng/html/ipng-implementations.html#Sumitomo" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -ZebOS -\end_layout - -\begin_layout Itemize -IpInfusion's -\begin_inset CommandInset href -LatexCommand href -name "ZebOS Logiciel de serveur de routage" -target "http://www.ipinfusion.com/products/server/products_server.html" - -\end_inset - - -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "information-ipv6andsecurity" - -\end_inset - -La sécurité IPv6 -\end_layout - -\begin_layout Itemize -Internet Security Systems: Centre Sécurité, -\begin_inset CommandInset href -LatexCommand href -name "recherche dans la base de donnée X-Force" -target "http://www.iss.net/security_center/search.php?type=3&type=3&pattern=IPv6" - -\end_inset - - (21.12.2002 - 6 thèmes relatifs à IPv6) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Projet IPsec NIST" -target "http://csrc.nist.gov/ipsec/" - -\end_inset - - ( Institut National des Standards et Technologie, NIST) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Information Security" -target "http://www.infosecuritymag.com/index.shtml" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "NewOrder.box.sk (recherche pour IPv6)" -target "http://neworder.box.sk/search.php3?srch=IPv6" - -\end_inset - - (Articles, exploits, files database, etc.) -\end_layout - -\begin_layout Subsection -Les listes d'applications -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6.org / Ies applications disposant d'Pv6" -target "http://www.ipv6.org/v6-apps.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Freshmeat / recherche IPv6" -target "http://freshmeat.net/search/?q=IPv6" - -\end_inset - -, actuellement (au 14 décembre 2002), 62 projets -\end_layout - -\begin_layout Itemize -Forum IPv6 : -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Router List" -target "http://www.ipv6forum.com/navbar/links/v6routerlist.htm" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Les outils d'analyse -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Ethereal" -target "http://ethereal.planetmirror.com/" - -\end_inset - - - Ethereal est un analyseur libre de protocoles réseaux pour Unix et Windows -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Radcom RC100-WL" -target "http://www.ip6.com/us/analyzer.htm" - -\end_inset - - - Téléchargez l'analyseur de protocoles RC100-WL Radcom version 3.20 -\end_layout - -\begin_layout Subsubsection -Les produits IPv6 -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "6wind" -target "http://www.6wind.com/" - -\end_inset - - - solutions pour routeur IPv4/IPv6, QoS, Multicast, Mobilité, Sécurité/VPN/Pare --feu. - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Fefe's patches for IPv6 with djbdns" -target "http://www.fefe.de/dns/" - -\end_inset - -Août 2002 -- Qu'est-ce que djbdns et a-t-il besoin d'IPv6? djbdns est un - serveur DNS complet qui outrepasse les performances de BIND. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Suite de serveurs de routage ZebOS " -target "http://www.ipinfusion.com/products/server/products_server.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Inframail (Advantage Server Edition)" -target "http://download.cnet.com/Inframail-Advantage-Server-Edition/3000-10248_4-8202652.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "HTTrack Website Copier" -target "http://download.cnet.com/HTTrack-Website-Copier/3000-2377_4-10149393.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "CommView" -target "http://download.cnet.com/CommView/3000-2085_4-10132748.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Posadis" -target "http://download.cnet.com/Posadis/3000-2155_4-10149750.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "TCP Wrapper (prêt pour IPv6)" -target "ftp://ftp.porcupine.org/pub/ipv6/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-snmp" - -\end_inset - -SNMP -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "comp.protocpols.snmp SNMP FAQ Parties 1 of 2" -target "http://www.cs.uu.nl/wais/html/na-dir/snmp-faq/part1.html" - -\end_inset - - -\end_layout - -\begin_layout Section -L'infrastructure IPv6 -\end_layout - -\begin_layout Subsection -Statistiques -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Histoire de la table de routage IPv6" -target "http://www.space.net/~gert/RIPE/" - -\end_inset - - créée par Gert Döring, -\begin_inset CommandInset href -LatexCommand href -name "Space.Net" -target "http://www.space.net/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Official 6bone Webserver list Statisic" -target "http://6bone.informatik.uni-leipzig.de/ipv6/stats/stats.php3" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Allocation Data & Survey Results" -target "http://www.ripe.net/ripe/meetings/archive/ripe-42/presentations/ripe42-ipv6-survey/sld001.html" - -\end_inset - -, IPv6 WG, Ripe 42, Ripe NCC -\end_layout - -\begin_layout Subsection -Points d'interconnexion Internet -\end_layout - -\begin_layout Standard -Une autre liste de points d'interconnexion IPv6 peut être trouvée ici: -\begin_inset CommandInset href -LatexCommand href -name "Site web des points d'interconnexion IPv6" -target "http://www.v6nap.net/" - -\end_inset - - -\lang english - ou -\begin_inset CommandInset href -LatexCommand href -name "Statut IPv6 des IXP en Europe" -target "http://www.euro-ix.net/isp/choosing/search/matrix.php" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-ipv6exchanges-estonia" - -\end_inset - -Estonie -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "TIX" -target "http://tix.estpak.ee/" - -\end_inset - - (point d'interconnexion Internet Tallinn avec support IPv6) -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-ipv6exchanges-europe" - -\end_inset - -Europe -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Euro6IX" -target "http://www.euro6ix.net/" - -\end_inset - -, Backbone des points d'interconnexion Internet IPv6 européen -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-ipv6exchanges-france" - -\end_inset - -France -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Point d'interconnexion Internet IPv6 français" -target "http://www.fnix6.net/" - -\end_inset - - (actif depuis le 1.11.2002). - -\begin_inset Newline newline -\end_inset - -FNIX6 fournit une interconnexion haut débit FastEthernet gratuite et fiable - entre ISP situés chez TeleCity, Paris. -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-ipv6exchanges-germany" - -\end_inset - -Allemagne -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "INXS" -target "http://www.inxs.de/" - -\end_inset - -: Munich et Hamburg (câble & sans fil) -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-ipv6exchanges-japan" - -\end_inset - -Japon -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "NSPIXP-6" -target "http://www.wide.ad.jp/nspixp6/" - -\end_inset - -: point d'interconnexion Internet basé sur IPv6, à Tokyo -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "JPIX" -target "http://www.jpix.co.jp/" - -\end_inset - -, Tokyo -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-ipv6exchanges-korea" - -\end_inset - -Korée -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "6NGIX" -target "http://www.ngix.ne.kr/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-ipv6exchanges-netherlands" - -\end_inset - -Les Pays-Bas -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "AMS-IX" -target "http://www.ams-ix.net/" - -\end_inset - -: Point d'interconnexion à Amsterdam -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-ipv6exchanges-uk" - -\end_inset - -Royaume-Uni -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "UK6X" -target "http://www.uk6x.com/" - -\end_inset - -: Londres -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "XchangePoint" -target "http://www.xchangepoint.net/" - -\end_inset - -: Londres -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-ipv6exchanges-usa" - -\end_inset - -USA -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "6TAP" -target "http://www.6tap.net" - -\end_inset - -: Chicago. - Supporte le -\emph on -peering -\emph default - à travers tout le globe -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "NY6IX" -target "http://www.ny6ix.net/" - -\end_inset - -: Point d'interconnexion IPv6 basé à New York -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "PAIX" -target "http://www.paix.net/" - -\end_inset - -: Palo Alto -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "information-Tunnelbroker" - -\end_inset - -Les fournisseurs de tunnel ( -\emph on -tunnelbrokers -\emph default -) -\end_layout - -\begin_layout Standard - -\lang english -Voir aussi: -\begin_inset CommandInset href -LatexCommand href -name "http://www.deepspace6.net/docs/tunnelbrokers.html" -target "http://www.deepspace6.net/docs/tunnelbrokers.html" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-belgium" - -\end_inset - -Belgique -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Wanadoo" -target "http://tunnel.be.wanadoo.com/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-canada" - -\end_inset - -Canada -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Freenet6" -target "http://www.freenet6.net/" - -\end_inset - - - délégation /48, Canada -\begin_inset Newline newline -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name "Accéder à IPv6 en utilisant Freenet6 sur Debian" -target "http://www.linuxjournal.com/article.php?sid=5963&mode=thread&order=0" - -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name "Création Freenet6" -target "http://www.viagenie.qc.ca/en/index.shtml" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-china" - -\end_inset - -Chine -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "CERNET-Nokia" -target "http://tb.6test.edu.cn/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-estonia" - -\end_inset - -Estonie -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Estpak" -target "http://tunnelbroker.ipv6.estpak.ee/?tunnel&PHPSESSID=aa2184190cc2cc6d3a6f6ddd01ae3635" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Europe -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Fournisseur de tunnel distribué XS26" -target "http://www.xs26.net/" - -\end_inset - -, USA & Europeé -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-germany" - -\end_inset - -Allemagne -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "6bone Knoten Leipzig" -target "http://6bone.informatik.uni-leipzig.de/" - -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name "Info bez. Hackangriff (2001)" -target "http://www.mail-archive.com/ipv6@uni-muenster.de/msg00056.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Berkom" -target "http://fix.ipv6.berkom.de/cgi-bin/tb.pl" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-italy" - -\end_inset - -Italie -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Centro Studi e Laboratory Telecomunicazioni" -target "https://carmen.cselt.it/ipv6tb/" - -\end_inset - - ( -\begin_inset CommandInset href -LatexCommand href -name "page de téléchargement TunnelBroker Version 2.1." -target "http://carmen.cselt.it/cgi-bin/download.pl?pkg=TunnelBroker" - -\end_inset - -) -\begin_inset Newline newline -\end_inset - -Fournisseur de tunnel IPv6: -\begin_inset CommandInset href -LatexCommand href -name "instructions d'installation" -target "http://carmen.cselt.it/ipv6/tools/ipv6tb/Installing-ipv6tb.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Comv6" -target "http://www.comv6.com/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Bersafe" -target "http://www.bersafe.it" - -\end_inset - - (langue italienne) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Telecom Italia LAB" -target "http://carmen.ipv6.tilab.com/" - -\end_inset - - ( -\begin_inset CommandInset href -LatexCommand href -name "page de téléchargement du logiciel Tunnelbroker" -target "http://carmen.ipv6.tilab.com/cgi-bin/download.pl?pkg=TunnelBroker" - -\end_inset - -) -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-japan" - -\end_inset - -Japon -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Initiative Internet au Japon" -target "http://www.iij.ad.jp/en/IPv6" - -\end_inset - - ( -\begin_inset CommandInset href -LatexCommand href -name "en langue japonaise" -target "http://www.iij.ad.jp/IPv6/" - -\end_inset - -) - avec fourniture de lignes IPv6 natives et tunnelage IPv6 -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-malaysia" - -\end_inset - -Malaisie -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Manis" -target "http://tbroker.manis.net.my/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-netherlands" - -\end_inset - -Les Pays-Bas -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "XS26 - \"Accès à Six\"" -target "http://www.xs26.net/" - -\end_inset - - - avec des POP (Points De Présence) en République slovaque, en République - Tchèque, aux Pays-Bas, en Allemagne et en Hongrie. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPng Pays-Bas" -target "http://www.ipng.nl/" - -\end_inset - - - Intouch, SurfNet, AMS-IX, UUNet, Cistron, RIPE NCC et AT&T sont connectés - au AMS-IX. - Il est possible (sous certaines conditions) d'obtenir un tunnel statique. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Clients SURFnet" -target "http://www.ipv6.surfnet.nl/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-norway" - -\end_inset - -Norvège -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "UNINETT" -target "http://www.uninett.no/testnett/index.en.html" - -\end_inset - -, Guide concernant le service IPv6 (pour les clients): fournisseur de tunnel - et allocation d'adresse -\begin_inset Newline newline -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name "Uninett-Autoupdate-HOWTO" -target "http://www.guruz.de/Uninett-Autoupdate-HOWTO" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection - -\lang english -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-spain" - -\end_inset - -Espagne -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "Consulintel" -target "http://tb.consulintel.euro6ix.org/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-switzerland" - -\end_inset - -Suisse -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Fournisseur de tunnel AS8758" -target "http://tunnelbroker.as8758.net/" - -\end_inset - -, Dolphins Network Systems (en ligne depuis le 20.12.2002) -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-uk" - -\end_inset - -Royaume-Uni -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "NTT Europe" -target "http://www.uk.v6.ntt.net/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "NTT" -target "http://www.nttv6.net/" - -\end_inset - -, Royaume-Uni - essai IPv6. - Tunnel IPv4 et IPv6 natif and native IPv6 leased Line connexions. - Les POP sont situés à Londres au Royaume Uni, Düssenldorf en Allemagne, - New Jersey aux USA (Côte Est), Cupertino aux USA (Côte Ouest), Tokyo au - Japon -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Interface d'administration du fourniseur de tunnel IPv6 BtexacT" -target "https://tb.ipv6.btexact.com/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Royaume-Uni IPng" -target "http://ipng.org.uk/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-usa" - -\end_inset - -USA -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "ESnet" -target "http://www.es.net/hypertext/welcome/pr/ipv6.html" - -\end_inset - -, USA - Réseau des Sciences de l'Energie: Tunnel Registry & adresse Delegation - for directly connected ESnet sites and ESnet collaborators. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "6REN" -target "http://www.6ren.net/" - -\end_inset - -, USA - l'initiative 6ren est coordonnée par Réseau des Sciences de l'Energie - (ESnet), the network for the Energy Research program of the US Dept. - of Energy, located at the University of California's Lawrence Berkeley - National Laboratory. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "XS26 Distributed Tunnel Broker" -target "http://www.xs26.net/" - -\end_inset - -, USA & Europe -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Hurricane Electric" -target "http://ipv6tb.he.net/" - -\end_inset - -, backbone US; -\begin_inset Newline newline -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name "Fournisseur de tunnel Hurrican Electric" -target "http://tunnelbroker.net/" - -\end_inset - - (aussi disponible -\begin_inset CommandInset href -LatexCommand href -name "ici" -target "http://tunnelbroker.com/" - -\end_inset - -) -\begin_inset Newline newline -\end_inset - -Press Version: -\begin_inset CommandInset href -LatexCommand href -name "Hurricane Electric devient fournisseur de tunnel IPv6 (communiqué de presse)" -target "http://www.he.net/releases/release6.html" - -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name "Mise à jour d'extrémité de tunnel, pour fournisseur de tunnel" -target "http://ipv6.he.net/tunnelbroker-update.php" - -\end_inset - -, script Perl -\end_layout - -\begin_layout Subsubsection - -\lang english -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-singapore" - -\end_inset - -Singapour -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "http://tunnel-broker.singnet.com.sg/" -target "http://tunnel-broker.singnet.com.sg/" - -\end_inset - -, avec en option NAT et IPsec -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-more" - -\end_inset - -Plus de fournisseurs de tunnel... -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Routeurs relais 6to4 publiques" -target "http://www.kfu.com/~nsayer/6to4/" - -\end_inset - - (boycott MS IIE!) -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "information-infrastructure-nativeipv6service" - -\end_inset - -Services nativement accessibles par IPv6 -\end_layout - -\begin_layout Standard -Note: Ces services sont uniquement disponibles grâce à une connexion IPv6 - valide! -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-nativeipv6gameserver" - -\end_inset - -Serveur de jeu -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Quake2" -target "http://www.viagenie.qc.ca/en/ipv6/quake2/ipv6-quake2.shtml" - -\end_inset - - sur IPv6 -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-nativeipv6ircserver" - -\end_inset - -IRC Server -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Cyconet" -target "http://ipv6.cyconet.org/?id=server" - -\end_inset - - (serveurs IRCnet Cyconet sur IPv6) -\end_layout - -\begin_layout Subsubsection -Stations Radio, flux de musique -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Flux IPv6 expérimental en direct!" -target "http://aopteryx.informatik.uni-leipzig.de:8000/live.mp3" - -\end_inset - -, Université de Leipzig, Allemagne -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-nativeipv6webserver" - -\end_inset - -Serveur web -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "la page d'accueil de l'HOWTO IPv6 Linux de Peter Bieringer " -target "http://www.ipv6.bieringer.de/" - -\end_inset - - -\end_layout - -\begin_layout Standard -Quelque chose manque? Les suggestions sont les bienvenues! -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "information-maillists" - -\end_inset - -Les listes de diffusion -\end_layout - -\begin_layout Standard -Des listes de listes de diffusion sont disponibles: -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "DeepSpace6 / liste de listes de diffusion" -target "http://www.deepspace6.net/sections/lists.html" - -\end_inset - - -\end_layout - -\begin_layout Standard -Les listes de diffusion essentielles sont listées dans le tableau suivant: -\end_layout - -\begin_layout Standard -\begin_inset Tabular - - - - - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Centre d'intérêt -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Adresse mél de la requête d'inscription -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -A quoi souscrire -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Adresse mél de la liste de diffusion -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Langue -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -accès par WWW -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -L'activité réseau du noyau Linux incluant IPv6 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -majordomo (chez) oss.sgi.com -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -netdev -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -netdev (chez) oss.sgi.com -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Anglaise -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -\begin_inset CommandInset href -LatexCommand href -name "Archive" -target "http://oss.sgi.com/projects/netdev/archive/" - -\end_inset - - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Linux et IPv6 en général (1) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -majordomo (chez) list.f00f.org -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -linux-ipv6 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -linux-ipv6 (chez) list.f00f.org (modérée) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Anglaise -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -L'implémentation Linux du protocole IPv6 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -interface web, voir l'URL -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -project6 (chez) ferrara.linux.it -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Anglaise -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -\begin_inset CommandInset href -LatexCommand href -name "Info" -target "http://project6.ferrara.linux.it/sections/lists.html" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "Subscription" -target "http://mailman.ferrara.linux.it/listinfo/project6" - -\end_inset - - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -La mobilité IP(v6) sur Linux -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -majordomo (chez) list.mipl.mediapoli.com -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -mipl -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -mipl (chez) list.mipl.mediapoli.com -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Anglaise -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -\begin_inset CommandInset href -LatexCommand href -name "Info" -target "http://www.mipl.mediapoli.com/mailinglist.html" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "Archive" -target "http://www.mipl.mediapoli.com/mail-archive/" - -\end_inset - - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Utilisateurs Linux IPv6 avec l'extension USAGI -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -usagi-users-ctl (chez) linux-ipv6.org -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -usagi-users (chez) linux-ipv6.org -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Anglaise -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -\begin_inset CommandInset href -LatexCommand href -name "Info / Recherche" -target "http://www.linux-ipv6.org/ml/index.html#usagi-users" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "Archive" -target "http://www.linux-ipv6.org/ml/usagi-users/" - -\end_inset - - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -IPv6 sur Debian Linux -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -interface web, voir l'URL -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -debian-ipv6 (chez) lists.debian.org -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Anglaise -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -\begin_inset CommandInset href -LatexCommand href -name "Info/Souscription/Archive" -target "http://lists.debian.org/debian-ipv6/" - -\end_inset - - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -IPv6/6bone en Allemagne -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -majordomo (chez) atlan.uni-muenster.de -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ipv6 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ipv6 (chez) uni-muenster.de -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -German/English -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -\begin_inset CommandInset href -LatexCommand href -name "Info" -target "http://www.join.uni-muenster.de/JOIN/ipv6/texte-englisch/mailingliste.html" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "Archive" -target "http://www.join.uni-muenster.de/local/majordomo/ipv6/" - -\end_inset - - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -6bone -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -majordomo (chez) isi.edu -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -6bone -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -6bone (chez) isi.edu -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Anglaise -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -\begin_inset CommandInset href -LatexCommand href -name "Info" -target "http://www.6bone.net/6bone_email.html" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "Archive" -target "http://mailman.isi.edu/pipermail/6bone/" - -\end_inset - - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Discussions IPv6 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -majordomo (chez) sunroof.eng.sun.com -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ipng -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ipng (chez) sunroof.eng.sun.com -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Anglaise -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -\begin_inset CommandInset href -LatexCommand href -name "Info" -target "http://playground.sun.com/pub/ipng/html/instructions.html" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "Archive" -target "ftp://playground.sun.com/pub/ipng/mail-archive/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "Mirroir des archives" -target "http://www.wcug.wwu.edu/lists/ipng/" - -\end_inset - - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Les utilisateurs d'IPv6 en général -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -majordomo (chez) ipv6.org -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -users -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -users (chez) ipv6.org -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Anglaise -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -\begin_inset CommandInset href -LatexCommand href -name "Info" -target "http://www.ipv6.org/mailing-lists.html" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "Archive" -target "http://news.gmane.org/thread.php?group=gmane.network.ipv6.general" - -\end_inset - - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Recherche des bogues des applications Internet (2) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -bugtraq-subscribe (chez) securityfocus.com -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -bugtraq (chez) securityfocus.com (moderated) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Anglaise -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -\begin_inset CommandInset href -LatexCommand href -name "Info" -target "http://online.securityfocus.com/popups/forums/bugtraq/intro.shtml" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "Archive" -target "http://online.securityfocus.com/archive/1" - -\end_inset - - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -IPv6 en général -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -interface web, voir l'URL -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ipv6 (chez) ipng.nl -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Anglaise -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -\begin_inset CommandInset href -LatexCommand href -name "Info/Subscription" -target "http://mailman.ipng.nl/mailman/listinfo/ipv6/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "Archive" -target "http://mailman.ipng.nl/pipermail/ipv6/" - -\end_inset - - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -majordomo (chez) mfa.eti.br -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -majordomo (chez) mfa.eti.br -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ipv6 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ipv6 (chez) mfa.eti.br -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Portugaise -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -\begin_inset CommandInset href -LatexCommand href -name "Info" -target "http://www.marcelo.pro.br/mailman/listinfo/ipv6" - -\end_inset - - -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Standard -(1) recommandé pour les questions d'ordre général Linux & IPv6. -\end_layout - -\begin_layout Standard -(2) très recommandé si vous êtes fournisseur d'applications serveur. -\end_layout - -\begin_layout Standard -Quelque chose manque? Les suggestions sont les bienvenues! -\begin_inset Newline newline -\end_inset - - -\end_layout - -\begin_layout Standard -Les listes de diffusion et newsgroups suivants sont disponibles -\emph on -via -\emph default - le web: -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "ipv6 (France)" -target "http://www.tile.net/lists/showlists.php?list_id=35905" - -\end_inset - - -\begin_inset Newline newline -\end_inset - -Description: Cette liste IPv6 permet de discuter d'IPv6 en langue française. - Elle s'adresse aux personnes désirant démarrer dès aujourd'hui des tests - IPv6. - Ce n'est en aucun cas un substitut aux listes de l'IETF. - Pour de plus amples informations: -\begin_inset CommandInset href -LatexCommand href -name "http://www.urec.fr/IPng" -target "http://www.urec.fr/IPng" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Tunnelbroker Maillingliste (Allemagne)" -target "http://www.ipv6.uni-leipzig.de/~6bone/tb/maillist.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "ipv6 (Hongrie)" -target "http://www.tile.net/lists/showlists.php?list_id=36611" - -\end_inset - - -\begin_inset Newline newline -\end_inset - -Description: ipv6 Az IPv6 protokoll listaja Konfiguracios es adminisztracios - kerdesek az IPv6-al kapcsolatban. - -\begin_inset CommandInset href -LatexCommand href -name "(Archivum)" -target "http://www.ipv6.fsz.bme.hu/mlists/ipv6/ipv6.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "student-ipv6 (Inde)" -target "http://groups.yahoo.com/group/student-ipv6" - -\end_inset - - -\begin_inset Newline newline -\end_inset - -Description: groupe d'étudiants intéressé par IPv6 -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPV6-CNR@LISTSERV.CNR.IT (Italie)" -target "http://www.lsoft.com/scripts/wl.exe?SL1=IPV6-CNR&H=LISTSERV.CNR.IT" - -\end_inset - - -\begin_inset Newline newline -\end_inset - -Description: Groupe IPv6 au CNR -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "ipv6-jp (Japon)" -target "http://www.tile.net/lists/showlists.php?list_id=14761" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "ipv6 (Japon)" -target "http://www.tile.net/lists/showlists.php?list_id=37305" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "sun-ipv6-users" -target "http://groups.yahoo.com/group/sun-ipv6-users" - -\end_inset - - -\begin_inset Newline newline -\end_inset - -Description: Merci de rapporter les problèmes/suggestions concernant l'implément -ation IPng SUN Microsystems -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6-BITS" -target "http://groups.yahoo.com/group/IPv6-BITS" - -\end_inset - - -\begin_inset Newline newline -\end_inset - -Description: Cette liste coordonnera le travail du Verebrae. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "openbsd-ipv6" -target "http://www.tile.net/lists/showlists.php?list_id=23220" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6" -target "http://www.tile.net/lists/showlists.php?list_id=35203" - -\end_inset - - -\begin_inset Newline newline -\end_inset - -Description: Cette liste de diffusion consiste en discussions techniques - au sujet des possibilités d'IPv6/IPsec WRT OpenBSD. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "linux-bangalore-ipv6" -target "http://groups.yahoo.com/group/linux-bangalore-ipv6" - -\end_inset - - -\begin_inset Newline newline -\end_inset - -Description: La liste concernant le déploiement d'IPv6 du groupe d'utilisateurs - Linux Bangalore -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "gab" -target "http://www.tile.net/lists/showlists.php?list_id=32034" - -\end_inset - - -\begin_inset Newline newline -\end_inset - -Description: L'intention est de discuter du plan géographique d'adressage - IPv6. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "ipv6-bsd-user" -target "http://www.tile.net/lists/showlists.php?list_id=37430" - -\end_inset - - -\begin_inset Newline newline -\end_inset - -Description: Cette liste de diffusion concerne l -\begin_inset Quotes srd -\end_inset - -implémentation INéRIA/IMAG d'IPv6. - Elle est bilingue, Francais/Anglais. - Si vous souhaitez contacter les implémenteurs, essayez ipv6-bsd-core@imag.fr -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "gated-ipv6" -target "http://www.tile.net/lists/showlists.php?list_id=41375" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "La commutation de paquets" -target "http://groups.yahoo.com/group/packet-switching" - -\end_inset - - -\begin_inset Newline newline -\end_inset - -Description: cette liste de diffusion fournit un forum de discussion au - sujet de l'implémentation, de la technologie et de la théorie de la commutation - de paquets et l'application à tout domaine, LAPB, X.25, SDLC, P802.1d, LLC, - IP, IPv6, IPX, DECNET, APPLETALK, FR, PPP, téléphonie IP, les systèmes - PBX LAN, les protocoles d'administration comme SNMP, e-mail, système de - fenêtre transparent au réseau, implémentation de protocoles, vérification - de protocoles, tests de conformité et outils utilisés dans la maintenance - ou dans le développement des systèmes de commutation de paquets. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "mumbaiinternetgroup" -target "http://groups.yahoo.com/group/mumbaiinternetgroup" - -\end_inset - - -\begin_inset Newline newline -\end_inset - -Description: Ce forum discutera des problèmes et des développements actuels - concernant Internet dans la région de l'Asie pacifique. - Cela couvrira IPv4, IPv6, le DNS multilingue, les numéros de systèmes autonomes -, la gouvernance Internet et bien plus... -\end_layout - -\begin_layout Itemize -de.comm.protocols.tcp-ip -\begin_inset Newline newline -\end_inset - -Description: Umstellung auf IPv6 -\begin_inset Newline newline -\end_inset - -Source: -\begin_inset CommandInset href -LatexCommand href -name "Chartas der Newsgruppen in de.*" -target "http://www.faqs.org/faqs/de-newsgroups/chartas/index.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Groupe Google: -\begin_inset CommandInset href -LatexCommand href -name "comp.protocols.tcp-ip" -target "http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF8&safe=off&group=comp.protocols.tcp-ip" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Groupe Google: -\begin_inset CommandInset href -LatexCommand href -name "linux.debian.maint.ipv6" -target "http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF8&safe=off&group=linux.debian.maint.ipv6" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Groupe Google: -\begin_inset CommandInset href -LatexCommand href -name "microsoft.public.platformsdk.networking.ipv6" -target "http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF8&safe=off&group=microsoft.public.platformsdk.networking.ipv6" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Groupe Google: -\begin_inset CommandInset href -LatexCommand href -name "fa.openbsd.ipv6" -target "http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF8&safe=off&group=fa.openbsd.ipv6" - -\end_inset - - -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "information-onlinetesttools" - -\end_inset - -Outils en ligne -\end_layout - -\begin_layout Subsection -Outils de test -\end_layout - -\begin_layout Itemize -finger, nslookup, ping, traceroute, whois: -\begin_inset CommandInset href -LatexCommand href -name "Centre de ressources IPv6 britanique / la page de test" -target "http://www.cs-ipv6.lancs.ac.uk/ipv6/testing/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -ping, traceroute, tracepath, whois 6bone, DNS: -\begin_inset CommandInset href -LatexCommand href -name "JOIN / outils de test" -target "http://www.join.uni-muenster.de/lab/testtools.html" - -\end_inset - - (en langue allemande seulement, mais en l'occurrence cela ne devrait pas - être un problème pour les non germanistes) -\end_layout - -\begin_layout Itemize -traceroute6, whois: -\begin_inset CommandInset href -LatexCommand href -name "IPng.nl" -target "http://www.ipng.nl/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -Vérificateur de résolution AAAA -\begin_inset CommandInset href -LatexCommand href -name "http://www.cnri.dit.ie/cgi-bin/check_aaaa.pl" -target "http://www.cnri.dit.ie/cgi-bin/check_aaaa.pl" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -Outils divers : -\begin_inset CommandInset href -LatexCommand href -name "IPv6tools" -target "http://www.ipv6tools.com/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang english -\begin_inset CommandInset href -LatexCommand href -name "Outil d'analyse d'adresse IPv6" -target "http://doc.tavian.com/ipv6util/index.htm" - -\end_inset - - (assez similaire à l'option d'information d'ipv6calc) -\end_layout - -\begin_layout Subsection -Recherche d'information -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Le bureau d'enregistrement 6BONE" -target "http://www.kessens.com/~david/6bone/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Liste mondiale d'attribution de tout bloc d'adresses IPv6" -target "http://www.ripe.net/ripencc/mem-services/registration/ipv6/ipv6allocs.html" - -\end_inset - - -\end_layout - -\begin_layout Subsection -Outils d'observation des réseaux IPv6 -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Observer IPv6 chez SURRIEL" -target "http://linux.uninet.edu/lg/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Observer IPv6 chez DRENv6" -target "http://www.v6.dren.net/lg/" - -\end_inset - - -\end_layout - -\begin_layout Subsection -Applications venant en aide -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Calculatrice de préfixe IPv6" -target "http://www.tdoi.org/prefcalc.php" - -\end_inset - - par -\begin_inset CommandInset href -LatexCommand href -name "TDOI" -target "http://www.tdoi.org/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Vérificateur d'enregistrement DNS" -target "http://www.maths.tcd.ie/cgi-bin/check_dns.pl" - -\end_inset - - -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "information-trainingsandseminars" - -\end_inset - -Pratique, séminaires -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "formation et atelier IPv6" -target "http://www.aerasec.de/workshops/ipv6.html" - -\end_inset - -, AERAsec, Allemagne (en langue allemande pour l'instant) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Migrer vers IPv6" -target "http://www.seminarinformation.com/wconnect/wc.dll?sis~details0~307" - -\end_inset - -, Learning Tree International -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Formation professionnelle CIW la maintenance Internet CBT CD" -target "http://www.e-trainonline.com/html/ciw_internetworking_profession.html#IPv6" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Pages concernant la formation" -target "http://www.trainingpages.net/x/category.html?kw=125" - -\end_inset - -, Royaume-Uni - recherche à partir du mot clé -\begin_inset Quotes sld -\end_inset - -IPv6 -\begin_inset Quotes srd -\end_inset - - (13 cours, au 22.12.2002) -\end_layout - -\begin_layout Standard -Quelque chose manque? Les suggestions sont les bienvenues! -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "information-onlinediscovery" - -\end_inset - -'La découverte en ligne'... -\end_layout - -\begin_layout Standard -\begin_inset CommandInset href -LatexCommand href -name "IPv6: Addressing The Needs Of the Future" -target "http://www.amazon.com/exec/obidos/tg/detail/-/B00006334Y/copernicshopper/103-1420916-1341420" - -\end_inset - - [DOWNLOAD: PDF] -\begin_inset Newline newline -\end_inset - -par le groupe Yankee (Auteur) -\begin_inset Newline newline -\end_inset - -Prix: $595.00 -\begin_inset Newline newline -\end_inset - -Edition: e-book (Acrobat Reader) -\begin_inset Newline newline -\end_inset - -Pages: 3 (trois) -\begin_inset Newline newline -\end_inset - -Editeur: MarketResearch.com; ISBN B00006334Y; (1 novembre 2001) -\begin_inset Newline newline -\end_inset - - -\end_layout - -\begin_layout Standard -;-) Le nombre de copies serait intéressant à connaître... -\begin_inset Newline newline -\end_inset - - -\end_layout - -\begin_layout Chapter -Historique des Révisions / Crédits / La Fin -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "revision-history" - -\end_inset - -Historique des Révisions -\end_layout - -\begin_layout Subsection -Révisions 0.x -\end_layout - -\begin_layout Subsubsection -La version anglo-saxonne (document original de Peter Bieringer) -\end_layout - -\begin_layout Standard -Un historique des modifications de la version anglo-saxonne originale peut - être trouvé ici: -\begin_inset CommandInset href -LatexCommand href -name "TLDP / Linux+IPv6-HOWTO / Revision History" -target "http://www.tldp.org/HOWTO/Linux+IPv6-HOWTO/revision-history.html" - -\end_inset - -. -\end_layout - -\begin_layout Subsubsection -La version francophone -\end_layout - -\begin_layout Description -0.49.fr.2 2007-10-06/PB: fix broken URLs to TLDP-CVS, minor fixes for proper - SGML validation. -\end_layout - -\begin_layout Description -0.49.fr.1 2006-02-26/MB: Mise à jour au profit de la révision 0.49. -\end_layout - -\begin_layout Description -0.48.1.fr.1 2005-01-20/MB: Mise à jour au profit de la révision 0.48.1. -\end_layout - -\begin_layout Description -0.47.fr.1 2004-09-05/MB: Mise à jour au profit de la révision 0.47. -\end_layout - -\begin_layout Description -0.45.1.fr.1 2004-03-14/MB: Mise à jour au profit de la révision 0.45.1. - Corrections et améliorations diverses. -\end_layout - -\begin_layout Description -0.44.fr.1 2003-09-05/MB: Mise à jour au profit de la révision 0.44. - A cette occasion, une révision non systématique est réalisée. -\end_layout - -\begin_layout Description -0.43.2.fr.2 2003-07-17/MB: Correction de quelques coquilles, amélioration de - la traduction de quelques passages. -\end_layout - -\begin_layout Description -0.43.2.fr.1 2003-06-20/MB: Mise à jour au profit de la révision 0.43.2. - A cette occasion, une révision non systématique est réalisée. -\end_layout - -\begin_layout Description -0.41.1.fr.2 2003-06-06/MB: Première révision générale; à savoir, correction - de coquilles, bogues, fautes d'orthographe, -\emph on -etc. -\end_layout - -\begin_layout Description -0.41.1.fr.1 2003-05-09/MB: Cette version est la première. - Son contenu, rédigé sur LyX version 1.3.2, est basé sur celui de la version - anglo-saxonne 0.41.1. - Cependant un certain nombre de mes suggestions ( -\emph on -Michel Boucey -\emph default -) ayant été prises en compte par Peter Bieringer lors du travail de traduction, - il existe d'ores et déjà, ça et là, des modifications mineures qui seront - présentes dans les futures versions du document original. - Le suffixe .fr.x indique le numéro de révision de la traduction francophone. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "credits" - -\end_inset - -Crédits -\end_layout - -\begin_layout Standard -Le moyen le plus rapide d'être ajouté à cette sympathique liste est de m'envoyer - des corrections (de bogue), et/ou mises à jour ;-). -\end_layout - -\begin_layout Standard -Si vous voulez réaliser un réexamen important, vous pouvez utiliser le fichier - natif LyX (voir -\begin_inset CommandInset ref -LatexCommand ref -name "le document original" -reference "general-original-source" - -\end_inset - -) et envoyez les diffs s'y rapportant, car les diffs en rapport au code - SGML ne sont pas d'une grande utilité ( -\emph on -NdT -\emph default -: merci d'envoyer les diffs à l'adresse ). -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "major-credits" - -\end_inset - - Crédits majeurs -\end_layout - -\begin_layout Itemize -David Ranch : pour m'avoir encouragé à écrire - cet HOWTO, pour ses commentaires sur quelques premières des révisions, - et ses contributions à de différents résultats de test IPv6 sur mon site - web IPv6. - Mais aussi pour ses relectures et suggestions. -\end_layout - -\begin_layout Itemize -Pekka Savola : pour ses relectures essentielles, - apports et suggestions. -\end_layout - -\begin_layout Itemize -Martin F. - Krafft : pour la vérification orthographique - et sa relecture générale du document. -\end_layout - -\begin_layout Itemize -John Ronan : pour la vérification orthographiq -ue. -\end_layout - -\begin_layout Itemize -Georg Käfer : pour la détection de la création - défectueuse au format PDF (problème réglé maintenant par Greg Ferguson, - travaillant au LDP), les références de livres en langue allemande, une - grande liste d'URL, leurs vérifications, une grande quantité de suggestions, - de corrections, de contributions, et pour sa traduction en langue allemande. -\end_layout - -\begin_layout Itemize -Michel Boucey : pour la correction orthographique, - la découverte de liens brisés, sa contribution grâce à ses suggestions, - ses apports de nouveaux liens, et pour sa traduction en langue française. -\end_layout - -\begin_layout Itemize -Michele Ferritto : pour avoir découvert - des bogues, et pour sa traduction en langue italienne. -\end_layout - -\begin_layout Itemize -Daniel Roesen : pour ses vérifications orthographiques. -\end_layout - -\begin_layout Subsection -Autres crédits -\end_layout - -\begin_layout Subsubsection -Crédits relatifs aux documents techniques -\end_layout - -\begin_layout Standard -Ecrire, en étant débutant, un HOWTO LDP (dans LyX et en exportant le travail - vers DocBook pour se conformer au SGML) n'est pas si facile que certains - pourraient le dire. - Il y a d'étranges pièges... - malgré tout, merci: -\end_layout - -\begin_layout Itemize -Aux auteurs du -\begin_inset CommandInset href -LatexCommand href -name "Guide de l'auteur LDP" -target "http://www.tldp.org/LDP/LDP-Author-Guide/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -A B. - Guillon: pour l' -\begin_inset CommandInset href -LatexCommand href -name "HOWTO DocBook avec LyX" -target "http://perso.libertysurf.fr/bgu/doc/db4lyx/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "content-related-credits" - -\end_inset - -Crédits relatifs à la traduction francophone -\end_layout - -\begin_layout Standard -Les crédits concernant les corrections/suggestions apportées à la version - francophone viendront ici (peut-être un jour...). - Merci par avance pour vos contributions. -\end_layout - -\begin_layout Section -La Fin -\end_layout - -\begin_layout Standard -Merci de m'avoir lu. - Dans l'espoir que cela puisse aider! -\end_layout - -\begin_layout Standard -Si vous avez des questions, souscrivez à la bonne -\begin_inset CommandInset ref -LatexCommand ref -name "liste de diffusion" -reference "information-maillists" - -\end_inset - - et décrivez votre problème en fournissant autant d'information que possible. -\end_layout - -\end_body -\end_document diff --git a/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.fr.pdf b/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.fr.pdf deleted file mode 100644 index 42ee526c9726bb7fe3be7df92c9cfeef073a0ec8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 522194 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

    X%_erUA*uN;2xUXJ$O7~DG=7Q>}x`544I76#>| z=1)9Z*k-iWcA<`T+xnKcVejo0n19Oag&&IymNz$B0r#$i4-=bzIo9`%x`fY4zRHaR zPv3agXfP>`tPF%#4d^VCNB`>iY2FImh%1BNkO8VDo zOT=n8&~NEx(Ge&qU#Z;2^dbcyMQjGUAblE@UU9q|1IM3dx~1M>@JfWA+E|!w`wIh= zy*kGn{$N|q2jf$y_|YfdJq98r)cQye0C060U~mpaymU~?rqlfxyLu|$zJ7x>QJ_GN zVEk}aqd_HXl~8g!H&sNJ-N^H#s|~!uLw$0iqSPX~pPCL0$$p6`3OPOtdF)aR$2dVsK_^m*Ze70aMI1!{Ow_zCX zOeaY1rYbm8wAKCBHmPuKnW2xG;KPcXmFWrw5$=J`hOV4~e@t=p@RG^?X@dF-D`^(|kaUmHUlK~W_c zk$FD4`<1F00aau7IRpe|EmAWO6~TH;#A8>s3V5;wd0g6M4Om0&uSw2=Bb{R+K4+ti zpZcb1HVt6wY-im-w7t1nf(edR_TaBfe65MU45#``ag03JX zK21EoiG^pX)lex5MHn*J7rydhn>-k?58(*8{ zShVoP%yiU|aab9YwKLtCxTg2<%PEIfcl|DHf7|3WTk6WBx2%2(+_Psim5bu7phq+} zX_m$?dhs=&A5x3`Pqy=SDr$O{9#Cu8j7cF+zRW9A$~DK=iaXDTr~R3=2RHXu6MJ?S zN!pT=g}sMEt{8B}TV|~U3NwdcCEj*+QWVJdEuaIP1+dL+h)wm>Z0eH<-`4Njk6SnI z=6fgG?~skFRdHLo^IUw@N*gp+h1enIE|IPI=ngAH8Tv^1oe=$9Pkq)(L;O2kG#x zR`Bsxi>uy$4R(kW%*ZjJ6|pIAfGi1R>TN!dv;M{qrD1+Nq+5e$^snA3)6fWe`uXYT z+7;+(KmiAeI1UKSu-qtlA6sMAGXe|bcfFxowcXP-B{Ju5J z_-S2Ai8nw4P;17NPBaY0MN2uaZI6!Y3+cwgh5Ci@TOQJ};jn!v8V9+$SBt;oc+!A| z4frp<9{UzI!1wYZE$eH>`4y|`s)Q@0mGq9TzND_|>N=Rue)(L{WVmfro?N%zK2Mr}JlM*~fb zee~`1`F?gnl3f+xjCWGXlS#eLtX4}hW%@-lrdUIBo8g|+`Ft?h(IZ`73f$$NT=9Bz zOwO&ZV~Ma{kJ<<=otp%SOeMNQc3dVTJLpv)VI(I^&3t|l_BdCoFf@OIy+A&;vEknm zz|UT_B0_VU>(&U7nJ(UGMA~K=z{^E>jI zF8MGtz@9vxD-=B{bpYGALiZvQ^gdNVf*^n}P2eS@?<#W=aYfq_i93nbMdF+qN z^p@ZpOLf4_8go5)3jOO=u=izJ{H0TT?&) zf_J3Os_$-1x>{u3?4* zj8@IXLaXZzzO2!TiTfLD-f$xLI|8ZBi+fn4vK5T<*4M^9u_8b22GUcNEB(-(+rAoE zH?>K;!!v3fwd0`Xv%bn$FpcC`id>?<76gT-o&Y1r8Y@BNMzS7|e7?P*JSdKBd8o|z zlSF*%jWMZn#2r9|*YCc>B_L81F4qDAvgP$GG`@S&Vd>-HgdtUBJ(?t-oRB-z?p ze#1!-77OfgBlQR87wQkm?^S@m8+alA&=%5rWhg*zfs58t z1tAJ7#2Vk-Q86OiJ#scshHc8^y8WKb3(!amCX@nt0h);NYuT}kqA~a>(KZ<#i!8Mcb`fyIh`6c56_QI(aZb5&YqsSIYb#Ou z>On)M*SiT-QO`usI?KJt+UpG&OT6=hc~wMy-SU`1!uqKkaZ>IK4CrAyFVgPBgyJ?3 zO?yE>zAa(%0<_VSMhyG}+y;a1G?d~kAK8vL55Y2Iodr=%d(Htgn4pnA2_6!XQ7{b7 zEJ#nysgWa}j*7n8zzIK}uCi@VA7vQD;QDmbnrOyNL$4y25U(h;jTPs{f{ri^_O1A4h{0!ry5;4h^U1f zywxXTd$%0Fp!N%S%UEYXP8``{8p4Jv{?wZHHjfm0kj_DCdJLjKQiCf*ttIDcGqt{keTAPgmHKk;E=I$7Zm?%jI%1ZA-z5LwM;9y~!>`DPt4PJRq`X}0w;UrlCGQlmMq89p6~H??lBVT6gV!UYB;XD9^8D+g#BVPs4uX!r+BlWoRHb_z?%^&DR=lf*@{4(VcX|9 z7@L&Ec%D1{)4Xfn`;(0ALq-D~hOfoS-7-4UGBz`z9G~*kzXU|DRN|cd%43b(^lV@U zr@amswGFes5#D~BpnQ2bg)s8NH|hiK;2F$`-@3?9F{!12$Q1EDMLoU4TEwv{p*06` zHa(3gw72PA(?bOV8lW}LLoF3v2#c~ZGg|WN6LEoJsFPNlcU4-_|!Ty-+n4|DGw^_rd!RXp6q2^Wze)Fg69+)^&W6o5<1gBmEu zR!<%-5qob)6OCTw#A2^6q$Ppz)Zs{MG{gFBw7fntW+Qf{qr7GIi$Fdbv7{=Io>gcL zTYvnTOfLs$x_nDU63_yXm^4zFB5uH4Z~2@aQ+pPT2oi|U;5_m;3Yx4;8^9n29HX{$+Eb=PM@NHoHc|hVJeok;Mo<;o&2pY7y~&O3~qLE(T@}KZS@=iu0tgP+ z24B37{?4qPO*vP|6g0Cj793L9NGc8_wqHx)D4FM00qpZRzQDXS4bhNI%Wei*<(~X2N zhdZfA$O(l#wMC8VQdbjKj>Xx-bpJ&vrgMm2#{yBh&2GP~5^LJIWj_T!*pVT4WfMq4 zjP*R&9jKRHp4(SrD|fnut3zoUdK4djk+D%RQAXXr-*MIcw&@IAdWczZs^HLqs`1uQ z0i$c0Vcnrkzo^0?%tICttcX%ihlxw%5vdcQu=Hv70RM)peYx9#bR~ZhuWDRYW4h3~ zssl2*0sZ_GJPM1_6l-b{MU9#JjA9p&Mitykj26UV=auE`W1h&xmWR|&z6qQ3O0m;#M(iWgvXtOu_8-pjdJZ2ye7zyVV^Ft5p z!m#2>I?0&)k_l)zlsbaj5!Y45BFRs7YJ209HYL(6`}7n0!&(=QMS}ptTuMK#)cDL= zV=P#?P#*N15kDopgVsN@S)pwec9Jsh^De}`s^uIY4x1K#aOD!%*ZWcV6lsjw`1+w1 zTvgTcs{JHFU-BPBCNO*HqtCMVy!Bh~-of&Ad`_Avg~{V;dFxKtBOZNyVj~UWwFZVd zKFyg7;cPTdkQ46c$p2=dIL_S9+%Nsz4C!(F4jtRO$wXF6Tu#A$JCBW%U=g~1-ZEo zd(r3FA1F41I8|yB^`?&2!U}NGU-Sen<-s-nV3v>9jUY}Dk;lt(4^0zP+{+-gYpA(> zDYb_AZ~>xlBcFP|C4Nd!w$-r)5`7qb7s`D0+F0vIympda)5S{vWUd$wsA$@_2gF>& zka?!a8|kORWv1MG`Y0x4_x6!jo%eYR*sU$gHPRQ{f_kfd=vz4~4FQFp&i+G$^T|=b z`K*X>S4|He?L}1@9S8H-?w?4(_=zIeUOUx;wuLh5q8U60XJakWNc$(KmNp_!dyYn` zdvtgz!f)UfnvdthhOV{eyNz(br)~2pcn932Jn7(%DmoEkWx%o>Ou^W()!(xZrwx95 zFn4YIm3R3Q5L!vN6FWrOH1yPiHYpLw>T8)VKnDgRsDFvc?&#*Sx7Dz`|Yi!|lp zoe43ui`uk{!k6vt;biY9tczn47ZW(JF_pt&^G?N(m&zo#jp~?u8T!c6(_;DR|Q z0z)RCn^!9?mIdLvHs}h(DuS`2?sD3GY@CKhivALB?^$f!KzYxeM3>elK#ikEwZ_u|bq z+A}f43&Ocn)Gnv|k`#ZyBoF}=Vijm7=OFy2P-|Ecz<8#62{)a%`og+C#OJ~m+X2Q?u7@9o3j0T_FJ`=o30}teBDM< z=~%tgZMW_e2lX6R*RS$>bK1A+!9V2cohc4SJEEUt@uC*OQ}b7n;<3%nB{JRlDRjo7d=sY4_^?0--;l|pdgk6HfH|wIgZFDNIe|jQdW>0SX^rq! zC7yY=M@AD!D+EyG5l*p(h&j$FrDexJV3~qyu-c{INkFK*OpkS zuKgM3eXwR;tW9$HIHg3w1R#S1%Fj9)Kq;1l5}`hKy9NJ>Hn?A4o1!C3+(9`wr@Ra_ zf}8#;K7JPk`@%KJThN;BgJLfWG1LlpR8xYqDia#Lrfj^n_&k}Fe$(4?9%WWS$)hz! zTw*g(EV^tPaJ-k!8j#=Wr8&-y4_A~8SFHon3ic=;Bc7k?!Jm8|(;6K{2dSjBp@Q3$ zL(bj!3Lw!s`uo9u<2};19+Hczf(1h7oPzn4{Cpc$>#FFr_c8>|&wXtvDvnnTB%Vx(T_B&+^-U%GtZ;kCh)^r2?>jeBc z>;5kn?*BPOV*78sF+a^@|LgVtclUnKpR!v2h5jVu$8EEPpteI zB5B(HuOSi)wqLznrhj9_0pk}JV>aeYWK7b$0F+8N$UIV@2IL}JtQsWMPzjSAD!v** zHP0wN-%u_{(Q$>vY^7QfxtayE6rdTHlr-UQba`^4D-^gk7JM(h zbk3qckt_v4#*@gR#CXa@B$0D0=KfM=ET`XROjcp-`>^TuE1j4kMGFj#MKYAtt|iJC zgvz5oM9XDXSj=$93dl^@2|A!2f7MIu*8D6$whp^V1EoAax@KuqEWPG7Wlr=_Yhkq1 zB41u1D3txfs$jD4+!^NebwzQ@LED^dWWeK~4+Jiyd%LdOj{O04dyP?O?kK5!7_h8XZR=(!W^) zd!Gd4V42|I;RDCdmPs&Pn^7D<84whvR0&=N1M(PHeyG@V6;{x@0L#}5%_cKaV^iu1)0B=OR-$U=wb0bH5W# zv1>(wa;i(etjD`(2Yxd=+|y2v$D{YNk?r@c(KFdd&cMYA^oLeamR)$mp?`G$!^VwI zpehQYDcd2^)+suxZnvi=iWUR~p;saf^!|l;Z4r+CRcw)ntd3!2+i>K`f*yT@w~9mk zX&>|8xvEW@eQv(mf5#?myfK6X*;VFjk_ z21io10b~%Mmf0VnvapMW9Py5H^jEa_>G;ryQo6-4oQyJH^b)_#Lfa&Evh#t+OHI{5 z>Qn)q;mCkq&V+>%N^|GG)qoZJLc%+Yj1)@F0o>Nq)_Q*E2s!VM{JWTPl}9HYplGwR z+5utVYPfpwq1-^)pdYX%+gn+l4sM2~53~zKqMWw1#oo3& zSh64ZHtVyGv3Sv>SA-154Ei>tWu3s1|8E@wgv@Ng8BD7ErhI(^5warQL8h=l+EFK% zVwB^CVbiK6^q_hZeRpt)bvYAuUujVjEXVAuj#^d&LjjI^NQrR1mBdDd8YP8vKEEwx ziOzaR?>4v_<0q5aPzQ)p;cC7bu2IzWPz^a_<=#LfT0^Owh9f=29Ia%l zxsdI}h}!QcZ(Zz#^iJaXJ^(_>+Q;09F#F#1-85@h`l=Yx)sckLfy4J6MT(>wMG70J z8JV&~AA+K7@PlGx```S@OpAM%w;VTwNqYv&5HjTF1S|zDP14*eBDGNM&uyRd4B7kB z5kmf^n1;EiHudTjILovaADv|J;sgq07`{^s~iUaS9SOZ3XM$_{6YB0a+{qUEXC9qS>G#h zcpgw;e+S1ipP4w6*fIU9nf>!7-J2j`2YiNQ1iRNCNrnaDI2=iz1!5XU+#DfNvO0;q zRtd-KyH}H~9xgpVkJFYY2MqZU{?8mQq>tbiIHwe`5(!BdSg^+wQKfdvY z|5b~YtA7?pwEL=)6&~K1@FJre6*}_R^8P6KY`Hl@aIOix-Rxc#0+D>ZlL{?oW(SwR zbo6iP&(>%q1h8R{sKB`+-6XN!jGWPwThpyT;BiwdsnyNCf(Czu{J|kpKj(8^ftzV za>=E!WjGf1J7LNKBX^j)og#f&fG}-`-->iI5J5?w;qXZ`)6?7V)x$jK%|4Zi8+~_r zH0}7o6%~{{Ac)cpcYWVSRX5p+_miHz5}Bn;5_FzOA8~{aYtv3qF6QVo4DQ6;R+Q*P z^){{|CKf|C#s`R+cK-eE&6%0$N;$afR2MZ_HknAHui0H7Jdo}rj2|A1z!vR&%1h=O z=8_v|)m1b?1$TNdnGoORb2(3Jw0~L9s}|HxE8-Zy!}Tq+)06n%#w2s?DXw^{wl9TO z^7p!PKFYj{|73A$aL5N=tYdR>R86Q%WZ!2`)8$fT^UbZz;rnE7_d^hn%u8=;bxzV} zLuImJHtTpO9)%$(&CwN;gd5`w%M+30*FhkNhe-ej=0q00u!|AN3LyC?@byzk7zD<% z(Ot_5m?MeBw1>^LkQpRyptGae&d8*kXv?2Yk*vAdKGpkV9H8nm6-UZjts-cf1{S7? z;S-pD1-MyfJv=G4-D5f0CD+o`>O{yfQUvr_lI4t+dbURa5_(6v9xbQ}wvm8bPhI#y zP0FnnpJ`fEACs~ z1-u>sHMAwmfD$$)C7m~;Isre&f{li8GjSNNHOX{4q_gfPPxP7xS1p)B_BAi*>NK`b zOR19;dRymc(?F!BXd8+Wgx9_rXI=OVFSuKa1{};*MIlPJmLj6CZg8@9 z!ITgH{zBq|jRv>+l}H--ib5a#LPB>rz?vXB1c;t%TyI$GUmZ6vav|aqMCjG(`Lix? z6d8Nw;iJ&fWU0`?8Ta1)Oc(w%+Xij3B>G(M$i8ltlHIU?yg}cdId~^22y+92121|d zHBo&{%iD0|gvh^b3CvWt1OSqf-+zcRRr4EW5aOLA6x_WF`?I(|wS~rbJD``xa=f1~ z&(e_~a!!fnKF>EyFbCPJ4PG_T5Tr#K{ou+V)upo`0XQY-c{3OW`g#6PycEF1lxNPgquE|#&B~i6Z^crC zbCkFZf8rYzw@NM^C3m(1=0>A{iX)Kw8x8h$!f3AgQsrj4Zs#QOZm3?CWac2UD<2`M zq96SLCM-!p_%s)>&#GMD1Z=9GF8?o@P&&943>AMFQ78u(B-@FL~C4x z*SNMme9OJt%*K6y4`A$$`_{h%h=t|9-CF)Db7#FtmSC*Oy&A{gU`r@K3MZ zpMZyX7wLqSE2xse+*AVuJ7dl3_u@-g@x?vfg=A}{C+$_M2n37rBtx`ui35Eu2yotR zPg_?FYs&Q)Q~}0#CjlE%1mg7sQz-$jL~!*~xSPoVJEF9%Qei4F39q3sCH831`NDh= ztf4r6+h=3SjSt9htnYG&52*VrMx{CqoGGvS>1fm_jkv!Ko<>ab6pdU^XTasLNX+pH zuol>4{n^dHF8P7p)VOySNkZ=qUkx6Dk*RLtsn!Fy-km?+P^qu?+2oVVNvRaLpkbmo zgM$e;VDj0B=g6qV_oEw0!o;xhWsB5NY&A4O+e@VcVMr^m`&BlnCFUA6Do5(8ikB*9vbq@JFtToyV-X*O39v(E3!U-lPOY=KL z2Y~_;FjwbLqX*w3i~b>945K}*8@XDcgvI3=NCzAu)9!foE4xJE6P+d zhTq0Q)NgOI`Fu|xAS&9%4lf+V(_r@Jpw@6>>i;PmgPU{jjXMf*hd)z>a}|+7K$g$n zPd31ZwOvE&_F$q7$+yu^QFdy(YO=MO-iM;`i*HgJs7gf$#`O0fpIvJ$92{OMBM;?Q z{19#cN;_%aFItRTrY&+w`c0V8nSZaBMpAfM*%0Z|Gr~uz>etH6^}-lCzPZU zli%SVgBAmnwZ9o$vzhF!U*WfDYV9ryUR#^Cbz{-k1;v{N@Dy9yFwK*P?_K*^-0GcBOIT; z5!gCWM3q+l7~&(QrLm0kj4tWK>NU8Da_#-o+G~fYkmr4$2km*Qe;6}V9BH_D*7`3Mqg$qzT zp3JX{4$*4DHUwT>dc6vh6j!@1`OG|}&cYUI)4uC}*DXEtZ^Rualyl~2zL|I`HcY7)dQId5B+Og=DN5v{ zZXP;XaYjX2`fxO4pP{6fGi5)Ffb(}{t;zFL#8qdlXD}ngb-fEhBo11!abPfbIXQav z{!_Pr35T$lZr271UueIFmwV}x#cBf*<*@Y11?#BI&V?O$SI6X(KseaAYM*I#Bag@` z$>8ZaPh4ULQ%rVQ>%dd~#*grOt|WlKpvaDqOw=!@wz6$b+5R-1dI_$gi*tL%w{)oS zW^EP|uIyEogYoEOfUBteEL^+ru0f&BkVzK*MBIYf#zezw3#6d#E&mQ;Q6Ga{tACmn z?RQT`;TS{j5tBBE{JG5m1DC$L^ZO<3USkL0zod-qU-&P^pK$koXs})VED&voApAgk zA;$U?^yl6W;{}xYq_YIXk=dHU@y?0V;w2+Wg%~_RR3g5fryWA-Q5Iyjj%Ni)`O>p+ zy%{-ar@|v`M2sFj$66{9?o+rhf^<$9eHtZ1GbLqT_QXIZ6BHs<#!gf2BARF#iqq|w zSrW(-jHG~P5P8*(%f=2YR9XHAjJ*td=cbx(J|8Q!OsyYEyGTPsI47XK9tQ@;E;HezAx-1OnG7hJt zG=<@=FZI_+Z=ISYELkS_2C_BS0H8~e|3GQB_zx6g9kSnN^C>g(g;g{T>zwtXIg6?l zE*xRI*ZgC+q20d}zzP6x&Y>^l){Kh4dh zgga!LSy5vPZ(_+1WnR(}z~rAM?Xwrsh^tj1mWJM0BaSwnC$dw1m{4cKIQr#y3qDA{ z1a)9TTo*G)IUN(*sA1hGd-|gA@!5oLNuoUYh<(I}@#n>|Pg(sskCyfyGbA^4bB8+; zvAA%I;mZv~%eOxpJ@4LbhED0Aq4)uC*RAu+mSk zmRD@1X4Sp{mTi|=uS-yL5^9-cH?X!!X~1yTuUb8OdMZ7lbEP_d-M&h@QXhF*#|yF^ zet`X1>`+?uTK@$ss_7wDSv#yLQG)zyM0-FN`_Oq=Z(;sP3B)(HD9=Kn(2#G=U2z8Q z%(zdUw!tI=x4HHvSRolvz*HP%lC0BoG3+`GW}9&Z2jm$7K4xKdaTTRS*x(ozLp4P> zC`~J6EfZ8AlmLa_PMV}`f=Ml}eB5(1p8e6CAPd4T1>iGlly6T*Z_G?l_5gwi`b>D3 zL~ocb=mc)W`2QJn;c=P(k~pk{BxR-=Yl_(2Rbka7%BmV#e7e@lW4 zbuM*(99;;JP`)8r2_kt&@T7Dqq>Z!6>v5Wl^$+Xw9mbi+&f;@mZa6mM&UtawB!Zn5 zCW6>4S&dV4$f+T;-;-(P6)|k{JiuscP#K}^PlAS@BR1d!Eb+H`IuQ`M_N*nk<*!Oz z=cNr{xFpnI7Ubxr%W$}k?6C|**Kn(*fz51CFrs<3}4<`<#z8sY|`&UERpF_0jMm>O#S{-s=Lb)|W-@#{jM7*Vp&a&j$%J$=|P%#Ue`Xk>fTx ztFFML+!S`(e$bV*s%of_DemiAN9ES6(o50U=plwGCMAjQ$obg9g@cw$N8V3sGwk4s zDIK(??y~K16LYSv(wTWruF^QIr&A!q)6%Yej*~gHBLqbByQ}2|WP4ielIQI>7(MZ)Ex}FYG_y#~3ScCu|TPTzyiW z5}^t}1d>!sa@ijBSL@zBnjtjg z7%x;3j8$A4787T3#dz3;KbXEV@6d;XprKX)G4o@hW_JNCkJ#2Eg)md4rI=$?K})AI z+`$rXi$h1h*0NbYP-WqPi{UQ9EQx$6nCK+vaSE*d#lBAR0M`?@J>;r6Mcu1>AXqnq zXenQjqbnn2xxFdLl{aI6n|7(BkWL&rSpyV&&y*_#6$@)s@Rlt{byRDUy&u?c@X zFs}a-Jjf3>#|U*vqKkHPNFJOQkbT+8hPn@QqAvd6YQL6HUymcG%7&dgR; z^#`K%UAK*T;=od&a-!Uxxcq(dQAYu|4-HbaZu$JfRdpi_GoD5+|8%^g%L2S{CSwX)DkR1 zV4I9uCvwF%zPHn|)WwxheoqTxg8-V=uy?Z`xw&vhnDTCiy}sLdoop+rPa5GItx;rD z)tCf@h6_!GONo>vHaK&?TYsGXk901#PO{_} z@K~qu*8K+APiBZwQJ0~z{BC6YsK?i%2F~fm2G5_S-9CQ#*j^Bt9xt6Vj+P*5KzcAT zIZ*~)X>j{8S)~4GX%s+2M%BLoMzyEqT2+Ng_K?^MPXrpLJR;w~6iw6#wfZvMQ8&^j zp2v(u6($i*uAetY8>1pF0u<@v<1sYCZ}{-V@yc<<1{+}G#<((jl!LEvzBuYG$V#zC z!)}^mM%X7V4I`V75Q&;3JJiw?4a9x##>Oe<$8NeF8AjTo8Pr02MJqb*t4}%Vj68ks zXSOzc^w4Ot`2d!KzER#~PX!YiM3KX{L%wgX^D<4JP+{D-PwrNQMx0q1T`!O8&ZwrR zG9-B&P$3G*j+IY?toNXR^Hj~AZ-KS1btPu&`Pp75wrHf^v#1em#|6sskDV>XgcF#6 z)!yCx4DSn|Q$3gk>2%d!bcs?-xuS_(NZnyU=q#T108ADUPnUeMRS*%6y98B(r~`j6 zm+hRjar%>zoh|p6TLoKz{THrvJduR!CX+{#DnWUgf+)yFMg_F=PgCsL2NWnAmQ(S; z8;Dy;i6{CIA-yn8PQ^GsgW;t4HvMGY%76&x3F5P*F|ehvHTX5=X&;78@3Cbh&J^u= zZ4EdQ7n~wx_-Fl*VF=|Ooia3&S5r|hO9vrt>j2nc7l|u5K1}mOE=#$ZFasn3R;F+LIn6Dht zhNTf(GRDQk1R#KtfWss%onVvnl_R+VuAlZVd!!@;@r2FF#u_B?;IJT^ z1QaM*QYNeD;FjQPBubCYIj3DmD7a#FXNizge?&QNS=U7~>j43>D*bx}^>wJf)FL`V z(*CJRr@wPfHayO7#-ljpfFuDLqq(dH`ohX7l%CC`2#ev-%(;9XVB$VaQr3ZJj5ii# z3K~<5Tt=^Qn#u$n;fjz4x|Z<8|6s3EdORw!)2i%}Ut^(fu&{yDDW$X;;HyyW#I|`S&LJ+bHdp78jYezB1Q0<~_}><<8o+0@};s zeBcDA4{WP=V})Daa!*NEU@SI$F*Ue16RJAi9}{AdY`fwapy8 zFD0v$;af9s*?CW(@^5c$dEe3&5JX|Z<1qiY^3$ zHKJ|0X7`7^&Z9DBotg-fRQ^0F#mp1u)hChhYS2$c*X%K3 zBt+#s>EblPacHo0BY+4x#{ae!!X24v$X+RYBS7JUHMdc_Xk8We;cTNHiB9a0LRY$_ zyWFg72k@YH{|%|7#`UdpNeI{Z`W}{XiE!!xKj7a&gB=+)?y>4l?5Gd z?#KWw+jj@Z?|`3eWt#*24Mm!_QJmyq`Sj{v0jXRJq0GlVSVJ!Uz)!5x+P|4{aB^CH z9W0-~Yw9vsT7Um?zO^I`%4rm%QT#BMteG(SyFd0e-D7e&&G;`VVffen75z`G^nWTP zs{fln@vcfW8&H@p8K>od?;zL9d`T1p&)!zj!pHJM=qX8ngda2tVzP{!-K7P2%Ks zsvyxUSDqx*c94*3HOE65YaWN;mRW?he#^5;cbKiZbEKf+I9h($s}7)t=XAYV&3ky- z;?e$e|K0$7^scrw#yi?IqNq%uN5({y5}`*In#bw-&_^vvq@i4bEn*pe3uMF>4HD=g z8_8>!UX|}?z@eM?ZXDpkw7{(I47 z#Z8;czNYzR;Fb^(rAPv_V*Q=>TtC1(m2k2ckYX50N>H5{579&}i#%hslrV97*`LWU{?t8{oV>5s z^^G~l9Oyo$ORK+tQx8TK3;A8=nHT^VYwejdAhl&fUAmvAs%&|#Fvv{A=2-3bJNuA4 z`|7TSY}jAsO2asOV#5qIjq^uBYIePrE$)HealeUGQAO6G$N2b`iS8O0>U#DJAcFby znose%Q(f-}3`?|B*)5TWPcJ}~jD-p|m=+z|C!s_Uj)X`&0aP1*k@1;a+~IHh0ynze0@?MVg#_fR@M?h4UKg#m+O!z~ zp1~7Ad&#B0f=v^6;sQ12ln2n+3>1B@oJzOH{Q2p<+B|`-xeZ8^5rer6;?Cx#)skP- zc?RZA)08^`sRY)$jxrl&^p4!}bu;g^la^ew%i^a%CK2!pTp%1ER8)gH+Zev`V}7gO zalR_=9)uZ*Q>_Kp$`<+sKPaw7hnH~a9stsdT!#csjfr|EzWwcpXqD^7qpm8U3UZKu zg`tSi`PJvC3Nasf#?*Hdsf+bV_>E7-%TNjZl8BK&b<||Rs6BJ4 zr*1zA)$ilT1`JYrlfME$*IGGMJVaQ+oER9non+)nMf?91|7}dx*V5`EmmA2+vD0r%y1tBi~6e` zQ2aPUAcJ2JCECUu*fiAfJW$)%3Suy1eMoY`V#S0Q z+2y@6L|vxM>5xCQ03%D1sK^MI!PB3T=p^eelP_-0~-Vu|e~ab7j*2G4G zWSKyK5_sl?PlWTwm}nU33w#a2@&IQ3JWIrA*Kz23Iv@qelB8f=XtJat8jk6fZ1KNC zKrH__!k{GGYDrG8^5wDPOH-6$fvnU)L7c5-XJ0+fPG0PlsZ!ETey{BKfPZ+xq~W(v zjO~WX-t6?QaeKO8Qg2u0BUI&!K5z`k7S7W0XeBo`Ht>p0_gl5|xWe|DO4s}Z-b6`$ z?D%G}1{r*VGk>7r(Qbb^v{BSfeh)u9H26BddMWp)xjoJ9fLnEa{m%ju%TPGg)HN-U zoSiFOTpC&)Z!g!jE*mz-tCK-I-|nxweMk3feSGI;0*xCT=|dRko-YV$WAt?~T(%gm zv7h)KzT`hCbL$pptCOvi zn}vjJ)dm@m3$G>hxI~#hwuxSYx1%gE$yT4ue9E_vQYQvqk7Qh5iw^)lIlvC4D#(bK4+rU`9%Kq`tQInDM@*JP&&QGm=@!*3(yz6z zTfeK`fXm|BrM{$H9LKuKABDft`i-j0iw7ry)nT>5;!s{DdW)<-DeJ!4NskHZ?IFnc zxnpprIm27&T*1j(#n^l5x~5Bk*N6uH+TYrW)oE*N zs9$nSfWLHrBMpBk>4F%}Oixk!e*h$pqNbtPx_y&Um;v`B!#W8y$!G}eunnArSuKH@ zk@S;L69U{(`|P)iwW=9GNNEPd41SEgJI zwwT1F0$rxepvE(X>+2P}bX(d|kDncT@_1agmn9V52uhbrj1YA@P5F#f4o{}PO%Rk z6K#N?4%(<6SWACtjqVP@T&>cYgXTB$y+e8=36P<6Z&Z05)f&7J@u6KeHb^9iBri)x zXtV0&6#$8(8|2PqJHYhAfF(j0h1jB>5XJLCixwM^?pEP}un3Z@Z1Cr#M>f9`Emml+n%`1gzX>{!uMYWyrzKv#%WY2SQ&# ziPl^pYA_FC(VLS;K@XvT;u53yuv@rRS^Z(V!CGRCHJH1NCv$T~6q`hLAR0P9&J5>q z2|$1pUq5QB4j&@cn`|HCPky8LhV$4G8>%>NrDca&%H5M|92=}oidR1?d_O^e~n_tan*nv8)82Z z|8IUm!w^Aps&K0{cbGIQQ$f5(FzjVTNm+$Yvo4&=ftVqdyjH_i8ACKoU~ogfu|%9M z1v{+5lsn@sdjC|4z`+P)=bdJhgWas?lICa=?mA2KQ#A0;CCU2ppZ%A$GxHcvXE~x= zJhERdTLzzfB)f*Djp2)-XOV{Bc|GLG!7vLXB?L>khb*1VsajrU9;a}L(5y|-Ig8#= z$0G758A>kjtSIj1Zz`KgM(zUp+hF`&9bUCKK?3+`!h@h-5<^FsSXm&B zRyhj|`H98jbz#^LqWw|uA+#|owL0*-rs@K75nzT|UHkiiDbsxIAdnqLP$MyjWc0#? zM?)YSgbD3wX^`d%*~m9we*|QvvObi1e}jL9MqL4YyxFg;-mF5OeFb)h~QC!a*a2pAsp?Su8_bOQ~1@+1=B7BkkU$D?qSkf{BVEEeus-%xH6C1Sg(N zuDef3KIUKB=YL3ftrh+Ix-7z&^M`+x^mS@HccG0sEG3{IAJTGEUlm#GA=k_%f-HRi zSMoqyJ}AcKk{V{Z5K4NXV6m{uopVLU@7Y}RD$Q^@jZuc5A~o>BUBGva zY}iy)Y;PzVRk<)fLGmhN1B^n@?OjVri{ID*jzWG-pwZB%-&ZT_{Lk~1ur4?66+*kP z)m`=QA#brra0Z+0ard3moTwj7t&~bhjsGNi?yICt2-~f4pI9yZKyeUgWh-Fc|RC&C- zRZ)QTHwd|L(KxAE?*%pho(!FAHc0(Sdm3rK0%eMI6%fKOzWuP(pF25tM$5D zP9CC4^sw)`Ev5q=LY840$gI&5Md(AT_Jr;bEBqU1!|amY5Qg_~_Bta|NETyel-1kh z?Hd-Wr;9sFpNf!LuI>*N$E9r9!rE_;?99=_$)DhKfS)55EWg3(gYzo*oqV!fb~hrZ z02sr1aJT*LAMglBS%xN_ZMYOmHjidRYy6lRL-K_iLU#C)YHV-n=G-*d)jIa2OBe)@ z?*!2%EH~gnB#BpC2KNeq#Epna6=P#h#Y@Mh`KCXwmgo&z!yU@J;vFtW6Cbv6!X0lm zO2gS*YZH8*{p}I$vfg!k&kn-2eu6g6R#wS_Xt4QM!-e*XofLh>?uMrue}Fu_+M)i5 zg8FL*`rjs^|B~Y|v;6C8#$OG?|Ee%EBh7|nHtYv^U6!s-Ud9-`8*-qvhiw8`Gc!&g z5aXP#y#ean6;zp*Djhus((4CB{kZah8q3|3{T#0qwN()%vki1gsHZ}`GiuHbQ=`if zNhC(0iWnHTV0=5w<~dBZI5&@TbKpRVzk$rvH*N2PA^awf6e-ku&_L-JckS$wH|A$J zBfT0m<{zvGskh5eURz$}?DdE!%~idL@oHFT)~iY*rjqosiORm4G9^%BMoXr7m z$5YER1HQ*3=NKbr zD5B%t_7+wc3EEPMx2-G9xJO-*3(nM#n(Mpy7L9V zg8&s^1(z#NrRkMN;uY2HC#$3CZhJIJ0&wqR?{0!`N5kz-nE(l=4nGnQz^$KUny3yU zfP0V<7nVgrijlbZv4!2E(%M676iwL4-E`4Fe%K)|TR{NlKXjb1SYJWPA0F3qr!zX>lVCMx_0?D?7wU8wg?>Q$oSKSLd zeDs%iV!sRJiRSBc@Xc&1AJ{`X=qwdn*$@K1ccHRDBbp zeU)h*S`z@X-$L>30CL=l+$%MXBpO`FwV_7(Tt3&d_ONTvJ9v;n{7qKE@_jwgMh@#T z@!Na_jd5n~-#jYzd=$OGVJ_%n|Gq!oHfCcUK=2!0`-BjQvxlKiGX3#(P->n{!|-i_ zDt%tW9ZtLeB>;i}@Wh(tp7Ng*@Z$SKVT@%@`g9_1l9U&{> zQ?x9l^vg}nW;OP=gTQ8z1KS(~MsaEQ!CaHNtS2U99Tabuw}sHrT& zrnHtElyo>+fI=8cdu%WIwNuMpJ%@>dpe)m3D#G(D91PPJmd*hkJ0zl;`&O4Mst@;& znVDqKsxxy7_WJ{V>{&{Fke+zqp9nlygm*kbVH2>tMOT?!z&OCIwsi0M&uDi=BlqpW zO4|bitK2zQ$?iUOgKrPx1)0OC1lxC={XO~ZD>o*zIkyC33tG*LtmB!96wP}m&~1F= z%={z@t9lWo_nxs1mgb%GN-L_ahA+@b+(DD>mAPXoV%<~bKSflk@2bu+IqS{068lMm z5&8!GjITYd{>WWo4dP{#WaMT6*e$T#qsuV%1($Arg|ovC#@b>wE3VTOU@#k7swv_T zQW(nYh8j9X=@mLDqgqUGXGV)0_Efv1Eas~c$@+(4{HodWTqAtKgjvC$l10qZKD24u z+fxNB{;;b=Gl2v{kV5U*HR=S}I-NqRb`}&Jm?_A|B1ao}R&QwuW$Nxy6C@zttVXhl z{YnwCgGn0oxbdD_EY{RN*v44aw%+0n>^R|Xrc_ScaaP^Pc?Adsql&ZoS>o_g3E>|R za8sE<%zY!s{*Cn$U9W}n1v9Yf1NTpm!~PGD!$ALEwLSlDUurYDcH&0M-Bz!_0aw;y zB011!0+S5s%4=2|yDoRT<$K(ulO3{CXb7P?5Z6ZfbFV8}XAyb23wL%nZqP8$D%>Tw z3x*6X>E7Xosc(;Wix)~Y>4jeQgp)&O=9m(gL9$dsGIRoQ&ZZ4nuT-z6QnURu)kKL$ zOPn}cvOZs*u{|1zL9L`IWIZ=yv2z7^5~K1s+ZOfvwDR~uhkyH}%(C(Z{NwwTBFD$m zGwrNE3Q|xKFaeqY4j8>yYn**t5M_!2t4#X*gU009vf4`8M>=#Vb;SN30}tbgXYQ-9 z%6Sa!6nrj%^@I_PugWDEZZi&pjgIRjrIJ5gk%yqC+;+~IBMCB2_jRDk8I5|T70%MM zq=-6sEqP}GV|v*T^QN^KBax`#O{V^KvjehRkzz(pmbj)c(ZL0G=A?<`7Ev9vOgCmQ z`)2u0QA;gk7BJiD;R9zd1hurbKRif#kF~sCukY_4zFj^aj_*$oaO*s|NI#$T4N_%Q zm|ZW1%|@jv`7cGP#3f}Ba>4aENc(*VN`jG+SNFwVdi`>)`s8>icHlR1K^1S&E!)B3 zViL$Em1jztm~=b-pgZuF&o6*!iYs|bxsNF+zH(j)oEr6JRKD=VR;TA(eW)Pt{b^4+ z6*H5OGar)`-WlOW6_L2g@YNz18=}Jm8Zz8&GOsCv=i5n_(RBP|)tIA=o#e3Tfd%%e ze?L%_f(0u@cX0jkJ=SxLZoLF<`s^XY#MHQ@su@^Q;3Wne zuqfJbC}3SE5@;P)1r~BJ85HNK-#J|gL)pGx_bkm$;=$v7*Q$O{dLNt7Tr!vVZTm|swe8Ni5b>E)eId(XyU*F zDFh2)K`JDl%^(S(@ZsTMHvCzbtLPI1PUU#R_ANz-O%{TS*RL+Zbe|le@ae9SntOFcDH$vAI2#BFjx{BDrv*I`pbB2n)u<6#eUA7F%CM z9H90k{_%&Pl+%aSJQKth?Xw7u2vZTZm_Se;hT=l&0T^&YiZOEVw<+FHZtg9y2&S|x zXP5e;4WcqHED(00sw>co;B{Sx=l9(-K?(YKkaHRpWKdDh+kO~Oj9hS?JF2icCv4R) zXf!#}$969srZ&=R){c6YCPqzQ^51grKw{%_UyjXpfRC&x8ezmRXD2HmCk9y#E=-n8 zoKF@5m?M>rUqbjS7tTz9S%+xd1xWQ8pbj{(V)*lXexWe8syy`(41ABl)>$~JHgzIi@B>Bu zhPg&gg%FCAlS!NrLll9?M;WQwL}6@#AVvZGcj%4X*01Y1Azz~MC~yHL>Z%9z z{oKhpgr+Fqqqd@t=xs+p&+b{?pCij77yqsmu}68JPC8Khk5Ti zY`lYE)qGj$aCczvjo`t6Z~(|?y>sFBpE^F{V{y;zMeN*&mKc?fdvHFTVVQc4w)OSEDt}n!JD=^opgvy~;1)Roq z!v@)G0?aer=w#;G#?aeTHoop9kE1mr_z+n3B?SR}|MLx%w_h5G&) zN2vp9=(fU-icVk{^3twQvfmaf?U}E@PHj?F3LegdF?Zu3$O9f{%ct+8hgC9n%Ka22 z26C8#w0*MMRo%_evt45N0}>-ORT(H?Zk9>k%u2OnFCccrXH^1Q&VmOHfD}oTW}E$OM*?&0$?X0R57rE% z?~BdWmk^|^ku9hXAIPoSSMtXc&EB|bVYBiZ@yaDbQs7jcb$?}=0{db`=QB#aAOer# zg2(YOQ`V)NHO|?|vAV+rqf)S{E}-;R!coim!HIN6n*k>&kSi~{@2}#}5np{iO9HvH z(1yU)DR731ncY%^_g?{JGH)Gb*6<)i-qfl4v?;*Vz3g8WoS#kDf-Z@6XOYMwX*;*h zE>4H{&uhMb@8(a#|9u!?p`-uL5RLz}|1!`q{cFy;S%o z?1ig6PohHA0+R@}ssm0q$fD+OxL9GpB1myk9HGe4y}_Ng;La#`GKtE3{>eW#yW?ZMwT$l`xf8rkc>%doUe&dRS(OYq&G4Z_~hC1neq(wP)k#Docns1@Xr?2A0RA8(`NX)0cz)A$Y7u`qA^O)6> zUMOXOsHFv?n{UktfXUfD)c2pZLEADcYhbmX(Lf18OyB`cG_-(4PEgz1SCBbQc46z` zGVhgjNRd=TBdn-kVfOurc?AKvV4Y!TF(dt`05y1C?v!uQkQ`o+E0pX-V?9oYcB>0W{G8BTzm%+LLxcn6 z$(rcEW|5X6=L-=)wPYFjl4qCy!oaNY8*9lkyg_kHr^$S904^274@-#m!dEc z+;&Kowx>jhrWw_OXd77AVDsTWhKs%GPB>RmJ~h`I{ieit(hxZ)#5wJN`|bsnA(rd&qq zBR);n*hm2rnB{2?!s&Jp&0K?Rmo{dVasYJr=ajLIn*wujn0AMS1pWS?2(40x;E926 zR%?jC`Dq{`&oWt5z{DY7E@9=LZ02O^QQ%R%V@6NTUPY{|QTrcb;m+RMFwyC{vJOk)(Lv2ZZuJWfEZwy)3JttckXc$2Pm-Pwsr1Kf9@DhvhV18fx3>meNCG*}}Vg(}(4h#`;w0^O6f1Es)=kR*`?cnr-oZ(G8R$hutA-3~K@bjO#xx0SEKuVT(7r(Oqn#j0$axYAkfh&i zE^3rgScD}g3Fjj;2%KpeQ8EjHhYo;IFzE-B(x`c!2&wd^3b+gt(5@m7K;t$5 z!B89{&$O~I>AF!`(`vLl3h9cRv?cq}pbCx02KvyU42^4q0kg7U`vTMoaZdrEyzUTq z%cJY)L|R7pqD(@K?WQpeL%MI(45O~Ztp-3;V%x!HCxD(?2r3>ZGZ3 zdG*aRv*=Hw3o50PjCf$rMyQ_*48(Zv0!!)|YP@z8#?W8XYlNDf=*3<&(t_dSd>HsK zp7fyi{f46hFrC6du)@)o9>LU`RTS|G?q#o29@dvQ2>b0Lp;=Df1OZD-bqM-~Ie6x% zX&A4_2H@sTnG>(f=uwteOK=DlCjP zqZb{+D5_CLc;P2FY^KYm7UGZqP`MWuZ+CmrbnK$mvfO9UP3@z9mH|})EPfi#6!FNe zrG*_6JL#xISy+{ua!}j*rNglla|t|n&Q`>Fquc9a@Ai25pl8n9wD;G=t`pBbrdtkt zs8A#S3&qhv?UR{&mizW-Df7a?UOpyO47I2?r&L=5n;^jVdsv=LtnGpJ6dvj09h7yH z%(hnN%b|m2cJglgVA8?M<=syETXS!X*Ejce?J1bO3Zpu2{0R=I1Y~DFz5bFJ)XOcTQiaP4nKdWId|jlF1W*s$_PjvL}?tK68Q=7f8S1Mxnn<31-a*_InDr zdx4gXdy|TBs|C0L7{RXCnUPD~%LEZr2!(hqq_a~~{b^)g%=m+e)!gsjl8c((4fulV z(vt!03N314@G+P62j?P}4NT8}0NxPxiQ%r9J8rmf6{5+*dyf2dDy(&6UHb!^ z2(rYOXo)(9&2*d;^;`Rv?WC{$?@G#JR{UxI6ct&TN$gl1v-Gj#SyN+haq-NBkq+jE zX@5@pyXPT@dBnVoZ5I2lT&}0*0d*N`3qm+6cDMGmHBEcKLJOBuc za0#FZx16LOAPx#@SpKxB;UW%v%)9EMQg6>zTk}kCWe}(DkR~_^5}&xjkH3)+va=!& z5qMgY_6Pa+K5W$kKEp0y5P`EmjKvX~4i2v~kF#^UzTzpuR?XGVu-hTqpzQz_!qt$H z3olj^vqN>zJax~-3*;-?9(I#yvu^pAY#&4|TAujUE&ZW7Nk=eiHo8Pt^}Eq$&X7fB z&(Jc@ag6e;ft4Le*QjMUvphV|4{xKT*8PpXUFJ=NzPkl?p85RD*6>-K!Ns6PUP_rPvbZ;)J4$0_dYZTI?f(7lt8!gNu@2^>o6BD> z7!|iK%5*~VV*z=V_HkqGNoi{ZOSLA*xE5^+1ES+^F3c{f+JLbgvkeyFF}P@J4ds*y z=49h^TvSgxV|NYCv`KwaZRZ#fQ?!@6{nSZ3Sdb0(PYR7`6+I*Df_O<@6dj0VYU5L3 z17Q`+4GYyWXsM{+w2Nnzxl_1BW+-4;kl&Y2-E0x&lj1%&+lFmn+;_mxQ`l zA1%%RT!V_&%HpSbXjyb>+*1DD^yM8c9dvM2wd9W-e!P}@Q1vukd$lX0_OC4+J_G3pS-Or^X1ID>6`l)S!Bhj@4$m; zs;=4j{_7_o3d6P?4a(Gz4VCz?no0LvOnm|z7NOK`$Y}?qPK&CCGxmVC zE(Va7LIs$mhB_5C{8^oN+z{S8`8H^q}8?I zu%~%7n(5VjbMQRvcsWM_Q>DN2sa8cWihVLBMBsP;lA9eppb#VJ2!v$gAhR`TkUdD2 z6;(d=! z3M6U9GWeR?7~1~^vk=>{kjufFN9i+3=G#7GnSkmM=4s#+@U_`?|^>Ci){A&HAO~g!qX|G;6vm8zhK-7B?8A>eaHk5$@m2=! zT~m~cByamxudT=@Xez%O%R??q1e3nBwKEN0yjyucFtFQ@oh!iDIJL=nA7%*fFaj_- z>ai`0pIcJpn}$~gReY=#cpg{lp^HmN8aQ^AP+HDUXegf7mOu;!%DrBenhkvcM5czo zc^8VoPNhD*PHnuT+sZ|M?uU}SP|MB;Fho$bBYY)oj4O|DWYVDKn*OwkXwS-9hoJkc8W(K zI28+)KN=!WB@0%|RsGCBQEejc>Nf;HG0Ul7WPGGx zV#2ecz=*A3qG9Y+pfqKP)CNY#;0;y_d>U*E649W4O_XBPOn+qQYa} zi(YP*b0_p7T-a3cec|6|MNC_3_xJa^v_zO?JpTkEOzi(4z4`yB3F%goOx$3B{@Xw7 zRsufBXjv`9P4&^TMJ&x>lPTWX&ctm-GBH`MLr|Pu)Y}69IMJ|@Y2|=yu4FFsJ*ES75|HODq)xu$tPhbveV(N)b%6o#bU0~>|lIJ zgV>)8C^t;?X_OoiYYjGpbfVZ|I&Q_8r>y3P{VYwT&C-3<5*?~^&9#v9{Hk-*>1kza zmKLZ5DGHg9Xl0M(*09co+JG05q2YeThVPVwhLd})=|kHrgQLC(jc(Q z34LCyEK0;2O^}v@Q+pIr+_fYRyh64v2PX!bS6v$(VQW%(SeJLuHEu_ zV*%Gf80flO4gfF1L0BP}XBY+5O1fJ&jJ>trtxD`ODIm>kw>54EODSLfzz}@$2@Lij+>G%_d9Lq=7lNmGghQ~?ZCu5HV<7XNOswKwexy0~S z?D9q)iQ{rP*2$1*7D|=$9Bo1xfj9BIA*2HVowGz%r?LV{?Mh(xJn!#H~dm2FzXUN)nMH9wY|^ui7Kg`g~fQ zeHrY|$#KefH*ayasB=3_Oj@NHSdHCRS|vm`F3$}&s+ZAYkP^p!j`H?rHA-~%6xY>s zx#=8CD+~=?!u*~zb%3@)%`)_Ds*!R9&t{E|}n(J4nYVB{?5J4ab@#WxCmS&&F-(5e2rORgnH=$^o^pfd`02jyM@xQj)>-X zl7C^jM81qH9$;$o5=F!t)>4YKlN8%p=(F(TxwsaOh@8?Mohkm9+7;}f(NpsP9O`K@gJ@O*}jR|Wd)Y5me##7vhU5SHeA4N3hM75AAsO- z^aLDvkU4;Rn8Xn;Vj6x%>PHEaM6^@77E53>q?Pn^pv$ZCt>;Wl^ac6kH3G8z(~su+ zgA~Xch01=@AiE~jR55{&3>s&Ww#!KK^^EMaVjI#AEoDgJVfKUG!uJZzkrg)|R)wHI zsLUJaej(}=?}S|HKKh%Ie>)Qg>_bDz=C0))F@BlaR1;U~#qN$GMCCCEAl~N1r2?|= zGp}*%!r)4yLxy~C2R@g+%|icz?xDo*L6cc)OWlHeem??x>E#xr!qN>2w`};`7irDH zpL_^ihW-fEH%=4`nh)h@Q(9$rBa!CyRy>U*+zM=*YRe;H&L!1`K%+O5*&jGRp+_|t zS|A&3*?>kT2O+B~0z|vB+0)peen=-Ba=S!=DTP#{#}{Paq=aw6$kv({sP+g1RKVsu z8uxj5r5cA#Lw6V``^kNCn)9bicV=U$P=m+>1!l5&ax?rE78MLQi=lnq!TZe2w9Z99 z=JnPBhl%kzS?2`$2|!QMd+1=aDFjgI<*qStp-~qQ!YVe97o+~J6#badc&@ zJP^SZ*T=)aTl^Ixq2$Dzf3qO4L<9Oh!pJI3-y;QtPO{uZ4w(L8CPh&%iONQH5)!q6 zx8{bpti4WyaXB#H1hW>rnA{~98SXmrijG*~#9~X2w$2Gg_YC$~*++qc;t~i&uT?wk z{e<^x3QyS{`NJGKHV3)Sb7V3EgqAd0)s^-e^iUAI?VmuFWaba99&RUwE&2MYU>3yejJ^&cfX8vplyz#O| zW#`(0mp{8%FgunE50z{|lGniiF_g;*l`=Fmt4@rqF${?S$TXgPXR}edL0Ovl&a@`W zO-n9SFY@0%xRXm3*n!>pN@`i(I{^Q#PPnMUi z7kfVS%o#~8I~BeUyhGr;Aw3CTAF!(chF}_i1iXpgG~o+Hzp2JKmc*NfsC9{Z1z2}|oe3<}dm(MBCuI0j!>V7wYcWFSWlUYs7wYOkPO^^q?AV#Vq) zV&Hq%3SihcA>spipiVk|{Y?hMnFvN7*Rh;}5^wYtBca>kcn5zmO(o%Yu{nlDNrQOl zsRaIJMBa`wmXu7I-OY4vQ&@Gquq_US`bvYEO9>Wlo|%~D^p;FIm$eDD#VCEFM`;E- zDxVN+5q1c_Ccuo?*g6pT)|f?dnjS%MjTH-Wu`Y|*F4FlZJVr`bT{Kl?cU6})iE2Ya zhvr1En=in;BRJaIf~C@*_h6?}mW$042~+Ogw3v`V>u#-TquKPggY6Gu)ipy?nbBE)M6g1zT-89jD@!de>T&yT35-0WZ?p)_?Pgr zJMtKIRjgy=2PC zRU2@ip3i&c3{BR-kt})FohO=iCC0>RWgR|FXc^2*;!D`#l<>s2;Ock!D&6v*u|@MX zY5XZ2A0_diurcoANMH9#oqvb9*7NMXz0$c|PijBd5P!Qabs;bRJ-;t7Ng7l#Uw~x% z*oc4nGyhR}&hVE-|Ciwh&3_Ag4p^XlZ*=wb;H3SAlZ`ZE9$K!hLtsKT=s-NxLj~%S zh0=Ow5*D_<-{nz{yjmtZE+U1+Nrk_~;*lX)03m(4-hA90UkEb5)zj=p0*^TKvVxs* zK+dv)#Sy_L311EG2UVIToEFHl$IhZij0VI`!(NWOljbCrMLL7`RhHJn8jwYpnQO#* z**`ZI*{nI!7-!d5yidw4#ZtT|fCJZQ|+z z?c)&Yf#>)@vO_Thxp_3=+_(TswvtGZ*jGWJ24K2_gGCbykgAcpHH9vyNgnO8ijAW! zv#XLcqe!iP+o@x+qBi()pePog4nquyaD00vz%M+Sb_HiO7&Tl30l9V*_w(XNoJUh6 zx9m58>eFQc#)NHd`xbNAvEssnDnzC4lqMM`iX2T$dqN|b_j_Q%SFS72V9$?p0a&re zBAAN^${?KCmN3eU?Gop3dZ_Ha!j3j$6|W_jZsG+F782bw8s3~Jf{DPCX`Oh{kw=?^=?=n&@S(G649sj{rvPP;?9$I;(j45f+zVg@5MZ& zZf?e(#vmlL;hA^jJ%Ap0#&gQDDy+1QNIUJcNQWj?pGJu47cR_9rJ|NI9o4cwtT{F@ z49ORebCfq{RtXnR(8lnvFm#{yX=ErY`Eolk>~K4o5M4;v!nf2|cBro2G7FcObs?09 zMn07Ag{|OE=JzPS1F=ZZa>cpZsQv(R&0>EB^j%Q71KVx$5fcM8mmAvyD(U4%8Zhg| z4QBwg=LONVg1Q@2=U{8EAMRzzv9ibyrHnAk8xDOxXZMVC&})jmXe^mQ#cs7JxDi=} zrxv&ct8%JOibCTk>oeKkSMO+-cd%{E&=_s4rN!j|$zLk+FpGR&DXgF9ygP+m34^i; zP+)H$+r>SyH}+VMXlC1Mt;1Ou-Xddi%}w2sc_Qql*0INiWE*-XJHokW z{G^4^Tq$+jML!q5X)FW?VF=03JjOs$c8K`~44Uymc*VV?*`eLD^2+vz`6a?5Zm_47 zrp*V!0g^=QIE0P<*2S=4qHH<NXCdJpB{bGM(6Pe*d`jE6x5&a5jYc zwt;?nIXn{y#+Pjfs4IE9pc9ev0}zA+L}oXbMm?5Y8%1%uMC?>u=-6|5yfA1Z^5Pjc z2(m2QvM+d&2DIEpvW}t!6*2j{KnLHLwt$Ci;OX zIe0CpV5Wf$QwZ*Kq0;Y@`CBU^bF3_)cj=A3(8E zAn@CacZP#VppZm*J7DylX21T5kei_rdYZwp2>BQyW;yQ>4HU2+uRCs@1!gKW+xMm;8ng^I*>eUBiy(`^qqjAUi`4b+Nj zZt~;2)K?tSE<}hcZi|C!AGq%9!1Y@j=Lb-{$JJOEn|JtlY~GG!sRjw$_z_(5xc_=Q zM++5;ZJL!`+?7$QMjFiodcIQ06^E@*REXoKfvFBK825iKVSQ$2(i;3GRdqL71V|-@ zI?{+w=GqZpF|d*;$8YY2Ry7AFKr~lev;s#7!Mv_(QpLa^3oMtMo8N2sqYON#BbIKT z&*|#?1%9+@xnMOmd(kBbrd%M43q~fU3MG9uh>FV8ccn zRp1(Z6!;~eu|x{KlQmbNOcBE3c$sd6EetOCE@$(5yQ7sxP3_PPClRLq#_JMuKRKM2 zu{8#Rfq`rKdr&$$8vhG8V?VK(t=flUGx_-N<>1ztgO|&@g(jPr`~CPDsmty4_|)zL zVoui9W_wUiCjoZ2xY(8Ldb^9WlMC)#dhR1ld|P|0@%TqSTaC{h~xU zJuqNGD81=7X4Ie#&L+M+Ak6l9$l4y!%rL>E;b!?8PJAQ0qqJ{qk3q64n^aWj|4~Y- zMHDHBshz}Kv{9h_J87d5>jbK~zN#%mvwHh-{&aCLqu%c^vl}r|0{vYf6LP@;wF-z2 z^ii)BFNmNNLbA{&D1s(=3oIXMGXW7FasnBc33vtLC07qvM)liyeWXn_M*tZ@t`QU~ zK1HPvkY;{mO(L=JK&ADpYo=}-AAU7jRYr=*xN&_K^lB<;^oUKxQWK9`Nk(LE^G?8P zN>8L}%skc2b)NawOY?E6Z756o$MTq8%(l#AIU`IoxKEcPAZkrcWJjfq;6Cxt2;!)? zmWl6S-cEwbH*0DR|Hh@RU`SwIYb|OEPQZcC&GpZVeH(f!kI``V2O|uy+~t|zEdP}5 zIZ>t%-|S4SuHeJ?=sKi;du<-Dt~gYVx*JAB4A@onkiYAcBio(h@O`DlQ#vZtwPSH< zyxQ80Pmq59z4M|){%y=tNt~b^UJM01Y#7LI4-8_!b1uj{;=7a?XmQ<3D&&LgYwBrSksmv=O6j(UOHK#xNTETiPowVb@NUnCmZ=K4Tca33Od==q15 zjY%%IZw*u&Gf4En%*<8Xt(w%xr?LiJ$TehE28pJ_tfI1Vp7u#}Nwn@1WJ+e;9yifZUg!AJF_P}e>tuFTUJf)Xv0_m+_Mxeq zMjdBVN$1Inx3K5rR(CgOp^h*#abip2eY%CGkVrPcQdV;vssiM-;z$QuptChQ5I2x( zX$#i{55r!6iTMnUaba%@f7a+)=?u_h&6^8|Cu}ukPUHY8i-$qaY5(BYBXcPsx{B}P zxkOj%K?mA;@7K>E0;jD~&M3aHEm@>+F&t@k;HDPAhgSy#BkRR6`kAofgj1= zt(caXvM7_}nx3*U2Pm?@h}}mL5@{wK?dGnf~90j1rth-!8ZTM`-u(--c41Msy3~|)r65U!>oE@8AM6}gc*g5 z;V|?TR7Ia1HlmGGw?JoE)nl!X%LTS-Ok_`X5i!6i{tebH3!kI%IN&J|WPmeBU#HNN zR6y1{^XgD zn*KqokC*+(PouZAOkf-|kQU*Ke#BJ2<{^dO3r=5q;M~qW3W9k#fWTg_hF3Kc_!7tH zS@GE0$Orf)au^6#=}EmzDlm5V!vaTy&usgJtp=gOVCR!r7N9I1uMm2UK1|e8M>u(g1LMD|&HcBq!H+@of0|!A)ii$EOaGE-p3$<>leu5=p9GRfZ`dr(bACsp zgIvtRL9Ht|vvYkv=UR}D`NJ+#r_Rium$qxiKFlT*0^05ex}B|EIhEW@2x)+5Srxd* zx|5ECT8baVt{@3oPTi8BytLe?1zcqbW84&=UxiH7k3IGQIV_dV7K#rN4 zvfj2ajg~%_wqhew7n~iWkZ$)P!@eILhrgPhrT7Uru0_vYR}M~W*o!_ZnLi7%NIKl# zwg-fL&a$LDtA+y}0bO}Jvl^DPhYqu*B`#9HpC6|yL%d5nuFu>~8`(FJmhL^289;uy zR@W3QRU%Lx5PK%BoghA8*zjz*3t9YXbw84TT1*{{&`VB4P|zRhS#uh`pGvHc48tkU z7e0)$p-^OVQ?S7`oBF25mNhy@SGk$t8tD6XdwwsAveN#ro<=&uy|Ik8eyV9J0OMj^ z+n+hRk#rjDt$He_4>WkEd%TTQ5-0>cRFVFH`~GEWnn9wI>Yeg=??(!}3ZL>N5%m(n zihqlvC-k-B$5T3p_!%!fj9vk`ReKGyfW9TT680^|p5U<<1kFc7`>W%wVR|9Y+%nOl zM2)pQhb%{W8`5x@2Q3_o0YDC(;{alIH3RCKiTd-hA2O@S==u~((+fy>dk@=U>Y#)T zMEOC%mVGv|lOPOr7OE4_8pc${L+F7V)1%*B#xa{iayp8Si>jT^;X2(BKr{dG0^v)x zJG46y_Qv%Az*p?~<{FqA(mD3QXCA5Gy=*wB&nw+&xY@58S-y6d-M)9*9yQbgVC2xm zux!Z)7uJ0KLwhM}J(&d&2O5!%bLy)Y-lvGEZ`nmurA=dDn@Ujl;)H>37Vqt~#l3GY z(Y}4?C88zUHm3P^fZGJIAZIjub$Og!(NKy}33%d%n^y2w5hwF{(-`iP1d#T$_m+sX zFuAB_>b7%u_J>!Hgz3NJr<{FgZ#`C#Jz{h-T@&~xX1Hx+7S$C^^n67eXf9|Nj-4d{z60y;51d#07 z;4OJ?$I3?2z1iYKxHJ2sot-h%J}ZbiTKd+D3ZoH`Z-_&v8(fy<$VsKE+jH_wkrQU5 z%m0jnGE6N_(T3W^${0eruiCy&jFGlqNVuZ54#?|Az zN!yudV*&a46h=?)lVcqom(8EIn|+(wMvJlL);#++ttCz zmpwREn=YibIzx-^+nE;W-}0L?#{MZ{ z{gZqe3&($52>t`8%3HbD;m3`j^PS2ml359fzpu{Ga=sujYYk&N9XCt{n-g6bKFz$l zt6lTYiun&`uo@Zplpp-)qx~Uy}V3Usz_PQ`gyVW z?M(vCB}!&}xky8D&~g;RAIo){(w^Bz`d~#@JzMlL6W97?(DZ23-2P?|n{dTpiz5gd zV$<7Qhh@7t8?EEO-JR-P@`m|Ov0>%_)r|=@pLMlCO0d)Rs`SHEz&>43h8U13p zhaW28Fx&{18fd^K?2t&@D!9U19K?rT=hqdjG$umCn_m>JuL4)#uN;z5TrktEq(?c@ zzUPdJ3#i8WP>ieb7O3I;CnE@Q1N0Ivb~MIlxTP01>FH=?mVx21zw@sok|Oqkb3W8CE*&P|9sk?$l5DKqwe4Y%8MrElkHf&!2NuTul145Yi}apiAQv+Swdh;s~@ z)SHe(%GQJ&z9!t8iE0kw1o7(`bzJLzsLzDQSKTwH?yDigpe2{=8Sf@?bNeWg=;s-- zH=Y%n)(mO80bB-0QM%g#y7AZlY=CJazQcX_GIE)Rm)x70~{ZDMN-YjM(;EZJ<`z$+ysxNAwgOMLiOt%vE_sT2ccQ`808$z zxDBBv2Y0#?P2tv6U9OZVEh73<(79^aIX4}fw7&q43CIEe(=KKH2SAneXO!tb&8tbu z{|%_x)u%!L2@eo856EDe79q)vORt-I#0ijE)Zz=Sj23oxB9^Z>&*6I1K6So(x0Bvs z(%o%k3tx3o%k^0%xD)qLOqQxuby5#$AbMhuw1`7iS9IE%ef4F}OAs#41szOU!$gi&sI_Q7Yes^}jR3q)7w1`Vsw2SKSL(a1YhBP;+ z2*+nK=occ_)?yacJMa~qly=LRRe+=<{TS8=YJqxG>oFIJko7jG+srG4oxPR-D+K`1 z?t5YXm2VYX1Z=8>{oUFZVf(f;xyW?bHoanI5UM2Kj_}d=x6W3>SQlzTFdC+r8MH(T zDx|zOXdXNoajO(HjLp?YaQ1jE*3qfCIxg*!SYCfMhPFKmqV;M4x0XR86(6StQ>5Hx zV=X?DmeStF@|wB-(ik~ULw`3=u@!P5PM^)^|C1JA1`7+!hRhBhq&?twYhl~kQrqu9 z>yyD3-j7lfMIOW>gt5dcn2^y{GXX+j=h)1N9+J&qa4!(cS+5J8wicuKWhLEA&bwLe z=6JQ?OPawK{T**ehAky}hq1gK#!!zlr6lhyWz6(?i#Vo}2R`nFUhMTi+0-LTkeO?9 zKbe&Llck~4d2O`|iU?fBF(*lSzhi|0ipB)@MM5$}2&>nFqc|5vMYc-u=$?$y2>HsI<#J0;(&5WSm5Y_={z!4w!@H{^TO zn7@zfXvf-uV2XDyT^XqRttPxVM8d_%M*aBp(Ssy-VBs{s@Kf9^Jlo+q+ZTF_(0-_s zk$~`Xy^!}EFSTuP->hG7uKR?`m9C4+Vm*zXSMv1xY`lA+dLSZzQeM?gLPKMaGqcn; zVQVpRy9jXM>>suR{ZH!sA8EAzC-%bf@7N3be;NrZ)n#l|ez2Er-CaI;zUfd?D++_z zybDT#u{@eHpxNRwL_!ph@UQo*AAQE11TKk{j+eFJ;r-i*TXsUxLX@-qh$jPUyEJ9t zD5!9KJp(8CC~^HKGc)~Tvj@TkkBR{h<_@!aU`${qY;Hv-j~lboHu`!eXf5FSaADww zE{_)WYFrANaj zvO2qfWV%dL#bjVj9GZ+-G+g{>)tP4uYHSchK6Dms$3Q3A4eA3#M+nu|Fy6klKwz;{ zuHSHafW5?iG@`{c*xVcRF!^@&=RBgGyDRvjvtadkDBiowg#Bq@V&k)zwM3Y~!S>)Q ze41Te!3u>nex-IPJAwJDb_41#ULj0F7ECd$OFQgFu`KBMfvR|_SoTvv>^rN_mU>#; z?|u4L1A;ri=JR$)OK~VTXXyAE-m`Z#7$)Gu?uqyZ?6BPUgmy?K&<$;PBL>RrXOX}& zc1`$CPF1by`E;?7d5zq-`9pw1O#|F-=;a(V*wpBVtcK~*8kWMAuX0!hsVUy5vmI|O zfdk(0Uua)(UE}XQ=VLTmy75&Fj;wL;_^vD$ z+&PRfug75UXIh-kVQ?Cj2Vx6kp@x(@1LQ@J1J*x>2D@oPh0r0+L}{?4NA zf04#KUwIpR?D1lz<*w;?J3PHTd<(zJuaD=meY@Xo_YB=vXJ(5RKvyvs%gVogSYw^Q zQqm`ueV5TfOT5+}U}aHI4yiw^u~!!?X+z~OtJ|x_bKJMJ;w`Ph$%Yl6L?0rq<{lWa z3oi9s2#lbSbRlB)VJjT0!&b4$P8V=iLwgam1guGz zgJJLL@f@@+R*o4&Vz4>m)R}^A8KV4hV^|=NA(z;su@(Izo9HrmG7{tVA*#XZupkak z9DdZ}2E9<}aqY;|Q*!$y|6=2jfYC?S9)sFJ@4@YlX~Qmy8GSt0L~9dZ|0mN4N5@Eo zq_wx@57@OBBIG;9^=`q-2UGZFF3L-(CwFBg~ID)#=O8($fEM=93c8*(uz=(lssS|I|_)FCEaG{e>)*? z@o~9U&dJI#Bnz~sH=(=?gBhlV5+*Q3Ze0g_JOD9h*}OqszJprJ>D&KG!^x(0<#K-R zmfhp+(KBBELv&~Ok+}Sy=>C6%KiL0c^Ug-~O~-Y1*q`yE-Qsd?Bq`#@O>PqNwF2w9 zH1_s)yUtT`MC*G>DNS$U4DXiiPXM60{ekwxb88)Hczi&35FZd4((&+AFE64OPp|u- z_nf_OL>uHEQ8E*T@ItJ22gJ}ZnNKGNCF!rz%!<09hsvxek4Sg><=}&ul}Q?n z1GZq;t(*KiZvq8wz&>YhwclpI?@c{bTG|tUSowH*g%cALd1zc8SD0ofIg%*;#Go1%#O~f8c;P-O9aCU&qqU9T+m6g>G+R z(2viH7A&-zrK7hgJUu( z>-o;cCeIs9huvavMGlT^JuZ`C4}MJG`SeG)52^J?^nF0^f7?DZ1GL9VUo^UC@wN7?qrV=xMF8wT<3N`7qU3KdTe&f$}i4TbP|sd72hZ*Ccc`KV(1;wAQiNWkD9FUseA+HE2b7?BY-N-YvV4{!i58N`hhr~0 zeaWIAE5f6gYc2)So5Cw2SwfDcb<$@foG$;c+g@GC%lF#Ep4-jOQxN|4q&MbR0xYP> zQ(O&fG<*Z?g9&f~vqvGi5~EIr^j))h`E1NdQRI~_bX;?Glh;_Cb(0Hl6;jb3!Mh;W zb#E$h^h9yp+RHG%B6MA>rufjOBxg}r-}vK-Zd@?ELr%XKw-p2phR%5O{qUq2IH1Y7 z;z~>-YNFqtUyeOP{E&-ymP=ALaRN2iGF1ko02!(n458rJq}Gg;*c7I3sG&i}vw><9 zIqV)*PC*cdxMM?X5(m6XtzU{)<~?Yr1TV|x=hTr#3gFQU9>`980}2Ops;4W29q(Y9fL+(=!F9pHBQw1aaS-MKV{5WVo7aIYYv%S zY=pl$xQAW_P#@RYC{#u-0GbP+PK;khH%y~`RgtafUlGtZ0Z}O{arss$s^c0)F{eRy zIRMh@4Sl=vxq2DS4sPxWgX%GpU~``S;?qZWCZ=exLtE!d>o%zop-4cwD&NQc6ap95 zcDhLXm}kHe8|h%S>|bT;ZC_v3Jp9-}kOg;;e!Qp5#!okwe37}--OkZdr z+jl%Eb(WcpRhIxLM!vC7eSk?E#npBEu|>{l!s05>fNYOz^f3z1jreKk*@`1AW3U2@ z1V72x@#XB zg%nK$srBTu)3Sb`i@8JbD~E~d{d+z7Am?11fubyQMuz5v2Z*I@R0F@u%S6Gk&eOiC~sAWpiaprmqf*)JPW7Nf@Zluy~?7HX76_ zZRZ%rW^m0Xwj(@3u-Aa&QCQR}y-K&4Y_vj_f#9M2^msJ?y3UBT1@gRo!Lo@pNmDZt z2y1Rf_>C3J0biQ}!lCVpB{G^gf3zTLQh-jKI*I16>JM(g;o9Foj=ibA_i@L|VszCq zT?{EkDfQc>W1$Y&#SM$NSMvO6=9w*Hl3NBlw))jDzoSm$-2j(#%J(*u{L_S>yy*FH zt~%(b?nxUN^T45hgeoEK;Qoiov`Li)`S!V8k*YDS=kNry|wT&P$KImOY z-WeNAcASe?@HoJgL}8dk?GSPSo0D&Tf<~%ujOfjSt``w)KLlj;*Q9(DBbyB3ln4jINz{?zPYUMcuL;0 z4yM~Q%}AdOxDxdnU@^Px?2Nl2dv@^FM1PNYTQz%pU?-Mc>f@Rl^wrBfDqkD#_eChg z$GAo+7_Sd80~@JO5gyp#m;*_>iDbX27ln%9qrn8f$5x$}%3++NQywZ$kV7WfRGzs9 zBmuUuw%75HqKyrKzM02N^e<}J zqn}i=dz4dSRPP1p`U>I?r^wv5!?VmH@kF7yfPuh8n5!*okIFE+Pdt}G;EZd*_#c5o zy3$PJ%Epos03h@MPa(Sz!|$cgZuS&rzz^FvS|6tA%&Ap0JoiP*otQMiB?b_7MH`3p zFf}M|z4i1NN?4===%0007DEQ&_u5L2X{qo@ZX#03fw6_B-faTIVSW^#fS?;n&Bz9H zt(RNQZZqtk@b2lMab_32BqGt8sUsQ2OMuq|-1I{c+62X+f_}3P0@MQIXxD7#PPUzI`r)gz1CG-r0^bhOvkgzd2ZA&dWeuDEtiT)bWI1&|+ z7BavttW|QGh=enLg6sqj=lat?)V9ZS=~V>%yPh8ixeWnZP3n%lEnzTtd}#M8sWxSe zs{6NYR#(UT&EFdey|iK4aio_wdPkqM`T_GL%UtGbSaaD#xOsrF)Fe?x*W~+w-Lv?k z(51y_EqfZX4!2D1Bpx1TGS$YDD}cv~+WbMmC6pDUctAQ1%cZ`tsY zKTjG4s>+~vj;XZxJM=NAL_dO50#UdLMdYaymwo%+MpZt#V;_z&N=TQUvoCuK%4Z>X?sXFV9N#8Pn!dQOqB5q`Ej^yEmAFogL#|nd_7evn46-T zilU#W*LlaQ?Q3D?yn@;)<0lSu0h^fR5)dSNsexvtEix8XCa+$Pp@pe)CfoEecVVy$2n05KeH!Ky-V4ImGeXyF=IrHP+^*1<^ z?;C%ogAS;^TJ{6QO)Gy_YwY{Nr(2@Taq_ZX)a)p^VQE%1H8$6l#7Q8|!4fww(W5hQcFn4^?IR zaV~%KkFTOV+gOrLuHP}4E6{(DXL{{#vC zP4$hD{XZV_?fjRir3n1ywAusQ%>3ioS#kw6{v9j@qy~Tjswz4`!H8%RQE>OMvilHY z@7QHe&rlVIqfKXd`;}9jh9&}z;sT`eBcs;of)>Fkfqbq2ft|jrFr+7;W)Na6ArJhy zh}JeBhKN#Zvq60*AdPlzIaU}E0u?PbILI@<2S(-ybv_x8tGHj!Ndw?yjdZ1X326N( zG(;3D(!3yXI00q=gm@>s6z6{2&94X8pkW$hPmpwOJxOF%QsT%FQ1T^0<^w-zq(JSA z@LJ)jp+z@FEHE8ir$Vh*6t#^tw$^1I<)o zhQNbxXXId{dvZC0{2KX{RHOvJ{Uu1tf!>$?GE77(Ze$1!JtQdT^xNO!J();>yka;6 z0^2z~;BTU~T;elqS_U(0G;Ss6(`o3M1?C3go><|zFT~-w0}ABg`QVPMdqE5NC<^8X zl2|>&XSe*L?C9HNq(gBg28sg%LIK)B?)W0M4hA*r`M6QBd&utkD~}~$Ojc2-=)V*7 z;|ctu8Hlh>l+sE%X2qI0V9?FMGTDIa(A__UGJv0WeAU{_0fLf`+9JE z4WWEaB`-zl()Rth+1i>QXDM)r zpJ0*Api2Z>#0~xR1($YAjJJ7GwYY8ysI&EZJ0&u*u3H#^f#rU;R*D%uJwKaQe<{Re$uj=~RAXDkt=KIag z_5SwhbN5Pr0O|efX53b7d&`T`Rx3PT!=m4x+elf>8!S+*c?Pkb_O)kT-oCBkc|qyU zM2?5V@|p5(MoH-?&*BhMY$;{5rQc#hiPr*pG2w{Zq?v|MZfvG)LehHnlvb52nx{?OJGGwiy^()v*w_wDHVh@1Y%9wX z15QAxa}i6i{o!({RweSG9*%waa(FST$p(yJfO9}&lSHHr5uMC(rb&U}JN!H4-7J*o z)f#qWx}i(jv;^-@@BG!gHfTk}lDg3JXU%(5br#>#O*#Nn`0!MIp{aDxm~FHe&gu_g z+`mfPeA6IryltaGcKrP~4<_7VO-768j*EqG71FZgBYSO-8wh6bQeZMaJYIXtPLx}I ziE<8DW_I1s>hqDk+lLKuoI|_c*w^NN%{)lNnpkYNi7V7UJW;e#k4_mUS!6Zv{Y|n@ zXjX@wyBl-cbjYl8Sd;T0(zMq&&af9TXwB_f!FTLj!NR+oxwNuiJ|B(lQ2(=xFb}?& z@KQcIGVOOJFpKmRw~n)j@AiNB<>n3Kpj_-WD+m}+owbOvJK!tp4(%(XSUIb_&bPRx!b5^+(e;|l1Z zQ`G6vbLKk(_RN|G`M&DKma0&TQT+>hhFoDhRNy#>RS{Jr6yNnF$#oQIh;@Wv>n#D+Cr3F-H?*rBNMnd6=_k z^5-KKOugk%%|Sj~wZ6_BEI6Rb4_!z_5!*;EX$2IJU*RByNOze5rt?a{TOskO}4evcjDKAQ~w zExy38i#aiT2MF%9)!VRd?l5n&;%O2}1-!!aaqLwPuZVEX#P@dSkS|z$aCddizGwm= z&MQj!{W%8H7Mf5u@;8FY-Eo{Lsb1!M#NctEt+>qwj0$<#4jpnpy3<8Edf^7%dX3HM`n!- zj^!-0mhUPpR#Jj0nel$0$K8HSXh!9hFzy&ThyW=jT-O^&E^Ro8dMO4Chu1&-;Yh{Sv z$ZI72Eq9HPiWe_rdwrV-zHtSo$1_&#^QB+9*T_7ud5 zX>Eq;iMxcbpTHxSdco+$fdd{bdX!rCPj=zudLrX+7EODOzw}|xA}Go5oKE&fuUMq+ z8YO^Ow{CPLxRc_fb5b>Z9ewaG$f7b)UKlS^;q6W=*S+)Wu8?g@HfO|SO8PRF;XQ5X zF$7Uu2mYX&8gNEAIfe34n!|4|l%M0KzV1L0apUn3#s^cGT!jF z@dPs0FHXeJMoqo0?SP%Hsa|N`zux^=vfVhT(#W|NL+6$@JeMTXk48)b0PcAtw3s)Y zI?a$6v0;*l6)4SeDH0!bXZX$3PVr)+3oJ_zr!Kiv7gsK$YdP(p9;1Up!Iq&}Vci>T z__mCwH-9|N9>83^OP@nQPm8i{lqN9W_108_9rSJOx~&>43A3M1b|SRgwAK#Ul)qP` zQ={~Ru%XL@ZmpXjoS#a(=z|T}W6GF7-r3WDs-9R+$|e&=TBNwcPG<=_?RaLKxLeBu zEVgP=!7msO${UOFOQ%U5X?qH=Q8WQ5;}^vMzKQ$@MR-if$xP6pZ;~Uj0e{Y_h0GvH zaRr(nfC|?VTKV9wMQ?ZunHNX0_hASwz&42E*P6gC^*vVeQKQ$U-8=l8IMo0pW)8jV z?fGJ(zM7SRKPy;6$kbsl(hR?X766cy_{H-UWDTJI=vWDk=`nUI!N1~{T~S@UM@hfK zgzGK=RlAb=RIo!x&OJvh2M-voVk6M&DG>-iMk~Mo?;FZaZPwWk2=E5j%~`=Fy(qbb zSU=2E+b=A8bS%>^oLgVFh{#>p9@*IvL{{CjA$kDP=nLLW8{$>5zA4N9B>}Bwf!CbJ zO_jY&Gd(eZgU&M9EGG*Y$$*J^eAsk@QP!ZlJ6CbLe@;{{H27OR7JmM_@L(pP3PCh zD!gZjT{0G#?ho>nX1+~C9af9gaExk=E8o8Pv)Z?BE1WfNE|Nyabh#D%dH!@p2Y0bt zpJ}p=nGG=toawqZFoKJe=%mRTEg*Ru&EB1|qUU;i`JzNUB!bW` z@d4=V+b^@#@uI`6BrlV%4%O18pp}|)O{4Njff_TU_NCTTFSyj{l|5Z#JATuIs`lCa zP*j<=pz~7mEShsKG^LsHnU*(;rbF?F5=5ufDW`ezGa=zeX;$zi4?_kuNvd?FRMb9a zULvTenQvjj*ivw92h+cd@3FY3fOUqsCN_rj{Ur7qmzSeqmv2e|o@105ebs#D=kBI{ z=*eY0g;xCqe9Oq!`41H#6a7C7CNr=y{Kq%#MfIPGkQMo-BD~RIga|W=Z!@J2AeC80 zmPjAEg0#Yb)cA2jXp_lHFzNO=zL`mBu!;Y5-mjC_9~;W--sNc6(QB{+a`Qvl>vH+FWZ6@(yPaa^`ZZlx?Z$w>B&%P1@vR;C*FV!rYE%T=I%{>CJ8=>%?ZiFJzHjItm?T+ z22=h)e~@ZdiD_QkVxNmTI*6+3WW#}0wAtfr+3$+uy1m@QzY2aDO!h9$Xc!8Os~bnT z&in4%Y!T0jG?PxNXp*eK^i0=hwefd^=bW>an4s*C&7>cq%-5c4gi?sm;zD2IiR8(~Km% zWuc-`YtReNNy@?KyGh~&9L^cJCaja33A0wWyO{F&{fm0;NA7Dri;N+M7XIcD%S9*m<8sl;BK+~gnWX$=>6q0 zAlMdQmc@FYPC;DZ!@||L$BKSTt-9?;$wG;?oY45&z9C$4$(1L`&J2z*{uDRHR}41V zmO!X=z|YLPA@o~D4qh^9fCKf!GOzHcO5rwTk0ag7Qc+B(imH~OR!q&^lN)L1M^LTv z_(~cu#SW06LiHPX;j@QiEcdiqU72piJW9NVR^km_7S~4ylmlHOKkBtZOU9M>()`j7 z`rS{UhDX42uaiHl0r*M8WOO)u9VERq$Cwyc7k84E$Y-av7p4=&G$Ip!=ST8w{5yk0 zTf49Z^Ia9Hf!mitT>JCDzkZ`@>#`UYjZ^P24wz$x8j54H8LTq3kV)FEKA64JL`>3o zFlp@cMtNaId#*A^uxM-Yk+%&ZG_V?&3{3OrBhM`L%Kl#{Dbo<0P-)H1YSX!4uR72S zViFi)@dTK+OvL#E4bn~oA)?*ry7`FdXK_pDLCUgckd|Zri?VkNuB}_Uc4OPNZQFLT zV%xUuWW_7Vif!ArZQFKE_W5ep*;VgT@7dpv`D4}?v)4dX@AK|=Ygfy&W37b{ErXMA zGzUCU(btvq5a*pCNybmo@7FP9-Gvo%Jh^XTr=;epqE_yu&y{PVOE~dpmr}B-I!~cy zJ~>lyt+c+%%bjB6pLvwq&t1%LEmJ5wqS}@%gl%nQ>l+dIg9M6r^Yg?*NAHO=HL1{UgZ63Yr_WTuJ)n{ zQgZW+a4`{ft*M!~XK2!GI;d`eOdcEX+@D)^*m~3;{9Onbr%PxY3i z8ZZ4LvQ$f(JjaXQ^Iy76o00Eik(NpI-z$<9SnSDZlN9J>2Y78Ng^ojL7U>|}bIh?~@y@#l(XHBEpa`Cg(G-XmYKx~bP}u5*ehSh%*d z*u=@n8^sIf&*$8cw}t!g7Iy;x)n7!gj~0A+%Sv8e{1}4Qpmt^)q*R=3&POsttI#9x zdlX`i^|x_@;p@^4ywOK*FDF8FdMX*SpIo^?jRU8#|0LL3mjMN+%#ysJFtiO{AK0m3 z`%tge^aS?q#r$A-)*hM^auSKShUb^46zWb@h$S?@Gz;X{D2x_Uex^2Q0D*{KV`3p+ zb?#IJzOEN0j^odimDA1esWt`-Wn(U~>D6Je-N}8`&A(-b;bFaYQ7Fyv7cix+vn&}G zqdp3JvQI6eQBw`B!0w-iw<*0u4)B>Xwo$j8@T|Lpl3)zv@CTZ$3V_o^5OQe`532lJ zcr@y2WM$4EUf+h6*T!xUoXA4_vkX+XbatxGG&E||EoQFV{%Fw9P|r1QOE_}x8eWd0 zeY1alr=GFYaejLvt0=ws?d=hO&3^;q>cQpFS2!cw)qD_68AlD&%!rWSJfDt$`EWj5gDB%j!Umiv|xWm`ky!p{B{?VB}oPS!OnE!LH_}`XP4%Yv= z|NkR7v|Hyu`j_O;s|4?PAye(tuDpx<5wbRDyEy^O?OLbG5GA zbY16Q5D$+3=$ySjH*nAwk>=~`?DDdF^4+|BL^Ny6*}waV&VMizKSj zvQ1M9%NZOW)%|E+ifp{^p_q@0?hINBviGY~al)nFw;BhFmuc-b+*7-LekT%xG#Jv| zMB&O#+%1?$J|T$P5Ydc$3*%D|XcoBSTwj%u2QlBXGFsK^(z8a+W4C8>`Le2HIuIIf zOe70*mx2yqofiBtDrvNNJPuBjDiE^!#YWK)qK{=VWl`c`2THz(j}Co8j@+snMACly zd2`V8{_%WSHT?&kfhP8dod&ag(^uX^==3pycgw(u^dQPD1Sw~X!t2#l?Ava)9+r#z z?4w*SfN8dS=b9|I;bIf{F2-1Go~DoNpW;NMz{!Zw$)`w3lAJDxxlG+IrEgLw0sW@) zoZl0~rJplFOb^050)N(b0X`U%SEZ_)CKa=vAhqMIo)pp*XY5 z2FeBwHPp;!D2`4_1gSpCdA?Ddvj!<`t8;fTgtX5$BEkOpya$?e(6?lR+pHAay~y+=1^*av7o26}Z9syeAKO6=I}4>5<|Cx#81Q_BCBC z)RAD_M*;WXL0CDp{Gbz>y1JVZY{I5q;fStOeL{JlwJ=Jq6Gvvfnq_?cf-eSr?uGwjjFD_Em%SVYpC_ zS!7|w5Eb!@se?i8xZ*=>#Ce%w`CJ-MST8;bqg!7OwCprBZ~aIt4&|O>+tB=&bWbF3 zux(O!qfoRxTHc_Wpt$m)I1lXqfP5<^%bdUsWto?KxiQ}UIwSmYr@Zo)zy14bL}nlL zFT3u;7Iww#RB3PCK>bx2ezYR%tT`~G^j#?f<^fT}9HRX^EjRqrli=+tbD8aIE~i%$E@yv zg`FX8(5bhEGK=Y)CW6`2_KrK%;7y-C9|~8x6FM8I;_5I9KzYz>0)!Y zpLbESFQw_01Rk&0+sHw*!#R^GwG2A8Kj6PO!epzLpc5A0I263m@TT5?sR#RP@J6B@Yw66f@c~Q69pVPT!fnu{|({HES{BI@pZ>OWL zkx}$Rlez9)>T$u-9`FR7>9RtvRV2~OB(@EhSxXlnAOfvfom>EDV~{p@P~Lt0L1jJJ zyQ9U+r!hB%Cpi$QGrA$`=B-cP3d@$Vyy#3maZ%cu($`p-{^^p0kM(f2ID2kmOXw4w z{q%slcU_92alKfts8<)zI^0_Su9T!uLQ39^6C~i@^{Y)@q!r~OHkTwu#4HFtkZE@UU;=hbZ+~*)2ICayD89NGtJ(>I9tR= za6>^yZ8N8-=jua5n`47qpt?O(Fv1>n$D5bs-@vHm^sWD}9y782CnDm1?cM&T!Hf03 zwg?RVRFpq(J>PA;-Qg!d{OLhITCt0I(po}=EvkMitg>QR$_h3pnH@07j^7D}=Asj{fU^u-Eka4^)S{g4Lp`>0*Pb+;LunrCf0eA^`$|;>vtLaa$H_Tf8@$IuoLHpVH^XRhtJtJ_J?<2X$GIZgnvwXO77JihunB3J-_UA+E#QxytJBs)}U)i zanTd@@w$-#p3F&796vdCvI6fJDP6gzcx%(>3t1U5H`W$?s?tK>saMEgNz41=bfNNd zd+5HymrC%5%&0LGQtu?ly_Qr-8RKu=;+w$yxYF4OuApQ zBf;M{_6L@px4X~O`1~GTx5t)k-L2mBUCwr=hY$M??w$Lgm z7vs3UhGgMZc=ejm4c-i#njqDmuJN*Q__=*NuP=T;^W0|q*_k|^j^7Wf@^NzA&7xYt zD2@$K2_U0F69GzbnDAUpX0{g1WQUZ*uheZR8Tvz7-HWkuBz|{NZ{U@}G$j8paWixN z=fwT*LW=E&pYh)csns>?*2NHfpQ{xRa|i>%_h?526k7O@Km&plM9+J6%@%E0N1qM9@<#QBv<`aNJ70lV_hOFWi$X5KJ=qnS^^lXEy+U2?1Kq7>hofHU}szenzcf>T? zcB1p}dlq~VJoiZ$zHX7f)yB@;8Cnj_=YtOVsArQzC$BdEh!oo;_uMh{?3xymXkhg= z##~;Z*Oca-$;aRMxXSfCy7$H5-8%ndX}6YMPsn$^rjC!_TXg3um8hmqbQNuluC6Y= zK0Y4Y0h?pETk7e7m*We}5ZAw!V+R|Bp*K#U%|R%d*Nwm^-VSwC`f}{XPGT>mvA@n6E)yM*Gl*LMfIB7M+!0!U{Hjj2!BAZ#QHCT zf6kW+VX0x?x|rj{?}>_I+e{89_lr=Pe4(_#ilYQGZ7+d(vUQCj4lnOFbo#XA8biC& zYV5IKmL8x&=b`I#R+9uczNVc9!tV`MIE(7GN?%II@onWIm;N2PEIyws?JkTHwNf3> zw%eFa3OVjuS%1_5ty@@G=VBFeApHc?8Pbn6M-00w3ynS{+>Hp_7vhIb0+w99S*&Ge zo#a7ggmqhyI%vZT*@Ok@X=dDCR-nP=cbQPpNhbDQA{NgyP-7b_P3TJsxASgwEI6L| z4xSKvxRLeO(W^~w%{Sd7L#S;wRL0~QOEY;a<6`{Gec=Y3jDJ-3@*6SpQt*|pmr&UZkV03qob(2(b*&gn>83m4Qr1FRwLln+`-;@4s zE+E?;d%;kbY)HPHwH;dKK(4$gE~2T|&bt84D`T`_bzi}9Un0+6i3$@Gm#U!-Q$eML z^+6u&D(caGfTmpY6y6pfW=zQsoB=eh^?WLY`r1l|5!>QmvGJ06a8_lFsvEJE9~_;M zai_Y~Kca#ryqqa^1{7jvA!u^;Po6cfYQW~g$=5+7p=r;kIxHL)u=FQ+ zhv*Q#U%?}0pp`^PxrB&sHsl2*p@wwFkkGmw=*W1;QPu`k8MIzV_db-Cca}j_8o{lE zBn7_a8(u`zfTRXIa!R4*TnuLj`R2|glX^`JM-VR^MofZUlhATGi5erW9Q@nvTJ(lv-4<_6Q0~Y_b_xip!wh$ zqxu~FA|6TfSnZ$R+BieHTu^{xVp-W(FA#wx_mi(5CwlNJ%s~INZgKpl=lFjuIR2C7 z{cpI=|G%iIGHpCkTO20z`5xsFsFbo)g&m_qV&Vd5=$0sAw2wm;0zYwP3EZZ4IlG1hbH=e!=RmMY4*`BuV3I*l%OB@45ubu$lztaO8wC>)4_- zc5uoagr!8Oi`=jP^a(OzV2$`%F7l~<5a&K&(l!;tW zevqs3BSAKt6-DW*mvXmJv8f@E=0Ci;f;C4L;$rgNP2AF>F$*7T>gA4&1Ziz!M-h0) zytEmq`OzCTAjar#CiJ1Nyhrh&k-D)xQWdbjE1P&u+8JjXP3c21)WwTrhk=Aie^-O6 zTd-1tVgmgdghc~Ot!S{(O6c4Vp)=1n({wuV75hr{Jm5T1yPC+sXiE?lvH_nxD4xb- zcBImbV5#d6t7)0I?5 zR#Rw@O6eL_dlDse7Hx{D2ov?~GR$9!15qwx`9=iJt|Ulxwm^^(WP@g7oVLk61NXg3 ztVnAwPeILeb$P7oBYYbnTbl{InM)C{C^w zS~^6WD6YD0-$wYsIP^h4&*IW$C@h8hBR+2kqzmV0Zra?)a*e zF8Z%Q`rhn7ZVcW-!$UvFDidS93!{_!vkKbx^~-hr%fF9?_9G<Ml6Cmh@s6tz~bSn^hQUj}j2ldG^%CVUX-eeSt})*gPT6 zH-4I~#C0sjS-2;D1w(ziI$~GBt?2;!Z~7WL0Gi2C#AH0#_M*pg+eepL8Bbt&l6zVz zEVO=HD^TV&uKfZngpDP?i%Im%;b>#s=3x-Ot&z^Dpb(R@{OW(bsL=S8%Mlk{58 zLa)B=RNu>TGgD7XTTZG)PhE8S$8_^Z>Bz+lP4n+qrdDLpvFhT2=VTi$pf<|Y9!M^? zbOT`3R;S=s{mk3kc=e~l*0->9mu-0l1>{o2)xsdjE;yWJ`Nulcz+xfw`x1CIntHQ4#DKF5Imii2P0$rni5@HSWS%*U*Xl!_{x>O-j-}AF7rGp|Ai!I`j~gNS zyDiLXc@>C;l%KtKx<;|HaNEg4Ou~?yGX$U=IFL3xt`@{_>jGU%Xyx!hWI*5$4<>Xdlu}8QzCYf`wdPsXfpj&w&t0!})DT<0t<=RZycf-Iw8Q+DTRC=`5*5 zDivxnXJcZgw(8avDL7R)8Rp>cBYI6wxC2vKLu==3^y*T>9m23pi@+}yC>WVId1b91 zw$Ic7%_<#?zj;QX3hRE|zUf{)cJ}WDu@bxPThtsU2yh=p3X&ecN2@JVBeda%+b19qYjH zt>WrA%?c#N9L)H0B1DMw;Pn03d5nbQR?N#vcoXg)olYWYNOW4#r?N(K1)~J}k}*?T zFG)!=9V&tPW3`bf=s>=4erdDdIFJ^1r9~(XPii$zBpo)Dt%j;~T%L}oW7iK#+eTL zp)zdb*Iw`PixTZgT=%RI-7a^?px*l^&njc)^ZiFkwyo#m2Al{_)Pq>qvyp}l$lisLUQFzdBq)b(WSISU$$r-uQehrI|#R}1loM~eU=`rhRA zG;wo={r$QHJ@*Nh1NRB&bVwBAv1NZWGt9vBrhO~A$9EaCg~P$etODbs&-XVfoH>6XUpUCr8N2bh`=O25QC-O9j z0I|WNU0%OeBIahC&nRLln!|`td&4=`%bZnSa7~4!Ou!Av%hYuZ@deRdoclUiivZi; zAPm>u*5=D`Tu+YydKx*SwJ@*~*cSS=Kj9en2;cr1X`$mftstM}Gl(R%FLnkMI;ln*R7-pI%qWx#tn z8rMxAGiOSB5ZlKnJk4RB_UiUHw$h#teIFem_T`rork9I9oq(d0q318O*0@DtZ!k2C zWU)Q%-;DWw|42=o!GkFt`m6lTh=VR}bONJ*6+2n`i=>)kE6>S>9%zr_@-ZJV9iaTm z*XQ7v0oJU;lRyJ_b3|rKfvnqlX<1e|ie0c~!MSlYhU!Y($PU$%XFD}eszAv z)oOzFlylhG#OzvH8%47fVF092$*M1wg|+l7umkO=T83iHe@R}Lc=gc>zr`=T{PB6H zBpcki3tXG6g5au=LYJWeMTl$RrRR1< z!VZ`NOE_1OJ)y)thd^zSk8KT9W;kTJU>mY?Qz`76n{@e`4XxCqC_|E8GzFdHY_iGYTQ3>_SzRk3^lhD(KHz(BKx(E zQ_~KazO?(Lxe+VD_4VBS|#D@l5$}Mr`TUwayL3eu;{47;3l)>;lGbw0yB}9 z>{A)7$0HDSW-)6E&3Y|@Fh7+Od@K% zzm>_bj;V720NYNAp&h*@MGeGJeZW4)(hyy>0?pLY83)}}OQhZtFMaNV1%_5pck z&_X001Led!YQCpKNl8s7jS&l9G*q}&OSzF=XNLvKjA8=Tn6n4Fn5o}Yp)N;QelF@? zZ30`K#@a_iPdLbMn3k~qhtdintisJy;!45~KNJb%-r6SmG01|>>5q&3Ev-eCs&DB_ zz5oO+dppXD$sqNpqd%JrCWNsBnQl&cExYm%D=ID-Y$!W58=rm?G?ZHlXrs1&agAzD zS;f_(w2X$9Gi-C0L7^H}-vM8{MG2NXSiH9lj?i~{U1kk4b4w*2rC8CoFQ9ixp*htm z!u+Oha1TgI5$fCkxbwYoVWvrXBGz2oc{$r7$O}-QXWfRB)04Y;BMV zLv>YXT}Aw*0ah^}uz;Wf+({rBEkM}fhNQy$kEynmSc6KSb-^4QE)e#;sIOd>)+r7rNyz0U`B42=l+n>1J^u`zgyFv zvpvG%mH1*&1{j`B_>S0Uai+%g)op{$hK_&$M5x-9k9Fn#wb|)>@%ittH9AzL>jF)M zj4$5rVImM%G30U+>)y8PF08eh>%4X_{XSTfs9abUpqv1LhFfxynSJ||d@p3S(%nU~ zT&&}2=*eX$*YqX2%Tl%1K*Qf?Ty1IXB}}VD5q3TO{#1iZ=S1Vh2D&D_Pt+(q>tns= z;Gisws0T0A2&frhdW2k#&Ag?+Dg>U#XUhX}AmxqgY=M7$VoQg`{gOQEKCgGB!m;Je z;4~$Pjdz#Yrl%);uAu1^O)4p?wkHGs@JDnu*N?aBv&G5SRAor~GHF;6eLQI{o`9;w zkQKTH%Sf@YC^4l0Lp{1il{uJeh-b*4D&Odmol?!`MT-Zz=}BDz1CWNY6i9`DYTHTc z2I*lYCMmWi1)8`qMuE^sNmC{Y%slafrM2Z;*IT~y+QGXSqRwusf%$^Z7_u(v*_4Y8r4l*)57@0MJbMw7IZ=D^i^#t8~@mwv$1Spg10E+ylNd+CrZcfD!F8-s0>ROobyD-mM zbhb=sK;G*c+-3Zg054}3gUXsqYZ0{*R%nPh59J*%T!gC0&$;V@}G>6F^WQ z6^G6TOsv3MUXGqCAxJL)hx%yrb}utiaU+3wJZDG1**xq>j=^5Qv5AR$SiDmqs53{O zTJjDj$x9(0!Rc-XRO?0`6B1M&GAXpeF?Z_(AdWDjtOL44@|Kb!Icd;>OGynHlN?_E z{y=bv(t~4}*2LjT03#Q(BiGsAbZ02q36Z_+9#}t}*f<87{RI#bq|<{Uq)_HG43Yv{ z(4`=lgaWj1w7zc+4X+3ALi7gagQ!9!anOeN2p5ah8z8#+Jp3?biZ90$gLIbI zR$>^lHl~^TLZ1xY6viodS;#QNHrP}e5+eqOk>}lx+WrA#$;7ZguHq4JNI-(4du#Bd@bUe$~#RtF%I znC1ccUqrJWy(FIzBv0~Bg_5(=Frrc3PlZUa#)DlLtI>YUQ1Abf`{(okmRp*gvLDC) zsa>>)*lCpy$1s5!Q=VBuu|G4!fP&y#UF>O0*h#T%e8wJyE6%8;WE<#fc7jk zTQzSb;ws4sE7FgiAHY|ITdE79e2KpA4F_&f9(uNo*zsppJf=u@o<`fK=K^ADLIBF8 zic7+Wa9a;#Yl5JPaUg|7ykCFrB8(TC(aYsaOIhdNp?xt1Lm10$O3N5*X-}?S^tRf0 zf4&88UJfoN%kkx!4?Q^fJiK*cr{(Z%$2+IY{62j9!0G*XabvdyzfUJG+cB)M?tZws z^X(bWc6xueHeuTjeEi-Hn^S)*>J-!17+i&H#_l5}Tkp^~FL$&J12Qs+d`~P@+g|eB zxnnJcp^|^qY4{+=^?HtLUaX;aoH}&GZ8o1k>`e6!Vp>aDnj_!VkvlYIJJ`BWVCFQm zHfrb=@u|+kRKQov87WP5VWHO&!qfp6WrnkMCSjh=x=PYYrdFRpvMUuJ1|y$57^{?-|8s)Hmhue^Q%+n=*G#X#d3Mh>NfBo`Pe>nP*yEFBZAz#Ph3aSqUG znKVK#_oUf1&Qp0Zr&l^^WlH|lysRTei?T`PT<$T8GOqq{%Z zT!aZ7gLw@(q=mSQngy@!YB6g(1h=GCDew!niMKaUv)zlMGN+l>Q--63BO7yh;LzY% zbmv`MwAy>M-&A$KG(zIM&azL|t_#8zL$3p(2vVMYGbkd09>$n(N)M!K`^aIJekjns zuw^U{mF2vkl{_tMmzNDs>^tuLDl_}4eg6BiD=Ny)XZsVQqte|yyqOKXH}cu>`RA$n zetFD)Sl*a|r9f)VTREw*Z6i;(S3sxii8dIP<=4WvVCc!yahh+{&aDt(oTh-U-x8wN zq75zEatE?AgP1<3G8nlj>#zVfNBMN%e?acyET;a$B+B~3bp0ROcT6m7|Mm9WAm*q1 z#@Oxi2dauEP`2lnx?iRZf)Gi3Qp#}tZeDRyDUlJq+fOv(zK$>w@1foG#MISa_)HdA zQE3q#Zf@>+Ztm=;=K7Ue*R2kBPQTqQxP-q8l4f7lX1?{vA_0k^r*fGuaws9(_lC## zOXVg@DRmhjwS(kM_#P?v93a|iodhK-)aMyRS|)YYmO>5|MO&S`*&j|{$LLvT)?Eaf z+Yx_Ro-m}EeGty;LHuVTI)VqfpFhp58Z{eNnS}slDE8`7I?9s|2I_skal0pw3J-!k zu0^+$#$2~u@bU1->PH+WkhU$_Af+opphcobA`t7hoMpEy(L%n)=rUfiT=;K^si~=n zw3)q#s;sZgfHgW!z#XkMeO4WMt^TaK>vAMadXvXs;Kra}zc3Fz%HL;CTRez=3@jZU zX1-uXR*%~>VjNJAO*l^WspG<7s(Af5P#xv|A?j^SKe1QT>$16SEnM?X>pkc+t)`Fo z=kGo6g=2)L+2Rfs=Np4w2pB`#$c^|&?X;KgOP*-hO+CC6owm231U~;|Ec!hNlI#*7 zq@|0lLECJD;0jX?ks?iSucp0I`?t7=l|iD8HUp6A#;*s5zQsF@VcN27U5^~nw|viq zUO*>D)(=e!cRIDBUk~eiej;HP6)FobLYaS~q)=|FLc67@J_iTa zC}^|&$(~&g@943Ljd3#0<7>qQMRu#YhalRwXXRQkvF}9AtMj^t3ja#m!AGuhGWE@M z`wlXyLX?tZ8H{1C7iodLAPOLrUCz&nM~1$fDR5b;*kB!Fe{Dr+cA+r~jwfhNGyUt= z8HBF@ZX6p-k6GZCucHBt_XP^Djt^bWC$5d8xc~^>;UAudedlL6jj8(VgUcfl8dh>a zbH0dPt@}fqO_F?pXz_kdE-WEumf%p+nqUAD9LVxR&qA(!VB9-ebRW`?@gm=|SDMVo zI*H;eaNi)gAlrv-&QH#@;wCa%Yefja<8fK%wT&%0pQCEJZp&A84DCAZS~(rC-SqJ5 zv5v;^B~VVONS$6h{U!ytd&Sb7)y-FJTsS1{`SH5B8b0$qEx*z+&)hOF0e(51W|q^1 z}r;137)$^_?L87F-cmp24)wuf}6kcYjEl zn3)}_azG!EAg6kZS$eb@+8@4t9^)TZpPF-|224YPVDc(2x-b8^&1K(?ehdo4M)x2p zSYC1%mt=5Klbzrj__Tot7piw5Mi6yekS=O_TZ$G(76+N#?FJ2fe0RBoV1E6oVPtMt zAELGkEEY+7ZC1a& z+E|jmsa`X-4VeqyTb?s^WPldQfz^ z>8M-iDWSR;K7aIda%eN4IQ(fpVddb{OYIb)wF#AJ3~u{3W(G4k)Oy#92_}{&f$`AJ zIBeKGpDsk&VI>0A`MNmb%p?frk#T~mkX%3l3R1} zT7en#lrYrtGI%yzWoP?QQ3}n=FA|9+MZBC{TpiO$n5W_Qj2rN8gwe=K@x$1pO(h3* zzTD^|FzFrx7ou*D;KW_+p>reOFqpz%?G0$#y(tk33(jn3kX~2gm z2ca^}>*Wn6c$`Y;lK%*+_hk`93c8(4>68K?66prKy6t!><4k2uq4WCCr&p!Iycw;CeVg2f&|>__8&*T5nMFUw2Iy0ji9-@L`ZsEoT?H#5?6E7Mcgs@{ax)Bf z?Xv`7--cnYlJgwG8AA|K(XUs0OCX#5N@dAq%FJ5`)*vqh#WC^{cxltnaq|?+wIEE1 z?4Z_y#4SvV)iJ3JQ<{~{G>hRZ))0qfd+?zYMULHUSx9RxRAAJDwZ$TmS;8eE5D$b& z+cv}905=i8Vp}$uh4@9M9eI6aF5#f(dBYraG+LU$POEP4C(2|V=zxj7M&rbbGGmnn z0S1P?8)!;Smk^=66Zg5q1UV=^Iuoupdu3?Tp5_e=8kKka^1P_^Q`3=qs{M#7 zu}F9V$~L%!2@@vAUWUn|u-5Dc1O%~`d8@Dd>wLo4GF$Grz`*Uf#h($3L1|E=Es~R+ zbb|G<_&JlR_LxFb*Hpbt5J#;jD-fwROw?qD41(Sq$gQ4^tspC8j*&XYS@{tX0r%Kr z`c{K_vALACa*~9tcY@N%>^HYZXrQ2VazJ|>_?25v!zv@ng?$k0YDZ95e4PG<0cpJvx z*3x#RxPFfSl>Y-mo*3#Kru2UCQb~=a)0k(nD3Gn`C(}w!Zh10|1cq{qx&zFcY1;}m z6%gZgZa8DmC*Gk#q6JG(;6wXqNvX`YU9}Z?hh^#m*l5Shx@Xd@P!Ujgy1OSU2X9`l zkdsP8*j!qfy^g10q06=9WQw<%kw>RT`*{iJw^WC^^PdZ8Ni}w9AZgYSh!Tddw&@&r zCkVH;MThB}LVQnBrJSSNbLM;xta9T}fjD`82$-#H`*5;K0ADo1< zw7?$0u&vU+aVI#Ut8E+lqut$Zo1A!!kGt*Ec0=k&DM5v$ zeqN-)Hg8t$mPU1caRR^x#+e%0rkc?kh)5{5PaoR1W|dRW2z(ID$p*De42BPDat6P+b&sCxKInflEyh z*f@bRlA)qT1a)YDYK%e6Acl*8vqBLf?HDha;pIdTDku)IQJ^IHx;Lyhtg&aOp9n4p z{+`3xfRz|7DG=SO1DUseka3np3rBfY91$FeS_>zh3<8<2$RNbo@Mkw`E6@oQ(Pbh- zwaCbxk}9A#OjG}6*CrCx+u9)~r*1GHX#@>CdJJtiFpf4B6d&=Y^d{NE$Qj8D=pEks zxpWQvtxpv7XCDNNw`>G(R}`Z|8-tRRgki>XRM9)1kk4TVgmP7t0Y*#pKSuH8V*$O9 zu{{IL>iRcPMXhaJKY{Ob%@Q92S-x6w-Cs{$8Y+lJ0WDnd5%1IZ{9WCik7w(~`IhFO z2l-TGcRqCxD<|v=WpFAaW}eY!rJsD5TE&Lc=ojB(7V`v&WUbc8L(->dBe+<_>{XEo zcoJJC4QiO;Qe#Y1N{cTNccP(kRYIcxi_{e75_fb)=7VC=noAl!-#9-fo|L4^hBk1? z#F1Q6xvO<&I;BLE?`reMcZ}z#y~}`6NS|BZ|BL`OrHNxSx`mGIvM0p#a}Yy`oZL&e zVY%^Vcsk&)SE(Y*VY9;`@dSD*cTJnserWokvDJQRakOw;4mwBcLdDPD=|PvLs8PCgvRBQ@8TiR_u3aZ0<0c(fgcC1IMIa~#&p*0uOxMu{fakuHu#gz z&mG%(gGVs@o2oa%r{&%I?Xnqi4AV7lA@z7VJ-lCT#$QV}Qsy(3*$*GCJ`PKH*1eyn zx6MBGucq%8PsvyKxA}eUdV@dSe-$?$%fn~m^Jn7LHyZF~f4`hx4TsSmHUainD`5}S zM|9ehUGLspA*y-XLP_d{odGX6mGJKX^v|$4pwoU0tv=x2kwz?$Pn|iC{OM(qLE~)d z7I$zs8c8+8qStmxL6Nl=cmVn%a|0rsK+iO!sY?5YTU$bPC6?rx>4tO+3$Js}$A!e> zS3s4~=$OL9@1XzpfObL(EP~GgKR52rYt)ZM83&V4`D70R9_6`>?7`+5_RYEywAEl@ zi~fGN4}{Z3jm9qDSM3*0C=w)-deT9!{0cIr^5~>ZGQpMf%}RnybeyX*GhnbM=r&aeq>R(0%PWJy=E&of}>HjqFZqOWufB?G=m1)Us7di0a zDoweR-MCO7rOhe)K?S)lbGtjCfo8@Xv5NEYc!1EOe7s*=YlpV_`nR6R6IUhOG10d$ zV(KaGP2qJjhs-mhJ3GP^(#f_eo_ufVQ%uH_VD>hOdnu%9@drm}Y}31#%im!4;f1QC z20_?~$~Kndn}79I*W=6AxZvoDwTdI5kZTld#uDA2{{}*X9CI-K2u#H&TvOJ4VHb@4 zR7#I)f+4#2UbV;{LKEC)!L>H9Lm{Ua9gRgaoa{I+lAVZQM|SE=gDJRcA+ah(6ZL8jWu!P@$+Mdna2o6e+>LS%f>h?sZc2G z>t^L&cJF_U6Abk+-328s7W3vSxXv^mUz=VfG}I9KtLgc8AF3*R{S$1}IO&r~N^Qw4 zWA3|vWQ*n|cLt#uB?YNL<<(ZP&;_>f8AKLR(2-Ysl;D=GrxL9w6yE=*3`(Q&vfaN) z)cz`og>3CaaB6@=Oi~c8j%>?7w%B;JCSUPr%wRSJy14;nMxFE7{;yY>PEwtRTAUDi z{3$MyCgMXLiUhOW4-H|lL!?5?1m6-I*o+Nq2MXn|(`B66o|B@ZY6l5=Q^fLsdkLpJ zS>Co@R+&?Qyq_+iL(~bgO(b>+j~(50xms<4jmC6+MI^ct;rn8J z9!}ozBX#1m^<65`*tz-VLCT%dGyy#+^<~!;G(1xWW9ODL$dJ`NP=2AN4WWaot!9!} z{dn0~sgca4T^!N7dux1G%IvJ4;ll`5=ev77F$X*Z;nziwD4AT12CH4sa`XIs>S`}3 zHLJ?G8&`qfLq(wuM|3DWn6y9zr{`uDs%rIcZ>6Mf;tQ*4Vte!Z955!};;~L=)*?Y8 zZad)x|LGdaopMVSov!55M#3j}FZ!K(^)bzeLD2=wu0fRri*kP7FZ*BGEQY-oJx1=l zGFb_*rER|_Vzff8e*h0X{yF(~zg3T*W$f?Im9SKrc2p}C1B@B+b6+F#OuErN!S>gr zL00jckY4bi$&mFShQbk`DG6Vva^30^{Qy!P68|5{-Z93uc54$Z+qP}n)-Kz&UAyes zW!v^H+qP}nc71g^>GbLJlQ++o`{$flYb7fg_ZZ_+(?69aj{n9t{#xg7dhM^zwOXZkAwh!2yt;iE z9_DQ?CyN8xjuCEt4oY}1v(pu70Y;e+U61P`52*0U8?k+m1COI5r)xXkx**m#9tm+i zxIU7Y4-!yU=BmV+_E*BZ=g7Z#B#~>xH0x^Y_2WA^cf*1QDDYG9ap=RjBliQPu*g;P ze};c2`14?Cb!tjOIWn-di5Y!^S3XXDTFnh$`x~MR9wm=J&qG8GPhG5&jBbZ_zgfDL z`OHG(I2BuNtW}Vdh4~>-Uv0Ff^1)qR#mhfhH}e;}c1GQqQ<`|QVDRwrg7$BK#|X<~ z3ii0io*#$)&Mn%DnSienG^mW3d%))VKpjvx=x5dLvnklFjU7*CzL^UH9*7LC*T;B0 z^jnA#wz@o8f3-;;4p901XW;rto9PfJQl|%BCWrtLz;9`lJ zdrPfUZhUo6R#{bBJlb&e#rHtJPzY(2i`$JR&7fgG`}++eQx!vUisDsn*9R+ch&oU| za^-gwh2XF1uujK4nlPsvhsG__0jY#RH;MTydkm@u6y00EV(2XNalkw*Q19FN5Go1B zZ7BM~w!pQ-dhm{54dH?|Ly*6WF4ywgVXp>8`^%-s;?dmvRT{7_p80ZWqN&41p=GO= zK=KMLVCQBjN>v91t>8|x_5wL*d}yrN@~W*7u)j@%v0SoLR{X7^qY)KTm7ff%FEqIa z+Qm@8JTKE7IAvLq|2*b%b>s~M*%}42DAX|K!ZI2h=7S{}CswUvQ2ng@%uk)1Pzzgq zKkl(l{}x%pln9o)fJq*7huwgLdxPG+nYxN;gz2Fe#zyhE zcah{o@<|28{lN}Lqs6JmaigyphfxdwHSahC=mUvvGs@Z3N`-9=crBi~8yj5HCe}x5 zy=_CRU>4ON)0%^fe>Gdb6>IL#h}g?vbj=~QaSBi`%XeC%__9fz?HU6vSbqD4wrSgy zjn&R*1l?r#y0~RZNWAw?Bm+wXMZu#MN&tkpa?XD8XPti6_dDzb_oEnlSi?r_J6vbX z-|hGw!QBk~Q%Pg~Z?xfmoIC$ZRL=D8bLW2MPFrnum>)y%6Yz3Gd?M1G5hBxoD7pIbP=L8H>X1sn@;XnYA%;lV{ zKHg(cbvDzR{gfvxcplbYV~6XIn~77@*Y&bQGziD=PSIkZhkwX$u`adn^KhPmcy6=` z`sdLG@oIEUOS6CAY=D%oy#yX>U5IRcp77$RQ0PLQNG&)UdbRLy?C%|%BhgT}KS^xP z5(!cVoLGtl@>>NF98ZrBLw)?u=F2Cd&bZaKt87!B0>a zzd2$;u1fl^bE@^WeSWF!x?RRYSN|cSZ9fCIcJ~IShI}5iKV?~H;mZ;F^k*`PWl7kW zM!mtXvMU$5*l8aoP%K6)vAAH3GOPgtG$(T)QvU5ForvQ7+!DOLPL< zP*C1+k<9{2|1?2G0mjuNJp#d+I^#5XXArg*hdLn;_`p7Y>l?D8#os{9n@PZa^`g@T zQg=mtIKNS>uO1>06Qs`n=+{~mfm%Wo;adIll)S;TWfQ5p1F&0CB^(J8&Ka8aJfkpq z{RAxYP;oD5GvBI{Hf_R4@(%eBbk}aeaZs;i%gleiPG+NitU7 zkl|~2)+vKT?`OYcjTSL(zj!0m*0?*U*bG8%I}mZG#r9}d_?~FWU$R3__Cu(YY{TCM z`;KuA1er*{otjnbAbt5W6$qWoWzo8m z<(*vDiP6!baFfl$O_-xrWcUJpE_RDOnFdz_IUT^Ml~oxInQd&gO+XJuZ!0lbBC}`L z>Au|l4<(oVAAPl0S^o7ZuTkAbX@d>nD_hTDyM{Z{X7nj5#_L1?NpUR}$+01eGApvi z#m({~gj6_QZ(FCzYdB6?D%Aiiwn06jWl|fIXs-pzf`{-hCts+&WF|YRHD1p4w3#K7L@{ckwLpfB&dx{j zGIZ@U01V;9Eg7K|Q}6-GMzpa`%0JF5C5@F9HX=4*j+@-cqVsNzbDB?^nga4@517n& z6N+NLEmk*6H`4Hn)=MnbN2NxmXt7i>qPQb3?ux66rWLQ}*Qm)Q{(^6ZWe?pCnZ-S8 zJS5@hEsSmAfdE1wxJEz^M{ZH=qiJf|71n_@L8#gpusU@z_%jo))Mn|nl4JUF#dk{sP9BG&odW8O5z zJpvs8^AJnNReDzv3;omY0;!^4z}y}lL*(n4F_>Oa-6>tE%{9vo2~5{oo?yhPtG#D(ONt1!$6 z5g1dISR8^9y|ZOu^Vetd%TV6lfuKNRYKTW3=HWHwcL+NzCr-#`rUsd7Ov+KFnV~mY zN(VGBbSLoS&@?b`oJY)9M!wX_Swq8AdJ4FcslyIoJe%zvHVz9#m5wQ#E;+7M{x+`kCJeoo zm3jvCw(mv_qKQ*Aar7HT>}MHTAscOaSJfNl9C5m=UcHc&;bqYEfY9#HDjUpu3G~U& z3)zQtX*EZW~L5b0S~Tj7e%{9*+`n67ry^) z4d{!5&(IoeszCOUhm_2m^x&4Q>FcQ$m!aAQU~Z8@6kr{7LklO=yrk#4_2RS?kuj+V$b z+#_-TfIq3FNu0AKw0M?2VTQlOME9*BSS|T<^WLYU-SBR_K#wM>p{<{jFxn8MQ(y&I zn*N?=1T=MirOFod_t&%qd6k@NCU5Y+1~_IE*v^(l(HUo0JH|{U-&`)&pAFSUm1O%v zJ`XSEwa1)&=guGA)Zvb=uNPa0!MuF+ds(_w0BD@!UVgaBfzivpC9dddqD^zp7p6w@ zOC1OnKcR%`y2i@7=7wJbq?h=?4|J3NljM%zuIzR}1Ozu9JlBa;TNHNf2#p6npZUDl zI$6r{qoLpIJ(!r z2Scdu+W#ANYW+CD)zd*pA|;PLO6)V~t4J}X+{!|9(JW4(&6REo3ezEvZ!dW8FF^-` z)$FR~uB4#+X`w^uzM%g+(JwjoL4;xdQ&9r!phQ9s%R~c8@R;mO_ne<*BVpgf(!Ml_ z0Tcuk8#$g5=0Kim&_sx`c`rLvx6}n%Nl^^ z#{-TkDijJyvMQD++0q}I*PbD52nIK@lrmJ8M}l=)NL)Rto`Z201T#9Wkq25!=8lF$ z>#Y~zhv~Byq;-ezIn;X&;hWJbe1ky;I+)uB&)RYL0IbX8DT18;G77KWvkOi!0?n_F zS{et|%Z|tF4n(;NE(0yq&o|m2EkDB@Dhw`C+j!t2zb6PuA%{ov(@03TO5+W%%Vzth zk2)sX*7%+(lKBln5 zEHA03n16L?6>Njx{cOtg{W?@@kXsx9^KeQ1{rtK={9K~;7Y;zKTp>V88+P#hTOY-T z)%hS*7yLBc9L30Hr|r(qKqN z%Sl0nit9w;UN6)dKc8jk-*(y3ZT2a)uzn;*?0D1s8H_;sgWiCwIau37|PzRRaa4vT3leX1csR&hse- z(Nu{SsUt0~V92!w9d-g>11^=J^lPveQGaQ$P@lN6WpWwEI%w}&Jm5!sJuGqesX?GZ z`^2P;(xi^V!tic^IJrTGyYy* zaOw?Hjjin7uduqZM5ErEs#VulzCwdf+u>dDe>i*4upfRLJ-Tpqw|jZe&@*j+J|2V8 z+xm8APVozT9bVlkS+{t6Is16NI)A_J_LF+t4ZPppt>ZUuZ~IcR!$$6Qve9HNRT+AF z!v{CR$0{m+NRFsg59xmHow)_MyE9%cep^v|0Ds_!(Bw+Q;6eICbMWDmw_o^iS0}xc zE7@Vdb&+Y>s9JgIW35>3&D&GZ$!np&GPGHvM&>hVLTBIg(2|S){9P@?w@wO<{aFXj zB<{=wQQ_CQtfT!k9@j&!89x;Jh`rdR6aC85ut&I5SlT~CI>OS|sCsS@CzEH0>=U|H zvm(Gm2!WMM^lXNH>)K$<+K-JVy9v1C?6{CVueul~m9-QaxR}qxy&0G|($|JbP(mdW zo{cOu&`qsjJ{nz&aMphtDRjK@IJ^ zzj1wFi%E1b{Zkp`_$LgCgXv#e-*&2>+a0hVeEawgN=cAXZ<5t!9p^2cQqWRS9k$Q` z2_lY>T~)VsOu1@~=}kvoUKDIP%Aa^ke!Q(R?|X1%R+8-=oTKZ}>4KEdWE}Wp&luOW zWY?s=dL+utMZP)U{6bqiK)-g^c@P?>l;-8jn&o()xVPE2;iXtF=R?1AAb^+NRZx6jhXe=5K00#97m|1*Q~53g=pUYk8E>_W57W)+AV@lP+mF=zeWxqE4fk@B>uKONSIU!rjG zr|GPi<;gZlOQ4@YWX-<=GtUPvhR4RPNI}K(nrws2W)n3DO8HS2)LX|~xk}*KUDAIp zc)=&{x0BAda{dJ*60f-FKFRHy(A_F4z6|>lN(#G#>8xe*PPk}Z2Fu=HZJm`?bo_UJ zYET-F)vl!`U!UgHP>Rd5!Af?qb_L#XBTaQ*Y_jdf#(cH)DDY}|-ZgjZJn!w@IVEJL zVQCb|w|kY8!sIr6_s*rYyj~4M9^raA;1xTS(;o6(e^I;{`n#&c(C~D6^6IvYM0Jbb>_7{bLYwU2R~@!3KJYpEF+vIqS1LjL4#}iVwUm{vf(jU zpc*@e06&dY?{`C1o{LpD6pdgjT=>u|Lv|E2ymms5RwKGX8->jiyV*B>SMV&)biVl2 z?K~$sOf5$2FR8%p&K5kp@Xb6oFT?LCs3!fLc1q2JFMT%|^u8F7M@Or8dYhFd01fro6?I)oxj^lW)S&Uw3BhMnVr^>TpL{&!Be( zsl+elt1hhcYp)si_XSV=AA1MG#EX;LSvdH5G|_LIoJbWO5ZfLYd&3PBJ{Uek9|JFv z(F2L@_Y8xwAvrjFAcFtrko3Y6LHrzwe>fOK|L-9Z5jl{6oa~L=*`mgN9m?QMlt3C` zbYrrMHOgC*=5DBEI|H^}UJFo4mnF#XKS;Vd6GM4ZI2eN~bx6&5p;YCvIMQ)-0c6~{ zW`P+o%F8jCMNYKZ*h28)Y-o4s&zkE{h)HI#G>@XoQ{2R|iO1nG?cQ1a9LL*T_>v_B zXJ0#en^I9YLg#XS*4%Q zw01%gv>@TZ&@13UUqDH(R_&!?5+kUc zuPFX$5uS7l5SzE|wXD_-_GPWCx3U~^ZG5;fRu@>XE!PXImF^}JdDtrL(jc@xPW~s1*bI*-a2XuNat3T#eg92~CYbmC30%Y@b zSc+NXD-quQcNa10gQNh#m5F~6=^0F@pLb$(Z&2@UiO}jFZd?wQ{~lcaH?+#i!1QmS z)z1Hz&9fo+PV4P9O9+TaqCD;b3C|WwW)MzhuGsj~3KL2@=c^{8goiitUD$2MiLcfj z7wh;P^dfkWTt{^8Z?0l*Mt01u2QJtDgl0&H88Jnhv!v6C31Y-DV#n+S#WNTeXz;!D zb9Md75Q5?kqqXH`d7!~Uz>yiN9#rsASB}u6QPNmIjc>U~;nU7q_nq?Ly@}L+P8=f6 ziSrXx{^LS1Qs4s=80+2@<0vR4fJ90uTj{j5mrJ9$8gt*@U@=BCFSL$}2#7mqjN{oA zzY~?|hloaeY$etIeYMph7zLz0lQB*9j934Ld@*D?zq3KASLVEFt&om~;i;FKIcmpvn3uuD9*RvrJc4G3b5TuM!?ahYr~%Y(@1FP_ zb&Py2tb&2np)K5_&~TP8$x~5!w^p3j_~x-QEAD5q6-1>h!?6Q6%IE@-sjX1VAY)EAoJX+_cKyeHgUdK zoYyg12>wE}vMdbj$niUyP}W?Niz{#u;_P-A+O>v;m4JBhJbfS<7s8QMh!n z@+ocbv55DW7E9vz6yC(f!nhR?5G%D?5>bTp#Gw(TT0i4ya1P=(8_NMYc zhfK?DQoGV3hrQv8^4<4v#t6Vml~$xp1{E)rQbqUh`K&QiN_M?;WIoFDw@*Ae)d1tu zs%x6Dqo~RfWd}m+ZNsh==M0|Uaa5;56dC9`ZV02 zWQqE}?#DS7AV3CN)r?Ns?4o*5pEKydu2X&qfig3$SObiyr=EP+;QKosJ@(r4DfpKV zOnl3~zYBTWha*9Ck@7(SqcrY#*jfGIK(OL+ls7Ke-rfvWJbBvsC6MbyU3C`KijD7x4Yd_>0l6$>mgx zOF@2294yc3NNpOeXP9VJVq`B%+d z?_nX)x>_e27#_wNO?2(xwO)w1Y;(`gt}XF=X6#hiXU@)g5cwOUk;U$&H_{j*=9lz&7T=k8_yF(|k&pdD!b=X~dZ1SM0I z0262S2e#gkn8W*>L3*B7vMWvrA<@ulQ8u>ofb!HSl4Q~ zgQJYgg96|W5)9R&Z62KuqXLJw-t#!12*MUCjRyOjDnJ;T%TX%@tsy}HB?=o|AH|_A zuoxD_TB|e=u}~}Sf!&{?8KSdNO2$0`_7`5`WzKm-$jM3=t%a@^`DM=PM&60C01rZb ztTYrt^ADJ;pvH+XX0SMpxyUYJXb(pW2N6hI7`iATCT%$W?8$71b9f#A9^4mSP^pIl5=UM%KJWsEf) zoy#Y?d04VphNbKIuVX!*Ur}|>vzn_4OYQVI{JtBVzg;jRosCt}MAXI@`wx;~s~)cP z11#rK*{8Hk6j^&%F2T8JUZC7Z#q(%R=3slt*?&(*Zu$6kc6ED7si|4`(lVCii1lxxxGJ!4!_gG=fK4b&ti1o!*_o=yuW=}wNdJ;r)baQq!w$d@b~Rp0yl^Zrx4!o zD5AXJoWdura?4tbX3;0zalRz>ThgXPEWVoFQ11Q!CNxu|gPM*wtk?nQ^ec|NQH&+6 zxsok*kbJFxfHE+X7GTT~Yd;8VRJg`KD@)0$wCWyhZv?g_CO#Rf)3gJkErjj{!6X-E z&fsiC8|ljd=+ucd6Q}oRR^1o9APbv5VUUh6MUM$jMArgRHfX<3bZMe#jnRVP1C z@>iS|)ro}z&RmHsmo21@7K2pEG#+qe6x0i?0Ce^i!{VhWI-02wOf>FH=N7tSW$>04 znwH%siv(f{KBen#5Zw*=UNQx>j0bl~NZUVrRaiUj^S=T}<+8)wVRp83*CB3R0t|CR zayoiENuC#l6I&16MH#HBc{u9;*|H|U_77sYR&f@jO|_haq2ybnk7kamuz{}fuJTLaO^?f`(h8Vv_Z|J5<8n}N`V)E+ zvT}c<=ZKiCbfH3z&r07zvJyYUe{4E)yqM#3TG2`9PPc1v9gtDFT4?z~%n~t}p+i=2 zS#-#^F7C8rGJD~kxt3|z4_zU@iR87_R*TcnC}v0|!#dLf|Ji!h4ailnLh}z5l#_ws zA9&V`oUH%0<8D-2SKQ}7@II#gVA)r$GSTW9ID%EzH!xj68C{TXya?Q*_yZ>Hs=<`< z`evgelSybmsM6uL(e`jUU!o7#3xqB{0wZQZJz@TocI&ZN8D@;iPDa&UcD<|z{w+%f4|Lx0 z4!>2)Eb__#k>my+sD)$75T<}+JoHIBG&*G4X%(drMU*-d@tqBCzqbVjNQXfg_3fK~J>@scoxc=Gk@P`w>4u{y>qip2=adHk zQ_zfK$k+;zpKW;oj%B-$olHa7`4h<4v0e&O0R$q_tyHKUzNtK^3@$*^Ri{`}3t z-u)NB>A<>?6;ULBz#IaEO|o6opTQhqI&)(~k;GMPQ+(%OjV^!H)W5r5m(Hz^9?{mM z+IQKc?2idtO_Um+^`W?dsaNuJI8CR!@J}8vgI6T<&3FDXimuAaFf1Abh}DXUJyVi5 zF2&J7*B4n{3ZP~~8r>6sj$+w~Es1f5me?o>PBoj`M)*QS@II9yGAO(c)|G=$tfDJR zu7=jx>SLWXQEL_CAjtlznY2VHaL2HfAaB^?M6KJ4>{7ix^8+x^=nyZHqqEgzA%%1= zi)C#UPSn(FC*`s@-}+!OX{+IaJpcRWEV_^evw2>Gayzl)GAzI9ygcr_ZewuKsS1=L zx*oQ#%`)(!?A`{9KY+O?#u?hqTe46UsngX-CcOPID-X34Ob4?gbk5~ivCC2?^27Ia zjQu5?M$Zg(cQDj}mFYL+y_edbuaj(CiZIO$%U6xBBZ8c7t3jy zVnIAfEnTC?SE{AMExTL%Wcan_8 zi|lh-*km)@E=XEgJ<@*FBLpBLAN>c84lc}F8fuaJP>&Rfl-w*8UA>-V>b8#0=o-IN z!2S3TOs@>RwE;EzrVD-Qc#!CpGE+QRvImfyCC|crQ5eIrONkCW|3mTP_>q(RACbxb*gpPWI4S49Esp=8J>ve*9=HF_z$>eHg(U(IN3h*g z3&fhvvW*Z)(1!#0>#V@VetE-V%3(Lyicy*xIdOz85Q-{fTJ^Uy81@&M$9!v=@;wX1 zLs7FR?gw+S7SxoOqUFu(NWQ`NhqLht?&POqy<}kpB-53h7R4;6Gs;Gx-!DY&C8ld^ z2n8mILr>;1{dULG9+HVlEc*j^7>8wV8&4H$YfrRPgiuQqG8#+cpc|I(f)Pt&=novf zR1452en4w&K=wn>{U|Gji@~}w1FnYdbww(KAX;WPimj>EINKSdbg6l~sud$s$yHi` z`-Ousal?*{YP(0sNFo9w358rDOXzXNv09Kh2 z3Ry|D@LfX`e_~U5Of49Odjt&O;2tm2z|LM8D@s}9geF4FUF`}*T0B=JckR1A)h5NKT^jm!h-qsxyuE|GK!MlvcJ`T z-uU%A*9!~6Af&Hf#)XzamzT^%%SIaSf2Yn9g5n)=AYs3Sz`0kIi!V7{+U^VD?(KOm zUtK-+ils)&e0A2)HpJl7M^-ZyERT8mnAMUKn?`JaL_7 zYn!CxlDEIX>}XmRhdlLVbQ^~cBJl1WT;7AM?sXflO@QaI-T*^{VDMLZd5LhH_s1oV zePv|i5D}}Iu!+-DhuzJhDrWM{^heQpz4HfS2HX0Tb(1b7Zp45c_V!jL!HkB)R6+$GNi`a1zAz~8*TVwR<+l3(Ziuzw6Xj>?&mLd9}IoaWn*aP9I~}& zvGbs7vsL!gqfyMp;8!I!j*$!TA#pF*H3u`Q6>A+P2gZloGS_#s>RO-Pts`VAJ~^-W z1Gb`iEgM}=6ww|qrMHjX0o=RZa!SF!$*mp)IIWObsOa+OLmXw`T^op4z1oUHnD<`s zpHE?l#Jyz3@&z)@?D;1$BPYv0A*Bqg|GtYw1FpMsmo#5>e*Q?nBFh=0+kFv zDTJxl|3E;H62L0yCFu2=Z!pvNj+{FHL)sV>Q&wWCvKxs zrs?T{*5|Mh%NByc&_8)x8B}V*`51jZ6SiwjbL}Q)c#?mXt_8>^8WxiORJUBdI9|BP zMY|xdT`$auvBQYt`fneWI|c_eqU!rA1XJYfxNYW z9PX8Ef?F*bWYJ>p+a(UsE5CRjDCLV$#KGeo=s4(B)7asjx6wT>RFQONBw*N-_oLY- zY%2EJbMYm`GUHj|-`uI4ago!LT%mN9`<00tb`< zQQv@*bMZw#uVba8?w34TAzHwLR?xt z3MZT1fQaLLCnoAG9aAvP`f<07)ouPdx~^3kDv)yhnG*3mvZa*MN2#MjzFFhWYi&8~ z3i3&q+Yf76x>xBknH{l`2_|wsua;WzdCAMeD)eNB%#C=I{!$<^*?W#)qDX_?}G1QL4qVq4`FAYF=F> zf7E_}HPdP1#{s_+J^-Nye$JBpUAz9-S99mr!yqT8ibw^hdKfdzaY!?GnrWx77J|qb zw+l*dO5yVmSC<+oZS~tKT#l=qr{%~)4Wpb`1yVs_1F|C3j8|N`JssCM}1OY)ITa`F=bDaSoE^=6oMabpT6Ca^3I4_ut%WzkLF+ z#5(7!#iaN8mu7I%`|yZqM>_8)BD0!zq7t_CRTrEO#mefL?#}`!Ao?~>r;?hRn{AW1 z%%dz$DZ3N94M1vPqM%!*{+7)(IrJ|OQXE_5sAgQanXI=F%19`-Q$ai1c0WFU}PNjPQ>P6b;hFN6(v$=(JmtKYrVV@_`p zCQ3*W@W!U%YzuF$Als;e43G{#rZXf$D@utJO%-aZ>o;alYp-Y}zh!XTQOWizevbZi zxC|jKA;=YPaw9LBuhD&BP{do-CI`?5nhneB-e7<+AaS;+NP`F-k;p>vv9Qc&B~>%; zFd-e59@(~A{B>K=sDI6LnD7XVl0)%uS8S>bF{duw;3;?^;oUI(acZ5=$#jzM_s}+q zO6VdX1pqb%C+*!2h-#(hs2k39q2!cV*T>9^mB3%*O6Ju$ikG@kCs?iOQuZB5gyt^V zWjWSYDGWgCyJ|yvqiqzUpc59`Z`RzTWLllli(JeJfc^S#vH}4wn42ashm?V0N8G+? zYe^R&j+JQnbk16$niBPz+>y%(dUICa&ZT}4UJbq!!*nwW`fOy)RcHMMrzS5lEmEu` zMjFht$!jeC>Hv0s^P6!|vlP*GVmUQ`5Klz$4N{PVPleB*iwI(z$(6m9T+5H@H9;|~ zj37q7oaGJoF5vSMz8)KNDP<$ESL!~)+ENQm`kj`tfg`y-(UrKi(?0BzY@8u~=-_D~ zrpU#5{tYi>=jEO^;hItY4frV*_oJk((_aSyDQYR_liZI5rjomaOOaq=gM)$dg{H%Z zCc7f|!yU0Kh}1~H|Eq&z%t=33Aaz$I6GW^n*Ny%O2=G!L-O!C_Oc~+>H%>E2PXN+1 zd7wPUJ9X7l;5br=?6MDkz_t`s6td6J@UgGZ)_K>nda2x0VeVVA8jVy9-3H}>VFJ%q z&Y2Mp^VoB0`rhiWlNS=XrM12rFHzUJ&R{vrJLy-w9z$Kso$D*D8ZWb8j1O0SiTq4t zS+p<57W2Zy1ESC%)W8^E+31F#D%DcuGopFl6vi zFf%t-&Xg|psWlU00NkIs+>H8HdM9QS9K6izfdiZu!ezNc^Lc&Ys$VtyC&fju4K;{= zTM(QTT(doU*SEbm%Sem0iUX*VmEE+sJLvT8KtICs8!_1`$5qkvklbNsZaYRZOMQej zrRnLW<jU|{95)K%GFkb0WwPQ!nJqs(L^{nORJ@~^dw?Ehsy%liL={QN6I=Vz$z*4yQm z=RY5hHyFu>t)~uRiD)8>h~<+aG?p?2I_^GAoyYU3&oh30eWJ9ME6T8lQ}lpu9&M4-HZ99GzvkTWqm4z?>|^vjVGi(| zE{=N0;=A+Fg!$Li_Y8J^ovX2NN1vyMwoE;3zO5uRa+sn?bl*>p-k$Sq`jUJ28eb1L zw+zCZCb{F|l=Tew>uqgY{-WN6Pxsf$nC0zlFB*Dm6bLb!QV2o?okvuhE+2U6QqZ-d zAWu2D@o|l4vhf_>*G4b#Bt%byYnKSUqv>#YzENRane= zu%EaH$u}2!`QUtlQ7RX{pK)KmBCX6SdA)RE|7U(JaF`rxM@GFw1&4pE`#qC>2x4ZV z1LAbqgpo+63mkkPz!0iBI&J{j8Hd)dpk63gVCuk!&{0buZ(GqGw~NMw(63%?M8R9x!ckUGnysZ*sF-Z`&c z$<)F?CHZ`>32wMS+~cP^CH#737q(7p#ox`yP-(=kn}!5q{q{lZEojZefwS~R2a`0e>aDi4D z+TUi7=0O~jg+ewoIl}ZOD#IUUGuDWYCP%O~Yzj{{DXXd+;cID|X3q#{k%L39vGV#E zqc*S|i#=9>uh@Pq+^d1yhex;d>Sgnj&F7u@_f-mUSEpX|E&khK=uTDCxMm~tl<{cu zNI~ag3eCP^kCi22Z<83}UM+0&f;l|s zIRX4=H_ia0h_bkqE-9efd$Ne}{$B~*?6?p^=a|y~8X`)<-qr_V}=&1iug*ezr%m3SsE*xn(MYX6FqdJ~Oomm&GA24YI4j z`@c7S75c8-C=9CAnj;PGZCQxBT!9;c!Vh?*(fYFwty#VVf_!50o@^@qzonI(;h*VQ zod4RCwozT$X`k&s&fWI(Q7p*gzsI+-=LXhI&Db;kWXYPP|8(6=t0Re0iXPf;>(CI1 zG~Bjs?97~)M1V*D{9Xck@JqnHH{fhwNXNS~ z=)ry2Pq9}biM1*m*}Gwobs>x4K`x6{Nor<8v{Ef5V=72#?iFvgb-o^a{cPx_n$ctU zf>sG2Iwa$R+%Fk|-uv`ngf2+GQm=xw4C(Iz5a`E;rj*qtV7<&}UwbVSI7T`okHFni ze_Uv~*zvTkulpE0%DSL2iy+u278K9g5awF*`ILfx69l+R86R| zI}}@cS2SV-xO>`l2gFlgjJ6~815b#sH!IOJyMN3&HwYZYG$lIqm%<3JIBPFlEw@Yc1J!0s4k}^o5hgr^k$7hh;DREuq)09WWrcbr(9U=aba*>0s zH?w(BO`zNA`O#GZ;V*Hi3bHY9z+eF|^zsx zG<&&I4{GuDEPBDY0ZA46r9l-y)cFM9Q-DSX)#=R=C5&&TW0Oq* z3&mV(1>MBTI90q#O0>fdf)btZ14fun+x~x)yp6(%_NH_J;cw#0=TSNY?7T73H z(KS^p1K<3JShX|KG?P!mTSV~2+FGpM^mRTnE9$C}%{p6f&3*g+IE038!)IE?bvC`* zh`jf64AK_GGM6f#$~XM>1|pO`MWim^o0PtUI686WQKt=50gul*onueYC_63+jnr} z?+Q(E!_%KkV9^JbY>CP@hn%3D7i;cM%;bhsdO|!({fpodrl9Fs^w zG4rS1rW{fJSQCsdBnrfwy*IGQ%3z@}DKb-hv8eGxRpSPZ=T7AyrGJx3)@^Lu{^_eag)xTL98*hIH3a|&=}!;9VAH}!S9OyUeP zz@AnvvpYj-YCypj1gY;b$LPB_1cI2r91LkzdS z(_e$ph3_R&*V15GOGcs?f%oxOIz0}$IniXF%#iEE+smH;H!Ezd%FN^ z@SO)1YWlvj1rx|la`#Mg%@z2@w12#e!YHcOQ-L3_DQPBwu}yCY7XE{X#p~EIxH;8E zGYT|j#>2vzmT$&dmac>k8*BUhdmwUPRceGF85w5SAu;i~PatdIwZji^L+VQOpXw3E z|8DjF$1coD|L>2THGU%1e@IL-HM6`+V3v_#r9{2?;tQ9yXv0sE31P+Xk%R2kCS!96 zjh~NP$P#ObCM_{KhXlwXQ@2x-Yy%)%(BNEtx!gVM4tn*o5%PyhJ8i8F=w{@1gk%sD z`>hOEr_sA(UDCouEsnD;bg6_j zk4{;=6_UDgd+Mg}Rr`u`x?OG0DZh3ZwriHhK;nSf67eSlvAVDmi2k&fv;a7O7wqmr7L(;8QN*H_Eo1l2Vz1B5DO4 zc$X^QyQzGpJ>gqE;FM}&h(YIgJMbdh_2SM2{VAaRO?%Oxj@1=N*t`i>xdHL}w^&0q z&+Ex!^6l7Bh~(LdkY(mX=Tue<-FCQUdbAI%2*rJf=b?MD$ohWURjk9RWQbKmXHbm) zO0e$1~Awgx0CU3dk6y~i^dTQp$S%Q*X#?Yd)u>F`y{^-aU=%DmM;bPBX2>S>4hw)AW|)|r0Bdd z?tq_#gVK8dT#F}|Yy<@&=Bei)A#F5{NB44qbsh|p<{BU`ecx+}?bSpjbszx&7>2O} z3IGzp!TOgF?GsNV#pTu}^>gWCtwLpoJsr;9vWrmP7-Vx?%WdQ8i4J0qqf0w_=R#Zn zgoNno6aVdVV&Vb9JD#4+Q!W>UzIcnlS#-HxwUC?T$9@1IJ*t!N+&Q+{dk)Tj(DtqcSO717e6&1UUR>a$j zhvi-n-DU}CjMyOel4LNH2APdNKp(IV_m0DcKj!s`CfK6dpgB?RMNpA&hdCjH2W39v zVvD;MVG5+2)C~t8QK*buiUNzw69Z0et>4;UUZ0qlurXqHE`8da(dg+wWKwo{q{{_2n64HL? z-7r`)lAn;Ea4fMr*qptZIYSPJdqo|XvVq6{x&# z1(!u$4y6Jek!aYKc?8Fn>xmtb^*9v<2|%7_Q_jV4X}=Wx5+Ckda%QW1+Q&?U4a7DY z-=(jS&lxzB&~7d46E$-uf;wRduYgm%3QZJz`loPu{LuA)(WG3gh-FKbh3U!$;HY|h zpDEfSrDJ$A=AE%as-OMzv)o9_Sp@mdOKrl1JVxXlyZRVB_88EhJ`|xqFc7}JjOTe& zW@%UpX9AX^zdx+zgCK+9_OzWtb2Ts{F07P^n0Vxcb#9$ znvjKVkaNy558Zul+n zsrU^#E+*!M#|skk%S5>t`U${Kr^FxJqc<2&cQgGBV1FT03yg1$jL5``c=lZV1Tg%) zQ#xkxPi2Yue~T0U+E&8K@NaD;L;r`S^-lEwyc72hHh>t)DQS%rY) z)meOEr=V2r2%PsN(Te`mZZw-eML%!^0`)YDxvP*r3}Eq`>E5!SBpIi7$8$b-Otkm) zo?SJ;JVw+qPU6Wrxiq$`K-yRkp5U}}08`-N0NcS&2ofs-A8L#_oOcREA3&Lsgtqu^ zu=v9q5Bk;1-w;7M1=>M64L{e+OCP%zJQmy(uM@1RSTQh^yD={|Yw;nbwe$>2vLrGZ zahP!%SYooT@PAT}6p%!Ddvgc~YW3lNk6N?r(4JPLwFTe+@55Qlrh$obC zt8Mm!g;Sa76-ZWZ_jo-YU#vA8sF$2M!iN%7=$GH@fw;>z zVIqI0K*p6xGF!b^p%!UDg+v)cu<$4mXSY;(0e_azz4;irS5`ba%-7r6!ulC zv<%{kKWI37prTYPc4M}(+ysCnRXox7JaA_YZGH zWuCY2U0#o$*L&T54_gP0_!r7~o=1C&r5M6W+eN`Cw?S6gDN0{CJC5a>ll3u4v7fE zMVn5s)lXY4UKgF+63>UaS z^Y!oF7Y6p?qL; zu=#?|hx9NAXX`h&-5$VSPD|MTu)Q+;4B-D?*WUkh{cH^XzU$BUFEsSX z^%rv1DZ#un?7mEXOQQtSbfFCvK;B zAGNrF-I2ld)Y6Qb+E)$r1F~YGjbQ6Rxk3R*BSWM5ZD(X++Vgi+(N3WHf6b&j4= zfLStu(=BhAlv9&;UPD-?c!A`}?^h-5M?Ig98`~es!zIcUOiy>m+k0d$$x}EQ0y6yz z0ztmEXVk;l0@?-5UPlYAsC3A7aTn8L>z{B?#A>ALr!zS(*dgvRhHTTl|x- z=Y%zPB00{S+ns)iRrIO&!Qc>`4hXObFnj(UfN2mF)8N@E4!87V?x-}Je5|*haaA2L z4T(@2rzIRi4cchO+s2tP6Bd$rhJr5LD_l~g02KM!Akz?{=@MM_2;WwnrG*g(OsMX+ z=-<$}gM+w)A}Kg;LfXg*zw!ztsOOgqHmUXHoAZ!L3?NC8FCQkXQ-s^2;c1+334gKI zQPYbBD{kDuJ~aF)w%{VLF~NMrt+4z|x_)lY_i6e-{DP@ce2bv1K;%)im>>N-kiXts zem=^dJrCOEWKI|5lqk5E)io;an_VvAZEJP}dMUEEm#A``wN&jLQDcXqL9=4sB?3t( z;|B@>k`}cB$e;@*o&Z?)Z-_NZI89;hS&68|{Q4c~Zwjw}P>bk%-z_nhG}rmrQh$|h z(8>5J(z6=jm+Y67D%V*DqX2I@k^L`i{s=^Ui!R#EJnd(J$eMC|1R zAAKAJ3UI@fes|D+E$27fB;)umGUuO&IeG#4&}Y`DB+!k(g^&{*4w@M`{1V^=9!{DC zvI3`uwaKD%ScqjoSs{p+9I?LFdUftI4wPCsB!(!mRStt&&rv~RtsAmZ&*t(l@!(6X zzE3oR$9@)o3ZMbz(!pDCh)rS!yc5fC2&5eUncAATIF!TY=<-(DaU51q*Jan@F;{u( zntW4qCJ%L(B2JHAY4uC(Mg#&KYUP&qY$4 ziO51@!g9ioXiWGsth#&?$?1-Xv#N$8KBD#EUeAPoiGt=!$5_s%00D&ffb)3nwnG*X zRilhEJ7ljO2NH=sTepnba1FBI;Ta;p^rEY5-p^*PQHm_A+o@tooA~k0e35>n&2_cx2Kj;OH48Zl_fPJ{(gEzq|m4jFkXF zLCLslE08x{rf(Fub8UA=Ub`5}drkcs3c|)Sssd(vH|jn*dFDCJy?i84!~vP^#iC8Y zd8wZgg&wGWG{8%I_-N}9HZ8L#Y=LIB(-!7OyL(SB!sj@H zC|rFjao!%ONpu~uQD=c67wJ8i*w&Bwfwv+nfHd?11c)AMco-8d3Hx;NLc{N*v9xE8 z1)OK`IXT*VHF30q&3Yn~!4Qpp(0ee7uV@s=F zqdk1E>4=E(5(Lp|DYA5L`r>^xXzRou7POSNc6;y9isSj_0D_#QTyc_tRTK0_ruOJ5 zvsJuc(r*jb9&hCJcrfTI+SYC21|vH*R$tG_#}V+&?z{DM%dSlI@uaTrJ4y=>HLhdi z^TjLcIjpN>V4LifQ1Zhj_l<1#6(fSvpUMbi*K=*x{S;FkSJ`nDf^Jo`${rAfELl1<3*F!?+cvf+rn${F#V3?&VY@Xh zUMg8A_!L(PH@Cjmls4u5j+Rf8mQkQX$yn$OMrE?;Gb3F)zN?Px*Sp`icIr2>$P+nEz7* z8JQUVwTj)Psgbn7is+lG*XJ`PuJTLV9|T^ltuuB-_AtAU6qkg~!7_@FAc7Tg9^^FQ z#K6xB6P!dL|A%4gfzcmR0PpO#1-n+4nrigvemii{?|Txe8cdk`vTSY8wkVQ-rXe7X zP?WUw9jQ5ibs-;shj+q(6&C&3el>)Y=>7n<~ysa z#~$XOr6GzA4LvkAqza&*Hv}H`*R3}d1?|_%LY-o|mmSAwjNrLy6*YAn;vpDswA1m3dg4L@)xON;aSASg~1SlLUnK^Vk4RkQ=9T3%x_o1-*x!+K9tWDCSD<8&0^8g*Z1isL&uoRe`{9xr`5e*6iJ;=HN(SB67RQFsueIe-2=_Ec!6%2yPZ>8?IqUS6)25H;FRc7zkuzc?}?(;_&= z@K+R%7G3sS)0{q3C#kTKIzPBXpN7L`*OLI6Ii6PWPY@nk(+D+`Yh>kHs&r{Cn`m_{ zE@ZK^7+pk&=ijdk{ETyY5KOrn@;NbG-;Tnfd zZFE`o)=CZnOl|}sF>wHC#;dph0LrzcLoQ#WbZ#j5vA6lDJ5 zUiZ9r^Ml83j7j=Q+!t-Kh|JMZEo>56>2n4>IJDxE8B(s(m6Cj)Sizb-HAY zUSs17Q7y;8>CK?QPZ%Og_8dj8cyFPBmRnm~pFexzwM=+dIQKPGQLWQNWYdNdTB4}7 zun%pAQ$J&_I-5NT>M$7nKo%PK>+#IiawzYlWlk+nIX2tL z8*X+I-*!HltM?afdYXXcMhJcS@6SZWUwtWGxMm!nD+eD4Ak2X+vtl@i8A3aB!krz4 z1s4srOGjz3k+~b}kBgi; zGZ82elR9t$Uiuq~atO!2Nq^h-Hfe-KRGz zAGiva{vZ+LO;hnkJ+0KBeNUl!$`Fh|VSZl|<;&Gb*R~4`iR8{Th6C;(%ta^Z>LdL{ zKUfCcT#7E&duRRbHNoO@5vr%0@{SUMM}S7u31hbxq;JK-OCTB(&oCV%peZecUN(Pc=@>Qy!Dlub5*hS1 z95UEq0I2bZ?Ii}e^rynu<{(&^)Cx3)5U_sK3dJ=kzPYh9CXP3~)NW^s!`Uf?Z-aBg zi;&_@1DSyb`K<)pGu45jK5wlVw$*DMbBJp zI{vn}YBX_V(ToSyncv&^v_=r31e5FPp*bZX{$9uP0f&qzB7{Lnm;=g)0CeX~$fQpX z6uJ1Z^Ajj9aof{ixy8MFMM@q4c81uYfU9CjFC@}diHgwT4w;Rn>4SnZE+DUti^eim z&E_&demLNcS&Tft^<;OZw_}9Nf*%H(0%Ft1YHe8d=N%Cj&`wR#@H(S&|%zbrJp z2%3ve4;gfEoQ-7k zqFGez>Erd+;S?R-mk&$V@2$>H{JzU)2GThQKol7>0R8m#byJxvw*=rp{lC*r3bdFe zY&f9(-BZ7knnv`>0X$rsLi8w$g{I-Dd)`lv2ozZ37vdNsUhA0JDLx*^Z6DE|__&6p zc~!8uz46o-MdSDngP?)`7WsU@=N&SI!(Zl?S>>>dYE=t58T$JF5FQ8wwl<0$V+h+1 zbnhy2HL{I86-_-Q%JcfeWL1u(B&NfxQ2g&bXsxmW15#Yi9}9!u>W**QEqf;aSjw{? z`cEx?!zhIKV{UysMM=zRD5mXW8J`GpSJZvyL>D?c@OwKld$!Rd~qMa7v z3CqQx?<4NRh)lYs9sc_3FK8%Z9-h_POGdhP^^N(4l?6oX`%mo^+dn9ajEw(YS?tm{ z|B0VM{LbkS%(cE72HNp-A6~d8nr?Vhwbm{U_*Ph3p_VwOiw%|$A!I03nG>pWzL2hPD(e{;B2J>`@W@J zX*_PfO{yFDFvtqg%|eixoKV#$XFoQi$c(h44KZQZqVf5lzyJ37KFFNK*^IIGpv zWRluv6+_(`O)K?UqXY)8ccfTUjfeb@vA;AxPO?B;tC8 zW-KbZ0}t84X&eX+cEJuB;O2V~D7u`w7r^8ao=6VZAaA(oH(v}7gfFcA+AKJ!(mEnK zys7ZWa-~DVa;%HQRwzm!ZJ3X%21}!^5rnh+LcW3IT#C^j6S(u9zcvFQl%Z9OJ^BwW zYeTKO(B2~!h@9SHd(hybu@ki7`?&IZrXp-tWa!2LUf00r8|OdsPSxyBk}q2nHD`!> zqR&_JER|cEg!cne9`^SOZMmV_ToWzbagcnnoh>G(${I+(0T^PHny!W=E3haWN0jVn z6^NpSYi^sda=zG}^UARDCB_}a+6~`pA}^pB$A3w?Zcl-%p1;s-$*MQ~<-A!lF$_w&Lhd=b$)GeV0(A65m}d8a^9xa+kmXF|Mt8L zU29A+!O-blS5=)D5sdU!6OVytkUF}pfZ*^T5V+h_Hq#hKaf6;5d1!U3P09B3v{BR^ zSfkS6;d9u*cQ76z5N-woEN*4ZgprWyJI7lH7$JZNr=D2dCc4^p<1HhAQ4i3q}{+3 z37bS&CR3(lj>SFZbPwG|PM55U)`E+UscYxBh5eNb+4e;UefU*YPPdj9`0`q|_ELGh z(A-VXupIj7xw);8dLe)`eVU+(!(jv51(uu|Rhb=%2vE!)vR~M_3M43$+AOo>>?+F>(^gg((?*Ygvm@mnHQ?80P8|XPt|={b$7lX;SHQ zEEJn#p7j&y`s`^MQAO)4J9IdlTq?YoQGjHt)86a(6Ary`NpW<1DF4%iy?R&B7i5b8 ze_n+DO0&bd9T*PE?I7@(55>ye6UkBCj0U}3Po(|hPx!Qzx&4O$*mmQ!;~M)Dud4jO zM19CgY{H+*dBms3U_v+f8YfrFwKS`B^YV+r-fc_~+ux@Vi{%!5O~E=x{j~ilUvuDM zay3nZvcX@);np7zv+$gv^0j%Z*nxGZhfkz{X!aqQYgsrBu1~jL?awas9Eqk5j)i{{vnAdu z*%>LP-)I&5P$+L({vd{SlRV2iz|xIzn|CbDB_Y&i%{GWl@dZoA=N%%%%CP`^sn zR#hhxpOTB}*bf;?COUK$ke(?RpKZAtW(@E#{yLMA;EeqWb*Zh7LQxK6X7+JmybGo* z^0u~O!tr8pkJJh{#%PEB%lq4iyM{!qMD+?$6LGg}pm=$qoSYp^3~Zp>*SpmIJOAmw6l-zsaOD51SY!UTVm&Bw@!yIyi=sOw)tC)h z&K@@2ElFhZs(Y$x=^Slg+S$ zS-TH2=o^`0lY?YnjPUz3MgvQ>nP3YkFkyhRhIkDJWSd$>a1cXMQ^uIC)~cp2P+8+f zi3qO(EaN5+fh;GWGsjJaig1{+%Bygj8v3fW#gh`lPv)()^?^ZQo5Z7APfmid=9sOE zoE4g|)=F!d0;5pVGz8owtdfh9zvZm;hRK^6v5K=A0FOwf=R3+*_7hQ>IsQ70=nFMB ztj(igSe>054u;JxgJ%UJ1H&TP{{w~<%04|a12;24!dks2-9sJrGp2wtXi09It$nMu z?c@Ib^tjewRx-9)ZON`PYEI%8*;S@mq3{rOsEf0cOXgJryqB*`HPc4s;ZzXtQ8=?& zhDkzK>{4A0$JlHV!)5A{{HW+(8i(m)FLrkfrj^Z3Wp%i0*|LbGv zwbGqoW?DV>xjcG^l5Ilcwpn>r%QKdVHJUwZ=zrKiNe3oQ%D(f7HHx-!Z9DPm!J(~h zsNh_q?HYg~QMcpPLk~%j;q=kpKM?i2V&}`bojT#@{-aT2>*DZjr-J`SqrMOK)Bg13 z=K28m9C2%5o7+@+UfVmmJ$@T_XB)}v$je%d8`=44efxSdYJ=%1uwj{`GpixJ!vw3@ z7LuYKZRLe!3H=l*-FcKuXXkB|-EWeAhMblIVRMC;UJmpU_Wdi>FkS}5A)y+-L8;*> zLZ(HG1orDnBA1Nm*D%Pjo)~zl3ZG|%XZd3eF&lH~lk!!w(3PUju%AFGI!)s-6EqQ3 zdnpD@&FN;+$E@_8Q-R3TYI5l}&KTk)^iY76X^hoQ;=-ZwhWZ2W%C4kbP6{2Noh|u_ zlGEQpLsjhlIx>&@K>MBn6-OB-q4tO;VmsU2_K3{43{&kkhxU`4LoYV_zMB51Dge7= z&c*-S{==+{$_5HQX*ukb$i^mKUS-Rc^R=|~{GVI#(eK~vtyO%un?}CxyUkCaK^wR` z^fGgqa??pQq&p|8!Dq&Li_(9agZ{IU{^&@Br^J2w-{xbl#Op0|^+g+nTX}9)6S=!% z&}qv1a?>-FrT?t^;MW0=Gr!piH_tP+!G+TzqDAd9BxT)xA>r#@4Br`t7FR(&ZqBPB zX5H$`NmGxveOl0*q;#2#mwvmM>)6gkiX1wP`JU9l)HL*I%5C(0d;E#@^m@ks4?83y zBg;RC&dePDKjNA;Y=5k#KZFDKI{1Wu^u*Fk9estv_R;=KV&^j`3XzHth2z`XVA23FBEy)ddaFv63n-5Q=ON9!LYLcSzlS$RUf-S< zD>8em=bl)c;h8i z(zwSB7}ZbXu$WTev0&FsT@eTUXDT-p8%e0&{IyB(i5mNi*rgn;`UhDl9`L{Y1RE64 zlgMRHS(O=DJwpL=6$KNN))qSsU)fHW+dNC!XN@hZ+RQF0&B=7VN)E<(f@pZ*1 zVUW&LBvAuXJ`o_6n>AOpZAhwma%an{U5;JK9F0V=bXl){n-nvED?!Cz#cHXx5vo^6Nvwqhh_M6Ag9MLsUJ5p;whvcQShuRRhmqPZ>B4Oq_ zuu15NNUQ>&;9jg2z9T(A=jMZ<$0Ak7=xb2v?fn)xUpk+dSU7l9tE39Kz!fJ0?Uiw# zdp){)g?w@%z|+CaecT32+$;iNCxMk~4*arpD5%;Wu5NvI(TUtto>RGwl`@^CT-{7b zh5Ylvq;i9RTuX(KRk3LyvFB?gR9J!k2Og}7t`F0{h$b0dGH#%(<-uyoPF_!6MuL>atrX!6@o=hvMl14ig0L#74|Kz zu1HH95z14oES?OH8Vnr+*{#V@On-rvDX`7vfgY=6_{MDyEU*m+Mlzg~r^nM!8gI*S zrl7MY&UZW2+FxViV*L0h-P5UOyF-)_+Y#B^iI_gMH~kQ7<8rzHF2ZC+L;HG+1ahaf9@DzMVUn9WAkXEVCdJ0k6_r=})c( zDo#@Yly*wy^4?74pPZ^e&6TiQlW4iNKUfRz0Td7sFpI1raycV*vYFh{20jQ{xQK8A zR_;d70u}vknWm$L*G|}m z#k*WTUka_bw%|jFyA5-*B-iZNfd#HAtQ1Oz?b5nYDE;C|z61ci=gA{?-rC9o<_SmO z08{b6eqBfgX{5{clZ!6slJ1i~ZR2DYG>bto2_GFl+ocBAa{S5zBN4Y^W!!i{ijO7 z_74nmrvE|V;QxR3$~uY@vIF!8ozGO>{Dd5XFTV#LgcStv`Bfmng*jRyHZ+SIjtawP zMyhd|;)NKux7L0?f(5Yf@A@*AiK@9Zf&fKk9sbb-9H&5*_RlAdcLFO1^CoV=YFp`& zu}CQWaqp4@_XC*fh0*>wR&1d%a;sk{h9y{nFKc;Kdeh*El}C0hKa^%6l8xP+2L$7w z47!*+%ROhFfX>pk?;{Z0qqk{X38zS*iCF{dv~qSUe;_>5H`;1w+(3ShI4)P3U&d0;++ruj(%Pu<_Ae39QLI_Q5z zbyhMMD6szix&xm-B3j2Q83XSE6m{^ft7QgXI^RS%-;IoT@cwn|f@XqHv=+H7{Mb!F z)M3~n88TF9IRBOK4O*viysEx97Af^8yl54EyJFe0pxf2JK%vFg-f04Kt4#Hj)Y$ZP z=N|rMJXj(N8e<&uc~fxhQ^=>4+Q+*Bv!w!DoN2OD9EYDAXjMG*mC!#FH^fYjafmyG zI{6Uv7y~N>JCgTU@Ma(nVkiXRosdG7iIajc8AJTi5=kjQn25bk zAhq+7&DrqVPuf{|u{M0CcV{ezKvPKM=Y#f=D9Z$UUObC@uxEOf2q-Oa5+KQxLmyP! zol~4({*o{!hd9}sDBU6rK_%toAAcACV$J75ko6&E5f|wM4EM2-&chs$bldakw_oCu zfnCJ)qHbJd?YZTW*{^dScPmzW8L#$b8CQEJJ2h^M7#AWK4@AzppCjqe4=3Ek9B&X@ zAg64Ctz|}Fr7HZ;7Gg2a+^qN&OAKB2NP`x=1ua z&{_?tIy5?-cE9TsB<(X$k+AC0tewrqi|02|!0K`@I42x*K}`Pm23$*11Hd@NUBd?x zh$6Ex0S213?sDrB5Cc1r2v1kf%z#xvc-;)piGE{oU4zQ-?Pxdq8aKsN2aOHk<;s3K z7hu{9oA@i>G;hNG&@5YA(EU8!Tu#Nf$ZXnFqqbAK;{93lP4$5?c#9?D@+pz}cUv=b zV3li>wZI#>NqisTu7H~BHx68kD|2c3W54J?^Et9edFKwiP<`PpzX^Z{378EIA0gR; zXB0}6u+H)k45#*HRkD2E&f_x=F6T9w;W*c&?y1#m)8;+K zOw=#7A&UEhj)QI9d)3Dp1>NAUZh)tz8}u!q92!9ML?6A+87mg!Qs5uMj-V}H+q5tB+Y-=qUxY0~p{M93~c zt@bpT+%!u^6{m8$k5USh{d8nuC7twve_4#YS*P<{3xO1KyE>D1ZDvc`ct~P(ElMli ztUgi|TLdh9LEV3U6qw*mnA+>n13%DzD?U|DM0=DrH(fy~bhmrAr{j>Pj zXD|PL=(I-dPsljgx_#w5lm zMzc-+WX(j={;~mhAO%9WE||DLE?Kypc~rM7>p=_Tc~bh`c=;Hvc%tk)xj!?+*XSh# zdsGh`gS*tkongEQg4u+=e+0IaSb@{sYPqBhg!J7eJA<~$B7#ym7$d=o5Cd5H;%amdzgF!_RYZ1s!YoHJRYU%<&=&9aHE+KWp=Vu8^zebUp-vs?QIG(G?ihRny2 z6H4-RqU=2YYX&dC&mxdVBf&@<0}~7rTvvuWZuf;g?OxOxoPxtdgapE=>?;h=5O1ydhx!=DCJQ$$9-7t5n|)F3H5i9%V|IF=89VSJUy`3%D=oPr%34(FW7!JL)(U~epG;8w$92~xK4 zE+6|paea%w7a>N|RT7S#bGN&^eB9q2xLcJj5s4e~XYoeh%43iD-<5+Z;({c+mPTI? zJqz*_QDhp1gS=i|*-^VRZDujujpjUAj7`NFK-3z8tW=2IC0NQk+phu`7_5@PI6D;! zM3yRD80iAbR!Y~3_!mGi*a+xz}Bcn#MRhv8#_-iN#gsvEc$C8P#2c z!^B>x@ZDLbM@jv_E+sCDt*A|F7*e0kN>|d;q;|Pb7tVJ5=)2o}{giUJDMl*XCH9M? z%BZAaq&a%tq2;J_Uw-=u+`N1YJZ|L5vK^^#@cOx`#L~&-+KqQjr~TkI`oZmd`EX)? zCJ9bIr$*BIQ18MHq83KZu|!Ye1EkNb(7o>g zHFqIOwBUJSbauBFu1kkM@Mz7`nTp;(UudauOuFE^rDR7Ytxh7Zq3N6BFt1-QJr4{< zXS53efrULKZiWN3V%R<%=;2{7h!??E=7uxQ0JvsE=)oXxCt2Wi#9~nP19xMw#|3fdKsI5ha-bls?g3AEoACkL~m;Xw=65QrM?V?bVr}mepsISEUNu1 zQ>A9Pz7jv^Nue!kI?Q>}Wx7i5t%|?<;{EdqML&<68`3M6#ri7LqK~6V7P`meA z)F~u0Oq%Haur|zfN3Mu>e~tAjMv4`k8&>RUNsu(|W3EE@bR7Q~r2YG|^rtQNdF{~E zaaj{=H?jMM9>JpV59V^hXbA06>Iao5Kk3wBa62_{ zz=uN4DNbD;D>M0l)%$&rzjm|}Wm;mV$IP&miaLd&_TAz18SV7sG7XvSFx_Jq zBr4XEWs@GJKMafo4B27S)DU!L{-3g3Zx{MJ;)ZH1^R=n=hKg5GeJ~l3Yny+5? zo^KhEW`5z{hde{-$Wn1`$Zb6@Sc;;RIAvI{SEh4leai>4eK2{9!F&)a@x=eQlVfth z^$&Y6)6ek0|7)axk(v2lgMNoJHXJwD5&y%loKj8^zNb{wT~Qvo9c*BFil(|Xh;Mm4^9#(6ANGy@Ub2GfB$8zJ^!I7C#o6ef0^IQP9<|(EZR|lh#BI;Am_%i- z?6695mfR4K#%84oke;?pl_=Phv-4zQVkKIQF$pq!1-QB1G4P4bUB$yJS8qqxVtQ>4 zf_zT}Yuo47B5uZcf~sBp0|Nmk28VP?yrvN+5vYyl;P4}|gEiwb`)=C*S zvbH8lk;AjL!* z!4HSp>sCnhXtFf6+d(&Jdj_pF8OmO)5&>##L0!oPDZMA=hm$+pd`nZ(T9#K%8>v{^sVy_A^*YuAx@BZ8){sY`4Ynm{aO; zTyg(nnCSVbxu|C`hkWU}z}gFdnxeo87#ks2D6daF!lkhr2EF|&UhQyU8a&HA+=5*k z83=>UB7;Q`dtfCabQc6d?qZ#22wCplZmVOsreG}wA0mYQQzRh@TKwpVeB1aL^f; zdi*X&9k@HnSVG`AN39Nl5a-q1)>fJfB}2aq59Dt^u~j4M#?lE=>S$kifW418UL}-6 zJobf+03D6fo9ra|F=uFwVlcy2NesyoGnyzbp+!a-Q~MfpL>TliPeJIYL{b29ag`Q4 zeeQ+{0H{JsM8^7bp+=Bc*=U)-9EJ2-;{at)Iv5=%G<1we^UWRxmW71V7=N+4#}EYU zY2}ih?IYKK?;t_q8)t72RrshjhSlOS(p3yrCK0_}`UI%zC^+#b*CBH_1+5Q=-&CIx z9L2%N#Q)r%lAvMhYx)=h)psQ1q7G>DqS2NOH3)&W)3Q)E7x^O-cqIOi=bJTB{@U7U zk?z$yJyHvJDBqK0I06vM&Ua!O&!B(|2PC`QrxsvA^;Yj5uhLNL93$X;VamK3>Y+V# zu76U#%#+(}HY37-2kRmDPyx+_1rfj&dVBUU0nzBiBg35ft?;nAIXb)ty;in)qW*N9 zY@p3M?q#`W+#|dNF`SR)vq}N3KYGqJu-Xs^Fkk`lL;~y`ul}(sc#_@6Y6kZ+d+$Mo zhszH7#@?4G1vS&kzH`k*;*VgsTcAgHua*3hReDW7tk?iFl3w3VZSd1uTuk7 z`vX8)ZUTEOnL9Xb@B)FW(A|3U)@zSy-LhDoTN>A^7l4g~3JbNst;ZKW(JO(Adu;WY ziDiqUfFk^=y6zO?B^$rqjfhC6A=haJQm#}%e&Q7Qjk8&>Y^=w~BrCShY579)&dQE% zR|&W=qT2TMbktvkAZ)cwx(~(QWw@WTFTJ8pkiXUPY%|LQ*?1?V1;JP5;5CtY+3h7T zys-PyxLIq!7A1Ezt(CR_R(t29WpAwq-$GPWfFETx#*8}DyRhg45SOdQO`aDVbMU$6$$m>mFzxOqNg>976&FLB zPn780pzO%OA~xg(P|5F@l^pBT(wfQG(yZ}Tdb}cEPy*4hAh>bp2;U9_=7rMSVF!Zd zR5fB6Yc@N6LW*FuD=>gXg7+k5U7mwDjB?9F90`%VfS-lrIt4!SRdc-%)jQBg1EdCx z6dVt_WRKGSikOo4+`bT)2C^)@Ikx_uGZ`9);w+_0_|TR5!z^(vXGVN7R4cyT#-2rh zh=|)?`@ty;e6Bw-pn9Rt=gtrCPu7(N?)*eLsuy~?gl0=9W@SJ9TRTCsn8*>ZTA8a| zV8c|Dq%jzmO}4StHxIxZ@{E~N$5)X~J<;?}p!sS#x}BNYQoNYbbipbG(OnYD?)p$# zp~Am*jH}cfB7nB0x>qND+6rA(TDeBi;)?~ghCU%(Zq%~QqBJhIIuPNSR69HOnwuxo z%d+nEl-I~^PGnlNK#Rq*JHt^ZpX&yQaa2^sHZff0vfFxWAST^VwiuqF`vbM~&&lv8 zJ-&_0^b)j}%HSG{&;dMgnw4~{HV8mPt?JOzvkTEh0@;Q1YB7alM9-i|Z^4<|;;)I| z$_DLI`~(@yeGmDQVUL_@HH(4d;stp8v(9X zbTxC&KDnAvmem~EMq}1qgKp?rBpjb;pdsXsk0u{_Z6{h#++K~$+1AjApOv~PjDTM$=ZlMr&Iz79*M( zo~c8-?oeeDG^O@2Gu(;}e89fa=9MJ@#FcWl`RzZyN z!RrwW&8q!dg9OGp6wT2d3&U4Ua%0m#cIB<*TkSwJ0Yfm~N*-!Nn8%w|6*IZL3h|IZ z4EeN!0_sb=L25F9s}KcORBn+jrE}>Lrs*kM{L_M(6H`P_+90TSQ8se+$MLmKI^&ZK zP9oxV(1Rvxn&J;o0jx#f3xPp6TTgyG!_yZ|u*^WBn9)cSJ8t^|;;Z3gipNUQg?;J4 zwQZ!<`p`A&W!~@5N=_T*0SXO}p#3m<4i(s)Lh2s%`)x-sx8E(XNpl-kR`ZU}H)}$jr52D7JsVFH zliocNTogPy8NK>>cyMM78UARu{rNWXMZuTX68snE``p<0rRx)b;a=Lmdw|$iLc{%~ z$GkabTQS?rN#`=sk!|;}|Ej4c;XtRM9es-uH+Mcr<#>_s`sOq+p<9$}@nktf3;3Rm z^_8~5Qw`6GJuAK?b60+sxN z5q28`SmNWMgXGhJ%n1O{Darh_=8VD!6&4qBER9l%D?z~_V?j~ z@Z$x$hIr~z1`62wQy@YI6@LFF1d7d|#JnUUpuRjmqX2p22gmEuLUsWG=%H_*=mUue zbbIH+_thoO@8Od{@3~##`-e6#00d{;&3cp9p-myhAPV;H^_n98q<}R} zUqFOYE(`)k@)w2sK9_<$1_m;G-q3xW+HWI>>k04eQkkIx9ei0qhqsp2aR9mQVpUYX zfCn)kd~cori2x4;EFdBt5CWX}04%{>QGQkWXY`UiwLZ3DFbUb`lPw_aMPmSCLOX>T z_Jji|;Ny`4Tpz>0z<$Y%@~H_E5&}R#M}x5o=;%Wf`k9TU7tHuoGo0RnJ_4@+F+3pw z0{Hp-xR`|*po2vCfBs_qe1?apJjFOy(Y*aef6R zDe#j}!-EX)@cL?1!-5$o6TsLHG-%2n(;?W~?!BT<2AhI|WC$$iukoutq3e97>+Uyz zC__L5{d^AY7X}RYJsu2)zKZpT%%@-ax(+mCewyvLfS^Zwkg_g3Km>?SLmSJ3a9T-E zVaJyTDUyU(x@F4%91w&c#zX?@n?i@S7xhH==2Ul}@TbQdLkW8fGyBU#1 zLHTJ3kkk6zsC@8=nZkpUhMbxf<=$yIGTPYn12K-gh6Gz|yyUh~LlzMV0o^Q^fr@ICMR?=&ids&Q&-|!(tdMDDMxAkGO?G#{b~38X z{UaMPs`mxrndf%v7%uou@mKLWd{Usdc2TUYj0P6Tc?iV|F%(0CAX8+ksi&5@23YV4 zBV3A**|xD#1{s$J4pbE4 z+9j&)d_7@f$-m|o$~J=+M8$^zUserr){IkvPGGUgI5V8cNHhZ_pZxv zLd^9iEkgL+GmWZ1wLPmd(`I@RBGz=qw>4oN8+L3M*dD&MUA2W^`NW61?&LHrszrDc zBsk$x*hUD2q7NdGi6G3&$h4es@B@x6wxpV2R2Mx(G#ib_?n{_r^LH|fk8fRh=R_)A zJV|vk_5g1{rNr7o7oBklYhiK&s-cLrUnvPZ&tY&cEmzdHOcf!Qt^333yE?R7F_tCd z4YHYDI>si&zEy5C9Vhr3u9bhQfyz@5#EAt@*@WbH8YZ_F&t>qI0*KqWe@!j=Cae>S za(xv&uo+6a--?I=RO>qdBoiai%=7Kki!zF?}T6*3oubZT%Pu-uC@-o0F$+Jia-s*0dr{Wl1t`T`-ofXdX*F0tBq|deFgxhFF;= z_SrGEOBH?F{^7fZna-4Hq>dkYGF8^WTHH{jl=#GzH^s_{sN-Scc0Zd=Z%Zj(Sc)4b z{+=#R#`(y@hhu9}RbKRr>OMDf5QW)p9PRy$i?AFK{9~J2pGoy^JW`by#Q#Hot&Xda z#zkTin8f5QrSZ8ihTGXdu<6DSR)Ji|Q;4!R1Ka~2b@!P&g~*23V#jG|TfDu8UB;!r z5Nqfz?#*tiv#H^Z-*x-QXtB^zcl`+@Rf$__P_UreqAIM6S+bRg;8r-(SpQ1EOW_10 zgdKBLb7JxlX$IpJNoA4i{g{x*TWoiJw2KvyAGpdqzK|RVqd0sWH_T`_&5Bu^y;%eR z{WDTBk6;tpl@LR`%s;+9jUl@b7MzedG`y=Q1C*=q4|0ABA}Y78RMzgxo}@(wIW?oJ zGLF8P1NXDS)s!BG=yIaU^Q@;??S$^j`>8z+J4KkH8mAxMHH#zA>mkH;a#7P+z`flc zM_JEUT;2d^&Bww22M@nviW+tBgl0%ThHL>XOlbHbH7*rtPt5 zlre%x5tU~wRW_#7MfV`kHOs0+R5mVKk#}Y6$L^ybU_utnMvIP!jn2fwT&PT+HU1k; z0WRu!*Z~Bcc_$p*^$*VU&5WilVJMFf>vA*^@uAu7lnvKs>D6f{FOAjHqhNDy>to1X z2(Fx9R4Qv~wuY^XNGIaL4YfrIe{1<4n>sqs zW_qYrxIP#I956c%DX0j|3;hs{cMicTny0F{-4LC8fhZ;OibqQtATEbhhOiv1zVguV zxk+-T>C%^-%Vy?u`XkVfFYou-tFGB^WY1kpLf{65kP`fR^?o%rP!i^iUlOXzO7y0& zYy6}95wgkRU7P_!_}-`+1%?(yF4$#gFaXL8c#`yT2RH__-6mx(bPDG+^!58~k`$c# z_Js6W1dV+>U~NKe^%FM%NBthjnClKd4&vyl@;kEgX$0$ zPn?!kA46Qt4v4JBqdq*Tg0JaSwe2K3!xgUk4*paUDif*Mym+JS(8&IukDLNQTDwEe zFg&* zu2xtLX^6Q?vp~;WMOV(wYds{?ZB@=(2W`VJBjmk+^eHMG4|Di|g*QZyDp4{=svn)3Ir8GuKIobI)`%R3rLAG5ikTL%?g|Upvh-BQeu% zztQ;{LG3ulwOELFtL7u{wi6{^>wqhPAYj+MlrLFA$2(eH#Amb9zNM$w2rIjx0ot@^ zAjFZzsRUZ2eA99~Nw80mD&=Zn`1ei}Wpp{kyF;&=KT;x|?+`-t;lX$hbJkVboW&hDh-N zgG>y+nNN?T^0BHrfXXLq!a^=0>uVuaR63RC;+5~4RtjMr-89%nlWXt$HGyBNB21}>vGvbiUzQpW(rZR7V0 zU<*$F`QR?4+hir3k4xuw*TE|1&$?YLW+!m!jqDy(Q{PdkaCYvzu4Q_&l?>VWyqqsx zJHrfRv)eP{QC%2SUmGn?>YzlghXR$RxND~8M31M|eC?_!E_c0Q8p7A?(&7*2p_wBn5?7P_TLKnHA4r|N z*E?>Gr3g`0%H`!+)6j2c_8pbnKL}J>EPvO}6%6Xxz4{!et96%Tv#v#fiv3HL?T8CCavWLx5+5iH!s^iCyrH;sdQfTq;caC>SKVb}>%lo>{^#g|1HBV*!mg)|hv{2ybeX#oy-dI=s=JLC(ARV|BjNdoiCNja zB9>Tu(z)Skp@uEFHJmQp2=0MdmMh7mx$ry2W}VbHV^xHTl#KsU$#jk2xLxx8;b!a?|O8V}Z*y2EUyKZL7 zyK(ucT42fsPiD?B((e9>WB@b_sQ~A>^Hnc#+SsxY6rHkMDD}(5ZPgr`eG5c|F+RD* z8KdzK9H3oh(%ZsxN|QqQbHPz7CU!9?)^c|4MjP58{byvBy~m*|zSQ&$`G-}`0j-c2 z?1ZEhsnU3icss`^bMWA35pKos!fb4ZVmwVHgj;L8gX7?MT||#e@Y+=;U!b3V2MO3W z+)&gE+uTvFs$yr-`t@kIdY@D9c>J3HujXW9 z9%}g*h5@+Blm|;Ws5T?PO&^k`qS2?}W`X<{p?5DSGg9zTEbfw}CtVM--tA0QSma*K zWk%gih@>1jK!qFQ6oejv$S78~s49x9=SfNu*UF~<$i40GkuIzu)`?jwYeES`lQCvC zuSVU9fh(ezrP|dT2E64%6gq27OYU?o2@;;?c#hmJsl24c-LOCZ%p>rY@4GE#!#qMs zsE4S_&Rv`Y^Va*mOJ2#Xf2?^wK%mHms^+C^&{n#PvcDd~rf(sdX&<#<%i7fQOJxma zv@>1L#3jK4=VsnEI@Fpcpu?jQ1g9|M{HerV|(NIos%neJ&qK3kKU_q-grnK;0`LWXwVv@w_?Xm6P2xfQC+5=dElh zlDe^0m&dvrrg5(i{q)$?<2fc*&qv`$zCgVgS)mZSN|4Tgb{TA0T}YVE$gjYvJ1e62 zEH9@P3r#QD3r2IJGyHzoQoWXk*7(cDtK`64k^EiJm;BR?dN}*AL&ETdx(Kizi-?4j zi_9%bqp@}n2POCEyZ3PX@5;y-KW2}HKv%_E%HOof3XUCs_BX58;}FH*NU$GuYI zxMVmHEYC4S7fxIPN@q6B#hQcRt<3*jXvymhB|>aS%BXE`!A#Xg6jBKyjY-fZh6ZDp z*ZD(`F}J+^A8s{#Nk(~ju;oZ8rJz_az4MsuHL);~_KKlW^ClcEY^tQm!o9e@^_dQfdVctLhNJSm>Yx2>e?1fM+8Y zLTqst^Fum!_ntN3FUY{2(C-)~7vwDG;}>`(-9plZHCYyomQUYVL~$tL!^@F>7DC3; zg#?V(jZ_+QN*mcdQc#p=ScF*v<;#dfD2j!lp4XeQZ3K(3I}xWnyJl*0n7ErCDm(gt zfFFAgf#LMQnT{(o9BT4k22@<~^*KBL&=V@!E^OTOoN}vF?VAx=+|P#~?1=3ReOcxLD5 z9O+dP>$YE^U4Z}-B=Rpu|7}e-fh9%tUN(mIJP>|f2evscl8_ji+P5{Gb7eH;HJl-x z)fP9GbS@bsI&OVQ#&VPsO`mMj-(rhB9sWqEjz#KU@yRfO^%s5YtlK2@Yvl~CpE2jPw6A{Rz?V78VeZB}>&Jf4 zoI$&g#~oIMuqVo+F9RzF5HP*IJ5I&eB;=3M(~#CWw5zH4O4Cc-s>28`)m{ezF?!Di zOHVMPPKUSDixr+`BBd17O}-jE!Fe508F-dWw8uL~gdTmk?KQc7>2Xn(s4v5%SjDd% za~>0)b*eM20o`$DZ^*GDaYk$2*RuO*4B8>-7Wi(^uMgSC4q+H%3!Yo<-ST}6zzpOn zy-$XEpBLySYyovIUn8^zUX5i2EUlS}qhrKKQgsH(e`IuT}WQy3m!6SisZ_-=oe6WIPe~Di^pK`y3+SvO48ed?8 z(<&E#bbn^Q8HGnY^bpPN36=C2zi0iVLh_6IfA&mz`Mlz)?y|p-dZ~_qw!ZG0!^30^ zc-7zbjevCg%$U76%`VzK&X_=fwV;zWFJsL3A(60A+*%PodNp^8^rx|tD=jtBcd<@Y@x=Z@V*X)!UVrbm` z%&Rw@51#;#IsHeAQ(fu!-SL8<9m%K7JgHqFwTpSh8_92_h(L8 zuaF_wU_?viy-iPpl^uZeRM{Vnohov>5yrv02%k+Oj6TI{$HQ{9;|RE;q5wQk{hU!1 zew%X%T9-T_kKGoy`L-l*hF6_zxQV482fUs22U66}Kd5t;oG?`iCgponTuv zhpTk{oEu0iRQdG>al33xsy6x=`kFODjl%g8-H|;6sqB7rWte?}d!pw2F&U~T8_Y%A zvXK*iXyXimpO7}h9MQJ*Em{JpK_8QetFbDS1#vcpBG`@MVDn-$-f?x^AdVeo*8~r` zOOJ4&6)AR~j;f61WVxabsj{oE2*DXi`P%&p^l*weg&CCWvCk`21(n>1Ux1)&na}@L zPy4UX#{baM*#37B;r~rf`zOZzPxUlsaAl?K6&e+Mf97)<2y#l2CrTYopoJ1~aUc*u z#KgHMWC71x^6pnckzxr1z>1USr(zwU>ifXQ@S^qHTcA4iXJ=5#%6Cul5xSPY+}s9oT2Ue(RSE zFK<7vKj%nDn46nBps!X%4|!PTE(Cw}XOsi*w!e-(8XOw(i-rD^BmdD90XmKRP-*9)BMJJuzzDer)gnJ^$AUzmW}3J|Jf3m(a?m5Io2a4_1Cz-C6JC z_wb*kRp(I{U$DIAQO^p4>YuVnwKy zK=z0)O1p!Y&~GpizmR*Rx6eWa^L$`mh;+U!z|emval?LGdVJVJ*vHrJ-9A1w00jkn zWY~VdYlB#O;yu3QdxP}BJeHpa279`E6o^_L1^lzs+g&?WcMkyt@!(g#v))^^Az>jc zDXGJiyoleJ@`}PP{~kfZ27Uq!35@)*vS4I+O-;+cei|@Tk7nP`pqeA9T>Sbm34xp8>;{ z4{RWVo2Pl7I|738b9%f;Ny$Kg4Cr-i0KsWV>BYozYRGotfUhKtr=< zaL)YyUiBIjIw%B?iTl<2!+kyUJ-lav8+7O$vtASb-7me%-M^vzUHb5SrEuioUqq)L zVm4&WlvlZeQg(FHQ!c_oS}!3|2Q@M$ADrh2CYG_CY)qJe5oNZK6ggF?LLfG zCf^SdbIuj2u(5lxyMY%q@;iO!t!c6JwB(V~4#J!?h5@!@{ozR?Gm%68n&95U9_7z% z?^7<02clrFCVbXm@~P_H!c)moaL|epx9bIvO~wb=!myf}{>GGys+V+TnP1=6wl8u#bRu>>M_jiLrzF979XGLO5tTeg<{^>&b(~=4 z@}qul`PL~rok+7sjah?P9zFpH=zex)#rqclOLkNN>RXm_lL)aCDbF|%wU#ym3nRxXH{taJ#&W^7X>-RX8o((N^?@ zQL~&$p5K-q_&da8CV_%$E%zK=(-{;J-CQO+No5ww+4=#4%X?|%md;_n z>z?~SN(Z8Wl_OamRs;8(DROq^MB%p5^hUbDV*Vjp zu0zq^98FF@!a6G;Ix0}x-HxFXYp3gbBM{_;y-q=mRaAMUkW^C6iAW^JUVh%U4y{t=@vYo zd%Z0*(MENwS5ZMTC@y_5H)r-JxGdi0b= z*$9u#8l~ZFz%A&;$KZCDDn0Kz1?$`3vJ$ASo{{1jfSK`-$U}3q=0Xvo_cHdYLtAf^ zGe%WZP}ju$RzV)1U^*BCBvB+GJUemA$}|6>+p--{q5?QG{6aLuAqBw?{uS82Cw7A@895cjuJst6>3w7z;Yn?%uTFhFU%}q}( zvi9@OnfQy!cg(9vwDh8SJVE4i6I60X@+(h|!F?4M7YGQJBeU#Yf?QNp^}v;FHPnOC z6)P$n`8;*E49sO63O9?DEOQYk%ZI)4X)e`Q{aB!Als*_XM$IVV1-y!%_Oe8yx)qkf z&`ah1dIFCx5}clsnP4{1_oA%KhRSiE#GAX1=LGaH-({08%Y`<{F3G1n<7}BNV`KVP zJWRso9$zZUY2D8Gl~j}`@S0DPyW5;s1CQTO{_&H<)Xr~oIAk4Q?;iMRQXgh_2xs`- z;0+$SYdH=<-Kv_{FLnwxaJ_b|WAc<+DdgfX`7(_|OdkVu&D#kzSM2)DagDBWB&y#3 z^Ep}Ub<7#7(?T2EvG(oRw+xd6FjV?IH5D|fH-o)i!$$57YBGP10e=$a%zEjqJD%DO zxSV-}j5c0Kowk%9cWv4wG#Sx7zE<%IU?uSQ(moLx8(&SF6wjC6FyKup3~fes54e)k zb7&El$)z-zUyhABpN>B8kHtHMJ@V=UL59MUuXxzq;Lbw3;I;>2>!!3hp9_tY;mFZy zUA*x8$)xVbRN(aX>`S*{JwZOAL^!-)aEYbj%_Q4;ze`Gdw*J+H38s|efRF(xab5mM zX|FRaj?HQOut54SrnFzTWnQ6LRCbRR5L5>Woa6~pgUGzSp&fPXNMBjg0<82OFR znRty5al)h}UG8kHm5;T!r7{@DZ&!jhs8ij5A}$ZdulTpe#?kfny1+`{;j+UE`tRRa z`@_m=gCw`7R!`5lA`o z=gbWV2&V2OxI1?UqgfWl53w(eE|RhgpWMslp{}s8+&_mf)GS->s;JnEJOu>9u!Sc6 znGv>gVR2x!Ocqo@%a)f|)ez@|xLT!K)@LQUgnPgi&ir<80Nxv7tiA@TJEZe&IshIqb$3l1C!fvXk5^Lc7$z;xRWjQR`awG80cT|gSID*%?bs9 zHv=~h9*nl@LR4(QHAP){&z1CS!%Bzct1A~#XCi+RHR_X^cg<@n`7ssUW(X7iG9o~9 zo{R|Ygb9#G=fCY|wn@~*BV=tizN2Y5F`z7xnU2Jb0=tX_Iw~KOz0YfPF(3J-<;miy zAA#%|U>!djo2gnV-Z#m9 zTl#HH3r@t9o^+jDwaQLObOG02P@8MoeXg|MlRpv7nDCCYXRaM@uTOJ=pz@7gzsdf(Gq2Ik` z2DDg}o9W$&%GaP+qj4-T(XD=Vw$-m5qg&K@$ljM$s^b?(xl{Ip(SKEt?;Ue)=Lv~> zs+NU@bh2$0%D7{8B*A9I4AExXzS7r6Kdj^IxuYv%qa~6=Te~~4kL>gOQ}Fk<0c}|w zldD5Khe3%%|tPlIk8#`Z%HVU&b?Co+@OJQ^>0WFRuK6Ax5T0QLIv^ccuEemC-{DG&J2)iKvqdXn#$vfrIE zS?dHm<$Xz4Z-it`Ibjy*i)r)}jp_GHSoAMHvtt(37SwzXPXEJ!S5)y5j1F3ApW9!DPRu6r& zV@JAPy~6K(gsrmG`4#<5SUBu^$#Fyzkg_DJpE-_tetDeaAgSEyk6)AhSq{~nwB}a_SpwS zT0njglLv>nRMe7@tFP|;;37sW=0P5Yd&iYy>j%h9h$JE)|%_xQ#5TQYuOqIGIkJt}~O-@GH8+yn-_SLsdIlj;1 zyt<3sxl11eaqq{`)(;Ak#)gbjb_)a_Ku?e-6K5u4^k{B znZS}A*b^DOYej0;)-EQh^m;;d6yMT5+b^U6b4v&eFz_p=AI;Ev3%FMw*e|ZA&1lf> zbm5<7D79vPja&@9KMZt+Mq_*;GKwPmY+F!kH8U6!VX#qu3w`N}S@i!AViNrd0&tA; zdL^R(UgSKCwHuT;!iHLGF5(ZLDb6Sh^~K>jPgK3|*sccl^h=y$B_TXFlf-C;v_5-} zo3b8X=!(N-Vfq;=IE}4QW1*IuPL**z?ortX$S2E+jKeHxYVYMKxLS=i$)<0+pt3kD zdfH~@+u6A}1r15<1Fue6>!;ekx%@dT&~V@wHvwzjRJeDhJ7yk6v)j%ZD9g-(-)QU1 zjuT-Izow_>c)(El)a3B_>-D=eTq?z_{^AA5{o!OVoNrTIQ)X2%Omq>nz@3}{$TR@X|)PR-nccOdtykd*M(lfcAUNUdBKxeszF{tUD*Tg zSFSJ-@hm&IB{1Z=B2OQ_Dzt)UYyG-DcmUCtYnrtlaQn{DmC2ts<4EBZ?e8 z!k2X_$B8Cx0oAc7>bJUL-5_(_KAt;NiPb%3^mdb~#6HOC(MzbvI;X{DAcXRoE|4ld zF{SO~@><7c|O5*Q&bUdD;lG4s-yc4ya(XN*;tOThJMeWYg&OE<*iX1qUd}ja1UC(;*|)w zov7UN#EWaHO<|!{=&qaqYyWiy=Y%QQX*I&)q*KMEsVS^VG^L+=XTjb(*D7(FMAoBi zikt`8RG~llhq_I7l#XZ@W{_>EVRGXk1FnW4;~-SVDE}Vn1y1LcSm9+Ge$QTH~VKtZ4EebNaJC4jlV7(G*hghe``!J!*=QCDL z>frluvq9~Zjk^XLd@XaevsMK9Rnrzs!B%vTL$85sA{|VMA=)vn#;toIil(gHnQ)?3 z;dlA;IKaLEFpBdT<1*#6(`fc4*-Z{k!LB?!eW^;+YeNV#d<&hv1j1w8sUL+^nv%R4N~>Tc_Rc(6?q9;#y-I9(XIk3e^%&iElZEbi9oA7<}bUq zIyR(F^244ue_Rd*qsYhpX^~^xa$_j9lk&V1kSQV=WDNv;6mC6e$ExMUH^pG>BtUkCf~hIh;inhRb4F^gYC8Gd(MqhQ>}Y!4J}*pW zFPw8+iFN)tAz|?6jc{xk61-!ZPY{tt;WZc4Wq6jPD9(EGzvVHMD%zHSv^RXe`Lo_Ip2Y2JJj&f34n>a%kK5fti%|j$a35lDE zIZ?EEwJF#>rusJOAcMyv(lLQ~wo0!HI1#md{bx}k+h^5md7nbaAXI<3J4L|*x}ZDtp4xVxOPT=ulSu7|t;`a)oCg0IrS z=Q|TaRiWNI6sCXbBJK3?=ixl9-Hk40<$xq(|-W%j|KUZ!7?DDWV zvct0NChhF@vR@uN59l$d33^tp-78}{!{azEoWgsg?4A0}OcyUFJxV~?W<4U%f*Q^r zQ!sk>kPFia;}Qu}<|}Gyd)k+bEckA9axvfDxY^y>4Rm|*&b zO)R<6m>#v5ln`r(5l5AB@6-kn$Ev;m{HdI1j+6C~VeO7Cf&}Lx)_ukToDg1w`7`#s z-S?DNGk~2Uk09^={7JsFZ(qcVGBtraYLhLISusP}H(FNv#cu!DuMA^1G;%FHZg`du?51jz7<4m<< zSzWDHj!1WuMIr47u#}&7|0>l%_WE&5(vPLdwynkO*nb1kQF9@mwxFQYgRzM2`HEC0 z(`E%&EUQW?eiCaw$&PsUEof{d1gFN04AH(u{fRa2t*F}rBbvfnj|-Hx9&ChXYYFiS zldC~;S^f-XPs#6aA6G{L$Bf?XE&iQd$B~D@?{gk3s#kj|D%_xVxfC@?K3oQJ{jo!f z@(apLfw?1WvuOd7P5WW(;K7kX(5iKK@{a|wI@Q4=-Lg#b@7XEB^sBc6aSPy^tmQg4 zBJLGiK$$g)_pz{xG_Ot*=mB&l%?I9hjpFKmC#A9d*Er`tDUFqZ@jnx2jQ9*3Y)t<< zsrG+n)Bg2%u>JoECG8qJIfC%x3a!2r?Rzon$(E}7H6~j3u?=v;M-c7T^O4K%iFUw)H8#PsbgksaAYY0OR@-L|xd?_KFzTEDwxm50@r5AxAs`UjOKRhKkA?z;JxF!gPX&&?d$!D(Ls zrn-)>){y?fzge+0{-P0plYRCgwD|e>^&?;9=w!#_P~&I=_%%|7hks|4Muiki^0nvC z{B{7onEDaPT*c`8Qk?7c^wRrv(}t$H&H$h(!KL~Ae*i~7xW954nF35KogHipJ^$wZ z3+CWt`7au-&X#uO|HXg?;ACoU=wxDJ>g@a%<}da?-TALN0smX|h7Jxkp8wiy|F5Y3 z#lh0W+0@324u+BGZ%$*Ezq!pV?O^Et85Bu7GkX9d!@un&t`7gx=Vt2kuLe>4Gc%Nb zNf?^g+u3*mOiayS=;iEP{-y*_{NJfe_unV-e}lyTEdu|y$ov0K-2c?*e>=qgf6w!O zLW{ZD*vJ{${vCjSUoe2bH;g?%2Jp`vV`J#_{|Yy>wY2g4KWzBVKy}l9ll=d{k#sTq z+YCWF^S^>H&@uemXz46w>0xT3VCiCP0WdSP`P->~*;VaKOr2~j?M(kF`mbgJXc-w8 z{==tYVQFk__fP9t|LrohGx<;Qe?|Hib$SsgEoD_P>i@h`{}rY1S9=!~Plvz6{zoaY z_9p*p@ehWOki7@MoA&Psq-A1e2eAE3$ic|y`+vyxFBr!ETFV-`I9YlCwEvdO!1%Ai z|Ht!RE8YKq5w$b6H~D8)lwAz%O#Y77|1$jJHgRE9b%P{o#|4Kkv}peqCL>Z2s#q#P}ZbUTo_Pm-|L?dvBOzq@KF~^*F3}Z)#15x z=J0tSMRhpVhi*gOn`U}dfa^<4*{b|nO7i6J!_PRqF&^y~VlxnOebL!DS@OyA6Zz2i=*V#I zEqMO{4s~8UG%2?shF|I#VTy~Vfzv~i@fY};8@u~1w_-42H7MPAN_&j&m%z4&)+W!t zZwVf2+AZzEE%i zsx&2=-*1w$JblGUK9<~hOd;yEXshi#jGx4S9;Xccq3k&dw4oaQyPEsGxupO<3UjGx%NGtB&>i z$i+YC;j|fdUdz+K5SOOR{mOh{aVRXXTaKElk=UZ~CHXbwazXv&i--Jnj1?!vu^;-= ztZMia1$7+`{pwfb21`|c*YB5OcAkF>IW>nGsh|$+!5ep&bHhLetOQ5H3V>~Uu7QaN z=(d)yl&Rx3RDSzPx}HU;M-4iNOroUzR2yC0om$4=#HI_Sl66GH-QY=9ICN8Qa+@8U z_2Y0sJ@|?7n!;T%SSfm{8c1gy=v>{Ur$2XNDq*p87c|c@*R0H_InayHnwl25d3q_qYaF)k3yQ6`=y zY}~DP0g=5HDE2vlnIFZ`^p$*^kg7?7T+hYP>_((b0Jg<{Z%0yemNEsY3eP>2jEgZG zu^^S!G@6L;waq;ZM(|>(8BTEFbe?%n3NH1>Uxg^E=k4)hgd))~j%=@-UbI`_ki^67 z|M9wJ&Tm$|5A=D)q$Q{yW{q@(J?u6W?&%m56!L`;gxu7%dm>D4SBP-Q=cy}(v0@@# zoLNj=CW>axc<+W6H=UUGD1GHo!ssRycOQW3?PfOT(JqOj20;s0=5g!AGENNC0iRRU zY;YV0m0O=XF&r+mr(FnV6ZN0w0OANLwUT-H)36u7GuuD@LDl_}9G4kcoDJ5W=1QX` z=NgAe-)McW$ELG~xDfDUMB@7lM$!MA<7pw0z$9nwXx3=i;L;H{Hha&lku$ikc3V{% ztVL8wulceNW(fP0Yz6KqBy^gyc@|sJe0XRTt|Lk2M=LQ^YiOWMtSxO)t6buo1b{yI zsZ(NqA_OiG1XOL&N`G+U>cmMYU>pq0#v{l$)ox-mAXHauy#IW|_QYpIBpk_Pczo?5 zw;0Lkz))%+jJd|INek*_gfQI?UxE|QIEMa;h`tc_VcNQA?4AxdKiLNDq5UyT5q6yf z{{CTVJP}Ymd(k!$c0))Xx~4#aoDbX`Sl^Yf6n8!E-=sW&$|bHYghEUlqo!Qcn@=&( zJ!Aj6Di-F&{E`0!v)0Y#*`iu;$%BcW4B@lMS<;Co|2Wh|@T-b_D%oKmbYT_m=I3q~;T+LZJRDr~J0niqC%C=%h&O1n?l|n9 zVCDrgPZL71oVD1e8)z-PD{M6*Ja8>-iT ze(jY5HmoBlyVIuiI823%SsWNFVNwu9lIxCz?`5)^8o+QVwHFC^TP=b+0NsbkIWm*x zy*JQeu(8_9Oe@cH;weB*ty zNx9HRB(`vKVpe42iNO?q>={FGjbNlo`{Wtjr>|X!#u*%eM{QQ3o~d(0pi`T>54D`Y z(f5u$>vaLh`mphfqCMgM|snK?O_gg<&-Gs<1yDDTv6fpTwa?5sUpEx|~>u%6i$V19P01t-){YTMW%fe*6##*2B_6Vh^u9u4t*q=cJ^IbtNi;b}3~DMTi+ePD z!&l;%-K;iW6(D7m2epefxA{x#?psnG67-|vsn7GUj$g{VrC7y2@8u7aGkq6M^E`G6 ziNj8XtxoW7P~mXf$WPm*T7n}WmdSL}yfJ4esFQ9^v~)$14*Z^0TpdssdD_$ef#}*=5@!%5Q!folv7s?k@sYe#>Ty5Zm3%N&9W1pF_3H zXBb_7MYN{PDL~bJ_s(NFQK=Sax`FL63EB`QG}$mD#RoM)0ojnX>$*@lDt}BRmFj~L z<-~f^kXH+(fJ%Ymh(29vBNXj%-M19!XIi)F++_^y>Sg?Vy!E7QszoPKE; zDqx!~&D2eKT;GSR#Vze=vHgTDwcu_L_TN}yKj3LF=5qRl?^N;{l1}8{v|_wHs8}Y=yh|LmK()XYnM!>>J9%|Sl z)J=c|iqsMl1DYg0ZLV6@;-vX=YjM|1KhX3LTe!#xh)0yu9dR!oz&1oTK681(mwZr6 zXY=fHO$zXCo(Y`3mCB39GQ;yZj?=?j9YSPI!3GiKC~n(z_6hW4`!bXso4w^{sR^1= z9?Hk3q67RYvldr2SI`S%y|;=2@x`5J>I(=s&3iW#2=uWY+g?dUbqgIySWH{=)j%O7 zh;?o7W7bT4^xOKcHH5rT!%>DUf4^Z+(J~z(xClHNA{>h$-%(Rq7_6Mwo1D(p63%4{-=|(Hkz(|+ zcL?T*s0#zPowhhpv0yqjBS)D5WE^(q&R$8VC?}HGdCCbyt)G|p4;FRGVIG86E#F!3 zLg`&*zwE=fk107)%6-$v@m^y{(5R?x8oZ~_hi*7uGnminfsz&j9O zMC~q$@rM}0E7k>qOIiEPB2%t*!k9ac?N?&wrV85koaLx;7fd>RE(kDn}3u>)Y zer8s~IspXm*S(k;GrF@A5Y4j)k}XTRjwg4dX*l(fGzSX5n#+}v9HrtV@hL|^lc}aP z_)WlrV#=A(kslue`XtxLhzh;Et|=gf$m`Tmy|3;?53Q(Hs1b_Hs2GEytNg94s&3%5 zH|~~FuhngR3(t(Dfd zC=JELeHHM_lxCGKvfm$!=BYU;2_$P>C?xbQ0=BgXequs20dud3i2Ir2ho8`Eyfx8( zAoe3ox*bF3Q~Fw&m$A!{A?CZH7`ny1AjM9&(8L4WMI{Rt*PQ0nAtGWf@YmnVVB1l% zRZR6deJaaUDYvE1a&|_TIfA`UnP3DWj+D1BfC2>Hi!|LO2 z(OM*`)-9fV_gkkae(b8qZnKC7eK90*5uR<>G0O85R`F)B2QR($xD8EQ25LQTJ()nq z+!mON$TQA@bP#2Kt{^58ZNtsP?+EBBaj$?tD&MalNV4fFKm_Gq8c(J=Hexk}6RbDOXg(ZgCUac+AhwB-sJEDjkb$Iv6(t(vg_dL8xt_7NQeX2Plz`xvzIItFj z^aD(V97MD$RNa%n9#7u&1>?5OTFE<-rg>X#q%m7I`CZ5&n=okw-C(~`d(!t&F4Onv zru%Jq)upHlph=)wYHZN8IL}d|Nl|`n0;6KPLjpkJ87-L&P7^ZHSF|UUO)z6Q@mV%9 zR%|7q-vtY}rsaf3Uxg#G>hOdiQRnOL8AzB=v^X1Zj`-c@!~+TvCoRk=%X7SIE*KUn zn$ZV|70w0iyV((CL8C#G$~y?$MO%ao169lHA;@Jv210tz!pRQxPMUq6n%#a7jopF3 z?W_@WRjA3Vx$$u zO`)t_|3UbD#d+DTNWG;XdrNPHBdbDiM*bvFG8Q427hXubFYoL_*623(ev}Z2iy&5 zRMG?UO40FjM`Tde!)oCle(r6z&M1!&PT# zk{yh~eHAb*0M1C7@VM>~n;l4?Lr{CDE(r<(0% zVB&rm=G-#GXOwgBjYX%MLT0)3nmd0j4e00anuX7saD7FtaZ0&|2^l2Uhh>-aWky!n zBkoyK(|+5pFxc5)c{SgLun$43c;IEvrrj}y_fuC53|waN^WP3-Eto*Oc6_WsT?z=4}-RBSRZ-SLPBfg%S1cL zpy)}wI-_F6M0kpe(_hpRH0rc9Ps)Cijrt*YMy4bN$k-JT@qMVeRQO#>Mf_amq&l6V=#1 zce=q582SxfZJn(1Yb0cDiO-V!DXa=MWV-0B{Xn3Oru5eyr*cPLZ&?jcb*WZN zKfrT9#w5ifgo9aG8m*j#t*1sqANTF{==uB^#`}FPBU5gc(Ecrg5%$ewQ`KqT7sC4N z^7$|j6{8Nz0@X7!lP}|oaU3wlgw*TgJAW>HG;5(+ zudQbNCZb~G!2$e(s&PU#Nmg18ZJV4WLGZWqw$8>7D$$rWq9`zZ`k>o_r?4S`STlAu z?KN<(5yWc~F88ei$M5P1?+(afJyEIn!~mbeBPwZg!!Ii2Dpr)q?paGd$L0avAu#bm zqSL*GMoP=+%-(K%@uTX+P>T%JCyKTNOv=rWw5+X_sSymlo6-jh)AmNAqFzm#Sj4%b zjz5(UU*eBOA{!PQzzc=YVzl2Dqa-4h%qNEa@yPPVH}S45;lTGBEXs6KPTiAA!maba zCGic9o;!SwKHeN}m#g|$9&L35Avle~X7ztm4?e13z~c}pl*SRL)$Qm|xeV+R#NPj| zjfu&4|60Q@(a?|9;Hbo(bHyF6tC(I7Q$&{u^MY}6OHm$-iIp1rb_tUv!gw&ehe8yd z^M?&h0h-H^*udIAoH>GhR-H98Fx;c|xvs{VyX^Zls6)f=Kqe!gvZ zSOW84xk^x=Yw;&`WFKaw|1dtTWyanEyDwJwiLM_hHP5Dob7OA#$ydR?y&P@r@`0ER z4u=RGcpChqyqU%w>R{$3OnW~D`pRM%dviT8o;V2GHrmt9j=^8%d2vS^n-dwj=xs1c z$#ZX1T-KiivUa5alvO4=;~>i>jsQriP_qKHxawT`)yCa(0N!0(jKIv3na+sOraNhI zFmL#1y#ZI#8H@qDQXZu#)om(H4*vOx)d*Sh#p(#l?r$Takt~N>SdcdF4WazW+&`+} zj9nx_t+;_e5({tl!yfcjUOn0xR!q$ZHrc0vWOLk_*h@D~q~;8#`lH!+Y=`zHKYMuI zt0_7or12sC&)(O7ryT<)NDGAS7KE&c@FKr0$vi%*^W=@@?{Wl;7+U|V-_qnmJWy?I z#2wFswTn@ALQn?%Zyh(HUr*G$Yaq)OqG zjCT1Q6!*YVL!yLTHj{a;1_b6XIInBT+xw zllHn_)8VgHRn3(JBeH-Qz}n6c)Zo=rY_ns)N2VgV2%b$Y!E~>(&Qdx+HrldZ3@F|d z{H(l!2qL#9P9;NEZ}()ZXjTz2lI}alOEA>&;J`^Or71_)yb@b2h8*wpD77M@=}q-UvxW?>G*7Kx`?8 zh(q_b+iir8HC#*VsBg6@I1Ec_?}3zV9?p7mdzfdx1yyXUL=+Ysw_l-g^={tKv7j@E zQ|&T4g6DoHcd~+Wpt;=(?xZq?Z2PDmlfSEZ--6JgVNpez((U`92eHNDo%t*UGSD-x z3F{*NHb4mjSwgw@(lHSGIrr9~;-x)QUy;_2<;_-sW_0Rrq1=bDgzh}?(>DqusnMa> zx`J_Sxhdc3pCRQKOOY|B6b}OlJP9?W`Ic z8T_-ZvIwRC;{myMu3MgB44`^SWqPvY>N@iDWJvM^V$&I1@r84w(Ec`-QGL4i;JMw_ zR+K9rzGPA(J<~usl!cY&O)OQDoELR;ezadw#?C*$dC_Tq=1|y)u#pPBp6{9vh|#1t zws?*DDsgef6wJ*R5c?DW=7r%`)TYs+a`$3E7HuTLDGI%lMzNAXuWX>h65gpa<_rQr zZ^OLc+;Tc7B@D2J4l4~RM-r{JG+(Q>Qj>NLmQ*Q|^hN~&xm+mLMH*}YEB1j0LQtCP zz&~6|RPPz4GO*?6|>SVdls9G%lW?KHnpbU)v^>0;QWpMB3pqp8#o(>lj|H zMYXcp;>!P7E60-iZtgQ4Ai)HR3vP=@SxiPRHVv>L8+dfTD=>`sE%hB@Ggc?GdSp=h zB|#^RzFObKaDqY%cExeRpT1B=w7UiLGfOf2_6y@Iu?7a|D#y>RPGX!T;h_OS(N+Me zG->Xc<9v`U=8A`Kb$juQwnQ0S%dm8!Pr}Ad)8i{e%r`@O;n}K!kfg{$rF;bv`e8Nx z^rZSyTT56HT(5CrT^K3J_)`;`tgd%(gCD!*XZqN&`VPa0q`I!wCW{wQA;C@X{_+@P z%ata-PolIc6{9G$J~`J(d+(_3FQ@a94t!~2`N)iPjNH>Wevhay41)m^HBGvq0&^}r zFOuf#$cXpX=7g^zliA70*fJnuPV7;ZpVSWz?`HR`rW+X9YoT2pL>qhkKUTr>_O^X+?aC$ zEQz@(EWUftbb&Hohwp7ZbrgGt_rCV6inu< zK=)W!q_z2b>hTv}CsZrZf~21#qWEDjVpma)$-eqnjdeW)CR9UZRQ`;nn_5+7-c8`Z zY&a1y^~RuV5$aRXbNe%oaIh>4`QnyV(?d5~8KvEQ>wZ`^u8I$kz^@k2&AnM=LDZ7& zPwQQ73Yvz|*bXS{6!I>+Y+xDup<6o@;c~VKsI2+dcpBcl~P_#lScjE%CM?cUQeW`3em!jJ@hOs*zY%e1$ z(=gG;&(-Kn2iM<7LpT~nB+@}&dMD`-5qTLYe*h0mtnLA9&jwc`!V>=c9yUFRL@9um zSAdH*2H&oIk4ou01HlVhj)rKgS+7R9-@gQCS5GD!FUsVOJyIfQdgm@>-Hd=+D?vt~H!WbC`s0t}+p(LII;TQKUuYI)XXmaKI~@9Wf*#Z5lmbQ z+j3wW#|6A$Y$a1r@Z`f_;AJK~3~XYsk~)tAyGzLXxljYOjnm`#_Px`vkg3`O)d&mw{5`vkt+i~QD|~1L_$ojf3vF=jD-RhY+1A^v`4R@ zI2ROlC@t?i3t>Z@qx;0a0n?SbGfbdZ#47xB-ya)n@{Va)D1yzIi^LTB`qRCg`1cIk zjH)3mD|*J`5$R;m=#;Z*kB8L&jQZAZvEHcT>D*f3C_OG077YT#8}+grOT~awe`EHA zS(2|Uy3x$(q>4CvPcZ?mP$`3dQP~M=GawFSQ5s*3*;UtD4%478Uq|Z%A4*Kl$ zsHfUcL@S@W^V<2wZ#u{xk%snzH1snEtS(AU-zQ(Z$kxA-0>m+-9;z}=0REpWA>|<@{@|TleKo6C;s6z@z61EYEcA+NPFQ=alXf(Q=gyNbJPdIKYt->WT zToe}ECt%l%cN#cTbCY)k`jgfqBK=~PhD(c;4}=6xrVF@y0Z|e5p#GirGKSeU71eRL z`;&_aankqasl3&kHpgXrWE%~i7H#zYWjsdk5UH0L?ZJo9qm)&~vrIeD-cNu92n{G~ zlvj&xJ@4j_;xIxew=85w2oE%mx60BX(knGwDKN}sgq57qH6}A|Djx|p`oT<*YNK-{ zc%^dq)J{^#PLj!^VI=U@k|0aGcY$xDO)xQ@mv_au@}#vd<$XD=#6(aYr*|2ZDmEF@ z>E@ryGtnfS4|)%0&_ZNtNlf1UM#TKcSik8ZBbGxK3=#2aTWqvhJnS}0Szg(W>ZKNo zZ$`egH3`vayLH6j0___9v-LxG8evbw750@jjt~@LNZ3UuUg%y5tcogkOB}<`0bk_? z=&eWN3(zi${bBgE^yRYrkJpCH^+Ia2qqVWo(Ra(p3ZiCk_BJS7e1XB`9}O`_D`{1} z>d%Vv^U!=D#`*r!J8NT|hwa6ntr9Fl=Fr;SD}m9VAtqsOoFU;xsYH6JN;8nuH$m(n zU*PUhf~jtpA9hVM<~N~vJ@3j$Gb3rv|7h_g&~~(i;@j;>eW)jk(}OV>-TBHSh@%-FHj&V)#xvuq zju#lyIn$Nh84G?y;!=zYi+KaPulD#H56^HAP^Zt3_rh+ZXM7{=C+WNniQJ>wXI;Li0=^s?zj8?r+Q|0( zN+#g1#JOWG%Kwq-8;o_ATRxt4ciyL@a$}S`TfPV`4$9TR7o7;Uedf!?GjsdA#9S9TUzT#EVhl=P9aJ*AmYkx|A;`G>8Gjnr0bl_hi?SEQyTy`Z%d zW#-g79nB`&D6`=_Pc&N!TnTmCa_;x%F-j@x}RL<6c(4!xlZ1kaP`|nROL|v6_Ebx1#;PFv`YyK8W zA`dZfHtCPrWNo@yOw0($W2oYzd>So2sLI8PuKontrDg#v1f+50!Lg5zZ5=>Ge&{S_ z5{Y2-F{TJY)(GJHCFk9L5=(V-BSzoQd3v1!0eln9kG=HVyID~%FAK>nc)m=g`M7MlZKhmu z;O7@3*!2_%HI!s#YSmA58+nv%?D-;-BkjshH~(G~qTpRxiT1PWN*0Wh_vTPEY%v$l zLCsG;ssd|;trAz%F6^N^?D;%PyXX4ukffTVvRxTv{IQ3`I(?}`CShlQkJ(&n(wEOU zW$fjlx|iK{KQJ0Sp{QHxZ^W++?d`J_d7Vxf1}E|oaRh>`&MJRV6qEgP%y{4jF% z8*L#9o;ufV+L>Q_nO=lJ2x8Uu^v<4!W{_A@{qTx}BwljTl7M(t`vJ_*h67*@c*>*wan3mS2TJGK9FDpO*JzR$k427U%q56P$9V>0h`MimG{w> z^68rH z!GS~jL@8OPpzI>~IjS3B#$IT<{=jfMnFv%F#vE?rS0iQzI+w!GDfMRLJ=^lV=|}PS z5dm?|C(@8*9zRVZYD#@UmFq-HcWO*%0-i#@t39lGs&2{{90U_Yw4+iJ(yx-^U(vQ( zrd-@6a3Xs!Iz?H*GU=4#1FsPFbc|+p?it zu0NxD|CuJ3Xu^?4@BE~X}t?E7JbXEjP z>k`Lc&+C{FUy$M1ow1z=Jl028zV*8u1`_aZsSkmF0pA13-4{(=nA3UI><6kYl+#Mm z{h?4mk___;O3Ze-Fd9a^9H!h|ZB`6zleHYjfGeqF&)(3;NgdCQHPO{NJA$QcE`_ zXMpueO2zHE+#g93hM~LG0j-S1^oL%D2JYhc6KTEt^K(kW3)WCCw}1xYRZq9(y>n3> zE-8x@Q!P|v4Pz2hEMi(~N@gi>IN!m|-do-9fSd~J{v129CJ|MlShI=l0Si2;9WJ~dLZmt!8*QK!^^3oY*yqD(#%t8CaG#Z+>f6% z9XXE2wdt;_sFunJ+8L0my=h9OSX;%a=L*9g?rE|bT_nlRUN814%mvw0{Q2L#Q=2a~ zcb>yQU?7(c>tev}lW0=Y2eI6a)B=mFz>U<}VQW)z8>=nEFhB2$TQF9c$Iv-8p%D?;&TR}n3s z%rgjD(x^pb$>Vq_JeJUXRYP#h5~AaRq@Q;m%M?&%m<>NFl034-jYVIl;zr{oA&-{P zsk(g21Bh~0I$IIfW&9pO-zSDxsp5bs5lEzbV;;X@n)`9jeydEE7l<{=G{DApT%Xkw zY19F^;RT3_so>7#qJeAxmaR!-2K@ zF&MoISZG0(g>4n?phJs#GB?H?EjJ#n*b|)AaVc!;l)|!;LG-i>r61({fVY9_|A7`e&|uoAS~g1BRFWH)Y=`qHQ2h~G~2 zPrO0y_&9!|?JNUgKcd@A7l7fW5uJ+1?&B z;z?q_UR?*j-=OcSEL6n)ed*fiZl`zy4lZ;jgwedNqG1FLB)Be)E>uJnE?h3Df($!A{bxTqqM+)7|^58|tqbtz znaTf>IKBRz)jh%P5(3&%9_Zrq%PK}ArDA3eeyezdK@xrN2;>w}M^7PNEk^g82NN47 zK@nr#yV_y`s;bgt)5!W#2wDx`CZeAYawd9Poh2;1Nb$Vw+|C5@4sV1g@%`r>J!q}7 zinuFRO5k`&8IK`nUAF0S#l53Gnv}*)cPaCp?mM9YLhCl!C8{cIM1512a;r*Fg0-Bo zsPkgn_&p2JM{(?kXe7arfj4?o2u;J4AU@PcVMl?=F9;w+vV`zl0%dVugR|o}VNEmM zaFJ})Fs83j!kA8!VR_3B zubNz652DJ512e6rSswZlglSG*qxFS$;JZE9ua!c{^R7D?)WkllpG{k4gS zLHM%r@6pqHKVt)kdoRljGtFS)z|U<#KCvAyRYmB=1EN+v3O&y{?A6cH1`x)bMcOtNfH}lMd#Rsh^q*saaZB5h;w3={!#kQBY&wB+ znOl7N>mqw0r=Ru^;04dhp86|V*&*^d8&KQI{y6ey(%4e%(LKcXC6+*V#8a>FouvClawJzStJ|bJ!x+Nqp4(Ep>JKHCZJRvewMdC-5_suF<;k(I~KBeQgnr z%zLJ8yf8hoTV0`%Fk9~`{k60{1LzGUeJ&V@MWtII%JfH%NOsNZ$E&oXxa?ss7240^ z3b8l4ha1Am_sGLd9zfGGLe#7RD+d$s^Z{Q5&-rMN)Z6DkuXP3?S3g=fKgD>?`2ElD zhaSQTcna-8`)FIMPurMVwoPFcQ2fKScWcg76HRCH!WzVq?9uza8@*)Fk;>}qtySQ> zaOeZiWR4Z?khs7^*CBM8)PtuGy}w_JgTK0&Tl~rd!cKX*^Z&2aDypn4tNg-bDtT-63G2xWY_q z`($;$AxY(qr2qcmCZR1ZD)u!x-*Q8eu=Y7Tuw4|17-8^B~eh3-9;%U}85Y+1>0SeeaShV|2#aa+@9nCXw42F@1D^~6M{mVCzXo%Gf>XN|0fls)mB zkR3bb;rRfS$Yn?%KqC?}10%dU;t+YC^ONm&$|ZwddR4xOl=?rUPsEf|VuHVo^F>C$ zYLya2pIV~gEfgmRH<9(1qBL)Gb+k^UKlgaWe)X>I>7h;?jg{N+KR+FRcKxQV7P++2 zQg^$*riAvHn(6qyrsL$HY16a2&6I$#~LYqtjj~e_-TulF5q~Vx^=YVEFLzpLt zgMOLry2%-g?$mmcWR>Ik+=csQ4-|^vTtXy+JoNlr`u00&$5LC# zx<@xGLh)lCj5#%o8gtxcBY0`0l0p-^92d1`^WztqDcpmE7pDz$aO)|!aA5caQ57jR zwq@V;S}a+UdxKNt)*Tf$o%KC$K{wki!4!^Fniqz2+<_2$BFa22?%D=_f^sy(fDcnB zYe}sY&<%yx_BTTQl|ee_=CTkr&6S-eXp$eKgOO81&Ym~w5gyW_aOZ5O7=2LV-jhz( zcjr8CpiMjg3fXOllN8HAr{C*T^}yrt70W(B^M zUZXx6S4?VaUb20P@&~aYw0R6EwA2F_xug9%75i2J-8@s3sXu?{4Mp0=VLxjYgR3eG zSdeQ^F>;R{Q-R8^Xj_UZynD5edIM;7{CYktllCIMeoGnk3^jI>WZi^+!3LG^%_e`$VDasVR{eQ&c}KN zj7e|Gvl4U1X&rP+I-Fw-=gB>@IdNgkM|VZMBpt4A#i+IKvmE7^Z&DmQvOhrF9}qJ| zWbvb?Z2f*>OGDAHH}ExS=BtyMtbT;(R;I2;>$8^Iz>LYOXQlmBq(4{*{(Oo!RZ+fT zOamXo{e5n9o4PU$PFDaMJZBQ;^MRa3)qbrVV@J?z_XTlJR}ZqTOdtlLiOmNmkr}yk z`DJiX%pF%(x&`S*MEFe4iA(MYXPfakLED;b6^{6dTr%vjgutyZWl&KTJ&d%?Q$w^1 zmY+NppKIx6{vjzXu3^&ngVuyE>i_^pQ- zWdM#947%UlF{f&vw#fPiQ~beR$*SaKp2j&EWLNT&w7z{(Ps&1`x;GyQrCYO-g#fgF zn+2GsdHnXwY2eWpSB{!RFO)4xqr2n0;TEsR)gh4B{u(QdFV1U8qO?3ict}bNN20F# zx7FQh5{Y8r) zG3M3lSE6X{8Pp7OmV;P$!g;hkvRTM^PkIQt)12eOne5LGqhKY8G>!DwFb`}&Lj>J) zbv%GhA9Id;a*&h2sQ4&1pPpoBCD8{-R}$)N`(U1LkAbxddY9BtT=*7`2oX(azIWZ5yEHvpfVCSPFpW?zU9&xod zM0ivQX+edT7sqX4SNm#Ix6XSW*aFeui{?n z?;|1Y!LL9y&?`eK>!eL%mGI_i#i3>4q@@J!g_f0DxEy=|XRs{~vWDIs3H;Hfab>Z% zkAyB3Pj;q@e&<=fA{wutUGGT2shfh-{5qAwQ^8lr69B3u^n%FbkQXtn$Z=IXrrH`V zGt{{>-j6sK`T1++VZ$^vPsc6L_XBf_ES3|0b|!a19@CxYIFjzvBFAblL&_X1Wr83d z&7rD+ZVu{}HPCF1WiDZk+L{*;ojq3O#zg+28Fm7?5Q1YH(ZztDdl%azgbxbBo>l)^?!pG>k$d%)pj z5kAU=ogeB6i%q3IL{~9KAqf0d zx05FS4rQqBjW40kYCDTVH`d<-!L2-1Ep@sXoFvk)76YZCU1tq3rF9GM65Nh@7YOe@ zZBwJyi)uy15V?cjrFPv5pbn=+{|1%ZXEHo9uEYh~O9YT4U4YU>y;^%)zj6=h{qb~2 z{Wyd^LiKvg)Up(XO4faPWkNSms^w*--i9H%P4-&R zgC#g+uPe6MhJsFV8E~op78j)tgXA{4>Z{CbTH;QF*TFk-Q}`&nNJ5&m&Y0ze!cu_v zq{9~tKz!Zjs4JHwt0!a|Wq`3HQ#Rd3JJizV&nsf9iQ;B}u**eaccC7bOVLIp)nYD$b2BB~}i zvtY}w^VG!KW{G^>wWQ=ISPhvX5Qa@FH;!->*ru#bK(tK(=|_-73+=cnA%r{H$W66x zX!MFqg=1KN@BCs2E049iDq(~F{N&3WB4?J=L&sHq6Nr{p5$`EfWa`9k&^}1Px8F4l zzkXo~mb=6{>$6=NLmlmQDw~rJ0;ef5!BQ_Vmz66kE|(BS=<%JEDQgWemK%e7^m;?f zq77t9_U}1+VL@G$l4b8}4dl_IYh>vip=Q9&-3M`lNSSh=w_PcGZ|N%6G;GGb`^tI^ zXX9#sljwr@(a|LTKLKA4pzzx!HY-l72`sR%-?`g(Qj(|O^1b)biQ&BE$j>eH$8{P| zQQ;*o@U3yE+$1k*x;uQ-2sUx0oc(ayxhV(QbPAJTl?=DtEkHI;Uz%Y&K{{M^!5pD= z6k9lC@=Xf$=bQ$)8Z&{uZ2t`%bKUtv=#b*|SPNrMi{ypnHl(``fy!u~U3XyvD&S_| z?|s6raMOcYv?55cJey*`l>*^{>agc55M-dl_JxTvFgK>%1|CizH6oBWDG&u#EI!V3 zK1fUFQ&tKPri`64kT6`ZV8^y?+n#T1+qP}nwr$(CZQHi@f5EHTV1o_2ZhpI~aZa?4 z{Lfybh>&;;^IEd3>jh>t84kAa@ybU*qHJ`n`d_$!lrVR-WeMPaDm8-ZwMYqshXYH2 zgBaqLeO3e~ke;#^1x-GQUd3Nr>`xv)$$4G9?^tOD;IPgF~7z z`DYJ?3L};u>rz5fOu}I8cR_x`hJW#&(OGaJk~{GOL&YA^uToy5wFy~2hI;H7B;(+i z+NOd!$ga$R;TCDTI?K_YbO4_JA4==Wk=1OtdC!~vDf%lKFy>QHbOKb<8c z=)hX&EU`O!wmuzm#0O!7J;yL6E3@U3Lyhl@`U+hyj~MpRH5?cCt3VWN9@xRM#cuf}N?4}PYk8X9G-6yCrQMKY_jY`|Q>-eQ^s zW%1x2TpQEfYr3vOEBt`!gR%a`pwhE6ExH>G>AWUxg!c4Iau;a}bcqTve;Pu`d6i@$ z18G3zAmUSiaFRptoN`VqZ_>Ly6gwIl7hn;jszT9K4ir;H8<&wSlSY53kbJD>Yinr= zJWA(y#Q00Z?IUwvQo3ajr>sM=18b22c7y8-4HHdys?Jh~RTu;rbQY`d*SgXQaVnHY z40^c@;OUalh~?H;3Vxwxw+PH1OU7P#eHZP7+=2jNyzWw44V^lpq(OMg2q1k=*$W$^G&2w4ot zkAQ1ZS=Jb9nb))OX|@H$IH+y{21gdUaj_6)y#go&TL{!E%k|0&v#+O6xHz_phV zsNM@QaKPPM6d`fMRY3G!Nvxn$z&lQI(STt6zJBwRzD_W`PfRI2Toc>={s;uy@* zj@SQ?au;FHO5}t|8tr_1JYn)~vxachm&27_9f!IOD#Cv<>Ih%PR^0DH6fRZ!-gdvT zuko;1@{pA-aHsGLJ&c|{PQo3zEx{WKf;Mn{Yw;Be`nP6(DK7ZHA z2X2GB5c65V!CMXCWC3fZdlwGz$frYBx(8?(^>L=}3-x9pX^B!pyKb+~&$}&Ie8fpA zK0sU>4kfGJ`oPCWOfIS?arNw^f?;3r#@Y}M*!(jurdmQ9Ms(WE&G8oM*1ptW?np$t z+nKk$@i6hvgR1%$Wl&09neK3n05CRi&?0U1uwQw>$c#oWcxp-2>&lF-v-b2RJ9P%U z%Zz8@OPv?Jl4Rz36V`heO18&@%F&+dcn%e>isK*3=`p(xkf+YJA7Qs`YDYZd^l4w)IdH1eR%(x?eevxQdRSk5>rHVd4LTgm;?A zY%9kvPF-@@v&Mfdh}dFlN)zYWDx9h^WFdu&PlX_v#nm>IMgODg(}|NE?w1Ayw($xy z7T98YVC&|$*l9NNPg1?R);AW{=DReZsRY=vqg36@UH~vd1ER$^24C-6;Ty1k@(E{R z3m|v>{unGKQ=7?XLW*bdy{ayX5A2xw3EwQr$rtz%2Lc1?kKMG?1z~Y`B9r38Ds#uhaaius>xtr425d$13Do(DymP#x%qIZ-y^5&Jvl!w z40|1FV1nesxx-Pz0ktyD`ZFT4KVaY>t?<}_eBpE~ zf{vJ^gr&1r0V(*q0HC+<>*Gcjx&yo~^Nuoa7P7!LWnFH%K<2ZUs|N&pKGO|HxQ}Yp z@kY~w&c6(Dt`1_!;rA86b$FIpA1Z|>6i>fS(Cu$q)UfIR8`qK@xd1A!1z;~7*5@43 z`D@;d$Q&sM=cDLCSx);*V+_JhbhNhux|U+M3dKLB(4C6g11)U=b0e z;P5B4Pttj+kK_&M4G>N;3TAaZvRjtLq?ttyT)<@pPR~pAU@kybjHYSPm1uNF-dJ%S z*WTm}h%^+70+d_?=aB%SscgIcXfYV5VHmE)rU57754s%aWbUf2;Df|XOcxcnoPDOO z+YdfinI@hK%u0VGTYMdsbe$Z)5C^-D<*C<|V=dywsIwh)d`I9(nlpZ}z;eGTCxmEU z5)I+l=~?ThyD~O@bs& zB5?c`ThSo@Qx@dXD-Yv4bcP@~6NW3zQbkgusk60H!nf(k-+=TFKlo2#0rc2j_74K@ zD%Beg%3X7ro&$gd_P|N@PEDheH;2}rZ-m-geO%`;!XBeZCx;qWv9YcWYy6vL+;IX_ zvYl&*vA#O@Y&XePE7L--nS0!Hxh#x8y88~#v%T8o5wGN03G7j%>**WnD9?ZYy8NIz(zUZ%HHPza7#~F-yL_Ja{`;Y! zrwIT`N&F!R;0H3Hpm82=CvMmC7{CJ({Aps0FNriHb!^|WHE@IEqk#rJb2}Xn`*EeT zuuQxsrJQmxWrS`fh_9WKM?ZFNUA;!yZ9ND=_+UxHA@evB5!H_9iE#HPx$jt#CI=&w znN%V8p0?WuyqM`0-yo}Anb2R*2Xk9cjyWs4kN z&NIL)dm7+#sHCztA?L%;R!i@K{}PBE#_KcSS0vY#R=L zDxD@Dv$KNJ%%tVL>mZn%NuQv%vt^n%1tE`7SF!^7Fp1BPD2x&~2DlJSTTu_dXSMs4 z)|jk<)0bR@+iAH!b;O=Y5Y@{f2R)Q?#k}y)8B+nmpMDXwAg${7c={T+3ReYaBUUnE zRaMnfz+Uz1yAC?E+S4liS3T8N16x2U5mUC}ladc5IdJAYgIRZCc8%0@iU>tT2XxG5 z;K;sl4heB${A5uag7n+t^Mf7b<&4fS}sp$1M?ukLB6B zk6W2m|5Wj&?2JB*AKBx~4HBZ~E<9NJL|$G03DV zQo5^}!c?Gux;^TX>zP435s>eE$x+~${uTdC*`YJ!2nMxz0w*NNFlXy97swlL(*|K< zX1Q56`@7u!+G85I8Nk1GOr&Q18zeI2c`zB!AEvPFW8lkE;TE}}`&d^zg!tC~C)$vS zfPuiy&=QJ==YL^_|ARJU;P~I@KeQn;J0tV|hW|I(kdfuT1GN87O<0YqiE{Q%BJ1s~ zY|+3DX?vHD{W%y`nS&by2>dMq4iZayR~I!+ny0ao)rqpN{QdaE^ia4tC?LkSV6KkI zY;M4ifY1E={w(82{Uf0JC@3hx1;FB*oL)lxt8BIaV7M~8qNb*)ewx2ffa>o5@eSu> z)#_V_{eS1ez{htdHUN*$U%?OkdK92RfZ8|w0aW$95cnl!cK8KU;Q9&5DuLsHIRgn! zUjba)puOrz`7x~_9i2fLfvU3!0KWWa08(XR`S0~gIvRfl6750Lfwgl4Quq0`_;phW z&ib@z0L&1E0k1DV&#(bpLDhw(ad&>7`)42lT$`KSz<)*d<8~%5>;z{K%J>lB{Jj18 zmvgjtv}pI4+*n;n7d9lwX* zoZWuq^1vY;-GVTFGciZ`NTvg1V_$ax2*#m8bXF#AfICtQ$ z`G*@eV0CtP_ut`CE1=dU=kJR1zkxm-0IG%8O&rdy|vnGq8F`r~5xnYn*KW0X%`fKf=8|{_H>Ps`M^_ zeqDeeJ`pGTU!70C@81rlUvvyiF)8wWJ*UDG(_4sdX3am7_bHnTxPWhk=ewofvg1GP zKi*@4c=T~36O)ArMUH7UUh1KmPzF1D?alhOEM!-P?T%*Mu5yO+EG0Gl&#}C~6w|qt z18dkM!8+PqXt7y(?nvpbp&gLdyG}&`Gf?ASmT2CP^{Z!_@98eWYqFAa%rQ^K-m|C4 zEPMQS4rjNvQC1ci$y~&7@~w74@w2yR0T#Rv0rzINSq#8b3zvuY8+BND4pzO`*b6@V z?Y*8Wd`v8y^UmPA4MLOI7_m}hHgXto&O%AoC$^yNWvyQKMqlK~51fAjCL7$*{jXh_ zXf0W2wrYXO+1sbn96HHf%$to4topi^dB^ezR*BuK>%53JVl8f1X@?;en~>4zP2x{R2+Wx?kW>K`z}nYS!hBgBgwOj;4Ss;E<#$%Kmm-P zEG>2>JvUh#pZyO8OnyI8bG9#aLQjhj(iceprH{b^GoTNfF2)(v zAN%g`ZyJpov>D$TRxGl;iGXEFy2HzMUUdn25v&e|P_>m$oSssSrNPKh*~_Gicq^#r=+Vs=Vb~sNO(Q7agbR8kJX;J; z#ZqQ!A`F76h}UNdMX87;+`S`YvI=}K^Pvs8SKc<}g@Bp2U!H+%`Uz^2=1q4ihQ#@- z@2ylraNw<8CagRhncbUjRR*3TE@+QMq9RW46|5(N`;Ht!$*i4V3tr_y%Lvk7aD4+^ z?5~C1TjpU$>8dB0n7t~(zzvhR2ddT~s7w;B8b}k{5)Y+_9D;P_S1H|N$H99kKI+LV zU^#9(5B_QbquX-OeE5!aqT`gsVN0uG_u z_gj#o6BQiSgq*9T0*ro~Mo*(SrW?*R|O^S<@j_!6B6=w1<=d4B9k7S4ln zsyFJ&zSHk1$zgbc4Z7HAc${bmIyoR}^D6&N*|7S$OL{<4$RE{89;zJtWU8tO?aC{Ev1WlUY1;a#BmehkZQ9`4aA^# z)^=Z>W|yo&q<*rJej-Ss`Wf$ll?}O!m$38f9E&E@>;4ImZaPB;-uE79dk*XPzZSC5 z&B6aogyy!p0-2jv3^*EtgBMpuMm|Bagw`w)1oCr|`x-MK_0vdoN8Z?68oI5RftnJ{ zs&I-O9=|SfMI5h5zM^brFi${cf-r>}L$h2jsh=%N(J;?-GjF=&6?3!CWU$%#hS%G(QzEg}DykjXB3vLexSH)i0Lj zqk2Otv^0g%pIo8f!!X3ig7m8*@Il+BrSf|DKAz~hLFk)cy4F;+@8<4lw<#5Ow2V71 zxzaUA613uImY5EtSa8IqHMnVoxEK050*k~ZR#%;L2olgl zaHIkBgKdX(4U}m@8fgA`prcgV=5XopWQe~-Oarf^X)-uinxyQcSL!!Xx*ablc~>YT z!vbZ5FS(Ttj8jfn!#_rvg-PG;Vo}&RfJ~Pm>f-v2{T+hRjWmh8R!nMIHXbkV6XCH9 zAQGrV+yoGl+qnl-Xne9Q|3F1G8CPMjU7m`U^FsLIEM*}xFVntE5L8NH ze$wT?cYr+Hit2yPPVkBQ?pl>lEpdV5t5xOn@X53rG~n#s=%-t#8- z#xdNP>i1ylHd|s|(LQF&HM3?e_4~$x$G5B?2zXB@dphN>Vo|dIVHU(&N%2k9|7v1? zZ~7VT=@A8W)&*77PpweD5w!#mI)@5vLQU27nzsq)AXHDsjn}I@GQ*1tS>Apw4a%rM zgb8D1xsxw-iJgM{bN;%n{E#)&Ahr7y#P=BTBVPAPHc_Z}{h5%w z6EllmpBvt|>(kQ1UDSvxesAeL^C350L3zQxZYfiX6jh&23eN9}k3^gC79snBA*dt` zo}8ie{3w9D@jVJ4WVOJD7rWd6FrNw`#Vq`;na54Zc+*#CZg76}aQ0en{Om;C!s^VsQwE%C&d(shH(H9gK7W zd7K8rw|!RTGd*6Pi-hOjSA1t?kX3Y1SgJ0DN&hPO8O|rBeKV+L9F~E&nf;Y2_cVfX z(Ub^^MG9q==Zf9sT2wJwwZ5|zW}MK}0UkOP1DTkU#!W^Xm!7p$iB`q}tsCUU_C)`4 z%5`~a1yVnRT#ydy9lyPC{!^9a&HwtJIAhHF3Su3cSQ^gD*cI4QU|h=16b;K(cD2gG zlsdE=3TR*>BfRZQ%`%WKMz0hb+Y~#2YBycP-h7EC{q5>Nsi5+@{1&zU%Siz00yRx3 zT2N?|7odk=YuMJ4#CKc2mrpcroD4?7E4dP6r#+3LcVDxV=*lY&NqW z4g?&^kVnHI8v64e_IKWmQe0zJq0XXmNNVTB-^T^XSU9Njras-C=W34 zNRCNNYx|+X1j#5BRU+g(#MTegGgX{qTj%iSVqa~WIM_X38C8E6&;>6LQ=iYxTY(f} zGpohJ;wDX`|N2~j5i=tGt||p?tfJTIi-RmJna8_gj>oUE7K=XC^2^DvQdDjD!%d#vlyeGm+A_NEn7++>}|ING7 zYJLSC^54u;&P{n(jp+@;9%bH`wS12}cfc)xk20KOwJN$-Kb*Mul{ zIkeyyVB~>$EERb!gA$i_aOEcx50ImGbBs;2XFuXHS@}F_JQby~A2LYZUc+BVDc!Yv zePr?h@}MVpb*{4xtc8_v!LM1YBZ!y|K)Xb*bv1N5sy|p}z6x;H)m8b^S{Q)4z+>$g zox)}uf~d@ZqX10Xg*F{&XIDsDC5}@;@V;@0v7~)>cpfBB&uUhd>#D}jt1fK`>};8H z%AsD2Bcc<2Af$vH1w6e9ZUrfh}e5<&*I)LP! zQjmw(6x2Kd;gS6G`5;SlB!Z5W`BzySvX-G1W~>7OHlNd_dIl``3V%PsbLT5MXUEKb z`4RIB4W!X<^~(Pk=xYPn!*^q(#Y$Caz>K44<0nwpE}JDeYtv;f-plQPmSTM_Ag>WJ z$ZBUwEMoHJCh&deaoZpvVH+h=Boho|8nDwL5bNMH&JVy`i$61#!*-LyAT0k<-*Y3| zse(2-d>%sG-BE?_QVxmkEGb<CBW2GxBIf#`KlW44q+*lE8f;K^ zpM~nT`ar&mc&@Hf2_<247mF%0?iHy!fFd{N&7_>X=N?Ig8$!SXy9{sm#Z9^gndX}k z=EII*-?&Lrj5IVOYSY*hj25lpj#gX)o)7npH);^Eu$7L8C=ZPqP7nn?FMiXvaxZMe z{|r$8t5#qb^_V~lKDXWB%R-LkQC52u9NfDU#c3AgOK$@0=cQ%03VrnNG7|&MrVvz+ zpH%g5RK!o+%4Fh4{t?Gln(Ba~ZXKDQN~KXH+@;k8nQ&MdyOE>Wbg`Bt%|H~}b1>PZ zAc`PuBM{(OeUW#qp(i~kEFv(i@rD{5MbSlm>+=#`Kqe0Yfkdw08(@ai;FEOlw?ZTy zHsra%2gwC)+-Nr^A3-NFzq@*|3j0^!+2aySOfX(qylYw;d~X2J1;+Ta_%<`Vif()a zo=qC79~zRqs7#Z`C|v=5=VQfz5NpVXY>$)WnECRr23N+;&eoZj&-jci&SZX!D z_fVffvi@r@g|CURTb!oXA2+i;lunoa`xoo4F?U|h?2E;6s{>>{u5DO7;`}a6p*r#K z8)uPYN&~-tnI(8^PJ@j86H(@wjT40uj?hNz6A-7Ush`hkGnp_FG?0S(!t=^3Y%q#y z%-DjoQNaT?QV(X6%Wb$7Bizt$RafcTdvn?StVlM~ah@v_>Mf*8A<(={kflV1^RIb8 zC0Q+2xUz3jr9A{QTzVFh^ZWgWqg&yA>-~85InJU!h9)l=1_8Vj7emK+2H$UH09A=F zn(!_Wi|lZd^9MW0=_3M@`N0+(Qe{{`LE#{BOr@Vk#p9e<3S-QU7UiGA=F^c)sSiys z2b+q-JJI4tK}>U+gEA)t8f;T-Nu6rQ=FIZuDP^}n>3xuN0?(ezA=um50XtnnbZNz% z)qi`07~vukR%MNC7pN;!E;k%SIxA$YK;om*?i*bL+E^O(GtF-z?B#PKZ)bfIv{RJq zw$W_y{_UXvt8{nr!q)Axxt+_pLz(_wakXb!@tM%h%H}wALX`t#%NF&D9sv08U2ak2 zQG;R2^OHFRJu%-7u+=m=m7Hzk98w{hs!kT23bor)K8k*G|ywl4%qW{<(3nJ-bJQu&ab{E6UPUfRxvPj*+-zcRg($^=T zbQ@Wp3B+c%WA{#qo;|E8Y+<#`OF4N)9X``|rK%`Z(MtoKniCDpPr)D1^U3otL@%8M z5n4pc{RydWg-faEY%M4Y>V_=8kd4&Kv>0mGU^9IXCSIE7aL7U;374BjOye&u6DQGz_lAjQMb# zC#k#Ueso~mc9S{ZKx~}{GOE0G(oJ)+jwha}dMz0;d!1?sqNA^{j0D({0U5&E!0iZS z4()*eO{7p_d^hZB?h)HVNq_ma`*Xy-V^QvW>fZlbEc}G{^@h0D;KxSVJdgt`#GNw9 zz6t(p>I_EppsT|+3PFDrd-wM9)%!EwrqWjh#1Qj|dr(`o@v`xjDKh4I}%JU*99S43&P=03rhbG4x4 z>lv^GceU7N)ZMRH%2z2dq%3FM#TEQUpmo8jyX_p_nmA?9!FV0t&1xso!;!ErHEO}C zmPL1#+U7+zSTym}D(NFDJc!HW(op6wo%C{u1TJ8J<~6a=Y&ILbFR6ZOaj71n84|$c zus-9GXHHcrvMy$d1DL!O{4$k%%2j99`XAK5nz}2*1;v`peSTUM2?e1gy=;ZRc$>DX z*-}oynPd6s{(!O?*m8wGma#odFRuAZh*)a7?q;3AO-t`N@Zo3@<_J9J7K3*io&juA zeySpoKA{JlIzMf24<5?bx#EMZEYKYOZq~g@DWos*VnkCKiD=S5AB#_^7u~nPKc&kI7?M89HIV71cq$RKivI0i^)XqnI{}zE3T;YDz6}| z`)YlS`3i|3RedpG^x3%|W*hC_YGS&Z>%IE2ti!fF6goK${oXjrbu{C*Y@KBWi1!eKImD+*TZOgr%iq)wk$5K;$<1$@f9U3=M+ zD=QtT63mfnB2tBG2iQ#VL6a7@1{3RgPfOQr`Tb^az(wAZ{4B7)8)z>@#M$B$!53-j zln@~VzQWcsO-tQX0P202WDe)hQgmGAJ% z>rmF0lW{0FkqEk3%qJZQPU;s(1~DaDgzhEUsvf`}=UR%*x!(F;Ttpx$1>bKL75Q8(il$ z^4F!+P^zQj9k^2pDcNbsGt-*;v;E~uxu7Kotm&YYJeYfp{cSu~q$a-@ zwEzYAsjuEMc_OWB!mpWY?R-ZM_TU{*d?<1hYco|t^24Rism zJp>77zn0|94witEy$79+C*M#09#vlDGU$jSBBdO@*Rg4%BM=Kf$Gny+iOD3&lV0RC zyb^P2zX=`*mwK8JD2c)H0c$m^3erH-W2F~ ztH8b}aSpr0bw~S-Ek&x$kdf0nx}|wL4YH!wqp2?{{lyd$S_3pWLG+frQFny(3vPLw zrSJC;(;_h=D@s?m=lK#^7MC`I4ot++914QF`s^q7#>cbP0Z$ZJS}<2=`mIm!c)#lU zp}=K}M&tyfM~HRjFH-|=jZhUuw8}>3t!DZ6*o}@a%m1yp9`oX?hgaP#Kr#ARD9vJe z=QpJ@3yP2`7zF0VyRHg4{uS{nq_kKuARA>CV_xZx-OiIyTWn$#50*`0BQ;!6 z4#G-9Ao^37J9x6qHCV^Pc7OO!-h*1VHG8N%hI}`EUv#9Rv1V|zHP;2toB1~HF2%bl22f<7si(xP-oTUV=0iF zp`gL=nB`RPKr-V8C=XPTGys=fvkY2&lkw$?u?&)I_Ak&@Mt>;bvSN-;d!5gf@n#Pno|Cy zh!54lS|3X!(sQ&s6{=vcWDT7o@PS9Z+szCpr;7^F;!cvV{doKr)E(** zs@r!F)33XuR&aQ$uwWw2_FU=Fv%^0VXH&Ole(YYU@BPMI1Cm2eVFF*i%~+*1QHxkV z{_P@CEE|o48}apgB&$k(-pnCh7qwhuWEwYEkPMU6gc0K6X$QcGbl)%xDHSsPnY;IK za>@aFOz9ElXfu95EB#JRYz!EcbUN|Y7B}v%TR@=Gba57XH5d?uGVimNW2-(@GZCZDHqnTH;B#q@`hRCCSkj!OBSY@dBIph`<*!x*WJM@RjfD=Js?5u4C@D{=X`;VJjkz5d%;@ZLt|&j< zna%=((~r=-yN7T&CLmHHmCv9LAQH1@Yvqpo`B+NWy?sbbh(+M+nwYa*MiZ-xJ_wmE z~O`fjOh5~pW=j!GJf4C`y9J(=^kkO0+OdU4+G)-`oGYn zJ#&RF%BEzIJOc$jKGgF3>+SLggM0U^IT5zrzmmMdT$oXt`>MYIDV=yIb~?TPQOKCC ztCk!7f=THJIl(AY(*XO+NvgG$1+O$Lp!3>;ISVvkbY1Z=_V@T{9#Ge?NDF}j4QpWO zRRzH1CarC1Y1qg~@pV9gdDC#ApLYJMHGJTL;>L1noChT#_oWJWz}_a?Lz2d zzp`Vig>3Je1d*`+V;}dc-0X_1B{wr@W8z*FFT^ahlRzLs5MeDAf0T__WaUyQ=F(O> zmQMqRUvXRAA=p9I4#IuPn$ly7&6YjIOOwnOdXtyvxpH5#Vg;@7+>MnHmXXM@9)xdE zV2H$G=wfTws_RR7ck<`8{2)1uTTvG*=#i)5s%Ab4w)R3Btw!Gmb7OrBz z5bw0f4TUsWh&AF&0Dci2^7&ft-z_6}a*jGWd1l~aSOL1WGJPgXPZCQyI^dpF}(%wlXTtl=70AX&3d7id7fP!6S; zP~YPUyy0!<52=ap44jdU-KN-!p61O*geRMFAbjbQB@;&DJj}#+a(g;GOdKN=hzqLN zT~FL)Cr}UBCcK?3=ugMv1SKCS1vS`C(m*kAVD%u0Kb~0~68W!LhStAz4;h-K3V1H? zU5;pSqfOYdbuA+|hJnmDB}pd|&JCi-vf@QoEz2-v3D;vKg-bW+M|@M)iCOZ!Xv#(6 zFMEMxBqfuZLXE-uIk)z@(6SxDm}949i1dTjxlO@YLKiXEn>wb+wK>^pvpB(pZf;LZ zI7CX7K2mO)u+vguLCl^q&)t6qM93kP6Po&=bA>P0baCppMDTyQ`F3(b-QONczwg)| z60_{SGM~3){s|x+kG$JzB9{N;?RfM;ECb6`0e;QBzs1~ZIzbKYMZXRKv9)tAGyMR` zo@w09_;JsokQ{kgjMJ6CdBH$o6BztH+BLh^NbcF1U!9mXv+JkK6cYP&6fJ1#Ts|*N zS8t_2h!PyeSQ`mA-*Q5mS;WDT+X%R0v8ZdTCsgqTYR-XFYg_A+snZb@0nUpZb_VD- zOom@$r-or*D2%kw8ZSbIRh*J^uUO8Axdp?IVbkW$!L#ozUPA1JlsB|rW^eWT2d6`Y z6HJqZ+=J29(}-cLc-(a> z69T_nVnDW=fiSlYj-avoQ>ZiL>t%D!*Z2>?xG_XzErRoE_F75UaB$-O z-5CD56CvynhdbNmxiaqbH8@&yc=98{R@?&qN#}Q%M>SeSmfaM_QU(kCc}``|ttP4h zVmCVQ*-Jyz@iAl=@EatbpC+yf*tMFw*CrRcfXrUK>-Du{;uA7TyZ?;6DI$U4GXVvY zAJZ?P&b_wXmQXzU3|DDqW@^aH`D}zE`^6!J#gQ;>j<%j~D;ou=b+AsdnQ;p>WkZ=$ zi~*}AzS2luu3*%XKsZvAE50vV6%TVAjxjB}2BBAs7y?FaFItS^@mHPDra&J-kS?Cj z8kyvVKf8C=d~g1}Lq8e~o(a2nE6q|EMaRi&^4KYVA#ZmQD8eb;P=GF=t$v`rPO@l` zHLA#1(N-I8d=Fq1=*X36qi3?nND!4E!F*52${qI*R_R${wW40t4$%jj+weJeOE0Q6 z&ts^jXYWgS`X`$rz%O833sHo00A(+&CO-U$Rm-P?cfcD=`&3p=MzOGn|=3?!o+iTj`l+9pvr#< zQ)$0gfE3(JyApkZ;*<5Vl6KcGCQy4-eH{o#dk_5ePv@d3BKrEp=E?>b zhtX}OPINOb&MZl)2bQC_d%H*UN1gNxlIi^D3m zs%m4}xEW)BLF37#rsky2Uu*mF(D{pmwn@>!~R@D;u}okE7X^D z?Hd0qVNK#5ZxTl&abj_~0uH5atprYu4>>yr-c{=53pdM197B&CB9j53vY?JaL~&xJ zW?@U?L-R;7x>nUQU-maYN2ef)#tNUyUoaa&ss1G}$v+lA^M_7KpWZrQ<@S{|&q=DU zPLu4CZ?t&Dd|L4BN*m~HAFhkE4+=&^_S&y#61WLv3~4rbcWc_z9D!ptio8(87v(GE zX(_~gNNrKvAA7iyrM=NuSgi{&;(~MnVl9J3Z%Wmv)$v$VAxFqXLSCUL->!3;2WI z&RZ50ctiO|`0)w;z6(tUr;x$t^r7{I^sa3c6O(i^U7FVqv=4M-gZ#=n(y47mYkQ9; zx(uN)<)At*g7c(OO*5DBV6~kN;&e1%T84xkCJ!1$n}eupS9V{KK|z7Q;6nweVvQK0u)F&?E_gEu%73e?mj=gTO(6W}^7E>2LkIW9y-~thd5wXz0jZlE5 zBI1(^AHuPhIg6bTPyD@L^t|kc@7xc6v}KO!8ilOgL#H~7{fDsWKp5Aga2sD~$l997jpMxh(|t_hMQ4s2RR%B}jQGnbQBzz_ zzdShHXR|k{T2;tQ631}Ue+9arJ53D@sL)NP+*uPvDaaaw%szIg`eZ%+myER+uRCWy z4v9KT$)PR~Dgno>&1R|UN-M!9 z_aPdKGcFCqIIv@6U*WZ>?-`P`EKr|M$DCI#t%X)e)1QwQC^;$t*;KQXk_Q%;*u5`Y zIK5vo=H|0A+s!@R+fcbXDlv19$)}5dPzKUE^r(EBwq>St;cC-8&URa=6y9}3+Sal= zOC54_uiC&PwP=Jj&KF_9Ryy@r!-E*b< z!>@@HQO00$qYY(wX;?`nJ7TxS>GA>(f@@;+ca;gE7!yaFKFAh*oehDJev-sg&} z$vvr96;sY$i)~5xg8_;c2+B;x9nfFnZe05N-+h;mOGB2*MyItd!AEB9Q){SgcfAF5 z(SLA0c3Oh@YdEjncb^hAq$@KH8l~{9_@gA*(jO-@GASd0nlnn#sHC{6mU-$%4#^@; z?(cJj!-eg66Q9MgF;DLBK=Hrmy|au1I9FJqWA~Jf2~g&Uebu;hLhG=@cYG^7apE~B zoOD7`*JPD1fHi%)Fw)5?EAAYh2%SG?dwmRcK>jBx3F$)XkxZ5ub&OKI`84dpY>i38 z!Q{SBJawkb$_SM~U#&0x@N_~w+YXUH2(eTgb0m6M@ZLJDR+Ho&^#1~>*pj?Q1yUB6 zu5ECD=g}3t(k1eKKY(I*leso?3}r}b?6D_q&p`9Fc*vwSbbLp`100(I;mh{}pVcL= zWyLq5U>vh8Ain>DB%kKW@~+3oA)U(t1BGUX?pwjXC-(W&RPkS8u>hzxW z=&wMUw&{5w6lEH|c`QsXT_C(K5@eEPMXCNSb~@u?D`9(<%Tu|jI9ccO=BN({Re>!p zThUEr@B9Zu%Q-aDsWP8Rd8!>+8x-YM4~WSGj#5R2$lA5*?yj}#2KB$~9hy~?A;(bf zYV{qxQL+Awm$wXxo+5Ck`Js(yVw+k%5eVS%=?mYf97C&xB?KtdaFUHnl^W%`P zBf930DzCmvjJpz&$QihB?%T#nYM*1Z?GroQ`KnnqlIIDRBo)VgFkR?(Jk4^>G}Y;? z!c9d%*Sr-S6y-Fm&vR6tOKQYOfeCJ1ze5?z$#TTV6Z?uTvQOk@E-P+*VA8`XK_jly z@v@QYe*o-5cUQKwAOQyEA*?VX-?D|rvtng#JjK8I$bKqy5 zRkSZ#nv(ryd=cxJGr;}8g1c9#k-P3`y{YPl4mmk+QcKNvFO(2k$&DM!iT9~ZXP)T9 zPmTfE2Kl%_&Pw#+-Xa~Nsmiy?!gE>iL946mJekT^i;Nari9NEp3UG+6rA5 zm?JN&R?M)23)B<=@rN3Hf_b;Coidn4#uBqRW>;p{BA59+Cn337`M|ErQNKqaCD0@APSfDe_ zqvw$M@_#TSS_L;wavVT`F$i9km%~OX)~GcLk9}Ehsx?u~aUG|R}(FnD}ugiq!@8JdGR6PPPn?v1fJY}MnC>?rIbbz`oEAg zc;vNj{RKnhWRIxo7UW;*2-mG&w-HO~kuO?py6sSq7Y-C}EgpfM^LWzVXn(sK%6g6y zqRw1J-54~AxT};PXoj5%RulLrb)Iz<6a_^vWn}oO`O@i0Pfu$+eK)1=v4+-5ZORW4 z=J?q@D4ec&-USLMVrhx^p<94L<_;!4st+6fR7N>@3?8IMC^XzX54lXpWTvMP*6tc* z16Bdp~=PItvC6SHI43l6gpgv9d$tRT?`fytR8?!f~|+3NJ^tH=&f)T*EW#S!bA_)(- zRp5?!4XWvr2{FD_TD%t zB12cuOa5Tmu&x=s>vxeTbM?O{W{RdK9v;%`a$vI~Xs2*^1diJ1I80E-Zya>yaT1RX zk~&#(Ypu5*X>W_cf2+H(GXSkp`t?OPMv_z_R0dLF$HN}yiprM;05;mfU?VHC9=F&T zX@3#65ld;#<~L`kA`Bk@eOa7OgEi!jShw61{&kEe@W(U(oTf^H?;7R6Q-5(|K5s& z8L}}Ix5=&83<4s&uEMt>*xDH6%$D38&%Bq0@04Xovw2H&c81{`eVAJNKa8D2m}Wt{ zWz)7%sY=_n?MmC$m$q%&wq0r4wr#ts?|p7}5B@=)Sq#qT#317AckNYRmn%MHrmV^5 ziCIQZS|*JbKR~hc?skw%LG_1Gm&whu;GE>Sgq6$uq*RA_>>xIGx)(?1F}-&Yp!His zBt)aEj$i6zs;Y{M^Dhkj3Yzl8d0@kDRO6OKN_@2)&H3Vi%(wszHYr8lOJzl2%mXvf`4v_Q*lSg4m!2^_pdj z<2Ievg;V|aNtBEt*JbCr4Uwb+^q#w!&73zvaJ(cn4HLDO z*;clvTf7Ax$De%|EAGTe(^Rdy5w`0R6*oq84c3I+P19d<3oM6Bu4Z5@PZ3ImBh2cm z$c9;Ijkb8_xwoxVIrUkiAda8SKA(yCOe%s54X>n@D?$7@t5fP}lObyj9oCFDn^t4d z8O@uTNWqhI9|dGA&ll_Mi3Lr=g(t0kqI=1m`WTGU62Q;fEo@1|Ug7ADwr*RPPtKV& zb^Vx}SN*BYx0?q}2-IDvsZW(WIU7yZ z!oibE=kzNl{lb|HRh+j({wWSMy+@C!+OMD;apcYtA_j`JUM=I;!h_E$4~{74i7CRC zq7wtVThw5D3rf~-*Aj>b`22^2Z?Gw1cHjE&7_X1BGpk~#GihPI;@Dwh=*i(hZR~!r zr7ds)3uGb~YouMsW{1|I8Kj1`^bjWGXJ0}pz17JT#}_0+G8Z61vZPdIyaBiZ^CQ;} zKV@L|Y)}+wZQ0LoQ_c2C$0$%P$6U#WfedDcJD60^o`Ih z9si1X!DCQL(6QKmq&Ljv(hbdL04%LpsDGIZkqf?X%_ZaXI(Msn3ItauDp|U#5)cLW zW+zTg3_>Xp7D(HWMU|C14sZjF3 zBvcqV=Ryru%FK5%kmuCjOOrh1h@{pp@OB@{8M~$6ecn0)Jx2ch+~rV<#fyVPcFC-h;` zHdryLG{KD(qy` zxmO{rJwJ7c=ubX4apms+YK-)pOw%%7&{Bh&)W&z%6(Rn}phvPK6BefBNEq{`&-+`BP9eOT3e@W z*iEbGnOQe_In&5vn-AP7OZojcb5bIBaV$sk_1X(H8t|u14@|h*0Z+x|+FvhBX98Y! zV$s%)Q-)x9^C$Zw7%0_r8cSa(fGrxsgs{7c$(}RcVl58>1(n_*)cP$2IwoL(M1p#k zN++F+zpmSe?*>%I6dCNPsMOavp6WZ%TQ>G5y&<$aBTQGDoqg4;aSv z5utu!MeXY_W6jg8&g@JKXT16Ed=re>6qx@ACx_%an)(Uq>tl5wqs58gh@c^fNOcHy2>%f{yGD!SIdy&BK6#)1cAoxbbnKex zSm{{l+V|FVG36EZ5rx{suYhnBz6S*lDgxqSQ1hgh7v^pq`INH93?rML2De8H+iPf~ zCeCw_z}l1@LV!*NNfRIfLZ`qYq=5sHl9JkQ08QGv_JK+(L`CT}vDWXOnwWT@pRmL9 z>)PRu`;d@NE5!9X`0m3!2XS=`?jX9M{GRa-QJ?@i0|V#i)y@Ml(cxv5#d8Kq?TBF% zz&nQ!-Nej4F}VQ&1;roeRbZE=VDANv0c!hn2J+jpMOwX?=K;TNN8<%{0g`v6z;Ypg zcmfyR@)h<1a;4};KR$E+f%9_*`GxFaJNki7xCfMmyE+7WuhrYN1^g`@#|`3hv*!`J zm3Y?28=s>OHi-w_Hd9er@SG}Fl!$llYAe6W3+KnZ=_$0UU%Ny4)pu=ityqLNIfd#M z^#0rTq#+c9kU`!Rle_0*^TqfYYLx(6H-~|J#FugxlrS&G1u6`7ap587IOoIF^;?B} z*Y}Uz$@TUA3pvjB$VD!WzJz>PWFQco!Ydy+mV537@^J|DtEUFb)~{WlyjeY$u+$HJ z20My<`M@@x8@QJ)sDA?AsUbulf397a^WOLuN?`4uR!Z2(yMXU& zbC56TQ@ffTBVR@84$f`)AOZ>+!pBtX<8p|HV4+8Si8|EYzUiZG4d2UQTO^8p@MDNB zg7aLTZAf5$-+`zs{atd~o=$qYH^_hv!S9+cA35J7*o;ieQ*-mX@6O7n*wXDU7{ch! z&3wO~6w?Cu(9eh4OmRu*YgnjVNGS=RSJ5C6V1c|iFaaeQlGB~TPhqgn6^#vqaKASY znjo;CAV0s4pMMCYbHh7sbOkOJ!dn+hhy*wL=vU6y!YwX@ClS)i!Pmq2PU=_eLvD1a zkaxcRW_qoCol}sbm?aWP&bhl1=LlL~xmbpjdeeJhgWgk1==aEu7WjyiZuKZUTNDtNOE!XPo z3fdVOR@QShld&jlAF7=7#4*0aFiGbJXm(XbUp9a^vFK zjZ7=yxwN>8D@%rwjpdp>D>Zq4zaRz~z$kHYYpYHa=bi;4SMvFdltu2C^~~x}bNuBg z_IGN2u()U4FP{#Gp%Z)6d~xKa)B0LNlZL#W{t$0yX&%CVII%!F3Kt{r(NZuvk{pWR zaV^KL&Qo8;S+yF}rT`G}+xrrZ5_awR^VOJOve5@@1O zEjxp8!Yk34+mQ$G^9<^9Rz;e+T==jY?CRkU4ms;ooNwm&y>C)S7#Pm+ghmbR{CXT{ zgsT$yS)27t(ed<`zDv}Vp&O!p0stRJzeLCOX9j&KI7#6oHQ=#!8s7dbYWcXbUWyuA z5s9VK?SVv8!kq$Vt?Q8*QaIVI-@Rj;ftOXe{5>DR{pXYhIW-QGgpf-$b29?k5!lE2 zW-(f3BjsS&z!Z*I#-shxu0E4Y3L_IaC(o?mcTie?Ek#*)t=ElgeF`BXJ697^+*~KU zxo^W(Mo|Cyl{fU>eXwKVv z1?mQMjSy6>&~@vMPI14JRgkD-%md!>I-l2hdoc*hMlX5$EX&edqR=Jt+;OaggDg7U zxq3@Z>ltpAeW2mv?b<0(MPb$!CQanR+mtts*F(v29fm9y{HPp=z#V5NvP_H%iXHy( zUPM(_YG?3|n%i6&{R$A|7V$qWKYUSH$Aihnv@HwLneHer|FUt?B7kx6t)4PvjY`2H zx%HX4JFE7pt!((;Skv&w^38aYcYh=SgcVzsGtS=Sr`!3Oz)4<}$RLMJ>SPwys`188 z%d1;lrud;JMM>`fau4h5h>;uva-G^v9k(u`3vJJr!w_$c)O;#fH8>84&uB^+ z5&McLjw0L2WwIKU!BF?$zH-fx18a|Ikvw<-W^7goS=$rcU6~8pa+hbzJp;Lnq3F|s zQtL=?#lG8F!oe#J#LRh*ZRl_vGhfuxS*@7w&u)5`!-?r?AD_d^0@l*Xot+&wt|7*Z zOfRx>p3q52RQ+HOvT)zyT>0*pkqv7=hsv2kxb7Qf853lqaSOGdS%8;lurLzhgdpGef^A|ffgwe*Q zFfN|P;*mH4d_;@C;U8=cV4pJY7I4@kF6f-82kB$HYN`S)^cdAg)`EP0NNv$79WcDe zA9!558C9%hDGa-Zkv=D7An)q4TqrpFKgtKP$ngG-x4u{nh&sGckl&ma&7feqMy^{@ zNwQ2%+YCVJekY7b5nnCksb^N(h*eAmHpu=p1Vd(o8Vt8OHC^gEe;12pK^>JLLb`mS zXjd_M^}3|BwZAX+{uKgxKKvZDYnt-tO z%K$Q6RD(4f&xiUCu=)KOOv@X+_Lk}j*)|A=Wlw^95kc8AMf!ceAZB>ya;9UudWd`v zw>Ji7%_c|1SKAa8^`yAuMU@vT?+p)U&t`~m9-1`mHNoD6=9`=ky8b_-#%3V2`(zs- zn}&|BJ2k=D^ickNb($6|Etto`+=B(Z)Fbn{N`{N%;h9hp;f1kNx4cnVpT!mi0 zob38Hj-US=GTa+SajNt=-@MDqZu7tPN;mxjQ4N^5Xwc8d^jNOfaS@?#Qx9jfPHGjt zhw3fSYHVF-%uDw^YE*tFI?HQRFGOMtZ3%Hj;peL)*K+rPghD&^RJw-|xX}h`gb^vxgQcWwy8>xhZ@0YwRio^>Kz zYXk!i2lZJ4?p$e2cICtCt&Wy3SoOk0ONeM)01deV3kianh0K0J9YnAHY|B3@rApfzA!{ns#Ocj@~3mvaI;L!1_$@Ol9 zg6ccB>G6xHu1g?wOf(R0=;-PZx;wQdCCDR>9{UJ$>H$+#VlojuesgOtF(C(!R8Qmr zU>xXcbQfa_PxGtxJwq~pOHp{ykNC!8h9%{M=gtQ(O?6#8DzVa_GIw|TATj6JGM@3u zOYtT0J_9D0)ZDMQP6pR4ZgDOV${f>HP`z^eFTQAKLqRLvREB<}kU&IjIi%=P|yQ zRdck(0qS8NQ)Q|76xBXH0wc~RwsDDJW@S&yIgo)k;FE6RpbHJ$)bV}AqMkrDUu>JD z3>9&O;i9skW1p3024Fo;rY9{iLrt`C2GX+%SU0P?`w2^XpiITh;$cbh_Z-(mkPJU{ zU)y%U`vr%Y@!n2>Gh79Fl5D^jSd<@h<`lj!w zo>oTJTJr_8BEw;0v`bFTeR>|Eaj$XhhEtXrFjcVfW&uHMoZt7a86vHgj%=1aO)T1Ch8c1?D5FIFAy^F)BC-gkE2ti#*)~;wdSA9>FoNT3d|mRLR{mQ;_gWol~K4!BnkyDj6# zLQF~FEk9{GYRw0k>Y|e3(D8Ogbhm(G;xHW23Xzc42i5{wj^Jx|YLpo8l57a6H{}-< zm&7Xj7ZYsWKWu2cBJwI+ut)^S#lGbEysi(e*!q*!MLuvb=Jz2tQz_zrmfXe$5MS%$<2ws@y&%_bT zZO5);JqE8V4f5*-?ltFMHUo5I1ezzM6v%@FZSV#3B2p-TSxQVC_G0!N1`W5q%SIoR zmMmo`358SCf4LH;W(h98PmLu0lxs);m;6VV$M!**c@P|J1fu`U+n=Q_)SKULJX#V- zbu>!DtNB2xShyzPZwU}&+-%%*K9coa6@^V{?Yii^@JnzxJ6qW2*3M)ycauJ*k7-uB z!Cp5sJ&lZ=One~a1g61}x^}|^Z$M)PHTYp~Ng2>+`~2D%d42>YU2Il_XO5!XTX2Td zEe3=ZPctCUr(M1tC`_!yv$(M&`0=|n62G%^POg?hm~qHO9KG(Apw5f71NX%*o<~P7 z@iihA3SE18Y{WP@%xn*yv|5%cqK9bZ)^Pz7ZY2+R#FZmEU)Alk;mIVOeupA$p}8Fn zFZd0`6lEU5X;~BMqNILGegdx9M`XCIDrYRk>S|p6KXZpvlyVepZV$>75bT95FOi5j z-O|?hOmENtR3Hl~zRT~4!m+;AHGw`XyKSO^uZ9t5hbQ*vj}?LTH4XSBWXR-~$zy`f z)9v4eenqlqTD%Mih!B$iK2O-q1r&nHcKEmdJ*oTz%J;h(j<(k@%Zv%-M_is4= z)G=3(%pvA*HEA3>+l5lK-TR4+YY&7)-thx#j>AWwV@1l?i>tJv$%fH|=?Q5Uk?qK> zJ06>UCUfs3hj^z96S!S#XUObWWANWK&WE5O7F4=tbwNKcYs&-2vcZX&m-pMvmnw8K zxxTA1$#5M!4(4#R>!TO=036w0QAO8W~ac`Rhr!$WdL)|E%T8v5^QkR@5s z8VTqFQ6eYfl-P1>g7>uGI+R#z7?JnC29KYUL88Id$)T~oI;?Xi`VmqWboNNT5uhmY z!nIAyl>yOjXUgin+LDFhX|pBk-()kMy-Eyn zV%JTH5QsF{dw#=h#AxYpN1-n&SrJ(H2?`bT1aFsH#IeaYcp)u|B;^3C($q*AeCSP|UI1zdj1K|5j~L&wNyf z{e;m-hW{;a=h>q;|CHj}pzeRO40aaA(Q4S{aK52G?TljVO;tRI^&fbsC zX$Ee1l%Py1G$ks0$)0m7INR|KHCCbRp`Gi`>)x$&uEa6(#{dz>IeMb3Zr!U%*cI7T z+6~3BCz(=F%!%H&1@l=wSqfXdg`S!)8BzmRxg7n2&KzM zu((K%@VgrgRUIu)N}0TPU@vi3*El|LY;y@nu7&06iCS!rS=kpEo~vh|`U3fmIhNYU zl%4zM*VPLdApaccPd|pe`mv6M@bv3#)uN!0W&f3?#t5N@s6(Gc7#fe>r6woLT%Lxf zN4XQRCsi1WjRJcdAoP*Ka)jIXryY8!pkEam;P`(>gg($i8CS&hT`FS@aQ z(8ypUxTBL~B;L=_xWg0p%UbSq5A!!6M#?t)d8L3=ERQeG{G8ehTB>$F22 zfsFjJKW*^*9_Z!-qWBHDYQg@QJEa-+J{)Vv&wZN6q_EqOx^RnO#zJ_JSIYZ-1WlHYZEz?UfQ8nEhSz@u^tr2v2f10FLXN$+p!)vz=;`c+?>Q|_f zO>!kkS6-Uc`rHg`+g?fRu zeDZT6hUuw-$W}1A6OamwDC5<|yZBo$K}I{c#7{;@M5gji*nse}`vqX( ze=@%XnooMG9kp8Hha=Psywm3;C_@sYnqRTLn}SiD9xu{xP83HS4EC^+Ax3&ovH`N{ z21OOWIZz?#T&wTjfuGada4T7w1^SxVC&#G|<)ns?>zdcP-!eXNLX^sF;E~cSH6nIB z70aifW@wLuALqGHt1lw1%f#EC;TXY1tgypVjKm@M3}zPBJpVXo;N4=FD8eH8P;9>6 zT=>1LJYJ5uux>P26V?)gW ziQLdD+o-OC5^M9e0y|^jiPzEjIV$8D8@3-U zCqLjJZ)M_l87y09IhEgbGGx?e8{ZnC1Bw(Otv~^u>&z82bt4xkb_`fmzTTU^NewUp zO5l>wm$udI5$wQhT5V*FM0K@pT7q-%VcuSj2R5DPn&Q%F(xipDvB&YV3So1(!oB(# zGS@b>PVfH^`ye~=!4r44Iey{9WM*|qAzfuwIx^{ZI(_~z5Zv!taqYyDy;k}-`9#0L zz;N^p@Xtgc{0<%)W`9LmD$N3iMmd|YaN}7!40cYSN_JWfqN6^u0ud9-QBFL%M{CVQ zsP(;egQzd~kbAOL)mi^AZGpBRh48lM8KQMDC?SbcT2~TsNs6Dwv=a#z%iHB$ikCf$ z4#Ae9fwLkw^i?A6QQMiB9jRnVm8`1!H!cbB9kPLA?J=xY8rFz@2Cx}2;+LkaJ{=@J zk+`jTc=eLB-w8Z*@D{!f_H1(vI?^XfC4Ge-m#`Q%Qx%ndp-0g}kp0!be_>2kM*4x< zEwinr>ODtUbMzAM$=iSbmg=qzVW4*Pf!MdEma0$|3la%GlZ6gB^4VaWD44}kR$eS? zzaqi`+??dn1Rgah^z(TPj4()}HX(7*$YO>OGud(r?O$cLbb)+)>L0@1JUIj9kt|mo zc-n&K;)~@8+3^IAqQ7Wb4A}|jiPYsy8~a2iIe$+mY;Ol{-e`hX_~IPFhX~ibE(k%m zAvMsV!!$ZFR~g}UsJHer=sR00B4IY2KRd0zX%^G-;iIJysV7rcGP%2L)i2pW;z~uY zN~)2%NTU*7iJ3ZGo^0L{!5pVkEVhTX8`;_yoGac<^I&QA+ak@$^Gbc)5>aE4d+XOn zjy&p2vpHlLvzhyVyteCsqs)2Br#uPNIAp=PyOqn`4N~H*B2D!hT*Y%DYnPZ7Ye-x8 z(cal*y@Fzk=RTzTYQoIWwC&S4&g9LbwNiKEk{QZI60&=-(Qsq6aD+o>gDcD0Z)@|PHm-WnP zB8&f(=~7Y^mxr}#(R_W}VL^oE6QIOBe2pAAsgU@J?BG@>!aZCugLf@-T)}cUm2EVFOS2A#` z2q4AsD&gW1TkLE@O=WWMk*gGLc&0R3t2;TD#An_d;}mI6g;7-VPOL*DV7WNqZ!0^W zO^o!~sGe| zv5~wXH8*(UC{@NNwK^aT z&;JH;53Am)Yq=jFxv~un)>SQo{`ipy;eAljJ9%VF5{aUz)_8a3d}=&5?+`MRtT(T+ zc8`?E_SJ0*MM+3Uj+T=Dih3i|Nv)dd6*Uq+7+<&m(_Btv48VKJd2YDXdmN?j1V28s zNCTvxL|V&usZW&6^?WbECm3iF$&B}%t?whF$Vh><#ORr>w+?kZNpx6Gg_YdyU?QK5bVi%F7+%x zg{nuc%}XfxR&MASwPN~xCgZMhwlBpRXgEQAvk2u2~>54`;>^CRS&TRZ1SBZZKC!227>Hl5pyOBbRvI$)i+{q0_-X?7S z(qC--u$+LkmnU zV)c&0==*gG|v10G->7pR+hQJ^nO(qJuC1e&lEV^_I?VVhFt5?HO9y znAsUw!oK^x>XBEZWq=4^lmId3HB$=w5mZ!`(ghKqCHjFUG_bTfH#dh@aAIqKzyUS( zA1-N;D`5d*<`(yR;zs~7;?_dl)vM-Y^wEdr28IKcdoCI7jb%}0H&XuS(S8K-R2Ik0 zOI#RX2Ra2~aAj!%_nrhYh6Gy2(c;eh6x|)LHGN?x@)Ylkg~~+SflMpNMjahnMK(tS z@%p2JhWZ039~Vq?TDvaSi^$$PeMvk&IKBE-oAUka-RtEh7$TrW4m7$5|ENYwtn3Fp zJGQ+(`&IZ1nbt*oYlkx}C!qD<%ajMnk&%JRm7$)=#rf|o{U6qB-{*g|zFWBK8(N(| z*)}h(i@pv(0a-HDQ&@W%>im{Cfqa&kpf-Ey-|OgZC!JF_Sgvc`)(MB4`^aDPp2?F~mKM?$!nE~s+xCrD_F4}{sN(v8 zX!|o4k(E8>i}xLXj9l*s>c&)O4*b-i9Q?movTj$v@l?p!wmMzz+E3Zwqu4 z+nuiQef`bv^TTuY4Lhl(WyGD>vn&Q~Y;JX5Z}DIKzL%G$uSB;ysXv7mKRiEO4<#kG zCBwH9ur9-1f+^+L7I{>cm;Q{5S2=VTqyG9I1)58rxjyJF+1=$kt!`5Ax>SMK7i4Zb z8Cxf@S9-3+7B3+kbyekDiLyV3C~k>!PCp`ArPfCU8?gHG)Iw6+im{J8xrtk!MMGm% zEv>vIMOA9AAhH~D5TVxpdSJF#$738{}tcB*=%hyKc%>pAb)n{U(UdHmhs8(jFQ~jMGKkq&m}8 zUfIj+f#s<++JO$9-3|NK>tb}0v;yo(gU2-rGGp!c_9dGAd&)+7J3K_{Hr8B{jEf7c zt2G~G9#2%fi%020~b4>jC3 z`_UdKtl}Hdw3Zzw0{@4IpxZ3(d6^gWj#~mD#sFQ)S&BChPsv|T%{9(**k)Pd>@2L2 zYHXoqLxJyxMx*8o=uD7!nx`T3bUCK##2sD}VVIs}yD=;`Cd8Sk`G)8ALnzaD_?{qb z4Sw-0t?^Y3M!Lgw-_x-_-B@809Pdza3~CIt(yn5kWHG-jHOF!Cd?!9XlXL3^5hTZa zl2S&zl0oyP;3ISLP6!vEc!!k#O)hoDB!hRu7fs^INKSD|OY;8CFuEL0D$57wov5b< z!kkS6AgHQ6x;NOK6CWW2x~xS$m)+nnQ(yPWJ~cUcK@7}=cFh02aR za1d!oqmnq!KAZ0Fn&Jfe<+Os=Ha_}=3W1h+=Co-U0<~ha!AVxfW9Iq#*B!FtqXgX> zRqf`9xCO8fB@NPN=Tw;_Nz1ZTXB>2 z@)2C88u>uy0pyp+At$4k5SP+?{N6!G&{D*A^={#2Kv(afZ9}u?-gqJa&PX8bTeq%V zmuHQGg|5Bf=H$TKsWzi| zc!3zRaATAZ4D3GnW2NVW!xBJJMZ8%bdD5Bb{Y4tvxJxf7WQ>7{lngm0X=kTasbd#Q z(;+J=hkFvpOiJ%L*@SyZVhz!k>af|o3(*GEUO+cp)iR`j#Eg|CxEtaCsX|v*3u1Jq z>-I-m0g%A(8how9kBgy5)B>=KmJXi@R2Ti^ZSi%bu(EBpb^leU`l`f5t*6o%&;JYE zvjyof`l`bTA5dTnqW8RVDNx$;eNdQw#&z~*_g0&<{S#{cUdwJmzXm}+ofqsY_*+Sc z_j~k8mGC7Mx`a66EqV#0Git-owoWpWuIl0awJH< zAi6b|W_qpyq5&-t_W2IG4I=uBtP^3yc_g#x#}iwo^^~_b-u%aNsiBAEe3LH2KrQ_cVNz(z;&-a$4ugLL+Q!b+50DLuQV%&xNcmEs# zze}C`jyZSL$9#G~S}f^E943o)Z*rqf>UOv(yGoYi;iWWIze87b{;s;|+L0 zo8=4NtffBUmzDBM6AQt8GHxvoxyh-3_r+xtgmdq34d>x?pR!a%i;rjYAbD0BFEQb7 zO;^w<(tBqAO)okU2Zc_FKTGyDZkoU?#m<)4^BnrzF1v)}g%XWY)ZB>BHz=CqWaSZxxbz)9 z57nE}mCStDU{LQHA+;<_hT_|a23J85*@_u!eV$Wzk zf>@(Q4J6*7V%z;sSE2D>g!A){Qa8%xh^8DW`Ya#lPZe6|6%F)~<*w$grEyG$m=CW=Y@1lHvp(%R14aMFZ3}iB}YR^op zmmWc)Q;p$l8OywndEPVN>KP6<42Fk2{GGmM3i7ZB8!F3>f-gE8zI5UAQHA7WK4tB0 zZtuAJmAhiMPzE12Z@%@ugh{N@`OFpBQ~1i`=g<^!Xg`JFH&Iw%*s=J<(UwJYu$+96 zenXzcQ#5??TUKt{sMIi;(zrXzp4z32aw4r}aj&&GN8aS8c)sKEbSQ_hbW!~CNv^a; zxxh;9b7UG@YjB)RYsfNwT}HJGo=C*>xY)e=P+df8e_2KT$?Wy=)2t@`&jNnPH;WSF zaunx}Kd#nR4vAcXiaTZo?60qF`06c^;j}4H+Ab8;_1Ls_1P@_W{^1v!UI3LO>&h8 zwIWsfu4zvLApg9D2OPVh=+r&gsKqplsY`Nny(PcVJmdTpgs@jEfjEP}1Yz|gc&glF ze(i{GK^R1S9-BK=Hiwp>rws!R*YehGTBn%>UDUD;uO4D_{Dkyk<%=OQ5wIfDjxaSp9m=S+>`}Rjd%H~A`z!_B6xqbc9p1CI?cK`ivvgY zt7bsu@B%@KIfMIyK^{#?`?}4Qy0n|2FQ{>6+($nULIqtMHDRmH&kwtH_!@Vphv~{0XjAg;4B~Om$Ar9m%F0& z(KzkO2$7(s`{SadGC5v59T+~WF%%to9i_2)? zLQ$Tp_gV``mf>B0FkQ65W#9(t2`Rr` z>76Bzk7Ru-Jl|~jC*9iAQ_hdZVrd*a)M*5}n=gOoC=LGMt%QG$`aE)F{k0kD-Q>jtpPi>*3| zTUj0<^#D9SDe^~5q=n3<<}rT;FUvVYiaoKCuC$TVA6{&K{IPb>dylukWN318J7|@& zDmpAxnNQvj^MdkC(tShEVk`Bq0?A^d(I!y4Qlr}&R)ISF8!wjc6N<7>PzWug=mToK#Y}+$`TIOS zP#<9o47#+gh5dL1Ac`Dc@aLq#it?H}i#?~g;iG8adZ%J+?OTEE>6o~2jC@Hiyp0GvkLVpR$+Uzb9%+Sq02V_fY??MKV?wZJv(FUh> zbYokOD!w8S~|U1D-Dn^XzXNa?a3&%izXRNrZ$k&Wdof0-UyB5_)SkydT!Ukf!-VM(dO1=#LDrQ4NW;gv+1PCuSR8DV=l);1X^2jrXJt1KB3 zS=Dq%fKf-L9@Y63HQU~E^JH$8u)1zpK2wYKq=2N(RPDOlqjj9Siot>wjsd<%dxmB* zvy|(08jVEu%N%HeJx+uNKK5&{NL^!hUW!(e_}%50Qjq6ui*+z1k=sP`RFgk(cGEaz zR-w_n+9~@Q;PQ*Pn!Qf>tqqQk&G%_9r{izg{Oqq7?eX7(I~{E(T`=yv(Q<|05;1R9 zCZ*g_Vzovsr9Mv4CsfZ*Yl*?@k)SyHc9|!u@X{W`d=}EfhqFtJWqrhp`o}c6G%}C~?e{XQ>)Fx|F2PuIz2IVpLq+nQ#+jLii`N`Q z3}%le0$BMBWpvy8CNLE$d5nDEl|^%%Y2g)xWrNgGI=5i`VvfP#(++Tkxu*pr#{0@@ zpv!90O@SrfZ5aDucF(8GjF}G!*%dZ~wCK|fB)4VuRPI0z`ykvNW!5;na)@TLbv9W3 z;<7=58R+oEFaO7=Y2di2Ep^l411?*PqXiIA4=4vsDr&c6@tI{+bsfhcX{0juXxsqs z^8Ks^=@b1<8%WF`lO|#E`f1Yqqq-i zh4X;77HEnAXt3H76Ml42#&qaKWY*&3&Eu^g8-*7e8R!UIu%?s>|LF6!qRr?NSSIP z>_mFL@rcjY&Nakf=iP!W6Gjwg?InN64{xUubX&ut3FRDH_$vr5Do~F}P^YibVqkuH z6gd(RLA7|?TDEZ#FZOO-weq3HOik!<98(poF@wrXW7n z9?^97a>UY*1Cti+FqVbeeRs>@roD>N_(f?tf~{VVT%uDK=8W`o{=$_FjlB%)lSlT=`Z-eb~ zWTqKNe1yJ9a6i8Ub`pmz8w7>-#JB*d$(pPx^kA_l|GJ`3X;O3Tc>3m zhIi6WA_sC3qQ_v_>43RkFTLOwr+4{PVX-HOcw^Nz95SI0!{C0PDuC6ct)5T6Q`HHh^-9*T*T75WmJJ`$1 z9owrYKJ4rfOu>{T_LoOXPx%QYf|a{0q^lCi=4OgXJ`=6wjH=ao%!XEXa=ix3F=Jet zv386|ho*Bh;+0xUIsw)l=3<|+2y zuP0z!CpY}2bi$He1_6I$KOA=cw0q3IK%gya@jtUzyu*^8H{v@)1ZTA`ZfqD^iY^Qj z5C9|u@DOy}Er_-ZBJu_%VRRtpa_0V;v=coC3#rIO}S9 zE?G_e0~XPrQS1kmwKNR|3tw+?vr&0_`A{=`K0sRx-Uaby#m^4BeIn&PB6QRvSbS5J5s(BaNW zv_%ne%#bgYDnMF*M&GH#)Q&qfy2PmLn~j16Ud)zXGAe`nk+pjss_Lu{Q>Mfl?kKoP znb@0s-D`G3kHp{YC;y^eBjQ_fjA@OYA7g}*R$e<&Un!J}!_yrLdj_K1!`Oh!pOlcf z&0)w^_PDRXShwUc>5AbOjHY54J6@4x&e9o8tTyXusW_GbfUAV8kr_~RGlEP(@nn7rM{Cw3@kFVhiQ^hu4WkWmpKJeoXIMCvf)g&Fo zo6!hDdQ>f~5y2!IT`smsZF7h-U+q?7!2qy477wDly1zeon_JZ5$S9j)*N`1o01~Ox z^U`_dN;!Kwa&;B6L&96m?S*vOj2C*~-xM?fIaOX6w8`LfEJAw8BA?JOx9@0EBZ_Mh z5oVfGIYfu|fPQ4QEVj&!0pv1-%rk&3IFXTAb}63|1lOV3-o6`>zNW@I$SD%l))&qnUg+4bD6MFC`5DwFjO9hrrs^x_q23N zhHOFG0t{!v?r2n%ALl$u@JF(`YvDUi91?iCWVz5`h`%QEKU z++Aym7kIcYkh(pA+s#hCc38zbo#uu($yGlI1)cMz~^j zXUvDM(A|3|9>L?UGc5f_JI0sSS+9wP@u)L=Gr7JJl0eUa<%Mtk1m7e6{Zm0;m{1w3 z%@X#f_1|$zXN%X!50}}(jQg4c_WwoLIRpvAgKM^J+qP}nwr%rk+qP}nwr$(CyXU`C zHM?6in=DeCP>Ji()4qo0d-E>_<%Ulee6G0Hl1kA`Zm2UI3T>K$MY{7TuaENg~Biogc=Is z6}ldIU67A`cQV~CQ;4jGDm*fh6b~|~9JuP5ai$oh%MG{m2CqY%SU(eWT28TxfBX?@ z7|G+u>~jS&Nk{JX$-Z>X-+e{ci429Suzy)vaO;Lf<_t-Kn0GYHoFuUo%gYoTP5-Kv zj)?f?(AE>c)0P}I3z}JGjjHyj?lwV;!KwsWQ~>cQrKv)0$zrq z)$^0TFZc3+mp}9Jg_Ny>G*?mbTdfObRLfP3p(ORsGPEL|MbEVDcq|=8 zlxtmG^9W(-@Siym9un%Pw_+bc2OVKJhaYAV<`Q(bHw&A9Z=U}C^tO4=FdPjG8_1AP zwTB0PM zoD(TMJ;nuDN6RQkp&1~tY9N{zpQY#65uavx&+ob^f_Aq`S&+nq4jy=LQWVDJAewTD z!h9F73S&acb%xJci{0}V_b~CP8*3q`Cy#N|1PXYV3SFetNnR!KSk7?yb<1!qeIiWN zT?wn;_tebx`ZPju;W|(soDMdwFa?MIDB{om;Z2rI2-{<<`wV#VBz2nK6 z(qKk`J*SeX0Vc5msm+S1L0X|@?OH=8OgVfp`spfU)%RQIZxvshF?pK4AxYNbXpg1E zU0uc{CZp{-eGwy+5Lz3+=UuJ*N~g%xUd$013)!7CY-IMy>2ep-D=W#o9*ddRkA&x* z4Bfz3aGO5W^BK=W+CQu{&(4R+uCgml#V)KICTARxOKsw!fO0dOaeh=HeClB;4ex%q zbOyIX;`CXQBLjpkO~DN)#`=hH1n3$#yk0K%^dUWM&l;MbEPm%q^cm3K(z=Pe2#@Wd zquia8e7tTSt?zNH*9SF>nSC`T<4ib*n81skx+b`oQ!=l*PwTzq5`ke0Iw8qx=<3oL)I z*a$y6JLn@p_S;H>>Xuf^1lPFp-0|Bn?JQG3l*!+w;S=r)54YZyI$`|beI&V@pe#ak zvdw&)P0Tu`W5wL5qVTOSE2}ufBi>wP}Xq~UnbM~*u zc<3l=emHp!<#(y{JyImW>k?r~q!xOZ3bxyd8bBJvfWXc8j+$cdh-!~txql$;psxBy z&VtfzU_We3L%c=5H%o#QIq(bh2#g&dBqSoFm4VZvhKbdq0DG2x3@*iTA_h_PCJp8; z7435bCQEX;)IV9EZRH%@)Ad(F=|&Fdq-XI(0Z5h?t-90u%Pa`Dhc+#b`h+K4-%n(+ z+#lAem9Ks|^^$N@C)OHCN`1&er+&SY=$1@xC7bp+Y}>6zB>KVGg3|lJ#uNO{8(NEH zZ?<72aYHwW1y8KHEP?4ANLV%9Sbh8y0?f#2zBYgLrODWJ@^6CyZ@@H61rWDK{?((^E&BJ_#3Ez%gU@zL2;wj4 zQ)Ni&IIM@|Xxyu=T~@V^U)ERO;&JxZhBXkDY=5qM$oRb!vs}J0bXN!otB}M#$<<+u zS>;Hy{sU5$Uw>%^+?2gHgR1_-_8pzrSrSnMTnamAH1<;w(y?{zV;;uV1#9*Vz2U7o zg9I~fdP|bqzor3s=7TB3W2sC_Q9Jbj`6Ce6Xo{4?AINp`e0YxR@@I?L7Pm@>V>PVj zAnp$lEvQn(#r)P#(Tj;|W3PYyzZ%y_!pyUjlM>&~%U*hpeaxOV9>K&hh1I#D?{JH> zbPN{+n-3%M#8Z#29S3$DwVxwV|Oh=pPqukne=WS1p$i7(S4bSo`ZkIzs`0c z!rEP_06(0JyJlgRX9Yu$Lh56KO6P|ZEKKfpz<$(Tqk`h8V_+==z`+hfA00FNc_`>C zOLqfb;yQde)~$W`(#hWNBU{^|)1}shBfpy5)^*IYvARhT@*zJRWMn?i;NX_SK)Q%} zCi4A!Vz)K4jmvZw5I#fyu!)P8(1JdUfv&-Nx-!6E(Iv+n0~P7?9B)|opX+Br^RMAs zeh#wuS`dbUv`85<-KX1kF2ct)uWATNSGGLc!ZeWnt$ejL)!F=`9uKWop@!FV|B_aG zRPi#OL*7X~ifuj#sVbS;J`r*LVSsnE4#Il+{uiK2rKk>% z;-WU;Jy2sJA>R+d{7YrP16%Z6a9@zEFTY)%2mk@MAPjPBYLHpl)|RAdAz9>#0Zedj=!KGHz0&A z=Zdi}blkJELH;U5JatMAkFg_&JRy0VyYkBCQ}s7AX%`!doC66S-PvhBc(T0W(&~{l z*c!wU?U}ZQ(Y~%Cz(FQ_1KW#uEt(p+ zXmn1EJ(rJhnq&uPl|^!GPH2xAt*5SK+~@c(NAt`+G!Gv}Lm%beZk`)SI>>0qCc5!N zdN%#wc(s}0l&(?eyA+rR97I|cHphTP>xFr2C(u831Z;w12GK=IJuV_YImR%e^D6i<022<`XmcY z9ebh5B5VO1Blm}QD3l|&5uapnCUUGhWy#k5gvEg^AUHUzJORl54jz*E$KjxBGO_}) zrMXJEWw$gHI0*(uQERlKj9!R%p1yiSyO%cJk*Vi5-Ov;rK7tx?pfMj**nC&KUx91I zXVZ$>-d&-_Ucb#SM8y`iB3N#}3%j(V49DN1U`wPET9_HJfD$*~TA2r9aTKP((KS>z zr3>lu@XI@w4eu*OcCfSsltGyoFNO3BeOM>Q;7hWx%rJ`T)UOT`@RE}xct&}2`GUVe zwV218s1LXrzk5pee#`hib^^&a(@Nn40t{T?av}yTk+)TP+ouO_PL)L3H8gEz-sRSg zeE5iwI8ZH?=g^EoH=nXUnEJ9SeS?X4GXkc_Mdw}u>YqPAB17@SBbqpJ^+M13qK;7+ zVz_4Q)BW6ZnFFBhMjKyshTLE)SFOaR{Y3CP(_vhkX8V~6ot5n-wz1mXg^g8c0)?P0 zTvVVpga|o?{fTQ|PzM`lj6Wg1bjA`iCz3S{g!-fd*Bko*)UtCFe5;^8GH4~U7dv3Hqd6bTL)GXp^ z{W6Wp4VW^lB)nGjRw6G5M4Iv(+3AW(THPKF04R;FiA}{=0JNQcJ%WN>XWO+Tf}%?J zsq3uAT+KNOa=@LM8O`fz-ve(Sn%7L^k(e9g^1LqpE-nqG%m{&s>JMot)WL4@6~0+_ z%${6|iwk+NMAeiSi;29MHH$5NGlUaLKnO!P7pOtnu4})4FK8{;aw3w*l@%~kWw1{d zSxY(51c_Yttz!dolz_Y)!VFCAr6VArGtBF`0ZNpCAwW;k>(W!C@Q(f^273Cr>hmH)Z<1 zYX=q@ukhpbYds~?^(P!lFivCl_wSeYMJZQJ)(x8uY&22W?Us0H4fFyU%Q?D3{2(ZX zmcsFrCivQX9!R8xsN`PIze49rX%Nqf*5s6@5)DXT{Koy{p2I`n`z&WG=pClRE<%CK zVEH-}EVw{uhe@~OMd6Oka+VrDEW88v+u z*)R{u3$UtmHZ)OIrKo1x?=l+Ynhk+s39egU?>YVp%W~1c_&$d~dHf5mou!CU zYZ`4YHQJKh8g^6b=3uEGsQyV6Y9yz97``!t4l>mdl>3IUM=;c2wvZ@P-mHv)=i1!s zF)q1BOU)NZY7AX~y%Ds+SEdji1km<%=1RbR@;)((Vof6I)18XG-Y*lFjmABo`={Cy zrJCG2;#$@LVG_i)%!8zp>Fu6`zE6gi4aEBONg*V?kWvXb=Xop&o7^CCR}~$`r3gIJ zM8p;h5J_gNidi2Y7I&@=uVk9(5qdFgzk*hPGL8#=ml8;qqF-W*lcG-NWq=C{)U&#Z zPWRHifAeKy`+)gMdp*4bK&hGRl)WD71=13|ut&f>$Q>0-6cl~oe+VBuGU{Ov;O1Z? zwmCNsNznWYIb*bgkCinYJ8aycZ}#v-RD*EM>+k&erVJxcZdt4;n2t?KL~KB#!tOfa)gov^pAT%Y@A z=}@ebCvi0n3^#6ux=*j)ApvVZRDccMnPD|X(XW=I)eNw$3;u!N`3-o8tQQ_f)ri@| z=C{2S*Y}yP_iR)n;)z$BBQLpt`=)&1>YQH3nWbJyt_q&+?>j+f1UB~I0VWAGrUeTv z(169AI)}s5w~A3J%x`4Ux%x~~>+2J@N-IWmI?KC1X<8|i)5?uEs6lgxdX`L2k>uZ#tpMjHATrv&hvxT9O%ui%ZKse>T)IsW`k>`O+<%i5as6FEoMF65)~X?kQ$8Yte-l zD>h#Ymg)=7i$&3{Eh12j;7L9EtKcWhgX$}7!)iqrwN*~dGne8Za?L;@vpqkthJPmJAO9jt9`E_ii$r{F`omnD-&Q(;Q~_Ys(-fH#H{%;V&U*Y?kMe*Q4-Okb zdW~WTyI~IP7}(3`uq=u7ap~AZp<7*cPL?T4FKkDR2#BG*Hx>>uTS91iwHYRbRjTVG z3L=Fe0i_v!5^3auyY&;T^t=whW8a%#&TipBV_;UX zS4>iSUjsUOYme}Sm?w#>J&Toc-6XOq^sy=atHP^l26;gaB?sAgM9HD4x(}G_x&o1X zOHqs3bz#DIjn0^363~MOQeN!bYjbpp63J1H(fL&FL0;MUcaz*`f*3`|vl^19wo4`H(DjSTTB8aiTuV2fv%Rac;aUS6j|rdaoo?*Fgn!+*tW>7RpcAgxjghDIXC0XRF|;mwbh-@BjVY}0n1jqu*~SalEW)-N?Q1RXFpYz5iTm7C(?Fx#cud)_SXw^*HCzK z{LQwCd(AiGW5h_(Rt*c>&cKV#t+mt&L5nW{c7b=E+?tt)3s=din+LE6-S_aMawM?mNf&IZP*F4wqMlyYDy{^wTI8Ui-DYD0JG@5$>y3IR*?AM|SV z@te1icMT8rgK{Jqw=v64W8|aJ2#}bPRecJiG%s%>C}Q$F6c=q>az66ks1^ncMb?uV z$gld;(EhOOCIw~jz0^#3Q0aW^<-Bz1#lR6GOmhPJhqdr2{r0}CLK))?GdzNP|LlIpP! zA0AVXP5%tyft+M#SvbX^@s$-ynn68n?_v-$4n=pQzisH~wHvY_SATbsr&?3;UHMQy z#ICrcyJ9%*8gM)%Mxla+4XatsPu67%t>qVg!7tLEdXGymzPRb`Q+ox7;AzGQG&UVouJn${C)U3K^MIHH8a9Bj4l=_VZ& z5kB1ulyt5kn^|0eoDmgLmEIZe@0tp2`liQmkxmN4Ah>2R~O*eH`W{09%%PF zooJ3AAQ6k29McqQGkgc|)m-BkVZ>abU$%lzPvkE(4h-ENvK7Aj%)1fdIG+#5 zN<_Z2EiEDr9v1a#WcM|NgpK%%>~}6S1o{9}hE&(=D2?ryjGslf8kiIy>14IT_TgX2 zLCIobW~@3UE_Jrg!849-t0{7+lzWyg4Bc;;yGacnAb`@Kd!b!h1#hLQ%gFb|JtSQ1 zkc0*?2?}p?PS96;R&SDrG_H6^o~l~(FoX4^&`xvV-Ow7|nz2m6%~#~Im1(fD%_@Jc z@XN+|;G_PD)IVvVTj^-^y6+yT0PkSMzn=DM%hcU&jJqrFA~HnJTHwdS`|icNtIElK zXKv%YX(4H9Nx7Oih>=e3X=NSIB^?!*46LVK5d*!RT0!>G`eS@(3;>_kNg*p9@9vTY zv*Nx$S8KC^p5zqv{2^Sn_mQe=LqyoXV@ySZEesgnfWp_bUF{|9q;3vvSvldXp|}3` z0ej~*_pheRW+_4k84Gs&@>0UFJq0b3@L{A*`$^A@&=%YPH;=Y;G;3%2QmpCV11j7W^k>*#>d)q3bIYVrC&p#bvrI5|-onc*q)WARk%u03C%OA}oO*JEq0)-iP8kA+aff6qHE*AZ>k-Bsc0nyR#Yw zc?))wok-plZ7(Q7l#bcQ1C-n$)PI_%G~7m5E+m<|icWU(4xoL2D)7R-F2@cUnA;;R zrH9@b^g4Yb;Z7L+mcy3upQziuNs6+D+-wqpGL3fF__c~_V!TgnODk!FbtRB6tN3#Q zg;TZ7GzY&li_gzWqI?hed}L{rQsx3hssqz_s-^Ms2#3*0v-7Z3dc=lufy$2xz^uEF z-c`lNdFNg|6AkAWg~}Ey4-4UhHh}|`p-8MxS|}`9VtXT0~Y8(xw6BO+p&5anP6T_^zn0`)K>UQuH(qBn1sU+2E(F8&C%})w^U3Elq`v z&3|}$BYYDua1n_|db+eo?aK_+8`?_jFFd{d8P)&lN^<RsyY7K$nk#Zw$J0^ zon8AW`}$rtuJ$_2Y(M2)`)ru#rLLTZ%-F;P9=Wl}xkx|9>;QaBWgDfFn{;D)bkk{c znG|qF@7L$V#=*=8C!QbQSe#W`9>*Mqod?JS5(yv!Ff#){Mn^}-!4w#t-5pw3+#bXf zs3@%#6crZ!%1iW<0T{*mEBLs&FtN0QCiwf>hid+>X&P{o>o4TJ&rJmo2yhlnz(1pe z6@j2Iznqkm9xy*SUL9Bhz&0ROY!yHh-Pl?h*}u93a()$30+gZ28ARjn3xJ`aiM8ds zjD`HOPeVu!fY?8YcYgS>4tstF#Nsb563qbKrMbby>GKPw-UTR~`@d=UcN5Tr+rPLv zygBlm2l6{PbN!nV-&3@s51rN5*=G>xCO0cb7MuDy>))q{DmwC)Q`Quc@WkJcL-SV& z=w{|eD|;iO^GkW5-`U6D*D@=X+A0TNp5OJ~iRb_TWodFRYvQ=RhQGiKZmnNxSafn} z?WezKf3$rF7Ir6=7BDW(pOBBJA9?rRCb|AUrJjVIo|dt`?weoJ7k=k@7dIfStc4*) z#=jWL!*BN1juKj&A^s*JQ)@GD1EcS@?d6eQewSK-F+bMu$GnV!&#d5tikzAj@O~5v zurUJrvu}11|Hr>r)6YM?#6N6`Uwgv$zL4ENcBemT@xLk3U%#HY{}Cof{u3t0PwxP} zy~Y53=`e}4`}cVNN0@A~sE)z;^Wzg^OI^kLBd`0jssa3V@B9O2pfoS)vqfxV{gZ|z z<~`~QNtHWHy%kUvl{QC)_RmOo*~|Trt~IlUa%paD2L10+sBa58&&bI1i=I;%QWBAJ z!%tHGqYc{3`csGcU2>)W!CY<$Wf@U9|80+U-3NpE2N&2>8TPZc{VUGu9~B#sgDfyMJ@NeZ`y(43m9cW>hy187AoJ&u%IxIU>;iuNU6Yk?p}+DMx96Ap z{0kkOUK5dX!CzE#Xk%ji>Av|}wvXQu5mj`gpZM1T@T>NNf95yCi*OFd5}>Ww%zOa( zn~+u&gJ*FZ1p z!>}1;DZ7va)lJj?Mp$r3EwVvycbv}&VKPrIJk7Bb{@R(Dwi7sSX0F1&o}r+$O79a! zlzwUA7~J7m_(<+Z`z%iG(=7hTDrp@(^d7Pe6R4%{;whHv^8GBq`0i!$ulx+G(H=jJ zj2$jDdJJNU{p8uJu_>(J$R}xn{J4rbO!-B~ElZ46Dls#Qe0Qr58u3E-nhi^N6coDP zBMspkuV}yUKc8#MRD;5s#@UgGpLQXAyt%U3cc@OZqRI4i1Pgg`(FIZWT-ikcrW^m}0>5Z!cwnJCKy| zGiR1Bn8AC8fVJ`h7?#sK(q+gyb>D?iCd@A34X!&nFi?wMsA8@Vzd%2QTEiIB&BJj( zi9M4sgqqw>lE#M?BW$w*Xc7g9pAd|fo+sdwVC4y^pr*?4a z7C~<2GQwm}_LOiOh)1u%=r*wnsvNaAmN2waT#ImK1a75B>JQ9^!GOWMnJ=MsCD<0^ z-o;AX@G6~^4_zd3!+!*m{_cIESH4y_sym?KD}YqJqvot_OFSWI<8HvStJ92j`0Q-O zApY7Fk$&w`iNBHMOzQb2yXktJe3y`EUCF363buAk<}#8+v5O1WTcZNw=k^6^V>wB}>>h3AVI}vxxP&O}s6T&=joDHg@)M z0>17}(DgzF9u%r(umB2Rjm}%E)N;i{K;B(_^p29W+MmYdZ)HgwObpJJ*SG7UT=;Rh$USUyRN=gS`uDU;;fs0*wpQC za)gWSl0CAU-NyH^m2xG&h46DwiC*cu%Og?#g~e?JySVNaN=xPgFIztMw-+c!YoQq0 z`f^!$H^&&NWZS+7&K-V4Y)~9g?{wEl5(n%D)~t8Vniht1`Zr#*BS~K4RbfrP=*` zI`M|-<)(#tP4bejS`0^kQp;B?nXss+^@F>Ir~1K+=)G*Kl;cL$=@p!~FFlRe(wk%88 z@8?nSC@v+~zL`5s3{srSKp4q3!Fgn7NS+KNo1}XvFI;MJ{;q^`En?H8F0uZr#{R)p~fL%Rm58jGM_YsBT zde>qK{J5_Tp&AuCB~TqzaE^`1^e!hCJ5*4#Oyy90V&RyfOe1BhffL@$LYM9`3iR2a z&8M3rr91JZn|1NCs50}A{WuvR?n!vZ{L96HaisBN(*u=^w!4x&-52}wK%cVzKpq2* z6k4-)UMkW_AQmsgtqFP7UGp230^TQn2P=9u@`*2}G+~Jt+HlY?IXmB#uzpQC*|>zU z%ZYrE_x(_8Enh46LdnXw(-$XyhXSi;Q6BY{fA$=w5ve6JQft(3$*R!opi@k|=nqHd85%)Rv1 zg628oAQqe>hb1CaYnpzNyj$^uko`|rt+|fo_U9hs>-Fb3+W_}Y7UPB*W$@Tt3<05e z1Xq6I)}+PdKfJAUM~Qb~aZK6RggLN;gF1zmJ}*|pqzo<>+BQ;?4anA6R{OO6&BfqC z0*XFKg=?sB_t=EO2COc-&)NTi|KRQ_kwM_M#l@dCBcOUZ!=6TFN;_jInM88PWrAeU zI@-k5K>XfwMQUBTC=@1(`FF(P>ic~z&4|$i^y*#ek{kkP$5Z^%@|tzhdl(!H?-UhB zjxot`u_ZHR95<)<=6@-S;)HUR8XL}Kr^CY6Ob1L;$u)9h20i@tW!BmEgw$L3>{C0A zz-vMVBb9wZNYssC;7XaXkdT#FdsQPS8R4O~GVfz@p6^)YE+dLKox#GUPheduz3P2O zRcVx+#K(>Z;BDV| za3AfyKb6_2-DS0aeVOqjZ{{I0pII4xqyu2heECX=tA zx`*QmNA2tF($#PcDZ}><3(YAIfDH`SEIyV4g&2z)rEe4zN^)55ggGDE-N7qR7;xjaQ~85aq*2LH9}oV` z8zEjN)QCTznUa%hu4bj1y_TXADQ=Hv?|?nleMm;b7TjA$rBb za%^;!0RDTRFRod;2!>-NQ7q?Uu2&!G7f7s@hus9Hv`*2N2jR^WmVQ;M$JVjL z1-#~0&1n8s_i@y!E5@=>IaOAmrzW$ohjTAb3AsgczXIH7g?-~BQ^b0{=w*5_)ydiD z1}R&r0_^J*CO)+tg5j3PIVFzC%;E|F$xd3a1VB!N)lCRw-$M+#SIO615Rd7zv2DdV zaPy5+iL(JyZ4p!oA0#N4Vorjl2>JFr3Wxqfma)lhO-SGcx_hajfnP9m2Wt;Tjxlz4 z`fw7AEE%bK<_O(3?*W@ynJK5pJSv67E;2j4Q0fbb*4tYt_lc3B14nI!Cq-9p!eo`Z>$JE+IUZMuu2{F1~u1sK{x zDZXN2>9GM^53*|eM*|V$zF2Urh{*xcAtjah4B=+B4NG&MOC~wL$dOmJ4p>KdRPNB383?h1Wu~LUTg&o*LSGU2n z4WNfD5H9ssD#DQJZh^tntf%7gicPFK^Q_oHb=8<0c@_@6 zbgu*Ry*AmyEPr(JhG@z@=sB{;(lTyHaXDcFB4lg{x<{cHv5<(X!#C$2^Wz2wM3a0- zk12t)C10GqsP6HiBqbYSz?N^& z?^Kdz@xjO>U7c1ui&o*Vyf7^QW$(1uh(ETqln+;hkTJ%H5DIqUJN{f@;y#p=Fv*#x z796w}g1~)0gT)giU+3zz6xTRVsy7rrFHaE~!da67I6BC(wACbGCO=MxgKz0ioC2Fvi5j6Ip+Yk6f<2tW% zH>0Twtpupw1HDPQbxZs?$eVb&4Vo}o3X&!nr*7vO?t!(0P(lm*#@tZ8T^Bbm&;u9% zEw`bTX?x$!+v`rj37;pQZQw6KT_~$$yC9sh?|eC5DZd=pQS3wbegW~$7i}&R$65&q z*^BJt5r3D(&$Pc)!Z$EnZa)6%+o;a>h;?<#r$jvEQnn`S! zh?}@YA8j!U67Dn_h2OfjNN|egbhe`p(;L_ei4!OI9>OXR^#mZPLy3X02L z4rx-D5(~^PG?sK?1t_nXeSWcyC1_e1Fzv0C`(cCH6<%g&GJ^pP&Ilb@N(YY+?f1GR z(AbP<4DMC%dlnJ@J$}l9Z5U`d!MY-G#6@hTK>Lz=4pxD zKZEDsU{_G3K)QCc|t za+GYn5UI*C5%A6Q^_>?tt%Qu;Z?K7#8R8E$zxMH7%G=PNDF+Tz5NrTmH^FLUWwOZe9LvSu^%!Ch=yVj|$Czt6P9p1eV0S5go zKTE>3unL4c0}f+Jnx07`o4G18L|wT!JcgG^eZOi+-)noIH-+cfwNPc}%%PwCNXtqs zJZ2RnZ+x*?WU8P5=HMX7{~hT9m1DWyt4aR#J03hQhN)?*d2sW%!0897X^lms~ePpdYxZXYv3eC7_qac{E0) zT6AIWK`9bj!D%~P0_;ql?&&AZLXs54WeH~(=6kV1 z4&t%+UGi$rq=!@^U#8)c!+BRyvPhHn*HW-QNw;T9GAjR%Kc>)M6G!aLnd<|9>YBC5 zn%*gs+^&4}QU|0)>NO|uGr;)xM+{2xDQkP=gv=}b@EDrluUSO0_+CW#_eM1y<*iL4 zJYRlT=(TWwl@(K}B|b+6^;Z+b8-{y5@~wl(0dCs+rKM(5u&@H2(?C%LDW}R)Nje5Q zSdmS}-2l;Ok&ddH3A=f(Zpp2SsAZMAZ5Vxt z__LtG7~ZkgP;egV%=s8h#S`W(fc#byM#j|>mw(RDp=;Zgm=YIs(6h0ZHl6%lw7)bc zE=muKnL`jaL!hmx^A*rLWbBeg3LmI?M+!045{Prwieg`>J0aMak!6ao!=5s8bTh5z zup!96Lsh$*KN;cqRzNlweusd(Umsp)DS;Q+HSam2nwPeHh~x}o=*&w zm7EhJ!7ie|>&Ut&4&~zsN7{)Uo&#keQaa>5be6D8gE9oCfBhT6CG;(xm>cipPF}07(N+Akq-1URGi?eqbUWP!Iru{=1t#Y080HGhOaL44fVJF+Eko;pN_ZY3s0flNoF>i$CDkTZ+AZ*f89sJ zB)v1bIs6alV7);^CL{o#wl+|yeDuXOGUju(VpiXLfKEtZs04*IgKEOh7;z8WvMMxSv&wa;qH zH}dcm5OgHzhlUn!cFe%3`02$!ej25NanaMoEI#k`vOzgsuZrfZ0=H~pKcLa_w%}{z zv)EU`)!ha`IJ-G8qm*=0Ic=bw+$_l;=l&u^8y>N37<^~U@1lm zc$oL!J9jUJfj3Pm;6>rJCQ_X38P?Ua@fIF(v*f8Yo%XS$0K;u^19Z|pUpM)F z*j)PG9T_-6?PdTI#GpPold(nipO(s*eR%+ISmdgCiv5Xl)Fbu9Alw;3TS42swuStv zXM>(%y3E-UrRzB0hlvoeVJs6*3sb+VIQ-)cYU1kcS1cLb#_>vRV?+_U#t21?P1Q)M zZCLbGyUy&s?5otXa6-5*;GD8I<5tdk=GtMz&hk)U)$<3DIy-a7b#*%vslXfeCx94d z)cKFB4Za*pI!iQ4*DPs>o+j5;)@6x;@qvlSbe7XC9HzfXEn126M-J5I&REoJl&~b< zs%@t*_p7yod(}+m>!{}~4!ls;RG-kffZ@I^l5C`6D51N9;W+5m`&ZkqAxv`wt#i{Q zs4?}A9%#pq7gFEBd8Pk@3fHmw3g!-vaK>(~O|Ey{zm7rqv(SwH47`4-) zZ?AYxe`5%)!znDb-^!%1-u)?|nH z`|qei+(RmJXZ(*$-xp$7k08kp2b_3Wpw0lXWtZhGI}>A~Jbbdd-9)X6GBV#-CAYU# zL9Vg3B5+{okmvls4EKE)`4;V9s-0p2_qd}))0mJ6*$BbiE3=LgbLjaX?Q^m`-JfQR zbXAFc!|4NkTnTk(FENU>v#GD{kx$n#sqS-84dbs2n`Z1F7K|$`ZQW7xpw zuG$ATh(SCt4+Jw9P>E4*((WZom%R9X{pYY#z&uv$RgF#Z(X<5Uz`}5KJ`VF?Z0$xF z@ETlANiyq`LWC7rS(OlAa>9$ZjPza{LoW=#Q>%#)u5;e*s5ugNjL2FcwZW^9*ozqO68eJ0?Tn#-wV6E!^)aB}NgHTGGp9OQk1c!3RW|tbIK>Pf-=7 z;+2 z-I;*-9uk+3BT56%f5}^T8O0(TDJRZ|R|1l7<&K2bepI8vU;s}T?BL|5{@8)5iJhwG zGBoAeJVeY(v9Liln^I359UxWgH1WfplH}AheZ*+swW`t38{Y>LNSLo2jEPMUN`}ZN zYYn2gw`fht*LZX*2G{&V>t@V?*7?5C{Urr%2_4TDPeU?v1Qh$OECLB-v5ect00zJX zz?(X{^XM^wZKd~8cgK|~#fPcH(apUQ9ks_FQ`&|V0P1i;cynu8|QVA^=0Y0fZ|3Y>ux>1k}tH(Ru9bJ^#IqJ*x zwYw}vf-%dv@BK%Z9}@V!!$Ai?jF7ZslnVo=4P^KHus#L_`r6ENhBdY%5g`!$H!FNP zX`vyuY;^|*8oYO`!bjGgAq!R}`E1FPi=He4b>=R0S32Z( zY{38(?c1h+MDli?RU$&+%#ER5Sd(I~{M(NOi&;|>9ZEn# zW?k2WZ?8NI6ZN)ACxf9N=ab~DHHjF^sP0DO%3-3%^il(vp z?E-UJ@-`wBtB}9%o5a1)5W=9KNAvmLJE~lqqf{8^dr39rv^Ec?8QZSJ=W8Ld^EcQj zPr!eCq~g-8B=W@$tzf#a)f5U=0!G6a!YC>9m`{53- zCeW7#z~Xc_j+VgRdX-i8HC-j`7a+M!#R_g=pCluWopRcTZgkO*dnEZvZ8{YUpA63G zY%lJIRk2$mmm2e<3xDeD>JSS5uR5=Cy76($>`JdM%j^B`5x6C5T%r|9WL!^4nzH;% zNZ7qR0tq=jWX?o{cl@f{yRS&PtzHWX-Fa&@gTl?b$DsP3nO0DYNEUPvb6zI#DoHDP zo}lmUn1ZCBJX;`g%xw0Qe>rRKj7*+1I_hw3PiK!N-Zg)EzIz!m($xPU?3|i&(ZVeq z+qP}nc2-twCtqyawzXp0wr$(C-MhM~tNP+povZm5<~#6=_CKHtCJf9dZ<@qBH+9)% zd58*+L5sH)M74C45IbwT*cNzQ_)@1HsmqdSN*g&tY{L+9mCSSx1w&y{9IfaO+`^|L$GgO53hfgD#@ec`h{_B<@{Dt{1;{qvVdtzGaR-X%k(9tO@F^ z>0j;OLku0~LZ>OQA|5C!_H!#*79v91z6wv^LOZ`a-B<%OgE-RMq-TSk3C1~CWto0wQe&~9;#cU+IZoeCpNl$$pbn$gP;TJr+4&E^h~|B!&&y=)je-uR{v;BYB>Nv5R2VRUYENYe#Wh*1xLbd-Zq zRrD=Tnp$iLvG5bW$x5!-CCi?B-fjGc^4pDQC8~y(AYCsD@yAA5c)pyuD*q|+h+1sX zb9MysJ!d|~b{g{zlNBKfG5A~j!_gJkfJqMI51khUjkChB!!tuqdOR8(o8T{+;sDIk zvGzfw@{Zw@y1K$%i#GhbG6x_5qtEkF7~ky~_34#v!5*o1eDj}&JaoRVdrGNGw7}?G zSCthK7l)Jm4X6^aP@`nVVsf2ou^;!BC_(<%AqW%I0)9OG5BC^y!XLA|jjh(P0U~Iv zpDT0u<7r1?h-EY!y7&c@bMg>Kh{L^b(+7Q_@%NrYZ3>JYg;1z)97 z^4jgiX{75u02MVZB+A!Br8zrJ_tAe*3xVX5cNTnn9&Gp8p-=U(qGT)H?J|_Vh@t^c zIyeH5W3Ugk7#i8MET?U3{C=CN)3PxTijMAayBMs8mCnIsK=-~O>Aq9dsM7*uI{8XS zba?gj=hg+*)>pMe^IHZqUO<~$(YT@uOXP~9SKdLuMH2-E*h6#DfWiBM9Y*>z(8Lt2Y$hHwT?cFH&#cP-_G%*% zQ@11@WSIkuYB}gh?l$8&xqXXc)_!LbdV|dq)dUII<-B&s?2a6#d!+7>vii9-^%kaE zZdYCv-#UMq&zuc%`2?aK7^B)YrOikrlI3juP<%HzS-7th5~b7H2z_ZzE6wE2TIwJo zRWe|w#6#=pqx4zQ=)i*XQiv>elRqXAG#=vc(#IErcK1P(M)=vA7KNFc-EIh~x0U+p z@F-lXu^G>6Y6P#VMgEXr#{|~F**6l;EvbZgsQWBc($Cp^eRooT9Hb$ZeVN-f>cA$a zeltA*q}`uQx0UL-A>U3!Te1x&u00#0V+fP$uWcgSTU5x7w`I;oDc`loH*j@E+lVx} zn>*P%%iG2R-HSlmKV#2=!ZSeYDba|$M}xS|=C)S-wp^U-)MK~EU<9=w^c=?-OUZT_ zV6B9Q)=7cUKSY|1^89^Iz`(%ur1_*9&N(!8+1^TpqEp9+3XiTK(7YNQ=a2g_3%c;G5#EEGP0-zGn70i%kjW*640Z>-NP!q0P}Ed&1Vl5r zfSNksX7f740<+cZD{*(}+5>-Xsx2xqRbQfa#KSc;YGElk$$r!liu~J!%l0mt?}x11 zR0G8K)GFlN?tDu9s0is|=l0Egq&NlzZ)^}_{=JcI@r%h%{ur#B9mee+GoTQ7fpBx? zrw-eEOG{`_Q2=S+HZnhX|B!~LrQJc6OM`rP%RWnv3!0*)`OizT2);C)4=p-^moKy~ zZ5`IWFHh9l#4dhwaS;D+O>+Ktvxx}zP=@@)3;4~Bq8F2njka%3f!hmb&BaU_M>+AT%%__YrWD9jKh zK>s}=BTnN;xHYlSf7>%ydD%$~4Cc*hKwd{;MkpcFV05VXJz=rt!-pz=FTxHtxox~) zpKKVm=zWr!W<7pd|Cz*@6FTnC%p_#Q+U&t`JS3GTFjGHQ?;fg;))x;YFr>HyXXMV7 zn2IU{VRVUvv*o(CTKv0IbzD zpXv(BS|?7@GyU{0B8RF6JsJW@4REqC|6O)cV;90QJy!_+m-4Vg-ULa-fb3Ss6_K_l zF4tC|?-K@nX*>HgyKZu>Pj|U}9T8@!Le-@h@1pWk#|Umay}o(gjG?-k2wrL4dIZ7weVW_!~B`hk>Lx8e%OdSxFm z*bWSWZRa|F|7+hmg2t3EVE=Qb5qQd)6vaxGM88)AfutwEf-jwglxL3mG5(Y)cQ~zM ztQ3d>P{BYA&O?)%nuDoXTySl%ZB)2MjTXQ-u32Kb6+4%qq`oSOCzsB*A$r#XRZa=~ z$Nq0M(UEZ+19p4E2;4|+`YyNceEO2YBAnROkNOH0^#XazEYf{1UOWs{bWRVec|qAi zV}T~LO3>@=1UBnkhQSz+n52rIzQ=KI`OGYLzVZjWoTNTar5i zQRxC&GUcoJEHP@`1l7#7M=4rbd&X?SaLeq80ub5kvc8GV99aydCts*kgkXeQZtFH1 zKe_y8c?G6ik7ei5e>sdPn$qnDDI{C(pCUD%%_F!_t?m}nUoYF3vB15|SZrka)G;

    ghtMA@wAKTN~%9z*f^Gnyt6m&`Q;SW*}Uq6cN}_=Hg-{ zT#!b)DM@rbGvpVatM$8N!5?y#m4<`an;b`_6vuqjPFs7{HHEN!zjsITSD)T=n#QuC z&9c#u$kt!%qS;QPM9f=R-O;DdW<59fL=#*~%Sb7w2bIjF+}Q}sH|g!O+TaRYf30>M zIt8M+rkcEvBR>0;C3XT07Vyj{+z>V!Y~9RRceQ7_jb>r!nVPWV*TWi2y!xRfLo>o} zgrGX^cH454-ix5xKH zb$K=$4IAR6QbE+NfmUUxWWCMS$1t4p%4ZxMRzUll$8B&GjPySBg% zD<&aY_)TgIMiQE-*v8$Oe_u-BE8C?;6UM#Dn?%jWrGykeMZ+O34(f)$N}H7ZQ2PS% zRF40};9pC)$BCsj6Ve>@s2LuuTQ)_nPEM|IH1TK_DWNtc%=VZuK%Z6J6Q_^h4h^T( z`R&8FvqFZzEzY7>d{GoBDpgLEEMrklz?6L3x7$8_FvD3+clb+XN{>yOIM1oJBNh z$C{_45UA^LYIRpVcj3Rb?@%?<2q@|4XB~&>E!{ka1*q@Ju&ryvh>6UynP}iNj=h-V zbkMJ)6hW2;`&7GU-klbe&vgv;aw-IvaWSCkP z;{iN2Lh!ZHhl4MkUYE1!aa<5h)-qNL2Mi5hZ_#)i$Jp8sV~9c8Q^Cu@gi^uf6y7bI zXlu{@6m1S+$=CYGk+Pdp{FyHP_L3XWDZCK?21AL6mL)feIt#ZqS%DcbddNM; zw6(n5wVl9!BXlDo=8h7QBG$NX(w}l1*V%>G13R38@YOev8K6~zrgnXfgMC--zBJ>$ zo1qU1YBz!>27i3Yi7U#|F0`&Zr%7Mjz=fU;>=+ka;mHJ(Zn{YgyaH9BLrdm3SC5tz z_4W}_doq?btk6Y{GvYAw`s^PsU3|aCE)zn6u(}@GWyQFHvBp<9rLEBdN+wF0ocaJ9 zt^@eq8&HazB3oZh0wxZrQ9HK*Kq2+(f}K~Hw+-l(4OUs)p>676fP@Yrk+Z3Q47bC) zpdZq~DT!XrzaSqW4Q#COjaEa@OUOORQL;YM{7v(0Kqf8iC=kdnZ4YtZCECPBO zPdxb{YEv<&0&GE1tkbmkojN>!2^g3?B0LYJaIirjTp_q=ShtT)884#E#d8#A&b~s6 z*zzc0o#rgcEKKht#2TYyHeQR0)Ar2lVxDD80%a;mrM3lzICjmG5-4Bb{|kUD=}yR2 zYnVJjx;+#ggb2D|8)#&nE62h9QQj04?)h*Mh2+L0UB2GLdD!-d?3QJ)muZ*P!qRL4UW2v)^?SHd5!Kw;y7Rim%+vp()UfFFsY%t(Sc zlz=*NCBZC+^R7om`3r_bsp_1Sou$|Qu@1vlhFp7q+ z4)>9~envEPYm`t->o+q#p;1aA2hCU65Z|7lC97g+_oMWys1-Ry9eGimD%CPF^Z2w~ z*;2eaf7TnhJ4gN4p}typ`g_Rdnlukv54nwMi)Vzd3@gZY>QJ`K9gPUu7&eOA;XoOlvZ#?g zLijK+jSIA*fS5!%CoXtJF4|H|4HCox+{(dVzJ=&gVsSomZAFIwK6-Ree|4Q{*i;Sc z-ONk|4K~-U%-sZy?V0(sj`&mdLd&a-n=ubs<_mzd${I-^?$oSM_ockQpFN9?VFas7 zi|BYRTdnH4&DCI&qJSuDKC8LFz}-)N!zhDhX2qZO1juYCO59@=|N44xiZ~CXq@lPY zA=~r6`PR2CJz9t_gU(c1be-`maHArOzmk@TiU%>st5Ne+AJOut)Lq0XCJcVYqi{+9 zIgt1bnwEE-*>|N!h9!FCoaKx#3xEGRMAX$!TDxamnlmQC`~1vmsWt|CaP@EhgwiWZ zAxMJC$G{!`YvPIAu{PoR+(4a}A^sl<($7El_2SB2v>SaW&TPjyMi8s_zgt6bps?T{ z{%g5F2>W~C`w0NCM4+1)W8Us5N`$G+w%6yiwG@7tg_yE+RcL?MUQBt) za+t|vFsvAFGz-`TcU1hjPq1%>&e6kK_SGF53S?vOW>vz7#U<7VqiS#uLGS-*Z+P-XRUCJt{ghBNw zCf+BVzi-bu$IWz)=^D+(9&8dR+f3V%Yz`9A!D|P?SM%?(M64_ z!wpff4p;7Lgq#%Qa^gD==G-VdYGO za2JVM33fZSS_XIGMXOA$_I|vv5JPzf4|+4lU>A7Zs_7DPBAEW2Bkac7O+V4K4uml%~TDY`Z_S>Iu^#DgaTj>*t$O97YA=TeYXpO-)d2A(Ky% z)e6sB1ls-L-V}8pA)6tPCE)M_LvomqolV)AF*%!pw1J) zIW$b$#|E{LC1Nh!#$MKxU1e zMy&4;PM1fdN$Fg)k%Ko`AkX;vKeUgraTfouHa5UQI<5b8j<^$~>ty{Onv=YjROt{) z3xsyRd@>O_z39wTDW!glw0>C^H7;BX8zD^B5)U%RBy*)4C?S&>6lTdaRDueDJ>>`x ziQLjoG#bFls_iPyEw&O`&x*|A=Zhpv4F19+^1F(nDxG2BZ+zv%`pBH=!g223sXtsG zJbtW{a)tQ(Lt~)uAffG{YX0bG0U9OYayV)+p-QN;ay-y+aCv|!h;_WF(GDH^8G3}C zanq=l!TfNg$vE(R;bgMW*g#W1n{i=$IOwMWRD?^epvo*>w2IdhchcH|Fjhtlfkj=x z6~bjpHEmoh-~VQK$l9y%aQ%V3L^|4#_wu+TIGueg_M7A)Q?9e*|C*wc1^l7UPQ?-%i__h5k=y*v1^QNhiZ zXu-8JMJkT6R6*^eKMtQDIKFAWoG5i)sxfdj!n5nYSo-)ByAvHyG$YgENV zVF+YBr!qn9&v(RQLNNTA>O(5Dh4cXkrkaZMIIh->AKXB^$My2RV;-7`SHLn?MSkt| zW_na}Q*f8LWdhHTVbgYN*O~b~Qb38L>fIe$(p@p4jaZ&1*u8DVwdDdnjGE2;aw5aL(Yc_p8nHsG|f&9-C@DRVFsN9 zJiEQFcK};@hU1!0CBpF@L#ld1rSiDgD?1Cz@Vw(NPGyDM8MBc=Y@)@QGDK5G^KPkS zP_=~-aqzMm9>zHFNLXOQMJ6N{?jvB>S=rgdqXbPLYm{vFw%~&;PVtgy%;Dh-RWo2` zv>;lby&V;rV^=#6-E>i=$3gZ_QYXCfO z`lGo9YNn|6FO9jP=2p4pQSU7lr~9zRG;W~jT|&43L)=$3Ae>?H9TD# z^blS$j1C5Q8_0dTjl5bj?idTe1;g4>uK8@ux=TCnu`nF%`F z3w;$l?}kzu?5fip*O5jGF%+Cy$N4t_dT|n#?(UXfkwY@Z1(IAwaa5X*T0R%`RGQNU zM}(ekDRC-4GLZUg>4gi*QYfL_3&-!JmQ6}jueUPQH*fJqslTRa6KI{xPZLR?m$Ep( zpKdd`L$0GKWtMA*D9{?YQ=sI$K-?RS&0ZE9MMR_(Lk_mg2JyF^u9JF&93tX}lvSQ; zFmoR(2i8)U)_~mWQRCI{!4tRIM}0!dm;VABD(smft`@yN%XPW8*dZ-R>NfG*Y0m88 z$}O&UC9Yz6NM(I9ns_s_i>S)6n8A&i)qHeStEBo(vZCqkXxt8itUG8{i-0dOMtHAl6rb=8G4L=8L$GU*Ta`VikAAh>@T=SYT$KpTK`4YgUu_iJa!wsKWBY2e}x-BrAo4={aVlmq$0 zO5FQq*W!u+%VqF*uD5|`ZO7!zk0UE^q?wKYVHyyHj(KW~B9!Z{u z!q}RY#f;lNGOj?dv6>qrDz3f!lDVCJILFdI#o-x)nYge<=BOGcv~ z7}KYhxuiGB*`!OLh5wC8cvpCuhL(Q;#vSLgr=sKS^Z_bY+}GAlXc+WtCsi5Ty#Eoq zQ72SB2^@`c#>gf$Z=-pr10mxyxlH14{>! zYvyypWPM%KuF7`xu=pRE67;q&7d_b*&N=6;0`M^52L+7@;Pb}%rVAz`X5Nj_yNzEP zM3yjL!=Tj~FW^@n2oC%4WWDH}38N4k)98DE1FW6xj~<8TvGw=+IVy=dZzvwHno!8Y zOla5(@Z0J1nx9YL8p##~+#F~ILc6&Tz2wGie`f=PH?uJfjOcrVq?Q;SB$85Fk7PRw z+b+R^-2O_n`XL&0U0Z2~tDaR87z{3qqS>vk$Y`ulZl$~8>Li!oh6R{89??>Ep;}Ws zImZ>AqpxtWLtc$W43*CT~adcOqhnBL~dpGEZ>H>%l)hM$|q@R$TOO^l&-RR;X>*Kj;_f4W(uRw zc}oiywSJ1ANNv-8X3D5_b?LV^j7}nafRZ?sh+@*@)O%8QRxfAiNBBonU?G;nqzb&w z49w16j)3a)axA~QYnW?qkEaD+7hQWr21wH+c^{}` z=;of>o~cEMP%O(SbCP7bqe@Xr-n_ zbzK=gY6&D!9Z*h{9g~!wKR{)K;wv~v3kOqTVOoUqb3g5<9`XkMzIcsKT`wj(sz(hg z*J@KhmrUtGLtL_B$h-1oG>k{-GlmZIl25II`pffY8}+{k%m92og_)Q-oDT~Q_M)N2 z{6;~5IRx;A!S2~`XK6`#N*f%+KklXE395r@t62o^CTR_)I*+M-T_sAwn?Tn1)$ARh zH^8ving_6GtA6&8`xV8ET$_lEF5QZUrP4=*dN3RC_bDfg# zD9~no_g{>_Wen#|s52KUb4^-2umz+xI!&*vb=oxd6UJ!pnJJ*&mPT5&>HY}y0sf% zBu0X9yA*4=h~jHYZdRog3qJAVKlfSJU9E?fIke?L-ti+gl|42?rX!GFuguGsiBtTcBaEin*?*LV?2R+z{e*=x}An(8QXY9O=OBl6-B7t(V zTC4ZYCNBkjNw~c6S}ane@9h0wq;t7KK6Sz z3Q>@xcLtz>xsh%0&!OC5{x-t^Vu@*G^S0inXWVsw z9qPTPyz(7I;#8X4%lh8 zI7jNiYV=n0|IMUolnYW8P_A!)R$;FB;ydg1eu{4caczE2r2ToVt*pq)mb2|(gsjT5 zhuQL9fD#V0qkdf`>B(`=0c(~W40x6_vwR)iWxV)#q_s31xeO^zAsy&SxT@?7aZduE z+AbDtYHgQSgn~STrWkN3G_@%VjRqFYDpDLvd0;A0UNF3ddGXE9Pj%o@5U4%2HVkEJ zFfl56?_(9RnY7hLhqTe7j6?rkbTbK(JW@ECB2t{9_&=NRIw}lypnvFh9ns)E;jpJO ztxuB~T5PU;WWs&X2l8t(R|QX7-HhnhgE^%4C4#3vD9vL3)D0J_Sm&^<|N=RQ0#E!6XTIAB8H& z!#&!}Jam(ya(6!6)chv~1J(SIf&I>>=6{1=xdh&5B?Uz=d5BC)r1#M#IyU%|m{-O?!J zX=|zk-dgU?FBQWanEQQ;K)9-eR+Ug8%z0%K)+bA#SRiZdAvC6r&sd%6m>9Ava%)|E zG+t%EvyC<{UORyoZ<^H~vsBu$CYW(SxNSptdmP)K!(?cRW7^mSqStFiH7{CNUpgyJp?{+zac{me$p#Dciy zIXKia0Lra)w2&~s&2>IGCNYfBc{Gut4#qm(LR0?I5zlYLWt9)WMFESzRO9Ckyq<(h zyq!>5C)OBV^|%p*D*}ik(*=kE7T&_D%x_P^hsq3mym#4$h^$>^+d(x$U*h((>Ua6o zxV8#6XH_F`Wo#Ukuw$Ved9v!VHtj^jkVtJG^JhSRPv%&|D;mTw9X4QNL zuL*1?>E-cu@wET&1qJGBY)61k5voLadx&Y-2|f-KZHiL%?;wVTGcG_=jPSayYw|hU z)OoVi;FO=PkmMvCYTQU6zBMWa2u0g*Uzh)D1+C(=%I5ck;4=q%PiiE!^Zv6493yo- zpFl}sCZf(Y6#REsvw#E7mFOYp>gg8VQau#X24={VnWGwx0efNo0HIOP4J498E!os7DGfF=a$;P~|j zq>C$HswJnH-`ixV5TgIGs_k&=>k|0eFO=F-BDr*=$#Da84l1W$c5|XG@~J?0q_!jS zWy=}+@6HNLWj58q7u203R%o-XQB^BlScCV#P5@If2WiF$eFBVMI6RA>-Qs`Obz_p* zdHn*Gp@s_hQ7(CQ`eG1rI9_`_%zj2o4?sIFc|;J^JBHj%bjZCh(omgn!I{C!qT}Qx zeLF!JpLrMBv2<0)S$eGxou$LG-D+S+jnBs)sm=s2zPW4rMoA*CKkuqOJFxsX-Jk>4 z+mHigLOzzr<}sF0``cz8WkUkW&TZGnpBj}eKii^bH_WWa855SmsDvhXjn3T3j-OCf zW7$u`<;(aN04n5Wb_P|Gk`g^pXqxu$ST2ICzEs)N?xG{4tw!L<})rzhFXK6oQ z4y@P_P`8jT-&QoY+uNON&O6fR%!U!Um}49w+RB-V$;`;z9}6>yG8(v=iQ>h&LaROT zpbKRmNA@KW@=v~aS`9)R=igf?w1t>@78KuTPn9z_I_7v%V2ZLmOe_$02~hNMLwwH- z=Q81eRtw3=;NAq-dA7X`TJxk-bdhW(`~_%G$)yBi!Wg{7BHIjidyeeQO6-fCVz%Ef z+FVcdp$x+Q45)6F5Nbc;w6Z7qr$u>aC4QUa?dS=Kw&AZudnONKj1sHs1?EJzX!2}0E z{I2IHv9$nq-q!|4?@XhL2~?`U#zA8_=p8!cEck;KOWT$!=>%THmE?Z`=0L*T6NVPOLgt1RNdLZVihrqwV$wQs^1o21n)EI3fvc}*iLd_E@wgV5XwG)uljRZ9G|{Q$6PZumz{ubcUA)~j3mIEc9QY7wc$6|3Rt zaJ^)hdXI7TE5ISaipJ-Y69b7#ivpG~MLE}V#}RC&Ql{~j@=1nA&QwqwScogN8Gi{UB>d9G(^e1DHJ9y(h^kP9Q#+k+A_CO!1z z&euzeCxkVT>d525nWr1AViXYpB{z+OhTKdD9sQ0x8la${XCj>v&p3t7b&p*M`eN#` z9Vko<#qDA_Kg!(BvFc=URW5TP1LT<&px5pgZoeia^tv5Jm6ams%#{qz;d!Yr8{4mS z3VglCGEas<1xSU%YM6)nPCEK4?fWs_cjj}gnFE!*Y@EvN7U_;_4u)fuV7$L5t!msw z1%2oVQj5jBs4Gpbl1fAJ?n~ogqF@gb!dBRuDdTNykPm`Pe%B-Yw5&^-(nrrDmB5L? zdsl+n_Cy72`frtBFIA1aF{uEHF_&C>?Pfti`puQc*L~?Bo_5g+in6ebLE{VUwxX4^ zbPQu@NVq>(t((HYXQ2@_g>;s~6GO9qtDj3EV5%*rF&rKPZeBAqqEzSbD&%@a?Vjsu z(2vPeft7W!wqJE>VBk}hycFB}a-bsKj$7-<@ee+A#jnD5Sz#W$35n=EJyo z0pBxRUkUXS<||)P^Ha!J7qU?A3W^fDrVXJyr8#>#{|F=K>jA=BX599_zNSAFO7KvX z-lDN6&EkvtAqU07Zn%J{?WUtB0u-OIS6fU(eR@nrDeQDGbW}5v0>rgp?!OcjqVqC} zo13_KDgp7AYbk8-GXxP~QWR8SwXcO;*>R8Aq`IAAZmSV40d29MgyJ<5DndkcR^=P? z;I&&@M~6%@AhxP%k`EFuZ5zSyB$C61>47kOaYK$V&!)q%!usg=AQTZFce1&kS;wtU znh?opd=$U+5lrn}H>P2Et+ZK(xrBO)O!)WkkGhbGLO5NebT+7!h~xz2KiETL@Dzt( zNd8x2J=!uS$7s@st;S3zmSW}@7^eLV*1(a27fpdua z%dunE7x^5*WDAM#=~x(xBgRQG_{aLA71)#pm2(?VLp_91RaJqBjY8`os-1n4ygEFty>p%YD_9`>c}GCODAg{bSuWng+vqE)cHTHI+~ zy(Bw&+dPj*4LfyU#@CJYaV(1N%ovxke^QaQI`fpp-%^mks_Dzldd}A|a|3<3h9eF@aECS4(UP zAoVul@j<(-^r}m_4DN)}!4K5OpSmxblcW;IjuLsIY%6q?YRk`ye!TCpbo9wf37Vvb zE{PLEm)ifi^S%i>XDf|t?^(p&Kp}S%OiQ)ZM_*_xr*>ag$f}1m^;oC>akamBK`xiZ zbf}Hao0VIzqC8neJ~!9mOvUtyYuW~KFy4m)@fL9FB8ZKseM%a|A-iu|;K zlB_&A-6{X5Z1dKG33HZ3^=?<|hQgI&{LCu?UeHCAVW0+sBvX$s)seJs9G7>ic3DV# z<&dm#_%hWZ>AyaH6{=Y&7S80DKAh?hZ6m!(edf#A%O(Db#>my@^Z#ixlo=im%vMo` zcQF+~Gq4ooxT@xWo~8DzZz-V#uEsgTjy@$@EY47U)M%&LpR0~U4lha& z$DxMs4tht9i;Rf|&Y+bboye7`s(nLl=5-$N9XwjXX`TEFrmK}43(tYKQIAia%&@KG zUo+0kMb^TA|Gs13a#0LtwAtx5HJ~hF@U=lZO zz(r~hF+Qo-%rrrAP0`2Fdg_kkZEwvx(t<$%=nnlnj(M!BCP^}IDXOaxNY0ukq}Q&~ zF&*d~5&X^S)+nZ%I zgaq~CF;{szxh_#K|95B*{(Qy8j*&s&o?hc%=756{FQcmsQq3Zivh~fA^NDH-x>&ui zSxx<;OGw5pkEH%v+r}a6zjtx|wKG}Jyc!o#vH~aO=u6d#ydp=;io6@i@ zi<4~+JKbEEWY>`4CD$zin#$t^pGnts?59ylVe!hgDv&V9k;?d#8j8)he!;kegk&Bb zdolv%flV(Bz`(1}ZyZMX4)iScz2D7o$|sPf$qon3Y`*CS(Poh1CR>k+!6^WI=9!8? zoMgoFT%v~rdE}h1@BWa#DbdKs`HB)fJf0B^J8HyN!oSgp;QBB0k!p8Q0In+e|JBa#Pd)*dy6vby% zeabjcXz>#Q3)p15;h1)^Co$&|+&8bRe#j~^xt+_kN1)UbgPpTJ1Iq&@@a1VqMSaz= zqQbn4>s-7ama?0!DZi3Nq-!o8Wrt3gJNh} zk}yXQ;;5=v#});!hor-3Y7&w3RZ(c_T*%aKqY^Sye4{Z3U3U`Kh9oeAB;pvtw3$Mt zgw%5xl~REVTjH7Y!SM+vOpU2#JxG6{GQp?d01JlTCdQz`se_hNCd6<*{cwM)&_f&{ z{^C(m2bzTz37PJT6bb)Z6-&ZnZG)p#Ar4FoIkHcJnlVJAwx^YDD1uy>mqY&}vj7v5 zaqkXPDm^ak1)WJ2M>8aph{`M~mK@0zEcPxn$U+Z#jm+dErrZ@Tfs{MYGa`ZW(#*F| z7sj4YLS2^-%AXy}cD3(aWQbTx0`KK6>1E&~mJY!20?Py0$O4I7D(W7b62rkGMna=T z5+H{wMQ4LOGKVkx&y~JcVc7_n&L_PF)-bYr2na=!fBOUCy^)y9F03d?y*ADBKpj}% z-Lxvy5cfg?L(``xZCPdj0FPe5V-EBEXK!_G(MK0=QU}PVVwoe@Of-QPpeCJ0*Aj>8 z7pgw6#W-6{1pJxqduK~Z#|Gu~H>afnMWY@v%@&S9s)vAjBN~(8Vh(>>iXe%1!pmUf ziW4HrbEE~tfP%EgQSb`Ez8!nT5nR_79)JSbB&?o-dwt&UCsqW{N);~*4i~=Lzd78l z>Jyrs^uX~YX+rADkgW|)2`8s|pLy1{^PZ$myBOoU-NsbEWm0go0sfdZtWPIb*Agsff0r?9C)k5wDxG z6dI)BbyLa0&&gP@7?Z@%ki+~TXgncbzTsmpqAMRemd5BRO3WOl6QOFJkyGDyK+nJq zZ&5W16$6q`Gba%x0`49YYeXt@a+N+jya%Z9d8*VITc(15^D^+3NKh5o+|F%~W#Vlc z5__>@zcN;6-scT?FbbN5o@?_NZ?y9=ab=JJB5g(}+t|xaSq-B0f4|dCDHRoGnA+XnPrmNPXOAk$sGLJD0vi}*co;k@ zCx}*6V!%%za2f9K)8|RJ5HqG!&R2x}0@{HSMLQy0=JX9HBxx`a6N>9t6cMv2lsH-< zFcd_AvvIwtTWGdrPV$QmjW8O8%S9h|2CTUxq3=SN8=NT?MGEmAys`)qQL>`iLQ(}3 zn-CC?;M=Fl+AlwbKv>ba(adb%aSUs4>gMcR^k}h{b;jg&Es!S+K@&Z)1z^Gk6X|N|t6!Wm;;SbxdR=D$?^< z$Z4Z)QZshl-)XBiF>JepQq}%emWqm*k&~NwetV{4-?AaasKv?PIFeuf$(+gzUVTo~ zn|nwvx8lw@HTRTVzcAxTvq$@-JCTSom^?PV{PrN_SEkG5TxcBA7qG+X@!Sz2`MG|C z;F&?>vy*}hJAksyrUUgk1tM!}eqs)fb+wwsr8FO9oYlwc67cY7`90V>dU`rKcpjdx z5Dmjuz@>Hqh3)!D^WLu918EepVzRd)Xl>x|+}KYUsk%m{cJtyAzQoWLZ}s^XyJ6*I zDQ?B!5Zt%iCO5xzQ1O@!uP5{E$oeyX_G{2heLUKY2$5moKqgcB1U)%ooR}A<>X80M za0(kYvL;{!>A5$+li6to58+y$jrkkv=ezWK-DA}1LVw%)^V1*10_ifV^e<3ER0H#| zYFaXLanI$2+fy~RU8Jo=Jii2CMQ2vtvj`M# zqa11r#Z~_!0!Wd_q_%PzdYU{@_@-t@t8SgP7MzeQ>CTeFUzfaaXQfG(6JIe8*_cB7 z`f{Pkl#xV##tUI#o4_7Esalt(ntFbqDK@ETfEH;C$8oq7`*CzsNNqxViX+&6knfRn zg(xgQuZg4g+1u_6cj7$!1oyD|)_SP_!wx$)%3wG*Kk1#gUWeVg7AB=*0de`<%0*c? zW|XvKFaDne_SNK_Y70cd=`NrD-uN8>*(6qhQa2Ga><*mqw4|EnZ_5?-uuS*Hcvt#T z=~TDuYMvqpMt3Lq)=Lz{o!hfB$kvw(S%Cb3xK^gSN!3YIMCl6UPREc&xXOS2^Tywm zSX(8~80UB+dNj3$2KsK?J!wAdj8#0bG?v-F^hM_F8IposZqu=!)zh)AZH6kF>0j{1^qm(xsVJ}8IE)&IlTJp_vuEolNiHt(@*+qP}nwr$(C@3C#$ zwr%&V?ur*Zs6h=^#2T-?Gcy1D=Ff*V)Eh}We6qT1h+A4@j&J*~oL2!hj>KQXb0#li zQ+tL_qH7`Cw_z7psyU3Qou@_Pj*-k)St$0gdTe!=;AM<8KMWU_bdbKlch))=tF0d@ zV^P0XJ?gD8BPIz8Y~JA6WGZjGb!J-0wmz0NSUQa36=_TqM~ zq4n!aJxb=b#j7k`7qw^dz_UodRc10vGYIvOIDL@1QAVk+dr!*08Q$;2cavi)E&LeU zvSP@d*-9ICXmYuI?=RjvcYQg$9qwiAxzS&0%R*{7a7W|vJ{gfe0bLX!1m+l?+8s9H z@_1oWv0rX-Re~Ma8>jD?HQ_U{e-$+);3L3RDlF- zJ&``VpOLU)>%hNv?3r`FwXGbu`!vg}zaE<3cw8Da>f+>bdAMRtL%^#UbA9hgtG43) zN?zNh><(8Jo!-*zVE;O@wsmLA=|zi`eV#5qdw2T?qJI84H%JJ~otw)vE0LIH8Ywxk zXf?;ZjYf)aSSTIA`8#?Qk5f-}mCh4`_cyQc_pj1RU`~D770M?aml@g>i`Ss9(XWx+ zI@e3?^FOP8;Zw7I=URs)<3&`hn(Z1M?7P31uXos6RR(Nvwwlc-?W$q*mmBA$lr3Fm z?YMZgE_As}gC{Fq(&3{$)5Un|65MA64}O&B%gbxiNbSm!8(UC(xKh`Tcd$g22y>*8 z?r|qxW%pxnhvsvL7xwOG(Vf>|^~zK6IUlLhfNl5Iwh|HR?{DL*^;qb#^Mvhscnnxk zWXwrx+Fvt!9z!G6+M0Lf>YjQA+?{%^k7;~L4727)djOBT+Ms)sPOO=-E9g(gy3$5K z=3hp<*~+R(1D=Se!)je_10~iPTkz(T#S1FsEV!Qf4Lv5-&J1OgtZ!aZCssTifz}^) z#rnD{x0e_nGrzxlmE-P+$+5RU6G268WOcY~`CVs#$#J8DRj~Qam1}W+vXXuYXwKpd zvJ=Ru_bovs$XWUnirSbYj}GsQkTaB`M1n}MEao-{o)QR`YHGlHmXKDj_)^3)KsUIS zup6N?dw=p_6OUQWIJ>Ta8m{*Sj&SwbD$;86uf_DGZvyLI?ehNNr9IIMKtrV290M5N zCS-l6(H~XpLKxj*nd{+Ay25~bSb&$a?!RHyP2)? z0dlhLy8KVo5j*|=R~<>4*qS+;GvG6@GXJL*V#H@)VdMDEkqQ4lkk7wstSt2ZTdt?c z$o*KakraFL%H7TSAJ=oc)^Z(dvw4w@!-ccyy0HKB>v1xbaoKh2oxy?k(&JloQ`uR$ z(p@?B-&haUKdk3k`|Q85o|ci?nTeN{hnN3{^{7#x5n=V|MZ?BMOAkSs9~oNMky#!A z9f6qx$N(1dBLOfm`A0-WLC3=28{Y2y7t6B`l&`F`l3!R*@GUpVM+;yy`^*0$%BhvP z2{`ua+XiTJg<~DyO6y1QQwOZ#&+i`vilA?50SppOPHrhNE(JhNa7PxO{XJ+XkZzcQu*AbEfI2vFEjvr~V*MJ`$DSwa; zfu;}e%-HJu>gyFt{~U(ijj_S$-3y%d1we`m2}^C!?_VgLt?^e)08aMBkH`Ag&~F_1 zI!7m4CYu^Z8^EuTGBWbFQx*-HD9z82OY0{D@Ws@RN9I~a``6-JZ%r?=w>&DLB!{UF z^lbk@j@AgjZ)st@e`M^@?xxomPB!(Ia&Y+{YxKoOl@H1eI31HMZR0;P<7e^X`0K>= zyH2*}ceyjx-#_xGH~;ec@S(?|-oXxRGj+C~p8k8n?C_qoxwQZnyPx+;Xkumx|6g9u z_R{h`A3aeYnSlO zFRJU;?%+o)=BJh5$1msfSCZz&(ul~;`12L;%WL+Z*MmvK)wiqjf4v@S>*#ENUutZr zq+hx6gqo6=(_f0WUQa84U!CXQqp!NVUL}b2j9-=T*oc_i>s?bRGY2X7{EEVos0h%$ zsec5}@%Ln{sTq`WLwytQ56ZjV>nB@y!hNrPC2A_^itBHA|BD@jx!H%F*IU(QFQ>jd z8shw)l)`sD>rFonsvjQ|+R9uw{=VO-VgfU}k6yT6c}VC@FMzJ|^tE;X=PB%Hzp(pT zc1MQBkDuS-Z#2Y3zueN|@bC!Sk%Lc0Mldv>9w(xZ(6DcRjiZTOspCrb@gUSxSn_v>qWu>0e`qz;@qKD0~Mhm_B?T zNB#$N>i9GGuX?J=n@sxDh4;*+Za^r zMBl{;be=QNv&WtfA;sl<-lA5RSsUq^=8(dX*X~h5t?gY($JI46A*;3i+C)c>3ea7} zWL!8o0_FolJ4-1y1BFz84!*A83o|@pDyBE7-Shfc;f?p0s?5LjS*E_=vsIz}W2y&P zijyV##OlJ71Roeb7r|*)>L5hAe}RT+enJp+4&q7{Utp75uw*B_BKPFJ8qUD^*sKY3 zzgu;Y_>71t-X9TkVRK-`%8@l0^M}m5G|K zDiZqds{5UIlxvfQ3l9Mvb)?wl$vP}>ucma-IB~?eK~b7fsQp7Q#SrMHADhg7GVv4u z2iO>iD!LDdhsPb;c0!J=it=Z;v7>jYoL#^y?F9#OXBcT<1T&U!}=kN8P~mH z8G$Y$!)n6v+YG1!Sa>SMmRMxP$@%RnJvPPjT2v_YAsQ)+_=yKQNSyDC92?D5Qw^Hx z`7Hz^GZ{me$^HMx29QhW#av;5c0r!JPtCsXw7qdQxZr9%F1=bnEfuQ^U0aU9H_$p~ z2%|j`YVxz3ZcPi@)=wfIN?w5iSmb1_3|dcZbBhA|G2T{LmFJ~s?Lu3^sF0Wh5!_QB z-yP8N*&=ZXU9kM+>HI=#;SA~0*kA&5YPziR2GP-=BbyeNJ?yNWG@%-@%z$dSQU;54$mND>Q+-3^AD8rKUv zt=?ctYd&sm(V5@uw{u~sAVQd>ynf9mwjxl-~ft>&1Bym7RoWbf`n#>waS0ariJ z5$?>WwA+xexh6U zE}F_A)me*dQ;MxyFh0qR8S{w~Cnt2{QK*9cvQKrG*{upVjb#=WPbSId7CBgz7xgYj zCo)(!BSK|y<=z$&7NnK|EXW9mrrVO?+GDq@o$abM?8+*|Wb4~LA?n6p@<6xCTS%Yv!RNZm*~GQ z)o|{!5YBESJG$U(>;v8498CE4JM zjIH4t(7I<{(olx|Dj=v7{N|s5kEC!Utw;o=%(JsrFF)*+>#tYw=2A<-5OO1ZBRxaclAp0ufxU}ceW^P zt@3Kxh)EjPB4Ol_taqo9o}zC{hSj4WO8hDVnq<&l}c+i18_FLU}ro}3)`U2M#tS?}1WY6??s-AbGbTkd@Z30m7gGWn-XxPD34_^*bC zzTDk$4~AyXevl{H@NuW0wL&!-bByt(9w~=3=WN)KC{P7XU*0_}zT_oLn0rL0Xvkdn zW+VvTKTZcO)TMqrD5RCk%_JkKzQ*Q#&(wULk{&f8^g~^Q9e>ss4>WDnRGlBMSY}aT z+LM+A_W)?9g+C0S1j<;MH`;i&AToqrVJA)azN=T%0hkYYy^%cuUDaYvhOO;V)@qQd zd;;ILm5hJ~tQV>5$J>`nb<=FCV`VhvLKnbm`R41VK+X9B4wWVg+PZe)sOj^(wB3Kz zR0HBTT6)-HjPvNs!J0v1=jUQ?oQ3@mn@P4L><%T(23W?$jp~8z3`sSuOm|8NR^yEF> zLEdGffk|Sa7@LZE;W||G`DY*oD7fMSG~WGHfO20QDi${q-@mzZxW zAL8MDw}JRYzby?WjoKxot~TaX)NF7Qf-1?D#2}YH5Xs{W*6`)41H$Auo+S{!zAdzW~8s&6JQI zEq!y%QEs&uZR;SqH}R6MI{BZPTQinHn&U9K&9f27Ex*tIrsmn9fW(-5&gLp?)7H zZoy#c)cTt?k2B1+3=>9;E3j5AM=3fpm>w*@e z6eZguikhRGFGTiRDR_`0*jCAAr4j!dDEkFq3)YNv9Kd{{dpaI4QHVJ7Jy8(f<3rW~ zE-5=ufy9|tl9t6m2g4_?ck-wkKiK-PzHF zhFLeto$S(S95JB%WXOdhLt{03)_@ZRM6wtH|2ZKEPq8;oo<6*T!BB*`T7*zaY8e;% zh`t2E<3;_j1e%XgU|0yEb_3pfd8XdSW;Tb4yhJy4w)dn1T#7?iKE2`~cRB$9*djwx zn49X2ke)giHmq~ssH8^?KoW-<*%g7OpH+4%v=xL7Ev^t)8k#n{(2cA=9lkZJ{j&r$ z61@MVK(YjnLaEn{UZfPutAAmHmb-494k3tYhVwb>qU7p)lB?NY;xi5HrlW7NKu4a)&l7z>;* zE{|HZu|5U7Oa}n%vsOB~Qcan+%b8AgTY@lg1@$zDs`hVJjWM8&8ZS_ zG7k_;(|{~NQAv4d-_cQsU-4tzcUc^pYLzy*UoqzUVZN+#7HFW zmggVS28FQFlOmN%+(Zep+4nm)YA?0x6Rnd!unw)vs(aS~^|#T^06>W9yn^oW)_;@s7I=d{f)zgPl5glLPR?Yn{7b%^sl8<{O3 z2g!+S>y^WVeAPO%X#10w^j&c|Q$QPt&K*p360%{JGjbNuuxc|1jtAGVAnqqZuFdX9 za?mRSoN%@zKg->FMD`Ie6T>-V=U1Xj#dS=Ve_a*PW7caYajgvFa!u9B*c*zNGrugG z5d-(o5-X)@c}hW~7GQWP&7WbXz+*OHo(c@xeiqW#bC83>31}GnK7X=UkFAN&T-fTu zF*rh_9nXsU;TOUPodV{(aUc#M(MWk@pxe_W-FI-Hoc@?DQmWQGZY|8ahj%-bgnlvg zyD(P%t&+L09&TA5=sZY8&)}I4Tu3)DC>V>@eep6Zlr9ueuL<5t#U9{toqj@#iYQfI z7dK&b3D0zO0%`-*$kiLf6ENZGB`;==w^$u}8@;x0U~O0fTTA&Y2r$>F060MZD~L)x zYPA+Djr1OJ?~E{$M=nl0^?X#68M4ldC|xGUB}_V{EI!ecPBbn`23HsA=zEzeYINFo zTKxKvmMdQD6#*DTwN?C(dYu`BZ9?|dv6Ev5RM4Gjx zHbcOE*~;wB^5PSn#RqrJ&MIOT=C)015I72NFB`JXkp-l8?1;(Z&KfxP_soO{ogCMP z%M9D%-J!-Yx~DY)HzVi`V~Zq5>G3?7pCIBMAu=2WURg}`zVDy}v<@m!0n6Po(Le^E zt&Yir_Suq!*put_dTwfm``DkHh&{7DlYmKf2;9Zj(r#Y(OPM6BwK<4^yX@L72RRq> z(bTh$HuMnx-0kW#8ptC1ocZ*G1&5Q{M3&u`L*(ALvVrGaZeDZVKmf;YM2`yl32MW={?l4*PXVA)dMrC5IBV)9mTqX$5V9XGjW0y@BoC--^qceK}l z&)6g8u*II_QD*b@aa}2i>3Q!)PkQ2ZxD8+X+?DKz;d>*&kN$dDJa3vdgU7O6VeoQ~ zR{f>UL6B1}Ou-|9`jgHd@vHf?RWPvz{z|OC}l~tTQ z(=L`aXukcBivH-0x=_Pg9Ogt}rPj*3-gZP6tiq5y(|~rKEmg#O;gi=!MklGxcO5)yK8vzwR8CMN-@=ORz7vxcp1X{YXi}oz+`qR1fAs+>PCO{^f zm}i+`EBX#<+m>d@5G}V9)vx9tqpG?{*&JAygs&@*vl&72jend(o?28B&|~*HUz8yo zXf`{O#nv|YjSmB+Gp_m%14Bz*r>dN}GqSsj@lAs9JBLH)K0fYoeGv&=~@Rx~(I$zqy& zleD4V?-Lq>TPJHxdW+i@Y_GO+G+fA-z9;74Dm;rE=q=UUK-{&$XV6b6q>YMDoOKR> zJg3iEDCUsnQiSvRVjLn`Njb<~_q;zSNQgZiZ8DqM9W+qn!=%CfRFUI-N6gk%+!!h}UMg~$ zw&+ZhA1^&c8`XUIV^<=#m87EB#v6KRvmv>8Pg=?{0DBIKG)D0eXVzbm6D~T`>3};n zd4UC4*M+~(_zVByy_c*dh|hUCqv%eyA#dfBMu3~4zjIa1P&Lh3q|o{R@?=Xy!)|Yq z^#X$58wiWfl8$LEdXFnDmPqEz=ntRWTFA9hlk2+JdsMjM9F@bRA_uXBib@W)CXa;HaD^a)=H|xT}h0#@iH#?qSXvF0X4|WKNPf5z&_)~WXVMV zqD>)Ry}jTTyeJWA6$DCuj%y13^kg$ z1>tccboc^AwIprs&v^6){DnxxtbH*oW1uQCIm+#28CW2p%-mUZ=eY^-$RQD$^btHXGVCYzqSCE&K6G&oT@ep_|EbX= zHai~O31`+gMl(xvm($;rKOVZv^ytF9wp_ERC{iC@rw=dd=RL2}AFe6)@tgJ(F0OjC zW5mX_ zVjpghF$}k+)a1gTjBdrSx-)?$Xd*bJ54Q?U@K&Jq1?dcSpQ|Re)_!aERfQsYM|Hj4 z0Zbxr&DBxbsDyKuOrVxS!598Ee)P8qN;K&cg>3!WcW1*~vw~Hw_j)0b!J#>~k-e=5 zEDIBT$2;*U%OD&biGER z#c!Icr!h?bg`o}e?YSPF$w@OP&Ju1Ed9OJPbXP;U-FwPMT!}wr!M8kfU)?jwf^v2U zU9jw715=yx%YX~Dvum7|w{Bg1oWl19qt0#+{+m|l%cHf;PoB~FmlEnAQs2}x=Rj_B zl27hcp?#`EO&CfxX(xbXetLn?0E|9y;jgAT2%*2a&kt08g(GG7IJ8zh<^ad8Rsg*Cm%$-sMm{eeO-174E% z3WkSr~5Wwev-hzz~VGr;2DhgidQpZV2VMtyhcWJu~=Gz5`zD z6}UI1m#);c(cXSX&z@JdEWXgubVm!AT^lgxOsw7sA+fd-2+pVAZ&^Y?+-}_7K$2vY zF)Gx?!&C<{8nmZgE3C$ro|i=J#C9YW<-m(blUakWYKhq@R^esQRG5b9TTRI*r``&) zh`E#I>ZbC2Y~Kpk6Bx-X=fN)P2oB6lQU#Q$5e5Z66s8-}!B=A#{H}GqDpcA*x*Rz4 zNiI7U1p6}$*(k>Wulz~hmZ~+MRkdaLwi8rLq7Coi&k-_*a3(zQY?CKp&n)!0V_U-U(q+!-nQ^}K>(LbIA?jI0 zbj#LP(RAMhJL>;t41mRIXEzzKvWy%P;`vH0aaKh{{YK!WErjAw#ZqU`d!q_d^$<2C zr+x7KQVljc)wax8mR6ft} zr{{?>DEZY-C4-?d#*;*f@%>VSIVZ4CXB{TcrwV~2jEjv5u>@)i!3<0Jw&V`*<*93< zq#;i$BI7uH;(v+oqi`ADV-esc-zwmVn#q23Bds_6!n2aH7d1_g4GncGCQ&Io6^KAF zDl%aM3kj>*$B6XOE(JePvOqA7oKrp%EYF$)-CC#F7mXfSV}cwT892XRc+v3#(4DrH zS(EBug7`*h@uC_4T`;w2ykCPVn525o0O^(^2i@@H`dT_m#4hA(ICoDFlY5pv6DLj% zMJRm?wOaqp^}}A1Tk}v)3|CNIACEb(=(|f{MzpFyH8ojl^3TLYVp5XNooyKq$CX_% z7PwEcP*ALma1L~~-rb9bNBJP=2YU;rWuPH)C zljRc6`yduLB#vT>w8p*7wcJ50Tifejf#{^s$D$r?FzCU%9*`;1{Ln$-2ZL;)+?A8n z5|>C9?{N+ZdLx4!+2gQ$Oz>-^oXaY}Gv6UhFaU9bqH17mg=qrV1r?+f3 z3*?LzLg))C!vGcv8f^Xc7d>t<_{kr^bzBLYzqu2&aUk*0To<_5Ed-kDcHjBaY)s(2 zWE-~A_xUdGfjV6nvrKhaJk+w2%@7#(js_h$gJ5{nTJCKzza&mbeO&=wjZ${4LLvR~ z&hsujy6xXAz@G@>&cm>tSHr0Fm|1iLukC7KU=d16Sc5;2YQ5AoqOMb|rf<}OvLHk< zcFj+#QmfyBDkt6j*Q(AIt~EQvN4qVrY<~X=lRq=VQk&vc0MMlrLEj905jSj1)gITR zCAiw?&g`Atd-Q&N$I>q|w28t(o4}@9QjZtE5_bBQK zJV?2|*&h`e{?AKvv{X?%m;weVotP(a7ISniA9^LP``T!(p9*v8;irP0HH{OhGmRe>9Q_f%98ykd z6h~q~^&QN2(01JSx>s)|KVN`9enXfg*t9S_a8WCi2xs2o`5w3xJbW&Eoxt@L?=+}` zgC9$cXbrP(bxI{=La8C6)?pS&F?)A@+0eITp2`HG5=QQ%f53Oj!I$K{N zLrY+d7|P9=QP0M^ugXh;E+806DcMP627Z}o&r2s3K zI&I+qU9LV+1sLArC_=f4f5e$!S?|&V9C?&{=PtsYa*3(R>}y?E=M_9oyVVSC^=rI1 z#@OQ)uDInVmt;|-*l&}(OH-33Nq7!ye*Y!JY1cYPo1BRd%c$#4EhTtx7IegY9n<+t zVZG5dJbNw?ZQoz)_|RaK?}SCKri32nyqL)x_TUodpP{bq|EyUb`D}=MHL#yB0Qo`L zoz}zU^HEtu#Zs*3b5_A9MU`J5^8nXD;NG_eUkH0A`@MmWZ!p^kg1 z4)mDV(-QY99%{HT|J+H$xNYML?J4p&BWX~yF|L(t-XaKpRNvPlW=Wx%i2oLR9bT|v zTZP0TM&PN}DY~!pgEWhkwDfZ`|Cyl7cKVs*|A_}8tVo-`bN-U&#P!PWKpPhCPLv%* zx;gv+F4XOi;NBhpYj|i6Szn@gc!ArNE{dxTU6N*9g`T?9B!QFiT&5 zWe+GwV`jKyZz8&dIl%pD8y-dUjpbHv(;UQ5!V@G5LBB|+ewtx$B1eMEeN zi-G3#h}LvO-H)5HT*F!8oV!@4mkx&MYihPX-sFF>DUjW)mr3<7e0*RTGy4+TWx zXZ}pkSx3^u5`0l=H0jg()suvfBBU+GLWI6aa?S9ce5f#f?8#BgH5-i;Ly zO+eN~)NjkO1@gP{$*O)Yg+Dc^UQE$T+$821Kibd=;buYlTR{xHbkce3ii($9>H0|r zE`^-U?4zY)M=5DjgQaKdZ95$sGQ$ET#TH9qY+shx6d-|UdJ?L(1C%&ZXKC#!&oWSG zNdM@go3Gmx!L$}hX0s86$W{>!RYOf0_cKA$AJ+Jl?)S#3K3g`tr7#?!aT=C9oxnw~%+(%3UZ`x&=eta=-p)~sW)p>(tc!od3M za#y;5IrxYbOeO^4sfuqOm8%y{hf<*EID`ms5QUpBOkmT~%8p*tnZ)4W)&_aI8|H)jz$y((_xW3z0av|Ze*%$j{8TC^2ucQEzNO~oLL(1ZHW zz)aL5@pwrPmbP!^QD2P4E6yV=M~va^aBwj-e0GFj&{FuGWE3O_G6+C5p$m?5|8SrX zc@T8D84LR|mp}`md5mzd8Emp=O{U?ts&fEKj8y7Fdb0f4OWhCovAE{=3I4z#9$D@V zF}hI)eNL+V6Q;G$+>^MfX=QVeBlxLMJm8?G(r&~tXcp>hipX{3U0!tDlrm9EOxJth zV*!N2<6A+hA8`o;Cw7L5rF*hBed4x)@|tpN`Gzxu<8oQtEd_+-u8MJ_{zaaX)j1MS z)u}i}7EsFKiWgrY4WXEp;Ai2Rl{J=0aMbG}8UBed=SJQNLzo>C=KEHUiKa3z@By8h z+Xa1pNuzd z6B?$hD_4@zC(Ai9JA2OFnm%y#?axS4f9yCUHzO7n(Mk8v)=c6ycg`a6uDKI@JIK&I zOJ6A%?~^UmHSLS2;M3xEX*(Ra^1IC!Ku&wgeD`1%VDXcei-vPtDW=hmxe_~T$d`l z-lNDsP59@l10R^V=a)i>LfJHthaJuX$_5ms^A$`wDRhdun@2hOwSPO?Z+k;Zo~F8v zi}0QMk1YIH=4iuz%TBz_f=K}dUek~M9{UTEvzun?~jn~Qm zH}fm)BfoL)SN^Kcn-0@mA3LVEBsvxt%)WpR&H`o7n64uvo4DIb#Kv5mp5pZWi7958 z`_kr(-$l!*=_F9I1Ii6-kSb^A{5t>(dL4)B(KJ@dMCD!9>TY=w!(FvzEmA}`0EiUC z?(1Bs>O6l`egOT|bE$e&Lz^!I% z4c)rGo~H{{7@ms@?sV$CzaGnpvzAo%r`wSts?4}v`=C2ui+GYs37B_s5^VfulI1+% zN;XJq*5n|RpE`8v8Z85Jv^7gQxLzAf;x5=)(Uh)bfYf!qy5joHE^^XtV zmk8926>}@@hTc zx~3m;#QeS-Ua_1IB_g#KmxMJnZhTkzdO5zj#I}L@)*eegn?$qR)M(oo<6IMnyvrJq zTHeeT$Hs9jIMsuOXMSIYX;^>R1|Nd1+U_7A=fgB@^*O?o&gs$t3|^tkW(hvRVQJEt z>?{%X8f!QH0?>#otaY28CQI9o-ZX8NRepU`gi0nV2H=pQ(z+unbY_hY4GWoAuv*$= z)_b5e)FZq^+S2lV-W)N}%!% z#Q3D9POp0x4B`5{GZ(E3Mn;T~%n%aEh(iP|eZSW^S z+Cw|Y5BphA$h?T;+ViL1X`$|rqT0?|H_S-HpVJuLZag;bFrF{djVLI~bA10ChD`io zdUzDq3;4vT*3d!|aF;o+TrcUlwPJp(F^0rG{x3=O?pkASzT~sV^j3Xgw(bxC^(H@35$Z%8HEG#U&7{=dnuBj2zZQnz=f-<-B@Gpt##qy=g)mWe4+NZj*FOGs%D zSoIs0>E(W4;DU6hSLX|uoTEhP!F#X?Il06mwmiE~mPi&EbBu~o=gn)`Y2^q3QM7C$ zJRAs-`1JgwC5y7=`dxf{z?=?gK6^82KnAjWJwk zRm9Lbgjg5RhKzipqiC~t=hmEO!eT@g^$JW64CZYlfn*d^N<0{vu?t&4J+}$kX7`~U zHBb?_m5mcQWj>LxwY=fiy53h`F95VG4<85h7;;ZnwcNL6>brZ8Be!PqSdZ>ki?Gx= zFTlwV>~~^m=xt8bWpj8hbMYl9Tb7fQx0FN-WP4m{hngKC>w*qON?}u2%`4k<`>Jgr zy62JoUc)nfDe0tN-TMVmKv-9V%=MFRv-x_0iTOREARQ$vgA2C+fHX(pGzGyO9>sAo z3*5}m@9K}tX8BrX5EKIdypa_gaA6el&__y|_O^;_I-;qW{SA%8B7?H0L!^?KjaG_^ z7Fy9Aqy-ml4a6W2l+rsZ#eSqjl+r`v4pzFu1$HJ(znBmKsneQ|>xkzt&^jzoPB`rpAs%--@eE=_$18`ZxIlo3xcQBM;sd6|0lMQJK(GA*zqyiVH=8ifUfEIfu8HEBU2Sbpw zA>H>-T@Lw6Y%bmh<`|=W@%+5bNykjh*tWxUFc9(R@F-OQ|7Ewr$K9TZn-ky^mSrhG zN;S-bZK=FMh#0n9GZ$Q7*F9jPFxG1lksF_QeZz3vO?aWb1^#_z$%cZur?(-){jzw` zu?{~T%ng}=4zZqR8E^;;PS$~HzPB24!f*o+NXZJwGx#@-Lebf-Dwt!I2Gamo=b|M> zfy>eDhL(u}e4A?}iXB+q$eM|(x8{ZyRNg7NSxj}p_D%T&m|1;HZ=yxfG%%}>7px(n zldihI=iRstczmsU^1b{pIYAeC)1VSIkOt?5a*OA~xYiJa;Z@5BrMR^H5 z@exY;EM|vPc7Q0VLH)QFszS)%;!^VvaeC64e7M>_ zzbcxgC_a)MUKclU0+hxj;)+bb%rq!i{@}A6OHFQ&cyxEj_19BMF{*gn!y@sw({HmBH%6!Z8aEYG*;TeIUew zXBZatTMu2jNrfo4{vhLV5+-9ax15sb^)+bYt5bR9d`%s16O^)@Ica7I_NqKVCy}~08cB}uS{55QSdUPZ?k!B-mC`%jHu@1~RN$|cwIW?MS z+w1_J?!MM`nG{XBpMm`8iGy6e%?MS!yagvfced@>$5SB~BDdSTYF&83MxIb2nEbRS zE&lT8;W?iM;tP}5H`|N92TN_RcHz3Iv4~Z`x!J(1O7JrmQ#HYm%k9b`6|KhV{X>I& zA9?nM#oC@hROOGxN+j}^BL!J%MwXl*tv;evU50(kW_$sLcO;hLlipPXqz8NFF2mKC zvm<&xz#(sZAKyTu6{u9dB)``!|3x=1Vp|H<1|VUMcS*ok3<2tt$HICXo*rYoKVDi7 zmkKka-Vd(!FmDRxJ5!xJw-BAM1-Kj93JI3O@qU9@<{`@*Iipi|Nl?aDW{aVT2bhhi ziH_g=w5+1Zhv1twp^^f6v4o-dC0PQH_~Kcy88l#p_j{fH93e=0>ry+b1Bd39=xtQ; zh{uq26*vwtZ$Mk(anXO9dB-L+2c-jPU`p`e$ej2Zn>XVs=J}-|HfL>gQ&OYTl*dkY zCE)MPp#OBd5ULN!>}hEvU*y;xb8%o@qp<-$_C0JBS(WJE0b6p;AuxNoF&kAJX7Cg| zLXiY=0WhTtxr!Cl^!W(XDhq55LKQnbSruTy?6Z$TqVx{}y))Jw64dy4xzIWsxKVam z6ZH3^cqD-pg1$wo5j|S)oR^`0vbEQ6K*J@}6d0z0J zJwT1ti<;C&?EGPchwq74MX{+OZ)4m_0AJ2sVAQI~E>yoqiF(e_oZ9H@Y#%QWA#aA7 z5ttAD!>^&WzI~IlAA-4qQV4QT8O51xE)o1M_$BR#rx-2B zylHqKE{mog?1Ierlr_hxTfW=y1?3yp*$^qn?OaNyQ`4ZJ;-Ij3O%xE{4hFMaOZ936NfA79 zr%J{7cvV4eaY2LpI1450U9rHJrKYWiD4Jj^Nw%3Bmct!I=Mu*KmSFN#ln%i|l}Iuz zag;{dFh>R|QZAc+cnYk*svV~=3I;?Ae$g-b8RVH0N{6x%BWin6!uEN!gN8?C?M~8M zZepl~@${z}`|93}ryi;}w9y{?Ch`nJWN3~+Q=u9)l!Ar) zU()6jEYW%^F>@LJHP0Uf$>*dNq9;LH;v2yI>3OSZ(no;d%f*>zl@tfAX*zF>o9Gnv zx0J%(-L9yRRWj)+hxhjWX#0LDmu`s*mfrN}@Rt`Nr4k3#2%&Xo4U?yKLix)Ej|HP1 zGyWtKiP|$a5+xm6HUEKa<4|E_6Eu#NSQ%V}pn$3$k!Ra{LowQGsFbC6B>PR1r``k8 zLXVb?ZyqQuXlj)(yY*CSihD=cOCsbpH<6bVbXD8!mJ1>%2`L~skoE=5-nIVmSDxuD z6qyx|!Q$Sj!W`%JS7^4S{7rfCXrLTkMa4ZP7H*KJLM$1Q;mxa7qy&n?lU3_oE{42i zl|gO1OyR0I@x3v&%3u{$Z|_VSOW2IF-<_USIwUBX?}$uv-})@uBx=IGIfrQo!q zV38;P42K4kDdkYGFzgMRRTFCiHb_^fw{*K6e1U3K#MX6ydJ7!{8*tt7rx{fC_bxj| z&}!Lz^_ayEpD{W)qlr`3=g7vH{9AnBOdYI_{j;GX;R#k^^I@~lm7pI|OthQV#yGX# zB6o!bh-&KC3GJPMpt#QrvgjoHr@LQ;D|-BW?G}lyRleGdSYS{qT5?$pNQQPR-obE` z?+!JlTu|fi*~Ga-nw=bSByI4jF>8Xw)~@XN{>aKYbPw5evtNntOlPMGzS4bLmR|QH zdnL1)O#Va5ft!}A(n9=zE%(6ePcYRUb#KZ5`TB6KYp}-~KH?cFDEeSUmpw3R|LxTd zg16btC<~+jaJ=)qKf^v1g+LwZnpS`zPHwtUR?&zto%2Q7U2EmKJnt}g{$y`;;ND+l zaO1>5oSnQb(nlW#H2O1YGYt$7@hFZ_nKu%6VG#*IyTCgu;+>6~S#2dlt8az{29d@) zUIX38QGGY*#M0FI0WFj(jtlkpH8@T?;{x}yEDBr1v}I!1X?&Un&!d_8Q}}{#nBiG`9=y=*`p|!O zl&J%&mt{i|XJIn81vKk7fUk8a60W|hazXk|CS&Sf#K~gS5ism{pbzy>=O>a@`ELGd zW_{#6NHF_D{L#X(U|sRUO#VDUs{B|xNTgjih&0afv)eN1wRqz%;mE!CTF6hAHJXZ* zD07!x5ar!V6$=Iq`L^vC595iR`}`A~PW6mp>awf)ZTF-8_wmHf%8)|$z#ZrZJjRneN^cv4B9hJ41t@G|22)rgapc(2c3 z%jZ8f7z1asM|7nUU`dc_A;f{q%V!h$@=tgBxetFMIVxPvNl?ZrWLcf6JIL4StSQ%O zei7MbGDy`M2YFdOMBE`d$ndX=vQu%xO1e-0;WE!@|Ipn1Ka9O|kZjMgHaxa%+qP$q zy~nm~+qONk$F^aZ_fE{-1ok3oVfA(qpP!5t<_mo(H)stS@}FW^kprMe`JsR zFz-eJ%yc`#rk2YRk%cWvhojGMGfU?Wd!05t)8LnpQC*7R#oH8YX_nvtsj>Bk-O@tE zubp-x)(pJm7ze5<%Ep+_tqqCzRj~d>ahfkdZQ60e$GkE)*$%@_5#_+9Euv($9;5Gi zm8l1s#7$Y_MWk`9@M_Da$C@Z6$y`dz6g|9Ok2)=#W6S7m^U~n8g<~^o+p|oiku`OD z(>6N#CdPLIU57O%x3+SC85~Lv87$Clna#PW!zo(%A3Cv3Qrqx=V3Dzww_`rVu2}_G zrbsASY}l7nd-fg5wq8;K+J}z*&;`?CZ(0%M-2ZATjztA6R$myXcjCJUb!NHbFQclo z;khqCkMn>206%G~c>c{SZM-;%EoxKIrEs>&^+755qEcTpK=EK6p2qBnJtJ4MX%%&w zi@ZdhVrI08R+q11H+MJU`mFg(;*uH$6ImP!!gG=}3z9Zk*=m44ax>@+TR-^A<-JQk zMC1sVslG%Lfhid{#~xWrI8}w+L&f~-%fXCms}pIP=1f=y8S6R8)dgDdPedM(g?-t{ zkup$WXipOiESYz}?fRi78D;|kkwE+Pc<0~j&3Rj#K8WYS5isT3E6Z4N@0u z8nT^96*vU+VUu#LVtSA`J5rbaC zqGI=k?Xm7b*ofesnJ%9QaNb}j2P3%T?W(W3-#9!ba`1QlC3CEnIh!>@AYLxyD%Ml* zo_^@cIOk-J<}IX*YYZN2WTmWwwTD}rE9Gi27-EA%ED!1`$z1z-=~zn!T>~+$k4-7c zm<%Kj-ED>2 z8+JwF*|ntB<>{3ifPeR7bAY{U7@jctc=LKqLwaGt6*>5m6jmjq(OGyFq=+IZIa6=B z&BE?+QegKygAx^1N4Jz<0ohMRXZN8AGo?QOL;U*?$61N2)fmashSZ2JvU)@zKNT>I z0}}~mCvv#EirF45I$(n;%xmwJzdv_fu+Snv0aTu;LVf)x)My)}i0JJ)do~=qjEv5n zMs;T=n_w4z`7OgzLv5?#6s=-|qFRRyqo{e&@_itxCl8;yDvRKvz?__1;ya2t85;kQ zsnhncs{JYO!<<2dopB(_;Z6=x@EJ(R2pMK36X`Z>7-Tynu{+rIIP$%cE-T7iucTuL zkkg{C;Aa|!6^#389sy{I*dJy0DZ-JZo*z<}El55TK>NNFx^t87Zkgh(1?=`ewSayw z1n$8VMU=SOazZp*{)pe7F<_Mx=J!c*l4Fder;l3?F z?)7Q#K9c*uaB%L3dS9}BRMHnbx|+G{hKBJa7Yo@&KW({r+*d3NkLy`sHRlRwkd!0t zvZkyR%ZRu^%_D~*sG73qMBQMcymcngVb{@0<3Gj@`v%LWxn>ao+arDt!MkVUj%HR8 z>BIX76X7s#bg%pJ>dwoKV{JE6mpw#1ZTlX^38yrOEqn^B9d3n7FJ%0>R_)(lSCT&> z4+eLcoygpuy7l~C(ebqD0UmAXPxw|k&CQH}Mz;t8Uv?L_?CGV$3ib#i$Ro`ibEL?y z-nKKLten(>dP?~BV@RM?INwcOJ5@VKbqka`oZuOE-Z!=8hC0<__YukID|YF_R!wUx zL6PFr4FQ1tW*GiIVlXiM4-AI?1)=T-td8-&A?lcZ@aq04L|v7}h7GnDlJ|+~flTvIaC%@`X7o@Bm@I$HXOh_;BvI!^sVF$Ldr;ZssWOEiUBGC65xCu zk<{7}#OkC$XvpSGLID)KvV0 znbdZ{fOGqRB&&;BSXxb5TY9z4&p>GGWX9~^H)nZ_aQf$$HBm${hB}Y7jKLDF0_y}o zQXXOyZT%CK+$sHpnQOqCI_I^xzU}$PPfn^=UE)1!C*ojA$&|Qp)Dk<&rVK3zK>an79=+&l{%ev*X zv|W{2A<^oiywjiP8jJ7C;rTRB@$}@d(51cIt6eLiw|eFx5!1c;eLo(AU=1l8G4B{QS%W_B*q=;_UdzV%v*Q#*3RFf!blI z-`CEYm0WdVDncs}+u{E4x>!9fUhZ(gq|L@8 z_1@jFXE zqR+Naj-EvxgMLr;$Ae<=S>lirrzQGI+}_i9xjJj4`GT_VEy4s&vBbPr`t-#{m6%ao zTbGrJwr3YX!;zOxjTeLt_V1m5rKL#q>sxKuG{R!Np-kr!d{_LjEw2Ur2u6jpSd8>o z!o#spv_P0}Samo^h_bL(c=PB2=P7IKD)$BFKd+5tCx;$OivrNotXu8DrjH(ZG&$(O ze|N0SJBfSZpAUgwv$d+v&qhpe4cbAN+ap{Ry%w6IorTyUF^!DdwOAQx^|f%RCRLY| zOA|VIQshx{17jtu9>nEcNPGL!r(bfL&L7*hu6I&iEiju2l8zJXBX} zL8Poe8Cc6A#Znd<&?Jj2J0hS(ix*6mg-ES7_H+t+EmIoR4;r}vD94z56)ox~bGYgS z`B8{7VGI&=-Wn>+bZ;35t>{+v=68b9cN?#_AI`Qq$if-m9s{CXd% zIpI+5(W2Yu;oS|>_ZHJ*Z*UyEfvo>ESZ2(fJ?Om`n9a@ketS7Z$>pjL=vXrGYBkC^ z=NfbKEaQ#7JF)7oFb^|+z;@_BC zF@L?61ziRf{s1VA3=xdNM8J|bJ+%hGi|ga&@q~}$QUOIF<6&S#i#jO-?WxFP^6o}f01E5e|EORjvxyhsZvW5*3L0aG z8XNU9kDC9c)QAAol#R`+mq4gsv|T0{AZjag8^KjZqpLRhvV;;Nexk&%$0|n|KvR+C zr}3vM`Tf<2rN`kCzmLV)CM-N#r5}@rq+tHdOMyuRSmO8BN|{pP3Q>uP6#NYmHfwfZ zCEEd5mM8?A0I8>I@AI7m(z^GPwzqd~Ts09dTkmNp#SvKP_ zuEp^^II(wIzikF3y!_;R4)4rHPT+w&{aeJ5p?N!INm2(YMR|MVOmG+3Fmi(u+(Bxu zmZRZ>1Gafz`&iA|R=mNRtJc^#^VIy9U8vksd(IN`r6O|~BlDr(=Dhi0cENIQ9DxT$ zyZomIm!XONef{vd_p!SUt#3iP0JVv~${n-I?KFuW1mDn=M59cDB^o?&GYM!nHr5<9 z2RD!|1iQB@PpO3&Nu1*aj3S)k1*uM@I)5}B@&P&9MEcRj5kC~ft*zOeAd}G` z>h!&+fjQO)UO5`C5z0*>cw@Rt{?$ttOcr9fNRrVn#1>CI} zPdLj9fzgGVG;Z`ey<4exk&H8bzkzr?O&WXP*@(@2LCV;H?@=aQ(j}G(Ss|4uB=^;& zEU1d*Mgg_lT113uu4F#lqFu>4G`jpuaLK7Sqc{|igns@HxQJ4ESUG(G4d4OX5uOlP z@;)&{k%L8Tg%Vjxvp?dY<7skEzzghjbK}NM|BIfph5OnG>^RNI>NC~h(k}wIlVbaio0a~3~ z;l*A3mZJd5k>p_jHL?LC5Cv2KG}s~1!VN@!F&2a1pbQxmq#-IqQ2>IAFs4(O{6f)= zFaZ0P=<#3T+<%D$;37Yw#V-`)h#yhm{}t6E3c&t#)ghMxQePf4y^LUJZ>^mlaNX-} z+dV3gotoU%{YZWZwj&c2NrE ze2BTL6$6l_BLvxyHJar(W5Dk85ADB_Z{hT=ZPke0N#bKXCB{r*M7k zhTyCk4R0dP7dxY~9|m4jPq~0K_b|7H%0rlgyMnQ8V6J{m_oit2^U@h>0&eU;S>1=y zp?((=Ix<@1YSB#heuINg0b2j3n1J(t;fH8TY&C~NM1vHetx9J$%Tjd%+17xjn8v9m*m^%eM91k=qK<( zU-ek>b+qs=y|iO0dKx2P@HkH6cF@Nd3{` zIASJkiO(;Kr!18in5Qb07@^{VWJB71n--f5e8Kt}>;fjD0a>Bp8jf#>N471g# z$!phP@cfsCH8}H&71UD`M?E5;tp)R znAntCR1mEvmoGU{m(Z4)h|qA$N@JYB>d(v*Dt}`II)Pz3{zjpJN8Li$tm1}r9xi>V zN~v+$URUt^iicKv=66uwna87w&;+0jX^th(j4Ee7jgO3gQk_tzMi(w7&eo^ZP)JO& zLCsg86ONoy*mB}Gqbp5*w)iZeVcU}Wncg<`!o)}{J^t6r-RF$z#=5ra%MCrgPa|Vj zwD0@J<73T@t@YzmWKGStO|13%%ge=u@0;}sU;Pi*r--0a04o$8R7YM8Id$+|b+1FA z03qp?3ACUIIRtwED?~N(;S-(sfkxbZ!4)LApaV*n4G19=9c5gh06U5uNFVPW&1v2) zEJ~ET86+q!N~eDSA{1SIULcUEd~tsQ5C@c97rGU6$neIa@7LYqhHL6y`rMwj?vLAr zo$u0B_yfxN0Z_;lL<`-h=1M%ATrzg3czBvumXVUaXuZRR=~_-cXD#UEunJmx<o)W9Livd%y)(gDI(8Y%n}A?j5XK*+C=LNvqP71Xk{Y}q=I8HOX=Q}L;Jj^N zSp-{<1H5(Q>4063n*6jO#{lL%lGUAj@e^#pr~qq9aoO4}2rvrff6ZkS7G;m3HHZi< zB1zV-VU3%-WgV3q~^Fdoy95Fk1{gz); z>TD$qG#4N3eL7S_(viW>ay?lFW4$(#=AOSO{itqT##9Nt7=t3|GXpj0mzY%tbgu_8 zU%PNv+uEX+bM@`KjD^dfWmeqOEZ%#BbE@`hpw@$W4?W1<5aYTsHGenfuW9CWkc(ei z1D}4{gJ=@d*&e?905a`~OE@YL)H6lkzz)*#=Gr0;>3U1w*ZGWMudtPi9}}_RWEyd% zpV-9ZJX?X9lHqlm3043x?XLL#)@D64- zM=48|pme7w=i&W2Ht|LM?-%4)4vIFLx<82y#jK^9ztiOda~F~@Td zB>3aldh9r)*&dj-dCGdWG51n>+Lv+^?xR>NwG6_cF8t`PUMvdGbf{iA`mNQ|meug~ znv3iC_`9aUG&F*VO2dVWlg()W%&@{#2}NNlmfVynUN{&Nm2NH1FwiOCG6%P)=nqyy z#mZWKVA!L_NHa#;2)|p5aVEl<$4EgS1g1gcuXTs?UdG_b#vx#Y6k3=V8EkSW&$imj zieq_Jt}+9v!3~>Z7Ic`?_KQs6B^&u<3`|AnmN2Mc8Kcm06D3kQCv7@K=TfRoiouR@ zI=PGUQQo#Fq_HYRhhzVoNnr_S72v6;zH(gMliU2}eJ?trzJ z!%+lcdR!!~RR1+&Jts_#^WS^8s3w~Jb1J*@DtQg4FILq1I}Awdn4-{2xXVq^c&>i<)&3J%u)VfFtDg!LbARRpU~ z{8)X2tr^t^_#lO@2R}Uq|4JbULjK)g^pH5es~|6*^6SQHCFP0^^k!DaB1Px((m#&I zyJVVce%MyH4?F9Z;MlVv0$g!*h~cnChNWzN(VbG+N?i1x>Kcu}D&+>c;f^BV_QnVlU~-J_?AlwK8S!B=cZF zi>j&H$tsDp8RZ2f_UbT5Eh>|ukedn$P3|qW5UeqkH{&9Q5VZTI48p1r7*Xa>ldW=o z_nN39UPLUz#yW|#u!K1cxfzKV7Yeb#Ux?n0LfJ3yhk$E~0keSBF1O@=%Bt34yd zP~e_Lyivq3m2j0uJBe6MiMAJ5w(FsonLRoOWiCrO&TTp^D#I!rM-A~QAD0L1Q9Al0 zK_+uDV@C+prNxy_wgu!2v&M}QR}i%q%^st!{)x9n-Ljk?cAG=Ap0{Qf#LtAO$T;s>Dlk8V zV3SF=mSWwC4FS5UW46}8)ikb^L(OxbXPZYg@I*>dsS?5xMlPRnn8R&Zn%4VSE6D~# zt12G(BnxVI6q))yU=gX6Sq$^FO2kXWMbucCsxd2>JWH6ZpsITB@`A>Y*!XI*W@N$i zi{5pS^cMYb6yxnkO2s61aK&PZd$?k0g=5?*ERl5AEiQWgA7lSEl6vFo)9g~czTeZ+ z`Cs<_;qhK~XNT+Q3SF1~`+fQ8XIJm@BiDOOKsC0{P6taI3 zFa_cgVK*Zw3ZfPK<8@-ic4tS?>+@)V9sTC9q~}|q7XKEZty3(;1zBC_Fk2l6r6hLq zbfAu{eo-uoFY9ry6rTQ3zXX2b=d1L~;JLkDq;tdLK=vrYHX-_D5x5|bP%(&u3lPd% z5Xz6_5C0TUC>P=t5#7dL(2Pd$Sl*(w$s&0k+J{}T4B2C@(Xr0B(+dLqB4;EE&xPRL z-6ai3#Ap~K$j7MNEImyMbP1?!=rz9aLk9VMGufC+aK@Tv%T`VPn92EvEt~TCF>tlm34)XkMaQ-kZ_N-o zK6lZ?s7)ybtW)e-y$#bsR41j3J+zk`!geeJSDP?Sm}2EpGu-d*VH)N2rD><))0D(! z{UGyVRHucLg=||0IfQ3@6+L1WP*ZO04x$Ms`4(@9ge$zAWD8drl`ejg(!L-hr9(LQ zuTGp7gf$7RhC!T`beahgS*kL2h((Ry#x1V6t;SC`N;2NS4B`AwvmA-|$ zILTyZ%0S+VW%%MAC)*({X~3;|_f1Kl1Scg5;ad2;zf%B!9AXhWXcR9s;Ab&!!5GdR z6Y>|xJ3?U83+}sQ?z1-J_89q3KkxsMfeJpWYt zV+s~HIa6jg0H#^@0>%;VG6|akGi>+)>n)m^1JAAjOtJwSbj411;%{}uzHZMzDblQO z3M$$`vRN-bTq246O9iNwPW|b%_vEuryE6Pnyzsr=&wJMa4j`GBUF*z3v}hR}N;fI* zgv&C-v;={P3?Ws(g!cswARdmOXjlmWt(>4K!mS6!Ck`c}@R7p9L1dI!|_V>j(h z4Kc%fW?|RHyS(A!F+?FZ2&dqxl)7GcFB~DSIPdEf=fjJ(?J>()$_2X^#tpsdY$Ar- zC8k9Y?87<2Dac+l-9z0kJ5t+&3>#?8zv|OtK63V^{0G_fwzB19wA`-s049pc4O(ZFWNI1%CVSRTItTkej zF|APDKk9^J3aoH(wN|PJaN1Vj2^&1fO+Muaa#u@ateOZg1<_dBL@jHKV$BE#pio0< zMj`8jV$IR07mur!##-Kfy5PYDm;%wx84S&oMY06Dmq1eeEoR?K%$&X8*N#GpN+}1o z!g@5toOY6{>tFt|Luu{*=nwqE%pfNN^Z)S&I5=4UX<{%~?Z+PwgW1}tImL&dOD=x^ zFogIohhT^Xh7fQA^7W&%7~f*)blK|i{A@nnNw!RGC#1hM85Zh{jN$7Bn*|Sg)xx&< zv{N5flgp+midUwE%$eqG8F2)N&B74=ZdeJgxmSj2O}E@e15EEKGa?G~@-@%z6Zb6) zSh$SC2BpKFVK&lO4EJ`ZxzR?zA}sqh-vayemr;e}kPCAItyP0s)p)bIm`AlH?GRhy zYX7>Dg(j$_beUC?M%B7`h1x^@7F*%!u}Nm8LjDw+Yoz=|Z31hNS!SD(=BkOwTI0G& z-MfZ$g9|kKxE)KWK(l zAW0qXGJ)hzlcx*?Uk9cT&Q=GeS*I~LZY`QlJHA~0mws8VLfF`{cCXbKwwcXFJ+Nw} zJ^IJX;W2<^vv@$TtgVYD09zLgQVYCdO=Vq`YGA7Dvnd%sTS7C+tm@OLN>M1njjOLK zr>!Jc;bxjz)eEk2wZ_(z%C6)>+n6N4Zm>SKkF>t0$Xa8o_#6n4J+NZj6V)>fzEVSo z(iG)Vu7yb|2tK{0BaGFq(9<}@&jtgyxdv1^*L*k@8Rs)NI5 zr&Yt}A?TfM*Iw&3@f^0kG(aSdRuEbyz!q$Fs~WS3{%w|I4$HI>FE7@TGK*!T;O+JC z@^bqx>)*Yqe_{gs`hGAFYY6-P)-t23`}Nixd-4@pL;roP_~7w+G2weqjr(o?dZq|M z11J6ga{H?nrti=N1P040Y_3i4ts$Z8cb|QcE;z-W-+pv!xpi@GbS9zsu z75QUyX~Csq6XA^;0;8Q=9MCqvNe#GJ{3H>|HlR^G4p<+`oE;R4uWU~`LLmT+q?Jw% za{Es^rC&ROCyzCdr}y}V@OI!Pvu)=6z6^VoGd1aK)EVPYraXjY5EePOV*V|e(vd4b z;hlT%BbnjQk5n$!$Gj^;Gs{X~2OzU+A&tG zWXRFxeZu>#IB!Li+TrFxf+y6b<1jDhbK_wS&~uW#+_bl@!w&F|w3GcqSkVoBO?lAG z{rm~}?CCVKYBTLpxMa3s7INZfnEOyMy&}kOdS1WFMeeM=P9haOlUTWTER_dzF}2s>TX|xdu=OtB+uSgShc#-^JzO)$!QX6)PnLc zpDb$(auR1r1yfstku3RjFB9jj)?UbZT;Hoh&<@rKqp1b@ zlH0~CUl!df9NS>h6lurbst$Lz)KfW)5-RnUOl{2|CCQVxL*5!>xjBV_Lg{jm?~T%Y zw0$M_lA9&QPiLb-47~YnDgiRN#yNurS@Yqx%zshBX4aikQ^tx)keGGRo{iJJICE&j zzg$xsSU6sFvlCm167{7RE-hJNNK8M$Bdx~@-rJ?Sr``DWU9c=)7{UD*&2cgusT?fP zTU^pBy~nxu9=Euv)?nHeCN3Wkrge_<_qXX9TEN*;C#QzCw8+@;b2V(eOTpR+%#;9Jm}@koHP*9$zOV&v|2d`{InkWTHv+C;0iP z+)HM?OmjMmUAsx1@j;pD&y1c|%jw1lL0?%&uLbhG$x5!2$h>Lov_B_dQcpda^TuvV zU8WOFp_$2&{nHW8y-IPSs|;lv7uZ15#I1 zw8J$0YkXwF&Y0&UzyfiEtE+a2@GK8A0&E0(vr{^|f#z-Edpwq2d=gBLlBj-_)#!@)cl|xqZLq0CB zrU~9wv|x0GzHI5F0okUyaJYo74({wlenDkLUO@v&)Z&yu!%O9W#v{TW8&cF+1lDXY z|3W2SG1r!et6#f6Q zsn79$ZR-DXD$1YmzMNzXc56j-5IzmEYaei+SMPQ_t?vcgWG)iWP*`qb@ZwPr`A^pYoP3YJ%{<1Ki74aI) zh1}mLW>4gCBbI^1I zo4N&>LKPmCjX=2NI;Z>Fb>b^Sfok+le~q*kEc?ngBGE#cEQ?^F1GdpIK^54M_X0>> zkU+y>JR+Uz%$)n%)ja5h+FQdzF0NOb+z7RKP*U>f@Prlf=yD1o^-;?IL^{(4aOoB( zCoF6H5=5&0jY<%2GYl1{MrjBt9x1k*Q3^=e*52yeRRmCGxmO8bUP@O9U^een2lS`R zq7LY=+~KbVI8-nyK_S%7Q>+y_r!88nT7c*LTj?uT`ML`cD4#!vAM`ub04?}F0NrEdiqGmyz3oK+psL5^W)hGkWl=PK8Z|nTUqsee<{B8Z+8Y7&rx$|sX~d8zApaaSx7)C)RTb`K)a>o61<%D4(KwkRSNKKfb!^) zTAp11&;fIW0$PfxQgXWAjr9xg2^0ZUFIS)j-`DH&Hg>1`^F9(SkjvZG_w%+vg)4SK z*XQ%?NOxzO`1R`}b*KBQ8b3Mqd8Fs-?aPVo>%Ql^(DFN|CfCQqrsCeomfB~-!{p=W zBK5l)e3KL~6+{auOky>`PtL*GlZ-P0cJ47IB}eT0Y65>}d*;tgq4E-Uh6_OYrcTa6 zLoM=k`YCdW!EgJxb4iEdONlyqV-f zX-bJcqc?=3pPP~%!7!INTEK~_xABZbMNJZ^Ywu)fbV}ejo2;6=)Enbi{X)JUI5-z9tXT#e*-RKYA5|WzO{iT0Y*j&SAUuzh7TYnRnQT?u>q%N z8B=+_`>!d^{L0;RQT$0ESCf#Juu`w0m=nkHNnWb6vlO=5!#zhmdE^vj0nAkK16mb} zZ@@v$ln6Yh<#5t-n8GWkCJM!5jm9a+Sa+azbk(dhLFNg+y61G+XLzWYaCvm(LV~ zuRL7hCo_|jkqO^A+2{D6;uJ)`=q-QsInKPO8#u$`m3FilIhw*<hxs7)F5XX z2lvMDWb>L;W}x*>GJe|}=9u!h1e&#+oR!aX-;5zriQMtYzr_KaX%WtQM>hVG-IL3Y zEJEUKoUFjW(9QI~22PF@_`%%d_mg(VTgwZ%!OTF%BAL``*Y+7YSjsKESs#Y;Pb~jp z-)K8>PDL_X88f)Z6rMMVIw7!sKJ7Vh0Q`Nuk#Iz>1DH-_`zep@JKg7HsYgq_c%JWg@qMG$Qf3LkawT}h0Z#s4&%F_An1apZcCOm|r+~Paa zV^1Zzf7zY)H~(Vv25~ttHL?p;G|gtuy2lBlGmYhx5rgBZ$HtsC(_e_EjO8=ivocyG zA*6?V+dLHu*&4m|F&a%O%)@Cf9;y7rBta1+-MxJ}m}ANfLHO*7RB%#p^seaBNXoJt z&(@irYxuMfXyak_&Xzg*CxC%Bju)?24SeQJd$G?0R;10n?<#i$LK+8RUulJ(H4#d> ze7$8(mSZ%>bO|MVS!WC9PjZ@+p`E!Lng=$}j?j_}={dmR!w8%c_!|EGySOjfBpR5jSy9k<4%21Y( zXUdRse`jqU09~XevTi=j^*#;40B5wSpK8dUZQOdY{p2Vj=7<4d8uO9Vi!l;B)UdQR z4;ghN4$&b~Fh1!Y-{ZXlPu%%20BB^@LRZZzQOk3Yal*n9=i$cLq|9 z!|)m*A*mb?QOYx!93xJ4?Ufp)P34h<`QUUO$PW^W31l6fec_zDp|(>T$hMqe#kMrk zh{JID>Pkl>tEz=eo+haR0l5@k*nDaU8f6rWI~F+7Y+-u?JaVbcCAJiVI1V=)0i;{& zAQjyFEvB<=LSf-Lz$*(FV1IeD+^E(AK>gNZ!hjjK*E)qFamiftYW zHlswH4#;C3iM3y6B`x^hUq>7K{IRzQnlCLspC|}bPY!hXy+1!{Y(18aUoK9*&p{XG z=ySiHWr8}z{*_mERoA%3`8rCBBI!IimHYmR&AJc0d%B;gkT79ScTFs+CUXbka4Ec^ z0sH>hHE!&(!LYD4Pk=pj`2YpT!3gpbYl|o2K5@?pLXyr9X8$SaIDST zTuL%@wl#f>zJ^}?qv^tXZ$5}R)zER%-=nWRln`B(k<8UnIipcUF^x;?)4m}V1XdeD8OPGzLw}t1rwyL-2#Pe6>c}&fN8=8%&NNf3o{KA6z=5m8g(!2WQmvPKY zyQ^X2#^(e^h2y=MCPb&7IYcMUQ+7N2B~y}c$W@BbruD2zA#bt{1)Ut{Vg6JRse`b+ zprpsTOeO&-QjiwH{!68&YtWCt1v1vr;O2;C9kAKkt%&ZY73T$!KrFeIokvSFCy2Mq)t&`4Vv%MFu>*Bgr%rxojTT8H}d*ZX}NdhC%y zlGCcl%Zm)WL&m=_q2=)lU!B1klZw}bf__tM%O|@G%p(rD(+r=rqiU=a9DT*|M!~~% zYThMO$2utC{9|ye;$Az;_56))aeN|TaTgE>6LKu6V5A^u_AJL$SgMXYF@`ca|O zJu;|0#NE?q@9~Xhg*vk8cOz}ZvU2VULAQd=R_uN^YEvnk`xqaUi@Jj7;|%m)h0uv} zOE|A9k(bgw?DZ<3`{VTb^4?e~w|G8_hvSz~W}Un)P|xgXIqwAx zLJIL{o$lE4Xv_04K=qn2F^OU2;8N4ub&nL4Z664A-o%yB>5mV^NMAmFoF4D~rc=#% ze)@jH>zmxt&}Tl{B$M*^C;G0(j zpfB7dlUB_(A4dzexxPJLe}&%|d@yEJSKx0ILSB7j4SO59PZ?5U8BA79)l5yCy{7EG z!wi25epA`J+-;=Vwv;)K)sQE>Ru{K*Rhg<_B(h?r`8SXXGYu=PK9S7Yx71w@GgZt% znX_`Hf|eph50uACi;UACtA*sZ5eNY0p+q4W@eYr$Y_khP zMp$4{mz$L4pJD6_V5A%eK!~nbi^3&mapEO!R%UXk5Snxp7%tX9hN>$F`xW@MqJvP# zlbRhXW*OlQlUPm*l3v(HXisGr0S|pz-ozMS%s&H$Rc^N1k6{^IXH?oRz#6H{;;pI+ zx&o(zo8?rk#t_Mg7zu(DmZ>{(lJX7*kv7>`ikoF3DK=S~d+Lo1oF4ln%}bORqSmjEN_Sw4w&TRi0!cuNLOutOobNu z#kO$9%^gp^^+=p+W93c|=b!j+fIJq4c(N_Gu)|2m3Xkzs;6oz02Y z(rd_xSLQv=o~|A)clU_U#?(446{)jHiF0vLTP1E{rNSZ--aYHoYx|TX_Bud!U}ule zQ4?D~&yI4ms2m7etm9Yml>oOkga7;_I$zFfzg}@VeSw}1>`XEsk9BalGrUI05l?7g z`hc)%rZ!!-4z)6)YYa<}>p}N{1bY;PRKU}uUZsFK8h&9;hIM7zrY#i3xj|_Yrissv z#*~h0XRH7PJDbfq6EimZ)z6X#KlSHyiqc0dVNuU+r=|lTJPvdb2>56GT>}D5uFzHg zxo3*K5PkVO^o%v96n9yPq}7`PwNF02@^G?n{e$UUZOpxYG-91EK_FAVIhF)tsy5F} zcThhd?imq6d62J)fSP?qTphJ+*!!vfX%4s$9jziHgJqpCERu&bpW!C1eG_@((!1&& zeBJ@dMnzve60TvbsfLIG3OYbaXnjs#^|If}rm85UfUo)IDsnL;f2Q_3RlwS%$8pw_ z4Sc<3dO^?>-K0rNCcE3Oh{t*cPu+JIAeF_Ou=J!(&QMh2*}2|J=aB#aP8e!u2P zDWV0PRbN4Xt6<((<*v${n5O3{giWNJc!hz9a@xCuw8m#`2fwH8iK9y7CW+E6+sDC@ zE?YO5@-H<8G!O>SNSckw5m;xdaZCEnMq6u(-3!!Wa682`1;6HWfsIe|H{baLN`wF4 z+_Ern{xj#6k%8&|)U&ZLvN8VCw3WAJN40TB^yE9W3P*NU2SqpvB*qtzVSofII2_Jq z@7(0K;h%lJqR(CX+1_PC3FSW|DWwaJEIrqjF+RHUBVUB7%sc$+tk>PX4^r=&{KLkI zPw-tI&7T9+r**!QQrF?zJ`x?DD{rWtquT7tyN1_#MI z*h3a(O!B6x7wp~Hs@VQqx)`RFoGPiu-H@l=RW{hI<4c)03XR&{hc!OVk-RlA72v~) z+91F?>#XaWYEC+q!&3^MSYUWqD`~s>+D(GE(1M5XVc+HoKe!as*!neUX<-pD^ zWv_T^$3=7-UK7(;9yOda)vRlxTsIRLRw)yU%g!^58^#0AI1_^=)`mG7m=RoEleoH- zf;S-wXyS9cH(-keRh)YJ&2zSaWmgJp1d*S?HQ}9CblrZTSMKNpJ%+^EiJlkOT^mPR zPn~@9E7*lEN5_s+b$YD>J`=TgFKmZUeJvA!b1=@{^jW+c89XS|^bb(Xi&e%)YMzWW zVKMZ}?d>;|mI;s9o7VKbyj`2#^nFJ$kB*tfKOF5BI!~MY?>cE4o*uD}3*>wYQimyR zzUyymAWfEt6F<0~D^>*qK2^DvY>a8r%U1gZ?tB^sYwbUI zKfX9VP~2s!Eq|-W1iXzAOMRV8EI!SK=;FHzdf(T_5#R6oo$t4ui<|Ezx7VAd=@o?M zNB$M6k(-Jt9hz|)od(}j?C}y$-OrQ$4{epkSnaQo8vd`Rlb-L79%coXmyw#DuSZxB zj1bNRpr!o>ZMdW>1smPxn=YoF$mi(eF^7UDITX)=%iHjREeSdf>765=1|E5|6v1Zp z6xbtR%K+tfKmYW4VNhVB_ZK{q_%qoJ7Qpdp8gj{XQ6$o6LMW6%0mL4BTqqPK#wbUO z);|jzKuLka<^mF$EUiWeB7suFB~lCuE)?>Y`WxyHRsNd<5n$-2f`I6DpUq%s9(tU^ z4RSyGko8J_TJF!ntzZ{ChJZ!KsS_gzB zH=Nu?%`*L~WE5fI7$^l!Z^S}@h5%H#2mC7L(15j~n=y7R8ixR&3u(c4OoC~jq}TET z;yojWG5ndvEc=Z*$R-!y(h`Ridb2coM<2_IXp> zC2aaZeb$j#ty%y5a<(`6^Al>=$XrG^ddRvFj5_xN_qmKz>op7j3&z1ADd1o*3x}tk zq#SH=g*FCi#$^U-+Tn8WAZg`vuf*>>Q1mzM44FLgv~=>c@Zd@y6KB~XerwC71)&08 zl~ht7AH(HVXjRJ1s39Ghz}6zxLuU0y(ee(w8rhGo0G&rQmi~QOaw+Oop8i^L^#-J> zmDl0&DKNb6JGhbxez9?eP;Mc|I^3kkI`_}dP#x8BM5>(;K$ zK3kMg81CG_5jcCsJ-y)yZUTSN5qg*4wIQ9$d`4YdCFZ*SswR9F$g(u^A(%e8YadHJ zIRZO8YW$irh(-H0OJ5_p65|WM`OL(B$=kv=TpzKDr|p!l7r7Rjcrl9?n*et)UlaO) zGkhx?vQPm(dKcqgSg$yL)jNMD(dzEbtysoF!{mIuZAl4P|NDERUS&hd+IR5_rsvb= zOsoIe)83H46NnS3B|5eIeLCm5W(j_APNxFDc0i{Bx#dr_`^YEkNs%k0mmd6)ye-3{ z!Y2^(gW!GBa=lBpUhHeBw?E!jo-Pr2&dD}EL9AQUuia6dRy%BB&pja}aVZW(mQT^? zBb<40;npZD_36|tDDhGCmvBv2N!ElO!lh{~x2ySo5Al{=UPW$b8|6NKfioNX{CVgIIGPk?6#a|LJ?z}wcC6hueK7%9}oo- z?4QScWDDV{12?%^V*;V@c=S=%!1+zJOzDnC*ctnjz}xXA==o9Kb87=?nnVA8l)YnkWkJ&@8tpg}+qP}n zww;M4$%GTzwv!1awr$(C%?ao3nfKg#?sJ~+$9sOPerolquEy%B>Rr25mHbLWFjy1D zIBOz8yC|sXG1VF>uRMoY>_K2|J>Do(^E@F_dfTa#zynFmb@+^dpHM_!`t>QKJ*AG8 z6K`SzVNCQ5F;!8cM$Jg$JDXp$;C)W1yOcf&miX2*?5t`sRyZM*)Jw zJc)2};SX{Q1O71U;@>K7prU9#>N$V-^1Oq=9a8yC@G}ACZj*N8{2xGG3iIM3!(?cP z7HigNkzi4CwJ9X>>2K{h{HS*Ea)+1DaVNX7B8Yqc8IV`8b3cB%-!F$skbK+6}q>1+k zoe@#l)fWIfpHP;ml~i5+D7o<*PS{5;ZI94}^N+#ELHeI@Y=UDSY@tZx+E%096G<-tnEn#Ay=enZ3*$(k8 z#IrvYo(7)YOB~Z!Xpp~=_dDM%vP_JBXfT&9axdTS0XC$G{R#uI)6x{nHItO#r658N zZah>1o^oVFxL(Ynzla1P7lM(fh;XrHlel4em<9y8?!IAxUJTH@8)tE96}gM3g{+xCu{(HECJR3$ALL5Vst1dW4e1v@K8YKC zMO6U$G{iMkor6Ee_rzT6np%FXA(n!h#RX-wt_+@tK2250K})}x_dt01?@7fm5&gL1 zVbT)ReOva0WzAZn&N0od4;Z_U_&W}<0EG6hf_3(mkON~EUWg}MU<=M zx|WqJ*0$M=W4W-9tU#`j2wXl5q#s_QBI{n9rb&EP7(9`tJ73Z-|Ir0SORe-%c8yB- zU>6wX#4$M#Oz$ucMAJs$Qb>OC7k=rwe%?r8UMgHeAl@GiN!}oS)zGzFk_fp=M`ZD0 z*B*gmai|LsHIw2CrCt!;2$^6#-ZvLNI`N`nz04B$)GSh)9`Z`9T#v^!;PD0A?4=or zM<|6v6>5Yfvl!gWgK{|@C6uWtG83IanppjeN}Ve~(_Y;@tXW0fk>9c^fHt|>CIR^6 zftWGems^pPJE$#xED;}h(eYvI$mN2)_bimaIwTqxx^#ucTgLuuP+KR(P@hlZBg zE$$NYGW8bBG^J7VqA}fA=7h?TX;-~U)iucb(KS{=YE9hpYoST=O@bFDIpa9eHJ0yH z3uQaWgXtOE09J9a$h>iZ+OcQ4%9 z???NvZ1O>-9_^>V3HGw=b3kA8pgWzrDKm@SYIbCNSBo<<Y za=+KpbGEN-^}Ak=AelmFa(@t_v^8GdZ%xu4?0E1>DGw=**GvV1KrLPG9vu8w94~1_ zbl8ph6&5B6c#s7JFNhswm7SFox21k94Wk#|);2|G3lrJGarOC;qmy!8Xbl4v6U8dy zRJ2e0dO&9wCXg@0@waIDg0J>-omthD%E&gpIV9iGEk<@)v_be`RNhqR0S3KJ_;2wT zq<``8Bd=cNL0i)H=x|u&VU|nxpi2y~G$>8)5gWoU*>)>P;*`@G$J>goa| zI5GmSzUZu8M6Yxfx$t3S|Cm#~QGH1voe@ristHrQ> z562uD5rhLu87z02gRZn+7F0}>Dq6>`%<-8hG{dXT#M#%oD1YD^S%n`$Wj_g-h$w&k z4>k*S*8lQ*TV^I^?*H!}IW`s+uKx?0MIHGsO(o z&G;(#C_B_cXNtW!!^x-*lKO=)751RRpe*j*^_S>WYG#|=MAb6R2J{94tsSXjcg5?{ z(T7gg7W5CjanFazulXykbexq-IUd|AAs5=7?Y6Hu=G;qPS6y8?JBYEo0irv%SE&w# z%c_Q;B0(vr-W(5=(vdH7wfdUJ1o-EK*0|$ZB(OgmH#ab%9~B*N$6Z%$_?c41xSNv; z4GYI|Jfgm`Z7b_DVC#&{F^{vupQIM-cKI@|vqQ32b6av-1r=xmJ8U&;sP-3?W0%61x}Z{aHJq$ReK_nqzGOu>7V zb)m@a1GZCES5^FaZb@&py@5VzJ)%u>0*`jl)j;D{TE!(`)fTRTOCuimRq)gK>>7u& zwEAsw*!k>}jIM!htn504d9&f??X@7#c5!a#Tdx29 zHnxDi;q-C8b{X?z{D9ajRo~;Sp&Uk%Bqse$s=9ea}M#X?<&q{^}Q6MmMeRe)-ja5hQ%6tV9rOj8X z+*>fD(S%Y_u1aDi zGuYr$HZDgHV`OBy$U~?|s03(jCSw|NR_8(GK}`yNC;>TPrAP;2V&u1jfBT1DA*mL_ z5=@CaS7!A|`z$>7RI^Um|nw|9={CwZi*Ltht*n5rWkic_|h&|+N9@6@GW*!noQ^u=>g=Fc^Si{R; zLw8t)k-#p^w%4@IVYK{(xTQMUMI6gY%%glg90xwVU?8QNNbmX(i&Jzpizkt=y3-2E#^tk^2ohNoQB1Nzel~Xg5aNNAL(%oUOZCX?1DR3w%z6!{ zk&x>iO_iA-YcNq5Q&u^Bez!hGJ??@`MjfajJ?=;TJ-_SUU@Fd}#c-w`>ErT{u(q*L z{BN^~k^dLK4B}<~(G#G~FRd7^PQo7yy3ZR8HM)hl*N%|j{R5D&$rFwEB0-32xK?dm+@$6bj|QVjS=#YT z*bs|rX7w@v?_Pj40I!*hL<6{GvEjx1mh+JDGITgC_3Kq+Yj&NtJZ!O!j~x%?Fv0FetE;}bJ~c-4(z#vsn3T|x9mdI;P$67`EL@dnn-i04twDYWOy z$K_Ea{CsR*i<8YuhCWG0h*W@Eht9)uM7`7$q8u5}#S)?*oBKeOS4sko3FH{bSjYzJ z(AIP@YbGFYWR$c9j@!adU#f3Cj~apntLEt^oK#p`%_I@=0vHO(fdlG=$jG)uKgoPX zUXOAE00oT*-(eMIj#$Rh&jlK0!`7HCd$unE994r%4+bbt{6Xht(_x74Mb6lSdA91X zZH1*8OY)AsWr4dAe~r{@=@|-% ziLpgPa|LJh&}vM=u#NcR8T#Xm;L>RcTd<>RkUgte!TLi$p7_W4$tUduLD&{RP-ZU$ zGC-#JW|e1Vp&9hPGwW%~VPNih-i* zEx}8=dJzSz_n6A%#UL!f8%9it*pnu>&&o6Q}+df}EB5&~`?lK|6KWwI;riQ0| zY;>5EEc&l7+~qU7+j_uxE5Q*LJl7(gkU1OPrj^bvA55_6k_xsa7~?ymXx#HSc+mKi zaQg#rR4K7$`WDP}m7#$vPteFLDGb**E1MU*b`mHLw~Rv~Gb7|(JHHr$og>TsPbeuGyI}b)gw(oxDHHf$Gp?BDB(n7sf$b~K;Sx1fZDwQb zIe!QO=}0n)S{*g!bQ^C@&=hr+ok>go7E1fGlE;T&Xbpr;U!;IDq-(?BHUn%H6 zKlKjbKc8c3M1?906ni-(l)XLo4+9{4irYrLzn$CsdrrBSj25MyqW&q$9S=*58$Nt^ z826lSWON29d9v?Rs`P?G82N@?UQuS7AlNU^DS4z;&#r z6=6hFq0N|#?1~!Q18o^y*J!Xx#$@FIFGeKl9h|Il$*?RY?B9k4;+p_DR5Ui45>qP5 z?RCp=HkktlYYSe(@VRUkT6AKG958a#SQ7+XVk3D6s>%Z_rbo7S^}j)k{Vp5@D~WiYD)2)8ZKVsWQF*{Bb3!I;ohcco zI{2e7a_K329De-(wy>*>j4Mrkuej)0=?e zbw>)=2Pe5UL&-NP6QDn)jeo{et&se&R-R8z#S9u44163efz4t+7lT3^E-#gkeUw>A zzy{W+0^nIC_Qp)v4c`M+%5s?_F|12pP|7L5ChAk6nkH!e=&1L8+cYlxQ zh3)wcv8yZ34N~Ul=c?&3&S?s0n+fHmu;zuC%uO7pRv7ZBA_9TPt7>5A1eu`Z1vcrV z;*Tj;3xp>YYrd7pM1)=S5bjl^h?^rbQL2i}R5HPSOx8)oI7~`Qk<;ZYbR0F&$#G%s znc_<$as`$JdyNEJY}A+4y5+#~<^6lkWY+mB6kXrj#ramwT;k~JoGJYjQL3d51Mtqa z{mz}%z^%=XD<8<4;B(Oj%Nuh#q1(#E*49ph!DfwP&p~3VXGX2U*OCv^a~Ag(Dhiy- zbEWq^OAEXogn}>W+_EknOlp&g6IgAL9;)46KnLBOg??1KUqO}A3PADc3ACj|rjRmK z^KUl`I`aFZWZa>gJa@dRabM-%elG<*$fUkSc|)2#(LvTe8YEL85Y@OMo|Jp-dH$_! zqXG@0_Xbg-T-@+%j^?m>>CFs3;Gm7yvz4j{Z=CQ9;N00Oy8aZ;FdKOMEo~zKEwuQS zfaf?=N37N=7)nB4nOZHHHqous_BnB774F@w=>d3v*Cx zOz6)0yZiuun;@lDuTCOZd3SZ@@=QzUyQKwu#_ea~LKG4-+P>Vgvi;0K079AW2Y@NzNq1uk++>4er1ph>K-EJhjfglF#k1yu*Cd zq2Ju{wxvz`(UyD%N37R`<5pjhh>CZ&yGV>fk#Ja4dcj# zkuFC4PNp0OA{_f^pQdjcIop2|iA~H0-O8x_Ug&3sf$3rl7775{PJLZ{{zmDxwVJte ziQvFUzeV>zin!1*&)K1UbD)6u_e8y-Ly_*#pS>|n96a81AF=&p?v+m@gODWVKi)ve z$W%}>GuQ6YufO*4S+L7+d7Rg$zveNx?NK9yngpX`!nz`KSTWi^)zs4$-ZC1`gPga=3EYOJtmctUBT252)TO=lB1??7_kM zUj`fjx@!FIh$C#wTulG1*&|q|J%Nnb{^6N+Y=O&b5R(8I^BI82azHZ`N4y_Z|ML%G ze0YYL8)`j^MS*n9h#Ux+lF_e*w>HLPjq16z*V!tXCZC7$?e8C0%T{eZBjgbTofib> zq5505Ery3n0=|#U$0@?K;f(=$y9b`{2c%;;aDGiAA{t(ow>Yyx;kl`po{Ahzn@x{FjV zdFK`M55C^tV5rFtSsJTwA3UjX6UHk=;20s;=t!f@?X@=8y zW2aqB@B6Oq*+rL&xpPfQ0b7RQjIINt_Wu0raWu@T~^R`+E!phtMOXuxCL(60E z*aeH`#6@aqU5y;MLV{@(v;Q>tj3y%?kSFiVXI{z;tD0O6_cO?r=}^sDuWO5QUg_MJ zAJ*PiX*^TEMhA;rpXxpz+jgkvrdM;ifBC;+w2;hzt|W#3QTN}jH&+N_JN&wU*`VcivthGaX@^%d8Kk9Ph+R7>4S-}l$??LRNo zzMt0y(09PQ^=$#675-eBdBSeWUtd+)SM9AZn|Oy%8$cgi>aRJ3bb*eLXy7bZJ5ONX z8&51>?9tv3nAHyfc4cFM!Q@mI=h$(1H$<}0o`!ZMEI<6-4KU2Sn|u2>;cIRnhIFVQ zvzXSdN2@C4d5f(%SK8`3SE@cinSkFDC+4InAfp+4$D;&Tv zOTMie>iQ!Lhwp{>DtLeuY@`Kkz_nmHG42?QbozM_KZ9Kbx6v7k@GB?H4C2N0f-H;Z zqdC$qh=T$FHOEc)8Y(q;1dNotnQBX+fC5Nun!*6vA{Lqv4VuEffaI~#8lxhXG7)T; zs74j|5hFj~Gn|nGJ@8eTO}4m7H3{%Yi6jI%9eJhS%dAAgvqDYra^R~?%Ko^&|{jzb;2QW$i5T!v^G)x^z>R^$u>cm3y zqpjqIv3%g5_96@@8>MidoWy11Pu_V{YSegDHPvMH#Qq}lm1XGVD*LeZGHTGDWw-#P za{~Fbwerhbp~;gi_|n9aEhLT9zvSVs z5V!+aS~wwm&9&^HKgX=LkS-U)aApnYZx!GY-EC0F0RQT~U#p3EZSu|vFSV-TvprD= zKWHj~WrRxe@$<)%ojggB!N@3{Dn3}gg}~5eDuv*#D}_*wIj)!?a4EYSKnxjeX~O3i zpIPVTh&IhcQka1L3FVX}K}m90^Nmr^3iz*P24NZ0dI8?uQgY?(OO8r@cLA$l?;KdyChcpEQqk6kY z&u{|0CDYg;-(ud&?9iagHNFObwf`(JZX~VH*_?-$lRYGg(%H1@F>AjJ|H`0t5u8Y#`?v zl`KHYKosMqfJ3H6yBKl$>xAQ+`dK?UQX9xF`9T2cAWa$OTpBA z$dmnlJ9vh${o~G3n_syNaC zFZTT+ay$}ZZ?)@dKA0}i%~i}knAF|tDCF48OZ-DQzYQQ4ELlGEN=!U_uTxHz-10rQ1d$uQLHm66yPe>iDmp+W2VobBnnP3H`8=_o)fYUW>(r84kdQb=*uPzgZCC>F zJ$f{i?i5{EFM%e~^|;RQ#j&p@MP8I-QUC5a=Y$~Xt3r+ybI^sg``czakRKZ}*} zEs(4jHuWvAG|tH$=?*(U9;Jrmy%=~CH;XOJCGiz=4dYWwH!sZ9iXHwGLS!f=Jeqyc zOB;UmjyNMdD>-3SY*u|pvs_SpuyP-nUN~ER83E3~Zq{f`!* zpgPLTQ7Yv9by7i<2&|U-giUY37~>B#ehD^S@mS=K;25HY^l{x(3EPLa&+v$Op6z~B zoB&qtqqA$-i7Q^cVFzCET^@roYMfXp1!Z@??yDY$c!7c(Ws<4=c){7W%XHRW!m9nt z0mCavmpw*fzH7qYq&i;Ll5W4IQJFmRgn(|{=`crc3d3F3H^*fkQQ`i5Qh3S9t2ao& zZb%2=0S1H!P7N7^V5t^ zkz5Ozdvt>pT3oz+AZwykQdIlWzZY0yl7bfa5|q|9B7kew zD_;19&hA@{a-RDkJf#DCZE-Ooy0+YKIaU}K%TIWRuQ`%dQUBo8YKImvIMquusyDXt%MD@xKT3#Tx}?KWJSSE)GG}9Fmo61D09%9Jc6k;8_Uor#i15^wL}t3 zvV^JZD`pyLGcg@&Q6S5I^juHy7=3DI1>0FLf_8th{!rd7ex-Zm6mfvuxg&<)?TT!9 zAfJW#D^@omRmemS3?qEb$1sj}V)~I(c~3r2tia6c`-a;MnBq--7G-M6_RD;j#EEbJ&T0`k-0 z2$XP?z#6t58ZVt58eIk})F&A^i_Dta7X{e>4vh#<7usB`+?9(*X~3@ zorv(DXRbq`zscn1=w$NtmY(Tql(wmi@;jv=fK){MJ-wR2z8_`BOGv+(XHktX7oh=K zD@_306wU=qqbp21F{b?>(eXWDjQdM|@Df@HDG~+^>b6AV7YguZ>6_vHfO_6qq4cbr zhza32#r=VR2??7R4X6F!AxB<;hxZr$Qj&|i7PTKOt7ehQ zTN^MHBoisTqR14dtL-6sfo)Y@IK6CQ!7aL1ofY}=sKi$o#R3sRx(RAfw1a*SLlMKM zkgG99qPWC0R}gy0T5#PP3!p1>-KQWI309Jw0qx<-(pDWQtH-06W4^u=*^o! z6R}fedXgX{u*g4-^vG9kkm8I)?T8vMiq#^VJMNbZmE(-e)Wwz(^lYpl+~t80B&dCMxNQ2u2yc5G*K}+PYXTZ(Gz6o4=8^_6zBh7#^7ZA zFXN;Ey*D`jxAz7U7sr2V#`vCDTX)!kAa?%(8|*Wh1_B*dv37^qg2(lp+i|DIpY-j| zxY_>ZQFfQZ@9-se9RAc6P8U} zQ0LnEPr?qd4d1S|<&~`kpW?41U9;8^uT8THKc%DuB|k?_D3xL*kNDzW-5W+>8W~Hu zaykeWJpw$u8qT?!8B4t`u&Q(~c_23kvONo4Tx;I>RzGT+93}aRBTAx%=^TfDR4{JT z62S4hUBGedS;2VNHg=f?U5Pyu`WT+9#k`&g6}wV&V!u`n zlTWEitiOm^gz|0KU17D?zj4Wg@(Zjfv%l`w6BhB-cExQXD@ygNJ{egFDiYko;7Wcd zd~3;Sspm)jFmoCsXrSgDTA)nH!pkz_G;_Ox8sSqE_>-1nMY*~;op|iyr^t86XK;If z|KrtTO!`g4^;uB$A!>Ne60vW#`69h(O7%%_K7KR%0^6T=Fa0>zn=PmHVnF|1n?5F` zaa?9yfb&^!T;bCqQQxN4=YrH*BkO(gW145MCHA#G?zUBxva<2p7dK<}Q}?NrP)`-E z^^H({N7qYHLFp_fST2QVg;n&8;*~Fr&aL&{WiHKxt0jtI`rUP3`KESbnznJdLwPeE z!s~h07@YZRB@-W(;@gMA2^?&;Qm36eS(OVW;~s!MYkro5$HYY98s3V%UOU0Jnn zO!vFek5@gTiny`q`vcoo{WkS6M44AjbGFoUog_4Wv)gvceE)sfOz8VQF8KK|{fE!@ zt>0(reeHW=WI4aDw}Mwbzk%IX!#DlaIYYa_$90Yd%=M23H{`3QZQu9X=|8W}-Jf2h z=Aqqxe$VInQ1;_B!w{lc(XNBrnc~*DA#|_BbpkU8b*ismcOs%wB2{6Mc=n5?MKV~i zV&ZQ(Fz|FJdS2gj;jA+?9;gn6109*MZ@Nx8``-$lzg$Od@pdqJy1AFogqEWRNBn-h zQYv*!Gi1AF>bBZ4_Ss|_e)srpXeXITdgkBcGsYEPCrWO*(}e3<;N4Gf|5ko)Gt7M5 zyy}=vBQjH^7FB)yB{)K9V~7}9G*c9bi4iZr&%>A;Faei{?MN=}og=lHpTK;}GWYJM zoq=opWDufl&H|}-a*2qkLq>Y1zljfv4sMY=ip5keH{|#C*#u1@GgHu*89aPG#^~SP ziB0<|=PrYE3)f+qC7My~qpQ)6!hE)uU{)=1SuDCL>*;1-+$5e+ucEFfH?TJuqp;QK zT9_zIiy}#|S>arg0c~@1iM2*e^Ba9>-ziLuCtj05@3T$YcFLX=v1$Jy7Oq^B*%w~Z{=%O4}2F5;m*pBQ1f;Rslt=OiWM@T+NHxrv+ zk5oBRf55C)0Fci7+xqb!2%;sTACG(?dQ*Q0FFw)C>R2DubF>{i;n`% zKO&Cf)1zQ)+=U>aNvH>4Urq}=cH$CLF&w2*(P`?0ydJr=^C-xt=#&ysEP<8F$$)!^ zL;&7jLSIf_v)GV;uCFXY@@@(s?AYHdKtn5((H%!{)Pca}8}Hg+9Ei~LqfF2~Lkx7@ z=s_8ll{2)ECC{O0S2e;V_5_r)sQ5B_UUg<} zKU~rax}Ioc*Cjda!8o#utS`Y)>1U^398H6=0WHjZQ?DVoV_+LtyO#bUWsGYRr}aO? zdnhdMw1k3@c`)+&pz-09jDunTr8Pd{M4Fvg36GTpSxq45OWmP8K37pd*S0rm!RN|q z9r62Pg~iD5X&8P=g9lHAo$hQzYL~3=^QRZ2#MG(#p|^Xq=|bp_aK%66)+MW#9B&>X zgwH{_sGs?vvn#)lTo_iuuRlL~fO+L`_9$gez84TGGuu07or`WM{`MHUQPhrlS*ne5 zWdP&|2UP2KvKWa*}KG zfCF6N7^e0i(8-!7?&!{h7JT@>dNd)u((k0^1S{zAse7OQ5K11^^-2|h)VDv}y=a}? za@aTwk5ASO@W9|sEc;>z>vO6@H5o~od;fKUbiWIN)o}fBX=^dYI7K(vgG2Hlg<>ja zIM|!UTh*~0L*`y)Y39a|FguXf2fc*5<$e>)z|0;?yWi=!5oASv;-k~uf2+WF`4J^Bbiik7lV5lDym@A7jZ~_6R!0qmkLkR~tiWJ;VbXCYF$JzXZT1Q;x z81>Og&k9bS?iz&i=&dxk3QA8?mYSTC$}|?fk|?TBi1Y9*D}gz@Ny&`D7p|xaO^hYX zcMSFl%C-hY^mtK~O3EkgLAwgci(Xe_`BSVXY^s?(mHT@1?5@}Z|HMum^B}@%!{dByGN>_8In&!1pRRphc z{a-klzw{%Q&5jlt$Ce?^GpgvME<8Ni?OI6pnv?5JeTr-~zASNXM$BowWK=lG)!?0( zwS;_E@U2{xOQ68WWcoV9q1VAt;D(!QA))gIXB!yxo!Ipx~EKly7um~%){ z8u9UdH?9AXKYF$cX-|Yg8?uo&LR^RQygVu^WL=X|Xn zOLoC!m%R3O+bB?4DU{UI=afcX^e%T#q5r)Taryj))S?0fn=NgG<|sip9EA| zd5Kf8p&-0GCFZqkviB(#)iNzD!4MZGi*Z^hCCP^{Jg3X_HHC<609Ti}I3S+2lplUJ z8(B|`fCMq=dA%lTsh==#1O(og+rSs#U`#RW}h_@e_ZZ{G(5 zFta{G#qgO>&N!7abNG|{$32{GzXz8_MSxhH%fy*O z1iN>C?2hT?gBdo==PUWsBT=?c?+mtX{`AA7^rtQzkT!}ibjgM&{w=;7`9Ur=2Gq$t z@ZFiPY2QfFz$~($i~X=E1E{G6_qPx=0Z!I2Qje0~-sn0KThQqC#b^NIT=6o!EK~a6 zfS+92(xB7^wv5Cou2g1zK>1c=giWbJtu+*`2AlHDo{E}ia8w3X>NbD{sFKxKc2Wo( z|KH}*;Q{7hJg_piyovrQKQw5Zj_#a}z$UnMC2rfRQSH&X-(EXtjC{6gm=tA{dt#6xiK!@v~CO=Z3bs7CjRkj3G_QWTJI&vyII|Oq@6qE`vK$! zU||Ek%P%5(Wb==+)PGiXvI^6kv=hrH6cw{6^U1sn;sOE~B?h~lJ{VRG`_Tfj3FgUe zY}hDN++HgRX%`YMZ_|PWgmX3>UP<*vI3G529+}^P#IhesH5BIm$4XPW7CvK(u_i;W^_N#F@^gOZ-Op+Q>@4u_hAZ#L% zws{ohryp=(nqu&4Zf-C+7&(#zb9=O=jt`Wv*YIGXhIA6UPl#9;i$zHaDFhx3C5RY2 zSgf`?=r8Zh-qw91smrlXi_T$5M^KVPicxS<8x?^(3;X@vp?g)T_0k^=s<3y-%q07h z1^D=VR4B?5^gE!k$$$Ye~sXtj^5 zn&IHU%@zP{v7#C-BYyQutF^>L8ht~t?k6ls8o4@BuR>+{R-bekQ9QQK3Jk3T(EU>Z zs6kaAgr^cnpq(Hiu-X&|MigwO-YEb}6Iz3IW# z;Yl)pb;y$%W1kz7H5;nj_(c1@OwL&<|AV1{i}k;Z;0iP}{QvwVfX);Dt)anAr!$6Z zGWy|}daUD{#^^gK474Yh@K7rhwq+KvXv)K9ivyZ0=KO z^vlSL8^h9k^YEaL1@5=}X`Vk*!Th>jdcRHWawAs>a#1kvq~?ErUc^2ebx$pZ(SN(P z6=3JcK98rbJ>Q5uX=s^~oG{roeWKX4d7U>0)Z80hV{B{PJy739FXnb>2nsB5SPCUG6kLgr+*n|2XXJk+Mt`nH(+oeH0jhhzx3 z{C-=9-gWk|g5MN#b6RDPQ-MLRW?Wh#v*mai1CDMfho1}!-&t|s8p4%PcX$|PPa{0r zPJma$t!k-$6D$`Wb`ChdHO&h=LU=?6*RCccLBUM>0Y`(I_yF`m5Ui)#_I9(oF`+2x<^%Zbi{{*TzV_Z)cF zZi;|hnYtD}@*fz(7EU%=12wDECfNKnS?VOLurrDc;u;XsZ?_aUfHTX*7Y(tMSo%F5 znI6T9BH4kJw_DdTc8>F5T|#7YK|*OmdA$?BLZ@ zeY~N|*1vVk#0@kte4JMQ`F$+->5YFF(EaCi-0(BZq$x%psu{b6@)G8)O}mEk5~2C| zUaXQ4>m~_~21|NMU>$m7HnO4mM}$CA&?fHX7c@71B{yoI3&C>$Sg@a-Wf*|^3_gZP zJi8Y;P`BVp$Xh<|>O7hR?=S#NT+xYaKE9x;A-=$8lS~`3ByiBkkw+_v1Z$TXQ;kW; zl?e+!{X-ao8rOwa=rcn*c3C3Af>!C|FX=&$R%sUSgW?&;R_P@0Qc6`0KTj5O@KVe8 zMBvC^v5xEi2H<2sP0yB_6&s^aWs9#H)sp{d%Yubkp@AF)!90GKwbM1?9q`sx+T$Jn zCg!oFMW1I7H3)X5K44$2eh5aD1?>F3r-`496j8cX9lB{zhfMNY?lWnkJzK{$!5Zi{(Fgj;!RG( zlSt~Q4NYZPd00@X{Bq0uu_mPLg~3oN~x0+a+IELuE0hc!^|F6s444I zfhW5Vl}#)@riHEY(;#moDGLCA1=lw9#~xYx4p-;88Bn3$ES1hI9+Kn{k2*fQIL6v9 zoI~sy=TA{utQ?&vy(G%cuoPa$X0PoC( zJR%Db(gJOXS)=y6ge|blZvrO5r2B9or=rx)q5#>(YMyXB{Zxk<4;8hTs|r0wzX(4* z4-PVnm?OdD(`(N}!OsTlK}B3wD&a@I6c+2m;kzmeyJ9WQ1zgmq$@&J>vQU0aWs1{@ zCq3Ys4o4@bQ3~l6N)!L&4RoyEmr5#;#`z6N87f zaZhGdnU4~ez7jb4y@97q2tDf7lmJ@tB^Ae_0UagcCTzG;q;+vRw&`#5)8FK)qJk+j zheYB@%<0e`rN1?(BqIUT!mX9DGLBo4A7O4yn(>7?R`?@`3@!v9mB@>i=|@!G=}J*# zZ|^0sQXZ|%y+u0G68HupmEY;YQq$zT*MG^JpqG&isT1N>*rHL@@pXDqY9TQ)@4niC z-$~pdF-pKR5%EqiM2Sr%6<^de-vyTF-GtPtX8&+q{l(icD{+2U-!5v2=QS%KLpAFP z3+bylB;hf1j1KKs7`IMM`|b(gRIuOc;mXUl2-s>MCEcPy8j+%-QW}sl<7HnAnQ*iz zLrCAfEYPZ{)@9rKZr6W&ZHfN(?e*WX7ym5ebkvNJdQS)~bCjt65ph?ILk2sjU$~K|mnH7Fn;&BX`hC@OE zC;%E~FSB873fJF^sAev+=d21dd5dNxGM`M|VH8{Q0zmE6lyF5MN&+IPJX>bZ71ZDd zfft~y0g+Kj2;$l)q-J&^TeK=V-G4d~tduIapgA}6BqNMGc~(OANjq-@TLicyd0xDL z1&L=@n#|~{%OoURyX9X|9BWnE^XPWVk+&#(K$!`-R=XVt<-Nphu$IC!x`aYO3*)`? zD~RK@0&|}nIA3&lG_1xciQMlt+0g=?iVzR~4`XiuRmZa=4ih}MOK^wa5F9QR+}(nE zaJP%QyE_C44#DN(1ef5!3GVLlUGjUo|98&r`SzWLuAb_eo|dYbp1#%9awS)b7Gd)H zKLnJHAjJUXdIe{n9abn25+v4~rE^PzRPe4-e%lz-ieOyI~S@DS~e%KOj3=N&2tbb49Y%920&l@Kf&x#v1ow0vrz zW|4&llRzc2in>2aK^Ct3zVjtJ?f@JxPqI2@eS_NKmRD|>ciQ+HHDd|*_p{y68(I%`LEFM)??F3#|# zyrQjX7V7*Dp>@jevkgXW3KpgAuVK`cXLd(R8h{RSFc(-{twK4Q;<$rK%X^StiA`HE zIGma>uG_LLK-@nA5MaT0TJ3#QaM!swQ&54a<1tWtoS|HDVIqLC(%Jb0>vXoxG#?Wr z=sP4r$hT&A%fhG{V!jqI8P!g$8w>l32-|+)B9(9{L~vB)DwBLa8~star#tq8L5!PK zaLE_NE|!}7RwXEcVf=<5sm2r*tvFab!mCoU=6(~2%VZ85RhBrYVSF+Aj^uSx37$d} zRd6O0wo3$WK+`v&_++I#%F`Gg#lrmf>S|ZIS+j zW}#D&#VE#RiA&H_?20oHZG_}ZVy5;R8YkFZg7eC7*$QLp=XLycdWjk1DC}Pl$Uht9 z5?7K@i*ljLJ|~>xxXe4KQmhGAzNx|RmtEs_r%a%%OU)yFTsMLr}YfnI1N% zb#+Z)gO%oDKAi>w-zOTb5I5DFl9cSUK*AAu87-ql@@Ma;UL_`4MH8B$FSSSCd{!W_ zUBdDcZ>-4Glc*Xo)Z!D;lWWV!D*D6jEmVr3vsFv=7$i8E`%nud&VYX`yAC^hgSXoxn<8@=@q z1zTPa{S!%G$(tY%DSa!Aw63Vl6Y?LRo8b)k@2EIDV~Z8ROrO)aVAGu7u6x%GDJGx7 ztI0U)=iIS7V4;O5c*rBL5ON{z&v6y1*Q1+BPx)teqZc!7-`wPjbc6A=Up_L+XSrN+ zr`+6v*h#mpt3PsYv2G&_b?%;OcVIpW);&G!q+Aem=5em>c^JR6Z``Rjk=%Orb|{2h z=4^Fn^geGq{v3uZFgF3I_;==J&H&CIg;a-2J{g&y=vWjcgniEs9>%ldw@;#9W%)2{ z`YU>U|7AvIbk+cqiuVWbU%abf}Y*E581pYFk#opxwxd0Akzfi-%Ya068b4p2YVxIQbgWb)a+p(hErBe&o@nF zufG*@!x*_dm1-LA1$QfU0`&>UGS6D^^JZPTXnWWj!5jBMeiXTJfx5`tItMX%D*3nT z;gMG3!fIN+gJQRO8_RYKSd>d0dv|@@4$eV(6-aFIfh3{eFl@T++$#g{Bt|WamFl}l z)YdtGS^UC17nkB*m160+h3X3i8d}Fp+jIdzvcW66=)KEyb?c{ z1a!pn)+^Y_(teh+J5`5#d#}`_;!>dwWvcx}O3#TL@5WLfBTT25$9#y}(6` zh9$?AQQ^b(CLjeG3eh3Knjz@oA&p|Svf$z2IMW$us+T0shLefl!cv$l*5V^c$kWPy z2tfkVAmO*h!Gco}W}E4l%uWGhy~+Gz-HnNrfi|7CT{jek=WeGzYH#6-(Y&#)!|9-K z+Lho#u)UXUgmQk1o$+zMNW;02+nhsf`%35Mf^b@6?QI8N}JNxXpiHog>WH^SiEnTzp{-dUnVWt^t-hSn}t zd4R8%Etx|POOmgoK%?uJ5dwNtux7zmn;K;rE|cRyJsH zA^KmT?8X8T|ChA_9`^sx$2)kffb-vt68>YC5-u4Xb;pg!!H2l}{)~f9!95Q0$zHJUzj6ec#Pi zoo}Oi=DjHJRG{nA+q$RGHp^$!s@=K&vvqTJyVXOta$Ku}nOK9M$!)-s!}Q8bgPp1~ zL!;B~RP3a@>E!sEZb#(2bSLlr6@6>#vhh8d-q-gHjxN|URq&(yI8%`)JAgi>ukc13 z`G9uUWn71!YHb#zb5qsZkQ&ZYs#wUTw2VR3usb)mC|uN~&+yi|y|i?VNvbL{UAPDoxk9N-AviE_ms73>uOOM@R~s(!?)RJDN2X5Mcb$3gE(kwlLaILd>x~$%F3+lr)x6qI92Q3%!+7)ZZLn@w$S5B_s5)2KiUg}_DG{p;oZTXH1P>?7 z<~yEz)Gplt!VHm81S{Ko2+!_17W~d00Yu3 z7P34W8sU780kno5Ubn;dO-0=@JQej_Uvt^?EY;C!jle(zar+DPe0WeuR{n(mH)Qg* zTHb|#y8B#oAbboy578P3VNR}rdo1!)$U*w+IL-#;6d`p_@$8J~0+HugwZ2kE8%@Q> zF?7<=K(nqOKaN>6$eAzs(EAyMVsTZE0nQ|)fMy9`%DLfjG*)j|Bk@6$#bJ7kXv%@* z;ceBXkK#|r^=Y!9u#!?gbOrGDL5^p;lcbz)00qD}HLlewHa&G(Jt?fDwd)8Q8J^l~ zXAqvcnD~M`tnnoH!hK6{8Sy4B>r4zy&(NQ=y&%Bf4*>zTKIV$+%a=Blv9Q`Tb3F*8 zKc8;oEy^RaDLVLGDu%C4vKk_Ilw-8oNxd!sEH|FoHxUrpuzB!#;`74R z*eaRE6JNjdhZ{-5oW^9QV3ohr?;&s06MhxtW(;hA2k+1i{c3hGiUl|&niz{xLgTmQ+7_Nk&fG}ehd zd$x9+ye-?_+p3Htb6yAqpH^V;S|42#t&rJccFUF76?)EerPBA~S;}E1W^W9{qm*X; zYSzdiXp%8fq2X62XQw@wW7gVh4R=ivkaPSh@?2)KS1Dj3zi0W!vM{FjnNbD!6~WO^ zbM8H=8%-SfQX_rxnh#oFMMJwlUP|TAXCW%RRTIsGfkYU3y`|SsQa7 zGul;&3nj2mr^O*Ext-vrW>4j^LzEh04C_bq+T*6(_rSb|b>dKAu{E^WQH%oVuw>Zp zLp8rPC8ceUC4R}*+xs7^v~~JacsXXpUt5G%|3Xs`$-a{rzet^e?7}?%7CIA6xehto zc1wJ&8jANII|Z*tn2`h(l=}X|yXi*Wg{~SKILkYs>u!M_nFt(GYZ(i0RIZZHCHEa! zXeptz-``d31QRvj`e20*z7ctt2~Cd(d^T|kB^l`gr!-R1?jJd!8k-{t1bB6MXnN8G zb$aB{-(NYqD;WKC@z_=1I7M5Fok*4D9-ba!1H5XqYsQxCr==s{3at{)%?!D%9-R+V@acvtLp?DDl}QApV$ldKs4EbI ztLvD6u3Zja=_GjTSK}z6i4RX}C>CIGD2rH7sbVT*W%Gcp?X=a^);jUjRV>(#LVa>w z1C4o0>G%%wHsk%orz!)d=!K!3z7qCqc~>tKgfPRkKNKy>EvK# z@;M3J3n9VIuG}s z50;LO#8Yao=(+=|Xu7{ri@#rNX^+n-Nt{SKr+WtQo?Rb~;tT3HcOp zfKxIaw@)}tGq47}+nmHFd^jdeiC%pwZ8*E0HV7j8>AD115-JhzYHopocn~)lINSR~ zsD!+6^Lb$E1ygNMw6-8jRN;tX#=oeDR z3{U`n{aX4D(wS#!wC4sCm;vCcb!6N3vQdM{LMGGmXWbMgbn7v(7TWuwQ+ZP(yV@6g(S{3}y@a+NP4 zY~8P{Z(M%6$OOpw* ztT;6MDjudp-)SXhs|(?D5Exq>oo1ea^{W6WeW%Pv(#VTr6{xz4$T-NlkJwdU+7&Qu zb*BLF>hs_%rU@Nsxexpl&eXPIeOOgJ8TddZ7?ZJ&8&aLV6#;*_PwUz|?8eTV`{al(jPsljW>d7jXk2ADn+dGgX&kq;Zn(aD&&s8PS;`p20j;#}RfKhuWWQ7V zg5_bA{HA=7Pc9+dx{dRf)6=SgB#GQx=X2m()G(xkb)|$64ho<@&nnusxgB{3WIulZ zYkbhyoR@sWI~TQ9>GKjl#qjRWlu#d8BCQ2&u)SV_v_7OI_ri^mmy>Twm8u%xm}Uqw zelt7kmTk;!T(~G{FN4+4y7n_wpWuqzb2NecaR5XfmFA!Ast{m>ds7}zKR)gjcQJs< zCB#`ve*0ptORv*|wb-V5D9h99(~7s^96wQ$WQBUj1mQBJTi*SxNoWKa39N90oMTB4 zvJ}%0k--b&Z@Zc2q1dE@@@{H4S7BG#3U6m>jK(H3O5y&UP~kYa1gTt3uq zJiML|BF)0*a)Q)q_>S#CLhN+~fx)-!jpRX6mALlaEBM=;QaI-yKzX?S&RMC z9Pg9cDH6+vniD1%2^|3OwW;{$lI=+Rae6l5MNJDL3i22G(6)YZU!Sswk6NGTyiSTT zsb$pky&38x;}I%r<(7ix?!+w>U@YpPJ_ZeZWa=Auhi$#&H?68DC&|&OWMfro@}UUH zvJQuX=k=XTl@j$CROw1Xy!0fk9bvLaVV9GYwJJO~!^XLsAz8IBIiF^-U@j+*XW9aD z|GhcEu}&~&mX))tBZ!qZIgfQ59S8RVbY3YIfed;6wT*G~X2RDB#2{kBg#`>qyALJ) zIyQgWe_8al4TxQ|h~eq6d!k0?<{(GMrm#FN_?ZEPWE=X>N?|c9^9aIH&fWov@!qW) z^Tr_y6>&Bg1!|ZC(!%bbqG{I$p&DUgv*Z7!{;I$k@U>ujTy!H%aU&N#g&V#xoJ_nP zo$wmR&9)20lEWB&fnwos3*yFKB<0@Y2-7(%D~1sV>N30&yNr}{uSA4KQfmt||BcLO zm!5!7JJLeV1D0qi17V*v&xo=Yz4H6uGx1agb>_PUW2JmKh60YtaEQJLG1zd;S_?W- z)sg(29ykWx2>qWQXp{Wo=#C(ZL=(iUJ`ClPYqMinEg)Kq(aKO`Y4<{qVFC`52-X;#JZ`SR-}K#A-%WysN~AuOL(0gR&yEir=uPH`56T6#iau5u{PbaRg8< zp2`sGSN&`?$6E(Zy2QXtW?aX}g2}p-7%c0}pisEL6(c~_>YWM;luvvgI7hhHN3QLZ z!HcNdS1`p8IhUn&-b?a&w}Bd}|9XD=YV~rV0)K97%m^#F6g8%BH3H$fa#g-PKq@#Z zk;RR+bv1paz$i$BDDiMVkLtV7`TFO%X%U+1^}09rB}peXC#PF7O%>ub3mN)_hrpl| zFZ_w!N5pAUQa2oJO&V0Mx?{v*ZCLRnNqOD*I2FwVp~FjEGvD6;5Av&CH`W;IbLd$G~(U z6Tl0=cO=AQ;^uMv4NcBJ&jmd+oB3mhgg`b`8@n>mG8F7QNOD}JjYh(CmFAx*Q2Y_u z>gNhz=RB`iT{aPJ;hiae1ilY<)sv`L^*5U%|7gKl>(S2KCs(=TOPGMFMUQNirIxGh%+>TnrEC(@cN)y) zFWOwAJN$BZja9*Nz1CmzS6SHg%s5BBj82D}GCAYBngnKoO zOnt3?ntyDz8?!Vz=e#{)g>}0dq^CJW%6!f-=H192W;h`9>v!I3#k+9++QKWQo79h!5}kU@yfd3IpWfL5D?5XCO= z%P-!i`ElYgC>revZUI!+%jhL4w{0@FUyxiFBub>mR}`dT!t<`t`7rP-_!1tq-4nt= zz#eZ@iP#+&z=EFE$m0RMKKJXkE77KOjH|t_CB((#Y4gh#8Gt5jkc>A}OM9`4Ve~nN zoVIEFSx;xNZ_poclb_kN${!oE@q1xz>$Gj#eH~wR==r0W+tUHpH!!F4D?=;x%`I#c+T zZCU?y6O0pt6BNzcmZclQ$cLOg?l0q%JAWb;PR>NGv{W-J`1MgjeH3T|wvLm{pRS^G z`Ju}24w^naHMgpXKlZvl`N)3L9oK*8^=QiWl4mP`_g#&CZnEv9VK4ECycu6>3Dsq~ z{YCOnyHto-pE{NSBK=b`<}}}l40i>=CCp`gf|470E=Rgv{HGEB6-7ezwSI}_k~58? z;KaSD$|1RY-sdyh)a4~UzT~qf)am4@9*7_L&yI)NZxsEUCAt6@J! z!e3l}5_vg_4&;XR#SfRKF0Y|)X6Q@h-+?a#vbYx9bXak zuQlpF9MdNlnl6ee>~?z+)-ZGK3M0(t8_Zm%ABF)>a$Q%1&FBkF;OzN6jEizs9jW2B zvEDqMEDPE-8o##lVQ!GpH<-?TjWc~2i^X#0f4%LrlL!09?d&9jr79nKNj*7kK2^xP zytxB<@F|}T#@#PJ^PIEatX$p>jf%TFZyq};5$M}S!{C6kK0~!s#}$G`RW6Zs6>m(^Y~ni}Fu7Cn(1Z6EycSg3=pmlSY0y z)A602wp3GgKeNQpU5;PYhk?Ly{f0vRw?O3JNJK)*^8$s=x7;J^wct~3urEK$Ul z#@&$xI~2{whLS1ggP+xW2a-_5kp7=rdoPVbt}zmtjGmdfp$PTt&u*Gsd5?H8T>Ixr zH=j{UTV*!KC~&3qt@-&yBEAteO5NmZFbm9)q(LtFR3W}b6`pq$9K`P(`eA;EJdh~B zQ^2$IIzaR3TBc|kA4UbcGdT11FlD$wzZ;?R&XfIS>C zs8<^ghm!&&Qe^xX{WBSqf1rlMF8te+G)gvVHy@Xoay3nmCQ%Je$5#MS8E^?sU*A0n zT~sc)ttnvQp2VNAIFcj99<5Q5ow-R>U7Q;a`)2L+viKZgc*PpUG^Va70ljDFODG25 z552MSO6=M$JE^u9UTI}j=8%plYLh+%J{TqhM?Uh(*wP6Mv)N7S+E1rolqHzb(BxZd zaQBnk;LA%^w`-_4%{CbVix~H}x2fp9j`eXeoiq_Fr(Rnk-qzL%$MCnjC!s#S@SgZE zaA+K?vmD@Bn(Q{4t9gwvRFJF;La7r;*ORf1u?W)13ilXkmzllfyKJ#MvL8Mj*Z-Ax z5h7r|FE)9+gJfd7QMQI!5;X5C$KWZIJ6zL4KN9Iw z=Lf|ic4H?+Oq9ymW{0t}QiRKsbTqVh{QNnS&gF~}p2?6si;lV4%qt6s&w`mZz;JLP z&Nv9;9?YL+6+XNyONsr)&bEK|3obJlE!*%xGiO2X-4_@Q#a}HYu^ydM`Gv7{b(sfo z+!l7DUS*N^4j;myl2Iv%nwjPdF#^ihKa5I#BxM&172q-sme&$KtQd(d;2n&cKBu1x zu0Xl=SMq@|eQHMgA}sZ@+2D(KmT8jK?XRg=@G`v%fOcgR5gTBn z65<<0!M!P=hGmXg>WWymxeHDl(7B480SL66VQamIUrED;G=I7J;Em-vcZYmf^o|uJ6W06JiXEVkYy`s~d7dA_be<=e#p1TueAcbHOHB%;{HOM_0OJ zwFMUzpeK&CVo^he$R_g{rt?S(w6~rj0$d~$^1h&${-H@kv=#$zIP^~6C(OnyH7$ZV zk-WG-|3V6v>`Qsd)|4syd@HYqt=^~R297`|PXJS3Fq0~`DO+!RSshRCsccXMY`SBs zE-Zs?k$r3XHfLr||H0ngN$~Vy>j*(vgcdg2wrr*vPnEW^tOj}3kVuNH-kIFs2Yx|j zjHllp{HwmMo5bT&7t79BIh#_LS;3MP%QhP2XA+K=nF>xaB7CWxm#ECeg{x`ggfJR5 zqswLT;?Atp+V2Ti8t%P4w#!N_d%+9en;v})pT0q2& zCu?Fytd)I}RHoBEEx_7(S`7oPF^ADW-pr6OeQE_0Zc&*OO$A~ENkl{W%OH7dRS~J% zh!R@Zci=(34mndZZ#xUkkD8QGi=D4OPV$!MnM_2Jst{Y_7)AG$BN6d)oooC1Ij6fWmIZUq;!ebr~I45&2t(w~SKM_Qa#?egw%j838k?wr+3T04S9c9uD&6 zlp1h%FMRsyS{XjCG`VWb$4}#4$EIs9FXLQtzbhgRL>eJp1<0amb3P3|h}59Ouj4f! zrTc;|$qX~ql(M?Oa(rgUBOkRz=+#2Q=FGq2uN^-6=0T*6MXretz zr?y&VJW0`g`Lgjv61S2bh1S0ux(cItS`nrkTGB)9x@_elLdkRqv>3KN7odY^%h+!D zP8r28`Npc*@}|g^(Y~Q;7E%MzPJA>aJRF2bw$d7`+=Ol~-i2>C6sARCCKsQeWNEU} z7_cSPx(rGG5E_JeC%?{@KY>VG{k2h&%U8^=Q`WTJj*lj|U%Cva+ihx46s-DXp+#Kpr$1VxLb7 zl~7R>fmi7a5ws~ zqPQ?VOc5m{PkqoZYs03_LYgLhuX4sFlwaZzGb$)D( zp7v!x&Qjl4sxGko4zlGts-pzK)>i@9+Z}eyL|e)5K#)D1tfXt4&N=DrhA==A;-2%} z7munKX`Uwv)pZ%yI8+3K2UkCYp7hbjDt>wKqM0A9Mb&Fq-pytrRLOi&SdRTfh>)7f ze%6(Sy!DzHEeG?~W9pld7r}|ZjezwO*>y_HW;AKcs~eP8HJoAjzxV>beZvA6tcU z5S7uA5)j(oNQo8c7-Z&egXX ziPy*wpV#@v*{Ro(Dh?wNlP%4tr{hiw3=b3t>S6o8~REGa$ zNs5)7^FLdX;^F>(#xHE#ENuVjMw#dg{aC67^!~M5l`9JVqoVSsk}}GmdP+>Z+H|ck z6e-0%D5U~;Ih zcrXUUzlGMbO=|OeOJyyX6_wo$OMxyjjhI6XcZwM#L}$McoxoevzDVUM@*yq*3{YD# zCfd)7T9HsBgf#M0>Y*OnU==oHc@a$yhVM?Y#sW1(;T&%Zv)Cm1ls*r@kC5;4)NMn9 z57#vGOxmQ#OfFOyr%x1S6 zoce5@G*Zb{=vdE2pMzmu&yOvgSfP-I+mT_M5b6IDvok#kO6=yO$k$;0Q_xp_aO>-^c_Y7qH2BhqMBlM9bD`s_$b+P4NokqrOY1sy&(=J4@#tx1JS2(r>N{m zwzB-P`G9*D1mpSd)X_$PkvlcNy>{>jEKhiesB+qvZud4?4#ksZ+M{X%ZIKkm=1IqS zMzUljamWi3lt^fKW|yK<>Urb+Z^&ILV~xzaq#W5PH3LDJlk$RVuft+Eqqs^ z@zvL0Q?oE=ifoXHFnIZ%S|dOv$1Zc@S|);2rdyjeD1!e^KQW%xnn!{MDd;st8&Kx7&JqAq3Hqy+u>?a`k!t~wk;SSbiH z!9~hcRGn2L=~Wyx&kO|CnjaYu84%Tah>i|Wm}{Q1mRQ;nu?bLF`TG$1yNQt8YRdWA z`>Iq*R@4z$`1{V#%4_=m3k%ZLu&x+6L+cf-=)v$}IqI&uIfLZua5I`mwv+8+LAR>u zBSG@5DHm+-%ds;%irWYa)eNOLF=!6FcA=se(9vR|)7upr7XN@u&sx#PtLgyTi$9tI z(_t8!N=vXkhV@qRC}|Wb9>AcH;VVz|WXp<%MVJwe8JgG`ayQpJHt%Dcf5$#Pk`9Y? zH(^3)d;Y}^$Y>%b--N5RJA_Kl;GK->s-j1vsTyXz>=Cj}MOO_Zq9pl6$lzm3l^L-u zth4JfVxuuk4ECKCJea{WHP|w5!*wT+8(GKS8-(}pA)MAR70tCw&CU^>-1+^1VygMP zK@{w!mC6()ca>Q17J#ALOG>ns)v(@L zi}x*Aa|>EQch!G^d%7X zUll#WbZ$>^DOB};g1aEOy7jLC(^~oJmnhE4`I3bBlD-K0k_>v19@gI69*0#)kJLeG(QWk@O_pujRb5nQQS_BJD+6M18mynuHRL zZOF9)#65~#mi`DReDptoL-x+w^Dp@Mdy?kpI->Bf6lr zY7PCye$={A z!J>-y5h?kCc5&Wz)m$a(c`4$Hf#zE%RUq5{Jz}1iI_N-Gw?qMB3uBu+ta_n-Q8o4y zbj*7zS)ozP109n5pjxVapt4cJdBtic+siph!2dT~Tbk%U-lyRPcHTd%gzmPLG~J@! zPy9r6Q#b{+`}%@^N2MmJCwL1*hl<)dKn!oE+bjFqm*bypyStB})d1??$Ivwa!1K$> z<@2B3rAJiXJvZNBa}rSNLzxx|T&OQCJM)u%bDonCjxKarU~{`wxKgl-&W6#vx@;N_$q#&U3zT``%OSWitkqN5OQym>%3^jMgxt zl)su*XW~uv#S z?|o>nVH-dj}w#Quv%_!2M4LFUq znjU`Z?(PIwztrt=qNFs3uTvXs-Ci~z){PYnKW$Ig5Hi%FcZ>H8ojy0nB#%h}U)c7* zba-I~q!?SM-rJNQp8hcsl$8)+Hqvk+cvsSmN0sH`LtH{p2c&I?!UcaLIL|rn`A#cr z>=8uv%EC_;TAh=eJ7j#PtF3HPn(0)TBVM2N)@8DDE+)xhm+S8PA?=0Wm%qB zr;6>O=P3Pr&H~pJ39a7f$rN!$coBxQA^CVACjg7SNbDz6D2Z0s|7DKN_UYff_Y1o? zTi7|$(lM)AI$N89p^A&qS5sqWa7xtC)X*86Cu^u`s!8f*>1;u2;bCv;=xAz2YHw(4 zWoT|n$E@gRXX0XP>PTyEVg@E-WM%rq!oE!H8{x1?$M?-siQxj5VaYJh-Qv_y3RWVH_ zaTjZABSTwTQ%6!-RSQceQt;nD^3G ztfi|d>071fNUiJ*oh_V94N1Y?Y5v~F$;8IQMuz|Zymh6W(N_d+Hg>N6pO2JJ2+ZP^ zj!w>`?Ck$-p3lwl>7Nf2(zi@&XK+24#jU}e@!8ba&cyVsa3^PQZ`&Za|F)SOvBeZd z3*P9+HA)!@*+1}-Nuh$~6Tu+U%x55Eix78YN+7~o%>lTS1qxLt+r&O6GvDia4<=@o zp}I(8`z}#--;%XTDKA?$W!_JFx@CcGAHV58z~Fiyab?~cd21>>gMO$#-8;MfUL#I% zdwDYZvGn{r$U=<&Gj1U6)tl+I)BK^C@G-m9yc4+ma6Ny?Hb!z&^1QL{!>)gNn)*jo zWLxZVc4WT>a8W#v$#jc45?`${;Xb%q(q{VN`ek6-^H2YaD-U7Q(*4Eu#@)*G#)Is* z8{gE>?a*O;l~pbj*ezcauaR_?y>BDB6FxgiGAi)ccp5!1&Z{4Wob#|dHZZ3rw{mky zTZGeql7LlN4$smo>Jy?K@>oQ?Nw1_Lq1m5x56^;AC}ICSIs{1tWdqL)$QexR((YBw z8vlweWM_e8q4{3q8{Q4rR$|+{!+!_g4mZRfB{#%d-`Rd6SbqccTzLPL{1>KxV4WJA zQ9!Uk-HQHSpiTkoDE_}OX5frsf(^6Q_qN5E>;DECtFe}4xw^-kF_%TSx*7k1UPfnj z@YTNqqczj!VA~L#eY57|H-G~M{{IuqzJ#xHw!+vJ>VN?@7;OA+AQGqd#k-uCcD@+y z*Vw+l>$Dm7rd;_(Dc5lb#acaKjL)xBA~361 zdYb-CBQR@_>adcsld^)b%64|nZ`ilvT$SH$GP8TTd{dNfm!C;>__^6d!9HSnxVTtY z#W+3-i*m7wim{7*7UN<6{8^ZdgAG9Xf0KZpBx`DG4pyXWEG#_#?AZCgH3HR&hvFBT zq%}7t(tPY0k*`4?W`0u%(PLD?9E-F~M!434FqwlW)%s+V*_+R})%(NQDHG=t-+5Wn zxOaan`2r<>&_I)9%ojt(4b_a1mEJ=-^uCXHIBmgX*uQ&!0=(4vi$}<9?UHZz<`}fg zqaZ9S+}%mXKugOYiGVPC@tP!?O~+9B;1kX4-_sM|(wXz8ZI~fovnSx!Dke}P&B}mr zjSe(2ilO;)zRNAVg_!d!d%JCL89wu_>P*+bHbfa@1&khLTj;q>I^}1F(Ye>V$Tm*t zVo}$1SBgp-ZJ8c^1c8|hNfyM)Z1D^jP4>P|fz9cdUf!Mv*JL@+L zcE`P2y*M@xIZM3*oQp}4TVBv9syD^hF|%Wwd{~18!SA|QY)0}gjJ3bxx&)C>jFa^< zHjm*ttoFAY4K@Yd zBjsF*9Z_8Cb;*F1fR;P-?qhDT%)f4s>n{YhmIi=`r*}E$V#A%Gs6h0`%F)=f@KXx? zBpJXGqWEP$=tkqBUyoCH4^HO}>(PR2O&oB|S+*b%d9MsClI;f{F~vMqqAr2`xW^01 z24<#3csoPsLrY}G!g8MXzc+wlC(cVc<<)=E;=jiMnSoqnt9_j5^%3>?izrA|25vL# z7*%G(r-2TTVX5?+g&uT`s<>y^?B6+B6PYoXP?CQYssT-b!LnLxt&w(c`ax15(I-12 z7uYPOyL);d;HrjqB=^YC)HBeC6kJ`k{yky9&&O!-!jE6CSV%THy$#9+rnCV+Z=ykk zA3Z+hmgw+i<$*ekKi*6k17k#!v7^8#OrXx4c6x+&eNL?H+SY8T5sAQknY~7Q#~qlyT7^kzV`NjT;@-n zU0@7&Ebn@v^nLnvq0f#1>^Xbya}y7m+)Lf#8G-Tv<7qI34t^8&IhXw-Ve9Q%k;ZLf zQC&L}Ic3R-Ynx~yN$MauAXhrs9v`R@=x`U0L~_@7$-zny4>(sl7u&m#N_$FUz8N!y z@mbgXv%~>{M!4UEsAh}IOPgprX`&zHs7aY<>u&lhYPfLTe?^Vw5%`a+tzN##8nCv+ zhl`aU-LxjSI_n>4%TfgW6*qwSy`6db64_W&?kUm_NY}I3i|w@Jn#2k0h^FDKpGd0b z9=lJj8Cu9~cTAVrMrMXw`h7(?EpRs%{pUF*CxOpEvWxdS@3;qXS-Hpgp+oPBcWRrp=XrvV^!b5=qm}>-S|*MJ zk~gsnvuv-2-_!zVP^_V_iTYgvl_bo}{}St>KSw((V5J)fJ8?gEDR$7|mkLzs1IwP`5uy_KI6*t1 zT4r}+2aoipI~=S>5iEyqPhQ|G2lA!iC-?|&va2x1A#?eSC17pp>l*m_^I}h`pOHSi z(r}ts-U6;jlJd?6Fg;n9nb~{Vn_&1G>K#w;wc8yh8&rh%2KpMT89$ib{`(E%3q#JA zTITjmou9J)U<}V4V@@661=-?ntW#&Jx3R+Qj!D%4>&A9tUwSk39(fSFE8$nzvODsH z;L)!O{kTIUhQmF!fYj(UgfuS$=3KX-YV=+2n%r0jeL+^#E@1%c^F#cbcJ!FPd+^tS zY5;27ud*Mm!{>7QdjI4{_<7fNf2gzLz}>y;cxFX^NjY=bqI~xd;(;K4c|Ul0&GF-% zBT$}SU!QeC2(-}T<9dB|O?63_wd+K6cMbCco#~9n!Pk4d9X|Cg>su$lSTBSg*mkd- zrm^uM7jt;NWb|;dZ#U@a`u!#B@|Kgx%R`z6qU~kN@ZCe02i(cUTO!T__2kl{@ZrJl zO;=_?fI{#)pTZ{EF6SRd-3w@d^2_>v@;AkH^q=S6YYgh2vi*U`eG}2>RP=6-A>7(l zu#ACrA~pNTf@mv&=;fKCXjeq~9QuSll)Z4EFnvsRjD5`9SXzAw=X**9Ua*7>zy9b# zWxDJBD`8phJM~O)gjsWCYO4Rf%yKuMJkzxx5AVn=nONsVL0KbK6*1csRU(3_A> z>`50b43EDD83GxBOgx=A=EVl|;0(eagpKEPebs*@Or!UoH(Ja;62^@2-9O#`BY=b* zY?Pzk%LED=p)5m42`dBM}1#DOM&!NK(8TTk|xO0>i)V&e2 zU9={V>0CEDXbdQkb{=R9WZDM}RQCnutVcqBHyuDM+r5mr;~)m0?0nKE{Ap+gP5u+y z>l}L8(B};L?K^>^XzToIa3JmqH0J8B_X_>M$8@qMDv;#WzeJ2!|MstlwOrhN*l0(Q z0|MN9SN_UayOKBZn~VYMRQ26hPrGzMgXeMQ#LK&pm_mPrOsrM{fj>wB2w?MB83H0H z+=&!Q=9a|0CfiW0E_R+600MV`4(;)t%fSCCb!wU3*iTKWIF zdkd&Mnr%%u1b24}ZoyrGySoQ>4<6iIg1fsza6)hi?ivWL!QGjLobTQ<=bkw;b7y{8 zcdcH}s{PdN>VCU>*WSCTx?i|R4CU!AeO@&JX2RssPdSNW3H@-MAG6VE@z#{)nU9mh zmcbVr=nYs&*nuvl3!1l=cWO}i0QS;jor$FCg)--5O#VCqP@F&^Ca&^#7{=%sRbfgJ z@GI>y<+?_G?0^F$Upbu-9#iV8Kq(JdCT0tL;Oc0voimyh0*(%|^7QjuhJsinYB)yf zP5OJ&Oa}D(E*aqJnoh6!8R#~R>{u9WBP-R=ZxUMkEJxjlxcdn7Q`fhxX`?)PK%0;r z2_E`=^nB|M35*U|*m4&EV>5HoJj$)&y}Z9kehq&#!OJ$tx&&XAZjFG70!mxE!`3EX zsx@PGIu_&zM8XOOwX${0fX6E~$nxyM3?>}No;UsYd6)(8d1&|LWos!=A9^SRCaX@^*n-vedk60PTjFZdWb|tPG4^3* zP7|`taL;=WG*eJ!P!$ga$D)*(>hQ4?r)@N5*l)MmRKwHE*Bv@-;!knIKzBMuwln<4 z_d(mg2Ad*hgod;Hv{^&vDS+?e=-S!W--crLvWuXPqV*ypxB$x9O;6ZV&`G+Y?*)hb;;Oq>~y`P&{QA4NQfHa;|sVN$G6n=tdNhR5mU zcL=%m?2PD}ygI*dRKwS>6Np-0UEg{SR>}2Soih=e{FJIy)~sj;X2ADlCye#Sq*xC( zo{UdDkSY~MBvvASk>dJ^Mf(H`%sGz zbrRZn!M&}((YF)cxz{+nVdp1TBiG0zC-@;NT64-ax#*ql0s3-fTcIv9?z{fR#AEbx zxb!Vl|GlJP2f+Ajq}%n_y1;n}>kG4(>AT2yb(3ZJUR|H;(iH7*nO)>D-ip#TkRin3 zPRS*+uaakNW_b;_f;ZlhK3|Y*<2Maq*0}v>g?uqJSw20sZctu|ls$%xB*Ih90qGUf zKGY9u=NbKufT{h!;8m-ea!GlKD?M6Mq5!8iAXZ_p-T%k)?Yw%v zEN=LzKe46uhz$E{aCtjv!zGv`*H!Ow-kTZyl~5Q(XG1Fc%NXRtUfD1)<+j6BN?VsU zsO4=dvy84uVh2|n(iV!t2dhN0s}k^ zBo!P*V~j)kxLH#5d$0N2`4NxjYeJX)qtIbka(-ZEqucS-%zn)j$}yMeV*-xu)dAi@ zxU>Kf=GmuT69i+QVw(}K&Obw@@piu4JL2XjX2ec?-lW2*{$y79Axv=hcnwIg8xJ8q zPav`T@!T6#AfEpx%8U{JV`|7{e^R?&HARRoxgD<>_SB!`Zk^*#kSSX?^(V>{e|n8F zb<>TANn==UtxC(Cj5)t2VMDt_j-mf@3^?avIqm)ZC(ZZT{mz1kWA!>g?Yy1qu4JEg{4IyT^&1@jBo{aS#rWq7oG$chpg z;YZJMAD(&*HFxZtxVqv4mpypXWG&^WS3uowwPoc*)2}Awi&_#|yy}-3`tADbvb0Gr*14MS*;UL9WxB_c%7L zDh2+_2I~EQ+AyMzs4 zP}RlCOL$72#Z)B(gnGeoe~fPEXrO;s%Pws!VQcf%>UQki&WO%mf|n+qSF5vCj{D=_ z?9*DuA}HLtcJjK6Uaan+Y|OElDYbPd0@P!4XV8pEM-*&_EGzm)+#jpkH)8_)oB5W* zS#s+DoWRQIz|;W8gLn|4M`Z+gT5^nd){XYEwCFDBnsVFxar0&3o;@e?=SVpWIrOv7 z>=|hHROk#U!#lCAXD~{a(iL0h3%0Q~O4PR0y0IzH$8>Q?$)(N~pjoyH6z04I^F?f@ z31=SxmrP|cT5z84k)n8@RQbiBrG$Kp8T~$9eM``&nGI0$$oTTISR=7yz9>D-o|i&y zaEhvzAWPW3Qk2{Q7!W9Eu#f4m_mHfS3-zRnx@J+Tk-L>;*a=`N;VndS_XryZJh^;P zgK$8`tY-xp)c(GmTP+8K4e`-_%S4$i>A-8M@r?1>Y8Uda7bS|;N}$|# zo$08W&P>;nJTHQ6g&7U* z*-4s9bNb3sL1k@97J7|SYrcUN-Z4W)>&8)sC96i5?S`0#O4DPG7sR&mMY9UDpNIHK z1dm<~O07>}lnqm=k7=aOe&GAP8u6+dgaaygm0_BncDfUp1EznKBi$!X9Xtf;$9Vw~Ff<`c?SWKsn9# zu-R~q9Tt(4j~Je%6UlB+`>}r4VjI^{T@oQ|qvTD{F4@=wol0hb(VC1>dLM+@jaUx? zLFFMS*3eiwz?)zi-=#7Ua_s&d2Ll| z=-1F&gV@JmY}fExgAq@Vd4chmId4iIFqj;uFn##)KooVz-}<0d0W#Itk~we<{4foI zoL2saUxHxfK@zG_ndITWy@UOxk9ZL1Sxt!0A;19^oC9HzgAmoBzyZ;}29_S+#sOZG z17dFnG1|r11eNsejMrP%qk-tHGeIdO{$tGqQkkI>sjnGTWaikRJhY#Lu6#^!Co4D|Q7%LfL_pV=PfUd-sxYbSuq!)Mnjq$Kplv#2n!p>^ z5S9Yn?FduXK!B9x1S_*c$;{XE1P>T}a|N$jgRkq-a)mrz1N8`ydv}~P(DeQ|Y3uQ8 zt8U`;(3zLUFZ!W-;C}-Dkp4RVg#4$Pt-6(O2io7?CXqdV-PBEd7>f1QIHQ+(GX77J z_8!g1bUvEus<1=CI^<{eP~JpTH;;3~=}845Fc)mICaaX`0cCcOj>R(;tYtHVhFZF~czoW=I`!oJ7(nne@^|ZmU^Rhv8yEN< z>p!y^1BvMS)FVJ|&Cmib*U1?|&fm|7MeE7FO0b)V>jC1n0^vQrQ4hi9=kJ`xUXSD_ z`Jet#|ATA7`P{|+p#BCLP4NG&rLyoNjCN>nK1)L;)tP>jYxaLWRVfW*l2R`J;&pPJgOSr`CAfWiuEXKenzLaSuWrC^z+yX@T|p-X(GS%LEV_hbT#G~HFEN&axa}~HIz7#TAW#0MmVC@kK>xpC z$>1~9uwScjuR3(*A@A4T-~|ZTVOeBj?5{%M1sdAn$#zH-2P@g(;Jkx0U48$L{aO=( zj2-R~|Focz;t6at@qF81<`N|d>6|b=OBZ|-IO1A`YAslpKCM--WO2~0=#+)3QWn}p zJIzTuvmL07?{+Cph7v2#`#oe6NeAneHMFXJcdW?Fo6)V~1#4fr(;-noj`wNfZ9EuS z7N&RE`L^`&$iA^~X!$*zOK{_o^@9Di;?VM&WmUzuivf}sSMg>)sGuYNbb2RmfPr>b zIJs4-x(;Sn1Yppi)o<r9;)LB6VJL8z0?Q)1?d55(?$F4kik4S56*@R z-22ER6%?gJgt%U~U4tc5MF``H9K8LC&?3{4^UY#| z=Kd<_(s*FJk5>~tu7JzWB(z0h1oKmC2_i0g&X;9vNO&;%IE zee31l{?_|o|;w%VJnvLTufZ^OtFb@mlb$CAh zc2EdH@Y90$c)odda8cdR9MG3`FtS3Ro2zi?fev;AIBRdU1El_0w-4A*?zIm?U2vS9f$RZWq;7z17d*ku8%It1c*Ul=sR73-Z!eB5_(dme&TjqQq zcPo7)=OK&U;kfWfy41}HA4{_g2~$YdwF&D=u~fABUbisj8s|gtoVgmsZR*B6(8PL+ zoK=ZGp%1hZ->Q*5hy4Q?EB7?ghByB(^#6_W*&;t6{j*m@{*E!e(9YU^u zJvz`;?*hDI(H;oBnR?vGX&uKSk3q1xbs$^%`|3R+f1l#CgWS?oJnsnQ$Cu-J7iN+B z%E-fLy-W3C8V94j(|yQ(q~q}s1D?En7Aha&6M3oNRqC7Yg8mbTUl!O@K_Bg)qB`I| z5Q`w;;{;ZtQ|qzcY&GZEA<%Vy2=V#;58>mj6zEx=8 zv_BC!JZ|T1Y|x0Fo`gRxEqq@*OMZu4Y>+)eY`#8s6a17sNMAIIvR@7fJT`+xey2<- z1gI#^*HvekZUVcpLVZFkqDi|qa0uphghicAUxIKLNb_?LA|TA|w2C_Uzd*3Z;6#9! z+a(os9_9xrt!63;fnr@utR5-)pAx|DbS!5Fi82i4tr26bPOL&Gcca^3magGwLpDa? z*!bLw!2{WRQ{42cd$ltx>BKJ&3SPxf>IR}^8#dNg*Ky>?`f8y|Hx{mlgupeAL3^0> z9cOoQ|Fy3cx}CP0yMTZ_A4fVcCRQ{`G@dk3j+}SPR@Y&9lbzE8>L_YC@X5?a)GSEt zM8ZLo%t#+GJz)1HWH!=rbq$lS1NP(&!+ZRp8rhj2{UA`21BA2b&BW)Ngq+1JrwU)R zo|XN_T`s61er_=};Rli?zWMC8ZX(5M;1{JnI_TrLLSD-Jwh>nfAm16sDUL+@um}ON z+x>++cp;0$z%Tk-30^cmzmV%Mqz^#8?q2rRO@+S-W>*E|J9YM7ZT?5{m-v&5MCag2 zBxpn-dIrkJJE@jjh0Tw#%1vUaDNwte$>Rk{4jZgRA~cwfkWXwyu%ty)97VM6iijwR zmg$P%DT>mXxl@rI>>F2p&q~i$4CHGmUYB=bZUATFtlOTAY;`m*%LapSIx?ZPX zwrtuhL9^=XzKZJi!BXJ+H`HZ1#xrH*ZV4&?NoN02qwszI$KdItZO-rp>B8OI`oL=) zutQjh8slYYo{rNrjmrCEy876bX_ViJmQ_-;gLL(p-=>+46n}q{qJ5yNCvKfqJXN&( zA=REhKCrOW^c}A@NKxYJH!f*&eOix_-ird&g(R==Q>n96Ex3=lPmNef!h5!iq@isq z25_;p3yoM7n;dN!lCeV1pLy)z7{Y+%E=DT`vN5|};S$0IceLAxoSrF;3Kn3ZB@0*u z_;<1LYTg0jmd446fga7)+~Qoh(6PFs3sG8x|r zoVJ&zRXPxgrDNT*HWrrDtA<+APc+`aiC2doBz7N!>a> zKDLn9p+$9m;sCL^o}2M^e{w47TwZFyYbwxk!5HoQYzAfx;)J<|q8)?@%j)<^!l&`UtzErwH97)c7 zf76|^zhqX)99uHFyv^mGy#LGZRLbeNllGv+%%8!cBx>>qJ)v1md0R&z#a+bsUkZ;{ z!Tg@rVS`IF)DBg}!{2k6{-xkmE*UGQbn4f0+;0`jb9cx9eT<+mW7H~6{EbtY6}u{a z@(4*qrf-PsYnqU;4MIXQr}FldT*^;AW1Hvr=0~L$A&uAA<}SW@PiY%MWFdMkZu7RP z?;Pd0A8XDD(%=Tecxi+ZH?)aIB6hBw-fQ9TiO^6MgUTynPd)#J(ZnETy+1iXBn+4^ zKnD>uXiBJ#HWSEkuW+)_J|ow z#&bl6oQLd26&E9;vl6d~Do=-W{7qmKyP}Zjr|+$$DnmAAC0-{Pv=FWqi=PSkild-P zLd**=uK>^*k(94GS0n~}#8)JeX2Q^sz@JsZkSJp*2m)NLohTFo3T?!vV&r>ni8F^i z*O*aUl576v2%c#UB5tuWTYSD}?o%4sU=j-x;gN{q6lB3jB;x=|5@GC648%*uvw=KP zc_>ZF((sp|giDDt%x47_D=P@*@=|s(iR*UsHpTh3RP!)f)$lBzlr0Cw7g`FqOx%s% zk-Mn~4IfNaE8xeqTnP-XbAd7XmO&UCsp2O$sCc3c&zH^;DB@3Wq>#2>^lzwOm#TQe zL`+VewG=E?ms?nq&S(mh;&$qlTYMy&>C;!yg%GM{>9Hwc+b+F>z_L-P*vVfMFWcwV zGgEP5#!^vv#DdE!^(rMX&U^kK8OxW}13Ou&SaF)ah*!FgsduMb&x?i`u5~eMQ{n}A zEFdLyDFzkEGUGU2>@SMXvY)L08Ob%<9YlJYVR^O<8$1QP&8 z0DLL(r^H_j7AReoG&wcviYrYVoJY+pr@eHyBa_>?xExzzxh*$m`Kbj}D zmUQ@HF1=y+XL+q4o?lfkQf_^XyXA+&k#h8ji!^fD0@Ca>U6OSQ%26$4J;4@p|=M&8J&*m(`DMU^z`B6cX z%s|NvZo)8xK&aGITn3RUi7176`i(MHZWj`I5ZWjJ@k3vF@LJMI+fS8v$P|J?n1thr zXf*+KpmjzZ*-N-yehxwSUMv6t;u9bt;OZl^gdy!^_xS?deaW=YE2ow`a<6sHovxr z#qjKfVm6%A;rr6>2;^=ved*uQB+jZJH|m$(%HY*623WxFm0CmOHCwPcPg@)md%~oK zSY-L~MlY&qCK3zU#&&f%^5{eiyTeWxT_YQy5g2pjo`&+sno||k#VctJQqgY3Cr&~q zGx0HQZ6@x&i;lA>?G~pgs#6w|u9*5djm*5;KoJ;h(@XMOaj#e$M(Wu)nenqMrkdDr zB8i5WbUXmV5!`PW(W40P8DXPfWOb=b6O{XF@);iIHcmqf&J~Us z7s44!b2=2HH!I>`DvfGWEr(O(VZ9VgE8|W2;uRvOcB`PcB#6*Mb(Bws?EMUY=hsYWvOr94vM0e1 zNOtl-vF8mug z_4|rB@ju8gavZ(sF>AsJS+f-*5^ci|#=3AuF=+j%#F2s4_T0E}iqmn>Q0Sn?r4=_? zOU}HIO6L!4Dbo^^I;>(j$u(_cuNjwEM}9t;n%XH`SJX?48Xgjr^<)BKqt(>a*sRRVI+mcMS5~E9=@f z#2e#uO!JvH{KoXrJBwA#6XSl&;928|Jf=r>ww7hdOc#@AT{mVFAS(SPBDbJP`68FJg%A68oW8$K+S22FGQi z6|<4n8A$igHCaD`AFJT{Kts+0_@y@upToW1d35m-9iRd*kLvf~zk^f~3evlPYB{L; z06jUVD*!?|dj|5WcXWFkeq2G%Fz0003+Bqn>-)i=DkpzIM!jRB$bSfk&wAGZ20{+S zAm9W2F&TAGPmpFiU^DB>18S_d9~x>+4~-zE&^-Y~p!bn@E1aZU4-!8*19IN;E+aDN z3w%$%g^hW>Q(LDu=ps}gHwao0`|gOGLm1oDwi0pl%_p%r)v21mpzW7vNQqk-k;z_y zfb_VO!0-r7aB`v=2w<(CDiUkYC+$7mX#=WpGBD4JR>_R(bS8_3{>er~0#)SObNFvj z_bv82;962QvK^|nNt0>SrrwYb&ZL7fZ&=`T<~OB=>+x!j7&CxWvS#vlCq5s`^*&!b z&tQS7IY7eMm6=13ELsrwcUrNwfLdyP<+pE;cjP42iqBO(TN1gd zR7fb^xU>bz^=LVXH|#50q2H_4*#3c2Rb*TAe*@O=YLy->kye#(<1*ELK#5hOnibY> zxdl?V^-slXEzpih!z{lvB-;IKGIX)!S5|Tm#T?e{XN4Tr!lw+sNV@b8WhVCG%KbpUd56b$qH4AdW$nFYw(u($qJw*i$ASo%yBD7D*@L=#l}PBR?af6 z%lqORpPevYg&Yh;VOM@4h{{%eIi$r4hL zJ!slsq&YQvVabwRp?!DCV5HHaD)ANH)(XwjwXf^tU~g-|S(ZU8F}hdSZD{@tRUtXb zYEg1{@yu0Ga*%jfmH`AYh*ua@u$!HC*g_DXK#qgbVU%Zo9x*t=OwHa~yo8o#?+`XP zLPh;d)#8jEl_I>w*IOrW7){0~Sq)|2vx@UW>hw@*7@r67Gu6{4&*W{e#9g!Z3vf8( zQWtEASZ~#HoxTeHHX3kdSgHc%FhfWCVUxZ_L+l0Q_P=|1&#`L#DHWRTw z4UY7rz_c7}!rz-uOfLf3KdlMZ0}jKb{vzKzm`9BL@3HQxFlpH|AP* z_cV|IfL^>2dalTJq}A|wZ{$<@tuL}+l5;&-1IzRY5^L?5h)QB-n8?q>Kihv?(SLn} z1!?Q)kiZ|%MIaBPpwKkytx^D7o=%eMTX92Yo^Y!H2RMe&flRghnQH z>dv^QaM0fKUhLBoN*uPKudh*Zq~W&=v;^&tcBCtM;wO=w_K+LQ&nF^zmzchfC^F-@ z_act%AxD@KkHjsy!q?%uUdYSzf5<&dMkk4{)~XF-7~~>OGy0Xm>-ohGE?sCl8lN)J zcQizJXas9KmG=qfKwcDhPY!KnrKmQGXjf%lOn z<}6Zq8aN}9_Np<%)R7uz!_*-f;EZMOOrTlawYY5q_G}a#SCcmCg=y@DyCT+-gi|6F z67!QIJLAEUBR{=Kx`+x4!TWBlli?~{&O0+gfqSS$v2k9%E95%*KCeOlHmoa&nKrD` zlCf5L2=_z^k?3a)9YM0UcaUdHNPBO#AU4FSc{TAhI?>Z8J(_<>JS^2)uGLQS zDyAkn!qe!0#E=mCK4ea;m3RFTxhmS#v*$O74&mwDzoveXH;lzuWg4AZ#^$cvH+EwR zNlC@#Vm@0Y_oPw$;yK+8WtVIHygu@(Lz>petEY1|R@V2qWdzkiXKz$Za9Eve!9!XV zfMF$-oO4Ez1lRL3FE3ri=@u+{lD@*ebY-T|e#aLmSBf3!4*;O7^Kb_s)A z;AiUL=T$1F5O#9C6hTAe&6Sj=DLzcTYQdaO)`}O$55E|IwGqh`3r)z<(^k`Azs#ac z46&0l7n0vHGvf|*<`4HB>hYT7wOxuTG2(9ga1mrZcng0R39M#NXP;<7yz)m!i-gR9 zU}lgCAIz(+^oyi16;I{ ztqnv-1$V`NEiw)n1?N(Xg_lgk`++|~ra-m5v-r`ngJarj@B+1f&nuAWF@CQ|n$P%- zYDz8zAe9QU{*iLWe#H2Gp#~Cp=K?fy`W!}qQuwqiF+ooN6Q}vevfn89XCDd?KB~LG z?<UaJnBSQO2YKpVYseV;KCP{cvX(K}%I=AOH?h zc&3KZc|?LD5)z^G*>E^+!ie`w3#+~P_8bzq7d=kxb7jL!JNvSG!ZTs z36V^LOJD=1w!TtYOfI~bKF!~?4UFjHEr@iL#65^-o2Rm_R$4Sk*`sQanHa$uO2S}Ng@#6Z~o`-1w&Qub2G@dP;%9=xI(XOy=O?t0H9p&7=eP-9Ym6A&H0ra#Ti#v@k z__3Q0%>=p}l0>Ltwz69DTNlnDjAb27`9x(k)3>g{0~nfGn)2aF4gyqnW+Vr5Mv2cGR?0-xj-cPN9(%6gc7;HD@5H>ID5d?ypk56D$X{kPT~l zlH>`#u&! zS^PyE!CkgnDI4Z>|1tSuw@{4z0}F}Tiyq8f0u7u@*=~bD{x^u-oZ#kMZgTLQ6+W*W z`aU7#f;7ry;XQK6MyvfoL6-tGb6hZ4_LxE>USDYF(b*XESNka_lz@s@ziBU?fx1>o;Vp?1<_Y z*7n7ZPHBA0O%P`T?#x3Dp-RykY}3<%Wm(_XNYT6HsSk77)Jm9iy^)WfbhwerP1o`Q z{ry`vO}kOyM=!9~G)#cm^GN{jZ*Xb?WWAr}mt+Pu+2JD(WwF{c1%^t1XSui>?W zc5%|BZ=5+k2q>mM9}z1??m#ns9{^!B{`V3beXhaE0T?I6cL3 z#|xh@m_HSx@guJ0BkhH>$9T#IRejEX9ehPmPeRkR3D;%ZWcyA;#oIzZ9EsE&&?ppv zROy3-rwz?W*Mwv6&JM!>?u3Bhf&DvT#Dfgs8-K5bOUl&vix$O9H^E|fhcoQl4O>0T(fw;qIypVmT+w|Dy3<2z($PvF}bc1O0 zu$Av{w1WX(Y}1WjEl%x;cqGKEZk*r+m8e-jnqom)}-j31;iLe^Pw7(tGgHJhY5kFFe+t{OXBc9t_Xl=}gnM$nKABbZD#x zuHnu(-k8yLcwt>+%kBAd@2BjFGtI~%ysu4>qq}hWwnPqdS}n01=KaCHt3> z?MunJ(2={~C)Kj-p0i}5QcK3m4z_P@ z{fqi$>~P5Lvvjy=L*c^R{HNNl0k!VK?7YU8IoU<$$%eRwjJiWG>!MY~*2HUx)7l?B z&YE<{wi01v1g2o9>bswvog{ypWwmQKLlE$);tT&_k z^dy=n1MS%zv8&EQkx#$Ct4s1RAR#DHWs$By(ey9*4w~i?Rn@|&y!^u(z)`;}JA9e8 zqR1hT?KC&@!Atk8)mtcp=#qpFNWg)jVMS84cvn8nudabhGFT-DN8XOW81;bB({akJ zH{3+mCHXNRp#_S@30ZZYxSWNh!h*??(VS;DF8>B`IogZ|e52b5Lp8Nb)%^FOA$Bs*ya(;v$x*RLYi^%4}oYRjNAJpf~w9S^u#Fr<8H7PkO-ijkh|Rc zD}(gG-3ABn@dQ8A3Olm0Z`1x{|I8Z2^rt%vv&HIt{E@?IY=tvxW_*^ z5SI`OvWYcvwv3dFbK;Clm_>;?u%zZq;6-kmv54jUp_m*P_p_KBqRR^+)xNaDJr+E1 z{KDEMoVpKX!eoAd-yP`d+U09xgWA%o6ocBs%g>z~y=Ti{2JufgAs}~TNF-H$7I=GHy>iLw^wYTzlmbCFsw>P`=j7&glAg7L15J%*F3~94;xt(iXOrRhJ725Fcqs$o!DX^IPBg=`!|im`fxki)$LUpO+0R#?hy>b} z$oq>@4RGmW60LG%)EWAoe^Z4ilDs=BQ6X#Lq*xZGnK8XzC;R;zd;Cx19-uD=pjhVG zo5lXUz~@Gc*e>2EGV~KO+{Z5*O*?;;7#x!}T{pfwoZ2GBCfrdg|0nS>#$E%U)IvLH z{STA{t)gX&X85#b{xGpI232iwE(YzWE>Akzvs~&O^UP@~;91%)Ave6IH6yHXi|et{ zSc|{*&gc4ShSxy*hXEwU3rSO4A@c7{O%O+7nAeHti8OyJj>6chc?I!k5x4h~hA{-; z7wY-_x%(O{qI!RXE@E^Hp+Gr_(`RRzs6%2>iPIldf##?n;af}?L&onDhp^n!OB#gu zFWsu?eT*Hje{V9)7*~T2gI2548P;g`88k=q+G7LSqU5H4w)*=dMjlS3jKJk;NMJQO zgH*@ADJ1?dejhWWPMlODOlK&g-Iv-F!TKp>AA$pRXO)LV(@S^H`_|G|mk&kkGq!<4 z*l#2)#U-ElkadinD^!f+euYx; zFjFyuF{r9KOH;)M+-I5O{M}LrH^+&*aDtBz0*;5ExsJ#M;bfLgKCv9; z=N9S0-4@8rz1Q-OJb#X5Y%#T6{mDSjX6Dp1 zX3-K8tAUJ^kYy%d{My}U+>qG0FWYaqiFq;oWkbCfXUs^+4%XR;*xoK3_%M*l%7;7k zu9!g~1#OHFK`AD=GbN>1GVFP4;$%V`)v>R9G~(ko=Ea44I((V%r~ z>#2X-B4<;eiGL@LVi~2@?6`^^JN|8RcQWZ>BW%+tA6$SUGe!KG{=vpR(Rs(JBBmBx zdi1G>)0(OoYZdut)_ll&%(TpTocEYo8R}YJ!r^5P;FH6xWuUTt#*|AuJM+YN*4uN( zvEq7>N#D0@8Nj06Z)_TDplBIy8GJ+8_+Vc{6gndBK<=|?B@|nm%xjv~m|oeEE>mmI zhCZ-Rz-~$tlm5ZMo(*kKBPX?1Lwq!olao7X=U_U%R!l{f+m_B5vZhRaR6QpBP}1HR zW~f;|6BgUadF!Ajp|+0Ow5l;ZJTx8N&B4ZD^T0TvRzzmBXd`_@+P=YU@Po{()$RSK zR_D;8C?U_x@`XExwc0HGQP27G$4rB8K^NxIrIBKL_PoL62&RQ#sUL!oWk1SV-)tHmw|%^ryTLst<|m#C zM3YJ{d8m!6a`T$PR*+aij*UuKB;ajdNESkc#P8mPLzRGr$TW<5A?p53#`Z)coN+Ytv+y|3OqT{CKYvmt-FrqXb? zHhee^HagV3O{+Op6!?18NZ0#pP+}eth14TK#fQy(-188UYIJDJH}HJc-u&@Pe0=M0 z-hn&;I>qCmi|-8`(hB(cH+~PykYmz&I*oSN0T;#_I*66t)o&^|FI9Dqbk;8{(Jh_V zO7GUUFCLh&$AV`c#oJy<8_hA7dst8QuRGs92DVAVJy`Bx7Q@3Km_p&-Oi6isFVT3ltHZ37?OG~>25VLTc-(SAk$yVry7KC zsP!O~yJUaxqbqm+S=#5WPk0avYKMf-sbB1?S?vGUs=mKZkL(aeg-Eo0!tJ2xy3w0p z=2p2_I^mn3fu*oZzTfO#a&#V_;1j6VXp{B?F0&if6&iRkywz9L74~@bgNIM_2{hD7 z9Ojeh6V;kK)QZpzLDw}>Tky$;fMX&L#Q(BX)pp>sf8yq`CfNh^ni_Pw~nv{ek~ucs82*54*1AddK*2_bRty1FoZ`i$+75tFyH#Po-lLORr z4KF=dwCT-X$xmgclbIjz0v7P4ktR@=HG-vJ6W2G0Ysfr76enn}^YNG`C_0^%uAmhs z7{5CIOxz%OanL`| - - - - - ]> - - - - -Linux IPv6 HOWTO (fr) -PeterBieringer

    pb at bieringer dot de
    - -0.49.fr.3wip2015-08-18 PB -0.49.fr.22007-10-06 PB -0.49.fr.12006-02-26 MB -0.48.1.fr.12005-01-20 MB -0.47.fr.12004-09-05 MB -0.44.fr.12003-05-09 MB - -L'objet de cet HOWTO IPv6 Linux est de répondre à la fois aux questions basiques et avancées au sujet d'IPv6 sur le système d'exploitation Linux. Cet HOWTO fournira au lecteur assez d'information pour installer, configurer et utiliser les applications IPv6 sur les machines Linux. l'historique des révisions - -<!-- anchor id="chapter-general" -->Généralités -Vous trouverez les informations concernant les différentes traductions disponibles dans la section Traductions. -<!-- anchor id="general-copright" -->Copyright, licence et autres - -Copyright -Rédaction et Copyright (C) 2001-2007 Peter Bieringer, traduction francophone et Copyright (C) 2003-2006 Michel Boucey -Licence -Cet HOWTO IPv6 Linux est publié sous GPL GNU version 2: - - - - -L'HOWTO IPv6 Linux, un guide sur la façon de configurer et d'utiliser IPv6 sur les systèmes Linux. - -Copyright (C) 2001-2007 Peter Bieringer - -Ce document est libre; vous pouvez le redistribuer et/ou le modifier dans les termes de la Licence Publique Générale GNU, telle que publiée par la Free Software Foundation; soit dans sa version 2, ou (c'est à votre convenance) une quelconque version postérieure. -Ce programme est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE GARANTIE; sans même de garantie impliquée par une COMMERCIALISATION ou d'ADÉQUATION A UNE FIN PARTICULIÈRE. Voir la Licence Publique Générale GNU pour de plus amples détails. -Vous devriez avoir reçu une copie de la Licence Publique Générale GNU allant de paire avec ce programme; sinon, écrivez à la Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -A propos de l'auteur - -L'auteur, Internet et IPv6 - -1993: J'ai pris contact avec l'Internet par la pratique du mél et des news sur un client en mode texte (par exemple, rechercher "e91abier" sur groups.google.com, c'est moi).1996: J'ai été sollicité pour concevoir un cours sur IPv6, incluant des travaux pratiques sur le système d'exploitation Linux.1997: Début de la rédaction d'un guide sur la façon d'installer, de configurer et d'utiliser IPv6 sur les systèmes Linux, appelé HowTo - IPv6 & Linux (voir IPv6 & Linux - HowTo/History pour plus d'information).2001: Début de la rédaction de cet HOWTO IPv6 Linux. -Contact -L'auteur peut être contacté par mél à <pb chez bieringer point de> mais aussi via sa page personnelle. -Il vit actuellement à Munich [dans la partie nord du Schwabing] / Bavière / Allemagne (sud) / Europe (centrale) / Terre (surface/continent). -<!-- anchor id="general-category" -->Catégorie -Cet HOWTO relève de la catégorie "Réseau/Protocoles". -La version, l'historique et ce qu'il reste à faire - -La version -La version actuelle est visible dès le début de ce document. -En ce qui concerne les autres versions/traductions, voir égalementhttp://www.bieringer.de/linux/IPv6/. -L'historique - -L'essentiel de l'historique -30-11-2001:Début de la conception du nouvel HOWTO. -02-01-2002: Une quantité importante du contenu est achevée, publication de la première version du premier chapitre (version 0.10). -14-01-2002: Plus achevé, avec relectures, publication de la première version complète du document (version 0.14). -16-08-2002: La traduction polonaise est en cours -31-10-2002: La traduction chinoise est disponible (voir les traductions pour en savoir plus) -10-11-2002: La traduction allemande est en cours -10-02-2003: La traduction allemande est disponible -09-04-2003: La traduction francophone est en cours -09-05-2003: La traduction francophone est disponible -15-08-2003: La traduction espagnole est en cours -16-10-2003: La traduction italienne est en cours -12-03-2004: La traduction italienne est disponible -18-06-2004: La traduction grecque est en cours -L'historique complet -Voir l'historique des révisions à la fin de ce document. -Ce qu'il reste à faire - -Rédiger les contenus manquantsAchever la correction orthographique -<!-- anchor id="general-translations" -->Les traductions -Les traductions doivent toujours contenir l'URL, le numéro de version et le copyright du document original (le vôtre aussi). Merci de ne pas traduire le journal original des modifications, ce n'est vraiment pas utile. Il apparaît que la fréquence des modifications apportées à ce document est, la plupart du temps, inférieure à une fois par mois. Depuis la version 0.27, il apparaît aussi que la plus grande part du contenu fourni par moi-même a été rédigée. Les traductions doivent toujours prendre comme source la version anglo-saxonne. -Traductions disponibles - -En langue française -La traduction francophone par Michel Boucey a été mise en chantier le 9 avril 2003, à partir de la révision 0.41.1. Elle est disponible depuis le 9 mai 2003 sur Deep Space 6, avec pour URL original mirrors.deepspace6.net / Linux+IPv6-HOWTO-fr. Je (Michel Boucey) remercie par avance toute personne qui aidera, de quelque façon, à améliorer cette traduction. On peut me contacter à l'adresse mél <mboucey chez free point fr>. -Les autres traductions disponibles -L'information concernant les traductions disponibles en d'autres langues que l'anglais et le français peut être trouvée dans le document original: TLDP / Linux+IPv6-HOWTO / Translations -Un peu de technique - -<!-- anchor id="general-original-source" -->Le document original de cet HOWTO -Cet HOWTO est actuellement rédigé avec la version 1.2.0 de LyX sur un système Linux Red Hat 7.3 avec un patron SGML (livre DocBook). Il est disponible en vue des contributions à l'URL github / tLDP / LDP / users / Peter-Bieringer. -Modification des lignes de code propres à LyX -Les modifications des lignes de code propres à LyX sont réalisées par un script “maison”, “lyxcodelinewrapper.pl”, que vous pouvez obtenir par CVS pour votre propre compte: TLDP-CVS / users / Peter-Bieringer (NdT: ces lignes ne gênent pas la génération au format SGML, mais celles aux formats PS et PDF à partir du SGML généré couramment, i.e. sans ce script). -La génération du SGML -Le code SGML est généré en utilisant la fonction d'exportation de LyX. -Des solutions ont été apportées afin de créer un code SGML plus propre (voir aussi ici pour le programme Perl, TLDP-CVS / users / Peter-Bieringer): -L'exportation du document LyX ne créait pas proprement les balises “colspan” - l'outil qui règle le problème: “sgmllyxtabletagfix.pl” (le problème est définitivement réglé depuis la version 1.2.0 de LyX)LyX utilise parfois des entités spéciales gauche/droite, à la place des guillemets habituels, qui seront présentes dans le code HTML. Certains navigateurs n'interprètent pas très bien ces balises (Opéra 6 TP 2 ou Konquéror sont connus pour ce problème) - l'outil qui règle le problème: “sgmllyxquotefix.pl” -Les références en ligne à la version HTML de cet HOWTO (lien/ancrage) - -La page d'index maître -Généralement, une référence vers la page d'index maître est recommandée. -Les pages dédiées -Parce que les pages HTML sont générées à partir du fichier SGML, le nommage des fichiers HTML prend une tournure aléatoire. Et cependant, certaines pages ont des balises assignées par LyX, dont il résulte un nommage constant. Ces balises sont très utiles aux références et ne devraient pas être changées à l'avenir. -Si vous pensez que j'ai oublié une balise, merci de me le faire savoir, et je l'ajouterai. -Préface -Quelques petites choses d'abord: -Combien se promène-t-il de versions de l'HOWTO Linux & IPv6? -En incluant celui-ci, il y a trois documents HOWTO disponibles. Mes excuses si cela vous semble de trop ;) -La FAQ/HOWTO IPv6 Linux (obsolète) -Le premier document relatif à IPv6 a été écrit par Eric Osborne, et s'appelle FAQ/HOWTO IPv6 Linux (merci de ne l'utiliser que pour des raisons historiques). La dernière version fut la 3.2.1, publiée le 14 juillet 1997. -Merci de m'aider: si quelqu'un connaît la date anniversaire de cet HOWTO, merci de m'envoyer un mél (cette information est nécessaire à "l'historique"). -L'HowTo - IPv6 & Linux (maintenu) -Il existe une seconde version appelée HowTo - IPv6 & Linux - écrite par moi-même (Peter Bieringer) en pur HTML. Elle est née en avril 1997 et la première version anglo-saxonne a été publiée en juin 1997. Je continuerais à la maintenir, mais cela déclinera lentement (mais pas complètement) en faveur de l'HOWTO IPv6 Linux que vous lisez en ce moment. -L'HOWTO IPv6 Linux (ce document) -Parce que l'HowTo - IPv6 & Linux est écrit en HTML pur, il n'est vraiment pas compatible avec le Projet de Documentation Linux (Linux Documentation Project, ou TLDP). J'ai (Peter Bieringer) reçu une demande fin novembre 2001 de réécriture de l'HowTo -IPv6 & Linux en SGML. Cependant, à cause de la discontinuité de cet HOWTO (le future de l'HowTo - IPv6 & Linux), et de la standardisation croissante d'IPv6, je décidais d'écrire un nouveau document couvrant aussi bien les questions simples ou avancées qui resteront importantes dans les toutes prochaines années. Plus dynamique, un contenu plus avancé s'y trouvera en plus, par rapport au second HOWTO (HowTo - IPv6 & Linux). -Termes employés, glossaire et abréviations - -Relatifs aux réseaux - -Base 10Le système bien connu des nombres décimaux, représentant n'importe quelle valeur avec les chiffres 0-9.Base 16Habituellement utilisée dans les langages de programmation de bas et haut niveaux, connue encore en tant que système numérique hexadécimal, représentant les valeurs avec les chiffres 0-9 et les caractères A-F (insensible à la casse).Base 85Représentation d'une valeur grâce à 85 différents chiffres/caractères, cela permet des chaînes de caractères plus courtes mais jamais vue dans la pratique.BitUnité minimale de stockage, allumée(on)/vraie (1) ou éteinte(off)/fausse (0).ByteLe plus souvent, une collection de 8 bits (mais ce n'est pas réellement une nécessité - regardez les systèmes des anciens ordinateurs).Périphériqueici, matériel de connexion réseau, voir aussi NIC.Hôte à double résidenceUn hôte à double résidence est un noeud ayant deux interfaces réseau (physique ou virtuelle) sur deux liens différents, mais qui ne réalise pas de renvoi de paquets entre les interfaces.HôteGénéralement, un hôte simple résident, présent sur un lien. Normalement, il n'a seulement qu'une interface réseau active, par exemple Ethernet ou (non pas et) PPP.Interfacequasi-synonyme de “périphérique”, voir aussi NIC.En-tête IPEn-tête d'un paquet IP (chaque paquet réseau a un en-tête, son type dépendant de la couche réseau).LienUn lien est un médium de transport de paquet réseau de la couche 2, des exemples en sont Ethernet, PPP, SLIP, ATM, RNIS, Frame Relay, etc.NoeudUn noeud est soit un hôte, soit un routeur.OctetUne collection véritable de 8 bits, aujourd'hui synonyme de "byte".PortInformation destinée au distributeur TCP/UDP (couche 4) afin de transporter l'information à la couche supérieure.ProtocoleChaque couche réseau contient la plupart du temps un champ “protocole” facilitant la distribution de l'information transportée à la couche supérieure, comme cela peut se voir dans la couche 2 (MAC) et 3 (IP)RouteurUn routeur est un noeud possédant une ou plusieurs interface(s) réseau, capable d'envoyer les paquets entre ses interfaces.SocketUne socket IP est définie par ses adresses source et destination, ses ports et (association)PileUne collection de couches relative au réseau.Masque de sous-réseauLes réseaux IP utilisent un masque de bits afin de distinguer le réseau local de ceux qui sont distants.TunnelUn tunnel est typiquement une connexion point-à-point sur laquelle les paquets échangés transportent les données d'un autre protocole, un tunnel IPv6-in-IPv4 en est un exemple. -<!-- anchor id="Glossaire" -->Abréviations - -ACLAccess Control List, Liste de Contrôle d'AccèsAPIApplication Programming Interface, Interface de Programmation d'ApplicationASICApplication Specified Integrated Circuit, Circuit Intégré d'Application SpécifiqueBSDBerkeley Software Distribution, Distribution des Logiciels BerkeleyBus CANSystème de bus physique contrôlant un réseau (NdT: voir par exemple ici pour plus d'information)ISPInternet Service Provider, Fournisseur d'Accès à Internet (FAI)KAMEProjet - effort conjoint de six entreprises au Japon pour fournir, mondialement et dans le cadre du logiciel libre, une pile IPv6 et IPsec (pour IPv4 et IPv6) pour les variantes de BSD www.kame.netLIRLocal Internet Registry, Bureau local d'enregistrement InternetNICNetwork Interface Card, Carte d'interface réseauRFCRequest for comments, Appel à commentaires - jeu de notes techniques et organisationnelles au sujet d'Internet.USAGIProjet “UniverSAl playGround for IPv6” - travaille à rendre disponible une pile protocolaire IPv6 destinée au système Linux qui soit d'une qualité apte à la production. -Relatifs à ce document - -Balisage en vue de l'encodage PDF/PS -Le caractère “¬” est utilisé pour signaler que le code est enveloppé en vue d'un meilleur affichage dans les fichiers PDF et PS. -Conventions -Dans les exemples génériques vous trouverez parfois ce qui suit: - -]]>Pour une utilisation réelle sur votre système, en ligne de commande ou dans des scripts, cela doit être remplacé par le contenu adéquate (ôtez bien sûr les chevrons), et le résultat devrait être par exemple - -Les commandes dans l'interpréteur de commandes (le<emphasis> shell</emphasis>) -Les commandes exécutables en tant qu'utilisateur non-root commencent avec un $, par exemple -Les commandes exécutables en tant qu'utilisateur root commencent avec un #, par exemple - -Pré-requis à l'usage de cet HOWTO - -Pré-requis personnels - -Une expérience des outils Unix -Vous devriez être familiarisé avec les outils essentiels d'Unix comme grep, awk, find, etc, et connaître les options de ligne de commande les plus communément employées. -Une expérience de la théorie des réseaux -Vous devriez connaître les notions de couche, de protocole, d'adresse, de câble, de socket, etc. Si vous êtes nouveau, voici un bon point de départ pour vous: linuxports/howto/intro_to_networking -Une expérience de la configuration IPv4 -Vous devriez absolument avoir quelque expérience de la configuration IPv4, sinon ce sera difficile pour vous de comprendre ce qui se passe réellement. -Une expérience du Système des Noms de Domaine (DNS) -Vous devriez aussi comprendre en quoi consiste le Système des Noms de Domaine (DNS), ce qu'il fournit et comment s'en servir. -Une expérience des stratégies de déboguage réseau -Vous devriez au moins savoir comment utiliser tcpdump et avoir connaissance de ce qu'il peut vous montrer. Sinon, le déboguage réseau sera très difficile pour vous. -Le matériel compatible avec le système d'exploitation Linux -Vous espérez certainement pouvoir expérimenter tout cela avec du vrai matériel, et pas seulement lire cet HOWTO jusqu'à tomber de sommeil. ;-7) -<!-- anchor id="chapter-basics" -->Les bases - -Qu'est-ce qu'IPv6? -IPv6 est un nouveau protocole de la couche 3 (voir le modèle OSI) qui supplantera à terme IPv4 (plus connu sous le nom d'IP). IPv4 a été conçu il y a déjà un certain de temps (RFC 760 / Le protocole Internet à partir de janvier 1980), et, dès le début, il y a eu de nombreuses demandes pour accroître la quantité d'adresses disponible et augmenter les capacités. Le RFC le plus récent est le RFC 2460 / spécification du protocole Internet version 6 (NdT: une version francophone de ce RFC). Le changement essentiel apporté par IPv6 est la nouvelle conception de l'en-tête, incluant une augmentation de la taille de l'adresse, passant de 32 à 128 bits. Parce que la couche 3 est responsable de bout en bout du transport des paquets dont le routage est basé sur des adresses, elle doit inclure les nouvelles adresses IPv6, comme pour IPv4. -Pour en savoir plus sur l'histoire d'IPv6, jetez un oeil aux anciens RFC concernant IPv6, par exemple dans le Guide / Références IPv6 SWITCH . -<!-- anchor id="basic-history-IPv6-Linux" -->Historique d'IPv6 pour Linux -Les années 1992, 1993 et 1994 de l'histoire d'IPv6 (dans ses généralités) sont couvertes par le document suivant: IPv6 ou IPng (IP nouvelle génération). -A faire: plus de détails historiques, plus de contenu... -Au début -Le premier code réseau relatif à IPv6 a été ajouté au noyau Linux 2.1.8 en novembre 1996 par Pedro Roque. Il était fondé sur l'API BSD: - -+ * -+ * Source: -+ * IPv6 Program Interfaces for BSD Systems -+ * -]]>Les lignes présentées sont copiées du patch-2.1.8 (l'adresse mél a été effacée au copier&coller). -Après -A cause du manque de bras, l'implémentation d'IPv6 dans le noyau était incapable de suivre les projets discutés ou les RFC nouvellement mis à jour. En novembre 2000, un projet débute au Japon, appelé USAGI, dont le but était d'implémenter dans Linux tout le support IPv6 manquant ou obsolète. Ce projet suit en cela la trace de l'implémentation courante d'IPv6 pour FreeBSD, réalisée par le projet KAME . De temps à autre, ils créaient des archives de développement (snapshots) à partir des sources courantes du noyau Linux. -Actuellement -Malheureusement, le patch USAGI est très volumineux, à tel point que les personnes s'occupant actuellement de maintenir les fonctionnalités réseau de Linux sont incapables de l'inclure dans les sources, aptes à la production, de la série des noyaux Linux 2.4.x. En conséquence, la série 2.4.x manque de certaines (et même de nombreuses) extensions, et elle n'applique pas non plus les brouillons et RFC courants (voir le groupe de travail IP Version 6 (ipv6)). Cela peut poser des problèmes d'interopérabilité avec les autres systèmes d'exploitation. -A l'avenir -USAGI fait maintenant usage de la série des noyaux de développement Linux 2.5.x afin d'incorporer toutes les extensions actuelles dans cette version de développement; dans l'espoir que la série des noyaux 2.6.x comprenne une véritable implémentation à jour d'IPv6. -A quoi ressemblent les adresses IPv6? -Comme cela a été mentionné précédemment, les adresses IPv6 ont une longueur de 128 bits. Ce nombre de bits génère de très grands nombres, dont la quantité de chiffres est supérieure à 39: -De tels nombres ne sont vraiment pas des adresses pouvant être mémorisées. L'adresse IPv6 en elle-même est faite à partir d'une collection de bits (comme pour IPv4, bien que cela soit rarement su). Il y a une meilleure notation pour de si grands nombres, qui est l'hexadécimal. En hexadécimal, 4 bits (mot aussi connu sous la dénomination de "nibble") sont représentés par un chiffre ou un caractère de 0-9 et a-f (10-15). Ce format réduit la longueur de l'adresse IPv6 à 32 caractères. -Cette représentation est encore peu praticable (possibilité de confusion ou de perte d'un simple chiffre hexadécimal), c'est pourquoi les concepteurs d'IPv6 ont choisi un format hexadécimal scindé en blocs de 16 bits, avec comme séparateur le caractère ":". De plus, le préfixe "0x" (le marqueur des valeurs hexadécimales utilisé dans les langages de programmation) est ôté: -Une adresse utilisable (nous verrons les différents types d'adresse plus tard) est par exemple: -Dans un but de simplification, les zéros non significatifs de chaque bloc de 16 bits sont omis: - -¬ 3ffe:ffff:100:f101:210:a4ff:fee3:9566 -]]>Une séquence de blocs de 16 bits ne comprenant que des zéros peut être remplacée par “::“. Mais pas plus d'une fois par adresse, sinon il ne s'agirait plus d'une représentation unique. - 3ffe:ffff:100:f101::1 -]]>La plus importante réduction qui peut être observée est celle de l'adresse localhost d'IPv6: - ::1 -]]>Il existe aussi une représentation dite compacte, encodée en base85 (RFC 1924 / A Compact Representation of IPv6 Addresses, publié le 1er avril 1996), jamais vue véritablement employée, sans doute une blague de 1er avril; en voici cependant un exemple: -J%s99FJXT -]]>
    -Info: ipv6calc est un programme de formatage d'adresse IPv6 et de conversion pouvant être trouvé ici: ipv6calc ( miroir ) -
    -FAQ (Les bases) - -Pourquoi IPv6 et non pas IPv5 comme successeur d'IPv4? -Dans tout en-tête IP, les 4 premiers bits sont réservés à la version du protocole. C'est ainsi qu'un numéro de protocole entre 0 et 15 est théoriquement possible: -4: est déjà pris pour IPv45: est réservé au protocole de flux (Stream Protocol, ou STP - RFC 1819 / Internet Stream Protocol Version 2) (qui n'a jamais véritablement conquis le public)Le prochain numéro libre était 6. Et voilà comment IPv6 était né! -L'adresse IPv6: pourquoi un tel nombre de bits? -Lors de la conception d'IPv4, les gens pensaient que 32 bits seraient suffisants pour le monde, dans sa globalité. Rétrospectivement, 32 bits ont été jusqu'à maintenant suffisants, et seront sans doute suffisants pour encore quelques années. Cependant, 32 bits seront insuffisants à fournir dans le futur une adresse globale à chaque périphérique réseau. Pensez aux téléphones mobiles, aux voitures (incluant les périphériques électroniques sur bus CAN), aux grille-pain, aux réfrigérateurs, aux interrupteurs d'éclairage, etc. -Les concepteurs ont alors choisi 128 bits, 4 fois plus en longueur et une quantité 2^96 fois plus importante qu'IPv4 aujourd'hui. -La quantité utilisable est cependant inférieure à ce qu'il semble. La raison en est que, dans le schéma d'adresse défini actuellement, 64 bits sont utilisés pour l'identifiant d'interface, les 64 autres bits sont utilisés pour le routage. Compte tenu des niveaux stricts actuels d'agrégation (/48, /32, ...), il est encore possible d'"épuiser" cette quantité, mais bien heureusement, pas dans un avenir proche. -Voir aussi pour plus d'information le RFC 1715 / The H Ratio for Address Assignment Efficiency et le RFC 3194 / The Host-Density Ratio for Address Assignment Efficiency. -L'adresse IPv6: pourquoi un si petit nombre de bits pour sa nouvelle conception? -Pendant ce temps, il y a (c'est possible) des gens sur Internet (je n'en connais qu'un, Jim Fleming...) qui pensent déjà à IPv8, et même jusqu'à IPv16, dont les conceptions sont loin d'être couramment reçues et implémentées. En attendant, 128 bits était le meilleur choix qui pouvait être fait au regard de l'en-tête placé au-dessus des données transportées. En considérant le minimum de la taille de l'Unité Maximale de Transfert (Maximum Transfer Unit, ou MTU), la longueur de l'en-tête en IPv4 est de 20 octets (c'est le minimum, car elle peut monter à 60 octets avec les options IPv4), et en IPv6, elle est de 48 octets (longueur constante). C'est 3,4 % de la MTU en IPv4 et 3,8 % de la MTU en IPv6. Cela signifie que le surplus de taille dû à l'en-tête est quasiment le même. Plus de bits dans les adresses auraient réclamé un en-tête de plus grande taille, et par conséquent, un plus grand surplus. Et si l'on prend aussi en compte la MTU maximale sur un lien courant (tel Ethernet aujourd'hui): soit 1500 octets (dans des cas particuliers: 9 Ko pour de grosses trames). Finalement, cela n'aurait pas été d'une conception correcte si 10% ou 20% des données transférées dans un paquet de la couche 3 avaient été utilisés pour les adresses et non pas pour la charge utile.
    -<!-- anchor id="chapter-addresstypes" -->Les types d'adresse IPv6 -Comme pour IPv4, l'adresse IPv6 peut être scindée en une partie réseau et une partie hôte, par l'usage d'un masque de sous-réseau. -IPv4 a montré que parfois cela serait bien si plus d'une adresse IP pouvaient être assignées à une interface, chacune à un but bien précis (alias, multi-cast). Afin de demeurer ouvert à l'avenir, IPv6 offre davantage en permettant à plus d'une adresse IPv6 d'être assignées à une interface. Il n'y a actuellement aucune limite définie par aucun RFC, mais seulement par l'implémentation de la pile IPv6 (afin de prévenir les attaques DoS). -Pour employer le grand nombre de bits constitutifs de son adresse, IPv6 définit des types d'adresse basés sur certains regroupements de ces bits, qui, avec un peu de chance, ne devraient pas être modifiés à l'avenir (à la différence d'aujourd'hui avec IPv4, et l'histoire des classes A, B et C). - -C'est ainsi que la totalité des bits est divisée en une partie réseau (les 64 supérieurs) et en une partie hôte (les 64 inférieurs), afin de faciliter l'auto-configuration. -Les adresses sans préfixe spécial - -L'adresse localhost -C'est une adresse spéciale pour l'interface de bouclage (loopback), similaire à IPv4 avec sa "127.0.0.1". -ou compressée: -Les paquets ayant cette adresse comme source ou destination ne devraient jamais quittés l'hôte émetteur. -L'adresse non spécifiée -C'est une adresse spéciale telle que “n'importe laquelle” (“any”) ou “0.0.0.0” en IPv4 . Il s'agit pour IPv6 de: -ou: -Ces adresses sont essentiellement utilisées/vues dans les sockets d'écoute (à toute adresse IPv6) ou dans les tables de routage. -Note: l'adresse non spécifiée ne peut pas être utilisée comme adresse de destination. -L'adresse IPv6 avec adresse IPv4 intégrée -Il y a deux types d'adresse contenant une adresse IPv4 -L'adresse IPv6 mappée IPv4 -Les adresses IPv6 compatibles seulement avec IPv4 sont parfois utilisées/vues pour la création de socket par un démon disposant d'IPv6, mais à l'écoute d'une adresse IPv4. -Ces adresses sont définies par un préfixe spécial d'une longueur de 96 (a.b.c.d est l'adresse IPv4): -ou en format compressé: -Par exemple, l'adresse IPv4 1.2.3.4 ressemble à ceci: - -L'adresse IPv6 compatible IPv4 -Utilisée pour le tunnelage automatique (RFC 2893 / Transition Mechanisms for IPv6 Hosts and Routers), en cours de remplacement par le tunnelage 6to4. -ou en format compressé: - -La partie réseau, aussi appelée préfixe -Les concepteurs ont défini certains types d'adresse et laissé un vaste champ libre à de futures définitions, telles que l'émergence de nouvelles exigences encore aujourd'hui inconnues. L'architecture d'adressage IPv6 (RFC 2373 de juillet 1998) définit le schéma d'adressage actuel, mais il y a déjà un nouveau brouillon disponible: draft-ietf-ipngwg-addr-arch-*.txt. - -Jetons maintenant un coup d'oeil aux différents types de préfixe (et par conséquent aux différents types d'adresse IPv6): -Le type d'adresse lien-local -Ce sont des adresses particulières qui n'auront de validité que sur le lien d'une interface. En utilisant cette adresse comme adresse de destination le paquet ne devrait jamais franchir un routeur. C'est utile pour des communications sur un lien telles que: -Y a-t-il quelqu'un d'autre sur ce lien?Y a-t-il quelqu'un d'autre sur ce lien ayant une adresse spéciale (on cherche par exemple à détecter la présence d'un routeur)?Elles commencent par (où “x” est n'importe quel caractère hexadécimal, couramment “0”) -Ce type d'adresse se trouve sur chaque interface disposant d'IPv6 après une auto-configuration sans état (ce qui est couramment le cas). -Le type d'adresse site-local -Ces adresses sont similaires à ce que le RFC 1918 (RFC 1918 / Address Allocation for Private Internets) définit aujourd'hui pour IPv4, avec en plus l'avantage que celui qui utilise ce type d'adresse a la capacité d'utiliser les 16 bits fournis pour un maximum de 65536 sous-réseaux. Comparable au 10.0.0.0/8 aujourd'hui en IPv4. -Autre avantage: parce qu'il est possible avec IPv6 d'assigner plus d'une seule adresse par interface, vous pouvez assigner une telle adresse site-local en plus de l'adresse globale. -Il commence par: -(où “x” est n'importe quel caractère hexadécimal, couramment “0”) -Notez que des discussions sont en cours concernant la dépréciation de ce type d'adresse en raison de nombreux problèmes. Pour en savoir plus, lire: draft-ietf-ipv6-deprecate-site-local-XY.txt. -Pour des tests en laboratoire, de telles adresses restent un bon choix, à mon humble avis. -Le type d'adresse ”unicast globale (agrégeable) " -Aujourd'hui, il y a un type d'adresse globale de défini (la première conception, appelée “basée sur le fournisseur” a été abandonnée il y a déjà quelques années (RFC 1884 / IP Version 6 Addressing Architecture [obsolete]), vous en trouverez des traces dans des sources anciennes du noyau Linux). -Il commence par (les x étant des caractères hexadécimaux) -Note: la dénomination “agrégeable” est abandonnée dans les brouillons actuels. -Il y a quelques sous-types définis en plus, ci-dessous: -Les adresses de test 6bone -Elles ont été les premières adresses globales à être définies et mises en usage. Elles commencent toutes par -Exemple: -Une adresse spéciale de test 6bone, qui ne sera jamais globalement unique, commence par -Et elle est la plupart du temps montrée dans les exemples passés, car si des adresses réelles sont montrées, il est possible à quelqu'un de les copier/coller dans ses propres fichiers de configuration. Ce type d'inadvertance cause des duplications d'adresse globalement unique. Cela pose de graves problèmes à l'hôte d'origine (par exemple recevoir des paquets en réponse de requêtes qu'il n'a pas émises). -Parce qu'IPv6 est maintenant en production, ce préfixe ne sera plus délégué et probablement retiré du routage après 6 juin 2006 (voirRFC 3701 / 6bone Phaseoutpour plus d'information). -Les adresses 6to4 -Ce type d'adresse, conçu pour un mécanisme précis de tunnelage (RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds et RFC 2893 / Transition Mechanisms for IPv6 Hosts and Routers), encode une adresse IPv4 donnée et un sous-réseau possible. Il commence par -Par exemple, pour représenter 92.168.1.1/5: -Une petite ligne de commande peut vous aider à générer une telle adresse à partir d'une adresse IPv4 donnée: -Voir aussi le tunnelage utilisant 6to4 et information concernant le relayage de 6to4 par les routeurs. -Les adresses assignées par un fournisseur dans la hiérarchie de routage -Ces adresses sont déléguées aux Fournisseurs d'Accès à Internet (FAI) et commencent par -Les préfixes fournis aux FAI (aussi connus en tant que LIR) les plus importants (propriétaires de backbone) sont délégués par les centres locaux d'enregistrement (local registries) et ils possèdent actuellement un préfixe d'une longueur de 32. -Tout client peut obtenir de son FAI un préfixe d'une longueur de 48. -Adresses réservées aux exemples et à la documentation -Actuellement, deux blocs d'adresses sont réservés aux exemples et à la documentation: -Ces blocs d'adresses devraient être filtrés sur la base des adresses source et, si possible, NE devraient PAS être acheminés par les routeurs en bordure d'Internet vers ce dernier. -Les adresses multicast -Les adresses multicast sont utilisées pour les services y afférents. -Elles commencent par (xx est la valeur de la portée) -Elles se répartissent en différentes portées et types: -La portée multicast -La portée multicast est un paramètre spécifiant la distance maximale qu'un paquet multicast peut prendre vis-à-vis de son entité émettrice. -Actuellement, les régions suivantes (portées) sont définies: -ffx1: noeud-local, ces paquets ne quittent jamais le noeud.ffx2: lien-local, ces paquets ne sont jamais transmis par les routeurs, ils ne quittent par conséquent jamais le lien spécifié.ffx5: site-local, ces paquets ne quittent jamais le site.ffx8: organisation-locale, ces paquets ne quittent jamais l'organisation (pas si simple à implémenter, cela doit être par le protocole de routage).ffxe: portée globale.les autres sont réservées. -Les types multicast -Il y a déjà de nombreux types définis/réservés (voir le RFC 2373 / IP Version 6 Addressing Architecture pour les détails). Quelques exemples en sont: -Adresse de tous les noeuds: ID = 1h, correspond aux adresses de tous les hôtes présents sur le noeud local (ff01:0:0:0:0:0:0:1) ou au lien connecté (ff02:0:0:0:0:0:0:1).Adresse de tous les routeurs: ID = 2h, correspond aux adresses de tous les routeurs présents sur le noeud local (ff01:0:0:0:0:0:0:2), sur le lien connecté (ff02:0:0:0:0:0:0:2), ou encore sur le site local (ff05:0:0:0:0:0:0:2). -L'adresse multicast de sollicitation du lien-local -Adresse multicast spéciale utilisée comme adresse de destination dans la découverte de voisinage, car à la différence d'IPv4, ARP n'existe plus dans IPv6. -Un exemple de cette adresse ressemble à ceci -Le préfixe utilisé montre qu'il s'agit d'une adresse multicast lien-local. Le suffixe est généré à partir de l'adresse de destination. Dans cet exemple, un paquet devrait être envoyé à l'adresse “fe80::1234”, mais la pile réseau ne connaît pas l'actuelle adresse MAC de la couche 2. Elle remplace les 104 bits supérieurs par “ff02:0:0:0:0:1:ff00::/104” et laisse les 24 bits inférieurs inchangés. Cette adresse est maintenant utilisée 'sur le lien' afin de trouver le noeud correspondant, lequel va devoir émettre une réponse contenant son adresse MAC de couche 2. -Les adresses anycast -Les adresses anycast sont des adresses spéciales utilisées pour couvrir des besoins tels que déterminer le serveur DNS le plus proche, le serveur DHCP le plus proche, ou tout groupe dynamique similaire. Les adresses sont prises dans l'espace d'adressage unicast (agrégeable ou site-local pour le moment). Le mécanisme anycast (au regard du client) sera pris en compte par un protocole de routage dynamique. -Note: Les adresses anycast ne peuvent être utilisées comme adresse source, elles sont utilisables uniquement comme adresse de destination. -L'adresse anycast de routeur de sous-réseau -Un simple exemple d'une adresse anycast est celle d'un routeur de sous-réseau. Soit un noeud avec l'adresse IPv6 suivante assignée: -L'adresse anycast de routeur de sous-réseau sera créée en laissant totalement blanc le suffixe (les 64 bits inférieurs): - -Les types d'adresse (partie hôte) -En ce qui concerne les questions d'auto-configuration et de mobilité, Il a été décidé d'utiliser les 64 bits inférieurs de la partie hôte de l'adresse pour la plupart des types d'adresse actuels. Conséquemment, chaque sous-réseau détient une grande quantité d'adresses. -Cette partie hôte peut être différemment considérée: -L'adresse calculée automatiquement (dite aussi “sans état”) -Avec l'auto-configuration, la partie hôte de l'adresse est calculée en convertissant l'adresse MAC d'une interface (si disponible), avec la méthode EUI-64, en une adresse IPv6 unique. Si aucune adresse MAC n'est disponible pour le périphérique en question (ce qui arrive par exemple sur les périphériques virtuels), quelque chose d'autre (comme l'adresse IPv4 ou l'adresse MAC d'une interface physique) est utilisée à la place. - -Considérons à nouveau le premier exemple: -ici, -est la partie hôte calculée à partir de l'adresse MAC de la NIC -en utilisant IEEE EUI-64 conçue pour les identifiants EUI-48. -Le problème d'incursion possible dans la sphère privée (<emphasis>privacy problem</emphasis>) avec les adresses automatiquement calculées, et une solution -Parce que la partie hôte "automatiquement calculée” est globalement unique (sauf lorsqu'un fabriquant de NIC utilise la même adresse MAC sur plus d'une NIC), la traque grâce à un client (client tracking) est possible sur l'hôte, dès lors qu'aucun proxy d'aucune sorte n'est utilisé. -C'est un problème connu, et une solution a été apportée: l'extension “sphère privée”, définie dans le RFC 3041 (RFC 3041 / Privacy Extensions for Stateless Address; il y a déjà aussi un brouillon plus récent disponible: draft-ietf-ipngwg-temp-addresses-*.txt). Le principe est d'utiliser une valeur aléatoire et une valeur statique à partir desquelles un nouveau suffixe est généré à intervalle régulier. Note: ce n'est raisonnable que pour des connexions client sortantes, et n'est pas vraiment utile pour des machines réputées être des serveurs. -La configuration manuelle -Pour les serveurs, il est probablement plus aisé de se rappeler d'adresses plus simples; cela peut aussi se faire. Il est possible d'assigner une adresse IPv6 additionnelle à une interface, par exemple -Pour les suffixes tels que “::1”, montré dans l'exemple ci-dessus, il est requis que le septième bit le plus significatif soit positionné à 0 (le bit universel/local d'un identifiant automatiquement généré). Certaines autres (à part celles qui n'ont pas étaient choisies) combinaisons de bits sont réservées aux adresses anycast. -La longueur de préfixe nécessaire au routage -Dans les premières phases de la conception, il était prévu d'utiliser une approche intégrale de routage hiérarchique, et ce, afin de réduire au maximum la taille des tables de routage. A la base du raisonnement sous-tendu par cette approche, il y a la prise en compte du nombre grandissant des entrées de routage IPv4 au coeur des routeurs (supérieur à 104 000 en mai 2001), la nécessité de réduire ce nombre afin de diminuer le besoin en mémoire du matériel (piloté par Circuit Intégré d'Application Spécifique, Application Specified Integrated Circuit, ou ASIC) maintenant les tables de routage, et, en conséquence, d'accroître la vitesse (dans l'espoir que moins d'entrées génèrent des recherches plus rapides). - -Aujourd'hui, le point de vue est que le routage sera conçu quasi-hiérarchiquement pour les réseaux ayant seulement un fournisseur de service. Pour plus d'une connexion à un ISP, ce n'est pas possible, et cela relève du problème de la multi-résidence (des informations sur la multi-résidence:drafts*multi6* IPv6 Multihoming Solutions -La longueur du préfixe (aussi connue en tant que "masque de réseau") -Comme pour IPv4, la notion de chemin de réseau routable nécessaire au routage a ici sa place. Parce que la notation standard d'un masque réseau n'est pas très agréable pour un adressage sur 128 bits, les concepteurs ont employé le schéma du Routage Inter-Domaines IPv4 Sans Classe (IPv4 Classless Inter Domain Routing, ou CIDR, défini dans le RFC 1519 / Classless Inter-Domain Routing), dans lequel est spécifié le nombre de bits de l'adresse devant être utilisé pour le routage. Il est aussi connu comme notation “slash”. -Un exemple: -De cette notation seront extraits: -le réseau: - -le masque de réseau: - -La correspondance à une route -Dans des conditions normales (i.e. sans QoS), de la recherche dans une table de routage résulte la route ayant le plus grand nombre de bits d'adresse significatifs; autrement dit, la route avec le plus grand préfixe correspond la première. -Par exemple, si une table de routage affiche les entrées suivantes (la liste est incomplète): -Ci-dessous, les adresses de destination des paquets IPv6 dont le trafic sera routé au travers du périphérique désigné - trafic routé au travers du périphérique sit1 -3ffe:ffff:200:1:2:3:4:5/48 -> trafic routé au travers du périphérique tun6to4 -]]> -<!-- anchor id="chapter-systemcheck" -->La vérification d'un système prêt pour IPv6 -Avant de commencer à utiliser IPv6 sur votre hôte Linux, vous avez à tester si votre système est prêt pour IPv6. Pour ce faire, vous aurez peut-être d'abord un peu de travail. -<!-- anchor id="systemcheck-kernel" -->Un noyau prêt pour IPv6 -Les distributions contemporaines de Linux comportent déjà un noyau prêt pour IPv6, les capacités IPv6 sont en général compilées dans un module, mais il est possible que ce module ne soit pas chargé automatiquement au démarrage. -Voir la page IPv6+Linux-status-distributions pour obtenir les informations les plus à jour. -Note: vous ne devriez plus utiliser les noyaux de la série 2.2.x; car ils ne sont pas assez à jour vis-à-vis d'IPv6. -Vérifier la présence du support IPv6 dans le noyau actuellement en cours d'utilisation -Afin de vérifier si oui ou non votre actuel noyau supporte IPv6, jetez un coup d'oeil dans votre système de fichiers /proc. Les entrées qui suivent doivent être présentes: -Un bref test automatique ressemble à: -Si cela échoue, cela peut être parce que le module IPv6 n'est pas chargé. -Essayer de charger le module IPv6 -Vous pouvez tenter de charger le module IPv6 en exécutant -Si c'est un succès, la présence de ce module sera testée comme par magie par la ligne suivante: -Et la vérification montrée plus haut devrait maintenant se faire elle aussi avec succès. -Note: enlever le module n'est actuellement pas supporté et peut aboutir, sous certaines conditions, au crash du noyau. -Le chargement automatique du module -Il est possible d'automatiser le chargement du module IPv6 à la demande. Vous avez juste à ajouter les lignes qui suivent dans le fichier de configuration du chargeur de modules du noyau (normalement /etc/modules.conf ou /etc/conf.modules): -Il est aussi possible de mettre hors service le chargement automatique du module IPv6 en utilisant la ligne suivante -Note additionnelle: pour les noyaux de la série 2.6,le mécanisme du chargeur de modules a été repensé. Le nouveau fichier de configuration s'appellera /etc/modprobe.conf au lieu de /etc/modules.conf. Pour de plus amples détails voir le module-init-tool - -Compiler un noyau à partir des seules sources brutes (facile, si vous connaissez les options dont vous avez besoin)Recompiler les sources du noyau fournies par votre distribution Linux (parfois, ce n'est si simple que ça)Compiler un noyau avec l'extension USAGISi vous vous décidez à compiler un noyau, vous devriez avoir une certaine expérience dans la compilation de noyau et lire l'HOWTO sur le noyau Linux. -La comparaison pratiquement la plus à jour entre un noyau original et un noyau comprenant USAGI est disponible dans IPv6+Linux-status-kernel. -Compiler un noyau uniquement à partir des sources originales (vanille) -Plus d'éléments concernant la compilation d'un noyau disposant d'IPv6 peuvent par exemple être trouvés dans IPv6-HOWTO-2#kernel. -Note: vous devriez autant que possible utiliser les noyaux de la série 2.6.x ou supérieures,car le support IPv6 de la série 2.4.x n'obtiendra qu'un portage partielet celui de la série 2.2.x est désespérément obsolète.). -Compiler un noyau avec l'extension USAGI -Comme pour le noyau vanille, seulement recommandé aux utilisateurs avancés, déjà familiarisés avec IPv6 et la compilation noyau. Voir aussi la FAQ du projet USAGI et comment obtenir le meilleur support IPv6 avec Linux (article) (miroir). -Les périphériques réseau prêts pour IPv6 -Les périphériques réseau n'ont pas tous déjà (ou n'auront jamais, pour certains) la capacité de transporter des paquets IPv6. L'état actuel de la situation quant à ce sujet peut être trouvé ici. -A cause de l'implémentation de la structure de la couche réseau du noyau, un problème majeur est qu'un paquet IPv6 n'est pas réellement reconnu par son numéro d'en-tête IP (6 au lieu de 4). Il est reconnu par le numéro de protocole de la couche transport 2. En conséquence, tout protocole n'utilisant pas un tel numéro de protocole ne peut pas distribuer les paquets IPv6. Note: le paquet est bien encore transporté sur le lien, mais, côté récepteur, la distribution ne fonctionne pas (vous pouvez observer cela par exemple avec tcpdump). -Actuellement connus pour ne jamais être “capables de lien IPv6” - -IP sur Ligne Série (Serial Line IP, SLIP, RFC 1055 / SLIP), serait aujourd'hui mieux dénommé SLIPv4, noms de périphérique: slXIP sur Ligne Parallèle, comme pour SLIP, noms de périphérique: plipXRNIS avec encapsulation rawip, noms de périphérique: isdnX -Actuellement connu pour ne pas être “capable de lien IPv6” - -RNIS avec encapsulation syncppp, noms de périphérique: ipppX (au sujet de la conception de ipppd, il fusionnera dans une couche PPP plus abstraite dans la série des noyaux 2.5.x) -Les outils de configuration réseau prêts pour IPv6 -Vous n'irez pas loin si vous faites tourner un noyau prêt pour IPv6 mais sans avoir d'outils pour configurer IPv6. Il existe plusieurs paquetages pouvant servir à cette tâche. -Le paquetage net-tools -Le paquetage net-tools inclut certains outils tels que ifconfig et route qui vous aideront à configurer IPv6 sur une interface. Regardez la sortie d'ifconfig? ou celle de route?, et si vous y voyez quelque chose comme IPv6, ou inet6, c'est que l'outil est prêt pour IPv6. -Vérification magique: -& 1 | grep -qw 'inet6' && echo "utility 'ifconfig' is -¬ IPv6-ready" -]]>La même vérification peut être réalisée pour route: -& 1 | grep -qw 'inet6' && echo "utility 'route' is IPv6-ready" -]]> -Le paquetage iproute -Alexey N. Kuznetsov (actuellement la personne qui maintient le code réseau de Linux) a créé un jeu d'outils qui configure le réseau à travers le périphérique netlink. Vous aurez plus de fonctionnalités en utilisant ce jeu d'outils que n'en fournit net-tools, mais il n'est pas très bien documenté et n'est pas vraiment fait pour les êtres pusillanimes. -&1 | grep -qw 'inet6' && echo "utility 'ip' is IPv6-ready" -]]>Si le programme /sbin/ip n'est pas trouvé, je vous recommande alors d'installer le paquetage iproute. -Vous pouvez le récupérer à partir de votre distribution Linux (s'il s'y trouve)Vous pouvez télécharger l'archive tar et recompiler: sources sur le FTP d'origine et miroir (manquant)Vous pouvez rechercher le bon paquetage RPM ici, RPMfind pour iproute (parfois la reconstruction d'un paquetage SRPM est recommandée) -Les programmes de test/déboguage prêts pour IPv6 -Après avoir préparé votre système pour IPv6, vous voudrez établir des communications en utilisant IPv6. Vous devriez d'abord apprendre comment examiner les paquets IPv6 avec un programme dit “renifleur” (un sniffer). Cela est fortement conseillé, car cela peut aider à fournir très rapidement un diagnostic en cas de déboguage/dépannage. -<!-- anchor id="program-ping6." --> ping IPv6 -Ce programme est normalement inclus dans le paquetage iputils. Il est conçu pour réaliser de simples tests du transport en émettant des paquets de requête d'écho (echo-request) ICMPv6 et en attendant les paquets de réponse en écho (echo-reply) ICMPv6. -Usage - -# ping6 -# ping6 [-I ] -]]>Exemple -Info: ping6 a besoin d'un accès brut à la socket, il faut donc les permissions root. Par conséquent, s'il n'y a pas d'utilisateur root pouvant utiliser ping6, deux problèmes peuvent se poser ici: -ping6 n'est pas sur le chemin de l'utilisateur (probablement, car ping6 est généralement stocké dans /usr/sbin -> ajouter au chemin (pas vraiment recommandé)ping6 ne s'exécute pas proprement, généralement, c'est qu'il y a des permissions root manquantes -> chmod u+s /usr/sbin/ping6 -Spécifier une interface à ping IPv6 -En spécifiant uniquement une adresse lien-local à ping IPv6, le noyau ne sait pas par quel périphérique (physique ou virtuel) il doit émettre le paquet - chaque périphérique a une adresse lien-local. Un essai aura pour résultat un message d'erreur: -Dans ce cas vous devez en plus spécifier l'interface comme ci-dessous: - -Ping6 et les adresses multicast -Un mécanisme intéressant pour détecter les hôtes IPv6 actifs sur un lien est de lancer ping6 sur l'adresse multicast lien-local tous-noeuds (all-node): -A la différence d'IPv4, où les réponses à un ping sur l'adresse de diffusion (broadcast) peuvent être rendues indisponibles, en IPv6, ce comportement ne peut pas être actuellement rendu indisponible, sauf par un pare-feu IPv6 local. -<!-- anchor id="program-traceroute6." --> traceroute6 IPv6 -Ce programme est normalement inclus dans le paquetage iputils. C'est un programme similaire au traceroute d'IPv4. En voici un exemple: -Note: à la différence de certaines versions contemporaines du traceroute d'IPv4, qui peuvent utiliser les paquets de requête d'écho ICMPv4 aussi bien que les paquets UDP (défaut), l'actuel traceroute IPv6 ne peut qu'émettre des paquets UDP. Comme vous le savez peut-être, les paquets de requête d'écho ICMP sont mieux acceptés par les pare-feu ou les ACL sur les routeurs intermédiaires que les paquets UDP. -<!-- anchor id="program-tracepath6." -->tracepath6 IPv6 -Ce programme est normalement inclus dans le paquetage iputils. C'est un programme comme traceroute6, il trace le chemin vers une destination donnée, découvrant la MTU le long de ce chemin. En voici un exemple: - -<!-- anchor id="program-tcpdump" -->tcpdump IPv6 -Sur Linux, tcpdump est l'outil majeur pour la capture de paquets. Vous allez trouver ci-dessous quelques exemples. Le support IPv6 est normalement intégré aux éditions actuelles de la version 3.6. -tcpdump utilise des expressions pour filtrer les paquets, minimisant le bruit: -icmp6: filtre le trafic ICMPv6 natifip6: filtre le trafic IPv6 natif (incluant ICMPv6)proto ipv6: filtre le trafic IPv6-in-IPv4 tunnelénot port ssh: supprime l'affichage des paquets SSH, pour lancer tcpdump à partir d'une session distante SSHCertaines options en ligne de commande sont très utiles pour capter et afficher plus d'information concernant les paquets, essentiellement intéressant pour approfondir l'information des paquets ICMPv6: -“-s 512”: augmente la quantité d'information capturée pour un paquet à 512 octets“-vv”: sortie vraiment verbeuse“-n”: ne pas résoudre les adresses en noms, utile si la résolution inversée ne fonctionne pas proprement -Ping IPv6 vers l'adresse native 3ffe:ffff:100:f101::1 sur un lien-local - - 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) -]]> -Ping IPv6 vers 3ffe:ffff:100::1 routée au travers d'un tunnel IPv6-in-IPv4 -1.2.3.4 et 5.6.7.8 sont les extrémités du tunnel (toutes les adresses sont des exemples) - 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) -]]> -Les programmes prêts pour IPv6 -Les distributions actuelles comportent déjà les clients et les serveurs IPv6 les plus couramment utilisés. Allez d'abord voir sur IPv6 & Linux / l'état actuel des distributions. Si ce que vous cherchez n'y est pas encore, vous pouvez vérifier sur IPv6 & Linux / l'état actuel des applications disponibles, où sont répertoriés les programmes déjà portés sur IPv6 et utilisables sous Linux. Pour les programmes les plus communément employés, il y a quelques éléments disponibles dans la troisième partie et la quatrième partie de l'HowTo - IPv6 & Linux. -Les programmes client prêts pour IPv6 (une sélection) -Pour lancer les tests qui vont suivre, il est nécessaire que votre système dispose d'IPv6, et certains exemples montrent des adresses ne pouvant être atteintes que si une connexion au 6bone est disponible. -Vérifier la résolution DNS des adresses IPv6 -A cause des mises à jour de sécurité ces dernières années, tout serveur du Système des Noms de Domaine (DNS) devrait fonctionner avec un logiciel récent comprenant déjà le type (intermédiaire) d'adresse IPv6 AAAA (le nouveau, nommé A6 n'est pas encore assez répandu pour le moment, car uniquement supporté par BIND9 et supérieurs, mais aussi à cause de la non existence de support du domaine racine IP6.ARPA). Un simple test pour savoir si le système utilisé peut résoudre les adresses IPv6 est -et cela devrait affiché quelque chose comme ce qui suit: - -Le client telnet prêt pour IPv6 -Des clients telnet prêts pour IPv6 sont disponibles. Un simple test peut être effectué par -Si le client telnet ne comprend pas l'adresse IPv6 et dit quelque chose comme “ne peut résoudre le nom d'hôte” (“cannot resolve hostname”), IPv6 n'est alors pas disponible. -Les clients ssh prêts pour IPv6 - -openssh -Les versions actuelles d'openssh sont prêtes pour IPv6. Selon la configuration précédant la compilation, il y a deux comportements possibles. ---without-ipv4-default: le client essaie automatiquement une connexion IPv6 en premier et revient à IPv4 en cas d'échec.--with-ipv4-default: la connexion par défaut est IPv4, la connexion IPv6 doit être forcée comme dans l'exemple qui suit: -Si votre client ssh ne comprend pas l'option “-6”, c'est qu'il n'a pas IPv6 de disponible, comme la plupart des paquetages de ssh version 1. -ssh.com -Le client et le serveur SSH de chez SSH.com sont aussi prêts pour IPv6, et gratuits pour les machines Linux et FreeBSD selon l'usage - commercial ou personnel - qui en est fait. -Les navigateurs web prêts pour IPv6 -L'état actuel de la liste des navigateurs web IPv6 est disponible. -La plupart ont des problèmes irrésolues pour le moment -Si un seul proxy IPv4 est utilisé dans les réglages, les requêtes IPv6 seront bien envoyées vers le proxy, mais celui-ci échouera à comprendre la requête, laquelle échouera. Solution: mettre à jour le logiciel proxy (à voir plus tard).Les réglages de configuration automatique de proxy (*.pac) ne peuvent être étendus afin de prendre en charge différemment les requêtes IPv6 (par exemple ne pas utiliser le proxy) à cause de leur nature (écrits en Java-script et bien encodés en dur dans les sources, comme cela peut être observé pour le code source de Maxilla).C'est ainsi que les anciennes versions ne comprennent pas un URL avec une adresse encodée en IPv6 comme http://[2001:4dd0:f838:a006::6]/ (cet URL ne fonctionne qu'avec un navigateur disposant d'IPv6!). -Un bref test est d'essayer l'URL fourni avec un navigateur donné, sans utiliser de proxy. -Un URL de test -Un bon point de départ pour tester la navigation IPv6 est http://www.kame.net/. Si la tortue sur la page est animée, la connexion se fait via IPv6, sinon la tortue est statique. -Les programmes serveur prêts pour IPv6 -Dans cette partie, de nombreuses questions concernant des clients spécifiques ont été mentionnées. En conséquence, les éléments pour les serveurs prêts pour IPv6 sont fournis plus bas dans la section Eléments d'installation des démons prêts pour IPv6. -<!-- anchor id="faq-ipv6-ready-system-check" -->FAQ (vérification d'un système prêt pour IPv6) - -Utiliser les outils - -Q: impossible d'utiliser ping6 avec des adresses lien-local -Message d'erreur: "connect: Invalid argument" -Le noyau ne sait pas sur quel lien (physique ou virtuel) vous voulez l'utiliser et envoyer des paquets ICMPv6. C'est pourquoi est affiché un message d'erreur. -Solution: spécifier l'interface de cette façon: “ping6 -I eth0 fe80::2e0:18ff:fe90:9205”, voir aussi l'usage du programme ping6. -Q: impossible d'utiliser ping6 ou traceroute en tant qu'utilisateur courant -Message d'erreur: “icmp socket: Operation not permitted -Ces utilitaires créent des paquets spéciaux ICMPv6 et les émettent en dehors. Ceci est réalisé par l'emploi des sockets brutes du noyau. Ces dernières ne peuvent être utilisées que par l'utilisateur “root”. C'est pourquoi les utilisateurs courants obtiennent un tel message d'erreur. -Solution: s'il est vraiment nécessaire que tous les utilisateurs puissent utiliser ces utilitaires, vous pouvez ajouter le bit “suid” en faisant ”chmod u+s /chemin/vers/le/programme”, voir aussi l'usage du programme. Si tous les utilisateurs ne doivent pas en être capables, vous pouvez changer ce programme de groupe, par exemple au profit du groupe “wheel”, ajouter les utilisateurs nécessaires à ce groupe et ôter le bit d'exécution aux autres utilisateurs par “chmod o-rwx /chemin/vers/le/programme”, ou bien configurer “sudo” pour mettre en place votre politique de sécurité. -<!-- anchor id="chapter-configuration-interface" -->Configurer les interfaces - -Les différents périphériques réseau -Sur un noeud, il existe différents périphériques réseau. Ils peuvent être -Physiquement rattachés, comme eth0, tr0Virtuellement existants, comme ppp0, tun0, tap0, sit0, isdn0, ippp0 -Physiquement rattachés -Les interfaces physiquement rattachées, comme Ethernet ou Token-Ring, sont la norme et n'ont pas besoin d'un traitement particulier. -Virtuellement existants -Les interfaces virtuellement rattachées ont toujours besoin d'un traitement particulier. -Les interfaces de tunnelage IPv6-in-IPv4 -Ces interfaces sont normalement dénommées sitx. sit est l'abréviation mise pour Simple Transition Internet (Simple Internet Transition). Ce périphérique a la capacité d'encapsuler les paquets IPv6 à l'intérieur de paquets IPv4 et de les tunneler vers une extrémité étrangère. -sit0 a une signification particulière et ne peut être utilisée pour des tunnels dédiés. -Les interfaces PPP -Les interfaces PPP acquièrent leur capacité IPv6 grâce à un démon PPP disposant d'IPv6. -Les interfaces RNIS HDLC -La capacité IPv6 pour HDLC avec encapsulation ip est déjà intégrée au noyau. -Les interfaces PPP RNIS -Les interfaces PPP RNIS (ippp) ne sont pas disponibles pour IPv6 dans le noyau. Il n'est pas prévu que cela se fasse, puisqu'elles seront remplacées par une couche d'interface ppp plus générique. -SLIP + PLIP -Comme il a déjà été dit, ces interfaces ne supportent pas le transport IPv6 (l'émission est OK, mais la distribution à la réception ne fonctionne pas). -Le périphérique Ether-tap -Les périphériques Ether-tap sont prêts pour IPv6, et sont de plus configurables sans état. Pour être utilisés, le module “ethertap” doit être chargé au préalable. -Les périphériques tun -Actuellement, je ne les ai pas encore testés par moi-même. -ATM -01/2002: non supporté par l'actuel noyau vanille, supporté par l'extension USAGI. -Autres -Ai-je oublié une interface?... -(dé)Montage des interfaces -Deux méthodes peuvent être utilisées pour (dé)monter les interfaces. -Utiliser "ip" -Usage: - up -# ip link set dev down -]]>Exemple: - -Utiliser "ifconfig" -Usage: - up -# /sbin/ifconfig down -]]>Exemple: - -<!-- anchor id="chapter-configuration-address" -->Configurer les adresses IPv6 -Il y a différentes façons de configurer une adresse IPv6 sur une interface. Vous pouvez utiliser "ifconfig" ou "ip". -Affichage des adresses IPv6 existantes -Vous devriez d'abord vérifier s'il existe des adresses IPv6 configurées, et combien (peut-être y en a-t-il qui l'ont été, comme par magie, pendant l'auto-configuration sans état). -Utiliser "ip" -Usage: - -]]>Exemple pour un hôte configuré statiquement: -Exemple pour un hôte auto-configuré -Ici vous pouvez voir des adresses auto-configurées comme par magie et leurs durées de vie. - -Utiliser "ifconfig" -Usage: - -]]>Exemple (la sortie est filtrée avec grep pour n'afficher que les adresses IPv6). vous pouvez voir ici des adresses IPv6 ayant des portées différentes. - -Ajouter une adresse IPv6 -Ajouter une adresse IPv6 est similaire au mécanisme des adresses “ALIAS IP” sur les interfaces configurées par IPv4 Linux. -Utiliser "ip" -Usage: -/ dev -]]>Exemple: - -Utiliser "ifconfig" -Usage: - inet6 add / -]]>Exemple: - -Ôter une adresse IPv6 -Rarement nécessaire, prenez garde de ne pas ôter une adresse IPv6 n'existant pas, il en résulte parfois un crash sur les anciens noyaux. -Utiliser "ip" -Usage: -/ dev -]]>Exemple: - -Utiliser "ifconfig" -Usage: - inet6 del / -]]>Exemple: - -<!-- anchor id="chapter-configuration-route" -->Configurer les routes IPv6 courantes -Si vous voulez quitter votre lien et voulez émettre des paquets vers l'Internet mondial IPv6, vous avez besoin de routage. S'il existe déjà un routeur disposant d'IPv6 sur votre lien, il est possible que cela soit suffisant pour ajouter des routes IPv6. -Afficher les routes IPv6 existantes -Vous devriez d'abord vérifier s'il existe des routes IPv6 configurées, et combien (peut-être y en a-t-il qui l'ont été, comme par magie, pendant l'auto-configuration sans état). -Utiliser "ip" -Usage: -] -]]>Exemple: - -Utiliser "route" -Usage: -Exemple (la sortie est filtrée sur l'interface eth0). Ici vous pouvez voir différentes routes IPv6 pour différentes adresses sur une même interface. - -Ajouter une route IPv6 traversant une passerelle -Nécessaire la plupart du temps pour atteindre l'extérieur grâce à IPv6 en utilisant un routeur IPv6 sur votre lien. -Utiliser "ip" -Usage: -/ via -¬ [dev ] - -]]>Exemple: - -Utiliser "route" -Usage: -/ gw -¬ [dev ] -]]>Un périphérique peut être nécessaire également, si l'adresse IPv6 de la passerelle est un lien-local. -Suivre l'exemple montré ajoute une route à toutes les adresses globales actuelles (2000::/3) à travers la passerelle 3ffe:ffff:0:f101::1 - -Ôter une route IPv6 traversant une passerelle -Rarement nécessaire manuellement, la plupart du temps effectué par les scripts configurant le réseau à l'extinction (totale ou par interface) -Utiliser "ip" -Usage: -/ via -¬ [dev ] -]]>Exemple: - -Utiliser "route" -Usage: -/ [dev ] -]]>Exemple pour de nouveau ôter la route précédemment ajoutée: - -Ajouter une route IPv6 traversant une interface -Pas si fréquent, parfois en cas de création de lien point-à-point. -Utiliser "ip" -Usage: -/ dev -¬ metric 1 -]]>Exemple: -La distance (metric) “1” est utilisée ici par soucis de compatibilité avec la distance utilisée par route, car la distance par défaut fixée par “ip” est “1024”. -Utiliser "route" -Usage: -/ dev -]]>Exemple: - -Ôter une route IPv6 traversant une interface -Rarement utiliser manuellement, les scripts de configuration font cela à l'extinction. -Utiliser "ip" -Usage: -/ dev -]]>Exemple: - -Utiliser "route" -Usage: -/ dev -]]>Exemple: - -FAQ concernant les routes IPv6 - -Support d'une route par défaut IPv6 -Une idée d'IPv6 était le routage hiérarchique, avec pour conséquence une quantité moindre d'entrées dans les tables de routage nécessaires aux routeurs. -Il y a certains problèmes dans les noyaux Linux actuels: -Les clients (ne routent aucun paquet!) -Les clients peuvent installer une route par défaut avec pour préfixe “::/0”, ils peuvent aussi apprendre une telle route par auto-configuration, en utilisant par exemple radvd s'il est présent sur le lien, comme le montre ce qui suit: - -Les routeurs en cas de renvoi de paquets -Dans ses grandes lignes, l'actuel noyau Linux (au moins <= 2.4.17) ne supporte pas les routes par défaut. Vous pouvez les installées, mais la recherche échouera quand un paquet devra être renvoyé (une intention normale pour un routeur). -Pour l'heure, le “routage par défaut” peut être installé en utilisant l'actuel et unique préfixe d'adresse globale “2000::/3”. -Le projet USAGI supporte déjà cela dans leurs extensions grâce à une astuce de programmation (NdT: a hack, i.e. littéralement, une”bidouille”). -Note: prenez garde au routage par défaut sans filtrage d'adresse sur les routeurs de bordure, sinon du trafic multicast ou site-local quittera l'environnement. -<!-- anchor id="chapter-Neighbor-Discovery" -->La découverte de voisinage -La découverte de voisinage est le successeur IPv6 de ARP (Address Resolution Protocol, protocole de résolution d'adresse) pour IPv4. Vous pouvez récupérer l'information concernant le voisinage actuel, de plus, vous pouvez fixer ou détruire des entrées. Le noyau garde la trace de la détection d'un voisin (comme ARP pour IPv4). Vous pouvez faire des recherches dans la table apprise, en utilisant “ip”. -Afficher le voisinage en utilisant "ip" -Avec la commande qui suit vous pouvez afficher les voisins IPv6 appris ou configurés -] -]]>L'exemple suivant montre un voisin, qui est un routeur pouvant être atteint - -Manipuler la table de voisinage en utilisant "ip" - -Ajouter manuellement une entrée -La commande suivante vous permet d'ajouter manuellement une entrée - lladdr dev -]]>Exemple: - -Détruire manuellement une entrée -De même qu'une entrée peut être ajoutée, une entrée peut être détruite: - lladdr dev -]]>Exemple: - -Pour plus de réglages avancés -L'outil “ip” est sous-documenté, mais il est très puissant. Voir l'aide en ligne pour en savoir plus -Il semble que certaines options soient uniquement pour IPv4... si vous pouvez contribuer à en dire plus sur les drapeaux et l'emploi avancé, merci d'envoyer vos informations. -<!-- anchor id="chapter-configuring-ipv6-in-ipv4-tunnels" -->Configurer les tunnels IPv6-in-IPv4 -Si vous souhaitez quitter votre lien incapable d'accéder à IPv6 à partir de votre réseau local, vous avez besoin d'un tunnelage IPv6-in-IPv4 afin de rejoindre l'Internet mondial IPv6. -Il y a différents mécanismes de tunnelage, et conséquemment, différentes façons d'installer des tunnels. -Les types de tunnel -Il y a plus d'une façon de tunneler des paquets IPv6 sur des liens uniquement IPv4. -Tunnelage statique point-à-point: 6bone -Un tunnel point-à-point est un tunnel dédié à un point de connexion terminal, qui connaît votre réseau IPv6 (pour le routage en retour) et l'adresse IPv4 de votre point de connexion (terminale), comme défini dans la RFC 2893 / Transition Mechanisms for IPv6 Hosts and Routers. Pré-requis: -L'adresse IPv4 de votre point de connexion terminal doit être globalement unique, statique, et accessible à partir de l'autre point de connexion terminal distantUn préfixe IPv6 vous est assigné (voir le bureau d'enregistrement 6bone)Une extrémité distante du tunnel capable de router votre préfixe IPv6 jusqu'à votre extrémité locale du tunnel (la plupart du temps, une configuration manuelle distante est requise) -Le tunnelage automatique -Le cas du tunnelage automatique se présente quand un noeud se connecte directement à un autre noeud en ayant obtenu au préalable l'adresse IPv4 de l'autre noeud. -<!-- anchor id="tunneling-6to4." -->Le tunnelage 6to4 -Le tunnelage 6to4 (RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds) utilise un mécanisme simple pour créer des tunnels automatiques. Tout noeud ayant une adresse unique globale IPv4 est capable d'être le point de connexion terminal d'un tunnel 6to4 (si aucun pare-feu IPv4 ne prohibe ce trafic). Foncièrement, le tunnelage 6to4 n'est pas un tunnel en binôme (one-to-one tunnel). Ce tunnelage se subdivise en un tunnelage d'un flux montant et d'un flux descendant. Une adresse IPv6 spéciale indique que ce noeud utilisera un tunnelage 6to4 pour se connnecter au réseau mondial IPv6. -La génération d'un préfixe 6to4 -Une adresse 6to4 est définie comme suit (le schéma provient du RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds): -FP et TLA ensemble (16 bits) ont la valeur 0x2002. V4ADDR est l'adresse IPv4 globale et unique du noeud (en notation hexadécimale). SLA est l'identifiant de sous-réseau (65536 sous-réseaux locaux possibles). Ils sont utilisés pour représenter la structure locale de votre réseau. -Pour les passerelles, un tel préfixe est généré en utilisant normalement pour SLA “0000”, et pour suffixe “::1” (ce n'est pas une nécessité, il peut être déterminé arbitrairement, mais d'une portée locale) et assigné à l'interface de tunnelage 6to4. Notez que Windows Microsoft utilise aussi V4ADDR comme préfixe. -Le flux de tunnelage ascendant 6to4 -Le noeud doit savoir à quel point de connexion terminal étranger ses paquets IPv6 dans IPv4 doivent être envoyés. Aux tout premiers jours du tunnelage 6to4, des routeurs dédiés au tunnelage de flux ascendant avaient été définis. Voir l'information 6to4 de NSayer pour une liste de ses routeurs. -De nos jours, les routeurs de flux ascendant 6to4 peuvent être découverts comme par magie par l'emploi de l'adresse anycast 192.88.99.1. Les protocoles de routage s'occupent de cela en arrière-plan, voir le RFC 3068 / An Anycast Prefix for 6to4 Relay Routers pour les détails. -Le flux de tunnelage descendant 6to4 -La méthode servant au flux descendant (du 6bone vers votre noeud disposant de 6to4) n'est pas vraiment bien fixée et peut varier selon l'hôte étranger vers qui sont envoyés les paquets originaux. Il existe deux possibilités: -l'hôte étranger utilise 6to4 et émet directement en retour les paquets à votre noeud (voir plus bas)l'hôte étranger émet les paquets en retour vers le réseau mondial IPv6 et selon le routage dynamique qui a lieu alors, un routeur relais créera un tunnel automatique de retour vers votre noeud. -Le trafic possible avec 6to4 - -de 6to4 vers 6to4: est normalement tunnelé directement entre chacun des hôtes disposant de 6to4de 6to4 vers un trafic non 6to4: est émis via le flux ascendant du tunnelageun trafic non 6to4 vers 6to4: est émis via le flux descendant du tunnelage -Afficher les tunnels existants - -Utiliser "ip" -Usage: -] -]]>Exemple: - -Utiliser "route" -Usage: -Exemple (la sortie est filtrée afin de ne laisser apparaître que les tunnels empreintant l'interface sit0): - -<!-- anchor id="conf-ipv6-in-ipv4-point-to-point-tunnels" -->Montage d'un tunnel point-à-point -Il y a 3 possibilités pour ajouter ou ôter un tunnel point-à-point. -Une bonne source d'information additionnelle à propos de l'installation de tunnel grâce à “ip” est configurer les tunnels avec iproute2 (article) (miroir). -Ajouter un tunnel point-à-point - -Utiliser "ip" -La méthode la plus commune actuellement pour une petite quantité de tunnels. -Usage en vue de créer un périphérique de tunnelage (mais il n'est pas monté pour autant, une TTL doit également être spécifiée, car la valeur par défaut est 0) - mode sit ttl remote -¬ local -]]>Usage (exemple générique pour trois tunnels): - 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 -]]> -Utiliser "ifconfig" et "route" (méthode dépréciée) -Ce n'est véritablement pas une méthode recommandée pour ajouter un tunnel, car elle est plutôt étrange. Pas de problème lors de l'ajout d'un seul tunnel, mais si vous en montez plus d'un, il ne vous est pas possible facilement de démonter le premier tout en laissant les autres fonctionner. -Usage (exemple générique pour trois tunnels): - -# /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 -]]>Important: NE JAMAIS FAIRE DE LA SORTE, car cette façon de faire rend implicitement disponible le "tunnelage automatique" à partir de n'importe où dans l'Internet, c'est un risque, et cela ne devrait jamais être préconisé. -Utiliser seulement "route" -Il est aussi possible d'installer des tunnels dans le style Accès Multiple Sans Diffusion (Non Broadcast Multiple Access, ou NBMA), c'est un moyen facile d'ajouter de nombreux tunnels en une fois. -Usage (exemple générique pour trois tunnels): - gw -¬ :: dev sit0 -# /sbin/route -A inet6 add gw -¬ :: dev sit0 -# /sbin/route -A inet6 add gw -¬ :: dev sit0 -]]>Important: NE JAMAIS FAIRE DE LA SORTE, car cette façon de faire rend implicitement disponible le "tunnelage automatique" à partir de n'importe où dans l'Internet, c'est un risque, et cela ne devrait jamais être préconisé. -Ôter des tunnels point-à-point -Rarement réalisé manuellement, mais utilisé par les scripts pour une extinction propre ou un redémarrage de la configuration IPv6. -Utiliser "ip" -Pour ôter un périphérique de tunnelage: - -]]>Usage (exemple générique pour trois tunnels): - 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 -]]> -Utiliser "ifconfig" et "route" (méthode dépréciée parce qu'elle n'est pas très drôle) -Ce n'est pas seulement la création qui est étrange, mais l'extinction aussi... vous devez ôter les tunnels dans l'ordre inverse, ce qui signifie que le premier créé doit être le dernier ôté. -Usage (exemple générique pour trois tunnels): - dev sit3 -# /sbin/ifconfig sit3 down - -# /sbin/route -A inet6 del dev sit2 -# /sbin/ifconfig sit2 down - -# /sbin/route -A inet6 add dev sit1 -# /sbin/ifconfig sit1 down - -# /sbin/ifconfig sit0 down - -]]> -Utiliser "route" -Comme pour ôter des routes IPv6 courantes - -Usage (exemple générique pour trois tunnels): - gw -¬ :: dev sit0 -# /sbin/route -A inet6 del gw -¬ :: dev sit0 -# /sbin/route -A inet6 del gw -¬ :: dev sit0 - -# /sbin/ifconfig sit0 down -]]> -Attribution d'une adresse (<emphasis>numbered</emphasis>) à un tunnel point-à-point -Il est parfois nécessaire de configurer un tunnel point-à-point avec des adresses IPv6 comme pour IPv4 aujourd'hui. C'est seulement possible avec la première méthode (ifconfig+route - dépréciée) et la troisième méthode (ip+route) d'installation de tunnel. Dans de tels cas, vous pouvez ajouter l'adresse IPv6 à l'interface de tunnelage comme montré dans la configuration d'interface. -<!-- anchor id="configuring-ipv6to4-tunnels" -->Installation des tunnels 6to4 -Prenez garde au fait que le support des tunnels 6to4 est actuellement manquant sur la série des noyaux vanille 2.2.x (voir la vérification du système / noyau pour plus de détails). Notez aussi que la longueur du préfixe d'une adresse 6to4 est de 16, car, du point de vue du réseau, tous les autres hôtes 6to4 sont sur la même couche 2. -Ajouter un tunnel 6to4 -Vous avez premièrement à calculer votre préfixe 6to4 en utilisant votre adresse IPv4 routable assignée localement (si votre hôte n'a pas d'adresse IPv4 routable, dans des cas précis, NAT sur une passerelle est possible): -En considérant que votre adresse IPv4 soit -le préfixe 6to4 généré sera -Les passerelles locales 6to4 devraient (mais cela n'est pas une nécessité, vous pouvez choisir un préfixe arbitraire de portée locale, si cela vous sied mieux) toujours assigner le suffixe “::1”, ce qui vous donnera comme adresse 6to4 locale -Utiliser par exemple ce qui suit pour une génération automatique: -Il y a maintenant deux façons possibles de mettre en place un tunnelage 6to4. -Utiliser "ip" et un périphérique tunnel dédié -C'est dorénavant la façon de faire qui est recommandée (une TTL doit être spécifiée, car le défaut est 0). -Créez un nouveau périphérique tunnel - remote any local -]]>Montez l'interface -Ajouter une adresse 6to4 locale à l'interface (note: la longueur du préfixe, 16, est importante!) -/16 dev tun6to4 -]]>Ajouter une route (par défaut) au réseau global IPv6 en utilisant l'adresse anycast tous-routeurs-6to4 (all-6to4-routers) -Il a été rapporté que certaines versions de “ip” (par exemple Linux SuSe 9.0) ne prennent pas en charge les adresses IPv6 compatibles IPv4 pour les passerelles. Dans ce cas, l'adresse IPv6 correspondante doit être employée: - -Utiliser "ifconfig", "route" et le périphérique de tunnelage “sit0” (méthode dépréciée) -Cela est déprécié car le périphérique de tunnel générique sit0 ne permet pas de spécifier un filtrage par périphérique. -Monter l'interface de tunnelage générique sit0 -Ajouter une adresse 6to4 locale à une interface -/16 -]]>Ajouter une route (par défaut) au réseau global IPv6 en utilisant l'adresse anycast IPv4 tous-relais-6to4 (all-6to4-relays) - -Ôter un tunnel 6to4 - -Utiliser "ip" et un périphérique de tunnelage dédié -Ôter toutes les routes traversant ce périphérique de tunnelage spécifique -Démonter l'interface -Ôter un périphérique tunnel - -Utiliser “ifconfig”, “route” et un périphérique de tunnel générique “sit0” (déprécié) -Ôter une route (par défaut) traversant une interface tunnel 6to4 -Ôter une adresse locale 6to4 d'une interface -/16 -]]>Démontage d'un périphérique de tunnelage générique (prenez garde, peut-être est-il utilisé...) - -<!-- anchor id="chapter-configuring-ipv4-in-ipv6-tunnels" -->Configurer les tunnels IPv4-in-IPv6 -Cela sera complété à l'avenir. Pour le moment, de tels tunnels sont essentiellement employés en environnement de test, mais il semble que le support soit actuellement manquant pour linux (03/2004). -Pour l'heure, plus d'information dans le RFC 2473 / Generic Packet Tunneling in IPv6 Specification -<!-- anchor id="chapter-kernel-settings" -->Les réglages du noyau dans le système de fichiers /proc -Note: la source de cette section est essentiellement le fichier "ip-sysctl.txt", qui est inclus dans les sources du noyau actuel, dans le répertoire "Documentation/networking". Le crédit va à Pekka Savola qui maintient la partie de ce fichier relative à IPv6. D'autres textes sont aussi plus ou moins copier/coller dans cette partie de document. -Comment accéder au système de fichiers /proc - -Utiliser “cat” et “echo” -Utiliser "cat" et "echo" est le moyen le plus simple d'accéder au système de fichiers /proc, mais certains pré-requis sont nécessaires à cela -Le système de fichiers /proc doit être rendu disponible dans le noyau, ce qui signifie qu'à la compilation le commutateur suivant doit avoir été positionné - -Le système de fichiers /proc doit être auparavant monté, ce qui peut être testé en faisant - -Vous devez pouvoir lire le système de fichiers /proc et parfois aussi y écrire (normalement seul root le peut)Normalement, seules les entrées dans /proc/sys/* sont en écriture, les autres sont en lecture seule et servent seulement à la récupération de l'information. -Récupérer une valeur -La valeur de l'entrée peut être récupérée en utilisant "cat": - -Fixer une valeur -Une nouvelle valeur peut être fixée (si l'entrée est en écriture) en utilisant echo: -/proc/sys/net/ipv6/conf/all/forwarding -]]> -Utiliser “sysctl” -Utiliser le programme "sysctl" pour accéder aux commutateurs du noyau est une méthode moderne aujourd'hui. Vous pouvez aussi l'utiliser même si le système de fichiers /proc n'est pas monté. Mais vous n'avez alors accès qu'à /proc/sys/*! -Le programme “sysctl” est compris dans le paquetage “procps” (sur le système Red Hat). -L'interface sysctl doit être disponible dans le noyau, ce qui signifie qu'à la compilation le commutateur suivant a à être fixé - -Récupérer une valeur -La valeur de l'entrée peut maintenant être récupérée: - -Fixer une valeur -Une nouvelle valeur peut être fixée (si l'entrée est en écriture): -Note: n'utilisez pas d'espaces autour du signe "=" lorsque vous fixez les valeurs. De même pour une valeur multiple sur une même ligne, mettez des guillemets comme ceci - -En plus -Note: il existe dans la pratique certaines versions de sysctl qui affichent “/” au lieu de “.” -Pour plus de détails jetez un coup d'oeil dans la page de manuel de sysctl. -une astuce: pour une recherche rapide parmi les réglages, utiliser “-a” (afficher toutes les entrées) en conjonction avec “grep”. -Les types de valeur trouvés dans le système de fichiers /proc -IL y a plusieurs formats observés dans le système de fichiers /proc: -BOOLÉEN: simple “0” (faux) ou “1” (vrai)ENTIER: une valeur entière, peut être également non signéeDes lignes plus sophistiquées avec plusieurs valeurs: parfois un en-tête est aussi affiché, sinon, jetez un coup d'oeil aux sources du noyau pour savoir quel sens possède telle ou telle valeur... -<!-- anchor id="proc-sys-net-ipv6." -->Les entrées de /proc/sys/net/ipv6/ - -conf/default/* -Changer les réglages par défaut spécifiques à chaque interface. -conf/all/* -Changer tous les réglages spécifiques aux interfaces. -Exception: “conf/all/forwarding” a une signification différente ici -conf/all/forwarding - -Type: BOOLÉENCeci rend disponible le renvoi global IPv6 entre toutes les interfaces. -En IPv6, vous ne pouvez contrôler le renvoi par périphérique, le contrôle du renvoi doit être réalisé en utilisant les jeux de règles de netfilter-IPv6 (contrôlés grâce à ip6tables) en spécifiant les périphériques d'entrée et de sortie (voir comment mettre en place un pare-feu/Netfilter6 pour plus d'information); à la différence d'IPv4, où vous pouvez contrôler le renvoi périphérique par périphérique (la décision est prise sur l'interface qui reçoit des paquets). -Ceci fixe aussi le réglage du renvoi Hôte/Routeur de toutes les interfaces à la valeur spécifiée. Voir plus bas pour plus de détails. Tout ceci relève du renvoi global. -Si cette valeur est à 0, aucun renvoi IPv6 n'est disponible, jamais aucun paquet ne part vers une autre interface, ni physique, ni logique, comme par exemple un tunnel. -conf/interface/* -Changer les réglages spécifiques à chaque interface. -Le comportement fonctionnel de certains réglages est dépendant du positionnement du renvoi local, disponible ou non. -accept_ra - -Type: BOOLÉENDéfaut fonctionnel: disponible si le renvoi local est disponible; indisponible si le renvoi local est disponible.Accepter les annonces de routeur, et auto-configurer cette interface avec les données reçues. -accept_redirects - -Type: BOOLÉENDéfaut fonctionnel: disponible si le renvoi local est indisponible. Indisponible si le renvoi local est disponible.Accepter les redirections émises par un routeur IPv6. -autoconf - -Type: BOOLÉENDéfaut: VRAIConfigurer les adresses lien-local (voir aussi Les types d'adresse) utilisant les adresses matérielles L2. Par exemple, ceci génère, comme par magie, une adresse telle que “fe80::201:23ff:fe45:6789” sur une interface ayant une adresse MAC-L2. -dad_transmits - -Type: ENTIERDéfaut: 1Quantité de message de détection d'adresse dupliquée à émettre. -forwarding - -Type: BOOLÉENDéfaut: FAUX si le renvoi global est indisponible (défaut), sinon VRAIConfigurer le comportement spécifique à chaque interface Hôte/Routeur. -Note: Il est recommandé d'avoir le même réglage sur toutes les interfaces; mélanger les scénarii routeur/hôte est plutôt atypique. -Valeur FAUX: Par défaut, le comportement d'hôte est assumé. Cela signifie que: -Le drapeau IsRouter n'est pas positionné dans les annonces de voisinage.Les sollicitations de routeur sont envoyées dès que nécessaires.Si accept_ra est VRAI (défaut), accepte les annonces de routeur (et réalise une auto-configuration).Si accept_redirects est VRAI (défaut), accepte les redirections. -Valeur VRAI: si le renvoi local est disponible, le comportement d'un routeur est assumé. Ceci signifie l'opposé de ce qui précéde: -Le drapeau IsRouter est positionné dans les annonces de voisinage.Les sollicitations de routeur ne sont pas émises.Les annonces de routeur sont ignorées.Les redirections sont ignorées. -hop_limit - -Type: ENTIERDéfaut: 64Nombre limite de sauts par défaut. -mtu - -Type: ENTIERDéfaut: 1280 (minimum requis pour IPv6)Unité de transfert maximum par défaut -router_solicitation_delay - -Type: ENTIERDéfaut: 1Nombre de secondes à attendre après le montage d'une interface avant d'émettre des sollicitations de routeur. -router_solicitation_interval - -Type: ENTIERDéfaut: 4Nombre de secondes d'attente entre les émissions de sollicitations de routeur. -router_solicitations - -Type: ENTIERDéfaut: 3Nombre de sollicitation(s) de routeur à émettre avant de considérer qu'aucun routeur n'est présent. -neigh/default/* -Changer les réglages par défaut pour la détection de voisinage et certaines valeurs d'intervalle global et de déclenchement (threshold): -gc_thresh1 - -Type: ENTIERDéfaut: 128A remplir plus avant. -gc_thresh2 - -Type: ENTIERDéfaut: 512A remplir plus avant. -gc_thresh3 - -Type: ENTIERDéfaut: 1024Paramètre de réglage de la taille de la table du voisinage. -Augmenter cette valeur si vous avez de nombreuses interfaces et un problème avec des routes qui commencent à mystérieusement s'activer et échouer. Ou si un démon de routage Zebra en cours d'activité rapporte cette erreur: - -gc_interval - -Type: ENTIERDéfaut: 30A remplir plus avant. -neigh/interface/* -Changez ces réglages spécifiques à chaque interface pour la détection de voisinage. -anycast_delay - -Type: ENTIERDéfaut: 100A remplir plus avant. -gc_stale_time - -Type: ENTIERDéfaut: 60A remplir plus avant. -proxy_qlen - -Type: ENTIERDéfaut: 64A remplir plus avant. -unres_qlen - -Type: ENTIERDéfaut: 3A remplir plus avant. -app_solicit - -Type: ENTIERDéfaut: 0A remplir plus avant. -locktime - -Type: ENTIERDéfaut: 0A remplir plus avant. -retrans_time - -Type: ENTIERDéfaut: 100A remplir plus avant. -base_reachable_time - -Type: ENTIERDéfaut: 30A remplir plus avant. -mcast_solicit - -Type: ENTIERDéfaut: 3A remplir plus avant. -ucast_solicit - -Type: ENTIERDéfaut: 3A remplir plus avant. -delay_first_probe_time - -Type: ENTIERDéfaut: 5A remplir plus avant. -proxy_delay - -Type: ENTIERDéfaut: 80A remplir plus avant. -route/* -Changer les réglages globaux du routage. -flush -Retiré des nouvelles versions du noyau . -gc_interval - -Type: ENTIERDéfaut: 30A remplir plus avant. -gc_thresh - -Type: ENTIERDéfaut: 1024A remplir plus avant. -mtu_expires - -Type: ENTIERDéfaut: 600A remplir plus avant. -gc_elasticity - -Type: ENTIERDéfaut: 0A remplir plus avant. -gc_min_interval - -Type: ENTIERDéfaut: 5A remplir plus avant. -gc_timeout - -Type: ENTIERDéfaut: 60A remplir plus avant. -min_adv_mss - -Type: ENTIERDéfaut: 12A remplir plus avant. -max_size - -Type: ENTIERDéfaut: 4096A remplir plus avant. -<!-- anchor id="proc-sys-net-ipv4." -->Les entrées relatives à IPv6 dans /proc/sys/net/ipv4/ -Pour le moment (et cela sera valable jusqu'à ce qu'IPv4 soit complètement converti en un module indépendant du noyau), certains commutateurs IPv4 sont aussi utilisés par IPv6. -ip_* - -ip_local_port_range -Ce réglage sont aussi utilisé par IPv6. -tcp_* -Ces réglages sont aussi utilisés par IPv6. -icmp_* -Ces réglages ne sont pas utilisés par IPv6. Pour réaliser une limitation du trafic ICMPv6 (ce qui est très recommandé compte tenu de possibles engorgements ICMPv6), des règles netfilter-v6 doivent être utilisées. -autre(s) -Inconnu(s), mais probablement inutilisé(s) par IPv6. -<!-- anchor id="proc-net" -->Les entrées relatives à IPv6 dans /proc/net/ -Dans /proc/net il y a plusieurs entrées disponibles en lecture seule. Vous ne pouvez pas utiliser ici “sysctl” afin de récupérer des informations, utiliser “cat”. -if_inet6 - -Type: Une ligne par adresse comporte plusieurs valeursIci toutes les adresses IPv6 configurées sont montrées sous un format particulier. L'exemple affiche seulement l'interface loopback. Sa signification est détaillée ci-dessous (voir “net/ipv6/addrconf.c” pour en savoir plus). - -L'adresse IPv6 affichée grâce à 32 caractères hexadécimaux sans le séparateur ":"Numéro de périphérique Netlink (index d'interface) in hexadécimal (voir aussi “ip addr”)La longueur du préfixe en hexadécimalLa valeur de la portée (voir les sources du noyau "include/net/ipv6.h" et "net/ipv6/addrconf.c" pour plus de détails)Les drapeaux de l'interface (voir “include/linux/rtnetlink.h” et “net/ipv6/addrconf.c” pour en savoir plus)Le nom du périphérique -ipv6_route - -Type: Une ligne par route comporte plusieurs valeursIci toutes les routes IPv6 configurées sont montrées dans un format particulier. L'exemple affiche seulement l'interface loopback. Sa signification est détaillée ci-dessous (voir “net/ipv6/route.c” pour en savoir plus). - -Le réseau de destination IPv6 affiché grâce à 32 caractères hexadécimaux sans le séparateur ":"La longueur du préfixe de destination IPv6 en hexadécimalLe réseau source IPv6 affiché grâce à 32 caractères hexadécimaux sans le séparateur ":" La longueur du préfixe de la source IPv6 en hexadécimalLe prochain saut IPv6 affiché grâce à 32 caractères hexadécimaux sans le séparateur ":"La distance en hexadécimalCompteur de référenceCompteur d'utilisationLes drapeauxNom du périphérique -sockstat6 - -Type: Une ligne par protocole avec description et valeurStatistiques à propos de l'utilisation des sockets IPv6. Exemple: - -tcp6 -A remplir. -udp6 -A remplir. -igmp6 -A remplir. -raw6 -A remplir. -ip6_flowlabel -A remplir. -rt6_stats -A remplir. -snmp6 - -Type: Une ligne par description et valeur SNMPStatistiques SNMP, peuvent être récupérées par un serveur SNMP et mis en rapport à une tableau MIB grâce à un logiciel d'administration réseau. -ip6_tables_names -Tables netfilter6 disponibles -<!-- anchor id="netlink" -->L'interface de netlink vers le noyau -A remplir... je n'ai en cela pas d'expérience... -<!-- anchor id="network-debugging" -->Le déboguage réseau - -Les sockets d'écoute de serveur - -Utiliser “netstat” pour vérifier les sockets d'écoute de serveur -C'est toujours intéressant de savoir quelles sockets de serveur sont actives à un moment donné sur un noeud. Utiliser “netstat” est le moyen le plus court pour obtenir une telle information: -options employées: -nlptu -Exemple: - -<!-- anchor id="examples-tcpdump" -->Des exemples de dump provenant de tcpdump -Suivent quelques exemples de paquets capturés, cela sera peut-être utile pour vos propres déboguages... -...plus d'info à venir... -La découverte de routeur - -Une annonce de routeur - - 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) -]]>Un routeur, avec pour adresse lien-local “fe80::212:34ff:fe12:3450”, émet une annonce à l'adresse multicast tous-les-noeuds-du-lien (all-node-on-link) “ff02::1”, contenant deux préfixes, “2002:0102:0304:1::/64” (d'une durée de vie de 30 s) et “3ffe:ffff:0:1::/64” (d'une durée de vie de 2592000 s), incluant sa propre adresse MAC de couche 2, “0:12:34:12:34:50”. -Une sollicitation de routeur - - ff02::2: icmp6: router solicitation -¬ (src lladdr: 0:12:34:12:34:56) (len 16, hlim 255) -]]>Un noeud, avec pour adresse lien-local “fe80::212:34ff:fe12:3456” et comme adresse de couche 2 “0:12:34:12:34:56”, est en quête d'un routeur présent sur le lien, en conséquence il émet cette sollicitation à l'adresse multicast tous-routeurs-présents-sur-le-lien (all-router-on-link) “ff02::2”. -La découverte de voisinage - -Une sollicitation de découverte de voisinage afin de détecter une possible duplication d'adresse -Les paquets suivants sont émis par un noeud sur la couche 2, adresse MAC “0:12:34:12:34:56”, pendant l'auto-configuration, afin de vérifier si une adresse potentielle est déjà employée ou non par un autre noeud sur le lien permettant d'émettre ces paquets, via l'adresse multicast lien-local du noeud sollicité. -Le noeud veut configurer son lien-local avec l'adresse “fe80::212:34ff:fe12:3456”, il est en train de vérifier s'il y a duplication - 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) -]]> -Le noeud veut configurer son adresse globale “2002:0102:0304:1:212:34ff:fe12:3456” (après avoir reçu l'annonce montrée plus haut), il est en train de vérifier s'il y a ou non duplication - 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) -]]> -Le noeud veut configurer son adresse globale “3ffe:ffff:0:1:212:34ff:fe12:3456” (après avoir reçu l'annonce montrée plus haut), il est en train de vérifier s'il y a ou non duplication - 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) -]]> -Une sollicitation de découverte de voisinage à la recherche d'hôte(s) ou de passerelle(s) - -Un noeud veut émettre des paquets à “3ffe:ffff:0:1::10” mais il n'a aucune adresse MAC de la couche 2 vers laquelle il pourrait émettre, il émet alors maintenant une sollicitation - ff02::1:ff00:10: icmp6: -¬ neighbor sol: who has 3ffe:ffff:0:1::10(src lladdr: 0:e0:18:90:92:5) (len 32, -¬ hlim 255) -]]> -Ce noeud recherche maintenant “fe80::10” - ff02::1:ff00:10: icmp6: neighbor -¬ sol: who has fe80::10(src lladdr: 0:e0:18:90:92:5) (len 32, hlim 255) -]]> -<!-- anchor id="chapter-support-persistent-configuration" -->Support à la configuration persistante IPv6 dans les distributions Linux -Certaines distributions Linux contiennent déjà un support à la configuration persistante IPv6 utilisant une configuration nouvelle ou préexistante, des fichiers de script, et des accroches dans les fichiers de script IPv4. -Linux Red Hat et ses "clones" -Depuis que j'ai commencé à écrire l'Howto -IPv6 & Linux , il était dans mon intention de rendre disponible une configuration convenant aux cas les plus fréquents tels que hôte simple, routeur simple, hôte à double résidence, routeur avec un second tronçon réseau, tunnel typique, tunnel 6to4, etc. De nos jours, il existe des fichiers de configuration et des scripts qui font très bien ce travail (je n'ai jamais entendu parler de vrais problèmes, mais je ne sais pas s'ils sont beaucoup utilisés). Parce que cette configuration et ces scripts augmentent régulièrement en volume, ils ont leur propre page HOWTO: initscripts-ipv6 (miroir). Parce que j'ai commencé mon expérience IPv6 sur un clone de la Linux Red Hat 5.0, mes développements concernant IPv6 sont encore essentiellement basés sur Linux Red Hat, il est par conséquent un peu logique que ces scripts soient développés sur ce type de distribution (on appelle ça une raison historique). Il est ainsi très facile d'étendre certains de ces fichiers de configuration, d'en créer de nouveaux et de créer de simples accroches d'appel à l'installation d'IPv6 à partir de l'installation d'IPV4. -Depuis la Red Hat 7.1, une archive de mes scripts y est incluse. Cela est dû, et cela sera encore vrai à l'avenir, à l'assistance de Pekka Savola. -La Mandrake, depuis la version 8.0, inclut aussi un paquetage initscript prêt pour IPv6, cependant un bogue mineur retient de l'employer (il manque 'inet6” à “ifconfig” avant “add”). -Tester la présence des scripts de configuration IPv6 -Vous pouvez tester si votre distribution Linux contient le support pour la configuration persistante IPv6 utilisant mon jeu d'outils. Le script de la bibliothèque devrait exister: -Un test magique: -La version de la bibliothèque est importante s'il vous manque certaines fonctionnalités. Vous pouvez l'obtenir en exécutant ce qui suit (ou d'une façon encore plus aisée en regardant le haut du fichier): -Dans l'exemple montré, la version utilisée est la 20011124. Vérifiez cela par rapport à l'information la plus à jour sur la page initscripts-ipv6 (miroir) afin de voir ce qui a changé. Vous y trouverez aussi un journal des modifications. -Quelques éléments pour rendre disponible IPv6 sur les actuelles RHL 7.1, 7.2, 7.3,... - -Vérifiez si votre système a déjà le module IPv6 chargé - -Si le résultat est “off”, alors rendez disponible la mise en réseau IPv6 en éditant /etc/sysconfig/network, ajoutez la nouvelle ligne - -Redémarrez la machine, ou simplement le réseau par - -Maintenant le module IPv6 devrait être chargé -Si votre système est sur un lien fournissant l'annonce de routeur, la configuration sera réalisée automatiquement. Pour plus d'information sur les réglages supportées, voir /usr/share/doc/initscripts-$version/sysconfig.txt. -Linux SuSE -Dans les nouvelles versions, il n'y a véritablement qu'un support rudimentaire disponible, voir /etc/rc.config pour les détails. -A cause de sa configuration très différente et de la structure de ses scripts, il est difficile (voire impossible) d'utiliser le jeu d'outils de Linux Red Hat et de ses clones avec cette distribution. -Dans les versions 8.x, SuSE va complétement modifier l'installation de sa configuration. -Linux SuSE 7.3 - -Comment installer IPv6 6to4 pour la SuSE 7.3 -Linux SuSE 8.0 - -Configuration d'adresse IPv6 -Editez le fichier /etc/sysconfig/network/ifcfg-<nom-de-l'interface> et fixez la valeur suivante -/" -]]> -Information supplémentaire -Voir le fichier /usr/share/doc/packages/sysconfig/README -Linux SuSE 8.1 - -Configuration d'adresse IPv6 -Editez le fichier /etc/sysconfig/network/ifcfg-<nom-de-l'interface> et fixez la valeur suivante -/" -]]> -Information supplémentaire -Voir le fichier /usr/share/doc/packages/sysconfig/Network -<!-- anchor id="Configuration-Debian-Linux" -->Linux Debian -Les informations qui suivent sont une contribution de Stéphane Bortzmeyer <bortzmeyer chez nic point fr> -Assurez-vous qu'IPv6 soit chargé; soit il est compilé dans le noyau, soit il est chargé comme module. Dans ce dernier cas, trois solutions, l'ajouter à /etc/modules, utiliser la configuration ci-dessous, ou utiliser kmod (non détaillé ici).Configurez votre interface. Par exemple, ici, nous considérons la prise en compte de eth0, avec pour adresse “3ffe:ffff:1234:5::1:1”. Editez /etc/network/interfaces : - /proc/sys/net/ipv6/conf/all/autoconf - netmask 64 - # Le routeur est auto-configuré, et n'a pas d'adresse fixe. - # Il est déterminé comme par magie - # (/proc/sys/net/ipv6/conf/all/accept_ra). Sinon: - # gateway 3ffe:ffff:1234:5::1 -]]>Puis vous rebootez, ou alors vous faites juste -Et vous avez votre adresse statique. -Plus d'information - -IPv6 sur Linux Debian par Craig SmallHowTo pour Freenet6 & les utilisateurs Debian de Jean-Marc Liotier (annoncé le 24.12.2002 sur la liste de diffusion users@ipv6.org ) -<!-- anchor id="chapter-autoconfiguration" -->L'auto-configuration et la mobilité - -L'auto-configuration sans état -Est supportée et observée sur l'adresse lien-local assignée après le montage d'une interface sur laquelle IPv6 est disponible. -Exemple: - mtu 1500 qlen1000 - inet6 fe80::211:d8ff:fe6b:f0f5/64 scope link - valid_lft forever preferred_lft forever -]]> -L'auto-configuration avec état utilisant le Démon d'Annonce de Routeur -A compléter. Voir plus bas l'auto-configuration par le démon radvd (Router Advertisement Daemon). -Le Protocole de Configuration Dynamique d'Hôte version 6 (DHCPv6) -Après de longues discussions concernant les difficultés, le RFC 3315 / Dynamic Host Configuration Protocol for IPv6 (DHCPv6) a finalement vu le jour. Au moment de la mise à jour de ce passage (10/2005), il existe deux implémentations: -Dibbler par Tomasz Mrugalski <thomson chez klub point com point pl>DHCPv6 chez Sourceforge -La mobilité -A compléter. -Pour le moment, voir la page d'accueil sur la mobilité IPv6 sur Linux (MIPL) pour plus de détails. Plus d'information peut être trouvée ici (merci de signaler les liens brisés): -draft-oneill-mipv6-cao-??.txt / MIPv6 Care of Address Optiondraft-mccann-mobileip-80211fh-??.txt / Mobile IPv6 Fast Handovers for 802.11 Networksdraft-haberman-ipv6-anycast-rr-??.txt / IPv6 Anycast Binding using Return Routabilitydraft-mun-aaa-localkm-mobileipv6-??.txt / Localized Key Management for AAA in MobileIPv6draft-thubert-nemo-ro-taxonomy-??.txt / Taxonomy of Route Optimization Models in the NEMO Contextdraft-le-aaa-diameter-mobileipv6-??.txt / Diameter Mobile IPv6 Applicationdraft-wakikawa-manet-globalv6-??.txt / Global Connectivity for IPv6 Mobile Ad Hoc Networksdraft-ietf-mobileip-fast-mipv6-??.txt / Fast Handovers for Mobile IPv6draft-ietf-mobileip-ipv6-??.txt / Mobility Support in IPv6draft-ohnishi-mobileip-v6vpngateway-??.txt / Mobile IPv6 VPN using Gateway Home Agentdraft-ietf-mobileip-hmipv6-??.txt / Hierarchical MIPv6 mobility management (HMIPv6)draft-mkhalil-ipv6-fastra-??.txt / IPv6 Fast Router Advertisementdraft-okazaki-mobileip-abk-??.txt / Securing MIPv6 Binding Updates Using Address Based Keys (ABKs)draft-vriz-mobileip-hbhlmap-??.txt / Hop-by-Hop Local Mobility Agents Probing for Mobile IPv6draft-thubert-nemo-reverse-routing-header-??.txt / IPv6 Reverse Routing Header and its application to Mobile Networksdraft-ietf-mobileip-mipv6-ha-ipsec-??.txt / Using IPsec to Protect Mobile IPv6 Signaling between Mobile Nodes and Home Agentsdraft-suh-rmm-??.txt / Regional Mobile IPv6 mobility managementdraft-mccann-mobileip-ipv6mipv4-??.txt / IPv6 over Mobile IPv4draft-kempf-mobileip-fmipv6-sem-??.txt / Improving the Architectural Alignment for FMIPv6draft-le-aaa-mipv6-requirements-??.txt / Mobile IPv6 Authentication, Authorization, and Accounting Requirementsdraft-hwang-rohc-mipv6-??.txt / RObust Header Compression (ROHC): A Compression Profile for Mobile IPv6LANCASTER MOBILE IPv6 PACKAGETestbed for MIND project on IPv6Mobile IPv6 Issue List -<!-- anchor id="chapter-firewalling-security" -->Mettre en place le pare-feu -Mettre en place un pare-feu IPv6 est très important, tout spécialement si IPv6 est utilisé sur un intranet avec des adresses IPv6 globales. Car, à la différence des réseaux IPv4 où les hôtes internes courants sont protégés par l'usage d'adresses IPv4 privées comme défini par le RFC 1918 / Address Allocation for Private Internets ou l'adressage IP privée automatique (Automatic Private IP Addressing, ou APIPA) recherche Google "Microsoft + APIPA", en IPv6, les adresses globales sont normalement utilisées, et quelqu'un possédant une connectivité IPv6 peut atteindre tous les noeuds propres à un intranet disposant d'IPv6. -<!-- anchor id="firewalling-netfilter6." -->Mettre en place un pare-feu grâce à netfilter -La mise en place d'un pare-feu IPv6 est nativement supportée par les noyaux dont la version est supérieure à 2.4. Avec les anciennes versions inférieures à 2.2, vous pouvez seulement filtrer IPv6-in-IPv4 par le protocole 41. -Attention: il n'y a aucune garantie que les règles décrites ou les exemples fournis puissent protéger votre système! -Faites un audit de votre jeu de règles après son installation, voir l'audit de sécurité sur IPv6 pour en savoir plus. -Notez aussi que le projet USAGI finalise actuellement son travail sur la traque de connexion pour IPv6! Cela rendra la création de jeu de règles plus simple et plus sûre à l'avenir! -Plus d'information - -Le projet Netfiltermaillist archive of netfilter usersmaillist archive of netfilter developersInformation non officielle concernant l'état de netfilter -Préparation - -Récupérer les sources -Récupérez les dernières sources du noyau: http://www.kernel.org/ -Récupérez le dernier paquetage d'iptables: -Les sources en archive tar (pour patcher le noyau): http://www.netfilter.org/Les sources en RPM pour reconstruire les binaires (pour les systèmes RedHat): ftp://ftp.redhat.com/redhat/linux/rawhide/SRPMS/SRPMS/ ou peut-être encore dans http://www.netcore.fi/pekkas/linux/ipv6/ -Extraire les sources -Déplacez-vous dans le répertoire des sources: -Décompactez et renommez les sources du noyau -Décompactez les sources d'iptables - -Appliquer les derniers patchs relatifs à iptables/IPv6 aux sources du noyau -Déplacez-vous dans le répertoire iptables -Appliquez les patchs en attente -Appliquez les patchs additionnels relatifs à IPv6 (pas encore inclus dans le noyau vanille) -Répondez par l'affirmative aux options suivantes (iptables-1.2.2) -ah-esp.patch masq-dynaddr.patch (nécessaire seulement sur les systèmes ayant une adresse IP dynamique à la connexion au WAN, comme pour PPP ou PPPoE) ipv6-agr.patch.ipv6 ipv6-ports.patch.ipv6 LOG.patch.ipv6 REJECT.patch.ipv6 Vérifier la présence des extensions IPv6 - -Configurer, construire et installer un nouveau noyau -Déplacez-vous dans les sources du noyau -Editez Makefile -Lancez configure, avec IPv6 de disponible -Configurez aussi tout ce qui concerne votre système -Compilez et installez: voir ici même la section noyau et autres HOWTO -Reconstruire et installer les binaires d'iptables -Assurez-vous que l'arborescence des sources du noyau existe aussi dans /usr/src/linux/ -Renommez l'ancien répertoire -Créez un nouveau lien symbolique -Reconstruisez le SRPM -Installez les nouveaux paquetages iptables (iptables + iptables-ipv6) -Sur les systèmes RH 7.1, normalement, une ancienne version est installée, en conséquence utiliser "freshen" - -Si elle n'était pas installée, utiliser "install" - -Sur les systèmes RH 6.2, normalement, aucun noyau 2.4.x n'est installé, conséquemment les pré-requis ne correspondent pas. Utiliser "--nodeps" pour l'installer -Il sera peut-être nécessaire de créer un lien symbolique vers le lieu où les bibliothèques iptables sont - -Utilisation - -Vérifier le support -Chargez le module, s'il est compilé -Vérifiez si le noyau courant prend en charge iptables - -Apprendre à utiliser ip6tables - -Lister toutes les entrées netfilter IPv6 - -de façon abrégée - -de façon détaillée - -Lister un filtre spécifique - - -Insérer une règle de journal au filtre entrant, avec des options - - -Insérer une règle de destruction (<emphasis>drop rule</emphasis>) au filtre entrant - - -Détruire une règle par son numéro - - -Autoriser ICMPv6 -Avec les plus anciens noyaux (noyau non patché 2.4.5 et iptables-1.2.2), aucun type ne peut être spécifié -Accepter le trafic ICMPv6 entrant dans les tunnels - -Autoriser le trafic ICMPv6 sortant des tunnels -Les nouveaux noyaux permettent de spécifier les types ICMPv6: - -La limitation du débit -Il peut arriver (l'auteur l'a déjà vu) qu'un engorgement ICMPv6 se produise, c'est pourquoi vous devriez utiliser la limitation de débit, puisqu'elle est disponible, et ce, au moins pour le jeu de règles ICMPv6. De plus, des règles de journalisation devraient aussi être mises en place pour garder trace d'attaques DoS, grâce à syslog et au stockage des fichiers de log. Un exemple de limitation du débit ICMPv6 ressemble à ceci: - -Permettre le trafic entrant SSH -Ici l'exemple montré est un jeu de règles permettant les connexions entrantes SSH par une adresse IPv6 donnée -Autoriser le trafic entrant SSH provenant de 3ffe:ffff:100::1/128 - -Autoriser les paquets réponse (pour le moment, la traque du trafic IPv6 n'est pas au coeur de l'implémentation de netfilter) - -Rendre disponible le trafic tunnelé IPv6-in-IPv4 -Pour accepter les paquets tunnelés IPv6-in-IPv4, vous devez insérer des règles dans votre installation de pare-feu IPv4 relatives à de tels paquets, pour exemple -Accepter le trafic entrant IPv6-in-IPv4 sur l'interface ppp0 - -Permettre au trafic IPv6-in-IPv4 de sortir par l'interface ppp0 -Si vous avez seulement un tunnel statique, vous pouvez aussi spécifier l'adresse IPv4, comme ici -Accepter le trafic entrant IPv6-in-IPv4 sur l'interface ppp0 et provenant de l'extrémité du tunnel 1.2.3.4 - -Autoriser le trafic sortant IPv6-in-IPv4 vers l'interface ppp0 pour l'extrémité du tunnel 1.2.3.4 - -Protection contre les requêtes de connexion entrante TCP -TRÈS RECOMMANDÉ! Pour des questions de sécurité, vous devriez vraiment insérer une règle qui bloque les requêtes de connexion TCP entrante. Ajouter l'option "-i", si d'autres noms d'interface sont utilisés! -Bloquer les requêtes de connexion entrante TCP vers cet hôte - -Bloquer les requêtes de connexion entrante TCP allant vers les hôtes placés derrière ce routeur -Peut-être ces règles doivent-elles être placées sous d'autres, mais ça, c'est votre travail. La meilleure façon de faire est de créer un script et d'exécuter les règles d'une manière spécifique. -Protection contre les requêtes de connexion entrante UDP -TRÈS RECOMMANDÉ AUSSI! Comme il a été dit dans la section concernant la mise en place d'un pare-feu, il est possible de contrôler les ports des sessions sortantes UDP/TCP. Si tous vos systèmes IPv6 locaux utilisent les ports locaux, par exemple de 32768 à 60999, vous êtes aussi capables de filtrer les connexions UDP (jusqu'à ce que la traque des connexions fonctionnent) comme suit: -Bloquer les paquets entrants UDP qui ne peuvent être des réponses de requêtes sortantes de cet hôte - -Bloquer les paquets entrants UDP qui ne peuvent être des réponses de requêtes d'hôtes placés derrière ce routeur, et transitant à travers lui - -Un exemple plus conséquent -Les lignes qui suivent montrent en exemple une installation plus sophistiquée. Bonne création de jeux de règles netfilter6... - -<!-- anchor id="chapter-security" -->La sécurité - -La sécurité d'un noeud -Il est très recommandé d'appliquer tous les patchs disponibles, de rendre indisponibles tous les services inutiles, d'associer les services nécessaires aux adresses IPv4/IPv6 et d'installer un pare-feu local. -A remplir plus avant... -Les limitations d'accès -De nombreux services utilisent la bibliothèque tcp_wrapper pour contrôler l'accès. Plus bas est décrite l'utilisation de tcp_wrapper. -A remplir plus avant... -<!-- anchor id="IPv6-security-auditing" -->L'audit de sécurité IPv6 -Actuellement, il n'existe pas d'outil véritablement adéquate aux questions de sécurité IPv6 et capable de vérifier un système monté sur le réseau. Ni Nessus ni aucun autre scanner de sécurité provenant du commerce n'est capable, autant que je sache, de scanner les adresses IPv6. -Question d'ordre légal -ATTENTION: Prenez bien garde d'uniquement scanner vos propres systèmes, ou alors seulement après avoir reçu une autorisation écrite, sinon des problèmes d'ordre juridique risquent de vous arriver. -VERIFIER A DEUX FOIS les adresses IPv6 avant de lancer un scan. -Audit de sécurité par l'emploi de netcat disposant d'IPv6 -Avec netcat disposant d'IPv6 (voir IPv6+Linux-status-apps/security-auditing pour en savoir plus), vous pouvez lancer un scan de ports via un script qui balaiera un intervalle de ports, captera des bannières, etc. Un exemple d'utilisation: - -Audit de sécurité par l'emploi de nmap disposant d'IPv6 -NMap, l'un des meilleurs scanners de ports à travers le monde, supporte IPv6 depuis la version 3.10ALPHA1. Un exemple d'utilisation: - -Audit de sécurité par l'emploi de strobe disposant d'IPv6 -Strobe est (comparé à NMap) un scanner de ports pour les petits budgets, mais il y a un patch disponible pour le rendre prêt pour IPv6 (voir IPv6+Linux-status-apps/security-auditing pour plus d'information). Un exemple d'utilisation: -. -::1 2401 unassigned unknown -::1 22 ssh Secure Shell - RSA encrypted rsh -::1 515 printer spooler (lpd) -::1 6010 unassigned unknown -::1 53 domain Domain Name Server -]]>Note: strobe n'est plus véritablement en développement, le numéro de version montré n'est pas le bon. -Le résultat de l'audit -Si le résultat de l'audit ne correspond pas à votre politique de sécurité IPv6, mettez en place le pare-feu IPv6 pour combler les trous de sécurité, par exemple en utilisant netfilter6 (voir Mettre en place un pare-feu grâce à Netfilter6 pour plus de détails). -Info: une information plus détaillée concernant la sécurité IPv6 peut être trouvée ici: -Firewalling Considerations for IPv6 / draft-savola-v6ops-firewalling-??.txtIPv6 Neighbour Discovery trust models and threatsSecurity Considerations for 6to4Access Control Prefix Router Advertisement Option for IPv6Requirements for Plug and Play IPsec for IPv6 applicationsSecurity of IPv6 Routing Header and Home Address Options -<!-- anchor id="chapter-encryption-authentication" -->L'encryptage et l'authentification -A la différence d'IPv4, l'encryptage et l'authentification sont des fonctionnalités que ne fournit pas IPv6 lui-même. Elles sont normalement implémentées par l'utilisation d'IPsec (qui peut également être employé par IPv4). -Les modes d'emploi de l'encryptage et de l'authentification -Deux modes d'encryptage et d'authentification sont possibles: -Le mode transport -Le mode transport est un mode de connexion réellement de bout-en-bout. Ici, seule la charge utile (généralement ICMP, TCP ou UDP) est encryptée avec son en-tête particulier, tandis que l'en-tête IP n'est pas encrypté (mais couramment inclus dans l'authentification). -Utilisant AES-128 pour l'encryptage et SHA1 pour l'authentification, ce mode diminue la MTU de 42 octets. -Le mode tunnel -Le mode tunnel peut être utilisé soit dans un mode de connexion de bout-en-bout soit dans un mode de connexion de passerelle-à-passerelle. Ici, le paquet IP complet est encrypté et prend un nouvel en-tête IP, le tout constituant un nouveau paquet (ce mécanisme étant connu sous le nom d'encapsulation). -Cependant, à cause de l'indépendance de l'encryptage et de l'authentification à l'égard du protocole d'échange de clés, il existe actuellement des problèmes d'interopérabilité. Ce mode diminue actuellement de 40 octets par rapport au mode transport. Utiliser AES-128 pour l'encryptage et SHA1 pour l'authentification diminue donc au total de 82 octets la MTU courante. -Son support dans le noyau (ESP et AH) - -Son support dans les noyaux Linux vanille 2.4.x -Manquant à ce jour jusqu'au noyau 2.4.28 vanille, le problème était de garder les sources du noyau Linux éloignées des questions de contrôles légaux d'import/export concernant le code d'encryptage en général. C'est une des raisons pour lesquelles le projet FreeS/WAN (IPsec pour IPv4 seulement) n'était pas compris dans les sources vanille. Un rétro-portage à partir de 2.6.x sera peut-être réalisé un jour. -Son support dans les noyaux Linux vanille 2.6.x -Les versions actuelles (2.6.9 et supérieures, au moment de la rédaction) supportent nativement IPsec pour IPv4 et IPv6. -Le projet USAGI a aidé à l'implémentation. -Echange automatique de clés (IKE) -IPsec requière un échange de clés afin de partager un secret. Ceci est essentiellement réalisé de façon automatisée par les démons IKE. Ils prennent également en charge l'authentification des entités en présence, soit par un secret commun (nommé “secret pré-partagé”), soit par clés RSA (qui peuvent provenir de certificats X.509). -Actuellement, deux démons IKE sont disponibles pour Linux, lesquels différent totalement par la configuration et l'emploi. -Je préfère “pluto” à l'implémentation *S/WAN à cause de son installation plus simple et à son unique fichier de configuration. -Le démon IKE “racoon” -Le démon IKE “racoon” provient du projet KAME et a été porté sur Linux. Les distributions contemporaines de Linux comportent ce démon dans le paquetage “ipsec-tools”. Deux exécutables sont requis pour bien installer IPsec. Jetez aussi un oeil à Linux Advanced Routing & Traffic Control HOWTO / IPSEC. -Manipulation de la base de données IPsec SA/SP grâce à l'outil “setkey” -Le rôle important de “setkey” est de définir la politique de sécurité (SP, security policy) pour le noyau. -Fichier: /etc/racoon/setkey.sh -Exemple d'une connexion encryptée de boute-en-bout en mode transport - -Exemple d'une connexion encryptée de boute-en-bout en mode tunnel -Pour l'autre machine, vous avez juste à échanger “in” et “out”. -La configuration du démon IKE “racoon” -Pour sa bonne exécution, “racoon” requière d'être configuré. Ceci inclus les réglages relatifs à la politique de sécurité, qui doit être précédemment mise en place grâce à “setkey”. -Fichier: /etc/racoon/racoon.conf -Fixez aussi un secret pré-partagé: -Fichier: /etc/racoon/psk.txt - -Démarrer IPsec grâce au démon IKE “racoon” -Il faut pour le moins que le démon soit démarré. Au premier démarrage, utiliser les modes déboguage et premier plan (debug and foreground). L'exemple suivant montre une négociation IKE réussie dans ses phases 1 (ISAKMP-SA, Internet Security Association Key Management Security Association) and 2 (IPsec-SA, IPsec Security Association): -2001:db8:2:2::2[500] -2005-01-01 20:31:06: INFO: begin Identity Protection mode. -2005-01-01 20:31:09: INFO: ISAKMP-SA established -¬ 2001:db8:1:1::1[500]-2001:db8:2:2::2[500] spi:da3d3693289c9698:ac039a402b2db401 -2005-01-01 20:31:09: INFO: initiate new phase 2 negotiation: -¬ 2001:6f8:900:94::2[0]<=>2001:db8:2:2::2[0] -2005-01-01 20:31:10: INFO: IPsec-SA established: -¬ ESP/Tunnel 2001:db8:2:2::2->2001:db8:1:1::1 spi=253935531(0xf22bfab) -2005-01-01 20:31:10: INFO: IPsec-SA established: -¬ ESP/Tunnel 2001:db8:1:1::1->2001:db8:2:2::2 spi=175002564(0xa6e53c4) -]]>Chaque direction a sa propre IPsec-SA (comme définie dans le standard IPsec). Avec “tcpdump” à l'écoute de la bonne interface, vous devriez voir comme résultat d'un ping IPv6: - 2001:db8:2:2::2: ESP(spi=0x0a6e53c4,seq=0x3) -20:35:55.537522 2001:db8:2:2::2 > 2001:db8:1:1::1: ESP(spi=0x0f22bfab,seq=0x3) -]]>Comme prévu, les SPI (Security Parameter Index) négociés sont utilisés ici. -Et en utilisant “setkey”, les paramètres actifs courants: - -Le démon IKE “pluto” -Le démon IKE “pluto” est inclus dans les distributions des projets *S/WAN, qui ont pour origine FreeS/WAN. Le développement du projet FreeS/WAN a malheureusement été stoppé en 2004. A cause de la lenteur du développement dans le passé, deux projets en découlèrent: strongSwan et Openswan. Aujourd'hui, des paquetages d'installation sont disponibles, au moins pour Openswan (inclus dans Fedora Core 3). -Une différence importante par rapport à “racoon”, un seul et unique fichier de configuration est requis. Il y a bien sûr un script d'initialisation qui automatise le lancement au démarrage de la machine. -La configuration du démon IKE “pluto” -La configuration est très similaire à celle nécessaire pour IPv4, à part une importante et nécessaire option. -Fichier: /etc/ipsec.conf -N'oubliez pas ici également de définir un secret pré-partagé. -Fichier: /etc/ipsec.secrets - -Démarrer IPsec grâce au démon IKE “pluto” -Si l'installation d'Openswan s'est achevée avec succès, un script d'initialisation doit exister permettant le démarrage d'IPsec, lancez simplement (sur chaque machine) par: -Ensuite, démarrez une connexion sur l'une des machines. Si vous pouvez voir la ligne “IPsec SA established”, c'est que tout fonctionne parfaitement. -0xa98b7710 <0xa51e1f22} -]]>Parce que *S/WAN et setkey/racoon sont basés sur la même implémentation d'IPsec dans les noyaux 2.6.x,“setkey” peut être utilisé pour afficher les paramètres actifs courants: - -Informations complémentaires -Pour les noyaux Linux 2.6.x, vous pouvez également obtenir la politique et l'état d'IPsec en utilisant “ip”: - -<!-- anchor id="chapter-qos" -->La Qualité de Service (QoS) -IPv6 supporte QoS par l'utilisation des labels de flux et des classes de trafic. Ceci peut être contrôlé en utilisant “tc” (compris dans le paquetage “iproute”). -Information complémentaire: -RFC 3697 / IPv6 Flow Label SpecificationA remplir plus avant... -<!-- anchor id="chapter-hints-daemons" -->Eléments d'installation des démons prêts pour IPv6 -Ici quelques éléments d'installation des démons prêts pour IPv6 sont exposés. -<!-- anchor id="hints-daemons-bind" -->Le Démon de Nom Internet Berkeley (named) -IPv6 est supporté depuis la version 9. Utilisez toujours la dernière version disponible. Il faut au moins utiliser la version 9, les versions plus anciennes peuvent contenir des trous de sécurité exploitables à distance. -A l'écoute des adresses IPv6 -Note: à la différence d'IPv4, les versions actuelles ne permettent pas d'associer une socket de serveur à des adresses IPv6 données, par conséquent, seule l'alternative toutes ou aucune adresse(s) IPv6 est valide. Parce que cela peut poser un problème de sécurité, consultez aussi plus bas la section concernant la liste de contrôle d'accès (ACL)! -Rendre disponible l'écoute sur adresse IPv6 -Pour rendre disponible à named l'écoute IPv6, les options suivantes demandent à être modifiées -Il doit en résulter après redémarrage -Un test simple ressemble à -et doit vous afficher un résultat. -Rendre indisponible l'écoute sur adresse IPv6 -Pour rendre indisponible l'écoute IPv6, l'option suivante demande à être modifiée - -Les Listes de Contrôle d'Accès IPv6 (ACL) -Les ACL IPv6 sont disponibles et devraient être utilisées dès que possible. Un exemple ressemble à ce qui suit: -Ces ACL peuvent être utilisées par exemple pour les requêtes des clients ou pour le transfert de zones aux serveurs de noms de domaine secondaires. Ceci prévient aussi contre l'utilisation de votre serveur cache de noms de domaine à partir de l'extérieur grâce à IPv6. -Il est aussi possible de positionner les options allow-query et allow-transfer pour la plupart des définitions par fichier de zone. -Emettre des requêtes avec une adresse IPv6 dédiée -Cette option n'est pas requise, mais peut être nécessaire: - port ; -]]> -Adresses IPv6 dédiées définies par zone -Il est aussi possible de définir des adresses IPv6 par zone. -Adresse de la source de transfert -L'adresse de la source de transfert est utilisée pour aller chercher les zones transférées: - [port port]; -]]> -Adresse de la source à notifier -L'adresse de la source à notifier est utilisée pour les messages de notification: - [port port]; -]]> -Des exemples de fichiers de zone DNS IPv6 -Des informations peuvent être aussi trouvées dans cet article concernant l'information d'installation d'un DNS IPv6. Le constructeur de zone inverse IPv6 pour BIND 8/9 (outil web) peut aussi être d'une aide précieuse. -Servir des données DNS relatives à IPv6 -Pour IPv6, de nouveaux types et la zone racine nécessaire à la recherche inversée sont définis: -AAAA et IP6.INT inversée: specifiés dans le RFC 1886 / DNS Extensions to support IP version 6, utilisés depuis BIND version 4.9.6A6, DNAME (DORÉNAVANT DÉPRECIÉ!) et IP6.ARPA inversé: spécifiés dans leRFC 2874 / DNS Extensions to Support IPv6 Address Aggregation and Renumbering, utilisable depuis BIND 9, mais vous pouvez trouver de l'information sur l'état actuel dans draft-ietf-dnsext-ipv6-addresses-00.txtPeut-être complété plus tard, pour le moment, jetez un coup d'oeil aux RFC fournis et -AAAA et IP6.INT inversé: l'installation d'un DNS IPv6A6, DNAME (DORÉNAVANT DÉPRECIÉ!) et IP6.ARPA inversé: jetez un coup d'oeil aux chapitres 4 et 6 du manuel de référence de l'administrateur BIND 9 (ARM), distributé avec le paquetage bind, ou bien récupérez-le : BIND version 9 ARM (PDF)Parce que IP6.INT est déprécié (mais encore en usage), un serveur DNS qui supportera l'information IPv6 aura à servir tous les types de zones inversées. -La meilleure pratique courante -Parce qu'il y a encore quelques problèmes qui existent lorsque les nouveaux formats sont utilisés, la meilleure pratique courante est: -Support de recherche: -AAAALa recherche inversée supporte: -Le format réduit inversé (reverse nibble format) pour la zone ip6.int (POUR LA COMPATIBILITÉ ASCENDANTE)Le format réduit inversé (reverse nibble format) pour la zone ip6.arpa (RECOMMANDÉ) -Vérifier la connectivité IPv6 -Pour vérifier si BIND est à l'écoute sur une socket IPv6 et sert des données, voir les exemples suivants. -Connecté <emphasis>via</emphasis> IPv6, mais refusé par les ACL -En spécifiant un serveur pour les requêtes, une connexion IPv6 peut être forcée: -L'entrée relative dans le journal ressemble à ce qui suit: -Si vous observez de telles entrées dans le journal, vérifiez si les requêtes provenant de ce client doivent être autorisées, pour revoir, si nécessaire, votre configuration ACL. -Une connexion IPv6 réussie -Une connexion IPv6 réussie ressemble à ce qui suit: - -<!-- anchor id="hints-daemons-xinetd" -->Le super démon Internet (xinetd) -IPv6 est supporté, approximativement, depuis la version 1.8.9 de xinetd. Utilisez toujours la version disponible la plus récente. Seules les versions antérieures à la version 2.3.3 doivent être utilisées, les versions plus anciennes peuvent contenir des trous de sécurité exploitables à distance. -Certaines distributions Linux contiennent un paquetage supplémentaire pour xinetd prêt pour IPv6, d'autres démarrent xinetd prêt pour IPv6 si la variable suivante est positionnée: NETWORKING_IPV6="yes", chose normalement réalisée par /etc/sysconfig/network (valide uniquement pour la distribution Red Hat et ses dérivées). Dans les nouvelles livraisons des distributions, un binaire supporte à la fois IPv4 et IPv6. -Si vous rendez disponible un service fourni avec xinetd, comme par exemple daytime, en modifiant la configuration dans le fichier /etc/xinetd.d/daytime comme suit -vous devriez recevoir, après le redémarrage de xinetd, une réponse positive telle que: -L'exemple montre aussi que xinetd écoute pour IMAP et IMAP-SSL sur IPv4 seulement. -Note: un serveur xinetd uniquement IPv4 ne démarrera pas sur un noeud disposant d'IPv6 et inversement, un serveur xinetd IPv6 ne démarrera pas sur un noeud uniquement IPv4. Ce problème est réputé réglé dans les versions postérieures, au moins à partir de la version 2.3.11. -<!-- anchor id="hints-daemons-apache2." -->Le serveur web Apache2 (httpd2) -Le serveur web Apache supporte nativement IPv6 depuis la version 2.0.14. Des patchs disponibles pour l'ancienne série 1.3.x ne sont pas courants et ne devraient pas être employés dans un contexte public, mais ils sont disponibles sur ce serveur ftp, KAME / Misc. -A l'écoute sur les adresses IPv6 -Note: Les hôtes virtuels sur adresses IPv6 ne fonctionnent pas pour les versions inférieures à la 2.0.28 (un patch est disponible pour la 2.0.28). Mais en tout premier lieu, récupérez toujours la dernière version disponible, parce que les premières versions ont des problèmes de sécurité. -Un hôte virtuel écoute sur une adresse IPv6 uniquement - - - ServerName ipv6seul.votredomaine.votretld - # certainement des lignes de configuration en plus... - -]]> -Un hôte virtuel écoute sur une adresse IPv6 et sur une adresse IPv4 - - - ServerName ipv6etipv4.votredomaine.votretld - # certainement des lignes de configuration en plus... - -]]>Il devrait en résulter après redémarrage -Pour de simples tests, utiliser l'exemple telnet déjà montré. -Note additionnelle - -D'une part, Apache2 supporte une méthode appelée “sendfile”, accélérant la fourniture des données. D'autre part, certains pilotes de NIC supportent la vérification différée des sommes de contrôle (offline checksumming). Dans certains cas, cela peut conduire à des problèmes de connexion et invalider les sommes de contrôle TCP. Il faut alors rendre indisponible “sendfile”, ou bien en recompilant par l'utilisation de l'option de configure “--without-sendfile”, ou bien en utilisant la directive du fichier de configuration "EnableSendfile off". -<!-- anchor id="hints-daemons-radvd" -->Le Démon d'Annonce de Routeur (radvd) -Le Démon d'Annonce de Routeur est très utile sur un LAN, à partir du moment où les clients doivent être auto-configurés. Le démon lui-même doit tourner sur la passerelle par défaut IPv6 Linux (il n'est pas requis qu'elle soit aussi la passerelle IPv4, aussi prenez garde à qui émet des annonces de routeur sur votre LAN). -Vous avez à spécifier certaines informations et drapeaux qui doivent être compris dans l'annonce. Les plus employés sont -Le préfixe (nécessaire)La durée de vie du préfixeLa fréquence des envois d'annonce (optionnelle)Après une configuration convenable, le démon émet des annonces au travers des interfaces spécifiées, dans l'espoir que les clients les reçoivent et auto-configurent comme par magie leurs adresses avec le préfixe reçu et le routeur par défaut. -Configurer radvd - -Configuration simple -Le fichier de configuration de radvd est généralement /etc/radvd.conf. Un exemple simple ressemble à ce qui suit: -Ce qui a pour résultat côté client - mtu 1500 qdisc pfifo_fast qlen 100 - inet6 3ffe:ffff:100:f101:2e0:12ff:fe34:1234/64 scope global dynamic - valid_lft 2591992sec preferred_lft 604792sec - inet6 fe80::2e0:12ff:fe34:1234/10 scope link -]]>Parce qu'aucune limite de vie n'a été définie, une très grande valeur est utilisée. -Configuration spéciale 6to4 -Les versions à partir de la 0.6.2pl3 supportent la (ré)génération des préfixes dépendant d'une adresse IPv4 propre à une interface spécifique. Ceci peut être utilisé afin de distribuer les annonces dans un LAN après que le tunnelage 6to4 ait changé. Surtout employé derrière un routeur de connexion dynamique à la demande (dial-on-demand). Avec l'assurance d'un temps de vie très bref pour un tel préfixe (après chaque reconnexion, dial-up, un autre préfixe est valide), la durée de vie est configurée aux valeurs minimales: -Il en résulte pour le client situé à l'intérieur (en considérant que ppp0 a actuellement 1.2.3.4 comme adresse IPv4 locale): - mtu 1500 qdisc pfifo_fast qlen 100 - inet6 2002:0102:0304:f101:2e0:12ff:fe34:1234/64 scope global dynamic - valid_lft 22sec preferred_lft 12sec - inet6 fe80::2e0:12ff:fe34:1234/10 scope link -]]>Parce qu'un bref temps de vie a été défini, un tel préfixe sera rapidement jeté si aucune annonce s'y rapportant n'est reçue. -Note additionnelle: si vous n'utilisez pas de support spécifique 6to4 dans les scripts d'initialisation, vous avez à mettre en place une route spécifique sur l'interface interne du routeur, sinon vous aurez des problèmes de routage retour. En ce qui concerne l'exemple ci-après: -Cette route a besoin d'être remplacée chaque fois que le préfixe change, ce qui est le cas à chaque fois qu'une nouvelle adresse IPv4 est assignée à une interface numérotée automatiquement (dial-up interface). -Le déboguage -Un programme appelé “radvdump” peut vous aider à observer les annonces émises ou reçues. Simple à utiliser: -Cette sortie vous montre que chaque paquetage d'annonce se présente dans un format lisible. Vous devriez voir à nouveau ici vos valeurs configurées, sinon, ce n'est peut-être pas votre radvd qui émet l'annonce... vérifiez s'il n'y a pas un autre routeur sur le lien (pour traquer ce routeur, prenez l'adresse LL, AdvSourceLLAddress, qui est son adresse MAC). -<!-- anchor id="hints-daemons-dhcpv6." --> Le serveur de Configuration Dynamique d'Hôte v6 (dhcp6s) -DHCPv6 peut être utilisé pour réaliser des configurations avec état. Le démon par lui-même n'a pas nécessairement à tourner sur la passerelle routeur Linux par défaut. -Vous pouvez spécifier plus d'information qu'avec radvd. Il est plus similaire à un serveur DHCP IPv4. -Après une configuration correcte, le démon réagit lors de la réception de paquets multicast envoyés par un client à l'adresse ff02::16. -La configuration du serveur DHCPv6 (dhcp6s) - -Une configuration simple -Le fichier de configuration de dhcp6s est normalement /etc/dhcp6s.conf. Un exemple simple ressemble à ce qui suit: - -La configuration du client DHCPv6 (dhcp6c) - -Une configuration simple -Le fichier de configuration de dhcp6c est normalement /etc/dhcp6c.conf. Un exemple simple ressemble à ce qui suit: - -Usage - -dhcpv6_server -Démarrage du serveur, - -dhcpv6_client -Démarrage du client en premier plan, - -Déboguage - -dhcpv6_server -Le serveur a un drapeau pour passer en premier plan et deux pour le déboguage (tout deux devraient être utilisés pour le déboguage). Voici un exemple: - -dhcpv6_client -Le client a un drapeau pour passer en premier plan et deux pour le déboguage. Voici un exemple: -Notez que les messages d'erreur n'ont aucun impact. -<!-- anchor id="hints-daemons-tcpwrapper" -->tcp_wrapper -tcp_wrapper est une bibliothèque qui peut vous aider à protéger vos services contre les usages abusifs. -Les capacités de filtrage -Vous pouvez utiliser tcp_wrapper pour -Le filtrage à partir des adresses source (IPv4 ou IPv6)Le filtrage des utilisateurs (réclame un démon ident en état de fonctionnement sur le client) -Les programmes utilisant tcp_wrapper -Les suivants sont connus: -Chaque service appelé par xinetd (si xinetd est compilé en utilisant la bibliothèque tcp_wrapper)sshd (si compilé en utilisant tcp_wrapper) -Utilisation -tcp_wrapper est contrôlé par deux fichiers nommés /etc/hosts.allow et /etc/hosts.deny. Pour plus d'information voir - -Exemple de fichier /etc/hosts.allow -Dans ce fichier, chaque service qui doit être positivement filtré (i.e., dont les connexions doivent être acceptées) a besoin d'une ligne. -Note: ils existent des implémentations cassées qui utilisent la mauvaise description réseau IPv6 suivante: [3ffe:ffff:100:200::/64]. -Heureusement, de telles versions seront rapidement corrigées. -Exemple de fichier /etc/hosts.deny -Ce fichier contient toutes les entrées de filtre négative et devrait dénier l'accès à tout le reste en utilisant -Si ce noeud est très sensible, vous pouvez remplacer la ligne stantard ci-dessus par celle-ci, mais cela peut être cause d'attaque DoS (charge de serveur de courrier et répertoire spool), si trop de connexions sont réalisées en un temps très bref. Peut-être un observateur de journaux (a logwatch) serait-il meilleur dans de tels cas. - -La journalisation -Selon l'entrée du fichier de configuration du démon syslog /etc/syslog.conf, la journalisation de tcp_wrapper se fait normalement dans /var/log/secure. -Connexion refusée -Une connexion refusée via IPv4 au service daytime, couvert par xinetd, produit des lignes telles que celles de l'exemple suivant -Une connexion refusée via IPv4 à sshd en double écoute produit des lignes telles que celles de l'exemple suivant - -Connexion autorisée -Une connexion autorisée via IPv4 vers le service daytime, couvert par xinetd, produit des lignes telles que celles de l'exemple suivant -Une connexion autorisée via IPv4 vers sshd en double écoute produit des lignes telles que celles de l'exemple suivant - -<!-- anchor id="hints-daemons-vsftpd" -->vsftpd - -A l'écoute des adresses IPv6 -Editer le fichier de configuration, couramment /etc/vsftpd/vsftpd.conf, et ajuster l'option “listen” -C'est tout. -<!-- anchor id="hints-daemons-proftpd" --> proftpd - -A l'écoute des adresses IPv6 -Editer le fichier de configuration, couramment /etc/proftpd.conf, mais prenez garde, tout n'est pas tout à fait logique dans la mise en place des hôtes virtuels - - ... - Bind 2001:0DB8::1 - ... - -]]>C'est tout. -<!-- anchor id="hints-daemons-others" -->Autres démons -De nos jours c'est généralement simple, cherchez une ligne de commande d'option ou bien une valeur de configuration pour rendre disponible l'écoute IPv6. Cherchez dans la page du manuel du démon ou dans les FAQ concernées. Il peut arriver que vous ne puissiez lier le démon qu'à une adresse IPv6 “any” (::) et pas à une adresse IPv6 précise, par manque de support (ça dépend de la façon dont le développeur à implémenter...). -<!-- anchor id="chapter-programming-using-API" -->Programmer (en utilisant l'API) -Je n'ai aucune expérience de la programmation IPv6, peut-être que ce chapitre sera rempli par d'autres, ou déplacé vers un autre HOWTO -Plus d'information peut être trouvée ici: -RFC 2553 / Basic Socket Interface Extensions for IPv6Draft / Advanced Sockets API for IPv6 / draft-ietf-ipngwg-rfc2292bis-XY.txtPorting applications to IPv6 HowTo by Eva M. Castro -<!-- anchor id="chapter-interoperability" -->L'interopérabilité -Il y a à travers le monde quelques projets qui vérifient l'interopérabilité des différents systèmes d'exploitation vis-à-vis de l'implémentation des fonctionnalités d'IPv6: Voici un URL: -Le projet TAHID'autres arriveront prochainement... -<!-- anchor id="chapter-information" -->Plus d'information et d'URL - -<!-- anchor id="information-books" -->Livres en édition papier, articles, revues en ligne (mélangés) - -Livres édités (en anglais) - -Cisco - -Cisco Self-Study: Implementing IPv6 Networks (IPV6), par Regis Desmeules. Cisco Press; ISBN 1587050862; 500 pages; 1ère édition (11 avril 11 2003). -Note: cet ouvrage sera publié le 11 avril 2003.Configuring IPv6 with Cisco IOS, par Sam Brown, Sam Browne, Neal Chen, Robbie Harrell, Edgar, Jr. Parenti (Editeur), Eric Knipp (Editeur), Paul Fong (Editeur) 362 pages; Syngress Media Inc; ISBN 1928994849; (12 juillet 2002). -Généraux - -IPv6 Essentials par Silvia Hagen, juillet 2002, O'Reilly, référence pour la commande: 1258, ISBN 0-5960-0125-8, 352 pages. -Table des matières, index, exemple de chapitre, etc.; Les derniers livres sortis chez O'ReillyIPv6: The New Internet Protocol. Par Christian Huitema; Publié chez Prentice-Hall; ISBN 0138505055. -Description: Ce livre, écrit par Christian Huitema - membre du Comité Architecture Internet (Internet Architecture Board, ou IAB), offre une excellente description d'IPv6, de ses différences d'avec IPv4, du comment et du pourquoi de son développement. -Source: http://www.cs.uu.nl/wais/html/na-dir/internet/tcp-ip/resource-list.htmlIPv6 Networks par Niles, Kitty; (ISBN 0070248079); 550 pages; Date de publication 05/01/1998.Implementing IPV6. Supporting the Next Generation Internet Protocols par P. E. Miller, Mark A. Miller; éd. John Wiley & Sons; ISBN 0764545892; 2ème édition (15 mars 2000); 402 pages.Big Book of Ipv6 Addressing Rfcs par Peter H. Salus (compilateur), Morgan Kaufmann Publishers, avril 2000, 450 pages, ISBN 0126167702. Understanding IPV6 par Davies, Joseph; ISBN 0735612455; Date de publication 01/05/2001; 350 pages. -Understanding IPV6 par Davies, Joseph; ISBN 0735612455; Date de publication 11/13/2002; 544 pages. Migrating to IPv6 - IPv6 in Practice. par Marc Blanchet; éd. John Wiley & Sons; ISBN 0471498920; 1ère édition (novembre 2002); 368 pages.Ipv6 Network Programming par Jun-ichiro Hagino; ISBN 1555583180 Wireless boosting IPv6 par Carolyn Duffy Marsan, 23/10/2000.la recherche avec le mot clé IPv6 sur O'reilly réseau donne 29 résultats (au 28 Janvier 2002). -Livres édités (en allemand) - -Technik der IP-Netze (TCP/IP incl. IPv6) bei Amazon.de -Anatol Badach, Erwin Hoffmann -Carl Hanser Verlag München, Wien, 2001 ISBN 3-446-21501-8 -Kap. 6: Protokoll IPv6 S.205-242 -Kap. 7: Plug&Play-Unterstützung bei IPv6 S.243-276 -Kap. 8: Migration zum IPv6-Einsatz S.277-294 -Kap. 9.3.4: RIP für das Protokoll IPv6 (RIPng) S.349-351 -Kap. 9.4.6: OSPF für IPv6 S.384-385 -Kommentar: tw. nicht ganz up-to-date bzw. nicht ganz fehlerfreie Abbildungen -Homepage des Buches und Tabelle mit FixesInternet-Sicherheit (Browser, Firewalls und Verschlüsselung) bei Amazon.de -Kai Fuhrberg -2. akt. Auflage 2000 Carl Hanser Verlag München, Wien, ISBN 3-446-21333-3 -Kap.2.3.1.4. IPv6 S.18-22 -Kurz angerissen werden: RFC 1825 - Security Association Konzept RFC1826 - IP authentication Header RFC 1827 - IP Encapsulation Security PayloadIPv6. Das neue Internet- Protokoll. Technik, Anwendung, Migration bei Amazon -Hans Peter Dittler -2. akt. und erweiterte Auflage 2002 dpunkt.verlag, ISBN 3-89864-149-XDas neue Internetprotokoll IPv6 bei Amazon -Herbert Wiese -2002 Carl Hanser Verlag, ISBN 3446216855 -Articles, livres électroniques, revues en ligne (mélangés) - -Getting Connected with 6to4 par Huber Feyrer, 01/06/2001Transient Addressing for Related Processes: Improved Firewalling by Using IPv6 and Multiple Addresses per Host; écrit par Peter M. Gleiz, Steven M. Bellovin (version PDF pour PC; version PDF pour Palm; version PDB)IPv6, théorie et pratique (en français) 3ème édition, mars 2002, O'Reilly, ISBN 2-84177-139-3IPSec (en langue française)Internetworking IPv6 with Cisco Routers par Silvano Gai, McGrawHill Italia, 1997. Le chapitre 13 et les appendices A-D sont téléchargables au format PDF.Secure and Dynamic Tunnel Broker par Vegar Skaerven Wang, thèse de maîtrise en sciences informatiques, 2 Juin 2000, Faculté des Sciences, Département des sciences informatiques, Université de Tromso, Norvège.Aufbruch in die neue Welt - IPv6 in IPv4 Netzen par Dipl.Ing. Ralf Döring, TU Illmenau, 1999Migration and Co-existence of IPv4 and IPv6 in Residential Networks par Pekka Savola, CSC/FUNET, 2002 -<!-- anchor id="information-sciencepublication" -->Publications scientifiques (résumés, bibliographies, ressources en ligne) - -Plan de travail du projet IPv6 GEANTA simulation study on the performance of Mobile IPv6 in a WLAN-based cellular network, par Perez Costa X.; Hartenstein H. -- Computer Networks, Septembre 2002, vol. 40, no. 1, pp. 191-204(14) -- Elsevier Science.Tests IPv6 sur le réseau universitaire britannique: Projet Bermudes 2 Août 2002: Participants - Se connecter - Project deliverables - Network topology - adresse assignments - Wireless IPv6 access - IPv6 migration - Project presentations - Internet 2 - Other IPv6 projects - IPv6 fora and standards Bermuda 2...http://www.ipv6.ac.uk/A scalable parallel internet router that enables the QoS through merging ATM with IPv6. par Song S. -- Computer Communications, 1 mai 2002, vol. 25, no. 7, pp. 647-651(5) -- Elsevier Science.Linux IPv6: Which One to Deploy? journal Linux, Vol. 96, p. 86, 88-90, April 2002. (pour plus d'information, voir aussiliinwww.ira.uka.de/ipv6 )An overview and analysis of mobile Internet protocols in cellular environments. Chao H-C. -- Internet Research: Electronic Networking Applications and Policy, 24 Octobre 2001, vol. 11, no. 5, pp. 435-450(16) -- MCB University PressIPv6 for Future Wireless networksToftegaard Nielsen T. -- Wireless Personal Communications, Juin 2001, vol. 17, no. 2/3, pp. 237-247(11) -- éd. Kluwer Academic, Dordrecht, Les Pays-BasIPv6 at the University of SouthamptonSeamless Support for Mobile Internet Protocol Based Cellular EnvironmentsChao H-C.; Chu Y-M. -- International Journal of Wireless Information Networks, Juillet 2001, vol. 8, no. 3, pp. 133-153(21) -- éd. Kluwer Academic/Plenum, New York, U.S.A.IPv6: The Solution for Future Universal Networks. Lecture Notes in Computer Science, Vol. 1818, p. 82-??, 2000.Modeling and performance analysis for IPv6 traffic with multiple QoS classes. Zhang L.; Zheng L. -- Computer Communications, 1 octobre 2001, vol. 24, no. 15, pp. 1626-1636(11) -- Elsevier Science.Threshold-Based Registration (TBR) in Mobile IPv6. Lecture Notes in Computer Science, Vol. 1818, p. 150-??, 2000.IPv6 Performance Analysis on FreeBSD Workstation Using Simple Applications. Lecture Notes in Computer Science, Vol. 1961, p. 33-??, 2000.Microsoft Research IPv6 Implementation (MSRIPv6): MSRIPv6 Configuring 6to4 - Connectivity with MSR IPv6 - Our 6Bone Node... New frontiers in cybersegmentation: marketing success in cyberspace depends on IP address. Louvieris P.; Driver J. --Qualitative Market Research: An International Journal, 27 juin 2001, vol. 4, no. 3, pp. 169-181(13) -- MCB University Press.QoS-Conditionalized Handoff for Mobile IPv6. Notes de conférence en sciences informatiques, Vol. 2345, p. 721-??, 2002. -Autres -Voir l'URL suivant pour en savoir plus: SWITCH Pilote IPv6 Pilot / Références -<!-- anchor id="information-conferences" -->Conférences, rencontres, sommets - -2002 - -Renater - Conférence IPv6 2002Sommet déploiement IPv6 à INET 2002Quelque chose manque? Les suggestions sont les bienvenues! -2003 -Les suggestions sont les bienvenues! -<!-- anchor id="information-onlineinformation" -->L'information en ligne - -<!-- anchor id="information-joinipv6." -->Rejoindre le backbone IPv6 -A remplir plus avant et plus tard... Les suggestions sont les bienvenues! -<!-- anchor id="information-globalregistries" -->Les bureaux d'enregistrement global - -Backbone de test IPv6: 6bone, Comment rejoindre 6bone, -Teilnahme am 6bone (en langue allemande), -La participation au 6bone (en langue anglaise) -<!-- anchor id="information-majorregionregistries" -->Les centres d'enregistrement de noms de domaine les plus importants, par régions - -Amérique: ARIN, ARIN / page d'enregistement, ARIN / IPv6 guidelinesEMEA: Ripe NCC, Ripe NCC / page d'enregistrement, Ripe NCC / IPv6 registrationAsie/Pacifique: APNIC, APNIC / guide de ressources IPv6Amérique latine et les Caraïbes: LACNIC, Service d'enregistrement IPv6, Politique d'allocation IPv6Afrique: AfriNICIl existe aussi une liste des principales allocations (préfixe de 32 bits) par bureau d'enregistrement régional ici: Ripe NCC / allocations IPv6. -<!-- anchor id="information-joinipv6-tunnelbrokers" -->Les fournisseurs de tunnel (<emphasis>tunnel brokers</emphasis>) -Note: une liste de fournisseurs de tunnel peut être trouvée plus bas dans l'information concernant les fournisseurs de tunnel. -Code source utilisé dans une thèse de maîtrise dans le cadre du projet Vermicelli au sujet des fournisseurs de tunnels, Université de Tromso.Fondation IPng. Fournisseurs de tunnel et ressources IPv6, dorénavant migré au système SixXs.La page de Eckes Linux-avec-IPv6.tunnelc - client de tunnelage basé sur perl: -freshmeat.net: détails sur ce client de tunnelage -SourceForge: Projet Info - tunnelc (aussi ici)L'HOWTO Routage avancée Linux & contrôle du trafic, Chapitre 6: Le tunnelage IPv6 avec Cisco et/ou 6bone.Voir aussi ici pour plus d'information et d'URL: ipv6-net.org. -<!-- anchor id="information-joinipv6-6to4-tunneling" -->6to4 - -information 6to4 de NSayerRFC 3068 / An Anycast Prefix for 6to4 Relay Routers -<!-- anchor id="information-joinipv6-isatap-tunneling" -->ISATAP - -ISATAP (Intra-Site Automatic Tunnel Access Protocol) Information byJOIN -Les dernières nouvelles -A remplir plus avant et plus tard... Les suggestions sont les bienvenues! -ipv6-net.org, est aussi la page d'accueil du canal #IPv6 sur EFnetNombreux URLs vers d'autres documents par Anil Edathara -Les références aux protocoles - -Les appels à commentaires (RFC) relatifs à IPv6 -La publication de la liste des RFC relatifs à IPv6 outrepasse la portée de ce document, mais les URL fournis vous guiderons vers de telles listes: -Listes classées par Etat de la standardisation IPng ou Spécifications actuelles d'IPng par Robert HindenSpécifications relatives à IPv6 on IPv6.org -Les brouillons actuels des groupes de travail -Les brouillons actuels concernant (aussi) IPv6 peuvent être trouvés ici: -IP Version 6 (ipv6)Transition vers la nouvelle génération (ngtrans)Dynamic Host Configuration (dhc)Extension du Système des Noms de DomaineMobile IP (mobileip)Obtenir toute l'information à propos d'IPv6, depuis des vues d'ensemble, en passant par les brouillons et les RFC, jusqu'aux implémentations (comprenant la disponibilité de la pile sur différentes plates-formes & le code source de la pile IPv6) -Autres - -Network Sorcery / IPv6, Protocole Internet IP version 6, l'en-tête du protocole IPv6Guide / Références IPv6 SWITCH, importante liste de références IPv6, maintenue par Simon Leinen -Plus d'information -A remplir plus avant et plus tard... les suggestions sont les bienvenues! -DeepSpace6 / plus de liens intéressants -Relative à Linux - -DeepSpace6 / Portail Linux IPv6 (pas uniquement) - Italie (miroir)IPv6-HowTo pour Linux par Peter Bieringer - Allemagne et son archive logiciel - Bieringer / IPv6L'état de Linux+IPv6 par Peter Bieringer - Allemagne (en cours d'obsolescence)DeepSpace6 / La page concernant l'état IPv6 - Italie (mirroir) (remplacera la page ci-dessus)Projet USAGI - Japon, et son archive logiciel - projet USAGIHOWTO IPv6 Protocole de routage à état de lien optimisé (OLSR) -Relative à Linux, par distribution - -PLDPLD Linux Distribution (“leader du marché” quant aux paquetages disposant d'IPv6)Red HatLinux Red Hat, les paquetages IPv6 de Pekka Savola (historic)FedoraFedora (Project) LinuxDebianLinux Debian, Etat et information IPv6 par Craig Small,HOWTO Connectivité globale d'un LAN IPv6SuSESuSE LinuxMandrivaMandriva (Historic)Pour en savoir plus voir la page état des distributions Linux+IPv6. -Général - -IPv6.org6boneCentre de ressources britanique IPv6 - Royaume-UniProjet WIDE - JaponSWITCH IPv6 Pilot - SuisseLe coin IPv6 de Hubert Feyrer - AllemagneProjet Vermicelli - NorvègeIPv6 Forum - un consortium mondial d'importants fournisseurs Internet, Research & Education Networks...Playground.sun.com / Page d'info IPv6 - maintenu par Robert Hinden, Nokia. Obtenir toute information au sujet d'IPv6, depuis de simples vues d'ensemble, en passant par les RFC et brouillons, jusqu'aux implémentations (incluant la disponibilité des piles sur différentes plates-formes & le code source des piles IPv6).6INIT - Initiative Internet IPv6 - le 5ème programme-cadre européenne R&D de l'IST.IPv6 Task Force (Union Européenne) (NdT: IPv6 Task Force France)Projet de Documentation IPv6 (langue japonaise)6init - IniTiative INternet IPv6Vue d'ensemble d'IP Nouvelle GénérationIPv6: La nouvelle version du protocole Internet, par Steve Deering.IPv6: Le protocole Internet Nouvelle Génération, par Gary C. Kessler. IPv6: Le protocole Internet Nouvelle Génération - 3ComInitiative Internet Nouvelle Générationinternet || site et Groupe de travail internet2 - Presentation (HTML + PPT) de l'atelier IPv6: (auto-configuration sans état, adressage IPv6, USAGI, fournisseur d'adressage IPv6 indépendant et autres thèmes).NetworkWorldFusion: rechercher IPv6 (102 documents trouvés au 22.12.2002)The Register (la recherche pour IPv6 donne 30 documents, 22.12.2002)recherche chez ZDNet pour IPv6Recherche chez TechTarget pour IPv6Liste de resssources IPv6 & TCPLes outils IPv6 Klingon, les outils IPv6 Klingon (accessible seulement en IPv6 natif): exemples de pare-feu IPv6, test de bande passante et scanner de portsQuelque chose manque? Les suggestions sont les bienvenues! -<!-- anchor id="information-marketresearch" -->Etudes de marché - -A Tale of Two Wireless Technology Trends: Processor Development Outsourcing and IPv6Groupe Yankee - 1/4/2002 - 12 Pages - ID: YANL768881The World Atlas of the Internet: Americas; IDATE - 2/1/2002 - 242 Pages - ID: IDT803907. Les pays couverts: Amérique Centrale, Amérique du Nord, Amérique du Sud; Liste: Prix: $ 3,500.00; à l'exception: Panorama du marché des accès à l'Internet à travers le monde. Estimation du marché et prévions jusqu'en 2006 pour 34 pays: structure du marché: les principaux ISP et le partage du marché; nombre de souscripteurs, d'ISP.Earlier Interest Rising for IPv6 par IDC (Auteur); prix: $1,500.00; support: e-book (Acrobat Reader); éd. IDC; ISBN B000065T8E; ( 1 mars 2002) -<!-- anchor id="information-patents" -->Les brevets - -Base de données des brevets canadiens: Accueil, Recherche (Recherche simple, entrez juste “IPv6” dans le champs recherche ;-); 84 documents trouvés au 22.12.2002)Espacenet - information sur les brevets européens: -Offices nationaux, membres d'Espacenet(IPv6: 84 documents, au 22.12.2002)Delphion: Recherche de brevets. Un simple enregistrement (gratuit) est nécessaire. Exemples trouvés au 21.12.2002 par une recherche sur l'expression IPv6: -Méthode de communication entre terminal IPv4 et terminal IPv6, mécanisme de conversion IPv4-IPv6 -Traducteur pour réseaux IP, système réseau utilisant le traducteur, mais aussi une méthode de couplage de réseaux IP -Par pays - -Europe - -www.ist-ipv6.org: IST IPv6 Cluster, recherche européenne IPv6 et développement de projetsEuro6IX: Backbone européenne d'interconnexion Internet IPv6 -Autriche - -IPv6@IKNnet et le groupe de recherche MIPv6: Vienne , Autriche (IPv6: projets, publications, diplômes / thèses de doctorat, actes de conférence, etc. -Australie - -Les pages IPv6 australiennes de Carl (contenu ancien) -Brésil - -BR6boneIPv6 Summit in BrazilIPv6 do Brasil -Allemagne - -IPv6-net.org: Forum IPv6 allemand -France - -Renater: La page d'accueil du projet IPv6 RenaterIPv6 - RSVP - ATM à l'INRIADocumentation IPv6 NetBSD IPv6 -Hongrie - -Tester la technologie expérimentale IPv6 et ses services en Hongrie -Japon - -Groupe d'utilisateurs IPv6 Linux JPYamaha IPv6 (désolès, tout en japonais...) -Corée - -ETRI: Institut de Recherche en Electronique et TélécommunicationsForum IPv6 koréen: Projet de déploiement coréen d'IPv6 -Mexique - -Mexique IPv6 (versions espagnole et anglaise): Accueil du projet IPv6 de l'Université nationale autonome du Mexique (UNAM) -Pays-Bas - -SURFnet: Backbone IPv6 SURFnetSTACK, STACK (IPv6): Association d'étudiants en informatique de l' Université de Technologie, Pays-BasIPng.nl: collaboration entre WiseGuys et Intouch -Portugal - -FCCN (Fondation Nationale pour le Calcul Scientifique) -Russie - -Forum IPv6 pour la Russie: Centre Internet de l'Université publique de Yaroslavl -Suisse - -SWITCH: L'éducation suisse & les recherches réseau -Royaume-Uni - -IPv6 au Royaume-UniCentre de resources IPv6 britaniqueLa page d'accueil de British Telecom IPv6: essai de BT en tant que fournisseur de service IPv6, premier point d'interconnexion Internet au Royaume-Uni, ... -Par systèmes d'exploitation - -*BSD - -Le projet KAME (*BSD)FAQ de la mise en réseau IPv6 de NetBSDLe port FreeBSD d'Ipv6BUGAT - Groupe d'utilisateurs Australiens BSD - www.bugat.at: Tunnel IPv6 FreeBSD (langue allemande) -Cisco IOS - -Cisco IOS IPv6IPv6 pour IOS de Cisco, Fichier 2 sur 3: août 2002 -- Table des Matières: IPv6 pour IOS de Cisco; documentation des caractéristiques de configuration; Rendre disponible et configurer le routage IPv6; l'adressage IPv6; Rendre globalement le fonctionnement IPv6 disponible.Manuel de la mise en réseau Internet Cisco, chapitre IPv6 -Compaq - -IPv6 chez Compaq - Présentations, livres blancs, documentation, ... -HPUX - -FAQ comp.sys.hp.hpux -IBM - -Maintenant c'est IBM qui annonce la disponibilité de z/OS V1.4, Quoi de neuf dans cette version? Cette question a été posée le 15 août 2002 -Microsoft - -Microsoft Windows 2000 IPv6 MSRIPv6 - Accueil IPv6 des recherches réseau de MicrosoftDébuter avec la technologie IPv6 Microsoft prévue pour Windows 2000Le pare-feu servant à la connexion Internet ne bloque pas le trafic IPv6 (au 6.11.2001)Internet Protocol Numbers (au 8.10.2002)IPv6 Technology Preview Refresh (au 16.10.2002)Comment: installer et configurer IP version 6 pour Windows .NET Enterprise Server (au 26.10.2002)Le service de routage 6to4 du serveur Windows .NET quitte lorsque vous publiez une adresse 2002 sur une interface publique (au 28.10.2002)msdn - Microsoft Windows CE .NET - commandes IPv6msdn - recherche pour IPv6 (100 résultats, au 22.12.2002) -Solaris - -Solaris Sun MicrosystemsSolaris 2 Frequently Asked Questions (FAQ) 1.73 -Sumitoma é - -Sumitomo Electric a implémenté IPv6 sur la famille des routeurs Suminet 3700 -ZebOS - -IpInfusion's ZebOS Logiciel de serveur de routage -<!-- anchor id="information-ipv6andsecurity" -->La sécurité IPv6 - -Internet Security Systems: Centre Sécurité, recherche dans la base de donnée X-Force (21.12.2002 - 6 thèmes relatifs à IPv6)Projet IPsec NIST ( Institut National des Standards et Technologie, NIST)Information SecurityNewOrder.box.sk (recherche pour IPv6) (Articles, exploits, files database, etc.) -Les listes d'applications - -IPv6.org / Ies applications disposant d'Pv6Freshmeat / recherche IPv6, actuellement (au 14 décembre 2002), 62 projetsForum IPv6 : IPv6 Router List -Les outils d'analyse - -Ethereal - Ethereal est un analyseur libre de protocoles réseaux pour Unix et WindowsRadcom RC100-WL - Téléchargez l'analyseur de protocoles RC100-WL Radcom version 3.20 -Les produits IPv6 - -6wind - solutions pour routeur IPv4/IPv6, QoS, Multicast, Mobilité, Sécurité/VPN/Pare-feu. Fefe's patches for IPv6 with djbdnsAoût 2002 -- Qu'est-ce que djbdns et a-t-il besoin d'IPv6? djbdns est un serveur DNS complet qui outrepasse les performances de BIND.Suite de serveurs de routage ZebOS Inframail (Advantage Server Edition)HTTrack Website CopierCommViewPosadisTCP Wrapper (prêt pour IPv6) -<!-- anchor id="information-snmp" -->SNMP - -comp.protocpols.snmp SNMP FAQ Parties 1 of 2 -L'infrastructure IPv6 - -Statistiques - -Histoire de la table de routage IPv6 créée par Gert Döring, Space.NetOfficial 6bone Webserver list StatisicIPv6 Allocation Data & Survey Results, IPv6 WG, Ripe 42, Ripe NCC -Points d'interconnexion Internet -Une autre liste de points d'interconnexion IPv6 peut être trouvée ici: Site web des points d'interconnexion IPv6 ou Statut IPv6 des IXP en Europe -<!-- anchor id="information-ipv6exchanges-estonia" -->Estonie - -TIX (point d'interconnexion Internet Tallinn avec support IPv6) -<!-- anchor id="information-ipv6exchanges-europe" -->Europe - -Euro6IX, Backbone des points d'interconnexion Internet IPv6 européen -<!-- anchor id="information-ipv6exchanges-france" -->France - -Point d'interconnexion Internet IPv6 français (actif depuis le 1.11.2002). -FNIX6 fournit une interconnexion haut débit FastEthernet gratuite et fiable entre ISP situés chez TeleCity, Paris. -<!-- anchor id="information-ipv6exchanges-germany" -->Allemagne - -INXS: Munich et Hamburg (câble & sans fil) -<!-- anchor id="information-ipv6exchanges-japan" -->Japon - -NSPIXP-6: point d'interconnexion Internet basé sur IPv6, à TokyoJPIX, Tokyo -<!-- anchor id="information-ipv6exchanges-korea" -->Korée - -6NGIX -<!-- anchor id="information-ipv6exchanges-netherlands" -->Les Pays-Bas - -AMS-IX: Point d'interconnexion à Amsterdam -<!-- anchor id="information-ipv6exchanges-uk" -->Royaume-Uni - -UK6X: LondresXchangePoint: Londres -<!-- anchor id="information-ipv6exchanges-usa" -->USA - -6TAP: Chicago. Supporte le peering à travers tout le globeNY6IX: Point d'interconnexion IPv6 basé à New YorkPAIX: Palo Alto -<!-- anchor id="information-Tunnelbroker" -->Les fournisseurs de tunnel (<emphasis>tunnelbrokers</emphasis>) -Voir aussi: http://www.deepspace6.net/docs/tunnelbrokers.html -<!-- anchor id="information-tunnelbroker-belgium" -->Belgique - -Wanadoo -<!-- anchor id="information-tunnelbroker-canada" -->Canada - -Freenet6 - délégation /48, Canada -Accéder à IPv6 en utilisant Freenet6 sur Debian -Création Freenet6 -<!-- anchor id="information-tunnelbroker-china" -->Chine - -CERNET-Nokia -<!-- anchor id="information-tunnelbroker-estonia" -->Estonie - -Estpak -Europe - -Fournisseur de tunnel distribué XS26, USA & Europeé -<!-- anchor id="information-tunnelbroker-germany" -->Allemagne - -6bone Knoten Leipzig -Info bez. Hackangriff (2001)Berkom -<!-- anchor id="information-tunnelbroker-italy" -->Italie - -Centro Studi e Laboratory Telecomunicazioni (page de téléchargement TunnelBroker Version 2.1.) -Fournisseur de tunnel IPv6: instructions d'installationComv6Bersafe (langue italienne)Telecom Italia LAB (page de téléchargement du logiciel Tunnelbroker) -<!-- anchor id="information-tunnelbroker-japan" -->Japon - -Initiative Internet au Japon (en langue japonaise) - avec fourniture de lignes IPv6 natives et tunnelage IPv6 -<!-- anchor id="information-tunnelbroker-malaysia" -->Malaisie - -Manis -<!-- anchor id="information-tunnelbroker-netherlands" -->Les Pays-Bas - -XS26 - "Accès à Six" - avec des POP (Points De Présence) en République slovaque, en République Tchèque, aux Pays-Bas, en Allemagne et en Hongrie.IPng Pays-Bas - Intouch, SurfNet, AMS-IX, UUNet, Cistron, RIPE NCC et AT&T sont connectés au AMS-IX. Il est possible (sous certaines conditions) d'obtenir un tunnel statique.Clients SURFnet -<!-- anchor id="information-tunnelbroker-norway" -->Norvège - -UNINETT, Guide concernant le service IPv6 (pour les clients): fournisseur de tunnel et allocation d'adresse -Uninett-Autoupdate-HOWTO -<!-- anchor id="information-tunnelbroker-spain" -->Espagne - -Consulintel -<!-- anchor id="information-tunnelbroker-switzerland" -->Suisse - -Fournisseur de tunnel AS8758, Dolphins Network Systems (en ligne depuis le 20.12.2002) -<!-- anchor id="information-tunnelbroker-uk" -->Royaume-Uni - -NTT Europe, NTT, Royaume-Uni - essai IPv6. Tunnel IPv4 et IPv6 natif and native IPv6 leased Line connexions. Les POP sont situés à Londres au Royaume Uni, Düssenldorf en Allemagne, New Jersey aux USA (Côte Est), Cupertino aux USA (Côte Ouest), Tokyo au JaponInterface d'administration du fourniseur de tunnel IPv6 BtexacTRoyaume-Uni IPng -<!-- anchor id="information-tunnelbroker-usa" -->USA - -ESnet, USA - Réseau des Sciences de l'Energie: Tunnel Registry & adresse Delegation for directly connected ESnet sites and ESnet collaborators.6REN, USA - l'initiative 6ren est coordonnée par Réseau des Sciences de l'Energie (ESnet), the network for the Energy Research program of the US Dept. of Energy, located at the University of California's Lawrence Berkeley National Laboratory.XS26 Distributed Tunnel Broker, USA & EuropeHurricane Electric, backbone US; -Fournisseur de tunnel Hurrican Electric (aussi disponible ici) -Press Version: Hurricane Electric devient fournisseur de tunnel IPv6 (communiqué de presse) -Mise à jour d'extrémité de tunnel, pour fournisseur de tunnel, script Perl -<!-- anchor id="information-tunnelbroker-singapore" -->Singapour - -http://tunnel-broker.singnet.com.sg/, avec en option NAT et IPsec -<!-- anchor id="information-tunnelbroker-more" -->Plus de fournisseurs de tunnel... - -Routeurs relais 6to4 publiques (boycott MS IIE!) -<!-- anchor id="information-infrastructure-nativeipv6service" -->Services nativement accessibles par IPv6 -Note: Ces services sont uniquement disponibles grâce à une connexion IPv6 valide! -<!-- anchor id="information-nativeipv6gameserver" -->Serveur de jeu - -Quake2 sur IPv6 -<!-- anchor id="information-nativeipv6ircserver" -->IRC Server - -Cyconet (serveurs IRCnet Cyconet sur IPv6) -Stations Radio, flux de musique - -Flux IPv6 expérimental en direct!, Université de Leipzig, Allemagne -<!-- anchor id="information-nativeipv6webserver" -->Serveur web - -la page d'accueil de l'HOWTO IPv6 Linux de Peter Bieringer Quelque chose manque? Les suggestions sont les bienvenues! -<!-- anchor id="information-maillists" -->Les listes de diffusion -Des listes de listes de diffusion sont disponibles: -DeepSpace6 / liste de listes de diffusionLes listes de diffusion essentielles sont listées dans le tableau suivant: - - - - - - - - - -Centre d'intérêt -Adresse mél de la requête d'inscription -A quoi souscrire -Adresse mél de la liste de diffusion -Langue -accès par WWW - - -L'activité réseau du noyau Linux incluant IPv6 -majordomo (chez) oss.sgi.com -netdev -netdev (chez) oss.sgi.com -Anglaise -Archive - - -Linux et IPv6 en général (1) -majordomo (chez) list.f00f.org -linux-ipv6 -linux-ipv6 (chez) list.f00f.org (modérée) -Anglaise - - - -L'implémentation Linux du protocole IPv6 -interface web, voir l'URL - -project6 (chez) ferrara.linux.it -Anglaise -Info, Subscription - - -La mobilité IP(v6) sur Linux -majordomo (chez) list.mipl.mediapoli.com -mipl -mipl (chez) list.mipl.mediapoli.com -Anglaise -Info, Archive - - -Utilisateurs Linux IPv6 avec l'extension USAGI -usagi-users-ctl (chez) linux-ipv6.org - -usagi-users (chez) linux-ipv6.org -Anglaise -Info / Recherche, Archive - - -IPv6 sur Debian Linux -interface web, voir l'URL - -debian-ipv6 (chez) lists.debian.org -Anglaise -Info/Souscription/Archive - - -IPv6/6bone en Allemagne -majordomo (chez) atlan.uni-muenster.de -ipv6 -ipv6 (chez) uni-muenster.de -German/English -Info, Archive - - -6bone -majordomo (chez) isi.edu -6bone -6bone (chez) isi.edu -Anglaise -Info, Archive - - -Discussions IPv6 -majordomo (chez) sunroof.eng.sun.com -ipng -ipng (chez) sunroof.eng.sun.com -Anglaise -Info, Archive, Mirroir des archives - - -Les utilisateurs d'IPv6 en général -majordomo (chez) ipv6.org -users -users (chez) ipv6.org -Anglaise -Info, Archive - - -Recherche des bogues des applications Internet (2) -bugtraq-subscribe (chez) securityfocus.com - -bugtraq (chez) securityfocus.com (moderated) -Anglaise -Info, Archive - - -IPv6 en général -interface web, voir l'URL - -ipv6 (chez) ipng.nl -Anglaise -Info/Subscription, Archive - - -majordomo (chez) mfa.eti.br -majordomo (chez) mfa.eti.br -ipv6 -ipv6 (chez) mfa.eti.br -Portugaise -Info - - - -(1) recommandé pour les questions d'ordre général Linux & IPv6. -(2) très recommandé si vous êtes fournisseur d'applications serveur. -Quelque chose manque? Les suggestions sont les bienvenues! - -Les listes de diffusion et newsgroups suivants sont disponibles via le web: -ipv6 (France) -Description: Cette liste IPv6 permet de discuter d'IPv6 en langue française. Elle s'adresse aux personnes désirant démarrer dès aujourd'hui des tests IPv6. Ce n'est en aucun cas un substitut aux listes de l'IETF. Pour de plus amples informations: http://www.urec.fr/IPngTunnelbroker Maillingliste (Allemagne)ipv6 (Hongrie) -Description: ipv6 Az IPv6 protokoll listaja Konfiguracios es adminisztracios kerdesek az IPv6-al kapcsolatban. (Archivum)student-ipv6 (Inde) -Description: groupe d'étudiants intéressé par IPv6IPV6-CNR@LISTSERV.CNR.IT (Italie) -Description: Groupe IPv6 au CNRipv6-jp (Japon)ipv6 (Japon)sun-ipv6-users -Description: Merci de rapporter les problèmes/suggestions concernant l'implémentation IPng SUN MicrosystemsIPv6-BITS -Description: Cette liste coordonnera le travail du Verebrae.openbsd-ipv6IPv6 -Description: Cette liste de diffusion consiste en discussions techniques au sujet des possibilités d'IPv6/IPsec WRT OpenBSD.linux-bangalore-ipv6 -Description: La liste concernant le déploiement d'IPv6 du groupe d'utilisateurs Linux Bangaloregab -Description: L'intention est de discuter du plan géographique d'adressage IPv6.ipv6-bsd-user -Description: Cette liste de diffusion concerne l”implémentation INéRIA/IMAG d'IPv6. Elle est bilingue, Francais/Anglais. Si vous souhaitez contacter les implémenteurs, essayez ipv6-bsd-core@imag.frgated-ipv6La commutation de paquets -Description: cette liste de diffusion fournit un forum de discussion au sujet de l'implémentation, de la technologie et de la théorie de la commutation de paquets et l'application à tout domaine, LAPB, X.25, SDLC, P802.1d, LLC, IP, IPv6, IPX, DECNET, APPLETALK, FR, PPP, téléphonie IP, les systèmes PBX LAN, les protocoles d'administration comme SNMP, e-mail, système de fenêtre transparent au réseau, implémentation de protocoles, vérification de protocoles, tests de conformité et outils utilisés dans la maintenance ou dans le développement des systèmes de commutation de paquets.mumbaiinternetgroup -Description: Ce forum discutera des problèmes et des développements actuels concernant Internet dans la région de l'Asie pacifique. Cela couvrira IPv4, IPv6, le DNS multilingue, les numéros de systèmes autonomes, la gouvernance Internet et bien plus...de.comm.protocols.tcp-ip -Description: Umstellung auf IPv6 -Source: Chartas der Newsgruppen in de.*Groupe Google: comp.protocols.tcp-ipGroupe Google: linux.debian.maint.ipv6Groupe Google: microsoft.public.platformsdk.networking.ipv6Groupe Google: fa.openbsd.ipv6 -<!-- anchor id="information-onlinetesttools" -->Outils en ligne - -Outils de test - -finger, nslookup, ping, traceroute, whois: Centre de ressources IPv6 britanique / la page de testping, traceroute, tracepath, whois 6bone, DNS: JOIN / outils de test (en langue allemande seulement, mais en l'occurrence cela ne devrait pas être un problème pour les non germanistes)traceroute6, whois: IPng.nlVérificateur de résolution AAAA http://www.cnri.dit.ie/cgi-bin/check_aaaa.plOutils divers : IPv6toolsOutil d'analyse d'adresse IPv6 (assez similaire à l'option d'information d'ipv6calc) -Recherche d'information - -Le bureau d'enregistrement 6BONEListe mondiale d'attribution de tout bloc d'adresses IPv6 -Outils d'observation des réseaux IPv6 - -Observer IPv6 chez SURRIELObserver IPv6 chez DRENv6 -Applications venant en aide - -Calculatrice de préfixe IPv6 par TDOIVérificateur d'enregistrement DNS -<!-- anchor id="information-trainingsandseminars" -->Pratique, séminaires - -formation et atelier IPv6, AERAsec, Allemagne (en langue allemande pour l'instant)Migrer vers IPv6, Learning Tree InternationalFormation professionnelle CIW la maintenance Internet CBT CDPages concernant la formation, Royaume-Uni - recherche à partir du mot clé “IPv6” (13 cours, au 22.12.2002)Quelque chose manque? Les suggestions sont les bienvenues! -<!-- anchor id="information-onlinediscovery" -->'La découverte en ligne'... -IPv6: Addressing The Needs Of the Future [DOWNLOAD: PDF] -par le groupe Yankee (Auteur) -Prix: $595.00 -Edition: e-book (Acrobat Reader) -Pages: 3 (trois) -Editeur: MarketResearch.com; ISBN B00006334Y; (1 novembre 2001) - -;-) Le nombre de copies serait intéressant à connaître... - -Historique des Révisions / Crédits / La Fin - -<!-- anchor id="revision-history" -->Historique des Révisions - -Révisions 0.x - -La version anglo-saxonne (document original de Peter Bieringer) -Un historique des modifications de la version anglo-saxonne originale peut être trouvé ici: TLDP / Linux+IPv6-HOWTO / Revision History. -La version francophone - -0.49.fr.22007-10-06/PB: fix broken URLs to TLDP-CVS, minor fixes for proper SGML validation.0.49.fr.12006-02-26/MB: Mise à jour au profit de la révision 0.49.0.48.1.fr.12005-01-20/MB: Mise à jour au profit de la révision 0.48.1.0.47.fr.12004-09-05/MB: Mise à jour au profit de la révision 0.47.0.45.1.fr.12004-03-14/MB: Mise à jour au profit de la révision 0.45.1. Corrections et améliorations diverses.0.44.fr.12003-09-05/MB: Mise à jour au profit de la révision 0.44. A cette occasion, une révision non systématique est réalisée.0.43.2.fr.22003-07-17/MB: Correction de quelques coquilles, amélioration de la traduction de quelques passages.0.43.2.fr.12003-06-20/MB: Mise à jour au profit de la révision 0.43.2. A cette occasion, une révision non systématique est réalisée.0.41.1.fr.22003-06-06/MB: Première révision générale; à savoir, correction de coquilles, bogues, fautes d'orthographe, etc.0.41.1.fr.12003-05-09/MB: Cette version est la première. Son contenu, rédigé sur LyX version 1.3.2, est basé sur celui de la version anglo-saxonne 0.41.1. Cependant un certain nombre de mes suggestions (Michel Boucey) ayant été prises en compte par Peter Bieringer lors du travail de traduction, il existe d'ores et déjà, ça et là, des modifications mineures qui seront présentes dans les futures versions du document original. Le suffixe .fr.x indique le numéro de révision de la traduction francophone. -<!-- anchor id="credits" -->Crédits -Le moyen le plus rapide d'être ajouté à cette sympathique liste est de m'envoyer des corrections (de bogue), et/ou mises à jour ;-). -Si vous voulez réaliser un réexamen important, vous pouvez utiliser le fichier natif LyX (voir le document original) et envoyez les diffs s'y rapportant, car les diffs en rapport au code SGML ne sont pas d'une grande utilité (NdT: merci d'envoyer les diffs à l'adresse <mboucey chez free point fr>). -<!-- anchor id="major-credits" --> Crédits majeurs - -David Ranch <dranch chez trinnet point net>: pour m'avoir encouragé à écrire cet HOWTO, pour ses commentaires sur quelques premières des révisions, et ses contributions à de différents résultats de test IPv6 sur mon site web IPv6. Mais aussi pour ses relectures et suggestions.Pekka Savola <pekkas chez netcore point fi>: pour ses relectures essentielles, apports et suggestions.Martin F. Krafft <madduck chez madduck point net>: pour la vérification orthographique et sa relecture générale du document.John Ronan <j0n chez tssg point wit point ie>: pour la vérification orthographique.Georg Käfer <gkaefer chez gmx point at>: pour la détection de la création défectueuse au format PDF (problème réglé maintenant par Greg Ferguson, travaillant au LDP), les références de livres en langue allemande, une grande liste d'URL, leurs vérifications, une grande quantité de suggestions, de corrections, de contributions, et pour sa traduction en langue allemande.Michel Boucey <mboucey chez free point fr>: pour la correction orthographique, la découverte de liens brisés, sa contribution grâce à ses suggestions, ses apports de nouveaux liens, et pour sa traduction en langue française.Michele Ferritto <m dot ferritto at virgilio dot it>: pour avoir découvert des bogues, et pour sa traduction en langue italienne.Daniel Roesen <dr at cluenet dot de>: pour ses vérifications orthographiques. -Autres crédits - -Crédits relatifs aux documents techniques -Ecrire, en étant débutant, un HOWTO LDP (dans LyX et en exportant le travail vers DocBook pour se conformer au SGML) n'est pas si facile que certains pourraient le dire. Il y a d'étranges pièges... malgré tout, merci: -Aux auteurs du Guide de l'auteur LDPA B. Guillon: pour l'HOWTO DocBook avec LyX -<!-- anchor id="content-related-credits" -->Crédits relatifs à la traduction francophone -Les crédits concernant les corrections/suggestions apportées à la version francophone viendront ici (peut-être un jour...). Merci par avance pour vos contributions. -La Fin -Merci de m'avoir lu. Dans l'espoir que cela puisse aider! -Si vous avez des questions, souscrivez à la bonne liste de diffusion et décrivez votre problème en fournissant autant d'information que possible. \ No newline at end of file diff --git a/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.html b/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.html deleted file mode 100644 index da3e2925..00000000 --- a/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.html +++ /dev/null @@ -1,22306 +0,0 @@ - -Linux IPv6 HOWTO (en)

    Linux IPv6 HOWTO (en)

    Peter Bieringer

    pb at bieringer dot de

    Revision History
    Revision 0.67wip2016-12-15Revised by: PB
    Revision 0.662014-05-15Revised by: PB
    Revision 0.652009-12-13Revised by: PB
    Revision 0.642009-06-11Revised by: PB
    Revision 0.602007-05-31Revised by: PB
    Revision 0.512006-11-08Revised by: PB

    The goal of the Linux IPv6 HOWTO is to answer both basic and advanced questions about IPv6 on the Linux operating system. This HOWTO will provide the reader with enough information to install, configure, and use IPv6 applications on Linux machines. Intermediate releases of this HOWTO are available at mirrors.bieringer.de or mirrors.deepspace6.net. See also revision history for changes.


    Table of Contents
    1. General
    1.1. Copyright, license and others
    1.2. Category
    1.3. Version, History and To-Do
    1.4. Translations
    1.5. Technical
    1.6. Preface
    1.7. Used terms, glossary and shortcuts
    1.8. Requirements for using this HOWTO
    2. Basics
    2.1. What is IPv6?
    2.2. History of IPv6 in Linux
    2.3. What do IPv6 addresses look like?
    2.4. FAQ (Basics)
    3. Address types
    3.1. Addresses without a special prefix
    3.2. Network part, also known as prefix
    3.3. Address types (host part)
    3.4. Prefix lengths for routing
    4. IPv6-ready system check
    4.1. IPv6-ready kernel
    4.2. IPv6-ready network configuration tools
    4.3. IPv6-ready test/debug programs
    4.4. IPv6-ready programs
    4.5. IPv6-ready client programs (selection)
    4.6. IPv6-ready server programs
    4.7. FAQ (IPv6-ready system check)
    5. Configuring interfaces
    5.1. Different network devices
    5.2. Bringing interfaces up/down
    6. Configuring IPv6 addresses
    6.1. Displaying existing IPv6 addresses
    6.2. Add an IPv6 address
    6.3. Removing an IPv6 address
    6.4. Automatic IPv6 Address Configuration
    6.5. Enable Privacy Extension
    7. Configuring normal IPv6 routes
    7.1. Displaying existing IPv6 routes
    7.2. Add an IPv6 route through a gateway
    7.3. Removing an IPv6 route through a gateway
    7.4. Add an IPv6 route through an interface
    7.5. Removing an IPv6 route through an interface
    7.6. FAQ for IPv6 routes
    8. Neighbor Discovery
    8.1. Displaying neighbors using “ip”
    8.2. Manipulating neighbors table using “ip”
    9. Configuring IPv6-in-IPv4 tunnels
    9.1. Types of tunnels
    9.2. Displaying existing tunnels
    9.3. Setup of point-to-point tunnel
    9.4. Setup of 6to4 tunnels
    10. Configuring IPv4-in-IPv6 tunnels
    10.1. Displaying existing tunnels
    10.2. Setup of point-to-point tunnel
    10.3. Removing point-to-point tunnels
    11. Kernel settings in /proc-filesystem
    11.1. How to access the /proc-filesystem
    11.2. Entries in /proc/sys/net/ipv6/
    11.3. IPv6-related entries in /proc/sys/net/ipv4/
    11.4. IPv6-related entries in /proc/net/
    12. Netlink-Interface to kernel
    13. Address Resolver & Selection
    14. Network debugging
    14.1. Server socket binding
    14.2. Examples for tcpdump packet dumps
    15. Support for persistent IPv6 configuration in Linux distributions
    15.1. Red Hat Linux and “clones”
    15.2. SuSE Linux
    15.3. Debian Linux
    16. Auto-configuration
    16.1. Stateless auto-configuration out-of-the-box
    16.2. Stateless auto-configuration using Router Advertisement Daemon (radvd)
    16.3. Dynamic Host Configuration Protocol v6 (DHCPv6)
    17. Mobility
    17.1. Common information
    18. Firewalling
    18.1. Firewalling using netfilter6
    18.2. Preparation
    18.3. Usage of ip6tables
    18.4. Network Address Translation (NAT) using netfilter6
    18.5. Firewalling using nftables
    19. Security
    19.1. Node security
    19.2. Access limitations
    19.3. IPv6 security auditing
    20. Encryption and Authentication
    20.1. Modes of using encryption and authentication
    20.2. Support in kernel (ESP and AH)
    20.3. Automatic key exchange (IKE)
    20.4. Additional informations:
    21. Quality of Service (QoS)
    21.1. General
    21.2. Linux QoS using “tc”
    22. Hints for IPv6-enabled daemons
    22.1. Berkeley Internet Name Domain (BIND) daemon “named”
    22.2. Internet super daemon (xinetd)
    22.3. Webserver Apache2 (httpd2)
    22.4. Router Advertisement Daemon (radvd)
    22.5. Dynamic Host Configuration v6 Server (dhcp6s)
    22.6. ISC Dynamic Host Configuration Server (dhcpd)
    22.7. DHCP Server Dibbler
    22.8. tcp_wrapper
    22.9. vsftpd
    22.10. proftpd
    22.11. Other daemons
    23. Programming
    23.1. Programming using C-API
    23.2. Other programming languages
    24. Interoperability
    25. Further information and URLs
    25.1. Paper printed books, articles, online reviews (mixed)
    25.2. Conferences, Meetings, Summits
    25.3. Online information
    25.4. IPv6 Infrastructure
    25.5. Maillists
    25.6. Online tools
    25.7. Trainings, Seminars
    25.8. 'The Online Discovery' ...
    26. Revision history / Credits / The End
    26.1. Revision history
    26.2. Credits
    26.3. The End

    Chapter 1. General

    Information about available translations you will find in section Translations.


    1.1. Copyright, license and others

    1.1.1. Copyright

    Written and Copyright (C) 2001-2014 by Peter Bieringer


    1.1.2. License

    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 © 2001-2014 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA.


    1.1.3. About the author

    1.1.3.1. Internet/IPv6 history of the author

    • 1993: I got in contact with the Internet using console based e-mail and news client (e.g. look for “e91abier” on groups.google.com, that's me).

    • 1996: I got a request for designing a course on IPv6, including a workshop with the Linux operating system.

    • 1997: Started writing a guide on how to install, configure and use IPv6 on Linux systems, called IPv6 & Linux - HowTo (see IPv6 & Linux - HowTo/History for more information).

    • 2001: Started writing this new Linux IPv6 HOWTO.


    1.1.3.2. Contact

    The author can be contacted via e-mail at <pb at bieringer dot de> and also via his homepage.

    He's currently living in Munich / Bavaria / Germany / Europe / Earth.


    1.2. Category

    This HOWTO should be listed in category “Networking/Protocols”.


    1.3. Version, History and To-Do

    1.3.1. Version

    The current version is shown at the beginning of the document.

    For other available versions/translations see also http://www.bieringer.de/linux/IPv6/.


    1.3.2. History

    1.3.2.1. Major history

    2001-11-30: Starting to design new HOWTO.

    2002-01-02: A lot of content completed, first public release of chapter 1 (version 0.10).

    2002-01-14: More completed, some reviews, public release of the whole document (version 0.14).

    2002-08-16: Polish translation is in progress

    2002-10-31: Chinese translation is available (see Translations for more)

    2002-11-10: German translation is in progress

    2003-02-10: German translation is available

    2003-04-09: French translation is in progress

    2003-05-09: French translation is available

    2003-10-16: Italian translation is in progress

    2004-03-12: Italian translation is available

    2004-06-18: Greek translation is in progress

    2005-07-25: Turkish translation is availble

    2007-03-28: Portuguese-Brazil translation is in progress

    2008-07-30: Spanish translation is available (but still in progress)

    2011-05-09: Portuguese-Brazil translation is again in progress


    1.3.2.2. Full history

    See revision history at the end of this document.


    1.3.3. To-Do

    • Fill in missing content

    • Finishing grammar checking


    1.4. Translations

    Translations always have to contain the URL, version number and copyright of the original document (but yours, too). Pls. don't translate the original changelog, this is not very useful - also do not translate the full section about available translations, can be run out-of-date, add an URL to this section here in the English howto.

    Looks like the document's change frequency is mostly less than once per month. Since version 0.27 it looks like that most of the content contributed by me has been written. Translations always have to use the English version as source.


    1.4.1. To language

    Note: an overview with URLs can be found at http://www.bieringer.de/linux/IPv6/.


    1.4.1.1. Chinese

    A Chinese translation by Burma Chen <expns at yahoo dot com> (announced to me at 2002-10-31) can be found on the TLDP: http://www.ibiblio.org/pub/Linux/docs/HOWTO/translations/zh/Linux-IPv6-HOWTO.txt.gz (g'zipped txt). It's a snapshot translation, don't know whether kept up-to-date.


    1.4.1.2. Polish

    Since 2002-08-16 a Polish translation was started and is still in progress by Lukasz Jokiel <Lukasz dot Jokiel at klonex dot com dot pl>. Taken source: CVS-version 1.29 of LyX file, which was source for howto version 0.27. Status is still work-in-progress (2004-08-30).


    1.4.1.3. German

    With 2002-11-10 a German translation was started by Georg Käfer <gkaefer at gmx dot at> and the first public version was published 2003-02-10. It's originally available on Deep Space 6 at http://mirrors.deepspace6.net/Linux+IPv6-HOWTO-de/ (mirrored e.g. on http://mirrors.bieringer.de/Linux+IPv6-HOWTO-de/). This version will stay up-to-date as much as possible.


    1.4.1.4. French

    With 2003-04-09 a French translation was started by Michel Boucey <mboucey at free dot fr> and the first public version was published 2003-05-09. It's originally available on Deep Space 6 at http://mirrors.deepspace6.net/Linux+IPv6-HOWTO-fr/ (mirrored e.g. on http://mirrors.bieringer.de/Linux+IPv6-HOWTO-fr/).


    1.4.1.5. Spanish

    A member of the MontevideoLibre, a project in Uruguay (South America) started the translation into Spanish in wiki format some time ago, but the URL is no longer available.


    1.4.1.6. Italian

    With 2003-10-16 a Italian translation was started by Michele Ferritto <m dot ferritto at virgilio dot it> for the ILDP (Italian Linux Documentation Project) and the first public version was published 2004-03-12. It's originally available on the ILDP at http://it.tldp.org/HOWTO/Linux+IPv6-HOWTO/.


    1.4.1.7. Japanese

    On 2003-05-14 Shino Taketani <shino_1305 at hotmail dot com> send me a note that he planned to translate the HowTo into Japanese.


    1.4.1.8. Greek

    On 2004-06-18 Nikolaos Tsarmpopoulos <ntsarb at uth dot gr> send me a note that he planned to translate the HowTo into Greek.


    1.4.1.9. Turkish

    On 2005-07-18 Necdet Yucel <nyucel at comu dot edu dot tr> send me a note that a Turkish translation is available. It's a snapshot translation (currently of 0.61) and can be found at http://docs.comu.edu.tr/howto/ipv6-howto.html.


    1.4.1.10. Portuguese-Brazil

    On 2011-05-06 Gustavo Mendes de Carvalho <gmcarvalho at gmail dot com> start to translate the HowTo in Portuguese-Brazil. The first try in 2007 by Claudemir da Luz <claudemir dot daluz at virtuallink dot com dot br> was never finished.


    1.5. Technical

    1.5.1. Original source of this HOWTO

    This HOWTO is currently written with LyX version 1.6.1 on a Fedora 10 Linux system with template SGML/XML (DocBook book). It's available on github / tLDP / LDP / users / Peter-Bieringer for contribution.


    1.5.1.1. Code line wrapping

    Code line wrapping is done using selfmade utility “lyxcodelinewrapper.pl”, you can get it from CVS for your own usage: TLDP-CVS / users / Peter-Bieringer


    1.5.1.2. SGML generation

    SGML/XML is generated using export function in LyX.


    1.5.2. On-line references to the HTML version of this HOWTO (linking/anchors)

    1.5.2.1. Master index page

    Generally, a reference to the master index page is recommended.


    1.5.2.2. Dedicated pages

    Because the HTML pages are generated out of the SGML file, the HTML filenames turn out to be quite random. However, some pages are tagged in LyX, resulting in static names. These tags are useful for references and shouldn't be changed in the future.

    If you think that I have forgotten a tag, please let me know, and I will add it.


    1.6. Preface

    Some things first:


    1.6.1. How many versions of a Linux & IPv6 related HOWTO are floating around?

    Including this, there are three (3) HOWTO documents available. Apologies, if that is too many ;-)


    1.6.1.1. Linux IPv6 FAQ/HOWTO (outdated)

    The first IPv6 related document was written by Eric Osborne and called Linux IPv6 FAQ/HOWTO (please use it only for historical issues). Latest version was 3.2.1 released July, 14 1997.

    Please help: if someone knows the date of birth of this HOWTO, please send me an e-mail (information will be needed in “history”).


    1.6.1.2. IPv6 & Linux - HowTo (maintained)

    There exists a second version called IPv6 & Linux - HowTo written by me (Peter Bieringer) in pure HTML. It was born April 1997 and the first English version was published in June 1997. I will continue to maintain it, but it will slowly fade (but not full) in favour of the Linux IPv6 HOWTO you are currently reading.


    1.6.1.3. Linux IPv6 HOWTO (this document)

    Because the IPv6 & Linux - HowTo is written in pure HTML it's not really compatible with the The Linux Documentation Project (TLDP). I (Peter Bieringer) got a request in late November 2001 to rewrite the IPv6 & Linux - HowTo in SGML. However, because of the discontinuation of that HOWTO (Future of IPv6 & Linux - HowTo), and as IPv6 is becoming more and more standard, I decided to write a new document covering basic and advanced issues which will remain important over the next few years. More dynamic and some advanced content will be still found further on in the second HOWTO (IPv6 & Linux - HowTo).


    1.7. Used terms, glossary and shortcuts

    1.7.1. Network related

    Base 10

    Well known decimal number system, represent any value with digit 0-9.

    Base 16

    Usually used in lower and higher programming languages, known also as hexadecimal number system, represent any value with digit 0-9 and char A-F (case insensitive).

    Base 85

    Representation of a value with 85 different digits/chars, this can lead to shorter strings but never seen in the wild.

    Bit

    Smallest storage unit, on/true (1) or off/false (0)

    Byte

    Mostly a collection of 8 (but not really a must - see older computer systems) bits

    Device

    Here, hardware of network connection, see also NIC

    Dual homed host

    A dual homed host is a node with two network (physical or virtual) interfaces on two different links, but does not forward any packets between the interfaces.

    Host

    Generally a single homed host on a link. Normally it has only one active network interface, e.g. Ethernet or (not and) PPP.

    Interface

    Mostly same as “device”, see also NIC

    IP Header

    Header of an IP packet (each network packet has a header, kind of is depending on network layer)

    Link

    A link is a layer 2 network packet transport medium, examples are Ethernet, Token Ring, PPP, SLIP, ATM, ISDN, Frame Relay,...

    Node

    A node is a host or a router.

    Octet

    A collection of 8 real bits, today also similar to “byte”.

    Port

    Information for the TCP/UDP dispatcher (layer 4) to transport information to upper layers

    Protocol

    Each network layer contains mostly a protocol field to make life easier on dispatching transported information to upper layer, seen in layer 2 (MAC) and 3 (IP)

    Router

    A router is a node with two or more network (physical or virtual) interfaces, capable of forwarding packets between the interfaces.

    Socket

    An IP socket is defined by source and destination IP addresses and Ports and (binding)

    Stack

    Network related a collection of layers

    Subnetmask

    IP networks uses bit masks to separate local networks from remote ones

    Tunnel

    A tunnel is typically a point-to-point connection over which packets are exchanged which carry the data of another protocol, e.g. an IPv6-in-IPv4 tunnel.


    1.7.1.1. Shortcuts

    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

    Project - a joint effort of six companies in Japan to provide a free IPv6 and IPsec (for both IPv4 and IPv6) stack for BSD variants to the world www.kame.net

    LIR

    Local Internet Registry

    NIC

    Network Interface Card

    RFC

    Request For Comments - set of technical and organizational notes about the Internet

    USAGI

    UniverSAl playGround for Ipv6 Project - works to deliver the production quality IPv6 protocol stack for the Linux system.


    1.7.2. Document related

    1.7.2.1. Long code line wrapping signal char

    The special character “¬” is used for signaling that this code line is wrapped for better viewing in PDF and PS files.


    1.7.2.2. Placeholders

    In generic examples you will sometimes find the following:

    <myipaddress>

    For real use on your system command line or in scripts this has to be replaced with relevant content (removing the < and > of course), the result would be e.g.

    1.2.3.4

    1.7.2.3. Commands in the shell

    Commands executable as non-root user begin with $, e.g.

    $ whoami

    Commands executable as root user begin with #, e.g.

    # whoami

    1.8. Requirements for using this HOWTO

    1.8.1. Personal prerequisites

    1.8.1.1. Experience with Unix tools

    You should be familiar with the major Unix tools e.g. grep, awk, find, ... , and know about their most commonly used command-line options.


    1.8.1.2. Experience with networking theory

    You should know about layers, protocols, addresses, cables, plugs, etc. If you are new to this field, here is one good starting point for you: http://www.rigacci.org/docs/biblio/online/intro_to_networking/book1.htm


    1.8.1.3. Experience with IPv4 configuration

    You should definitely have some experience in IPv4 configuration, otherwise it will be hard for you to understand what is really going on.


    1.8.1.4. Experience with the Domain Name System (DNS)

    Also you should understand what the Domain Name System (DNS) is, what it provides and how to use it.


    1.8.1.5. Experience with network debugging strategies

    You should at least understand how to use tcpdump and what it can show you. Otherwise, network debugging will very difficult for you.


    1.8.2. Linux operating system compatible hardware

    Surely you wish to experiment with real hardware, and not only read this HOWTO to fall asleep here and there. ;-7)


    Chapter 2. Basics

    2.1. What is IPv6?

    IPv6 is a new layer 3 protocol which will supersede IPv4 (also known as IP). IPv4 was designed a long time ago (RFC 760 / Internet Protocol from January 1980) and since its inception, there have been many requests for more addresses and enhanced capabilities. Latest RFC is RFC 2460 / Internet Protocol Version 6 Specification. Major changes in IPv6 are the redesign of the header, including the increase of address size from 32 bits to 128 bits. Because layer 3 is responsible for end-to-end packet transport using packet routing based on addresses, it must include the new IPv6 addresses (source and destination), like IPv4.

    For more information about the IPv6 history take a look at older IPv6 related RFCs listed e.g. at SWITCH IPv6 Pilot / References.


    2.2. History of IPv6 in Linux

    The years 1992, 1993 and 1994 of the IPv6 History (in general) are covered by the following document: IPv6 or IPng (IP next generation).

    To-do: better time-line, more content...


    2.2.1. Beginning

    The first IPv6 related network code was added to the Linux kernel 2.1.8 in November 1996 by Pedro Roque. It was based on the BSD API:

    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 
    -+ * <draft-ietf-ipngwg-bsd-api-05.txt>

    The shown lines were copied from patch-2.1.8 (e-mail address was blanked on copy&paste).


    2.2.2. In between

    Because of lack of manpower, the IPv6 implementation in the kernel was unable to follow the discussed drafts or newly released RFCs. In October 2000, a project was started in Japan, called USAGI, whose aim was to implement all missing, or outdated IPv6 support in Linux. It tracks the current IPv6 implementation in FreeBSD made by the KAME project. From time to time they create snapshots against current vanilla Linux kernel sources.

    Until kernel development series 2.5.x was started, the USAGI patch was so big, that Linux networking maintainers were unable to include it completly in the production source of the Linux kernel 2.4.x series.

    During kernel development series 2.5.x, USAGI tried to insert all of their current extensions into this.


    2.2.3. Current

    Many of the long-term developed IPv6 related patches by USAGI and others are integrated into vanilla kernel series 2.6.x.


    2.2.4. Future

    USAGI and others are still working on implementation of newer features like mobililty and others. From time to time, new extension patches are released and also integration into vanilla kernel series is made.


    2.3. What do IPv6 addresses look like?

    As previously mentioned, IPv6 addresses are 128 bits long. This number of bits generates very high decimal numbers with up to 39 digits:

    2^128-1: 340282366920938463463374607431768211455

    Such numbers are not really addresses that can be memorized. Also the IPv6 address schema is bitwise oriented (just like IPv4, but that's not often recognized). Therefore a better notation of such big numbers is hexadecimal. In hexadecimal, 4 bits (also known as “nibble”) are represented by a digit or character from 0-9 and a-f (10-15). This format reduces the length of the IPv6 address to 32 characters.

    2^128-1: 0xffffffffffffffffffffffffffffffff

    This representation is still not very convenient (possible mix-up or loss of single hexadecimal digits), so the designers of IPv6 chose a hexadecimal format with a colon as separator after each block of 16 bits. In addition, the leading "0x" (a signifier for hexadecimal values used in programming languages) is removed:

    2^128-1: ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff

    A usable address (see address types later) is e.g.:

    2001:0db8:0100:f101:0210:a4ff:fee3:9566

    For simplifications, leading zeros of each 16 bit block can be omitted:

    2001:0db8:0100:f101:0210:a4ff:fee3:9566  -> 
    -¬ 2001:db8:100:f101:210:a4ff:fee3:9566

    One sequence of 16 bit blocks containing only zeroes can be replaced with “::“. But not more than one at a time, otherwise it is no longer a unique representation.

    2001:0db8:100:f101:0:0:0:1  ->  2001:db8:100:f101::1

    The biggest reduction is seen by the IPv6 localhost address:

    0000:0000:0000:0000:0000:0000:0000:0001  ->  ::1

    There is also a so-called compact (base85 coded) representation defined in RFC 1924 / A Compact Representation of IPv6 Addresses (published on 1. April 1996), never seen in the wild, probably an April fool's joke, but here is an example:

    # ipv6calc --addr_to_base85 2001:0db8:0100:f101:0210:a4ff:fee3:9566 
    -9R}vSQZ1W=9A_Q74Lz&R

    Info: ipv6calc is an IPv6 address format calculator and converter program and can be found here: ipv6calc homepage (Mirror)


    2.4. FAQ (Basics)

    2.4.1. Why is the name IPv6 and not IPv5 as successor for IPv4?

    On any IP header, the first 4 bits are reserved for protocol version. So theoretically a protocol number between 0 and 15 is possible:

    The next free number was 6. Hence IPv6 was born!


    2.4.2. IPv6 addresses: why such a high number of bits?

    During the design of IPv4, people thought that 32 bits were enough for the world. Looking back into the past, 32 bits were enough until now and will perhaps be enough for another few years. However, 32 bits are not enough to provide each network device with a global address in the future. Think about mobile phones, cars (including electronic devices on its CAN-bus), toasters, refrigerators, light switches, and so on...

    So designers have chosen 128 bits, 4 times more in length than in IPv4 today.

    The usable size is smaller than it may appear however. This is because in the currently defined address schema, 64 bits are used for interface identifiers. The other 64 bits are used for routing. Assuming the current strict levels of aggregation (/48, /32, ...), it is still possible to “run out” of space, but hopefully not in the near future.

    See also for more information RFC 1715 / The H Ratio for Address Assignment Efficiency and RFC 3194 / The Host-Density Ratio for Address Assignment Efficiency.


    2.4.3. IPv6 addresses: why so small a number of bits on a new design?

    While, there are (possibly) some people (only know about Jim Fleming...) on the Internet who are thinking about IPv8 and IPv16, their design is far away from acceptance and implementation. In the meantime 128 bits was the best choice regarding header overhead and data transport. Consider the minimum Maximum Transfer Unit (MTU) in IPv4 (576 octets) and in IPv6 (1280 octets), the header length in IPv4 is 20 octets (minimum, can increase to 60 octets with IPv4 options) and in IPv6 is 40 octets (fixed). This is 3.4 % of minimum MTU in IPv4 and 3.1 % of minimum MTU in IPv6. This means the header overhead is almost equal. More bits for addresses would require bigger headers and therefore more overhead. Also, consider the maximum MTU on normal links (like Ethernet today): it's 1500 octets (in special cases: 9k octets using Jumbo frames). Ultimately, it wouldn't be a proper design if 10 % or 20 % of transported data in a Layer-3 packet were used for addresses and not for payload.


    Chapter 3. Address types

    Like IPv4, IPv6 addresses can be split into network and host parts using subnet masks.

    IPv4 has shown that sometimes it would be nice, if more than one IP address can be assigned to an interface, each for a different purpose (aliases, multi-cast). To remain extensible in the future, IPv6 is going further and allows more than one IPv6 address to be assigned to an interface. There is currently no limit defined by an RFC, only in the implementation of the IPv6 stack (to prevent DoS attacks).

    Using this large number of bits for addresses, IPv6 defines address types based on some leading bits, which are hopefully never going to be broken in the future (unlike IPv4 today and the history of class A, B, and C).

    Also the number of bits are separated into a network part (upper 64 bits) and a host part (lower 64 bits), to facilitate auto-configuration.


    3.1. Addresses without a special prefix

    3.1.1. Localhost address

    This is a special address for the loopback interface, similiar to IPv4 with its “127.0.0.1”. With IPv6, the localhost address is:

    0000:0000:0000:0000:0000:0000:0000:0001 

    or compressed:

    ::1

    Packets with this address as source or destination should never leave the sending host.


    3.1.2. Unspecified address

    This is a special address like “any” or “0.0.0.0” in IPv4 . For IPv6 it's:

    0000:0000:0000:0000:0000:0000:0000:0000 

    or:

    ::

    These addresses are mostly used/seen in socket binding (to any IPv6 address) or routing tables.

    Note: the unspecified address cannot be used as destination address.


    3.1.3. IPv6 address with embedded IPv4 address

    There are two addresses which contain an IPv4 address.


    3.1.3.1. IPv4-mapped IPv6 address

    IPv4-only IPv6-compatible addresses are sometimes used/shown for sockets created by an IPv6-enabled daemon, but only binding to an IPv4 address.

    These addresses are defined with a special prefix of length 96 (a.b.c.d is the IPv4 address):

    0:0:0:0:0:ffff:a.b.c.d/96

    or in compressed format

    ::ffff:a.b.c.d/96

    For example, the IPv4 address 1.2.3.4 looks like this:

    ::ffff:1.2.3.4

    3.1.3.2. IPv4-compatible IPv6 address

    IPv4-compatible IPv6 addresses are used for automatic tunneling (RFC 2893 / Transition Mechanisms for IPv6 Hosts and Routers), which is being replaced by 6to4 tunneling.

    0:0:0:0:0:0:a.b.c.d/96

    or in compressed format

    ::a.b.c.d/96

    3.2. Network part, also known as prefix

    Designers defined some address types and left a lot of scope for future definitions as currently unknown requirements arise. RFC 4291 / IP Version 6 Addressing Architecture defines the current addressing scheme.

    Now lets take a look at the different types of prefixes (and therefore address types):


    3.2.1. Link local address type

    These are special addresses which will only be valid on a link of an interface. Using this address as destination the packet would never pass through a router. It's used for link communications such as:

    • anyone else here on this link?

    • anyone here with a special address (e.g. looking for a router)?

    They begin with ( where “x” is any hex character, normally “0”)

    fe8x:  <- currently the only one in use
    -fe9x:
    -feax:
    -febx:

    An address with this prefix is found on each IPv6-enabled interface after stateless auto-configuration (which is normally always the case).


    3.2.2. Site local address type

    These are addresses similar to the RFC 1918 / Address Allocation for Private Internets in IPv4 today, with the added advantage that everyone who use this address type has the capability to use the given 16 bits for a maximum number of 65536 subnets. Comparable with the 10.0.0.0/8 in IPv4 today.

    Another advantage: because it's possible to assign more than one address to an interface with IPv6, you can also assign such a site local address in addition to a global one.

    It begins with:

    fecx:  <- most commonly used
    -fedx:
    -feex:
    -fefx:

    (where “x” is any hex character, normally “0”)

    This address type is now deprecated RFC 3879 / Deprecating Site Local Addresses, but for a test in a lab, such addresses are still a good choice in my humble opinion.


    3.2.3. Unique Local IPv6 Unicast Addresses

    Because the original defined site local addresses are not unique, this can lead to major problems, if two former independend networks would be connected later (overlapping of subnets). This and other issues lead to a new address type named RFC 4193 / Unique Local IPv6 Unicast Addresses.

    It begins with:

    fcxx:
    -fdxx:  <- currently the only one in use

    A part of the prefix (40 bits) are generated using a pseudo-random algorithm and it's improbable, that two generated ones are equal.

    Example for a prefix (generated using a web-based tool: Goebel Consult / createLULA):

    fd0f:8b72:ac90::/48

    3.2.4. Global address type "(Aggregatable) global unicast"

    Today, there is one global address type defined (the first design, called "provider based," was thrown away some years ago RFC 1884 / IP Version 6 Addressing Architecture [obsolete], you will find some remains in older Linux kernel sources).

    It begins with (x are hex characters)

    2xxx: 
    -3xxx:

    Note: the prefix “aggregatable” is thrown away in current drafts. -There are some further subtypes defined, see below:


    3.2.4.1. 6bone test addresses

    These were the first global addresses which were defined and in use. They all start with

    3ffe:

    Example:

    3ffe:ffff:100:f102::1

    A special 6bone test address which will never be globally unique begins with

    3ffe:ffff: 

    and is mostly shown in older examples. The reason for this is, if real addresses are are shown, it's possible for someone to do a copy & paste to their configuration files, thus inadvertently causing duplicates on a globally unique address. This would cause serious problems for the original host (e.g. getting answer packets for request that were never sent). -Because IPv6 is now in production, this prefix is no longer be delegated and is removed from routing after 6.6.2006 (see RFC 3701 / 6bone Phaseout for more).


    3.2.4.2. 6to4 addresses

    These addresses, designed for a special tunneling mechanism [RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds and RFC 2893 / Transition Mechanisms for IPv6 Hosts and Routers], encode a given IPv4 address and a possible subnet and begin with

    2002:

    For example, representing 192.168.1.1/5:

    2002:c0a8:0101:5::1

    A small shell command line can help you generating such address out of a given IPv4 one:

    ipv4="1.2.3.4"; sla="5"; printf "2002:%02x%02x:%02x%02x:%04x::1" `echo $ipv4
    -¬ | tr "." " "` $sla

    See also tunneling using 6to4 and information about 6to4 relay routers.


    3.2.4.3. Assigned by provider for hierarchical routing

    These addresses are delegated to Internet service providers (ISP) and begin currently with

    2001:

    Prefixes to major (backbone owning) ISPs (also known as LIRs) are delegated by local registries and currently have a prefix with length 32 assigned.

    Any ISP customer can get a prefix with length 48.


    3.2.4.4. Addresses reserved for examples and documentation

    Currently, two address ranges are reserved for examples and documentation RFC 3849 / IPv6 Address Prefix Reserved for Documentation:

    3fff:ffff::/32
    -2001:0DB8::/32   EXAMPLENET-WF

    These address ranges should be filtered based on source addresses and should NOT be routed on border routers to the internet, if possible.


    3.2.5. Multicast addresses

    Multicast addresses are used for related services.

    They alway start with (xx is the scope value)

    ffxy:

    They are split into scopes and types:


    3.2.5.1. Multicast scopes

    Multicast scope is a parameter to specify the maximum distance a multicast packet can travel from the sending entity.

    Currently, the following regions (scopes) are defined:

    • ffx1: node-local, packets never leave the node.

    • ffx2: link-local, packets are never forwarded by routers, so they never leave the specified link.

    • ffx5: site-local, packets never leave the site.

    • ffx8: organization-local, packets never leave the organization (not so easy to implement, must be covered by routing protocol).

    • ffxe: global scope.

    • others are reserved


    3.2.5.2. Multicast types

    There are many types already defined/reserved (see RFC 4291 / IP Version 6 Addressing Architecture for details). Some examples are:

    • All Nodes Address: ID = 1h, addresses all hosts on the local node (ff01:0:0:0:0:0:0:1) or the connected link (ff02:0:0:0:0:0:0:1).

    • All Routers Address: ID = 2h, addresses all routers on the local node (ff01:0:0:0:0:0:0:2), on the connected link (ff02:0:0:0:0:0:0:2), or on the local site (ff05:0:0:0:0:0:0:2)


    3.2.5.3. Solicited node link-local multicast address

    Special multicast address used as destination address in neighborhood discovery, because unlike in IPv4, ARP no longer exists in IPv6.

    An example of this address looks like

    ff02::1:ff00:1234

    Used prefix shows that this is a link-local multicast address. The suffix is generated from the destination address. In this example, a packet should be sent to address “fe80::1234”, but the network stack doesn't know the current layer 2 MAC address. It replaces the upper 104 bits with “ff02:0:0:0:0:1:ff00::/104” and leaves the lower 24 bits untouched. This address is now used `on-link' to find the corresponding node which has to send a reply containing its layer 2 MAC address.


    3.2.6. Anycast addresses

    Anycast addresses are special addresses and are used to cover things like nearest DNS server, nearest DHCP server, or similar dynamic groups. Addresses are taken out of the unicast address space (aggregatable global or site-local at the moment). The anycast mechanism (client view) will be handled by dynamic routing protocols.

    Note: Anycast addresses cannot be used as source addresses, they are only used as destination addresses.


    3.2.6.1. Subnet-router anycast address

    A simple example for an anycast address is the subnet-router anycast address. Assuming that a node has the following global assigned IPv6 address:

    2001:db8:100:f101:210:a4ff:fee3:9566/64  <- Node's address

    The subnet-router anycast address will be created blanking the suffix (least significant 64 bits) completely:

    2001:db8:100:f101::/64  <- subnet-router anycast address

    3.3. Address types (host part)

    For auto-configuration and mobility issues, it was decided to use the lower 64 bits as the host part of the address in most of the current address types. Therefore each single subnet can hold a large amount of addresses.

    This host part can be inspected differently:


    3.3.1. Automatically computed (also known as stateless)

    With auto-configuration, the host part of the address is computed by converting the MAC address of an interface (if available), with the EUI-64 method, to a unique IPv6 address. If no MAC address is available for this device (happens e.g. on virtual devices), something else (like the IPv4 address or the MAC address of a physical interface) is used instead.

    E.g. a NIC has following MAC address (48 bit):

    00:10:a4:01:23:45

    This would be expanded according to theIEEE-Tutorial EUI-64 design for EUI-48 identifiers to the 64 bit interface identifier:

    0210:a4ff:fe01:2345

    With a given prefix, the result is the IPv6 address shown in example above:

    2001:0db8:0100:f101:0210:a4ff:fe01:2345

    3.3.1.1. Privacy problem with automatically computed addresses and a solution

    Because the "automatically computed" host part is globally unique (except when a vendor of a NIC uses the same MAC address on more than one NIC), client tracking is possible on the host when not using a proxy of any kind.

    This is a known problem, and a solution was defined: privacy extension, defined in RFC 3041 / Privacy Extensions for Stateless Address Autoconfiguration in IPv6 (there is also already a newer draft available: draft-ietf-ipv6-privacy-addrs-v2-*). Using a random and a static value a new suffix is generated from time to time. Note: this is only reasonable for outgoing client connections and isn't really useful for well-known servers.


    3.3.2. Manually set

    For servers, it's probably easier to remember simpler addresses, this can also be accommodated. It is possible to assign an additional IPv6 address to an interface, e.g.

    2001:0db8:100:f101::1

    For manual suffixes like “::1” shown in the above example, it's required that the 7th most significant bit is set to 0 (the universal/local bit of the automatically generated identifier). Also some other (otherwise unchosen ) bit combinations are reserved for anycast addresses, too.


    3.4. Prefix lengths for routing

    In the early design phase it was planned to use a fully hierarchical routing approach to reduce the size of the routing tables maximally. The reasons behind this approach were the number of current IPv4 routing entries in core routers (> 400 thousand in 2013), reducing the need of memory in hardware routers (ASIC “Application Specified Integrated Circuit” driven) to hold the routing table and increase speed (fewer entries hopefully result in faster lookups).

    Todays view is that routing will be mostly hierarchically designed for networks with only one service provider. With more than one ISP connections, this is not possible, and subject to an issue named multi-homing (infos on multi-homing: drafts-ietf-multi6-*,IPv6 Multihoming Solutions).


    3.4.1. Prefix lengths (also known as "netmasks")

    Similar to IPv4, the routable network path for routing to take place. Because standard netmask notation for 128 bits doesn't look nice, designers employed the IPv4 Classless Inter Domain Routing (CIDR, RFC 1519 / Classless Inter-Domain Routing) scheme, which specifies the number of bits of the IP address to be used for routing. It is also called the "slash" notation.

    An example:

    2001:0db8:100:1:2:3:4:5/48

    This notation will be expanded:

    • Network:

    2001:0db8:0100:0000:0000:0000:0000:0000

    • Netmask:

    ffff:ffff:ffff:0000:0000:0000:0000:0000

    3.4.2. Matching a route

    Under normal circumstances (no QoS), a lookup in a routing table results in the route with the most significant number of address bits being selected. In other words, the route with the biggest prefix length matches first.

    For example if a routing table shows following entries (list is not complete):

    2001:0db8:100::/48     ::            U  1 0 0 sit1 
    -2000::/3               ::192.88.99.1 UG 1 0 0 tun6to4

    Shown destination addresses of IPv6 packets will be routed through shown device

    2001:0db8:100:1:2:3:4:5/48  ->  routed through device sit1
    -2001:0db8:200:1:2:3:4:5/48  ->  routed through device tun6to4

    Chapter 4. IPv6-ready system check

    Before you can start using IPv6 on a Linux host, you have to test, whether your system is IPv6-ready. You may have to do some work to enable it first.


    4.1. IPv6-ready kernel

    Modern Linux distributions already contain IPv6-ready kernels, the IPv6 capability is generally compiled as a module, but it's possible that this module is not loaded automatically on startup.

    Note: you shouldn't anymore use kernel series 2.2.x, because it's not IPv6-up-to-date anymore. Also the IPv6 support in series 2.4.x is no longer improved according to definitions in latest RFCs. It's recommend to use series 2.6.x now.


    4.1.1. Check for IPv6 support in the current running kernel

    To check, whether your current running kernel supports IPv6, take a look into your /proc-file-system. Following entry must exists:

    /proc/net/if_inet6

    A short automatical test looks like:

    # test -f /proc/net/if_inet6 && echo "Running kernel is IPv6 ready"

    If this fails, it is quite likely, that the IPv6 module is not loaded.


    4.1.2. Try to load IPv6 module

    You can try to load the IPv6 module executing

    # modprobe ipv6

    If this is successful, this module should be listed, testable with following auto-magically line:

    # lsmod |grep -w 'ipv6' && echo "IPv6 module successfully loaded"

    And the check shown above should now run successfully.

    Note: unloading the module is currently not supported and can result, under some circumstances, in a kernel crash.


    4.1.2.1. Automatically loading of module

    Its possible to automatically load the IPv6 module on demand. You only have to add following line in the configuration file of the kernel module loader (normally /etc/modules.conf or /etc/conf.modules):

    alias net-pf-10 ipv6  # automatically load IPv6 module on demand

    It's also possible to disable automatically loading of the IPv6 module using following line

    alias net-pf-10 off   # disable automatically load of IPv6 module on demand

    Additional note: in kernels series 2.6.x, the module loader mechanism was changed. The new configuration file has to be named /etc/modprobe.conf instead of /etc/modules.conf.


    4.1.3. Compile kernel with IPv6 capabilities

    If both above shown results were negative and your kernel has no IP6 support, than you have the following options:

    • Update your distribution to a current one which supports IPv6 out-of-the-box (recommended for newbies)

    • Compile a new vanilla kernel (easy, if you know which options you needed)

    • Recompile kernel sources given by your Linux distribution (sometimes not so easy)

    • Compile a kernel with USAGI extensions

    If you decide to compile a kernel, you should have previous experience in kernel compiling and read the Linux Kernel HOWTO.

    A comparison between vanilla and USAGI extended kernels is available on IPv6+Linux-Status-Kernel.


    4.1.3.1. Compiling a vanilla kernel

    More detailed hints about compiling an IPv6-enabled kernel can be found e.g. on IPv6-HOWTO-2#kernel.

    Note: you should use whenever possible kernel series 2.6.x or above, because the IPv6 support in series 2.4.x only will no longer get backported features from 2.6.x and IPv6 support in series 2.2.x is hopeless outdated.


    4.1.3.2. Compiling a kernel with USAGI extensions

    Same as for vanilla kernel, only recommend for advanced users, which are already familiar with IPv6 and kernel compilation. See also USAGI project / FAQ and Obtaining the best IPv6 support with Linux (Article) (Mirror).


    4.1.4. IPv6-ready network devices

    Not all existing network devices have already (or ever) the capability to transport IPv6 packets. A current status can be found at IPv6+Linux-status-kernel.html#transport.

    A major issue is that because of the network layer structure of kernel implementation an IPv6 packet isn't really recognized by it's IP header number (6 instead of 4). It's recognized by the protocol number of the Layer 2 transport protocol. Therefore any transport protocol which doesn't use such protocol number cannot dispatch IPv6 packets. Note: the packet is still transported over the link, but on receivers side, the dispatching won't work (you can see this e.g. using tcpdump).


    4.1.4.1. Currently known never “IPv6 capable links”

    • Serial Line IP (SLIP, RFC 1055 / SLIP), should be better called now to SLIPv4, device named: slX

    • Parallel Line IP (PLIP), same like SLIP, device names: plipX

    • ISDN with encapsulation rawip, device names: isdnX


    4.1.4.2. Currently known “not supported IPv6 capable links”

    • ISDN with encapsulation syncppp, device names: ipppX (design issue of the ipppd, will be merged into more general PPP layer in kernel series 2.5.x)


    4.2. IPv6-ready network configuration tools

    You wont get very far, if you are running an IPv6-ready kernel, but have no tools to configure IPv6. There are several packages in existence which can configure IPv6.


    4.2.1. net-tools package

    The net-tool package includes some tools like ifconfig and route, which helps you to configure IPv6 on an interface. Look at the output of ifconfig -? or route -?, if something is shown like IPv6 or inet6, then the tool is IPv6-ready.

    Auto-magically check:

    # /sbin/ifconfig -? 2>& 1|grep -qw 'inet6' && echo "utility 'ifconfig' is
    -¬ IPv6-ready"

    Same check can be done for route:

    # /sbin/route -? 2>& 1|grep -qw 'inet6' && echo "utility 'route' is IPv6-ready"

    4.2.2. iproute package

    Alexey N. Kuznetsov (current a maintainer of the Linux networking code) created a tool-set which configures networks through the netlink device. Using this tool-set you have more functionality than net-tools provides, but its not very well documented and isn't for the faint of heart.

    # /sbin/ip 2>&1 |grep -qw 'inet6' && echo "utility 'ip' is IPv6-ready"

    If the program /sbin/ip isn't found, then I strongly recommend you install the iproute package.

    • You can get it from your Linux distribution (if contained)

    • You're able to look for a proper RPM package at RPMfind/iproute (sometimes rebuilding of a SRPMS package is recommended)


    4.3. IPv6-ready test/debug programs

    After you have prepared your system for IPv6, you now want to use IPv6 for network communications. First you should learn how to examine IPv6 packets with a sniffer program. This is strongly recommended because for debugging/troubleshooting issues this can aide in providing a diagnosis very quickly.


    4.3.1. IPv6 ping

    This program is normally included in package iputils. It is designed for simple transport tests sending ICMPv6 echo-request packets and wait for ICMPv6 echo-reply packets.

    Usage

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

    Some implementation also support %<device> suffix instead of using -I <device>, e.g.

    # ping6 <link-local-ipv6address>%<device>

    Example

    # 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

    Hint: ping6 needs raw access to socket and therefore root permissions. So if non-root users cannot use ping6 then there are two possible problems:

    1. ping6 is not in users path (probably, because ping6 is generally stored in /usr/sbin -> add path (not really recommended)

    2. ping6 doesn't execute properly, generally because of missing root permissions -> chmod u+s /usr/sbin/ping6


    4.3.1.1. Specifying interface for IPv6 ping

    Using link-local addresses for an IPv6 ping, the kernel does not know through which (physically or virtual) device it must send the packet - each device has a link-local address. A try will result in following error message:

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

    In this case you have to specify the interface additionally like shown here:

    # 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

    Example for %<device> notation:

    # ping6 -c 1 fe80::2e0:18ff:fe90:9205%eth0

    4.3.1.2. Ping6 to multicast addresses

    An interesting mechanism to detect IPv6-active hosts on a link is to ping6 to the link-local all-node multicast address:

    # 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!) 

    Example for %<device> notation:

    # ping6 ff02::1%eth0

    Unlike in IPv4, where replies to a ping on the broadcast address can be disabled, in IPv6 currently this behavior cannot be disable except by local IPv6 firewalling.


    4.3.2. IPv6 traceroute6

    This program is normally included in package iputils. It's a program similar to IPv4 traceroute. Below you will see an example:

    # traceroute6 www.6bone.net 
    -traceroute to 6bone.net (3ffe:b00:c18:1::10) from 2001:0db8:0000:f101::2, 30
    -¬ hops max, 16 byte packets 
    - 1 localipv6gateway (2001:0db8: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

    Note: unlike some modern versions of IPv4 traceroute, which can use ICMPv4 echo-request packets as well as UDP packets (default), current IPv6-traceroute is only able to send UDP packets. As you perhaps already know, ICMP echo-request packets are more accepted by firewalls or ACLs on routers inbetween than UDP packets.

    If a dedicated interface must be specified, this can be done by -i <device> or using <address>%<device>.


    4.3.3. IPv6 tracepath6

    This program is normally included in package iputils. It's a program like traceroute6 and traces the path to a given destination discovering the MTU along this path. Below you will see an example:

    # 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. IPv6 tcpdump

    On Linux, tcpdump is the major tool for packet capturing. Below you find some examples. IPv6 support is normally built-in in current releases of version 3.6.

    tcpdump uses expressions for filtering packets to minimize the noise:

    • icmp6: filters native ICMPv6 traffic

    • ip6: filters native IPv6 traffic (including ICMPv6)

    • proto ipv6: filters tunneled IPv6-in-IPv4 traffic

    • not port ssh: to suppress displaying SSH packets for running tcpdump in a remote SSH session

    Also some command line options are very useful to catch and print more information in a packet, mostly interesting for digging into ICMPv6 packets:

    • “-s 512”: increase the snap length during capturing of a packet to 512 bytes

    • “-vv”: really verbose output

    • “-n”: don't resolve addresses to names, useful if reverse DNS resolving isn't working proper


    4.3.4.1. IPv6 ping to 2001:0db8:100:f101::1 native over a local link

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

    4.3.4.2. IPv6 ping to 2001:0db8:100::1 routed through an IPv6-in-IPv4-tunnel

    1.2.3.4 and 5.6.7.8 are tunnel endpoints (all addresses are examples)

    # 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 > 2001:0db8:100::1: icmp6: echo request
    -¬ (len 64, hlim 64) (DF) (ttl 64, id 0, len 124) 
    -5.6.7.8 > 1.2.3.4: 2001:0db8: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 > 2001:0db8:100::1: icmp6: echo request
    -¬ (len 64, hlim 64) (DF) (ttl 64, id 0, len 124) 
    -5.6.7.8 > 1.2.3.4: 2001:0db8:100::1 > 2002:ffff:f5f8::1: icmp6: echo reply (len
    -¬ 64, hlim 61) (ttl 23, id 29919, len 124)

    4.4. IPv6-ready programs

    Current distributions already contain the most needed IPv6 enabled client and servers. See first on IPv6+Linux-Status-Distribution. If still not included, you can check Current Status of IPv6 Support for Networking Applications whether the program is already ported to IPv6 and usable with Linux. For common used programs there are some hints available here later in this document.


    4.5. IPv6-ready client programs (selection)

    To run the following shown tests, it's required that your system is IPv6 enabled, and some examples show addresses which only can be reached if a connection to the global IPv6 network is available.

    Note: if using names instead of dedicated IPv4/IPv6 addresses which resolves to IPv4 and IPv6 addresses, some command line clients support explicitly use of specified protocol. Usually such clients have option “-4” for IPv4 and “-6” for IPv6.


    4.5.1. Checking DNS for resolving IPv6 addresses

    Because of security updates in the last years every Domain Name System (DNS) server should run newer software which already understands the (intermediate) IPv6 address-type AAAA (the newer one named A6 isn't still common at the moment because only supported using BIND9 and newer and also the non-existent support of root domain IP6.ARPA). A simple test whether the used system can resolve IPv6 addresses is

    # host -t AAAA www.join.uni-muenster.de

    and should show something like following:

    www.join.uni-muenster.de. is an alias for tolot.join.uni-muenster.de. 
    -tolot.join.uni-muenster.de. has AAAA address
    -¬ 2001:638:500:101:2e0:81ff:fe24:37c6

    4.5.2. IPv6-ready telnet clients

    IPv6-ready telnet clients are available. A simple test can be done with

    $ 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.

    If the telnet client don't understand the IPv6 address and says something like “cannot resolve hostname”, then it's not IPv6-enabled.


    4.5.3. IPv6-ready ssh clients

    4.5.3.1. openssh

    Current versions of openssh are IPv6-ready. Depending on configuring before compiling it has two behavior.

    • --without-ipv4-default: the client tries an IPv6 connect first automatically and fall back to IPv4 if not working

    • --with-ipv4-default: default connection is IPv4, IPv6 connection must be force like following example shows

    $ ssh -6 ::1 
    -user@::1's password: ****** 
    -[user@ipv6host user]$

    If your ssh client doesn't understand the option “-6” then it's not IPv6-enabled, like most ssh version 1 packages.


    4.5.3.2. ssh.com

    SSH.com's SSH client and server is also IPv6 aware now and is free for all Linux and FreeBSD machine regardless if used for personal or commercial use.


    4.5.4. IPv6-ready web browsers

    A current status of IPv6 enabled web browsers is available at Current Status of IPv6 Support for Networking Applications - HTTP.

    Most of them have unresolved problems at the moment

    1. If using an IPv4 only proxy in the settings, IPv6 requests will be sent to the proxy, but the proxy will fail to understand the request and the request fails. Solution: update proxy software (see later).

    2. Automatic proxy settings (*.pac) cannot be extended to handle IPv6 requests differently (e.g. don't use proxy) because of their nature (written in Java-script and well hard coded in source like to be seen in Mozilla source code).

    Also older versions don't understand an URL with IPv6 encoded addresses like http://[2001:4dd0:f838:a006::6]/, IPv6 address of http://www.ipv6.bieringer.de/ (this given URLs only works with an IPv6-enabled browser!).

    A short test is to try shown URL with a given browser and using no proxy.


    4.5.4.1. URLs for testing

    A good starting point for browsing using IPv6 is http://www.kame.net/. If the turtle on this page is animated, the connection is via IPv6, otherwise the turtle is static.

    Other test servers are e.g.


    4.6. IPv6-ready server programs

    In this part of this HOWTO, more client specific issues are mentioned. Therefore hints for IPv6-ready servers like sshd, httpd, telnetd, etc. are shown below in Hints for IPv6-enabled daemons.


    4.7. FAQ (IPv6-ready system check)

    4.7.1. Using tools

    4.7.1.1. Q: Cannot ping6 to link-local addresses

    Error message: "connect: Invalid argument"

    Kernel doesn't know, which physical or virtual link you want to use to send such ICMPv6 packets. Therefore it displays this error message.

    Solution: Specify interface like: “ping6 -I eth0 fe80::2e0:18ff:fe90:9205”, see also program ping6 usage.


    4.7.1.2. Q: Cannot ping6 or traceroute6 as normal user

    Error message: “icmp socket: Operation not permitted

    These utilities create special ICMPv6 packets and send them out. This is done by using raw sockets in the kernel. But raw sockets can only be used by the “root” user. Therefore normal users get such error message.

    Solution: If it's really needed that all users should be able to use these utilities, you can add the “suid” bit using ”chmod u+s /path/to/program”, see also program ping6 usage. If not all users should be able to, you can change the group of the program to e.g. “wheel”, add these power users to this group and remove the execution bit for other users using “chmod o-rwx /path/to/program”. Or configure “sudo” to enable your security policy.


    Chapter 5. Configuring interfaces

    5.1. Different network devices

    On a node, there exist different network devices. They can be collected in classes

    • Physically bounded, like eth0, tr0

    • Virtually existing, like ppp0, tun0, tap0, sit0, isdn0, ippp0


    5.1.1. Physically bounded

    Physically bounded interfaces like Ethernet or Token-Ring are normal ones and need no special treatment.


    5.1.2. Virtually bounded

    Virtually bounded interfaces always need special support


    5.1.2.1. IPv6-in-IPv4 tunnel interfaces

    These interfaces are normally named sitx. The name sit is a shortcut for Simple Internet Transition. This device has the capability to encapsulate IPv6 packets into IPv4 ones and tunnel them to a foreign endpoint.

    sit0 has a special meaning and cannot be used for dedicated tunnels.


    5.1.2.2. PPP interfaces

    PPP interfaces get their IPv6 capability from an IPv6 enabled PPP daemon.


    5.1.2.3. ISDN HDLC interfaces

    IPv6 capability for HDLC with encapsulation ip is already built-in in the kernel


    5.1.2.4. ISDN PPP interfaces

    ISDN PPP interfaces (ippp) aren't IPv6 enabled by kernel. Also there are also no plans to do that because in kernel 2.5.+ they will be replaced by a more generic ppp interface layer.


    5.1.2.5. SLIP + PLIP

    Like mentioned earlier, this interfaces don't support IPv6 transport (sending is OK, but dispatching on receiving don't work).


    5.1.2.6. Ether-tap device

    Ether-tap devices are IPv6-enabled and also stateless configured. For use, the module “ethertap” has to be loaded before.


    5.1.2.7. tun devices

    Currently not tested by me.


    5.1.2.8. ATM

    01/2002: Aren't currently supported by vanilla kernel, supported by USAGI extension


    5.1.2.9. Others

    Did I forget an interface?...


    5.2. Bringing interfaces up/down

    Two methods can be used to bring interfaces up or down.


    5.2.1. Using "ip"

    Usage:

    # ip link set dev <interface> up
    -# ip link set dev <interface> down

    Example:

    # ip link set dev eth0 up
    -# ip link set dev eth0 down

    5.2.2. Using "ifconfig"

    Usage:

    # /sbin/ifconfig <interface> up
    -# /sbin/ifconfig <interface> down

    Example:

    # /sbin/ifconfig eth0 up
    -# /sbin/ifconfig eth0 down

    Chapter 6. Configuring IPv6 addresses

    There are different ways to configure an IPv6 address on an interface. You can use use "ifconfig" or "ip".


    6.1. Displaying existing IPv6 addresses

    First you should check, whether and which IPv6 addresses are already configured (perhaps auto-magically during stateless auto-configuration).

    Just note that addresses beginning with “fec0” are deprecated, but shown here for completness!


    6.1.1. Using "ip"

    Usage:

    # /sbin/ip -6 addr show dev <interface>

    Example for a static configured host:

    # /sbin/ip -6 addr show dev eth0
    -2: eth0: <BROADCAST,MULTICAST,UP&gt; mtu 1500 qdisc pfifo_ fast qlen 100
    -inet6 fe80::210:a4ff:fee3:9566/10 scope link
    -inet6 2001:0db8:0:f101::1/64 scope global
    -inet6 fec0:0:0:f101::1/64 scope site 

    Example for a host which is auto-configured

    Here you see some auto-magically configured IPv6 addresses and their lifetime.

    # /sbin/ip -6 addr show dev eth0 
    -3: eth0: <BROADCAST,MULTICAST,PROMISC,UP&gt; mtu 1500 qdisc pfifo_fast qlen
    -¬ 100 
    -inet6 2002:d950:f5f8:f101:2e0:18ff:fe90:9205/64 scope global dynamic 
    -valid_lft 16sec preferred_lft 6sec 
    -inet6 3ffe:400:100:f101:2e0:18ff:fe90:9205/64 scope global dynamic 
    -valid_lft 2591997sec preferred_lft 604797sec inet6 fe80::2e0:18ff:fe90:9205/10
    -¬ scope link

    6.1.2. Using "ifconfig"

    Usage:

    # /sbin/ifconfig <interface>

    Example (output filtered with grep to display only IPv6 addresses). Here you see different IPv6 addresses with different scopes.

    # /sbin/ifconfig eth0 |grep "inet6 addr:"
    -inet6 addr: fe80::210:a4ff:fee3:9566/10 Scope:Link
    -inet6 addr: 2001:0db8:0:f101::1/64 Scope:Global
    -inet6 addr: fec0:0:0:f101::1/64 Scope:Site

    6.2. Add an IPv6 address

    Adding an IPv6 address is similar to the mechanism of "IP ALIAS" addresses in Linux IPv4 addressed interfaces.


    6.2.1. Using "ip"

    Usage:

    # /sbin/ip -6 addr add <ipv6address>/<prefixlength> dev <interface> 

    Example:

    # /sbin/ip -6 addr add 2001:0db8:0:f101::1/64 dev eth0 

    6.2.2. Using "ifconfig"

    Usage:

    # /sbin/ifconfig <interface> inet6 add <ipv6address>/<prefixlength>

    Example:

    # /sbin/ifconfig eth0 inet6 add 2001:0db8:0:f101::1/64 

    6.3. Removing an IPv6 address

    Not so often needed, be carefully with removing non existent IPv6 address, sometimes using older kernels it results in a crash.


    6.3.1. Using "ip"

    Usage:

    # /sbin/ip -6 addr del <ipv6address>/<prefixlength> dev <interface> 

    Example:

    # /sbin/ip -6 addr del 2001:0db8:0:f101::1/64 dev eth0 

    6.3.2. Using "ifconfig"

    Usage:

    # /sbin/ifconfig <interface> inet6 del <ipv6address>/<prefixlength>

    Example:

    # /sbin/ifconfig eth0 inet6 del 2001:0db8:0:f101::1/64

    6.4. Automatic IPv6 Address Configuration

    In case, a Router Advertisement is received by a client, and IPv6 autoconfiguration is enabled (default on non-router), the client configures itself an IPv6 address according to the prefix contained in the advertisement (see also Section 22.4).


    6.5. Enable Privacy Extension

    Privacy Extension as described in RFC 4941 / Privacy Extensions for Stateless Address Autoconfiguration in IPv6 (obsoleted RFC 3041) is replacing the static interface ID (mostly based on word-wide unique MAC address) used during autoconfiguration by a pseudo-random one and generating from time to time a new one deprecating the old one.


    6.5.1. Enable Privacy Extension using sysctl

    Temporary activation

    Enable privacy extension for e.g. interface “eth0” and prefer the generated address:

    # sysctl -w net.ipv6.conf.eth0.use_tempaddr=2

    Afterwards, restart of the interface is necessary

    # ip link set dev eth0 down
    -# ip link set dev eth0 up

    Once a router advertisement is received, the result should look like following

    # ip -6 addr show dev eth0
    -2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
    -    inet6 2001:db8:0:1:8992:3c03:d6e2:ed72/64 scope global secondary dynamic   <- pseudo-random IID
    -       valid_lft 604711sec preferred_lft 86311sec
    -    inet6 2001:db8:0:1::224:21ff:fe01:2345/64 scope global     <- IID based on MAC
    -       valid_lft 604711sec preferred_lft 86311sec
    -    ...

    Permanent activation

    For permanent activation, either a special initscript value per interface will enable privacy or an entry in the /etc/sysctl.conf file like

    net.ipv6.conf.eth0.use_tempaddr=2

    Note: interface must already exists with proper name when sysctl.conf is applied. If this is not the case (e.g. after reboot) one has to configure privacy for all interfaces by default:

    net.ipv6.conf.all.use_tempaddr=2
    -net.ipv6.conf.default.use_tempaddr=2

    Changed/added values in /etc/sysctl.conf can be activated during runtime, but at least an interface down/up or a reboot is recommended.

    # sysctl -p

    6.5.2. Enable Privacy Extension using NetworkManager

    Modern (client) systems are using NetworkManager for configuring interfaces. A command line tool is built-in which can be used to change settings which are not available via GUI.

    Examples based on version 0.9.9.1-5.git20140319.fc21

    Check existing interfaces with:

    # nmcli connection 
    -NAME UUID TYPE DEVICE
    -ens4v1 d0fc2b2e-5fa0-4675-96b5-b723ca5c46db 802-3-ethernet ens4v1 

    Current amount of IPv6 privacy extension addresses can be checked with

    # ip -o addr show dev ens4v1 | grep temporary | wc -l
    -0

    Current IPv6 privacy extension settings can be checked with

    # nmcli connection show ens4v1 |grep ip6-privacy
    -ipv6.ip6-privacy: -1 (unknown)

    Enable IPv6 privacy extension and restart interface

    # nmcli connection modify ens4v1 ipv6.ip6-privacy 2
    -# nmcli connection down ens4v1; nmcli connection up ens4v1

    New IPv6 privacy extension settings can be checked with

    # nmcli connection show ens4v1 |grep ip6-privacy
    -ipv6.ip6-privacy: 2 (active, prefer temporary IP)

    Now IPv6 privacy extension addresses are configured on the interface

    # ip -o addr show dev ens4v1 | grep temporary | wc -l
    -2

    6.5.3. Test real use of Privacy Extension IPv6 Addresses

    Whether the IPv6 address with an Interface ID generated by Privacy Extension is really used for outgoing connections, one can browse to http://ip.bieringer.de/, in case EUI64_SCOPE shows “iid-privacy”, then everything is working fine.


    Chapter 7. Configuring normal IPv6 routes

    If you want to leave your link and want to send packets in the world wide IPv6-Internet, you need routing. If there is already an IPv6 enabled router on your link, it's possible enough to add IPv6 routes.

    Just note that addresses beginning with “fec0” are deprecated, but shown here for completness!


    7.1. Displaying existing IPv6 routes

    First you should check, whether and which IPv6 addresses are already configured (perhaps auto-magically during auto-configuration).


    7.1.1. Using "ip"

    Usage:

    # /sbin/ip -6 route show [dev <device>]

    Example:

    # /sbin/ip -6 route show dev eth0
    -2001:0db8: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. Using "route"

    Usage:

    # /sbin/route -A inet6 

    Example (output is filtered for interface eth0). Here you see different IPv6 routes for different addresses on a single interface.

    # /sbin/route -A inet6 |grep -w "eth0"
    -2001:0db8:0:f101 ::/64 :: UA  256 0 0 eth0 <- Interface route for global
    -¬ address
    -fe80::/10        ::       UA  256 0 0 eth0 <- Interface route for link-local
    -¬ address
    -ff00::/8         ::       UA  256 0 0 eth0 <- Interface route for all multicast
    -¬ addresses
    -::/0             ::       UDA 256 0 0 eth0 <- Automatic default route

    7.2. Add an IPv6 route through a gateway

    Mostly needed to reach the outside with IPv6 using an IPv6-enabled router on your link.


    7.2.1. Using "ip"

    Usage:

    # /sbin/ip -6 route add <ipv6network>/<prefixlength> via <ipv6address>
    -¬ [dev <device>]

    Example:

    # /sbin/ip -6 route add default via 2001:0db8:0:f101::1

    7.2.2. Using "route"

    Usage:

    # /sbin/route -A inet6 add <ipv6network>/<prefixlength> gw
    -¬ <ipv6address> [dev <device>] 

    A device can be needed, too, if the IPv6 address of the gateway is a link local one.

    Following shown example adds a default route through gateway 2001:0db8:0:f101::1

    # /sbin/route -A inet6 add default gw 2001:0db8:0:f101::1

    7.3. Removing an IPv6 route through a gateway

    Not so often needed manually, mostly done by network configure scripts on shutdown (full or per interface)


    7.3.1. Using "ip"

    Usage:

    # /sbin/ip -6 route del <ipv6network>/<prefixlength> via <ipv6address>
    -¬ [dev <device>]

    Example:

    # /sbin/ip -6 route del default via 2001:0db8:0:f101::1

    7.3.2. Using "route"

    Usage:

    # /sbin/route -A inet6 del <network>/<prefixlength> gw <ipv6address> [dev
    -¬ <device>]

    Example for removing upper added route again:

    # /sbin/route -A inet6 del default gw 2001:0db8:0:f101::1

    7.4. Add an IPv6 route through an interface

    Not often needed, sometimes in cases of dedicated point-to-point links.


    7.4.1. Using "ip"

    Usage:

    # /sbin/ip -6 route add <ipv6network>/<prefixlength> dev <device>
    -¬ metric 1

    Example:

    # /sbin/ip -6 route add default dev eth0 metric 1

    Metric “1” is used here to be compatible with the metric used by route, because the default metric on using “ip” is “1024”.


    7.4.2. Using "route"

    Usage:

    # /sbin/route -A inet6 add <ipv6network>/<prefixlength> dev <device>

    Example:

    # /sbin/route -A inet6 add default dev eth0 

    7.5. Removing an IPv6 route through an interface

    Not so often needed to use by hand, configuration scripts will use such on shutdown.


    7.5.1. Using "ip"

    Usage:

    # /sbin/ip -6 route del <ipv6network>/<prefixlength> dev <device>

    Example:

    # /sbin/ip -6 route del default dev eth0 

    7.5.2. Using "route"

    Usage:

    # /sbin/route -A inet6 del <network>/<prefixlength> dev <device>

    Example:

    # /sbin/route -A inet6 del default dev eth0

    7.6. FAQ for IPv6 routes

    7.6.1. Support of an IPv6 default route

    One idea of IPv6 was a hierachical routing, therefore only less routing entries are needed in routers.

    There are some issues in current Linux kernels:


    7.6.1.1. Clients (not routing any packet!)

    Client can setup a default route like prefix “::/0”, they also learn such route on autoconfiguration e.g. using radvd on the link like following example shows:

    # 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. Routers in case of packet forwarding

    Older Linux kernel (at least <= 2.4.17) don't support default routes. You can set them up, but the route lookup fails when a packet should be forwarded (normal intention of a router). If you're still using such older kernel, “default routing” can be setup using the currently used global address prefix “2000::/3”.

    Note: take care about default routing without address filtering on edge routers. Otherwise unwanted multicast or site-local traffic can leave the edge.


    Chapter 8. Neighbor Discovery

    Neighbor discovery was the IPv6 successor for the ARP (Address Resolution Protocol) in IPv4. You can retrieve information about the current neighbors, in addition you can set and delete entries. The kernel keeps tracking of successful neighbor detection (like ARP in IPv4). You can dig into the learnt table using “ip”.


    8.1. Displaying neighbors using “ip”

    With following command you can display the learnt or configured IPv6 neighbors

    # ip -6 neigh show [dev <device>]

    The following example shows one neighbor, which is a reachable router

    # ip -6 neigh show
    -fe80::201:23ff:fe45:6789 dev eth0 lladdr 00:01:23:45:67:89 router nud reachable

    8.2. Manipulating neighbors table using “ip”

    8.2.1. Manually add an entry

    With following command you are able to manually add an entry

    # ip -6 neigh add <IPv6 address> lladdr <link-layer address> dev <device>

    Example:

    # ip -6 neigh add fec0::1 lladdr 02:01:02:03:04:05 dev eth0

    8.2.2. Manually delete an entry

    Like adding also an entry can be deleted:

    # ip -6 neigh del <IPv6 address> lladdr <link-layer address> dev <device>

    Example:

    # ip -6 neigh del fec0::1 lladdr 02:01:02:03:04:05 dev eth0

    8.2.3. More advanced settings

    The tool “ip” is less documentated, but very strong. See online “help” for more:

    # 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 ]

    Looks like some options are only for IPv4...if you can contribute information about flags and advanced usage, pls. send.


    Chapter 9. Configuring IPv6-in-IPv4 tunnels

    If you want to leave your link and you have no IPv6 capable network around you, you need IPv6-in-IPv4 tunneling to reach the world wide IPv6-Internet.

    There are some kind of tunnel mechanism and also some possibilities to setup tunnels.


    9.1. Types of tunnels

    There are more than one possibility to tunnel IPv6 packets over IPv4-only links.


    9.1.1. Static point-to-point tunneling

    A point-to-point tunnel is a dedicated tunnel to an endpoint, which knows about your IPv6 network (for backward routing) and the IPv4 address of your tunnel endpoint and defined in RFC 4213 / Basic Transition Mechanisms for IPv6 Hosts and Routers. Requirements:

    • IPv4 address of your local tunnel endpoint must be static, global unique and reachable from the foreign tunnel endpoint

      • If no static IPv4 address is available, the tunnel provider must support authentication of the dynamic IPv4 address, like SixXS / AICCU (3740/udp) or gogo6 (3653/udp).

    • A global IPv6 prefix assigned to you

      • It is also possible that additional IPv6 networks are routed through this tunnel.

    • A foreign tunnel endpoint which is capable to route your IPv6 prefix to your local tunnel endpoint (mostly remote manual configuration required)

    Tunnel provider for static point-to-point tunneling:


    9.1.2. Automatically tunneling

    Automatic tunneling occurs, when a node directly connects another node gotten the IPv4 address of the other node before.


    9.1.3. 6to4-Tunneling

    6to4 tunneling (RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds) uses a simple mechanism to create automatic tunnels. Each node with a global unique IPv4 address is able to be a 6to4 tunnel endpoint (if no IPv4 firewall prohibits traffic). 6to4 tunneling is mostly not a one-to-one tunnel. This case of tunneling can be divided into upstream and downstream tunneling. Also, a special IPv6 address indicates that this node will use 6to4 tunneling for connecting the world-wide IPv6 network


    9.1.3.1. Generation of 6to4 prefix

    The 6to4 address is defined like following (schema is taken from RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds):

    |   3+13   |    32     |    16  |            64 bits             | 
    -+---+------+-----------+--------+--------------------------------+ 
    -|  FP+TLA  |  V4ADDR   | SLA ID |           Interface ID         | 
    -|  0x2002  |           |        |                                | 
    -+---+------+-----------+--------+--------------------------------+

    FP and TLA together (16 bits) have the value 0x2002. V4ADDR is the node's global unique IPv4 address (in hexadecimal notation). SLA is the subnet identifier (65536 local subnets possible) and are usable to represent your local network structure.

    For gateways, such prefix is generated by normally using SLA “0000” and suffix “::1” (not a must, can be an arbitrary one with local-scope) and assigned to the 6to4 tunnel interface. Note that Microsoft Windows uses V4ADDR also for suffix.


    9.1.3.2. 6to4 upstream tunneling

    The node has to know to which foreign tunnel endpoint its in IPv4 packed IPv6 packets should be send to. In “early” days of 6to4 tunneling, dedicated upstream accepting routers were defined. See NSayer's 6to4 information for a list of routers.

    Nowadays, 6to4 upstream routers can be found auto-magically using the anycast address 192.88.99.1. In the background routing protocols handle this, see RFC 3068 / An Anycast Prefix for 6to4 Relay Routers for details.


    9.1.3.3. 6to4 downstream tunneling

    The downstream (IPv6 backbone -> your 6to4 enabled node) is not really fix and can vary from foreign host which originated packets were send to. There exist two possibilities:

    • Foreign host uses 6to4 and sends packet direct back to your node (see below)

    • Foreign host sends packets back to the world-wide IPv6 network and depending on the dynamic routing a relay router of an ISP which announces 2002::/16 via BGP will create a automatic tunnel back to your node.


    9.1.3.4. Possible 6to4 traffic

    • from 6to4 to 6to4: is normally directly tunneled between the both 6to4 enabled hosts

    • from 6to4 to non-6to4: is sent via upstream tunneling

    • non-6to4 to 6to4: is sent via downstream tunneling

    Note, that because of possible asymmetric routing problems with a broken 6to4 relay can be hard to troubleshoot.


    9.1.4. UDP encapsulated IPv6 tunneling

    UDP encapsulated IPv6 tunneling is usally used if no global IPv4 address is available on the internal endpoint, but using Network Adress Translation (NAT) it can still reach related endpoints using UDP ports described below.


    9.1.4.1. Teredo Tunnel

    RFC 4380 / Teredo: Tunneling IPv6 over UDP through Network Address Translationsdescribes tunneling of IPv6 packets via IPv4 UDP bubbles, see also Wikipedia / Teredo. It uses usually 3544/udp. Linux client is named miredo and usable out-of-the-box. This tunnel method can only connect a single client to the global IPv6 network..


    9.1.4.2. AYIYA Tunnel

    Tunnel provider SixXS has also IPv6-in-UDP-in-IPv4 (5072/udp) capability, for using it, the AYIYA mode must be enabled.


    9.1.4.3. gogo6 Tunnel

    Tunnel provider gogo6 has also IPv6-in-UDP-in-IPv4 (3653/udp) capability, for using it, the v6udpv4 mode must be enabled.


    9.2. Displaying existing tunnels

    9.2.1. Using "ip"

    Usage:

    # /sbin/ip -6 tunnel show [<device>]

    Example:

    # /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. Using "route"

    Usage:

    # /sbin/route -A inet6 

    Example (output is filtered to display only tunnels through virtual interface 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. Setup of point-to-point tunnel

    There are 3 possibilities to add or remove point-to-point tunnels.

    A good additional information about tunnel setup using “ip” is Configuring tunnels with iproute2 (article) (Mirror).


    9.3.1. Add point-to-point tunnels

    9.3.1.1. Using "ip"

    Common method at the moment for a small amount of tunnels.

    Usage for creating a tunnel device (but it's not up afterward, also a TTL must be specified because the default value is 0).

    # /sbin/ip tunnel add <device> mode sit ttl <ttldefault> remote
    -¬ <ipv4addressofforeigntunnel> local <ipv4addresslocal>

    Usage (generic example for three tunnels):

    # /sbin/ip tunnel add sit1 mode sit ttl <ttldefault> remote
    -¬ <ipv4addressofforeigntunnel1> local <ipv4addresslocal>
    -# /sbin/ip link set dev sit1 up
    -# /sbin/ip -6 route add <prefixtoroute1> dev sit1 metric 1
    -
    -# /sbin/ip tunnel add sit2 mode sit ttl <ttldefault>
    -¬ <ipv4addressofforeigntunnel2> local <ipv4addresslocal>
    -# /sbin/ip link set dev sit2 up
    -# /sbin/ip -6 route add <prefixtoroute2> dev sit2 metric 1
    -
    -# /sbin/ip tunnel add sit3 mode sit ttl <ttldefault>
    -¬ <ipv4addressofforeigntunnel3> local <ipv4addresslocal>
    -# /sbin/ip link set dev sit3 up
    -# /sbin/ip -6 route add <prefixtoroute3> dev sit3 metric 1

    9.3.1.2. Using "ifconfig" and "route" (deprecated)

    This not very recommended way to add a tunnel because it's a little bit strange. No problem if adding only one, but if you setup more than one, you cannot easy shutdown the first ones and leave the others running.

    Usage (generic example for three tunnels):

    # /sbin/ifconfig sit0 up
    -
    -# /sbin/ifconfig sit0 tunnel <ipv4addressofforeigntunnel1>
    -# /sbin/ifconfig sit1 up
    -# /sbin/route -A inet6 add <prefixtoroute1> dev sit1
    -
    -# /sbin/ifconfig sit0 tunnel <ipv4addressofforeigntunnel2>
    -# /sbin/ifconfig sit2 up
    -# /sbin/route -A inet6 add <prefixtoroute2> dev sit2
    -
    -# /sbin/ifconfig sit0 tunnel <ipv4addressofforeigntunnel3>
    -# /sbin/ifconfig sit3 up
    -# /sbin/route -A inet6 add <prefixtoroute3> dev sit3

    Important: DON'T USE THIS, because this setup implicit enable "automatic tunneling" from anywhere in the Internet, this is a risk, and it should not be advocated.


    9.3.1.3. Using "route" only

    It's also possible to setup tunnels in Non Broadcast Multiple Access (NBMA) style, it's a easy way to add many tunnels at once. But none of the tunnel can be numbered (which is a not required feature).

    Usage (generic example for three tunnels):

    # /sbin/ifconfig sit0 up
    -
    -# /sbin/route -A inet6 add <prefixtoroute1> gw
    -¬ ::<ipv4addressofforeigntunnel1> dev sit0
    -# /sbin/route -A inet6 add <prefixtoroute2> gw
    -¬ ::<ipv4addressofforeigntunnel2> dev sit0
    -# /sbin/route -A inet6 add <prefixtoroute3> gw
    -¬ ::<ipv4addressofforeigntunnel3> dev sit0

    Important: DON'T USE THIS, because this setup implicit enable "automatic tunneling" from anywhere in the Internet, this is a risk, and it should not be advocated.


    9.3.2. Removing point-to-point tunnels

    Manually not so often needed, but used by scripts for clean shutdown or restart of IPv6 configuration.


    9.3.2.1. Using "ip"

    Usage for removing a tunnel device:

    # /sbin/ip tunnel del <device>

    Usage (generic example for three tunnels):

    # /sbin/ip -6 route del <prefixtoroute1> dev sit1
    -# /sbin/ip link set sit1 down
    -# /sbin/ip tunnel del sit1
    -
    -# /sbin/ip -6 route del <prefixtoroute2> dev sit2
    -# /sbin/ip link set sit2 down
    -# /sbin/ip tunnel del sit2
    -
    -# /sbin/ip -6 route del <prefixtoroute3> dev sit3
    -# /sbin/ip link set sit3 down
    -# /sbin/ip tunnel del sit3

    9.3.2.2. Using "ifconfig" and "route" (deprecated because not very funny)

    Not only the creation is strange, the shutdown also...you have to remove the tunnels in backorder, means the latest created must be removed first.

    Usage (generic example for three tunnels):

    # /sbin/route -A inet6 del <prefixtoroute3> dev sit3
    -# /sbin/ifconfig sit3 down
    -
    -# /sbin/route -A inet6 del <prefixtoroute2> dev sit2
    -# /sbin/ifconfig sit2 down
    -
    -# /sbin/route -A inet6 add <prefixtoroute1> dev sit1
    -# /sbin/ifconfig sit1 down
    -
    -# /sbin/ifconfig sit0 down

    9.3.2.3. Using "route"

    This is like removing normal IPv6 routes.

    Usage (generic example for three tunnels):

    # /sbin/route -A inet6 del <prefixtoroute1> gw
    -¬ ::<ipv4addressofforeigntunnel1> dev sit0
    -# /sbin/route -A inet6 del <prefixtoroute2> gw
    -¬ ::<ipv4addressofforeigntunnel2> dev sit0
    -# /sbin/route -A inet6 del <prefixtoroute3> gw
    -¬ ::<ipv4addressofforeigntunnel3> dev sit0
    -
    -# /sbin/ifconfig sit0 down

    9.3.3. Numbered point-to-point tunnels

    Sometimes it's needed to configure a point-to-point tunnel with IPv6 addresses like in IPv4 today. This is only possible with the first (ifconfig+route - deprecated) and third (ip+route) tunnel setup. In such cases, you can add the IPv6 address to the tunnel interface like shown on interface configuration.


    9.4. Setup of 6to4 tunnels

    Pay attention that the support of 6to4 tunnels currently lacks on vanilla kernel series 2.2.x (see systemcheck/kernel for more information). Also note that that the prefix length for a 6to4 address is 16 because of from network point of view, all other 6to4 enabled hosts are on the same layer 2.


    9.4.1. Add a 6to4 tunnel

    First, you have to calculate your 6to4 prefix using your local assigned global routable IPv4 address (if your host has no global routable IPv4 address, in special cases NAT on border gateways is possible):

    Assuming your IPv4 address is

    1.2.3.4

    the generated 6to4 prefix will be

    2002:0102:0304::

    Local 6to4 gateways should (but it's not a must, you can choose an arbitrary suffix with local-scope, if you feel better) always assigned the suffix “::1”, therefore your local 6to4 address will be

    2002:0102:0304::1

    Use e.g. following for automatic generation:

    ipv4="1.2.3.4"; printf "2002:%02x%02x:%02x%02x::1" `echo $ipv4 | tr "." " "`

    There are two ways possible to setup 6to4 tunneling now.


    9.4.1.1. Using "ip" and a dedicated tunnel device

    This is now the recommended way (a TTL must be specified because the default value is 0).

    Create a new tunnel device

    # /sbin/ip tunnel add tun6to4 mode sit ttl <ttldefault> remote any local
    -¬ <localipv4address> 

    Bring interface up

    # /sbin/ip link set dev tun6to4 up 

    Add local 6to4 address to interface (note: prefix length 16 is important!)

    # /sbin/ip -6 addr add <local6to4address>/16 dev tun6to4 

    Add (default) route to the global IPv6 network using the all-6to4-routers IPv4 anycast address

    # /sbin/ip -6 route add default via ::192.88.99.1 dev tun6to4 metric 1

    It was reported that some versions of “ip” (e.g. SuSE Linux 9.0) don't support IPv4-compatible IPv6 addresses for gateways, in this case the related IPv6 address has to be used:

    # /sbin/ip -6 route add default via 2002:c058:6301::1 dev tun6to4 metric 1

    9.4.1.2. Using "ifconfig" and "route" and generic tunnel device “sit0” (deprecated)

    This is now deprecated because using the generic tunnel device sit0 doesn't let specify filtering per device.

    Bring generic tunnel interface sit0 up

    # /sbin/ifconfig sit0 up 

    Add local 6to4 address to interface

    # /sbin/ifconfig sit0 add <local6to4address>/16

    Add (default) route to the global IPv6 network using the all-6to4-relays IPv4 anycast address

    # /sbin/route -A inet6 add default gw ::192.88.99.1 dev sit0

    9.4.2. Remove a 6to4 tunnel

    9.4.2.1. Using "ip" and a dedicated tunnel device

    Remove all routes through this dedicated tunnel device

    # /sbin/ip -6 route flush dev tun6to4

    Shut down interface

    # /sbin/ip link set dev tun6to4 down

    Remove created tunnel device

    # /sbin/ip tunnel del tun6to4 

    9.4.2.2. Using “ifconfig” and “route” and generic tunnel device “sit0” (deprecated)

    Remove (default) route through the 6to4 tunnel interface

    # /sbin/route -A inet6 del default gw ::192.88.99.1 dev sit0

    Remove local 6to4 address to interface

    # /sbin/ifconfig sit0 del <local6to4address>/16

    Shut down generic tunnel device (take care about this, perhaps it's still in use...)

    # /sbin/ifconfig sit0 down 

    Chapter 10. Configuring IPv4-in-IPv6 tunnels

    RFC 2473 / Generic Packet Tunneling in IPv6 Specification specifies mechanisms to tunnel several different packet types over IPv6 including IPv4.

    NOTE: Support for IPv4-in-IPv6 tunnel is available only since kernel version 2.6.22.


    10.1. Displaying existing tunnels

    Usage:

    # /sbin/ip -6 tunnel show [<device>]

    Example:

    # /sbin/ip -6 tunnel show mode any
    -ip6tnl0: ipv6/ipv6 remote :: local :: encaplimit 0 hoplimit 0 tclass 0x00
    -¬ flowlabel 0x00000 (flowinfo 0x00000000)
    -ip6tnl1: ip/ipv6 remote fd00:0:0:2::a local fd00:0:0:2::1 dev eth1 encaplimit 4
    -¬ hoplimit 64 tclass 0x00 flowlabel 0x00000 (flowinfo 0x00000000)

    NOTE: If you don't include "mode any", only IPv6-in-IPv6 tunnels are displayed.


    10.2. Setup of point-to-point tunnel

    Usage for creating a 4over6 tunnel device (but it's not up afterward)

    # /sbin/ip tunnel add <device> mode ip4ip6 remote <ipv6addressofforeigntunnel>
    -¬ local <ipv6addresslocal>

    Usage (generic example for three tunnels):

    # /sbin/ip -6 tunnel add ip6tnl1 mode ip4ip6 remote
    -¬ <ipv6addressofforeigntunnel1> local <ipv6addresslocal>
    -# /sbin/ip link set dev ip6tnl1 up 
    -# /sbin/ip -6 route add <prefixtoroute1> dev ip6tnl1 metric 1
    -
    -# /sbin/ip -6 tunnel add ip6tnl2 mode ip4ip6 remote
    -¬ <ipv6addressofforeigntunnel2> local <ipv6addresslocal>
    -# /sbin/ip link set dev ip6tnl2 up
    -# /sbin/ip -6 route add <prefixtoroute2> dev ip6tnl2 metric 1
    -
    -# /sbin/ip -6 tunnel add ip6tnl3 mode ip4ip6 remote
    -¬ <ipv6addressofforeigntunnel3> local <ipv6addresslocal>
    -# /sbin/ip link set dev ip6tnl3 up
    -# /sbin/ip -6 route add <prefixtoroute3> dev ip6tnl3 metric 1

    10.3. Removing point-to-point tunnels

    Usage for removing a tunnel device:

    # /sbin/ip -6 tunnel del <device>

    Usage (generic example for three tunnels):

    # /sbin/ip -6 route del <prefixtoroute1> dev ip6tnl1
    -# /sbin/ip link set ip6tnl1 down
    -# /sbin/ip -6 tunnel del ip6tnl1
    -
    -# /sbin/ip -6 route del <prefixtoroute2> dev ip6tnl2
    -# /sbin/ip link set ip6tnl2 down
    -# /sbin/ip -6 tunnel del ip6tnl2
    -
    -# /sbin/ip -6 route del <prefixtoroute3> dev ip6tnl3
    -# /sbin/ip link set ip6tnl3 down
    -# /sbin/ip -6 tunnel del ip6tnl3 

    Chapter 11. Kernel settings in /proc-filesystem

    Note: the source of this section is mostly the file “ip-sysctl.txt” which is included in current kernel sources in directory “Documentation/networking”. Credits to Pekka Savola for maintaining the IPv6-related part in this file. Also some text is more or less copied & pasted into this document.


    11.1. How to access the /proc-filesystem

    11.1.1. Using “cat” and “echo”

    Using “cat” and “echo” is the simplest way to access the /proc filesystem, but some requirements are needed for that

    • The /proc-filesystem had to be enabled in kernel, means on compiling following switch has to be set

    CONFIG_PROC_FS=y

    • The /proc-filesystem was mounted before, which can be tested using

    # mount | grep "type proc"
    -none on /proc type proc (rw)

    • You need read and sometimes also write access (normally root only) to the /proc-filesystem

    Normally, only entries in /proc/sys/* are writable, the others are readonly and for information retrieving only.


    11.1.1.1. Retrieving a value

    The value of an entry can be retrieved using “cat”:

    # cat /proc/sys/net/ipv6/conf/all/forwarding
    -0

    11.1.1.2. Setting a value

    A new value can be set (if entry is writable) using “echo”:

    # echo "1" >/proc/sys/net/ipv6/conf/all/forwarding

    11.1.2. Using “sysctl”

    Using the “sysctl” program to access the kernel switches is a modern method today. You can use it also, if the /proc-filesystem isn't mounted. But you have only access to /proc/sys/*!

    The program “sysctl” is included in package “procps” (on Red Hat Linux systems).

    • The sysctl-interface had to be enabled in kernel, means on compiling following switch has to be set

    CONFIG_SYSCTL=y

    11.1.2.1. Retrieving a value

    The value of an entry can be retrieved now:

    # sysctl net.ipv6.conf.all.forwarding
    -net.ipv6.conf.all.forwarding = 0

    11.1.2.2. Setting a value

    A new value can be set (if entry is writable):

    # sysctl -w net.ipv6.conf.all.forwarding=1
    -net.ipv6.conf.all.forwarding = 1

    Note: Don't use spaces around the “=” on setting values. Also on multiple values per line, quote them like e.g.

    # sysctl -w net.ipv4.ip_local_port_range="32768 61000"
    -net.ipv4.ip_local_port_range = 32768 61000

    11.1.2.3. Additionals

    Note: There are sysctl versions in the wild which displaying “/” instead of the “.”

    For more details take a look into sysctl's manpage.

    Hint: for digging fast into the settings, use the option “-a” (display all entries) in conjunction with “grep”.


    11.1.3. Values found in /proc-filesystems

    There are several formats seen in /proc-filesystem:

    • BOOLEAN: simple a “0” (false) or a “1” (true)

    • INTEGER: an integer value, can be unsigned, too

    • more sophisticated lines with several values: sometimes a header line is displayed also, if not, have a look into the kernel source to retrieve information about the meaning of each value...


    11.2. Entries in /proc/sys/net/ipv6/

    11.2.1. conf/default/*

    Change the interface-specific default settings.


    11.2.2. conf/all/*

    Change all the interface-specific settings.

    Exception: “conf/all/forwarding” has a different meaning here


    11.2.2.1. conf/all/forwarding

    • Type: BOOLEAN

    This enables global IPv6 forwarding between all interfaces.

    In IPv6 you can't control forwarding per device, forwarding control has to be done using IPv6-netfilter (controlled with ip6tables) rulesets and specify input and output devices (see Firewalling/Netfilter6 for more). This is different to IPv4, where you are able to control forwarding per device (decision is made on interface where packet came in).

    This also sets all interfaces' Host/Router setting 'forwarding' to the specified value. See below for details. This referred to as global forwarding.

    If this value is 0, no IPv6 forwarding is enabled, packets never leave another interface, neither physical nor logical like e.g. tunnels.


    11.2.3. conf/interface/*

    Change special settings per interface.

    The functional behaviour for certain settings is different depending on whether local forwarding is enabled or not.


    11.2.3.1. accept_ra

    • Type: BOOLEAN

    • Functional default: enabled if local forwarding is disabled. disabled if local forwarding is enabled.

    Accept Router Advertisements, and autoconfigure this interface with received data.


    11.2.3.2. accept_redirects

    • Type: BOOLEAN

    • Functional default: enabled if local forwarding is disabled. disabled if local forwarding is enabled.

    Accept Redirects sent by an IPv6 router.


    11.2.3.3. autoconf

    • Type: BOOLEAN

    • Functional default: enabled if accept_ra_pinfo is enabled. disabled if accept_ra_pinfo is disabled.

    Autoconfigure addresses using prefix information from router advertisements.


    11.2.3.4. dad_transmits

    • Type: INTEGER

    • Default: 1

    The amount of Duplicate Address Detection probes to send.


    11.2.3.5. forwarding

    • Type: BOOLEAN

    • Default: FALSE if global forwarding is disabled (default), otherwise TRUE

    Configure interface-specific Host/Router behaviour.

    Note: It is recommended to have the same setting on all interfaces; mixed router/host scenarios are rather uncommon.

    • Value FALSE: By default, Host behaviour is assumed. This means:

    1. IsRouter flag is not set in Neighbour Advertisements.

    2. Router Solicitations are being sent when necessary.

    3. If accept_ra is TRUE (default), accept Router Advertisements (and do autoconfiguration).

    4. If accept_redirects is TRUE (default), accept Redirects.

    • Value TRUE: If local forwarding is enabled, Router behaviour is assumed. This means exactly the reverse from the above:

    1. IsRouter flag is set in Neighbour Advertisements.

    2. Router Solicitations are not sent.

    3. Router Advertisements are ignored.

    4. Redirects are ignored.


    11.2.3.6. hop_limit

    • Type: INTEGER

    • Default: 64

    Default Hop Limit to set.


    11.2.3.7. mtu

    • Type: INTEGER

    • Default: 1280 (IPv6 required minimum)

    Default Maximum Transfer Unit


    11.2.3.8. router_solicitation_delay

    • Type: INTEGER

    • Default: 1

    Number of seconds to wait after interface is brought up before sending Router Solicitations.


    11.2.3.9. router_solicitation_interval

    • Type: INTEGER

    • Default: 4

    Number of seconds to wait between Router Solicitations.


    11.2.3.10. router_solicitations

    • Type: INTEGER

    • Default: 3

    Number of Router Solicitations to send until assuming no routers are present.


    11.2.4. neigh/default/*

    Change default settings for neighbor detection and some special global interval and threshold values:


    11.2.4.1. gc_thresh1

    • Type: INTEGER

    • Default: 128

    More to be filled.


    11.2.4.2. gc_thresh2

    • Type: INTEGER

    • Default: 512

    More to be filled.


    11.2.4.3. gc_thresh3

    • Type: INTEGER

    • Default: 1024

    Tuning parameter for neighbour table size.

    Increase this value if you have a lot of interfaces and problem with routes start to act mysteriously and fail. Or if a running Zebra (routing daemon) reports:

    ZEBRA: netlink-listen error: No buffer space available, type=RTM_NEWROUTE(24),
    -¬ seq=426, pid=0

    11.2.4.4. gc_interval

    • Type: INTEGER

    • Default: 30

    More to be filled.


    11.2.5. neigh/interface/*

    Change special settings per interface for neighbor detection.


    11.2.5.1. anycast_delay

    • Type: INTEGER

    • Default: 100

    More to be filled.


    11.2.5.2. gc_stale_time

    • Type: INTEGER

    • Default: 60

    More to be filled.


    11.2.5.3. proxy_qlen

    • Type: INTEGER

    • Default: 64

    More to be filled.


    11.2.5.4. unres_qlen

    • Type: INTEGER

    • Default: 3

    More to be filled.


    11.2.5.5. app_solicit

    • Type: INTEGER

    • Default: 0

    More to be filled.


    11.2.5.6. locktime

    • Type: INTEGER

    • Default: 0

    More to be filled.


    11.2.5.7. retrans_time

    • Type: INTEGER

    • Default: 100

    More to be filled.


    11.2.5.8. base_reachable_time

    • Type: INTEGER

    • Default: 30

    More to be filled.


    11.2.5.9. mcast_solicit

    • Type: INTEGER

    • Default: 3

    More to be filled.


    11.2.5.10. ucast_solicit

    • Type: INTEGER

    • Default: 3

    More to be filled


    11.2.5.11. delay_first_probe_time

    • Type: INTEGER

    • Default: 5

    More to be filled.


    11.2.5.12. proxy_delay

    • Type: INTEGER

    • Default: 80

    More to be filled.


    11.2.6. route/*

    Change global settings for routing.


    11.2.6.1. flush

    Removed in newer kernel releases - more to be filled.


    11.2.6.2. gc_interval

    • Type: INTEGER

    • Default: 30

    More to be filled.


    11.2.6.3. gc_thresh

    • Type: INTEGER

    • Default: 1024

    More to be filled.


    11.2.6.4. mtu_expires

    • Type: INTEGER

    • Default: 600

    More to be filled.


    11.2.6.5. gc_elasticity

    • Type: INTEGER

    • Default: 0

    More to be filled.


    11.2.6.6. gc_min_interval

    • Type: INTEGER

    • Default: 5

    More to be filled.


    11.2.6.7. gc_timeout

    • Type: INTEGER

    • Default: 60

    More to be filled.


    11.2.6.8. min_adv_mss

    • Type: INTEGER

    • Default: 12

    More to be filled.


    11.2.6.9. max_size

    • Type: INTEGER

    • Default: 4096

    More to be filled.


    11.3. IPv6-related entries in /proc/sys/net/ipv4/

    At the moment (and this will be until IPv4 is completly converted to an independend kernel module) some switches are also used here for IPv6.


    11.3.1. ip_*

    11.3.1.1. ip_local_port_range

    This control setting is used by IPv6 also.


    11.3.2. tcp_*

    This control settings are used by IPv6 also.


    11.3.3. icmp_*

    This control settings are not used by IPv6. To enable ICMPv6 rate limiting (which is very recommended because of the capability of ICMPv6 storms) netfilter-v6 rules must be used.


    11.3.4. others

    Unknown, but probably not used by IPv6.


    11.4. IPv6-related entries in /proc/net/

    In /proc/net there are several read-only entries available. You cannot retrieve information using “sysctl” here, so use e.g. “cat”.


    11.4.1. if_inet6

    • Type: One line per addresss containing multiple values

    Here all configured IPv6 addresses are shown in a special format. The example displays for loopback interface only. The meaning is shown below (see “net/ipv6/addrconf.c” for more).

    # cat /proc/net/if_inet6
    -00000000000000000000000000000001 01 80 10 80 lo
    -+------------------------------+ ++ ++ ++ ++ ++
    -|                                |  |  |  |  |
    -1                                2  3  4  5  6

    1. IPv6 address displayed in 32 hexadecimal chars without colons as separator

    2. Netlink device number (interface index) in hexadecimal (see “ip addr” , too)

    3. Prefix length in hexadecimal

    4. Scope value (see kernel source “ include/net/ipv6.h” and “net/ipv6/addrconf.c” for more)

    5. Interface flags (see “include/linux/rtnetlink.h” and “net/ipv6/addrconf.c” for more)

    6. Device name


    11.4.2. ipv6_route

    • Type: One line per route containing multiple values

    Here all configured IPv6 routes are shown in a special format. The example displays for loopback interface only. The meaning is shown below (see “net/ipv6/route.c” for more).

    # 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. IPv6 destination network displayed in 32 hexadecimal chars without colons as separator

    2. IPv6 destination prefix length in hexadecimal

    3. IPv6 source network displayed in 32 hexadecimal chars without colons as separator

    4. IPv6 source prefix length in hexadecimal

    5. IPv6 next hop displayed in 32 hexadecimal chars without colons as separator

    6. Metric in hexadecimal

    7. Reference counter

    8. Use counter

    9. Flags

    10. Device name


    11.4.3. sockstat6

    • Type: One line per protocol with description and value

    Statistics about used IPv6 sockets. Example:

    # cat /proc/net/sockstat6
    -TCP6: inuse 7 
    -UDP6: inuse 2 
    -RAW6: inuse 1 
    -FRAG6: inuse 0 memory 0

    11.4.4. tcp6

    To be filled.


    11.4.5. udp6

    To be filled.


    11.4.6. igmp6

    To be filled.


    11.4.7. raw6

    To be filled.


    11.4.9. rt6_stats

    To be filled.


    11.4.10. snmp6

    • Type: One line per SNMP description and value

    SNMP statistics, can be retrieved via SNMP server and related MIB table by network management software.


    11.4.11. ip6_tables_names

    Available netfilter6 tables


    Chapter 12. Netlink-Interface to kernel

    To be filled...I have no experience with that...


    Chapter 13. Address Resolver & Selection

    Additional info can be found at

    Address Resolver & Destination Address Selection

    Name to IPv4 or IPv6 address resolving is usually done using a libc resolver library. Usually the function getaddrinfo is used for that. In case of more than one IPv6 address is returned, according to RFC 3484 / Default Address Selection for Internet Protocol version 6 a sorting should be applied, which can be optionally configured.

    The “magic” is controlled by a file named /etc/gai.conf (it can be that it is empty or missing by default). Default is usually somewhere stored in documentation, see “man gai.conf” or e.g. /usr/share/doc/glibc-common/gai.conf.

    For controlling sort order by configuration following are needed for testing:

    • A host in DNS returning more than one IPv6 address, e.g.

    $ dig +short aaaa st1.bieringer.de
    -2001:4dd0:ff00:834::2
    -2a01:238:423d:8800:85b3:9e6b:3019:8909 

    • Lookup via DNS (/etc/hosts won't work)

    • /etc/gai.conf with proper config, e.g.

    precedence  ::1/128       50            # default
    -precedence  ::/0          40            # default
    -precedence  2002::/16     30            # default
    -precedence ::/96          20            # default
    -precedence ::ffff:0:0/96  10            # default
    -precedence 2001:4dd0:ff00:834::/64  80  # dst-A
    -precedence 2a01:238:423d:8800::/64  90  # dst-B

    • For tests use e.g. telnet client

    $ telnet st1.bieringer.de
    -Trying 2a01:238:423d:8800:85b3:9e6b:3019:8909...    (dst-B)
    -...
    -Trying 2001:4dd0:ff00:834::2...                     (dst-A)
    -...

    • If precedence is changed in configuration

    precedence 2001:4dd0:ff00:834::/64  90  # dst-A ex 80
    -precedence 2a01:238:423d:8800::/64  80  # dst-B ex 90

    • The order is changed accordingly

    $ telnet st1.bieringer.de
    -Trying 2001:4dd0:ff00:834::2...                     (dst-A)
    -...
    -Trying 2a01:238:423d:8800:85b3:9e6b:3019:8909...    (dst-B)
    -...

    Source Address Selection

    Source address selection in Linux is done automatically by kernel and usually only using information from routing tables and try to match the same scope of address.

    Source Address Selection with “ip addrlabel”

    With extension of internal “ip addrlabel” a source address can be bound to a destination address (e.g. selected via mechanisms above). Binding means here: “same label” (label is a number).

    • Default of “ip addrlabel” (here on CentOS 6):

    # ip addrlabel
    -prefix ::1/128 label 0 
    -prefix ::/96 label 3 
    -prefix ::ffff:0.0.0.0/96 label 4 
    -prefix 2001::/32 label 6 
    -prefix 2001:10::/28 label 7 
    -prefix 2002::/16 label 2 
    -prefix fc00::/7 label 5 
    -prefix ::/0 label 1 

    • System is multihomed (here on one interface), router provides 2 prefixes via radvd:

    # ip -6 addr show dev eth1 | grep -w inet6 |grep -w global
    -    inet6 2001:6f8:12d8:2:5054:ff:fefb:6582/64 scope global dynamic 
    -    inet6 2001:6f8:900:8cbc:5054:ff:fefb:6582/64 scope global dynamic 

    • Connect now to server (shown above)

    $ telnet st1.bieringer.de
    -Trying 2001:4dd0:ff00:834::2...                     (dst-A)
    -...
    -Trying 2a01:238:423d:8800:85b3:9e6b:3019:8909...    (dst-B)
    -...

    • Related tcpdump with filter “tcp and dst port 23” shows only the use of the upper local source IPv6 address

    IP6 2001:6f8:12d8:2:5054:ff:fefb:6582.37762 > 2001:4dd0:ff00:834::2.telnet:                  (src-A -> dst-A)
    -IP6 2001:6f8:12d8:2:5054:ff:fefb:6582.45754 > 2a01:238:423d:8800:85b3:9e6b:3019:8909.telnet: (src-A -> dst-B)

    • Binding now source and destination with “ip addrlabel”

    # ip addrlabel add prefix 2001:6f8:12d8:2::/64 label 200
    -# ip addrlabel add prefix 2001:6f8:900:8cbc::/64 label 300
    -# ip addrlabel add prefix 2001:4dd0:ff00:834::/64 label 200
    -# ip addrlabel add prefix 2a01:238:423d:8800::/64 label 300

    • Resulting “ip addrlabel”

    # ip addrlabel
    -prefix ::1/128 label 0 
    -prefix ::/96 label 3 
    -prefix ::ffff:0.0.0.0/96 label 4 
    -prefix 2a01:238:423d:8800::/64 label 300   # dst-B
    -prefix 2001:4dd0:ff00:834::/64 label 200   # dst-A
    -prefix 2001:6f8:900:8cbc::/64 label 300    # src-B
    -prefix 2001:6f8:12d8:2::/64 label 200      # src-A
    -prefix 2001::/32 label 6 
    -prefix 2001:10::/28 label 7 
    -prefix 2002::/16 label 2 
    -prefix fc00::/7 label 5 
    -prefix ::/0 label 1 

    • Connect now to server again

    $ telnet st1.bieringer.de
    -Trying 2001:4dd0:ff00:834::2...                     (dst-A)
    -...
    -Trying 2a01:238:423d:8800:85b3:9e6b:3019:8909...    (dst-B)
    -...

    • Related tcpdump with filter “tcp and dst port 23” shows now the use of both local source IPv6 addresses according to the configured pairs A and B

    IP6 2001:6f8:12d8:2:5054:ff:fefb:6582.37765   > 2001:4dd0:ff00:834::2.telnet:                  (src-A -> dst-A)
    -IP6 2001:6f8:900:8cbc:5054:ff:fefb:6582.39632 > 2a01:238:423d:8800:85b3:9e6b:3019:8909.telnet: (src-B -> dst-B)

    Setup of persistent “ip addrtable” is probably currently not supported by Linux distributions, so extension of network init scripts or rc.local must be used for that. A script which uses information from /etc/gai.conf and configure “ip addrtable” accordingly can be found here: /etc/gai.conf - it ain't what you think it is


    Chapter 14. Network debugging

    14.1. Server socket binding

    14.1.1. Using “netstat” for server socket binding check

    It's always interesting which server sockets are currently active on a node. Using “netstat” is a short way to get such information:

    Used options: -nlptu

    Example:

    # 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

    14.2. Examples for tcpdump packet dumps

    Here some examples of captured packets are shown, perhaps useful for your own debugging...

    ...more coming next...


    14.2.1. Router discovery

    14.2.1.1. 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=2001:0db8:0:1::/64)(src lladdr:
    -¬ 0:12:34:12:34:50) (len 88, hlim 255)

    Router with link-local address “fe80::212:34ff:fe12:3450” send an advertisement to the all-node-on-link multicast address “ff02::1” containing two prefixes “2002:0102:0304:1::/64” (lifetime 30 s) and “2001:0db8:0:1::/64” (lifetime 2592000 s) including its own layer 2 MAC address “0:12:34:12:34:50”.


    14.2.1.2. 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)

    Node with link-local address “fe80::212:34ff:fe12:3456” and layer 2 MAC address “0:12:34:12:34:56” is looking for a router on-link, therefore sending this solicitation to the all-router-on-link multicast address “ff02::2”.


    14.2.2. Neighbor discovery

    14.2.2.1. Neighbor discovery solicitation for duplicate address detection

    Following packets are sent by a node with layer 2 MAC address “0:12:34:12:34:56” during autoconfiguration to check whether a potential address is already used by another node on the link sending this to the solicited-node link-local multicast address.

    • Node wants to configure its link-local address “fe80::212:34ff:fe12:3456”, checks for duplicate now

    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)

    • Node wants to configure its global address “2002:0102:0304:1:212:34ff:fe12:3456” (after receiving advertisement shown above), checks for duplicate now

    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)

    • Node wants to configure its global address “2001:0db8:0:1:212:34ff:fe12:3456” (after receiving advertisement shown above), checks for duplicate now

    15:44:22.304028 :: > ff02::1:ff12:3456: icmp6: neighbor sol: who has
    -¬ 2001:0db8:0:1:212:34ff:fe12:3456(src lladdr: 0:12:34:12:34:56) (len 32, hlim
    -¬ 255)

    14.2.2.2. Neighbor discovery solicitation for looking for host or gateway

    • Node wants to send packages to “2001:0db8:0:1::10” but has no layer 2 MAC address to send packet, so send solicitation now

    13:07:47.664538 2002:0102:0304:1:2e0:18ff:fe90:9205 > ff02::1:ff00:10: icmp6:
    -¬ neighbor sol: who has 2001:0db8:0:1::10(src lladdr: 0:e0:18:90:92:5) (len 32,
    -¬ hlim 255)

    • Node looks for “fe80::10” now

    13:11:20.870070 fe80::2e0:18ff:fe90:9205 > ff02::1:ff00:10: icmp6: neighbor
    -¬ sol: who has fe80::10(src lladdr: 0:e0:18:90:92:5) (len 32, hlim 255)

    Chapter 15. Support for persistent IPv6 configuration in Linux distributions

    Some Linux distribution contain already support of a persistent IPv6 configuration using existing or new configuration and script files and some hook in the IPv4 script files.


    15.1. Red Hat Linux and “clones”

    Since starting writing the IPv6 & Linux - HowTo it was my intention to enable a persistent IPv6 configuration which catch most of the wished cases like host-only, router-only, dual-homed-host, router with second stub network, normal tunnels, 6to4 tunnels, and so on. Nowadays there exists a set of configuration and script files which do the job very well (never heard about real problems, but I don't know how many use the set). Because this configuration and script files are extended from time to time, they got their own homepage: initscripts-ipv6 homepage (Mirror). Because I began my IPv6 experience using a Red Hat Linux 5.0 clone, my IPv6 development systems are mostly Red Hat Linux based now, it's kind a logic that the scripts are developed for this kind of distribution (so called historic issue). Also it was very easy to extend some configuration files, create new ones and create some simple hook for calling IPv6 setup during IPv4 setup.

    Fortunately, in Red Hat Linux since 7.1 a snapshot of my IPv6 scripts is included, this was and is still further on assisted by Pekka Savola.

    Mandrake since version 8.0 also includes an IPv6-enabled initscript package, but a minor bug still prevents usage (“ifconfig” misses “inet6” before “add”).


    15.1.1. Test for IPv6 support of network configuration scripts

    You can test, whether your Linux distribution contain support for persistent IPv6 configuration using my set. Following script library should exist:

    /etc/sysconfig/network-scripts/network-functions-ipv6

    Auto-magically test:

    # test -f /etc/sysconfig/network-scripts/network-functions-ipv6 && echo "Main
    -¬ IPv6 script library exists"

    The version of the library is important if you miss some features. You can get it executing following (or easier look at the top of the file):

    # source /etc/sysconfig/network-scripts/network-functions-ipv6 &&
    -¬ getversion_ipv6_functions 
    -20011124

    In shown example, the used version is 20011124. Check this against latest information on initscripts-ipv6 homepage (Mirror) to see what has been changed. You will find there also a change-log.


    15.1.2. Short hint for enabling IPv6 on current RHL 7.1, 7.2, 7.3, ...

    • Check whether running system has already IPv6 module loaded

    # modprobe -c | grep net-pf-10
    -alias net-pf-10 off

    • If result is “off”, then enable IPv6 networking by editing /etc/sysconfig/network, add following new line

    NETWORKING_IPV6=yes

    • Reboot or restart networking using

    # service network restart

    • Now IPv6 module should be loaded

    # modprobe -c | grep ipv6
    -alias net-pf-10 ipv6

    If your system is on a link which provides router advertisement, autoconfiguration will be done automatically. For more information which settings are supported see /usr/share/doc/initscripts-$version/sysconfig.txt.


    15.2. SuSE Linux

    In newer 7.x versions there is a really rudimentary support available, see /etc/rc.config for details.

    Because of the really different configuration and script file structure it is hard (or impossible) to use the set for Red Hat Linux and clones with this distribution. -In versions 8.x they completly change their configuration setup.


    15.2.2. SuSE Linux 8.0

    15.2.2.1. IPv6 address configuration

    Edit file /etc/sysconfig/network/ifcfg-<Interface-Name> and setup following value

    IP6ADDR="<ipv6-address>/<prefix>"

    15.2.2.2. Additional information

    See file /usr/share/doc/packages/sysconfig/README


    15.2.3. SuSE Linux 8.1

    15.2.3.1. IPv6 address configuration

    Edit file /etc/sysconfig/network/ifcfg-<Interface-Name> and setup following value

    IPADDR="<ipv6-address>/<prefix>"

    15.2.3.2. Additional information

    See file /usr/share/doc/packages/sysconfig/Network


    15.3. Debian Linux

    Following information was contributed by Stephane Bortzmeyer <bortzmeyer at nic dot fr>

    1. Be sure that IPv6 is loaded, either because it is compiled into the kernel or because the module is loaded. For the latest, three solutions, adding it to /etc/modules, using the pre-up trick shown later or using kmod (not detailed here).

    2. Configure your interface. Here we assume eth0 and address (2001:0db8:1234:5::1:1). Edit /etc/network/interfaces:

    iface eth0 inet6 static
    -        pre-up modprobe ipv6
    -        address 2001:0db8:1234:5::1:1
    -        # To suppress completely autoconfiguration:
    -        # up echo 0 > /proc/sys/net/ipv6/conf/all/autoconf
    -        netmask 64
    -        # The router is autoconfigured and has no fixed address.
    -        # It is magically
    -        # found. (/proc/sys/net/ipv6/conf/all/accept_ra). Otherwise:
    -        #gateway 2001:0db8:1234:5::1

    And you reboot or you just

    # ifup --force eth0

    and you have your static address.


    15.3.1. Further information


    Chapter 16. Auto-configuration

    16.1. Stateless auto-configuration out-of-the-box

    Is supported and seen on the assigned link-local address after an IPv6-enabled interface is up.

    Example:

    # ip -6 addr show dev eth0 scope link
    -2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qlen1000
    -    inet6 fe80::211:d8ff:fe6b:f0f5/64 scope link
    -       valid_lft forever preferred_lft forever 

    16.3. Dynamic Host Configuration Protocol v6 (DHCPv6)

    After a long time discussing issues, finally RFC 3315 / Dynamic Host Configuration Protocol for IPv6 (DHCPv6) was finished. At time updating this part (10/2005) currently two implementations are available:


    Chapter 17. Mobility

    17.1. Common information

    17.1.1. Node Mobility

    Support for IPv6 mobility can be enabled in Linux by installing the MIPL2 implementation found at: http://www.mobile-ipv6.org/

    This implementation is compliant with RFC 3775. It is composed of a kernel patch and a mobility daemon called mip6d. Version 2.0.1 applies on Linux kernel 2.6.15.

    Installation and setup are described in the Linux Mobile IPv6 HOWTO.


    17.1.2. Network Mobility

    There also exists an implementation of network mobility for Linux, it is called NEPL and is based on MIPL. It can also be downloaded from: http://www.mobile-ipv6.org/.

    The HOWTO document describing setup and configuration is available at: http://www.nautilus6.org/doc/nepl-howto/.


    Chapter 18. Firewalling

    IPv6 firewalling is important, especially if using IPv6 on internal networks with global IPv6 addresses. Because unlike at IPv4 networks where in common internal hosts are protected automatically using private IPv4 addresses like RFC 1918 / Address Allocation for Private Internets or Automatic Private IP Addressing (APIPA)Google search for Microsoft + APIPA, in IPv6 normally global addresses are used and someone with IPv6 connectivity can reach all internal IPv6 enabled nodes.


    18.1. Firewalling using netfilter6

    Native IPv6 firewalling is only supported in kernel versions 2.4+. In older 2.2- you can only filter IPv6-in-IPv4 by protocol 41.

    Attention: no warranty that described rules or examples can really protect your system!

    Audit your ruleset after installation, see Section 19.3 for more.

    Since kernel version 2.6.20 (February 2007) IPv6 connection tracking is fully working (and does not break IPv4 NAT anymore like versions before)

    Since kernel version 3.9.0 (April 2013) NAT for IPv6 is supported with ip6tables >= 1.4.18

    Since kernel version 3.13 (April 2014) new framework introduced named: nftables


    18.2. Preparation

    This step is only needed if distributed kernel and netfilter doesn't fit your requirements and new features are available but still not built-in.


    18.2.1. Get sources

    Get the latest kernel source: http://www.kernel.org/

    Get the latest iptables package:


    18.2.2. Extract sources

    Change to source directory:

    # cd /path/to/src 

    Unpack and rename kernel sources

    # tar z|jxf kernel-version.tar.gz|bz2 
    -# mv linux linux-version-iptables-version+IPv6 

    Unpack iptables sources

    # tar z|jxf iptables-version.tar.gz|bz2 

    18.2.3. Apply latest iptables/IPv6-related patches to kernel source

    Change to iptables directory

    # cd iptables-version 

    Apply pending patches

    # make pending-patches KERNEL_DIR=/path/to/src/linux-version-iptables-version/ 

    Apply additional IPv6 related patches (still not in the vanilla kernel included)

    # make patch-o-matic KERNEL_DIR=/path/to/src/linux-version-iptables-version/ 

    Say yes at following options (iptables-1.2.2)

    • ah-esp.patch

    • masq-dynaddr.patch (only needed for systems with dynamic IP assigned WAN connections like PPP or PPPoE)

    • ipv6-agr.patch.ipv6

    • ipv6-ports.patch.ipv6

    • LOG.patch.ipv6

    • REJECT.patch.ipv6

    Check IPv6 extensions

    # make print-extensions 
    -Extensions found: IPv6:owner IPv6:limit IPv6:mac IPv6:multiport

    18.2.4. Configure, build and install new kernel

    Change to kernel sources

    # cd /path/to/src/linux-version-iptables-version/ 

    Edit Makefile

    - EXTRAVERSION = 
    -+ EXTRAVERSION = -iptables-version+IPv6-try 

    Run configure, enable IPv6 related

                Code maturity level options 
    -                  Prompt for development and/or incomplete code/drivers : yes 
    -            Networking options 
    -                  Network packet filtering: yes 
    -                  The IPv6 protocol: module 
    -                       IPv6: Netfilter Configuration 
    -                             IP6 tables support: module 
    -                             All new options like following: 
    -                                   limit match support: module 
    -                                   MAC address match support: module 
    -                                   Multiple port match support: module 
    -                                   Owner match support: module 
    -                                   netfilter MARK match support: module 
    -                                   Aggregated address check: module 
    -                                   Packet filtering: module 
    -                                        REJECT target support: module 
    -                                        LOG target support: module 
    -                                   Packet mangling: module 
    -                                   MARK target support: module 

    Configure other related to your system, too

    Compilation and installing: see the kernel section here and other HOWTOs


    18.2.5. Rebuild and install binaries of iptables

    Make sure, that upper kernel source tree is also available at /usr/src/linux/

    Rename older directory

    # mv /usr/src/linux /usr/src/linux.old 

    Create a new softlink

    # ln -s /path/to/src/linux-version-iptables-version /usr/src/linux 

    Rebuild SRPMS

    # rpm --rebuild /path/to/SRPMS/iptables-version-release.src.rpm 

    Install new iptables packages (iptables + iptables-ipv6)

    • On RH 7.1 systems, normally, already an older version is installed, therefore use "freshen"

    # rpm -Fhv /path/to/RPMS/cpu/iptables*-version-release.cpu.rpm 

    • If not already installed, use "install"

    # rpm -ihv /path/to/RPMS/cpu/iptables*-version-release.cpu.rpm 

    • On RH 6.2 systems, normally, no kernel 2.4.x is installed, therefore the requirements don't fit. Use "--nodeps" to install it

    # rpm -ihv --nodeps /path/to/RPMS/cpu/iptables*-version-release.cpu.rpm 

    Perhaps it's necessary to create a softlink for iptables libraries where iptables looks for them

    # ln -s /lib/iptables/ /usr/lib/iptables 

    18.3. Usage of ip6tables

    18.3.1. Check for support

    Load module, if so compiled

    # modprobe ip6_tables 

    Check for capability

    # [ ! -f /proc/net/ip6_tables_names ] && echo "Current kernel doesn't support
    -¬ 'ip6tables' firewalling (IPv6)!" 

    18.3.2. Learn how to use ip6tables

    18.3.2.1. List all IPv6 netfilter entries

    • Short

    # ip6tables -L 

    • Extended

    # ip6tables -n -v --line-numbers -L 

    18.3.2.2. List specified filter

    # ip6tables -n -v --line-numbers -L INPUT 

    18.3.2.3. Insert a log rule at the input filter with options

    # ip6tables --table filter --append INPUT  -j LOG --log-prefix "INPUT:"
    -¬ --log-level 7 

    18.3.2.4. Insert a drop rule at the input filter

    # ip6tables --table filter --append INPUT  -j DROP 

    18.3.2.5. Delete a rule by number

    # ip6tables --table filter --delete INPUT 1 

    18.3.2.6. Enable connection tracking

    Since kernel version 2.6.20 IPv6 connection tracking is well supported and should be used instead of using stateless filter rules.

    # ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

    18.3.2.7. Allow ICMPv6

    Using older kernels (unpatched kernel 2.4.5 and iptables-1.2.2) no type can be specified

    • Accept incoming ICMPv6 through tunnels

    # ip6tables -A INPUT -i sit+ -p icmpv6 -j ACCEPT 

    • Allow outgoing ICMPv6 through tunnels

    # ip6tables -A OUTPUT -o sit+ -p icmpv6 -j ACCEPT 

    Newer kernels allow specifying of ICMPv6 types:

    # ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j ACCEPT

    18.3.2.8. Rate-limiting

    Because it can happen (author already saw it to times) that an ICMPv6 storm will raise up, you should use available rate limiting for at least ICMPv6 ruleset. In addition logging rules should also get rate limiting to prevent DoS attacks against syslog and storage of log file partition. An example for a rate limited ICMPv6 looks like:

    # ip6tables -A INPUT --protocol icmpv6 --icmpv6-type echo-request
    -¬ -j ACCEPT --match limit --limit 30/minute

    18.3.2.9. Allow incoming SSH

    Here an example is shown for a ruleset which allows incoming SSH connection from a specified IPv6 address

    • Allow incoming SSH from 2001:0db8:100::1/128

    # ip6tables -A INPUT -i sit+ -p tcp -s 2001:0db8:100::1/128 --sport 512:65535
    -¬ --dport 22 -j ACCEPT 

    • Allow response packets (no longer needed if connection tracking is used!)

    # ip6tables -A OUTPUT -o sit+ -p tcp -d 2001:0db8:100::1/128 --dport 512:65535
    -¬ --sport 22 ! --syn -j ACCEPT 

    18.3.2.10. Enable tunneled IPv6-in-IPv4

    To accept tunneled IPv6-in-IPv4 packets, you have to insert rules in your IPv4 firewall setup relating to such packets, for example

    • Accept incoming IPv6-in-IPv4 on interface ppp0

    # iptables -A INPUT -i ppp0 -p ipv6 -j ACCEPT 

    • Allow outgoing IPv6-in-IPv4 to interface ppp0

    # iptables -A OUTPUT -o ppp0 -p ipv6 -j ACCEPT 

    If you have only a static tunnel, you can specify the IPv4 addresses, too, like

    • Accept incoming IPv6-in-IPv4 on interface ppp0 from tunnel endpoint 192.0.2.2

    # iptables -A INPUT -i ppp0 -p ipv6 -s 192.0.2.2 -j ACCEPT 

    • Allow outgoing IPv6-in-IPv4 to interface ppp0 to tunnel endpoint 192.0.2.2

    # iptables -A OUTPUT -o ppp0 -p ipv6 -d 192.0.2.2 -j ACCEPT 

    18.3.2.11. Protection against incoming TCP connection requests

    VERY RECOMMENDED! For security issues you should really insert a rule which blocks incoming TCP connection requests. Adapt "-i" option, if other interface names are in use!

    • Block incoming TCP connection requests to this host

    # ip6tables -I INPUT -i sit+ -p tcp --syn -j DROP 

    • Block incoming TCP connection requests to hosts behind this router

    # ip6tables -I FORWARD -i sit+ -p tcp --syn -j DROP 

    Perhaps the rules have to be placed below others, but that is work you have to think about it. Best way is to create a script and execute rules in a specified way.


    18.3.2.12. Protection against incoming UDP connection requests

    ALSO RECOMMENDED! Like mentioned on my firewall information it's possible to control the ports on outgoing UDP/TCP sessions. So if all of your local IPv6 systems are using local ports e.g. from 32768 to 60999 you are able to filter UDP connections also (until connection tracking works) like:

    • Block incoming UDP packets which cannot be responses of outgoing requests of this host

    # ip6tables -I INPUT -i sit+ -p udp ! --dport 32768:60999 -j DROP 

    • Block incoming UDP packets which cannot be responses of forwarded requests of hosts behind this router

    # ip6tables -I FORWARD -i sit+ -p udp ! --dport 32768:60999 -j DROP 

    18.3.3. Examples

    18.3.3.1. Simple example for Fedora

    Following lines show a simple firewall configuration for Fedora 6 (since kernel version 2.6.20). It was modfied from the default one (generated by system-config-firewall) for supporting connection tracking and return the proper ICMPv6 code for rejects. Incoming SSH (port 22) connections are allowed.

    File: /etc/sysconfig/ip6tables
    -
    -*filter :INPUT ACCEPT [0:0]
    -:FORWARD ACCEPT [0:0]
    -:OUTPUT ACCEPT [0:0]
    -:RH-Firewall-1-INPUT - [0:0]
    --A INPUT -j RH-Firewall-1-INPUT
    --A FORWARD -j RH-Firewall-1-INPUT
    --A RH-Firewall-1-INPUT -i lo -j ACCEPT
    --A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT
    --A RH-Firewall-1-INPUT -p 50 -j ACCEPT
    --A RH-Firewall-1-INPUT -p 51 -j ACCEPT
    --A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT
    --A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT 
    --A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
    --A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    --A RH-Firewall-1-INPUT -m state --state NEW -p tcp --dport 22 -j ACCEPT
    --A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited
    -COMMIT 

    For completeness also the IPv4 configuration is shown here:

    File: /etc/sysconfig/iptables
    -
    -*filter :INPUT ACCEPT [0:0]
    -:FORWARD ACCEPT [0:0]
    -:OUTPUT ACCEPT [0:0]
    -:RH-Firewall-1-INPUT - [0:0]
    --A INPUT -j RH-Firewall-1-INPUT
    --A FORWARD -j RH-Firewall-1-INPUT
    --A RH-Firewall-1-INPUT -i lo -j ACCEPT
    --A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
    --A RH-Firewall-1-INPUT -p 50 -j ACCEPT
    --A RH-Firewall-1-INPUT -p 51 -j ACCEPT
    --A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
    --A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
    --A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
    --A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    --A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
    --A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
    -COMMIT 

    Usage:

    • Create/modify the configuration files

    • Activate IPv4 & IPv6 firewalling

    # service iptables start
    -# service ip6tables start

    • Enable automatic start after reboot

    # chkconfig iptables on
    -# chkconfig ip6tables on

    18.3.3.2. Sophisticated example

    Following lines show a more sophisticated but still stateless filter setup as an example. Happy netfilter6 ruleset creation....

    # ip6tables -n -v -L 
    -Chain INPUT (policy DROP 0 packets, 0 bytes) 
    - pkts bytes target     prot opt in     out     source               destination
    -    0     0 extIN      all      sit+   *       ::/0                 ::/0 
    -    4   384 intIN      all      eth0   *       ::/0                 ::/0 
    -    0     0 ACCEPT     all      *      *       ::1/128              ::1/128 
    -    0     0 ACCEPT     all      lo     *       ::/0                 ::/0 
    -    0     0 LOG        all      *      *       ::/0                 ::/0       
    -¬        LOG flags 0 level 7 prefix `INPUT-default:' 
    -    0     0 DROP       all      *      *       ::/0                 ::/0 
    - 
    -Chain FORWARD (policy DROP 0 packets, 0 bytes) 
    - pkts bytes target     prot opt in     out     source               destination
    -¬ 
    -    0     0 int2ext    all      eth0   sit+    ::/0                 ::/0 
    -    0     0 ext2int    all      sit+   eth0    ::/0                 ::/0 
    -    0     0 LOG        all      *      *       ::/0                 ::/0       
    -¬        LOG flags 0 level 7 prefix `FORWARD-default:' 
    -    0     0 DROP       all      *      *       ::/0                 ::/0 
    - 
    -Chain OUTPUT (policy DROP 0 packets, 0 bytes) 
    - pkts bytes target     prot opt in     out     source               destination
    -¬ 
    -    0     0 extOUT     all      *      sit+    ::/0                 ::/0 
    -    4   384 intOUT     all      *      eth0    ::/0                 ::/0 
    -    0     0 ACCEPT     all      *      *       ::1/128              ::1/128 
    -    0     0 ACCEPT     all      *      lo      ::/0                 ::/0 
    -    0     0 LOG        all      *      *       ::/0                 ::/0       
    -¬        LOG flags 0 level 7 prefix `OUTPUT-default:' 
    -    0     0 DROP       all      *      *       ::/0                 ::/0 
    - 
    -Chain ext2int (1 references) 
    - pkts bytes target     prot opt in     out     source               destination
    -¬ 
    -    0     0 ACCEPT     icmpv6    *      *       ::/0                 ::/0 
    -    0     0 ACCEPT     tcp      *      *       ::/0                 ::/0       
    -¬        tcp spts:1:65535 dpts:1024:65535 flags:!0x16/0x02 
    -    0     0 LOG        all      *      *       ::/0                 ::/0       
    -¬        LOG flags 0 level 7 prefix `ext2int-default:' 
    -    0     0 DROP       tcp      *      *       ::/0                 ::/0 
    -    0     0 DROP       udp      *      *       ::/0                 ::/0 
    -    0     0 DROP       all      *      *       ::/0                 ::/0 
    - 
    -Chain extIN (1 references) 
    - pkts bytes target     prot opt in     out     source               destination
    -¬ 
    -    0     0 ACCEPT     tcp      *      *       3ffe:400:100::1/128  ::/0       
    -¬        tcp spts:512:65535 dpt:22 
    -    0     0 ACCEPT     tcp      *      *       3ffe:400:100::2/128  ::/0       
    -¬        tcp spts:512:65535 dpt:22 
    -    0     0 ACCEPT     icmpv6    *      *       ::/0                 ::/0 
    -    0     0 ACCEPT     tcp      *      *       ::/0                 ::/0       
    -¬        tcp spts:1:65535 dpts:1024:65535 flags:!0x16/0x02 
    -    0     0 ACCEPT     udp      *      *       ::/0                 ::/0       
    -¬        udp spts:1:65535 dpts:1024:65535 
    -    0     0 LOG        all      *      *       ::/0                 ::/0       
    -¬        limit: avg 5/min burst 5 LOG flags 0 level 7 prefix `extIN-default:' 
    -    0     0 DROP       all      *      *       ::/0                 ::/0 
    - 
    -Chain extOUT (1 references) 
    - pkts bytes target     prot opt in     out     source               destination
    -¬ 
    -    0     0 ACCEPT     tcp      *      *       ::/0                
    -¬ 2001:0db8:100::1/128tcp spt:22 dpts:512:65535 flags:!0x16/0x02 
    -    0     0 ACCEPT     tcp      *      *       ::/0                
    -¬ 2001:0db8:100::2/128tcp spt:22 dpts:512:65535 flags:!0x16/0x02 
    -    0     0 ACCEPT     icmpv6    *      *       ::/0                 ::/0 
    -    0     0 ACCEPT     tcp      *      *       ::/0                 ::/0       
    -¬        tcp spts:1024:65535 dpts:1:65535 
    -    0     0 ACCEPT     udp      *      *       ::/0                 ::/0       
    -¬        udp spts:1024:65535 dpts:1:65535 
    -    0     0 LOG        all      *      *       ::/0                 ::/0       
    -¬        LOG flags 0 level 7 prefix `extOUT-default:' 
    -    0     0 DROP       all      *      *       ::/0                 ::/0 
    - 
    -Chain int2ext (1 references) 
    - pkts bytes target     prot opt in     out     source               destination
    -¬ 
    -    0     0 ACCEPT     icmpv6    *      *       ::/0                 ::/0 
    -    0     0 ACCEPT     tcp      *      *       ::/0                 ::/0       
    -¬        tcp spts:1024:65535 dpts:1:65535 
    -    0     0 LOG        all      *      *       ::/0                 ::/0       
    -¬        LOG flags 0 level 7 prefix `int2ext:' 
    -    0     0 DROP       all      *      *       ::/0                 ::/0 
    -    0     0 LOG        all      *      *       ::/0                 ::/0       
    -¬        LOG flags 0 level 7 prefix `int2ext-default:' 
    -    0     0 DROP       tcp      *      *       ::/0                 ::/0 
    -    0     0 DROP       udp      *      *       ::/0                 ::/0 
    -    0     0 DROP       all      *      *       ::/0                 ::/0 
    - 
    -Chain intIN (1 references) 
    - pkts bytes target     prot opt in     out     source               destination
    -¬ 
    -    0     0 ACCEPT     all      *      *       ::/0                
    -¬ fe80::/ffc0:: 
    -    4   384 ACCEPT     all      *      *       ::/0                 ff02::/16 
    - 
    -Chain intOUT (1 references) 
    - pkts bytes target     prot opt in     out     source               destination
    -¬ 
    -    0     0 ACCEPT     all      *      *       ::/0                
    -¬ fe80::/ffc0:: 
    -    4   384 ACCEPT     all      *      *       ::/0                 ff02::/16 
    -    0     0 LOG        all      *      *       ::/0                 ::/0       
    -¬        LOG flags 0 level 7 prefix `intOUT-default:' 
    -    0     0 DROP       all      *      *       ::/0                 ::/0 

    18.4. Network Address Translation (NAT) using netfilter6

    Since at least Linux kernel version 3.9.0 and using ip6tables since 1.4.18 also Network Address Translation (NAT) is usable.


    18.4.1. IPv6 Masquerading

    Like in IPv4 clients behind a router can be hided by using IPv6 masquerading (hide/overlap NAT), e.g.

    # ip6tables -t nat -A POSTROUTING -o sixxs -s fec0::/64 -j MASQUERADE

    18.4.2. IPv6 Destination NAT

    A dedicated public IPv6 address can be forwarded to an internal IPv6 address, e.g.

    # ip6tables -t nat -A PREROUTING -d 2001:db8:0:1:5054:ff:fe01:2345 -i sixxs -j DNAT --to-destination fec0::5054:ff:fe01:2345

    18.4.3. IPv6 Port Forwarding

    A dedicated specified port can be forwarded to an internal system, e.g.

    # ip6tables -t nat -A PREROUTING -i sixxs -p tcp --dport 8080 -j DNAT --to-destination [fec0::1234]:80

    18.5. Firewalling using nftables

    nftables adds in addition to protocol specific tables “ip” (IPv4) and “ip6” (IPv6) support for a IPv4/IPv6 aware table named “inet”. Using this table it's possible to add only one rule and match both protocols (in case of UDP and TCP).

    Take care if rules are contained in more than one table, because the tables are checked in sequence:

    IPv4-Packet --> table "ip"  --> table "inet" --> further checks
    -IPv6-Packet --> table "ip6" --> table "inet" --> further checks

    If table “ip6” accepts the packet, also table “inet” must accept the packet, otherwise it can be dropped by a later drop rule.


    18.5.1. Preparation for nftables usage

    Install a Linux distribution which has nftables support already included. At time of writing (May 2014) at least Fedora Rawhide (upcoming version 21) has support in conjunction with nftables version 0.2.0.


    18.5.2. Basic nftables configuration

    Load kernel modules:

    # modprobe nf_tables
    -# modprobe nf_tables_ipv4
    -# modprobe nf_tables_ipv6
    -# modprobe nf_tables_inet 

    Flush iptables and ip6tables to avoid interferences:

    # iptables -F
    -# ip6tables -F

    Create filter table:

    # nft add table inet filter 

    Create input chain:

    # nft add chain inet filter input { type filter hook input priority 0 \; }

    18.5.3. Simple filter policy with nftables using only table “inet”

    18.5.3.1. Configuration

    Allow packets which are related to existing connection tracking entries

    # nft add rule inet filter input ct state established,related counter accept

    Allow IPv4 and IPv6 ICMP echo-request (aka ping)

    # nft add rule inet filter input meta nfproto ipv4 icmp type { echo-request } counter accept
    -# nft add rule inet filter input meta nfproto ipv6 icmpv6 type echo-request counter accept 

    Allow some important IPv6 ICMP traffic, without counter, but checking hop-limit for security

    # nft add rule inet filter input meta nfproto ipv6
    -¬  icmpv6 type { nd-neighbor-advert, nd-neighbor-solicit, nd-router-advert} ip6 hoplimit 1 accept
    -# nft add rule inet filter input meta nfproto ipv6
    -¬  icmpv6 type { nd-neighbor-advert, nd-neighbor-solicit, nd-router-advert} ip6 hoplimit 255 counter accept

    Allow incoming SSH for IPv4 and IPv6

    # nft add rule inet filter input tcp dport 22 ct state new tcp flags \& \(syn \| ack\) == syn counter accept

    Reject/drop others

    # nft add rule inet filter input tcp dport 0-65535 reject
    -# nft add rule inet filter input udp dport 0-65535 counter drop
    -# nft add rule inet filter input counter drop

    18.5.3.2. Result

    Table for IP version aware filter

    table inet filter {
    -	chain input {
    -		 type filter hook input priority 0;
    -		 ct state established,related counter packets 0 bytes 0 accept
    -		 ip protocol icmp icmp type { echo-request} counter packets 0 bytes 0 accept
    -		 ip6 nexthdr ipv6-icmp icmpv6 type echo-request counter packets 0 bytes 0 accept
    -		 ip6 nexthdr ipv6-icmp ip6 hoplimit 1 icmpv6 type { nd-neighbor-advert, nd-neighbor-solicit, nd-router-advert} accept
    -		 ip6 nexthdr ipv6-icmp ip6 hoplimit 255 icmpv6 type { nd-neighbor-advert, nd-neighbor-solicit, nd-router-advert} accept
    -		 tcp dport ssh ct state new tcp flags & (syn | ack) == syn counter packets 0 bytes 0 accept
    -		 tcp dport >= 0 tcp dport <= 65535 counter packets 0 bytes 0 reject
    -		 udp dport >= 0 udp dport <= 65535 counter packets 0 bytes 0 drop
    -		 log prefix counter packets 0 bytes 0 drop
    -	}
    -}

    18.5.3.3. Hints for logging

    To enable logging, an additonal kernel module must be loaded

    # modprobe xt_LOG

    BUT TAKE CARE, IT LOOKS LIKE THAT NO LOG LEVEL CAN BE SPEFICIED CURRENTLY IN nftables, resulting that events are logged with kern.emerg - POSSIBILITY OF FLODDING THE CONSOLE WITH LOG ENTRIES!

    Fir initial test with logging it can be useful to disable kernel console logging in e.g. /etc/rsyslog.conf by putting a “#” in front of the related entry and restart logging daemon

    #*.emerg    :omusrmsg:* 

    Rule from above accepting SSH on port 22, but now with logging:

    # nft add rule inet filter input tcp dport 22 ct state new tcp flags \& \(syn \| ack\) == syn log prefix \"inet/input/accept: \" counter accept

    18.5.4. Filter policy with nftables using tables “ip”, “ip6” and “inet”

    As written above, if rules should be stored in related tables, it must be assured that earlier accepts are not discarded in the further table. This can be done using “meta mark set xxxx” on every accept rule and generic rules which accepts packets with “mark xxxx”. A resulting filter set would look like the following:

    # for table in ip ip6 inet; do nft list table $table filter; done
    -table ip filter {
    -	chain input {
    -		 type filter hook input priority 0;
    -		 ct state established,related counter packets 241 bytes 25193 accept
    -		 counter packets 2 bytes 120 mark 0x00000100 accept
    -		 icmp type { echo-request} counter packets 0 bytes 0 meta mark set 0x00000100 accept
    -	}
    -}
    -table ip6 filter {
    -	chain input {
    -		 type filter hook input priority 0;
    -		 ct state established,related counter packets 14 bytes 4077 accept
    -		 counter packets 4 bytes 408 mark 0x00000100 accept
    -		 icmpv6 type echo-request counter packets 1 bytes 104 meta mark set 0x00000100
    -		 icmpv6 type { nd-neighbor-advert, nd-neighbor-solicit, nd-router-advert} counter packets 2 bytes 224 meta mark set 0x00000100 accept
    -	}
    -}
    -table inet filter {
    -	chain input {
    -		 type filter hook input priority 0;
    -		 ct state established,related counter packets 307 bytes 31974 accept
    -		 counter packets 6 bytes 528 mark 0x00000100 accept
    -		 tcp dport ssh ct state new tcp flags & (syn | ack) == syn log prefix "inet/input/accept: " meta mark set 0x00000100 counter packets 3 bytes 200 accept
    -		 log prefix "inet/input/reject: " counter packets 0 bytes 0 reject
    -	}
    -}

    Chapter 19. Security

    19.1. Node security

    It's very recommended to apply all available patches and disable all not necessary services. Also bind services to the needed IPv4/IPv6 addresses only and install local firewalling.

    More to be filled...


    19.2. Access limitations

    Many services uses the tcp_wrapper library for access control. Below is described the use of tcp_wrapper.

    More to be filled...


    19.3. IPv6 security auditing

    Currently there are no comfortable tools out which are able to check a system over network for IPv6 security issues. Neither Nessus nor any commercial security scanner is as far as I know able to scan IPv6 addresses.


    19.3.1. Legal issues

    ATTENTION: always take care that you only scan your own systems or after receiving a written order, otherwise legal issues are able to come up to you. -CHECK destination IPv6 addresses TWICE before starting a scan.


    19.3.2. Security auditing using IPv6-enabled netcat

    With the IPv6-enabled netcat (see IPv6+Linux-status-apps/security-auditing for more) you can run a portscan by wrapping a script around which run through a port range, grab banners and so on. Usage example:

    # nc6 ::1 daytime
    -13 JUL 2002 11:22:22 CEST

    19.3.3. Security auditing using IPv6-enabled nmap

    NMap, one of the best portscaner around the world, supports IPv6 since version 3.10ALPHA1. Usage example:

    # nmap -6 -sT ::1
    -Starting nmap V. 3.10ALPHA3 ( www.insecure.org/nmap/ ) 
    -Interesting ports on localhost6 (::1): 
    -(The 1600 ports scanned but not shown below are in state: closed) 
    -Port       State       Service 
    -22/tcp     open        ssh 
    -53/tcp     open        domain 
    -515/tcp    open        printer 
    -2401/tcp   open        cvspserver
    -Nmap run completed -- 1 IP address (1 host up) scanned in 0.525 seconds

    19.3.4. Security auditing using IPv6-enabled strobe

    Strobe is a (compared to NMap) more a low budget portscanner, but there is an IPv6-enabling patch available (see IPv6+Linux-status-apps/security-auditing for more). Usage example:

    # ./strobe ::1 strobe 1.05 (c) 1995-1999 Julian Assange <proff@iq.org>.
    -::1 2401 unassigned unknown
    -::1 22 ssh Secure Shell - RSA encrypted rsh 
    -::1 515 printer spooler (lpd)
    -::1 6010 unassigned unknown 
    -::1 53 domain Domain Name Server

    Note: strobe isn't really developed further on, the shown version number isn't the right one.


    19.3.5. Security auditing using online tools

    There are some IPv6 enabled online tools available which can support in testing inbound firewall configuration:


    19.3.6. Audit results

    If the result of an audit mismatch your IPv6 security policy, use IPv6 firewalling to close the holes, e.g. using netfilter6 (see Firewalling/Netfilter6 for more).

    Info: More detailed information concerning IPv6 Security can be found here:


    Chapter 20. Encryption and Authentication

    Unlike in IPv4, encryption and authentication is a mandatory feature of IPv6. Those features are normally implemented using IPsec (which can be also used by IPv4).


    20.1. Modes of using encryption and authentication

    Two modes of encryption and authentication of a connection are possible:


    20.1.1. Transport mode

    Transport mode is a real end-to-end connection mode. Here, only the payload (usually ICMP, TCP or UDP) is encrypted with their particular header, while the IP header is not encrypted (but usually included in authentication).

    Using AES-128 for encryption and SHA1 for authentication, this mode decreases the MTU by 42 octets.


    20.1.2. Tunnel mode

    Tunnel mode can be used either for end-to-end or for gateway-to-gateway connection modes. Here, the complete IP packet is being encrypted and gets a new IP header prepended, all together constituing a new IP packet (this mechanism is also known as "encapsulation")

    This mode usually decreases the MTU by 40 octets from the MTU of transport mode. I.e. using AES-128 for encryption and SHA1 for authentication 82 octets less than the normal MTU.


    20.2. Support in kernel (ESP and AH)

    20.2.1. Support in vanilla Linux kernel 2.4.x

    At the time of writing missing in vanilla up to 2.4.28. There was an issue about keeping the Linux kernel source free of export/import-control-laws regarding encryption code. This is also one case why FreeS/WAN project wasn't included in vanilla source. Perhaps a backport from 2.6.x will be done in the future.


    20.2.2. Support in vanilla Linux kernel 2.6.x

    Current versions (as time of writing 2.6.9 and upper) support native IPsec for IPv4 and IPv6.

    Implementation was helped by the USAGI project.


    20.3. Automatic key exchange (IKE)

    IPsec requires a key exchange of a secret. This is mostly done automatically by so called IKE daemons. They also handle the authentication of the peers, either by a common known secret (so called “pre-shared secret”) or by RSA keys (which can also be used from X.509 certificates).

    Currently, two different IKE daemons are available for Linux, which totally differ in configuration and usage.

    I prefer “pluto” from the *S/WAN implementation because of the easier and one-config-only setup.


    20.3.1. IKE daemon “racoon”

    The IKE daemon “racoon” is taken from the KAME project and ported to Linux. Modern Linux distributions contain this daemon in the package “ipsec-tools”. Two executables are required for a proper IPsec setup. Take a look on Linux Advanced Routing & Traffic Control HOWTO / IPSEC, too.


    20.3.1.1. Manipulation of the IPsec SA/SP database with the tool “setkey”

    “setkey” is important to define the security policy (SP) for the kernel.

    File: /etc/racoon/setkey.sh

    • Example for an end-to-end encrypted connection in transport mode

    #!/sbin/setkey -f
    -flush;
    -spdflush;
    -spdadd 2001:db8:1:1::1 2001:db8:2:2::2 any -P out ipsec esp/transport//require;
    -spdadd 2001:db8:2:2::2 2001:db8:1:1::1 any -P in  ipsec esp/transport//require;

    • Example for a end-to-end encrypted connection in tunnel mode

    #!/sbin/setkey -f
    -flush;
    -spdflush;
    -spdadd 2001:db8:1:1::1 2001:db8:2:2::2 any -P out ipsec
    -¬ esp/tunnel/2001:db8:1:1::1-2001:db8:2:2::2/require;
    -spdadd 2001:db8:2:2::2 2001:db8:1:1::1 any -P in  ipsec
    -¬ esp/tunnel/2001:db8:2:2::2-2001:db8:1:1::1/require;

    For the other peer, you have to replace “in” with “out”.


    20.3.1.2. Configuration of the IKE daemon “racoon”

    “racoon” requires a configuration file for proper execution. It includes the related settings to the security policy, which should be set up previously using “setkey”.

    File: /etc/racoon/racoon.conf

    # Racoon IKE daemon configuration file.
    -# See 'man racoon.conf' for a description of the format and entries.
    -path include "/etc/racoon";
    -path pre_shared_key "/etc/racoon/psk.txt";
    -
    -listen
    -{
    -        isakmp 2001:db8:1:1::1;
    -}
    -
    -remote 2001:db8:2:2::2
    -{
    -        exchange_mode main;
    -        lifetime time 24 hour;
    -        proposal
    -        {
    -                encryption_algorithm 3des;
    -                hash_algorithm md5;
    -                authentication_method pre_shared_key;
    -                dh_group 2;
    -        }
    -}
    -
    -# gateway-to-gateway
    -sainfo address 2001:db8:1:1::1 any address 2001:db8:2:2::2 any
    -{
    -        lifetime time 1 hour;
    -        encryption_algorithm 3des;
    -        authentication_algorithm hmac_md5;
    -        compression_algorithm deflate;
    -}
    -
    -sainfo address 2001:db8:2:2::2 any address 2001:db8:1:1::1 any
    -{
    -        lifetime time 1 hour;
    -        encryption_algorithm 3des;
    -        authentication_algorithm hmac_md5;
    -        compression_algorithm deflate;
    -} 

    Also set up the pre-shared secret:

    File: /etc/racoon/psk.txt

    # file for pre-shared keys used for IKE authentication
    -# format is: 'identifier' 'key'
    -
    -2001:db8:2:2::2 verysecret 

    20.3.1.3. Running IPsec with IKE daemon “racoon”

    At least the daemon needs to be started. For the first time, use debug and foreground mode. The following example shows a successful IKE phase 1 (ISAKMP-SA) and 2 (IPsec-SA) negotiation:

    # racoon -F -v -f /etc/racoon/racoon.conf
    -Foreground mode. 
    -2005-01-01 20:30:15: INFO: @(#)ipsec-tools 0.3.3
    -¬ (http://ipsec-tools.sourceforge.net)
    -2005-01-01 20:30:15: INFO: @(#)This product linked
    -¬ OpenSSL 0.9.7a Feb 19 2003 (http://www.openssl.org/)
    -2005-01-01 20:30:15: INFO: 2001:db8:1:1::1[500] used as isakmp port (fd=7)
    -2005-01-01 20:31:06: INFO: IPsec-SA request for 2001:db8:2:2::2
    -¬ queued due to no phase1 found.
    -2005-01-01 20:31:06: INFO: initiate new phase 1 negotiation:
    -¬ 2001:db8:1:1::1[500]<=>2001:db8:2:2::2[500]
    -2005-01-01 20:31:06: INFO: begin Identity Protection mode.
    -2005-01-01 20:31:09: INFO: ISAKMP-SA established
    -¬ 2001:db8:1:1::1[500]-2001:db8:2:2::2[500] spi:da3d3693289c9698:ac039a402b2db401
    -2005-01-01 20:31:09: INFO: initiate new phase 2 negotiation:
    -¬ 2001:6f8:900:94::2[0]<=>2001:db8:2:2::2[0]
    -2005-01-01 20:31:10: INFO: IPsec-SA established:
    -¬ ESP/Tunnel 2001:db8:2:2::2->2001:db8:1:1::1 spi=253935531(0xf22bfab) 
    -2005-01-01 20:31:10: INFO: IPsec-SA established:
    -¬ ESP/Tunnel 2001:db8:1:1::1->2001:db8:2:2::2 spi=175002564(0xa6e53c4) 

    Each direction got its own IPsec-SA (like defined in the IPsec standard). With “tcpdump” on the related interface, you will see as result of an IPv6 ping:

    20:35:55.305707 2001:db8:1:1::1 > 2001:db8:2:2::2: ESP(spi=0x0a6e53c4,seq=0x3)
    -20:35:55.537522 2001:db8:2:2::2 > 2001:db8:1:1::1: ESP(spi=0x0f22bfab,seq=0x3)

    As expected, the negotiated SPIs are being used here.

    And using “setkey”, current active parameters are shown:

    # setkey -D
    -2001:db8:1:1::1 2001:db8:2:2::2
    -        esp mode=tunnel spi=175002564(0x0a6e53c4) reqid=0(0x00000000)
    -        E: 3des-cbc  bd26bc45 aea0d249 ef9c6b89 7056080f 5d9fa49c 924e2edd
    -        A: hmac-md5  60c2c505 517dd8b7 c9609128 a5efc2db
    -        seq=0x00000000 replay=4 flags=0x00000000 state=mature
    -        created: Jan  1 20:31:10 2005   current: Jan  1 20:40:47 2005
    -        diff: 577(s)    hard: 3600(s)   soft: 2880(s)
    -        last: Jan  1 20:35:05 2005      hard: 0(s)      soft: 0(s)
    -        current: 540(bytes)     hard: 0(bytes)  soft: 0(bytes)
    -        allocated: 3    hard: 0 soft: 0
    -        sadb_seq=1 pid=22358 refcnt=0
    -2001:db8:2:2::2 2001:db8:1:1::1
    -        esp mode=tunnel spi=253935531(0x0f22bfab) reqid=0(0x00000000)
    -        E: 3des-cbc  c1ddba65 83debd62 3f6683c1 20e747ac 933d203f 4777a7ce
    -        A: hmac-md5  3f957db9 9adddc8c 44e5739d 3f53ca0e
    -        seq=0x00000000 replay=4 flags=0x00000000 state=mature
    -        created: Jan  1 20:31:10 2005   current: Jan  1 20:40:47 2005
    -        diff: 577(s)    hard: 3600(s)   soft: 2880(s)
    -        last: Jan  1 20:35:05 2005      hard: 0(s)      soft: 0(s)
    -        current: 312(bytes)     hard: 0(bytes)  soft: 0(bytes)
    -        allocated: 3    hard: 0 soft: 0
    -        sadb_seq=0 pid=22358 refcnt=0 

    20.3.2. IKE daemon “pluto”

    The IKE daemon “pluto” is included in distributions of the *S/WAN projects. *S/WAN project starts at the beginning as FreeS/WAN. Unfortunately, the FreeS/WAN project stopped further development in 2004. Because of the slow pace of development in the past, two spin-offs started: strongSwan and Openswan. Today, readily installable packages are available for at least Openswan (included in Fedora Core 3).

    A major difference to “racoon”, only one configuration file is required. Also, an initscript exists for automatic setup after booting.


    20.3.2.1. Configuration of the IKE daemon “pluto”

    The configuration is very similar to the IPv4 one, only one important option is necessary.

    File: /etc/ipsec.conf

    # /etc/ipsec.conf - Openswan IPsec configuration file
    -#
    -# Manual:     ipsec.conf.5
    -version 2.0     # conforms to second version of ipsec.conf specification
    -
    -# basic configuration
    -config setup
    -        # Debug-logging controls:  "none" for (almost) none, "all" for lots.
    -        # klipsdebug=none
    -        # plutodebug="control parsing"
    -
    -#Disable Opportunistic Encryption
    -include /etc/ipsec.d/examples/no_oe.conf
    -
    -conn ipv6-p1-p2
    -        connaddrfamily=ipv6       # Important for IPv6, but no longer needed since StrongSwan 4
    -        left=2001:db8:1:1::1
    -        right=2001:db8:2:2::2
    -        authby=secret
    -        esp=aes128-sha1
    -        ike=aes128-sha-modp1024
    -        type=transport
    -        #type=tunnel
    -        compress=no
    -        #compress=yes
    -        auto=add
    -        #auto=up

    Don't forget to define the pre-shared secret here also.

    File: /etc/ipsec.secrets

    2001:db8:1:1::1 2001:db8:2:2::2 : PSK      "verysecret"

    20.3.2.2. Running IPsec with IKE daemon “pluto”

    If installation of Openswan was successfully, an initscript should exist for starting IPsec, simply run (on each peer):

    # /etc/rc.d/init.d/ipsec start

    Afterwards, start this connection on one peer. If you saw the line “IPsec SA established”, all worked fine.

    # ipsec auto --up ipv6-peer1-peer2
    -104 "ipv6-p1-p2" #1: STATE_MAIN_I1: initiate
    -106 "ipv6-p1-p2" #1: STATE_MAIN_I2: sent MI2, expecting MR2
    -108 "ipv6-p1-p2" #1: STATE_MAIN_I3: sent MI3, expecting MR3
    -004 "ipv6-p1-p2" #1: STATE_MAIN_I4: ISAKMP SA established
    -112 "ipv6-p1-p2" #2: STATE_QUICK_I1: initiate
    -004 "ipv6-p1-p2" #2: STATE_QUICK_I2: sent QI2,
    -¬ IPsec SA established {ESP=>0xa98b7710 <0xa51e1f22} 

    Because *S/WAN and setkey/racoon do use the same IPsec implementation in Linux 2.6.x kernel, “setkey” can be used here too to show current active parameters:

    # setkey -D
    -2001:db8:1:1::1 2001:db8:2:2::2
    -        esp mode=transport spi=2844489488(0xa98b7710) reqid=16385(0x00004001)
    -        E: aes-cbc  082ee274 2744bae5 7451da37 1162b483
    -        A: hmac-sha1  b7803753 757417da 477b1c1a 64070455 ab79082c
    -        seq=0x00000000 replay=64 flags=0x00000000 state=mature
    -        created: Jan  1 21:16:32 2005   current: Jan  1 21:22:20 2005
    -        diff: 348(s)    hard: 0(s)      soft: 0(s)
    -        last:                           hard: 0(s)      soft: 0(s)
    -        current: 0(bytes)       hard: 0(bytes)  soft: 0(bytes)
    -        allocated: 0    hard: 0 soft: 0
    -        sadb_seq=1 pid=23825 refcnt=0
    -2001:db8:2:2::2 2001:db8:1:1::1
    -        esp mode=transport spi=2770214690(0xa51e1f22) reqid=16385(0x00004001)
    -        E: aes-cbc  6f59cc30 8d856056 65e07b76 552cac18
    -        A: hmac-sha1  c7c7d82b abfca8b1 5440021f e0c3b335 975b508b
    -        seq=0x00000000 replay=64 flags=0x00000000 state=mature
    -        created: Jan  1 21:16:31 2005   current: Jan  1 21:22:20 2005
    -        diff: 349(s)    hard: 0(s)      soft: 0(s)
    -        last:                           hard: 0(s)      soft: 0(s)
    -        current: 0(bytes)       hard: 0(bytes)  soft: 0(bytes)
    -        allocated: 0    hard: 0 soft: 0
    -        sadb_seq=0 pid=23825 refcnt=0 

    20.4. Additional informations:

    On Linux Kernel 2.6.x you can get the policy and status of IPsec also using “ip”:

    # ip xfrm policy
    -...
    -
    -# ip xfrm state
    -...

    Chapter 21. Quality of Service (QoS)

    IPv6 supports QoS with use of Flow Labels and Traffic Classes.

    Additional infos:


    21.1. General

    Proper working QoS is only possible on the outgoing interface of a router or host, where the bottleneck begins. Everything else is a hickup and not subject to work as expected or has a successful result.

    -------------->-------
    -           Queue 1    \
    -           --->---     ---->--------->--------->---------------
    -Big pipe   Queue 2      Queue 1 / Queue 2 / Queue 3   Thin Pipe
    -           --->----    ---->--------->--------->---------------
    -           Queue 3    /
    --------------->-------

    21.2. Linux QoS using “tc”

    Linux is using “tc” from the “iproute2” package to configure traffic shaping, generally described in the Linux Advanced Routing & Traffic Control HOWTO.


    21.2.1. Example for a constant bitrate queuing

    With the “cbq” scheduler, pipes with constant bit rates can be defined.


    21.2.1.1. Root qdisc definition

    Define root qdisc with a bandwidth of 1000 MBit/s on eth1

    # tc qdisc add dev eth1 root handle 1: cbq avpkt 1000 bandwidth 1000Mbit

    21.2.1.2. QoS class definition

    Define a class 1:1 with 1 MBit/s

    # tc class add dev eth1 parent 1: classid 1:1 cbq rate   1Mbit allot 1500 bounded 

    Define a class 1:2 with 50 MBit/s

    # tc class add dev eth1 parent 1: classid 1:2 cbq rate  50Mbit allot 1500 bounded

    Define a class 1:3 with 10 MBit/s

    # tc class add dev eth1 parent 1: classid 1:3 cbq rate  10Mbit allot 1500 bounded

    Define a class 1:4 with 200 kBit/s

    # tc class add dev eth1 parent 1: classid 1:4 cbq rate 200kbit allot 1500 bounded

    21.2.1.3. QoS filter definition

    Define a filter for IPv4 (protocol ip), TCP (match ip protocol 6 0xff) destination port 5001 (match ip dport 5001 0xffff) using class 1:2 from above

    # tc filter add dev eth1 parent 1: protocol ip   u32 match ip  protocol 6 0xff match ip dport 5001 0xffff flowid 1:1

    Define a filter for IPv6 (protocol ip), TCP (match ip6 protocol 6 0xff) destination port 5001 using class 1:2 from above

    # tc filter add dev eth1 parent 1: protocol ipv6 u32 match ip6 protocol 6 0xff match ip6 dport 5001 0xffff flowid 1:2

    Define a filter for IPv6 for packets having flow label 12345 (match ip6 flowlabel 12345 0x3ffff) using class 1:3 from above

    # tc filter add dev eth1 parent 1: protocol ipv6 u32 match ip6 flowlabel 12345 0x3ffff flowid 1:3 

    Define a filter for IPv6 for packets having Linux iptables mark 32 (handle 32 fw) specified using class 1:4 from above

    # tc filter add dev eth1 parent 1: protocol ipv6 handle 32 fw flowid 1:4

    The last filter definition requires an entry in the ip6tables to mark a packet

    # ip6tables -A POSTROUTING -t mangle -p tcp --dport 5003 -j MARK --set-mark 32 

    21.2.1.4. Testing filter definitions using iperf

    Start on server side each one one separate console:

    # iperf -V -s -p 5001
    -# iperf -V -s -p 5002
    -# iperf -V -s -p 5003

    Start on client side and compare results:

    # iperf -V -c SERVER-IPv4 -p 5001    (expected:      1 MBit/s)
    -# iperf -V -c SERVER-IPv6 -p 5001    (expected:     50 MBit/s)
    -# iperf -V -c SERVER-IPv4 -p 5002    (expected:  >> 50 MBit/s && <= 1000 MBit/s)
    -# iperf -V -c SERVER-IPv6 -p 5002    (expected:  >> 50 MBit/s && <= 1000 MBit/s)
    -# iperf -V -c SERVER-IPv4 -p 5003    (expected:  >> 50 MBit/s && <= 1000 MBit/s)
    -# iperf -V -c SERVER-IPv6 -p 5003    (expected:    200 kBit/s)

    The rate result should be as defined in the classes (see above), the results on port 5002 should be very similar independend from used IP version.


    Chapter 22. Hints for IPv6-enabled daemons

    Here some hints are shown for IPv6-enabled daemons.


    22.1. Berkeley Internet Name Domain (BIND) daemon “named”

    IPv6 is supported since version 9. Always use newest available version. At least version 9.1.3 must be used, older versions can contain remote exploitable security holes.


    22.1.1. Listening on IPv6 addresses

    Note: unlike in IPv4 current versions doesn't allow to bind a server socket to dedicated IPv6 addresses, so only any or none are valid. Because this can be a security issue, check the Access Control List (ACL) section below, too!


    22.1.1.1. Enable BIND named for listening on IPv6 address

    To enable IPv6 for listening, following options are requested to change

    options {
    -        # sure other options here, too
    -        listen-on-v6 { any; };
    -};

    This should result after restart in e.g.

    # netstat -lnptu |grep "named\W*$" 
    -tcp 0 0 :::53         :::*      LISTEN 1234/named
    -¬ # incoming TCP requests
    -udp 0 0 1.2.3.4:53    0.0.0.0:*        1234/named
    -¬ # incoming UDP requests to IPv4 1.2.3.4
    -udp 0 0 127.0.0.1:53  0.0.0.0:*        1234/named
    -¬ # incoming UDP requests to IPv4 localhost
    -udp 0 0 0.0.0.0:32868 0.0.0.0:*        1234/named
    -¬ # dynamic chosen port for outgoing queries
    -udp 0 0 :::53         :::*             1234/named
    -¬ # incoming UDP request to any IPv6

    And a simple test looks like

    # dig localhost @::1

    and should show you a result.


    22.1.1.2. Disable BIND named for listening on IPv6 address

    To disable IPv6 for listening, following options are requested to change

    options {
    -        # sure other options here, too
    -        listen-on-v6 { none; };
    -};

    22.1.2. IPv6 enabled Access Control Lists (ACL)

    IPv6 enabled ACLs are possible and should be used whenever it's possible. An example looks like following:

    acl internal-net { 
    -        127.0.0.1; 
    -        1.2.3.0/24;  
    -        2001:0db8:100::/56; 
    -        ::1/128; 
    -        ::ffff:1.2.3.4/128; 
    -};
    -acl ns-internal-net { 
    -        1.2.3.4;  
    -        1.2.3.5;  
    -        2001:0db8:100::4/128; 
    -        2001:0db8:100::5/128; 
    -};

    This ACLs can be used e.g. for queries of clients and transfer zones to secondary name-servers. This prevents also your caching name-server to be used from outside using IPv6.

    options {
    -        # sure other options here, too
    -        listen-on-v6 { none; };
    -        allow-query { internal-net; }; 
    -        allow-transfer { ns-internal-net; }; 
    -};

    It's also possible to set the allow-query and allow-transfer option for most of single zone definitions, too.


    22.1.3. Sending queries with dedicated IPv6 address

    This option is not required, but perhaps needed:

    query-source-v6 address <ipv6address|*> port <port|*>;

    22.1.4. Per zone defined dedicated IPv6 addresses

    It's also possible to define per zone some IPv6 addresses.


    22.1.4.1. Transfer source address

    Transfer source address is used for outgoing zone transfers:

    transfer-source-v6 <ipv6addr|*> [port port];

    22.1.4.2. Notify source address

    Notify source address is used for outgoing notify messages:

    notify-source-v6 <ipv6addr|*> [port port];

    22.1.6. Serving IPv6 related DNS data

    For IPv6 new types and root zones for reverse lookups are defined:

    Perhaps filled later more content, for the meantime take a look at given RFCs and

    • AAAA and reverse IP6.INT: IPv6 DNS Setup Information

    • A6, DNAME (DEPRECATED NOW!) and reverse IP6.ARPA: take a look into chapter 4 and 6 of the BIND 9 Administrator Reference Manual (ARM) distributed with the bind-package or get this here: BIND manual version 9.3

    Because IP6.INT is deprecated (but still in use), a DNS server which will support IPv6 information has to serve both reverse zones.


    22.1.6.1. Current best practice

    Because there are some troubles around using the new formats, current best practice is:

    Forward lookup support:

    • AAAA

    Reverse lookup support:

    • Reverse nibble format for zone ip6.int (FOR BACKWARD COMPATIBILITY)

    • Reverse nibble format for zone ip6.arpa (RECOMMENDED)


    22.1.7. Checking IPv6-enabled connect

    To check, whether BIND named is listening on an IPv6 socket and serving data see following examples.


    22.1.7.1. IPv6 connect, but denied by ACL

    Specifying a dedicated server for the query, an IPv6 connect can be forced:

    $ host -t aaaa www.6bone.net 2001:0db8:200:f101::1 
    -Using domain server: 
    -Name: 2001:0db8:200:f101::1 
    -Address: 2001:0db8:200:f101::1#53 
    -Aliases:
    -
    -Host www.6bone.net. not found: 5(REFUSED)

    Related log entry looks like following:

    Jan 3 12:43:32 gate named[12347]: client
    -¬ 2001:0db8:200:f101:212:34ff:fe12:3456#32770: 
    - query denied

    If you see such entries in the log, check whether requests from this client should be allowed and perhaps review your ACL configuration.


    22.1.7.2. Successful IPv6 connect

    A successful IPv6 connect looks like following:

    $ host -t aaaa www.6bone.net 2001:0db8:200:f101::1 
    -Using domain server: 
    -Name: 2001:0db8:200:f101::1 
    -Address: 2001:0db8:200:f101::1#53 
    -Aliases:
    -
    -www.6bone.net. is an alias for 6bone.net. 
    -6bone.net. has AAAA address 3ffe:b00:c18:1::10

    22.2. Internet super daemon (xinetd)

    IPv6 is supported since xinetd version around 1.8.9. Always use newest available version. At least version 2.3.3 must be used, older versions can contain remote exploitable security holes.

    Some Linux distribution contain an extra package for the IPv6 enabled xinetd, some others start the IPv6-enabled xinetd if following variable is set: NETWORKING_IPV6="yes", mostly done by /etc/sysconfig/network (only valid for Red Hat like distributions). In newer releases, one binary supports IPv4 and IPv6.

    If you enable a built-in service like e.g. daytime by modifying the configuration file in /etc/xinetd.d/daytime like

    # diff -u /etc/xinetd.d/daytime.orig /etc/xinetd.d/daytime 
    ---- /etc/xinetd.d/daytime.orig Sun Dec 16 19:00:14 2001 
    -+++ /etc/xinetd.d/daytime Sun Dec 16 19:00:22 2001 
    -@@ -10,5 +10,5 @@ 
    -        protocol = tcp 
    -        user = root 
    -        wait = no 
    --       disable = yes 
    -+       disable = no 
    - }

    After restarting the xinetd you should get a positive result like:

    # netstat -lnptu -A inet6 |grep "xinetd*" 
    -tcp 0 0 ::ffff:192.168.1.1:993  :::*  LISTEN  12345/xinetd-ipv6 
    -tcp 0 0 :::13                   :::*  LISTEN  12345/xinetd-ipv6 <- service
    -¬ daytime/tcp
    -tcp 0 0 ::ffff:192.168.1.1:143  :::*  LISTEN  12345/xinetd-ipv6

    Shown example also displays an IMAP and IMAP-SSL IPv4-only listening xinetd.

    Note: earlier versions had a problem that an IPv4-only xinetd won't start on an IPv6-enabled node and also the IPv6-enabled xinetd won't start on an IPv4-only node. This is known to be fixed in later versions, at least version 2.3.11.


    22.3. Webserver Apache2 (httpd2)

    Apache web server supports IPv6 native by maintainers since 2.0.14. Available patches for the older 1.3.x series are not current and shouldn't be used in public environment, but available at KAME / Misc.


    22.3.1. Listening on IPv6 addresses

    Note: virtual hosts on IPv6 addresses are broken in versions until 2.0.28 (a patch is available for 2.0.28). But always try latest available version first because earlier versions had some security issues.


    22.3.1.1. Virtual host listen on an IPv6 address only

    Listen [2001:0db8:100::1]:80
    -<VirtualHost [2001:0db8:100::1]:80>
    -        ServerName ipv6only.yourdomain.yourtopleveldomain
    -        # ...sure more config lines
    -</VirtualHost>

    22.3.1.2. Virtual host listen on an IPv6 and on an IPv4 address

    Listen [2001:0db8:100::2]:80 
    -Listen 1.2.3.4:80
    -<VirtualHost [2001:0db8:100::2]:80 1.2.3.4:80>
    -        ServerName ipv6andipv4.yourdomain.yourtopleveldomain
    -        # ...sure more config lines
    -</VirtualHost>

    This should result after restart in e.g.

    # netstat -lnptu |grep "httpd2\W*$" 
    -tcp 0 0 1.2.3.4:80          0.0.0.0:* LISTEN 12345/httpd2 
    -tcp 0 0 2001:0db8:100::1:80 :::*      LISTEN 12345/httpd2 
    -tcp 0 0 2001:0db8:100::2:80 :::*      LISTEN 12345/httpd2

    For simple tests use the telnet example already shown.


    22.3.1.3. Additional notes

    • Apache2 supports a method called “sendfile” to speedup serving data. Some NIC drivers also support offline checksumming. In some cases, this can lead to connection problems and invalid TCP checksums. In this cases, disable “sendfile” either by recompiling using configure option “--without-sendfile” or by using the "EnableSendfile off" directive in configuration file.


    22.4. Router Advertisement Daemon (radvd)

    The router advertisement daemon is very useful on a LAN, if clients should be auto-configured. The daemon itself should run on the Linux default IPv6 gateway router (it's not required that this is also the default IPv4 gateway, so pay attention who on your LAN is sending router advertisements).

    You can specify some information and flags which should be contained in the advertisement. Common used are

    • Prefix (needed)

    • Lifetime of the prefix

    • Frequency of sending advertisements (optional)

    After a proper configuration, the daemon sends advertisements through specified interfaces and clients are hopefully receive them and auto-magically configure addresses with received prefix and the default route.


    22.4.1. Configuring radvd

    22.4.1.1. Simple configuration

    Radvd's config file is normally /etc/radvd.conf. An simple example looks like following:

    interface eth0 { 
    -        AdvSendAdvert on;
    -        MinRtrAdvInterval 3; 
    -        MaxRtrAdvInterval 10;
    -        prefix 2001:0db8:0100:f101::/64 { 
    -                AdvOnLink on; 
    -                AdvAutonomous on; 
    -                AdvRouterAddr on; 
    -        };
    -};

    This results on client side in

    # ip -6 addr show eth0 
    -3: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 100 
    -    inet6 2001:0db8:100:f101:2e0:12ff:fe34:1234/64 scope global dynamic 
    -       valid_lft 2591992sec preferred_lft 604792sec 
    -    inet6 fe80::2e0:12ff:fe34:1234/10 scope link

    Because no lifetime was defined, a very high value was used.


    22.4.1.2. Special 6to4 configuration

    Version since 0.6.2pl3 support the automatic (re)-generation of the prefix depending on an IPv4 address of a specified interface. This can be used to distribute advertisements in a LAN after the 6to4 tunneling has changed. Mostly used behind a dynamic dial-on-demand Linux router. Because of the sure shorter lifetime of such prefix (after each dial-up, another prefix is valid), the lifetime configured to minimal values:

    interface eth0 { 
    -        AdvSendAdvert on;
    -        MinRtrAdvInterval 3; 
    -        MaxRtrAdvInterval 10;
    -        prefix 0:0:0:f101::/64 { 
    -                AdvOnLink off; 
    -                AdvAutonomous on; 
    -                AdvRouterAddr on; 
    -                Base6to4Interface ppp0;
    -                AdvPreferredLifetime 20; 
    -                AdvValidLifetime 30;
    -        };
    -};

    This results on client side in (assuming, ppp0 has currently 1.2.3.4 as local IPv4 address):

    # /sbin/ip -6 addr show eth0 
    -3: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 100 
    -   inet6 2002:0102:0304:f101:2e0:12ff:fe34:1234/64 scope global dynamic 
    -      valid_lft 22sec preferred_lft 12sec
    -   inet6 fe80::2e0:12ff:fe34:1234/10 scope link

    Because a small lifetime was defined, such prefix will be thrown away quickly, if no related advertisement was received.

    Additional note: if you do not used special 6to4 support in initscripts, you have to setup a special route on the internal interface on the router, otherwise you will get some backrouting problems. for the example showh here:

    # /sbin/ip -6 route add 2002:0102:0304:f101::/64 dev eth0 metric 1

    This route needs to be replaced every time the prefix changes, which is the case after a new IPv4 address was assigned to the dial-up interface.


    22.4.2. Debugging

    A program called “radvdump” can help you looking into sent or received advertisements. Simple to use:

    # radvdump 
    -Router advertisement from fe80::280:c8ff:feb9:cef9 (hoplimit 255) 
    -        AdvCurHopLimit: 64 
    -        AdvManagedFlag: off 
    -        AdvOtherConfigFlag: off 
    -        AdvHomeAgentFlag: off 
    -        AdvReachableTime: 0 
    -        AdvRetransTimer: 0 
    -        Prefix 2002:0102:0304:f101::/64 
    -                AdvValidLifetime: 30 
    -                AdvPreferredLifetime: 20 
    -                AdvOnLink: off 
    -                AdvAutonomous: on 
    -                AdvRouterAddr: on 
    -        Prefix 2001:0db8:100:f101::/64 
    -                AdvValidLifetime: 2592000 
    -                AdvPreferredLifetime: 604800 
    -                AdvOnLink: on 
    -                AdvAutonomous: on 
    -                AdvRouterAddr: on 
    -        AdvSourceLLAddress: 00 80 12 34 56 78

    Output shows you each advertisement package in readable format. You should see your configured values here again, if not, perhaps it's not your radvd which sends the advertisement...look for another router on the link (and take the LLAddress, which is the MAC address for tracing).


    22.5. Dynamic Host Configuration v6 Server (dhcp6s)

    DHCPv6 can be used for stateful configurations. The daemon itself need not necessary run on the Linux default IPv6 gateway router.

    You can specify more information than by using radvd. The are most similar to IPv4 DHCP server.

    After a proper configuration, the daemon reacts on received ICMPv6 multicast packets sent by a client to address ff02::1:2


    22.5.1. Configuration of the DHCPv6 server (dhcp6s)

    22.5.1.1. Simple configuration

    dhcp6s's config file is normally /etc/dhcp6s.conf. An simple example looks like following:

    interface eth0 {
    -        server-preference 255;
    -        renew-time 60;
    -        rebind-time 90;
    -        prefer-life-time 130;
    -        valid-life-time 200;
    -        allow rapid-commit;
    -        option dns_servers 2001:db8:0:f101::1 sub.domain.example;
    -        link AAA {
    -                range 2001:db8:0:f101::1000 to 2001:db8:0:f101::ffff/64;
    -                prefix 2001:db8:0:f101::/64;
    -        };
    -};

    22.5.2. Configuration of the DHCPv6 client (dhcp6c)

    22.5.2.1. Simple configuration

    dhcp6c's config file is normally /etc/dhcp6c.conf. An simple example looks like following:

    interface eth0 {
    -        send rapid-commit;
    -        request domain-name-servers;
    -}; 

    22.5.3. Usage

    22.5.3.1. dhcpv6_server

    Start server, e.g.

    # service dhcp6s start

    22.5.3.2. dhcpv6_client

    Start client in foreground, e.g.

    # dhcp6c -f eth0

    22.5.4. Debugging

    22.5.4.1. dhcpv6_server

    The server has one foreground and two debug toggles (both should be used for debugging), here is an example:

    # dhcp6s -d -D -f eth0

    22.5.4.2. dhcpv6_client

    As general debugging for test whether the IPv6 DHCP server is reable on the link use an IPv6 ping to the DHCP multicast address:

    # ping6 -I eth0 ff02::1:2

    The client has one foreground and two debug toggles, here is an example:

    # dhcp6c -d -f eth0
    -Oct/03/2005 17:18:16 dhcpv6 doesn't support hardware type 776 
    -Oct/03/2005 17:18:16 doesn't support sit0 address family 0 
    -Oct/03/2005 17:18:16 netlink_recv_rtgenmsg error 
    -Oct/03/2005 17:18:16 netlink_recv_rtgenmsg error 
    -Oct/03/2005 17:18:17 status code for this address is: success 
    -Oct/03/2005 17:18:17 status code: success 
    -Oct/03/2005 17:18:17 netlink_recv_rtgenmsg error 
    -Oct/03/2005 17:18:17 netlink_recv_rtgenmsg error 
    -Oct/03/2005 17:18:17 assigned address 2001:db8:0:f101::1002 prefix len is not
    -¬ in any RAs prefix length using 64 bit instead 
    -Oct/03/2005 17:18:17 renew time 60, rebind time 9

    Note that the netlink error messages have no impact.


    22.6. ISC Dynamic Host Configuration Server (dhcpd)

    ISC DHCP supports IPv6 since version 4.x.


    22.6.1. Configuration of the ISC DHCP server for IPv6 (dhcpd)

    Note that currently, the ISC DHCP server can only serve IPv4 or IPv6, means you have to start the daemon twice (for IPv6 with option “-6”) to support both protocols.


    22.6.1.1. Simple configuration

    Create a dedicated configuration file /etc/dhcp/dhcpd6.conf for the IPv6 part of the dhcpd. Note, that the router requires to have a interface configured with an IPv6 address out of the defined subnet.

    default-lease-time 600;
    -max-lease-time 7200; 
    -log-facility local7; 
    -subnet6 2001:db8:0:1::/64 {
    -        # Range for clients
    -        range6 2001:db8:0:1::129 2001:db8:0:1::254;
    -
    -        # Range for clients requesting a temporary address
    -        range6 2001:db8:0:1::/64 temporary;
    -
    -        # Additional options
    -        option dhcp6.name-servers fec0:0:0:1::1;
    -        option dhcp6.domain-search "domain.example";
    -
    -        # Prefix range for delegation to sub-routers
    -        prefix6 2001:db8:0:100:: 2001:db8:0:f00:: /56;
    -
    -        # Example for a fixed host address
    -        host specialclient {
    -    		host-identifier option dhcp6.client-id 00:01:00:01:4a:1f:ba:e3:60:b9:1f:01:23:45;
    -        	fixed-address6 2001:db8:0:1::127;
    -    	} 
    -} 

    Note that the “dhcp.client-id” no longer belongs to a MAC address, an unique ID is used instead! “dhcp6c” (see above) uses the file /var/lib/dhcpv6/dhcp6c_duid (would be created during first start, if not existing) as unique identity. It's a 14 byte long identifier, starting with a 2 byte length information (usually “0x000e”):

    # hexdump -e '"%07.7_ax " 1/2 "%04x" " " 14/1 "%02x:" "\n"' /var/lib/dhcpv6/dhcp6c_duid 0000000 000e 00:01:00:01:4a:1f:ba:e3:60:b9:1f:01:23:45:

    22.6.2. Usage

    22.6.2.1. dhcpd

    Start server in foreground:

    # /usr/sbin/dhcpd -6 -d -cf /etc/dhcp/dhcpd6.conf eth1 
    -Internet Systems Consortium DHCP Server 4.1.0 
    -Copyright 2004-2008 Internet Systems Consortium. 
    -All rights reserved. 
    -For info, please visit http://www.isc.org/sw/dhcp/ 
    -Not searching LDAP since ldap-server, ldap-port and ldap-base-dn were not specified in the config file 
    -Wrote 0 leases to leases file. 
    -Bound to *:547 
    -Listening on Socket/5/eth1/2001:db8:0:1::/64 
    -Sending on   Socket/5/eth1/2001:db8:0:1::/64

    22.7. DHCP Server Dibbler

    Dibbler is also a DHCP server


    22.7.1. Configuration of the Dibbler DHCP server for IPv6

    22.7.1.1. Simple configuration

    Create a dedicated configuration file /etc/dibbler/server.conf . Note, that the router requires to have a interface configured with an IPv6 address out of the defined subnet.

    log-level 8 
    -log-mode short 
    -preference 0 
    -iface "eth1" {
    - // also ranges can be defines, instead of exact values  t1 1800-2000  t2 2700-3000
    -  prefered-lifetime 3600
    -  valid-lifetime 7200
    -  class {
    -    pool 2001:6f8:12d8:1::/64
    -  }
    -  option dns-server fec0:0:0:1::1
    -  option domain domain.example
    -} 

    22.7.2. Usage

    22.7.2.1. dibbler-server

    Start server in foreground:

    # dibbler-server run 
    -| Dibbler - a portable DHCPv6, version 0.7.3 (SERVER, Linux port) 
    -| Authors : Tomasz Mrugalski<thomson(at)klub.com.pl>,Marek Senderski<msend(at)o2.pl> 
    -| Licence : GNU GPL v2 only. Developed at Gdansk University of Technology. 
    -| Homepage: http://klub.com.pl/dhcpv6/ 
    -2009.05.28 10:18:48 Server Notice    My pid (1789) is stored in /var/lib/dibbler/server.pid 
    -2009.05.28 10:18:48 Server Notice    Detected iface eth0/3, MAC=54:52:00:01:23:45. 
    -2009.05.28 10:18:48 Server Notice    Detected iface eth1/2, MAC=54:52:00:67:89:ab. 
    -2009.05.28 10:18:48 Server Notice    Detected iface lo/1, MAC=00:00:00:00:00:00. 
    -2009.05.28 10:18:48 Server Debug     Skipping database loading. 
    -2009.05.28 10:18:48 Server Debug     Cache:server-cache.xml file: parsing started, expecting 0 entries. 
    -2009.05.28 10:18:48 Server Notice    Parsing /etc/dibbler/server.conf config file... 
    -18:48 Server Debug     Setting 0 generic option(s). 
    -18:48 Server Debug     0 per-client configurations (exceptions) added. 
    -18:48 Server Debug     Parsing /etc/dibbler/server.conf done. 
    -18:48 Server Info      0 client class(es) defined. 
    -18:48 Server Debug     1 interface(s) specified in /etc/dibbler/server.conf 
    -18:48 Server Info      Mapping allow, deny list to class 0:0 allow/deny entries in total. 
    -18:48 Server Info      Interface eth1/2 configuration has been loaded. 
    -18:48 Server Notice    Running in stateful mode. 
    -18:48 Server Info      My DUID is 00:01:00:01:11:aa:6d:a7:54:52:00:67:89:ab. 
    -18:48 Server Notice    Creating multicast (ff02::1:2) socket on eth1/2 (eth1/2) interface. 
    -18:48 Server Debug     Cache: size set to 1048576 bytes, 1 cache entry size is 87 bytes, so maximum 12052 address-client pair(s) may be cached. 
    -18:48 Server Notice    Accepting connections. Next event in 4294967295 second(s).

    22.8. tcp_wrapper

    tcp_wrapper is a library which can help you to protect service against misuse.


    22.8.1. Filtering capabilities

    You can use tcp_wrapper for

    • Filtering against source addresses (IPv4 or IPv6)

    • Filtering against users (requires a running ident daemon on the client)


    22.8.2. Which program uses tcp_wrapper

    Following are known:

    • Each service which is called by xinetd (if xinetd is compiled using tcp_wrapper library)

    • sshd (if compiled using tcp_wrapper)


    22.8.3. Usage

    tcp_wrapper is controlled by two files name /etc/hosts.allow and /etc/hosts.deny. For more information see

    $ man hosts.allow

    22.8.3.1. Example for /etc/hosts.allow

    In this file, each service which should be positive filtered (means connects are accepted) need a line.

    sshd:           1.2.3. [2001:0db8:100:200::]/64
    -daytime-stream: 1.2.3. [2001:0db8:100:200::]/64

    Note: there are broken implementations around, which uses following broken IPv6 network description: [2001:0db8:100:200::/64]. Hopefully, such versions will be fixed soon.


    22.8.3.2. Example for /etc/hosts.deny

    This file contains all negative filter entries and should normally deny the rest using

    ALL: ALL

    If this node is a more sensible one you can replace the standard line above with this one, but this can cause a DoS attack (load of mailer and spool directory), if too many connects were made in short time. Perhaps a logwatch is better for such issues.

    ALL: ALL: spawn (echo "Attempt from %h %a to %d at `date`" 
    - | tee -a /var/log/tcp.deny.log | mail root@localhost)

    22.8.4. Logging

    Depending on the entry in the syslog daemon configuration file /etc/syslog.conf the tcp_wrapper logs normally into /var/log/secure.


    22.8.4.1. Refused connection

    A refused connection via IPv4 to an xinetd covered daytime service produces a line like following example

    Jan 2 20:40:44 gate xinetd-ipv6[12346]: FAIL: daytime-stream libwrap
    -¬ from=::ffff:1.2.3.4
    -Jan 2 20:32:06 gate xinetd-ipv6[12346]: FAIL: daytime-stream libwrap 
    - from=2001:0db8:100:200::212:34ff:fe12:3456

    A refused connection via IPv4 to an dual-listen sshd produces a line like following example

    Jan 2 20:24:17 gate sshd[12345]: refused connect from ::ffff:1.2.3.4
    -¬ (::ffff:1.2.3.4)
    -Jan 2 20:39:33 gate sshd[12345]: refused connect 
    - from 2001:0db8:100:200::212:34ff:fe12:3456
    -¬ (2001:0db8:100:200::212:34ff:fe12:3456)

    22.8.4.2. Permitted connection

    A permitted connection via IPv4 to an xinetd covered daytime service produces a line like following example

    Jan 2 20:37:50 gate xinetd-ipv6[12346]: START: daytime-stream pid=0
    -¬ from=::ffff:1.2.3.4 
    -Jan 2 20:37:56 gate xinetd-ipv6[12346]: START: daytime-stream pid=0 
    - from=2001:0db8:100:200::212:34ff:fe12:3456

    A permitted connection via IPv4 to an dual-listen sshd produces a line like following example

    Jan 2 20:43:10 gate sshd[21975]: Accepted password for user from ::ffff:1.2.3.4
    -¬ port 33381 ssh2
    -Jan 2 20:42:19 gate sshd[12345]: Accepted password for user 
    - from 2001:0db8:100:200::212:34ff:fe12:3456 port 33380 ssh2

    22.9. vsftpd

    22.9.1. Listening on IPv6 addresses

    Edit the configuration file, ususally /etc/vsftpd/vsftpd.conf, and adjust the listen option like

    listen_ipv6=yes

    That's all.


    22.10. proftpd

    22.10.1. Listening on IPv6 addresses

    Edit the configuration file, ususally /etc/proftpd.conf, but take care, not 100% logical in virtual host setup

    <VirtualHost 192.0.2.1>
    -        ...
    -        Bind 2001:0DB8::1
    -        ...
    -</VirtualHost>

    That's all.


    22.11. Other daemons

    Nowadays it's mostly simple, look for either a command line option or a configuration value to enable IPv6 listening. See manual page of the daemon or check related FAQs. It can happen that you can bind a daemon only to the IPv6-“any”-address (::) and not to bind to a dedicated IPv6 address, because the lack of support (depends on that what the programmer has implemented so far...).


    Chapter 23. Programming

    23.1. Programming using C-API

    Related RFCs:

    Following contents of this section is contributed by John Wenker, Sr. Software Engineer Performance Technologies San Diego, CA USA http://www.pt.com/.

    This section describes how to write IPv6 client-server applications under the Linux operating system. First thing's first, and credit must be given where it is due. The information contained in this section is derived from Chapters 2 through 4 of IPv6 Network Programming by Jun-ichiro itojun Hagino (ISBN 1-55558-318-0). The reader is encouraged to consult that book for more detailed information. It describes how to convert IPv4 applications to be IPv6 compatible in a protocol-independent way, and describes some of the common problems encountered during the conversion along with suggested solutions. At the time of this writing, this is the only book of which the author is aware that specifically addresses how to program IPv6 applications [since writing this section, the author has also become aware of the Porting applications to IPv6 HowTo by Eva M. Castro at http://jungla.dit.upm.es/~ecastro/IPv6-web/ipv6.html]. Unfortunately, of the almost 360 pages in the book, maybe 60 are actually useful (the chapters mentioned). Nevertheless, without the guidance of that book, the author would have been unable to perform his job duties or compose this HowTo. While most (but certainly not all) of the information in the Hagino book is available via the Linux 'man' pages, application programmers will save a significant amount of time and frustration by reading the indicated chapters of the book rather than searching through the 'man' pages and online documentation.

    Other than the Hagino book, any other information presented in this HowTo was obtained through trial and error. Some items or explanations may not be entirely “correct” in the grand IPv6 scheme, but seem to work in practical application.

    The discussion that follows assumes the reader is already experienced with the traditional TCP/IP socket API. For more information on traditional socket programming, the Internetworking with TCP/IP series of textbooks by Comer & Stevens is hard to beat, specifically Volume III: Client-Server Programming and Applications, Linux/POSIX Sockets Version (ISBN 0-13-032071-4). This HowTo also assumes that the reader has had at least a bare basic introduction to IPv6 and in particular the addressing scheme for network addresses (see Section 2.3).


    23.1.1. Address Structures

    This section provides a brief overview of the structures provided in the socket API to represent network addresses (or more specifically transport endpoints) when using the Internet protocols in a client-server application.


    23.1.1.1. IPv4 sockaddr_in

    In IPv4, network addresses are 32 bits long and define a network node. Addresses are written in dotted decimal notation, such as 192.0.2.1, where each number represents eight bits of the address. Such an IPv4 address is represented by the struct sockaddr_in data type, which is defined in <netinet/in.h>.

    struct sockaddr_in
    -{
    -   sa_family_t    sin_family;
    -   in_port_t      sin_port;
    -   struct in_addr sin_addr;
    -   /* Plus some padding for alignment */
    -};

    The sin_family component indicates the address family. For IPv4 addresses, this is always set to AF_INET. The sin_addr field contains the 32-bit network address (in network byte order). Finally, the sin_port component represents the transport layer port number (in network byte order). Readers should already be familiar with this structure, as this is the standard IPv4 address structure.


    23.1.1.2. IPv6 sockaddr_in6

    The biggest feature of IPv6 is its increased address space. Instead of 32-bit network addresses, IPv6 allots 128 bits to an address. Addresses are written in colon-hex notation of the form fe80::2c0:8cff:fe01:2345, where each hex number separated by colons represents 16 bits of the address. Two consecutive colons indicate a string of consecutive zeros for brevity, and at most only one double-colon may appear in the address. IPv6 addresses are represented by the struct sockaddr_in6 data type, also defined in <netinet/in.h>.

    struct sockaddr_in6
    -{
    -   sa_family_t     sin6_family;
    -   in_port_t       sin6_port;
    -   uint32_t        sin6_flowinfo;
    -   struct in6_addr sin6_addr;
    -   uint32_t        sin6_scope_id;
    -};

    The sin6_family, sin6_port, and sin6_addr components of the structure have the same meaning as the corresponding fields in the sockaddr_in structure. However, the sin6_family member is set to AF_INET6 for IPv6 addresses, and the sin6_addr field holds a 128-bit address instead of only 32 bits.

    The sin6_flowinfo field is used for flow control, but is not yet standardized and can be ignored.

    The sin6_scope_id field has an odd use, and it seems (at least to this naïve author) that the IPv6 designers took a huge step backwards when devising this. Apparently, 128-bit IPv6 network addresses are not unique. For example, it is possible to have two hosts, on separate networks, with the same link-local address (see Figure 1). In order to pass information to a specific host, more than just the network address is required; the scope identifier must also be specified. In Linux, the network interface name is used for the scope identifier (e.g. “eth0”) [be warned that the scope identifier is implementation dependent!]. Use the ifconfig(1M) command to display a list of active network interfaces.

    A colon-hex network address can be augmented with the scope identifier to produce a "scoped address”. The percent sign ('%') is used to delimit the network address from the scope identifier. For example, fe80::1%eth0 is a scoped IPv6 address where fe80::1 represents the 128-bit network address and eth0 is the network interface (i.e. the scope identifier). Thus, if a host resides on two networks, such as Host B in example below, the user now has to know which path to take in order to get to a particular host. In Figure 1, Host B addresses Host A using the scoped address fe80::1%eth0, while Host C is addressed with fe80::1%eth1.

    Host A (fe80::1) ---- eth0 ---- Host B ---- eth1 ---- Host C (fe80::1)

    Getting back to the sockaddr_in6 structure, its sin6_scope_id field contains the index of the network interface on which a host may be found. Server applications will have this field set automatically by the socket API when they accept a connection or receive a datagram. For client applications, if a scoped address is passed as the node parameter to getaddrinfo(3) (described later in this HowTo), then the sin6_scope_id field will be filled in correctly by the system upon return from the function; if a scoped address is not supplied, then the sin6_scope_id field must be explicitly set by the client software prior to attempting to communicate with the remote server. The if_nametoindex(3) function is used to translate a network interface name into its corresponding index. It is declared in <net/if.h>.


    23.1.1.3. Generic Addresses

    As any programmer familiar with the traditional TCP/IP socket API knows, several socket functions deal with "generic" pointers. For example, a pointer to a generic struct sockaddr data type is passed as a parameter to some socket functions (such as connect(2) or bind(2)) rather than a pointer to a specific address type. Be careful… the sockaddr_in6 structure is larger than the generic sockaddr structure! Thus, if your program receives a generic address whose actual type is unknown (e.g. it could be an IPv4 address structure or an IPv6 address structure), you must supply sufficient storage to hold the entire address. The struct sockaddr_storage data type is defined in <bits/socket.h> for this purpose [do not #include this file directly within an application; use <sys/socket.h> as usual, and <bits/socket.h> will be implicitly included].

    For example, consider the recvfrom(2) system call, which is used to receive a message from a remote peer. Its function prototype is:

    ssize_t recvfrom( int              s,
    -                  void            *buf,
    -                  size_t           len,
    -                  int              flags,
    -                  struct sockaddr *from,
    -                  socklen_t       *fromlen );

    The from parameter points to a generic sockaddr structure. If data can be received from an IPv6 peer on the socket referenced by s, then from should point to a data type of struct sockaddr_storage, as in the following dummy example:

    /*
    -** Read a message from a remote peer, and return a buffer pointer to
    -** the caller.
    -**
    -** 's' is the file descriptor for the socket.
    -*/
    -char *rcvMsg( int s )
    -{
    -   static char             bfr[ 1025 ];  /* Where the msg is stored. */
    -   ssize_t                 count;
    -   struct sockaddr_storage ss;           /* Where the peer adr goes. */
    -   socklen_t               sslen;
    -   sslen = sizeof( ss );
    -   count = recvfrom( s,
    -                     bfr,
    -                     sizeof( bfr ) - 1,
    -                     0,
    -                     (struct sockaddr*) &ss,
    -                     &sslen );
    -   bfr[ count ] = '\0';   /* Null-terminates the message. */
    -   return bfr;
    -}  /* End rcvMsg() */

    As seen in the above example, ss (a struct sockaddr_storage data object) is used to receive the peer address information, but it's address is typecast to a generic struct sockaddr* pointer in the call to recvfrom(2).


    23.1.2. Lookup Functions

    Traditionally, hostname and service name resolution were performed by functions such as gethostbyname(3) and getservbyname(3). These traditional lookup functions are still available, but they are not forward compatible to IPv6. Instead, the IPv6 socket API provides new lookup functions that consolidate the functionality of several traditional functions. These new lookup functions are also backward compatible with IPv4, so a programmer can use the same translation algorithm in an application for both the IPv4 and IPv6 protocols. This is an important feature, because obviously a global IPv6 infrastructure isn't going to be put in place overnight. Thus, during the transition period from IPv4 to IPv6, client-server applications should be designed with the flexibility to handle both protocols simultaneously. The example programs at the end of this chapter do just that.

    The primary lookup function in the new socket API is getaddrinfo(3). Its prototype is as follows.

    int getaddrinfo( const char             *node,
    -                 const char             *service,
    -                 const struct addrinfo  *hints,
    -                 struct addrinfo       **res );

    The node parameter is a pointer to the hostname or IP address being translated. The referenced string can be a hostname, IPv4 dotted decimal address, or IPv6 colon-hex address (possibly scoped). The service parameter is a pointer to the transport layer's service name or port number. It can be specified as a name found in /etc/services or a decimal number. getaddrinfo(3) resolves the host/service combination and returns a list of address records; a pointer to the list is placed in the location pointed at by res. For example, suppose a host can be identified by both an IPv4 and IPv6 address, and that the indicated service has both a TCP entry and UDP entry in /etc/services. In such a scenario, it is not inconceivable that four address records are returned; one for TCP/IPv6, one for UDP/IPv6, one for TCP/IPv4, and one for UDP/IPv4.

    The definition for struct addrinfo is found in <netdb.h> (as is the declaration for getaddrinfo(3) and the other functions described in this section). The structure has the following format:

    struct addrinfo
    -{
    -   int              ai_flags;
    -   int              ai_family;
    -   int              ai_socktype;
    -   int              ai_protocol;
    -   socklen_t        ai_addrlen;
    -   struct sockaddr *ai_addr;
    -   char            *ai_canonname;
    -   struct addrinfo *ai_next;
    -};

    Consult the 'man' page for getaddrinfo(3) for detailed information about the various fields; this HowTo only describes a subset of them, and only to the extent necessary for normal IPv6 programming.

    The ai_family, ai_socktype, and ai_protocol fields have the exact same meaning as the parameters to the socket(2) system call. The ai_family field indicates the protocol family (not the address family) associated with the record, and will be PF_INET6 for IPv6 or PF_INET for IPv4. The ai_socktype parameter indicates the type of socket to which the record corresponds; SOCK_STREAM for a reliable connection-oriented byte-stream or SOCK_DGRAM for connectionless communication. The ai_protocol field specifies the underlying transport protocol for the record.

    The ai_addr field points to a generic struct sockaddr object. Depending on the value in the ai_family field, it will point to either a struct sockaddr_in (PF_INET) or a struct sockaddr_in6 (PF_INET6). The ai_addrlen field contains the size of the object pointed at by the ai_addr field.

    As mentioned, getaddrinfo(3) returns a list of address records. The ai_next field points to the next record in the list.

    The hints parameter to getaddrinfo(3) is also of type struct addrinfo and acts as a filter for the address records returned in res. If hints is NULL, all matching records are returned; but if hints is non-NULL, the referenced structure gives "hints" to getaddrinfo(3) about which records to return. Only the ai_flags, ai_family, ai_socktype, and ai_protocol fields are significant in the hints structure, and all other fields should be set to zero.

    Programs can use hints->ai_family to specify the protocol family. For example, if it is set to PF_INET6, then only IPv6 address records are returned. Likewise, setting hints->ai_family to PF_INET results in only IPv4 address records being returned. If an application wants both IPv4 and IPv6 records, the field should be set to PF_UNSPEC.

    The hints->socktype field can be set to SOCK_STREAM to return only records that correspond to connection-oriented byte streams, SOCK_DGRAM to return only records corresponding to connectionless communication, or 0 to return both.

    For the Internet protocols, there is only one protocol associated with connection-oriented sockets (TCP) and one protocol associated with connectionless sockets (UDP), so setting hints->ai_socktype to SOCK_STREAM or SOCK_DGRAM is the same as saying, "Give me only TCP records," or "Give me only UDP records," respectively. With that in mind, the hints->ai_protocol field isn't really that important with the Internet protocols, and pretty much mirrors the hints->ai_socktype field. Nevertheless, hints->ai_protocol can be set to IPPROTO_TCP to return only TCP records, IPPROTO_UDP to return only UDP records, or 0 for both.

    The node or service parameter to gethostbyname(3) can be NULL, but not both. If node is NULL, then the ai_flags field of the hints parameter specifies how the network address in a returned record is set (i.e. the sin_addr or sin6_addr field of the object pointed at by the ai_addr component in a returned record). If the AI_PASSIVE flag is set in hints, then the returned network addresses are left unresolved (all zeros). This is how server applications would use getaddrinfo(3). If the flag is not set, then the address is set to the local loopback address (::1 for IPv6 or 127.0.0.1 for IPv4). This is one way a client application can specify that the target server is running on the same machine as the client. If the service parameter is NULL, the port number in the returned address records remains unresolved.

    The getaddrinfo(3) function returns zero on success, or an error code. In the case of an error, the gai_strerror(3) function is used to obtain a character pointer to an error message corresponding to the error code, just like strerror(3) does in the standard 'C' library.

    Once the address list is no longer needed, it must be freed by the application. This is done with the freeaddrinfo(3) function.

    The last function that will be mentioned in this section is getnameinfo(3). This function is the inverse of getaddrinfo(3); it is used to create a string representation of the hostname and service from a generic struct sockaddr data object. It has the following prototype.

    int getnameinfo( const struct sockaddr *sa,
    -                 socklen_t              salen,
    -                 char                  *host,
    -                 size_t                 hostlen,
    -                 char                  *serv,
    -                 size_t                 servlen,
    -                 int                    flags );

    The sa parameter points to the address structure in question, and salen contains its size. The host parameter points to a buffer where the null-terminated hostname string is placed, and the hostlen parameter is the size of that buffer. If there is no hostname that corresponds to the address, then the network address (dotted decimal or colon-hex) is placed in host. Likewise, the serv parameter points to a buffer where the null-terminated service name string (or port number) is placed, and the servlen parameter is the size of that buffer. The flags parameter modifies the function's behavior; in particular, the NI_NUMERICHOST flag indicates that the converted hostname should always be formatted in numeric form (i.e. dotted decimal or colon-hex), and the NI_NUMERICSERV flag indicates that the converted service should always be in numeric form (i.e. the port number).

    The symbols NI_MAXHOST and NI_MAXSERV are available to applications and represent the maximum size of any converted hostname or service name, respectively. Use these when declaring output buffers for getnameinfo(3).


    23.1.3. Quirks Encountered

    Before jumping into the programming examples, there are several quirks in IPv6 of which the reader should be aware. The more significant ones (in addition to the non-uniqueness of IPv6 network addresses already discussed) are described in the paragraphs below.


    23.1.3.1. IPv4 Mapped Addresses

    For security reasons that this author won't pretend to understand, "IPv4 mapped addresses" should not be allowed in IPv6-capable server applications. To put it in terms that everyone can understand, this simply means that a server should not accept IPv4 traffic on an IPv6 socket (an otherwise legal operation). An IPv4 mapped address is a mixed-format address of the form:

    ::ffff:192.0.2.1

    where the first portion is in IPv6 colon-hex format and the last portion is in IPv4 dotted decimal notation. The dotted decimal IPv4 address is the actual network address, but it is being mapped into an IPv6 compatible format.

    To prevent IPv4 mapped addresses from being accepted on an IPv6 socket, server applications must explicitly set the IPV6_V6ONLY socket option on all IPv6 sockets created [the Hagino book implies that this is only a concern with server applications. However, it has been observed during testing that if a client application uses an IPv4 mapped address to specify the target server, and the target server has IPv4 mapped addresses disabled, the connection still completes regardless. On the server side, the connection endpoint is an IPv4 socket as desired; but on the client side, the connection endpoint is an IPv6 socket. Setting the IPV6_V6ONLY socket option on the client side as well as the server side prevents any connection from being established at all.]. There's only one problem. Apparently, IPV6_V6ONLY isn't defined on all systems [or at least it wasn't in 2005 when the Hagino book was written]. The server example at the end of this chapter provides a method for handling this problem.

    If IPv4 traffic cannot be handled on IPv6 sockets, then that implies that server applications must open both an IPv4 and IPv6 socket for a particular network service if it wants to handle requests from either protocol. This goes back to the flexibility issue mentioned earlier. If getaddrinfo(3) returns multiple address records, then server applications should traverse the list and open a passive socket for each address provided.


    23.1.3.2. Cannot Specify the Scope Identifier in /etc/hosts

    It is possible to assign a hostname to an IPv6 network address in /etc/hosts. For example, the following is an excerpt from the /etc/hosts file on the author's development system.

            ::1                        localhost
    -        127.0.0.1                  localhost
    -        fe80::2c0:8cff:fe01:2345   pt141
    -        192.0.2.1                  pt141

    The "localhost" and "pt141" hostnames can be translated to either an IPv4 or IPv6 network address. So, for example, if "pt141" is passed as the node parameter to getaddrinfo(3), the function returns both an IPv4 and IPv6 address record for the host (assuming the behavior hasn't been modified by the hints parameter). Unfortunately, a scoped address cannot be used in /etc/hosts. Doing so results in getaddrinfo(3) returning only the IPv4 record.


    23.1.3.3. Client & Server Residing on the Same Machine

    Suppose a machine has the IPv4 address 192.0.2.1. A client application running on that machine can connect to a server application on the same machine by using either the local loopback address (127.0.0.1) or the network address (192.0.2.1) as the target server. Much to this author's surprise (and dismay), it turns out that an IPv6 client application cannot connect to a server application on the same machine if it uses the network address of that machine as the target; it must use the local loopback address (::1).


    23.1.4. Putting It All Together (A Client-Server Programming Example)

    Now it's time to put everything discussed thus far together into a sample client-server application. The remainder of this section is devoted to a remote time-of-day application (the 'daytime' Internet service) [I noticed that Ms. Castro used a 'daytime' example in her Porting applications to IPv6 HowTo. For the record, the source code presented here is original, developed from scratch, and any similarity between it and any other publicly available 'daytime' example is purely coincidental.]. The source code presented in this section was developed and tested on a RedHat Linux release using the 2.6 kernel (2.6.9 to be specific). Readers may use the source code freely, so long as proper credit is attributed; but of course the standard disclaimer must be given first:

    Although the sample source code is believed to be free of errors, the author makes no guarantees as to its reliability, especially considering that some error paths were intentionally omitted for brevity. Use it at your own risk!

    When you get right down to it, there really aren't that many differences between IPv4 and IPv6 applications. The trick is to code IPv6 applications in a protocol-independent manner, such that they can handle both IPv4 and IPv6 simultaneously and transparently. This sample application does just that. The only protocol-dependent code in the example occurs when printing network addresses in verbose mode; but only after the ai_family field in the addrinfo structure has been checked, so the programs know exactly what type of address they're handling at the time.


    23.1.4.1. 'Daytime' Server Code

    The server code is found in file tod6d.c (time-of-day IPv6 daemon). Once built, the server may be started using the following command syntax (assuming tod6d is the executable file):

    tod6d [-v] [service]

    ARGUMENTS:

    service

    The service (or well-known port) on which to listen. Default is "daytime".

    OPTIONS:

    -v

    Turn on verbose mode.

    The server handles both TCP and UDP requests on the network. The server source code contained in tod6d.c follows:

    /******************************************************************************
    -* File: tod6d.c
    -* Description: Contains source code for an IPv6-capable 'daytime' server.
    -* Author: John Wenker, Sr. Software Engineer,
    -*         Performance Technologies, San Diego, USA
    -******************************************************************************/
    -/*
    -** System header files.
    -*/
    -#include <errno.h>        /* errno declaration & error codes.            */
    -#include <netdb.h>        /* getaddrinfo(3) et al.                       */
    -#include <netinet/in.h>   /* sockaddr_in & sockaddr_in6 definition.      */
    -#include <stdio.h>        /* printf(3) et al.                            */
    -#include <stdlib.h>       /* exit(2).                                    */
    -#include <string.h>       /* String manipulation & memory functions.     */
    -#include <sys/poll.h>     /* poll(2) and related definitions.            */
    -#include <sys/socket.h>   /* Socket functions (socket(2), bind(2), etc). */
    -#include <time.h>         /* time(2) & ctime(3).                         */
    -#include <unistd.h>       /* getopt(3), read(2), etc.                    */
    -/*
    -** Constants.
    -*/
    -#define DFLT_SERVICE "daytime"   /* Default service name.                    */
    -#define INVALID_DESC -1          /* Invalid file descriptor.                 */
    -#define MAXCONNQLEN  3           /* Max nbr of connection requests to queue. */
    -#define MAXTCPSCKTS  2           /* One TCP socket for IPv4 & one for IPv6.  */
    -#define MAXUDPSCKTS  2           /* One UDP socket for IPv4 & one for IPv6.  */
    -#define VALIDOPTS    "v"         /* Valid command options.                   */
    -/*
    -** Simple boolean type definition.
    -*/
    -typedef enum { false = 0, true } boolean;
    -/*
    -** Prototypes for internal helper functions.
    -*/
    -static int  openSckt( const char *service,
    -                      const char *protocol,
    -                      int         desc[ ],
    -                      size_t     *descSize );
    -static void tod( int    tSckt[ ],
    -                 size_t tScktSize,
    -                 int    uSckt[ ],
    -                 size_t uScktSize );
    -/*
    -** Global (within this file only) data objects.
    -*/
    -static char        hostBfr[ NI_MAXHOST ];   /* For use w/getnameinfo(3).    */
    -static const char *pgmName;                 /* Program name w/o dir prefix. */
    -static char        servBfr[ NI_MAXSERV ];   /* For use w/getnameinfo(3).    */
    -static boolean     verbose = false;         /* Verbose mode indication.     */
    -/*
    -** Usage macro for command syntax violations.
    -*/
    -#define USAGE                                       \
    -        {                                           \
    -           fprintf( stderr,                         \
    -                    "Usage: %s [-v] [service]\n",   \
    -                    pgmName );                      \
    -           exit( 127 );                             \
    -        }  /* End USAGE macro. */
    -/*
    -** Macro to terminate the program if a system call error occurs.  The system
    -** call must be one of the usual type that returns -1 on error.  This macro is
    -** a modified version of a macro authored by Dr. V. Vinge, SDSU Dept. of
    -** Computer Science (retired)... best professor I ever had.  I hear he writes
    -** great science fiction in addition to robust code, too.
    -*/
    -#define CHK(expr)                                                   \
    -        do                                                          \
    -        {                                                           \
    -           if ( (expr) == -1 )                                      \
    -           {                                                        \
    -              fprintf( stderr,                                      \
    -                       "%s (line %d): System call ERROR - %s.\n",   \
    -                       pgmName,                                     \
    -                       __LINE__,                                    \
    -                       strerror( errno ) );                         \
    -              exit( 1 );                                            \
    -           }   /* End IF system call failed. */                     \
    -        } while ( false )
    -/******************************************************************************
    -* Function: main
    -*
    -* Description:
    -*    Set up a time-of-day server and handle network requests.  This server
    -*    handles both TCP and UDP requests.
    -*
    -* Parameters:
    -*    The usual argc and argv parameters to a main() function.
    -*
    -* Return Value:
    -*    This is a daemon program and never returns.  However, in the degenerate
    -*    case where no sockets are created, the function returns zero.
    -******************************************************************************/
    -int main( int   argc,
    -          char *argv[ ] )
    -{
    -   int         opt;
    -   const char *service   = DFLT_SERVICE;
    -   int         tSckt[ MAXTCPSCKTS ];     /* Array of TCP socket descriptors. */
    -   size_t      tScktSize = MAXTCPSCKTS;  /* Size of uSckt (# of elements).   */
    -   int         uSckt[ MAXUDPSCKTS ];     /* Array of UDP socket descriptors. */
    -   size_t      uScktSize = MAXUDPSCKTS;  /* Size of uSckt (# of elements).   */
    -   /*
    -   ** Set the program name (w/o directory prefix).
    -   */
    -   pgmName = strrchr( argv[ 0 ], '/' );
    -   pgmName = pgmName == NULL  ?  argv[ 0 ]  :  pgmName + 1;
    -   /*
    -   ** Process command options.
    -   */
    -   opterr = 0;   /* Turns off "invalid option" error messages. */
    -   while ( ( opt = getopt( argc, argv, VALIDOPTS ) ) >= 0 )
    -   {
    -      switch ( opt )
    -      {
    -         case 'v':   /* Verbose mode. */
    -         {
    -            verbose = true;
    -            break;
    -         }
    -         default:
    -         {
    -            USAGE;
    -         }
    -      }  /* End SWITCH on command option. */
    -   }  /* End WHILE processing options. */
    -   /*
    -   ** Process command line arguments.
    -   */
    -   switch ( argc - optind )
    -   {
    -      case 0:  break;
    -      case 1:  service = argv[ optind ]; break;
    -      default: USAGE;
    -   }  /* End SWITCH on number of command line arguments. */
    -   /*
    -   ** Open both a TCP and UDP socket, for both IPv4 & IPv6, on which to receive
    -   ** service requests.
    -   */
    -   if ( ( openSckt( service, "tcp", tSckt, &tScktSize ) < 0 ) ||
    -        ( openSckt( service, "udp", uSckt, &uScktSize ) < 0 ) )
    -   {
    -      exit( 1 );
    -   }
    -   /*
    -   ** Run the time-of-day server.
    -   */
    -   if ( ( tScktSize > 0 ) || ( uScktSize > 0 ) )
    -   {
    -      tod( tSckt,         /* tod() never returns. */
    -           tScktSize,
    -           uSckt,
    -           uScktSize );
    -   }
    -   /*
    -   ** Since tod() never returns, execution only gets here if no sockets were
    -   ** created.
    -   */
    -   if ( verbose )
    -   {
    -      fprintf( stderr,
    -               "%s: No sockets opened... terminating.\n",
    -               pgmName );
    -   }
    -   return 0;
    -}  /* End main() */
    -/******************************************************************************
    -* Function: openSckt
    -*
    -* Description:
    -*    Open passive (server) sockets for the indicated inet service & protocol.
    -*    Notice in the last sentence that "sockets" is plural.  During the interim
    -*    transition period while everyone is switching over to IPv6, the server
    -*    application has to open two sockets on which to listen for connections...
    -*    one for IPv4 traffic and one for IPv6 traffic.
    -*
    -* Parameters:
    -*    service  - Pointer to a character string representing the well-known port
    -*               on which to listen (can be a service name or a decimal number).
    -*    protocol - Pointer to a character string representing the transport layer
    -*               protocol (only "tcp" or "udp" are valid).
    -*    desc     - Pointer to an array into which the socket descriptors are
    -*               placed when opened.
    -*    descSize - This is a value-result parameter.  On input, it contains the
    -*               max number of descriptors that can be put into 'desc' (i.e. the
    -*               number of elements in the array).  Upon return, it will contain
    -*               the number of descriptors actually opened.  Any unused slots in
    -*               'desc' are set to INVALID_DESC.
    -*
    -* Return Value:
    -*    0 on success, -1 on error.
    -******************************************************************************/
    -static int openSckt( const char *service,
    -                     const char *protocol,
    -                     int         desc[ ],
    -                     size_t     *descSize )
    -{
    -   struct addrinfo *ai;
    -   int              aiErr;
    -   struct addrinfo *aiHead;
    -   struct addrinfo  hints    = { .ai_flags  = AI_PASSIVE,    /* Server mode. 
    -¬ */
    -                                 .ai_family = PF_UNSPEC };   /* IPv4 or IPv6.
    -¬ */
    -   size_t           maxDescs = *descSize;
    -   /*
    -   ** Initialize output parameters.  When the loop completes, *descSize is 0.
    -   */
    -   while ( *descSize > 0 )
    -   {
    -      desc[ --( *descSize ) ] = INVALID_DESC;
    -   }
    -   /*
    -   ** Check which protocol is selected (only TCP and UDP are valid).
    -   */
    -   if ( strcmp( protocol, "tcp" ) == 0 )        /* TCP protocol.     */
    -   {
    -      hints.ai_socktype = SOCK_STREAM;
    -      hints.ai_protocol = IPPROTO_TCP;
    -   }
    -   else if ( strcmp( protocol, "udp" ) == 0 )   /* UDP protocol.     */
    -   {
    -      hints.ai_socktype = SOCK_DGRAM;
    -      hints.ai_protocol = IPPROTO_UDP;
    -   }
    -   else                                         /* Invalid protocol. */
    -   {
    -      fprintf( stderr,
    -               "%s (line %d): ERROR - Unknown transport "
    -               "layer protocol \"%s\".\n",
    -               pgmName,
    -               __LINE__,
    -               protocol );
    -      return -1;
    -   }
    -   /*
    -   ** Look up the service's well-known port number.  Notice that NULL is being
    -   ** passed for the 'node' parameter, and that the AI_PASSIVE flag is set in
    -   ** 'hints'.  Thus, the program is requesting passive address information.
    -   ** The network address is initialized to :: (all zeros) for IPv6 records, or
    -   ** 0.0.0.0 for IPv4 records.
    -   */
    -   if ( ( aiErr = getaddrinfo( NULL,
    -                               service,
    -                               &hints,
    -                               &aiHead ) ) != 0 )
    -   {
    -      fprintf( stderr,
    -               "%s (line %d): ERROR - %s.\n",
    -               pgmName,
    -               __LINE__,
    -               gai_strerror( aiErr ) );
    -      return -1;
    -   }
    -   /*
    -   ** For each of the address records returned, attempt to set up a passive
    -   ** socket.
    -   */
    -   for ( ai = aiHead;
    -         ( ai != NULL ) && ( *descSize < maxDescs );
    -         ai = ai->ai_next )
    -   {
    -      if ( verbose )
    -      {
    -         /*
    -         ** Display the current address info.   Start with the protocol-
    -         ** independent fields first.
    -         */
    -         fprintf( stderr,
    -                  "Setting up a passive socket based on the "
    -                  "following address info:\n"
    -                  "   ai_flags     = 0x%02X\n"
    -                  "   ai_family    = %d (PF_INET = %d, PF_INET6 = %d)\n"
    -                  "   ai_socktype  = %d (SOCK_STREAM = %d, SOCK_DGRAM = %d)\n"
    -                  "   ai_protocol  = %d (IPPROTO_TCP = %d, IPPROTO_UDP = %d)\n"
    -                  "   ai_addrlen   = %d (sockaddr_in = %d, "
    -                  "sockaddr_in6 = %d)\n",
    -                  ai->ai_flags,
    -                  ai->ai_family,
    -                  PF_INET,
    -                  PF_INET6,
    -                  ai->ai_socktype,
    -                  SOCK_STREAM,
    -                  SOCK_DGRAM,
    -                  ai->ai_protocol,
    -                  IPPROTO_TCP,
    -                  IPPROTO_UDP,
    -                  ai->ai_addrlen,
    -                  sizeof( struct sockaddr_in ),
    -                  sizeof( struct sockaddr_in6 ) );
    -         /*
    -         ** Now display the protocol-specific formatted socket address.  Note
    -         ** that the program is requesting that getnameinfo(3) convert the
    -         ** host & service into numeric strings.
    -         */
    -         getnameinfo( ai->ai_addr,
    -                      ai->ai_addrlen,
    -                      hostBfr,
    -                      sizeof( hostBfr ),
    -                      servBfr,
    -                      sizeof( servBfr ),
    -                      NI_NUMERICHOST | NI_NUMERICSERV );
    -         switch ( ai->ai_family )
    -         {
    -            case PF_INET:   /* IPv4 address record. */
    -            {
    -               struct sockaddr_in *p = (struct sockaddr_in*) ai->ai_addr;
    -               fprintf( stderr,
    -                        "   ai_addr      = sin_family:   %d (AF_INET = %d, "
    -                        "AF_INET6 = %d)\n"
    -                        "                  sin_addr:     %s\n"
    -                        "                  sin_port:     %s\n",
    -                        p->sin_family,
    -                        AF_INET,
    -                        AF_INET6,
    -                        hostBfr,
    -                        servBfr );
    -               break;
    -            }  /* End CASE of IPv4. */
    -            case PF_INET6:   /* IPv6 address record. */
    -            {
    -               struct sockaddr_in6 *p = (struct sockaddr_in6*) ai->ai_addr;
    -               fprintf( stderr,
    -                        "   ai_addr      = sin6_family:   %d (AF_INET = %d, "
    -                        "AF_INET6 = %d)\n"
    -                        "                  sin6_addr:     %s\n"
    -                        "                  sin6_port:     %s\n"
    -                        "                  sin6_flowinfo: %d\n"
    -                        "                  sin6_scope_id: %d\n",
    -                        p->sin6_family,
    -                        AF_INET,
    -                        AF_INET6,
    -                        hostBfr,
    -                        servBfr,
    -                        p->sin6_flowinfo,
    -                        p->sin6_scope_id );
    -               break;
    -            }  /* End CASE of IPv6. */
    -            default:   /* Can never get here, but just for completeness. */
    -            {
    -               fprintf( stderr,
    -                        "%s (line %d): ERROR - Unknown protocol family (%d).\n",
    -                        pgmName,
    -                        __LINE__,
    -                        ai->ai_family );
    -               freeaddrinfo( aiHead );
    -               return -1;
    -            }  /* End DEFAULT case (unknown protocol family). */
    -         }  /* End SWITCH on protocol family. */
    -      }  /* End IF verbose mode. */
    -      /*
    -      ** Create a socket using the info in the addrinfo structure.
    -      */
    -      CHK( desc[ *descSize ] = socket( ai->ai_family,
    -                                       ai->ai_socktype,
    -                                       ai->ai_protocol ) );
    -      /*
    -      ** Here is the code that prevents "IPv4 mapped addresses", as discussed
    -      ** in Section 22.1.3.1.  If an IPv6 socket was just created, then set the
    -      ** IPV6_V6ONLY socket option.
    -      */
    -      if ( ai->ai_family == PF_INET6 )
    -      {
    -#if defined( IPV6_V6ONLY )
    -         /*
    -         ** Disable IPv4 mapped addresses.
    -         */
    -         int v6Only = 1;
    -         CHK( setsockopt( desc[ *descSize ],
    -                          IPPROTO_IPV6,
    -                          IPV6_V6ONLY,
    -                          &v6Only,
    -                          sizeof( v6Only ) ) );
    -#else
    -         /*
    -         ** IPV6_V6ONLY is not defined, so the socket option can't be set and
    -         ** thus IPv4 mapped addresses can't be disabled.  Print a warning
    -         ** message and close the socket.  Design note: If the
    -         ** #if...#else...#endif construct were removed, then this program
    -         ** would not compile (because IPV6_V6ONLY isn't defined).  That's an
    -         ** acceptable approach; IPv4 mapped addresses are certainly disabled
    -         ** if the program can't build!  However, since this program is also
    -         ** designed to work for IPv4 sockets as well as IPv6, I decided to
    -         ** allow the program to compile when IPV6_V6ONLY is not defined, and
    -         ** turn it into a run-time warning rather than a compile-time error.
    -         ** IPv4 mapped addresses are still disabled because _all_ IPv6 traffic
    -         ** is disabled (all IPv6 sockets are closed here), but at least this
    -         ** way the server can still service IPv4 network traffic.
    -         */
    -         fprintf( stderr,
    -                  "%s (line %d): WARNING - Cannot set IPV6_V6ONLY socket "
    -                  "option.  Closing IPv6 %s socket.\n",
    -                  pgmName,
    -                  __LINE__,
    -                  ai->ai_protocol == IPPROTO_TCP  ?  "TCP"  :  "UDP" );
    -         CHK( close( desc[ *descSize ] ) );
    -         continue;   /* Go to top of FOR loop w/o updating *descSize! */
    -#endif /* IPV6_V6ONLY */
    -      }  /* End IF this is an IPv6 socket. */
    -      /*
    -      ** Bind the socket.  Again, the info from the addrinfo structure is used.
    -      */
    -      CHK( bind( desc[ *descSize ],
    -                 ai->ai_addr,
    -                 ai->ai_addrlen ) );
    -      /*
    -      ** If this is a TCP socket, put the socket into passive listening mode
    -      ** (listen is only valid on connection-oriented sockets).
    -      */
    -      if ( ai->ai_socktype == SOCK_STREAM )
    -      {
    -         CHK( listen( desc[ *descSize ],
    -                      MAXCONNQLEN ) );
    -      }
    -      /*
    -      ** Socket set up okay.  Bump index to next descriptor array element.
    -      */
    -      *descSize += 1;
    -   }  /* End FOR each address info structure returned. */
    -   /*
    -   ** Dummy check for unused address records.
    -   */
    -   if ( verbose && ( ai != NULL ) )
    -   {
    -      fprintf( stderr,
    -               "%s (line %d): WARNING - Some address records were "
    -               "not processed due to insufficient array space.\n",
    -               pgmName,
    -               __LINE__ );
    -   }  /* End IF verbose and some address records remain unprocessed. */
    -   /*
    -   ** Clean up.
    -   */
    -   freeaddrinfo( aiHead );
    -   return 0;
    -}  /* End openSckt() */
    -/******************************************************************************
    -* Function: tod
    -*
    -* Description:
    -*    Listen on a set of sockets and send the current time-of-day to any
    -*    clients.  This function never returns.
    -*
    -* Parameters:
    -*    tSckt     - Array of TCP socket descriptors on which to listen.
    -*    tScktSize - Size of the tSckt array (nbr of elements).
    -*    uSckt     - Array of UDP socket descriptors on which to listen.
    -*    uScktSize - Size of the uSckt array (nbr of elements).
    -*
    -* Return Value: None.
    -******************************************************************************/
    -static void tod( int    tSckt[ ],
    -                 size_t tScktSize,
    -                 int    uSckt[ ],
    -                 size_t uScktSize )
    -{
    -   char                     bfr[ 256 ];
    -   ssize_t                  count;
    -   struct pollfd           *desc;
    -   size_t                   descSize = tScktSize + uScktSize;
    -   int                      idx;
    -   int                      newSckt;
    -   struct sockaddr         *sadr;
    -   socklen_t                sadrLen;
    -   struct sockaddr_storage  sockStor;
    -   int                      status;
    -   size_t                   timeLen;
    -   char                    *timeStr;
    -   time_t                   timeVal;
    -   ssize_t                  wBytes;
    -   /*
    -   ** Allocate memory for the poll(2) array.
    -   */
    -   desc = malloc( descSize * sizeof( struct pollfd ) );
    -   if ( desc == NULL )
    -   {
    -      fprintf( stderr,
    -               "%s (line %d): ERROR - %s.\n",
    -               pgmName,
    -               __LINE__,
    -               strerror( ENOMEM ) );
    -      exit( 1 );
    -   }
    -   /*
    -   ** Initialize the poll(2) array.
    -   */
    -   for ( idx = 0;     idx < descSize;     idx++ )
    -   {
    -      desc[ idx ].fd      = idx < tScktSize  ?  tSckt[ idx ]
    -                                             :  uSckt[ idx - tScktSize ];
    -      desc[ idx ].events  = POLLIN;
    -      desc[ idx ].revents = 0;
    -   }
    -   /*
    -   ** Main time-of-day server loop.  Handles both TCP & UDP requests.  This is
    -   ** an interative server, and all requests are handled directly within the
    -   ** main loop.
    -   */
    -   while ( true )   /* Do forever. */
    -   {
    -      /*
    -      ** Wait for activity on one of the sockets.  The DO..WHILE construct is
    -      ** used to restart the system call in the event the process is
    -      ** interrupted by a signal.
    -      */
    -      do
    -      {
    -         status = poll( desc,
    -                        descSize,
    -                        -1 /* Wait indefinitely for input. */ );
    -      } while ( ( status < 0 ) && ( errno == EINTR ) );
    -      CHK( status );   /* Check for a bona fide system call error. */
    -      /*
    -      ** Get the current time.
    -      */
    -      timeVal = time( NULL );
    -      timeStr = ctime( &timeVal );
    -      timeLen = strlen( timeStr );
    -      /*
    -      ** Indicate that there is new network activity.
    -      */
    -      if ( verbose )
    -      {
    -         char *s = malloc( timeLen+1 );
    -         strcpy( s, timeStr );
    -         s[ timeLen-1 ] = '\0';   /* Overwrite '\n' in date string. */
    -         fprintf( stderr,
    -                  "%s: New network activity on %s.\n",
    -                  pgmName,
    -                  s );
    -         free( s );
    -      }  /* End IF verbose. */
    -      /*
    -      ** Process sockets with input available.
    -      */
    -      for ( idx = 0;     idx < descSize;     idx++ )
    -      {
    -         switch ( desc[ idx ].revents )
    -         {
    -            case 0:        /* No activity on this socket; try the next. */
    -               continue;
    -            case POLLIN:   /* Network activity.  Go process it.         */
    -               break;
    -            default:       /* Invalid poll events.                      */
    -            {
    -               fprintf( stderr,
    -                        "%s (line %d): ERROR - Invalid poll event (0x%02X).\n",
    -                        pgmName,
    -                        __LINE__,
    -                        desc[ idx ].revents );
    -               exit( 1 );
    -            }
    -         }  /* End SWITCH on returned poll events. */
    -         /*
    -         ** Determine if this is a TCP request or UDP request.
    -         */
    -         if ( idx < tScktSize )
    -         {
    -            /*
    -            ** TCP connection requested.  Accept it.  Notice the use of
    -            ** the sockaddr_storage data type.
    -            */
    -            sadrLen = sizeof( sockStor );
    -            sadr    = (struct sockaddr*) &sockStor;
    -            CHK( newSckt = accept( desc[ idx ].fd,
    -                                   sadr,
    -                                   &sadrLen ) );
    -            CHK( shutdown( newSckt,       /* Server never recv's anything. */
    -                           SHUT_RD ) );
    -            if ( verbose )
    -            {
    -               /*
    -               ** Display the socket address of the remote client.  Begin with
    -               ** the address-independent fields.
    -               */
    -               fprintf( stderr,
    -                        "Sockaddr info for new TCP client:\n"
    -                        "   sa_family = %d (AF_INET = %d, AF_INET6 = %d)\n"
    -                        "   addr len  = %d (sockaddr_in = %d, "
    -                        "sockaddr_in6 = %d)\n",
    -                        sadr->sa_family,
    -                        AF_INET,
    -                        AF_INET6,
    -                        sadrLen,
    -                        sizeof( struct sockaddr_in ),
    -                        sizeof( struct sockaddr_in6 ) );
    -               /*
    -               ** Display the address-specific fields.
    -               */
    -               getnameinfo( sadr,
    -                            sadrLen,
    -                            hostBfr,
    -                            sizeof( hostBfr ),
    -                            servBfr,
    -                            sizeof( servBfr ),
    -                            NI_NUMERICHOST | NI_NUMERICSERV );
    -               /*
    -               ** Notice that we're switching on an address family now, not a
    -               ** protocol family.
    -               */
    -               switch ( sadr->sa_family )
    -               {
    -                  case AF_INET:   /* IPv4 address. */
    -                  {
    -                     struct sockaddr_in *p = (struct sockaddr_in*) sadr;
    -                     fprintf( stderr,
    -                              "   sin_addr  = sin_family: %d\n"
    -                              "               sin_addr:   %s\n"
    -                              "               sin_port:   %s\n",
    -                              p->sin_family,
    -                              hostBfr,
    -                              servBfr );
    -                     break;
    -                  }  /* End CASE of IPv4. */
    -                  case AF_INET6:   /* IPv6 address. */
    -                  {
    -                     struct sockaddr_in6 *p = (struct sockaddr_in6*) sadr;
    -                     fprintf( stderr,
    -                              "   sin6_addr = sin6_family:   %d\n"
    -                              "               sin6_addr:     %s\n"
    -                              "               sin6_port:     %s\n"
    -                              "               sin6_flowinfo: %d\n"
    -                              "               sin6_scope_id: %d\n",
    -                              p->sin6_family,
    -                              hostBfr,
    -                              servBfr,
    -                              p->sin6_flowinfo,
    -                              p->sin6_scope_id );
    -                     break;
    -                  }  /* End CASE of IPv6. */
    -                  default:   /* Can never get here, but for completeness. */
    -                  {
    -                     fprintf( stderr,
    -                              "%s (line %d): ERROR - Unknown address "
    -                              "family (%d).\n",
    -                              pgmName,
    -                              __LINE__,
    -                              sadr->sa_family );
    -                     break;
    -                  }  /* End DEFAULT case (unknown address family). */
    -               }  /* End SWITCH on address family. */
    -            }  /* End IF verbose mode. */
    -            /*
    -            ** Send the TOD to the client.
    -            */
    -            wBytes = timeLen;
    -            while ( wBytes > 0 )
    -            {
    -               do
    -               {
    -                  count = write( newSckt,
    -                                 timeStr,
    -                                 wBytes );
    -               } while ( ( count < 0 ) && ( errno == EINTR ) );
    -               CHK( count );   /* Check for a bona fide error. */
    -               wBytes -= count;
    -            }  /* End WHILE there is data to send. */
    -            CHK( close( newSckt ) );
    -         }  /* End IF this was a TCP connection request. */
    -         else
    -         {
    -            /*
    -            ** This is a UDP socket, and a datagram is available.  The funny
    -            ** thing about UDP requests is that this server doesn't require any
    -            ** client input; but it can't send the TOD unless it knows a client
    -            ** wants the data, and the only way that can occur with UDP is if
    -            ** the server receives a datagram from the client.  Thus, the
    -            ** server must receive _something_, but the content of the datagram
    -            ** is irrelevant.  Read in the datagram.  Again note the use of
    -            ** sockaddr_storage to receive the address.
    -            */
    -            sadrLen = sizeof( sockStor );
    -            sadr    = (struct sockaddr*) &sockStor;
    -            CHK( count = recvfrom( desc[ idx ].fd,
    -                                   bfr,
    -                                   sizeof( bfr ),
    -                                   0,
    -                                   sadr,
    -                                   &sadrLen ) );
    -            /*
    -            ** Display whatever was received on stdout.
    -            */
    -            if ( verbose )
    -            {
    -               ssize_t rBytes = count;
    -               fprintf( stderr,
    -                        "%s: UDP datagram received (%d bytes).\n",
    -                        pgmName,
    -                        count );
    -               while ( count > 0 )
    -               {
    -                  fputc( bfr[ rBytes - count-- ],
    -                         stdout );
    -               }
    -               if ( bfr[ rBytes-1 ] != '\n' )
    -                  fputc( '\n', stdout );   /* Newline also flushes stdout. */
    -               /*
    -               ** Display the socket address of the remote client.  Address-
    -               ** independent fields first.
    -               */
    -               fprintf( stderr,
    -                        "Remote client's sockaddr info:\n"
    -                        "   sa_family = %d (AF_INET = %d, AF_INET6 = %d)\n"
    -                        "   addr len  = %d (sockaddr_in = %d, "
    -                        "sockaddr_in6 = %d)\n",
    -                        sadr->sa_family,
    -                        AF_INET,
    -                        AF_INET6,
    -                        sadrLen,
    -                        sizeof( struct sockaddr_in ),
    -                        sizeof( struct sockaddr_in6 ) );
    -               /*
    -               ** Display the address-specific information.
    -               */
    -               getnameinfo( sadr,
    -                            sadrLen,
    -                            hostBfr,
    -                            sizeof( hostBfr ),
    -                            servBfr,
    -                            sizeof( servBfr ),
    -                            NI_NUMERICHOST | NI_NUMERICSERV );
    -               switch ( sadr->sa_family )
    -               {
    -                  case AF_INET:   /* IPv4 address. */
    -                  {
    -                     struct sockaddr_in *p = (struct sockaddr_in*) sadr;
    -                     fprintf( stderr,
    -                              "   sin_addr  = sin_family: %d\n"
    -                              "               sin_addr:   %s\n"
    -                              "               sin_port:   %s\n",
    -                              p->sin_family,
    -                              hostBfr,
    -                              servBfr );
    -                     break;
    -                  }  /* End CASE of IPv4 address. */
    -                  case AF_INET6:   /* IPv6 address. */
    -                  {
    -                     struct sockaddr_in6 *p = (struct sockaddr_in6*) sadr;
    -                     fprintf( stderr,
    -                              "   sin6_addr = sin6_family:   %d\n"
    -                              "               sin6_addr:     %s\n"
    -                              "               sin6_port:     %s\n"
    -                              "               sin6_flowinfo: %d\n"
    -                              "               sin6_scope_id: %d\n",
    -                              p->sin6_family,
    -                              hostBfr,
    -                              servBfr,
    -                              p->sin6_flowinfo,
    -                              p->sin6_scope_id );
    -                     break;
    -                  }  /* End CASE of IPv6 address. */
    -                  default:   /* Can never get here, but for completeness. */
    -                  {
    -                     fprintf( stderr,
    -                              "%s (line %d): ERROR - Unknown address "
    -                              "family (%d).\n",
    -                              pgmName,
    -                              __LINE__,
    -                              sadr->sa_family );
    -                     break;
    -                  }  /* End DEFAULT case (unknown address family). */
    -               }  /* End SWITCH on address family. */
    -            }  /* End IF verbose mode. */
    -            /*
    -            ** Send the time-of-day to the client.
    -            */
    -            wBytes = timeLen;
    -            while ( wBytes > 0 )
    -            {
    -               do
    -               {
    -                  count = sendto( desc[ idx ].fd,
    -                                  timeStr,
    -                                  wBytes,
    -                                  0,
    -                                  sadr,        /* Address & address length   */
    -                                  sadrLen );   /*    received in recvfrom(). */
    -               } while ( ( count < 0 ) && ( errno == EINTR ) );
    -               CHK( count );   /* Check for a bona fide error. */
    -               wBytes -= count;
    -            }  /* End WHILE there is data to send. */
    -         }  /* End ELSE a UDP datagram is available. */
    -         desc[ idx ].revents = 0;   /* Clear the returned poll events. */
    -      }  /* End FOR each socket descriptor. */
    -   }  /* End WHILE forever. */
    -}  /* End tod() */

    23.1.4.2. 'Daytime' TCP Client Code

    The TCP client code is found in file tod6tc.c (time-of-day IPv6 TCP client). Once built, the TCP client may be started using the following command syntax (assuming tod6tc is the executable file):

    tod6tc [-v] [-s scope_id] [host [service]]

    ARGUMENTS:

    host

    The hostname or IP address (dotted decimal or colon-hex) of the remote host providing the service. Default is "localhost".

    service

    The TCP service (or well-known port number) to which a connection attempt is made. Default is "daytime".

    OPTIONS:

    -s

    This option is only meaningful for IPv6 addresses, and is used to set the scope identifier (i.e. the network interface on which to establish the connection). Default is "eth0". If host is a scoped address, this option is ignored.

    -v

    Turn on verbose mode.

    The TCP client source code contained in tod6tc.c follows:

    /******************************************************************************
    -* File: tod6tc.c
    -* Description: Contains source code for an IPv6-capable 'daytime' TCP client.
    -* Author: John Wenker, Sr. Software Engineer
    -*         Performance Technologies, San Diego, USA
    -******************************************************************************/
    -/*
    -** System header files.
    -*/
    -#include <errno.h>        /* errno declaration and error codes.             */
    -#include <net/if.h>       /* if_nametoindex(3).                             */
    -#include <netdb.h>        /* getaddrinfo(3) and associated definitions.     */
    -#include <netinet/in.h>   /* sockaddr_in and sockaddr_in6 definitions.      */
    -#include <stdio.h>        /* printf(3) et al.                               */
    -#include <stdlib.h>       /* exit(2).                                       */
    -#include <string.h>       /* String manipulation and memory functions.      */
    -#include <sys/socket.h>   /* Socket functions (socket(2), connect(2), etc). */
    -#include <unistd.h>       /* getopt(3), read(2), etc.                       */
    -/*
    -** Constants & macros.
    -*/
    -#define DFLT_HOST      "localhost"   /* Default server name.              */
    -#define DFLT_SCOPE_ID  "eth0"        /* Default scope identifier.         */
    -#define DFLT_SERVICE   "daytime"     /* Default service name.             */
    -#define INVALID_DESC   -1            /* Invalid file (socket) descriptor. */
    -#define MAXBFRSIZE     256           /* Max bfr sz to read remote TOD.    */
    -#define VALIDOPTS      "s:v"         /* Valid command options.            */
    -/*
    -** Type definitions (for convenience).
    -*/
    -typedef enum { false = 0, true } boolean;
    -typedef struct sockaddr_in       sockaddr_in_t;
    -typedef struct sockaddr_in6      sockaddr_in6_t;
    -/*
    -** Prototypes for internal helper functions.
    -*/
    -static int  openSckt( const char   *host,
    -                      const char   *service,
    -                      unsigned int  scopeId );
    -static void tod( int sckt );
    -/*
    -** Global (within this file only) data objects.
    -*/
    -static const char *pgmName;           /* Program name (w/o directory). */
    -static boolean     verbose = false;   /* Verbose mode.                 */
    -/*
    -** Usage macro.
    -*/
    -#define USAGE                                                            \
    -        {                                                                \
    -           fprintf( stderr,                                              \
    -                    "Usage: %s [-v] [-s scope_id] [host [service]]\n",   \
    -                    pgmName );                                           \
    -           exit( 127 );                                                  \
    -        }  /* End USAGE macro. */
    -/*
    -** This "macro" (even though it's really a function) is loosely based on the
    -** CHK() macro by Dr. V. Vinge (see server code).  The status parameter is
    -** a boolean expression indicating the return code from one of the usual system
    -** calls that returns -1 on error.  If a system call error occurred, an alert
    -** is written to stderr.  It returns a boolean value indicating success/failure
    -** of the system call.
    -**
    -** Example: if ( !SYSCALL( "write",
    -**                         count = write( fd, bfr, size ) ) )
    -**          {
    -**             // Error processing... but SYSCALL() will have already taken
    -**             // care of dumping an error alert to stderr.
    -**          }
    -*/
    -static __inline boolean SYSCALL( const char *syscallName,
    -                                 int         lineNbr,
    -                                 int         status )
    -{
    -   if ( ( status == -1 ) && verbose )
    -   {
    -      fprintf( stderr,
    -               "%s (line %d): System call failed ('%s') - %s.\n",
    -               pgmName,
    -               lineNbr,
    -               syscallName,
    -               strerror( errno ) );
    -   }
    -   return status != -1;   /* True if the system call was successful. */
    -}  /* End SYSCALL() */
    -/******************************************************************************
    -* Function: main
    -*
    -* Description:
    -*    Connect to a remote time-of-day service and write the remote host's TOD to
    -*    stdout.
    -*
    -* Parameters:
    -*    The usual argc & argv parameters to a main() program.
    -*
    -* Return Value:
    -*    This function always returns zero.
    -******************************************************************************/
    -int main( int   argc,
    -          char *argv[ ] )
    -{
    -   const char   *host     = DFLT_HOST;
    -   int           opt;
    -   int           sckt;
    -   unsigned int  scopeId  = if_nametoindex( DFLT_SCOPE_ID );
    -   const char   *service  = DFLT_SERVICE;
    -   /*
    -   ** Determine the program name (w/o directory prefix).
    -   */
    -   pgmName = (const char*) strrchr( argv[ 0 ], '/' );
    -   pgmName = pgmName == NULL  ?  argv[ 0 ]  :  pgmName+1;
    -   /*
    -   ** Process command line options.
    -   */
    -   opterr = 0;   /* Turns off "invalid option" error messages. */
    -   while ( ( opt = getopt( argc, argv, VALIDOPTS ) ) != -1 )
    -   {
    -      switch ( opt )
    -      {
    -         case 's':   /* Scope identifier (IPv6 kluge). */
    -         {
    -            scopeId = if_nametoindex( optarg );
    -            if ( scopeId == 0 )
    -            {
    -               fprintf( stderr,
    -                        "%s: Unknown network interface (%s).\n",
    -                        pgmName,
    -                        optarg );
    -               USAGE;
    -            }
    -            break;
    -         }
    -         case 'v':   /* Verbose mode. */
    -         {
    -            verbose = true;
    -            break;
    -         }
    -         default:
    -         {
    -            USAGE;
    -         }
    -      }  /* End SWITCH on command option. */
    -   } /* End WHILE processing command options. */
    -   /*
    -   ** Process command arguments.  At the end of the above loop, optind is the
    -   ** index of the first NON-option argv element.
    -   */
    -   switch ( argc - optind )
    -   {
    -      case 2:   /* Both host & service are specified on the command line. */
    -      {
    -          service = argv[ optind + 1 ];
    -          /***** Fall through *****/
    -      }
    -      case 1:   /* Host is specified on the command line. */
    -      {
    -          host = argv[ optind ];
    -          /***** Fall through *****/
    -      }
    -      case 0:   /* Use default host & service. */
    -      {
    -          break;
    -      }
    -      default:
    -      {
    -         USAGE;
    -      }
    -   }  /* End SWITCH on number of command arguments. */
    -   /*
    -   ** Open a connection to the indicated host/service.
    -   **
    -   ** Note that if all three of the following conditions are met, then the
    -   ** scope identifier remains unresolved at this point.
    -   **    1) The default network interface is unknown for some reason.
    -   **    2) The -s option was not used on the command line.
    -   **    3) An IPv6 "scoped address" was not specified for the hostname on the
    -   **       command line.
    -   ** If the above three conditions are met, then only an IPv4 socket can be
    -   ** opened (connect(2) fails without the scope ID properly set for IPv6
    -   ** sockets).
    -   */
    -   if ( ( sckt = openSckt( host,
    -                           service,
    -                           scopeId ) ) == INVALID_DESC )
    -   {
    -      fprintf( stderr,
    -               "%s: Sorry... a connection could not be established.\n",
    -               pgmName );
    -      exit( 1 );
    -   }
    -   /*
    -   ** Get the remote time-of-day.
    -   */
    -   tod( sckt );
    -   /*
    -   ** Close the connection and terminate.
    -   */
    -   (void) SYSCALL( "close",
    -                   __LINE__,
    -                   close( sckt ) );
    -   return 0;
    -}  /* End main() */
    -/******************************************************************************
    -* Function: openSckt
    -*
    -* Description:
    -*    Sets up a TCP connection to a remote server.  Getaddrinfo(3) is used to
    -*    perform lookup functions and can return multiple address records (i.e. a
    -*    list of 'struct addrinfo' records).  This function traverses the list and
    -*    tries to establish a connection to the remote server.  The function ends
    -*    when either a connection has been established or all records in the list
    -*    have been processed.
    -*
    -* Parameters:
    -*    host    - A pointer to a character string representing the hostname or IP
    -*              address (IPv4 or IPv6) of the remote server.
    -*    service - A pointer to a character string representing the service name or
    -*              well-known port number.
    -*    scopeId - For IPv6 sockets only.  This is the index corresponding to the
    -*              network interface on which to set up the connection.  This
    -*              parameter is ignored for IPv4 sockets or when an IPv6 "scoped
    -*              address" is specified in 'host' (i.e. where the colon-hex
    -*              network address is augmented with the scope ID).
    -*
    -* Return Value:
    -*    Returns the socket descriptor for the connection, or INVALID_DESC if all
    -*    address records have been processed and a connection could not be
    -*    established.
    -******************************************************************************/
    -static int openSckt( const char   *host,
    -                     const char   *service,
    -                     unsigned int  scopeId )
    -{
    -   struct addrinfo *ai;
    -   int              aiErr;
    -   struct addrinfo *aiHead;
    -   struct addrinfo  hints;
    -   sockaddr_in6_t  *pSadrIn6;
    -   int              sckt;
    -   /*
    -   ** Initialize the 'hints' structure for getaddrinfo(3).
    -   **
    -   ** Notice that the 'ai_family' field is set to PF_UNSPEC, indicating to
    -   ** return both IPv4 and IPv6 address records for the host/service.  Most of
    -   ** the time, the user isn't going to care whether an IPv4 connection or an
    -   ** IPv6 connection is established; the user simply wants to exchange data
    -   ** with the remote host and doesn't care how it's done.  Sometimes, however,
    -   ** the user might want to explicitly specify the type of underlying socket.
    -   ** It is left as an exercise for the motivated reader to add a command line
    -   ** option allowing the user to specify the IP protocol, and then process the
    -   ** list of addresses accordingly (it's not that difficult).
    -   */
    -   memset( &hints, 0, sizeof( hints ) );
    -   hints.ai_family   = PF_UNSPEC;     /* IPv4 or IPv6 records (don't care). */
    -   hints.ai_socktype = SOCK_STREAM;   /* Connection-oriented byte stream.   */
    -   hints.ai_protocol = IPPROTO_TCP;   /* TCP transport layer protocol only. */
    -   /*
    -   ** Look up the host/service information.
    -   */
    -   if ( ( aiErr = getaddrinfo( host,
    -                               service,
    -                               &hints,
    -                               &aiHead ) ) != 0 )
    -   {
    -      fprintf( stderr,
    -               "%s (line %d): ERROR - %s.\n",
    -               pgmName,
    -               __LINE__,
    -               gai_strerror( aiErr ) );
    -      return INVALID_DESC;
    -   }
    -   /*
    -   ** Go through the list and try to open a connection.  Continue until either
    -   ** a connection is established or the entire list is exhausted.
    -   */
    -   for ( ai = aiHead,   sckt = INVALID_DESC;
    -         ( ai != NULL ) && ( sckt == INVALID_DESC );
    -         ai = ai->ai_next )
    -   {
    -      /*
    -      ** IPv6 kluge.  Make sure the scope ID is set.
    -      */
    -      if ( ai->ai_family == PF_INET6 )
    -      {
    -         pSadrIn6 = (sockaddr_in6_t*) ai->ai_addr;
    -         if ( pSadrIn6->sin6_scope_id == 0 )
    -         {
    -            pSadrIn6->sin6_scope_id = scopeId;
    -         }  /* End IF the scope ID wasn't set. */
    -      }  /* End IPv6 kluge. */
    -      /*
    -      ** Display the address info for the remote host.
    -      */
    -      if ( verbose )
    -      {
    -         /*
    -         ** Temporary character string buffers for host & service.
    -         */
    -         char hostBfr[ NI_MAXHOST ];
    -         char servBfr[ NI_MAXSERV ];
    -         /*
    -         ** Display the address information just fetched.  Start with the
    -         ** common (protocol-independent) stuff first.
    -         */
    -         fprintf( stderr,
    -                  "Address info:\n"
    -                  "   ai_flags     = 0x%02X\n"
    -                  "   ai_family    = %d (PF_INET = %d, PF_INET6 = %d)\n"
    -                  "   ai_socktype  = %d (SOCK_STREAM = %d, SOCK_DGRAM = %d)\n"
    -                  "   ai_protocol  = %d (IPPROTO_TCP = %d, IPPROTO_UDP = %d)\n"
    -                  "   ai_addrlen   = %d (sockaddr_in = %d, "
    -                  "sockaddr_in6 = %d)\n",
    -                  ai->ai_flags,
    -                  ai->ai_family,
    -                  PF_INET,
    -                  PF_INET6,
    -                  ai->ai_socktype,
    -                  SOCK_STREAM,
    -                  SOCK_DGRAM,
    -                  ai->ai_protocol,
    -                  IPPROTO_TCP,
    -                  IPPROTO_UDP,
    -                  ai->ai_addrlen,
    -                  sizeof( struct sockaddr_in ),
    -                  sizeof( struct sockaddr_in6 ) );
    -         /*
    -         ** Display the protocol-specific formatted address.
    -         */
    -         getnameinfo( ai->ai_addr,
    -                      ai->ai_addrlen,
    -                      hostBfr,
    -                      sizeof( hostBfr ),
    -                      servBfr,
    -                      sizeof( servBfr ),
    -                      NI_NUMERICHOST | NI_NUMERICSERV );
    -         switch ( ai->ai_family )
    -         {
    -            case PF_INET:   /* IPv4 address record. */
    -            {
    -               sockaddr_in_t *pSadrIn = (sockaddr_in_t*) ai->ai_addr;
    -               fprintf( stderr,
    -                        "   ai_addr      = sin_family: %d (AF_INET = %d, "
    -                        "AF_INET6 = %d)\n"
    -                        "                  sin_addr:   %s\n"
    -                        "                  sin_port:   %s\n",
    -                        pSadrIn->sin_family,
    -                        AF_INET,
    -                        AF_INET6,
    -                        hostBfr,
    -                        servBfr );
    -               break;
    -            }  /* End CASE of IPv4 record. */
    -            case PF_INET6:   /* IPv6 address record. */
    -            {
    -               pSadrIn6 = (sockaddr_in6_t*) ai->ai_addr;
    -               fprintf( stderr,
    -                        "   ai_addr      = sin6_family:   %d (AF_INET = %d, "
    -                        "AF_INET6 = %d)\n"
    -                        "                  sin6_addr:     %s\n"
    -                        "                  sin6_port:     %s\n"
    -                        "                  sin6_flowinfo: %d\n"
    -                        "                  sin6_scope_id: %d\n",
    -                        pSadrIn6->sin6_family,
    -                        AF_INET,
    -                        AF_INET6,
    -                        hostBfr,
    -                        servBfr,
    -                        pSadrIn6->sin6_flowinfo,
    -                        pSadrIn6->sin6_scope_id );
    -               break;
    -            }  /* End CASE of IPv6 record. */
    -            default:   /* Can never get here, but just for completeness. */
    -            {
    -               fprintf( stderr,
    -                        "%s (line %d): ERROR - Unknown protocol family (%d).\n",
    -                        pgmName,
    -                        __LINE__,
    -                        ai->ai_family );
    -               break;
    -            }  /* End DEFAULT case (unknown protocol family). */
    -         }  /* End SWITCH on protocol family. */
    -      }  /* End IF verbose mode. */
    -      /*
    -      ** Create a socket.
    -      */
    -      if ( !SYSCALL( "socket",
    -                     __LINE__,
    -                     sckt = socket( ai->ai_family,
    -                                    ai->ai_socktype,
    -                                    ai->ai_protocol ) ) )
    -      {
    -         sckt = INVALID_DESC;
    -         continue;   /* Try the next address record in the list. */
    -      }
    -      /*
    -      ** Connect to the remote host.
    -      */
    -      if ( !SYSCALL( "connect",
    -                     __LINE__,
    -                     connect( sckt,
    -                              ai->ai_addr,
    -                              ai->ai_addrlen ) ) )
    -      {
    -         (void) close( sckt );   /* Could use SYSCALL() again here, but why? */
    -         sckt = INVALID_DESC;
    -         continue;   /* Try the next address record in the list. */
    -      }
    -   }  /* End FOR each address record returned by getaddrinfo(3). */
    -   /*
    -   ** Clean up & return.
    -   */
    -   freeaddrinfo( aiHead );
    -   return sckt;
    -}  /* End openSckt() */
    -/******************************************************************************
    -* Function: tod
    -*
    -* Description:
    -*    Receive the time-of-day from the remote server and write it to stdout.
    -*
    -* Parameters:
    -*    sckt - The socket descriptor for the connection.
    -*
    -* Return Value: None.
    -******************************************************************************/
    -static void tod( int sckt )
    -{
    -   char bfr[ MAXBFRSIZE+1 ];
    -   int  inBytes;
    -   /*
    -   ** The client never sends anything, so shut down the write side of the
    -   ** connection.
    -   */
    -   if ( !SYSCALL( "shutdown",
    -                  __LINE__,
    -                  shutdown( sckt, SHUT_WR ) ) )
    -   {
    -      return;
    -   }
    -   /*
    -   ** Read the time-of-day from the remote host.
    -   */
    -   do
    -   {
    -      if ( !SYSCALL( "read",
    -                     __LINE__,
    -                     inBytes = read( sckt,
    -                                     bfr,
    -                                     MAXBFRSIZE ) ) )
    -      {
    -         return;
    -      }
    -      bfr[ inBytes ] = '\0';   /* Null-terminate the received string. */
    -      fputs( bfr, stdout );    /* Null string if EOF (inBytes == 0).  */
    -   } while ( inBytes > 0 );
    -   fflush( stdout );
    -}  /* End tod() */

    23.1.4.3. 'Daytime' UDP Client Code

    The UDP client code is found in file tod6uc.c (time-of-day IPv6 UDP client). It is almost an exact duplicate of the TCP client (and in fact was derived from it), but is included in this HowTo for completeness. Once built, the UDP client may be started using the following command syntax (assuming tod6uc is the executable file):

    tod6uc [-v] [-s scope_id] [host [service]]

    ARGUMENTS:

    host

    The hostname or IP address (dotted decimal or colon-hex) of the remote host providing the service. Default is "localhost".

    service

    The UDP service (or well-known port number) to which datagrams are sent. Default is "daytime".

    OPTIONS:

    -s

    This option is only meaningful for IPv6 addresses, and is used to set the scope identifier (i.e. the network interface on which to exchange datagrams). Default is "eth0". If host is a scoped address, this option is ignored.

    -v

    Turn on verbose mode.

    The UDP client source code contained in tod6uc.c follows:

    /******************************************************************************
    -* File: tod6uc.c
    -* Description: Contains source code for an IPv6-capable 'daytime' UDP client.
    -* Author: John Wenker, Sr. Software Engineer
    -*         Performance Technologies, San Diego, USA
    -******************************************************************************/
    -/*
    -** System header files.
    -*/
    -#include <errno.h>        /* errno declaration and error codes.             */
    -#include <net/if.h>       /* if_nametoindex(3).                             */
    -#include <netdb.h>        /* getaddrinfo(3) and associated definitions.     */
    -#include <netinet/in.h>   /* sockaddr_in and sockaddr_in6 definitions.      */
    -#include <stdio.h>        /* printf(3) et al.                               */
    -#include <stdlib.h>       /* exit(2).                                       */
    -#include <string.h>       /* String manipulation and memory functions.      */
    -#include <sys/socket.h>   /* Socket functions (socket(2), connect(2), etc). */
    -#include <unistd.h>       /* getopt(3), recvfrom(2), sendto(2), etc.        */
    -/*
    -** Constants & macros.
    -*/
    -#define DFLT_HOST      "localhost"   /* Default server name.              */
    -#define DFLT_SCOPE_ID  "eth0"        /* Default scope identifier.         */
    -#define DFLT_SERVICE   "daytime"     /* Default service name.             */
    -#define INVALID_DESC   -1            /* Invalid file (socket) descriptor. */
    -#define MAXBFRSIZE     256           /* Max bfr sz to read remote TOD.    */
    -#define VALIDOPTS      "s:v"         /* Valid command options.            */
    -/*
    -** Type definitions (for convenience).
    -*/
    -typedef enum { false = 0, true } boolean;
    -typedef struct sockaddr_in       sockaddr_in_t;
    -typedef struct sockaddr_in6      sockaddr_in6_t;
    -/*
    -** Prototypes for internal helper functions.
    -*/
    -static int  openSckt( const char   *host,
    -                      const char   *service,
    -                      unsigned int  scopeId );
    -static void tod( int sckt );
    -/*
    -** Global (within this file only) data objects.
    -*/
    -static const char *pgmName;           /* Program name (w/o directory). */
    -static boolean     verbose = false;   /* Verbose mode.                 */
    -/*
    -** Usage macro.
    -*/
    -#define USAGE                                                            \
    -        {                                                                \
    -           fprintf( stderr,                                              \
    -                    "Usage: %s [-v] [-s scope_id] [host [service]]\n",   \
    -                    pgmName );                                           \
    -           exit( 127 );                                                  \
    -        }  /* End USAGE macro. */
    -/*
    -** This "macro" (even though it's really a function) is loosely based on the
    -** CHK() macro by Dr. V. Vinge (see server code).  The status parameter is
    -** a boolean expression indicating the return code from one of the usual system
    -** calls that returns -1 on error.  If a system call error occurred, an alert
    -** is written to stderr.  It returns a boolean value indicating success/failure
    -** of the system call.
    -**
    -** Example: if ( !SYSCALL( "write",
    -**                         count = write( fd, bfr, size ) ) )
    -**          {
    -**             // Error processing... but SYSCALL() will have already taken
    -**             // care of dumping an error alert to stderr.
    -**          }
    -*/
    -static __inline boolean SYSCALL( const char *syscallName,
    -                                 int         lineNbr,
    -                                 int         status )
    -{
    -   if ( ( status == -1 ) && verbose )
    -   {
    -      fprintf( stderr,
    -               "%s (line %d): System call failed ('%s') - %s.\n",
    -               pgmName,
    -               lineNbr,
    -               syscallName,
    -               strerror( errno ) );
    -   }
    -   return status != -1;   /* True if the system call was successful. */
    -}  /* End SYSCALL() */
    -/******************************************************************************
    -* Function: main
    -*
    -* Description:
    -*    Connect to a remote time-of-day service and write the remote host's TOD to
    -*    stdout.
    -*
    -* Parameters:
    -*    The usual argc & argv parameters to a main() program.
    -*
    -* Return Value:
    -*    This function always returns zero.
    -******************************************************************************/
    -int main( int   argc,
    -          char *argv[ ] )
    -{
    -   const char   *host     = DFLT_HOST;
    -   int           opt;
    -   int           sckt;
    -   unsigned int  scopeId  = if_nametoindex( DFLT_SCOPE_ID );
    -   const char   *service  = DFLT_SERVICE;
    -   /*
    -   ** Determine the program name (w/o directory prefix).
    -   */
    -   pgmName = (const char*) strrchr( argv[ 0 ], '/' );
    -   pgmName = pgmName == NULL  ?  argv[ 0 ]  :  pgmName+1;
    -   /*
    -   ** Process command line options.
    -   */
    -   opterr = 0;   /* Turns off "invalid option" error messages. */
    -   while ( ( opt = getopt( argc, argv, VALIDOPTS ) ) != -1 )
    -   {
    -      switch ( opt )
    -      {
    -         case 's':   /* Scope identifier (IPv6 kluge). */
    -         {
    -            scopeId = if_nametoindex( optarg );
    -            if ( scopeId == 0 )
    -            {
    -               fprintf( stderr,
    -                        "%s: Unknown network interface (%s).\n",
    -                        pgmName,
    -                        optarg );
    -               USAGE;
    -            }
    -            break;
    -         }
    -         case 'v':   /* Verbose mode. */
    -         {
    -            verbose = true;
    -            break;
    -         }
    -         default:
    -         {
    -            USAGE;
    -         }
    -      }  /* End SWITCH on command option. */
    -   } /* End WHILE processing command options. */
    -   /*
    -   ** Process command arguments.  At the end of the above loop, optind is the
    -   ** index of the first NON-option argv element.
    -   */
    -   switch ( argc - optind )
    -   {
    -      case 2:   /* Both host & service are specified on the command line. */
    -      {
    -          service = argv[ optind + 1 ];
    -          /***** Fall through *****/
    -      }
    -      case 1:   /* Host is specified on the command line. */
    -      {
    -          host = argv[ optind ];
    -          /***** Fall through *****/
    -      }
    -      case 0:   /* Use default host & service. */
    -      {
    -          break;
    -      }
    -      default:
    -      {
    -         USAGE;
    -      }
    -   }  /* End SWITCH on number of command arguments. */
    -   /*
    -   ** Open a connection to the indicated host/service.
    -   **
    -   ** Note that if all three of the following conditions are met, then the
    -   ** scope identifier remains unresolved at this point.
    -   **    1) The default network interface is unknown for some reason.
    -   **    2) The -s option was not used on the command line.
    -   **    3) An IPv6 "scoped address" was not specified for the hostname on the
    -   **       command line.
    -   ** If the above three conditions are met, then only an IPv4 socket can be
    -   ** opened (connect(2) fails without the scope ID properly set for IPv6
    -   ** sockets).
    -   */
    -   if ( ( sckt = openSckt( host,
    -                           service,
    -                           scopeId ) ) == INVALID_DESC )
    -   {
    -      fprintf( stderr,
    -               "%s: Sorry... a connectionless socket could "
    -               "not be set up.\n",
    -               pgmName );
    -      exit( 1 );
    -   }
    -   /*
    -   ** Get the remote time-of-day.
    -   */
    -   tod( sckt );
    -   /*
    -   ** Close the connection and terminate.
    -   */
    -   (void) SYSCALL( "close",
    -                   __LINE__,
    -                   close( sckt ) );
    -   return 0;
    -}  /* End main() */
    -/******************************************************************************
    -* Function: openSckt
    -*
    -* Description:
    -*    Sets up a UDP socket to a remote server.  Getaddrinfo(3) is used to
    -*    perform lookup functions and can return multiple address records (i.e. a
    -*    list of 'struct addrinfo' records).  This function traverses the list and
    -*    tries to establish a connection to the remote server.  The function ends
    -*    when either a connection has been established or all records in the list
    -*    have been processed.
    -*
    -* Parameters:
    -*    host    - A pointer to a character string representing the hostname or IP
    -*              address (IPv4 or IPv6) of the remote server.
    -*    service - A pointer to a character string representing the service name or
    -*              well-known port number.
    -*    scopeId - For IPv6 sockets only.  This is the index corresponding to the
    -*              network interface on which to exchange datagrams.  This
    -*              parameter is ignored for IPv4 sockets or when an IPv6 "scoped
    -*              address" is specified in 'host' (i.e. where the colon-hex
    -*              network address is augmented with the scope ID).
    -*
    -* Return Value:
    -*    Returns the socket descriptor for the connection, or INVALID_DESC if all
    -*    address records have been processed and a socket could not be initialized.
    -******************************************************************************/
    -static int openSckt( const char   *host,
    -                     const char   *service,
    -                     unsigned int  scopeId )
    -{
    -   struct addrinfo *ai;
    -   int              aiErr;
    -   struct addrinfo *aiHead;
    -   struct addrinfo  hints;
    -   sockaddr_in6_t  *pSadrIn6;
    -   int              sckt;
    -   /*
    -   ** Initialize the 'hints' structure for getaddrinfo(3).
    -   **
    -   ** Notice that the 'ai_family' field is set to PF_UNSPEC, indicating to
    -   ** return both IPv4 and IPv6 address records for the host/service.  Most of
    -   ** the time, the user isn't going to care whether an IPv4 connection or an
    -   ** IPv6 connection is established; the user simply wants to exchange data
    -   ** with the remote host and doesn't care how it's done.  Sometimes, however,
    -   ** the user might want to explicitly specify the type of underlying socket.
    -   ** It is left as an exercise for the motivated reader to add a command line
    -   ** option allowing the user to specify the IP protocol, and then process the
    -   ** list of addresses accordingly (it's not that difficult).
    -   */
    -   memset( &hints, 0, sizeof( hints ) );
    -   hints.ai_family   = PF_UNSPEC;     /* IPv4 or IPv6 records (don't care). */
    -   hints.ai_socktype = SOCK_DGRAM;    /* Connectionless communication.      */
    -   hints.ai_protocol = IPPROTO_UDP;   /* UDP transport layer protocol only. */
    -   /*
    -   ** Look up the host/service information.
    -   */
    -   if ( ( aiErr = getaddrinfo( host,
    -                               service,
    -                               &hints,
    -                               &aiHead ) ) != 0 )
    -   {
    -      fprintf( stderr,
    -               "%s (line %d): ERROR - %s.\n",
    -               pgmName,
    -               __LINE__,
    -               gai_strerror( aiErr ) );
    -      return INVALID_DESC;
    -   }
    -   /*
    -   ** Go through the list and try to open a connection.  Continue until either
    -   ** a connection is established or the entire list is exhausted.
    -   */
    -   for ( ai = aiHead,   sckt = INVALID_DESC;
    -         ( ai != NULL ) && ( sckt == INVALID_DESC );
    -         ai = ai->ai_next )
    -   {
    -      /*
    -      ** IPv6 kluge.  Make sure the scope ID is set.
    -      */
    -      if ( ai->ai_family == PF_INET6 )
    -      {
    -         pSadrIn6 = (sockaddr_in6_t*) ai->ai_addr;
    -         if ( pSadrIn6->sin6_scope_id == 0 )
    -         {
    -            pSadrIn6->sin6_scope_id = scopeId;
    -         }  /* End IF the scope ID wasn't set. */
    -      }  /* End IPv6 kluge. */
    -      /*
    -      ** Display the address info for the remote host.
    -      */
    -      if ( verbose )
    -      {
    -         /*
    -         ** Temporary character string buffers for host & service.
    -         */
    -         char hostBfr[ NI_MAXHOST ];
    -         char servBfr[ NI_MAXSERV ];
    -         /*
    -         ** Display the address information just fetched.  Start with the
    -         ** common (protocol-independent) stuff first.
    -         */
    -         fprintf( stderr,
    -                  "Address info:\n"
    -                  "   ai_flags     = 0x%02X\n"
    -                  "   ai_family    = %d (PF_INET = %d, PF_INET6 = %d)\n"
    -                  "   ai_socktype  = %d (SOCK_STREAM = %d, SOCK_DGRAM = %d)\n"
    -                  "   ai_protocol  = %d (IPPROTO_TCP = %d, IPPROTO_UDP = %d)\n"
    -                  "   ai_addrlen   = %d (sockaddr_in = %d, "
    -                  "sockaddr_in6 = %d)\n",
    -                  ai->ai_flags,
    -                  ai->ai_family,
    -                  PF_INET,
    -                  PF_INET6,
    -                  ai->ai_socktype,
    -                  SOCK_STREAM,
    -                  SOCK_DGRAM,
    -                  ai->ai_protocol,
    -                  IPPROTO_TCP,
    -                  IPPROTO_UDP,
    -                  ai->ai_addrlen,
    -                  sizeof( struct sockaddr_in ),
    -                  sizeof( struct sockaddr_in6 ) );
    -         /*
    -         ** Display the protocol-specific formatted address.
    -         */
    -         getnameinfo( ai->ai_addr,
    -                      ai->ai_addrlen,
    -                      hostBfr,
    -                      sizeof( hostBfr ),
    -                      servBfr,
    -                      sizeof( servBfr ),
    -                      NI_NUMERICHOST | NI_NUMERICSERV );
    -         switch ( ai->ai_family )
    -         {
    -            case PF_INET:   /* IPv4 address record. */
    -            {
    -               sockaddr_in_t *pSadrIn = (sockaddr_in_t*) ai->ai_addr;
    -               fprintf( stderr,
    -                        "   ai_addr      = sin_family: %d (AF_INET = %d, "
    -                        "AF_INET6 = %d)\n"
    -                        "                  sin_addr:   %s\n"
    -                        "                  sin_port:   %s\n",
    -                        pSadrIn->sin_family,
    -                        AF_INET,
    -                        AF_INET6,
    -                        hostBfr,
    -                        servBfr );
    -               break;
    -            }  /* End CASE of IPv4 record. */
    -            case PF_INET6:   /* IPv6 address record. */
    -            {
    -               pSadrIn6 = (sockaddr_in6_t*) ai->ai_addr;
    -               fprintf( stderr,
    -                        "   ai_addr      = sin6_family:   %d (AF_INET = %d, "
    -                        "AF_INET6 = %d)\n"
    -                        "                  sin6_addr:     %s\n"
    -                        "                  sin6_port:     %s\n"
    -                        "                  sin6_flowinfo: %d\n"
    -                        "                  sin6_scope_id: %d\n",
    -                        pSadrIn6->sin6_family,
    -                        AF_INET,
    -                        AF_INET6,
    -                        hostBfr,
    -                        servBfr,
    -                        pSadrIn6->sin6_flowinfo,
    -                        pSadrIn6->sin6_scope_id );
    -               break;
    -            }  /* End CASE of IPv6 record. */
    -            default:   /* Can never get here, but just for completeness. */
    -            {
    -               fprintf( stderr,
    -                        "%s (line %d): ERROR - Unknown protocol family (%d).\n",
    -                        pgmName,
    -                        __LINE__,
    -                        ai->ai_family );
    -               break;
    -            }  /* End DEFAULT case (unknown protocol family). */
    -         }  /* End SWITCH on protocol family. */
    -      }  /* End IF verbose mode. */
    -      /*
    -      ** Create a socket.
    -      */
    -      if ( !SYSCALL( "socket",
    -                     __LINE__,
    -                     sckt = socket( ai->ai_family,
    -                                    ai->ai_socktype,
    -                                    ai->ai_protocol ) ) )
    -      {
    -         sckt = INVALID_DESC;
    -         continue;   /* Try the next address record in the list. */
    -      }
    -      /*
    -      ** Set the target destination for the remote host on this socket.  That
    -      ** is, this socket only communicates with the specified host.
    -      */
    -      if ( !SYSCALL( "connect",
    -                     __LINE__,
    -                     connect( sckt,
    -                              ai->ai_addr,
    -                              ai->ai_addrlen ) ) )
    -      {
    -         (void) close( sckt );   /* Could use SYSCALL() again here, but why? */
    -         sckt = INVALID_DESC;
    -         continue;   /* Try the next address record in the list. */
    -      }
    -   }  /* End FOR each address record returned by getaddrinfo(3). */
    -   /*
    -   ** Clean up & return.
    -   */
    -   freeaddrinfo( aiHead );
    -   return sckt;
    -}  /* End openSckt() */
    -/******************************************************************************
    -* Function: tod
    -*
    -* Description:
    -*    Receive the time-of-day from the remote server and write it to stdout.
    -*
    -* Parameters:
    -*    sckt - The socket descriptor for the connection.
    -*
    -* Return Value: None.
    -******************************************************************************/
    -static void tod( int sckt )
    -{
    -   char bfr[ MAXBFRSIZE+1 ];
    -   int  inBytes;
    -   /*
    -   ** Send a datagram to the server to wake it up.  The content isn't
    -   ** important, but something must be sent to let it know we want the TOD.
    -   */
    -   if ( !SYSCALL( "write",
    -                  __LINE__,
    -                  write( sckt, "Are you there?", 14 ) ) )
    -   {
    -      return;
    -   }
    -   /*
    -   ** Read the time-of-day from the remote host.
    -   */
    -   if ( !SYSCALL( "read",
    -                  __LINE__,
    -                  inBytes = read( sckt,
    -                                  bfr,
    -                                  MAXBFRSIZE ) ) )
    -   {
    -      return;
    -   }
    -   bfr[ inBytes ] = '\0';   /* Null-terminate the received string. */
    -   fputs( bfr, stdout );    /* Null string if EOF (inBytes == 0).  */
    -   fflush( stdout );
    -}  /* End tod() */

    23.2. Other programming languages

    23.2.1. JAVA

    Sun Java versions since 1.4 are IPv6 enabled, see e.g. Inet6Address (1.5/5.0) class. Hints are available in the Networking IPv6 User Guide for JDK/JRE 1.4 and 1.5 (5.0).


    23.2.2. Perl

    As of May 2007 it's not known that the Perl core itself already supports IPv6. It can be added by using following modules:

    Anyway, some other modules exist for/with IPv6 support (e.g. Net::IP), search for “IPv6” on http://search.cpan.org/.


    Chapter 24. Interoperability

    The TAHI Project checks the interoperability of different operating systems regarding the implementation of IPv6 features. Linux kernel already got the IPv6 Ready Logo Phase 1.


    Chapter 25. Further information and URLs

    25.1. Paper printed books, articles, online reviews (mixed)

    25.1.1. Printed Books (English)

    25.1.1.1. Cisco

    • Cisco Self-Study: Implementing IPv6 Networks (IPV6) by Regis Desmeules. Cisco Press; ISBN 1587050862; 500 pages; 1st edition (April 11, 2003). -Note: This item will be published on April 11, 2003.

    • Configuring IPv6 with Cisco IOS by Sam Brown, Sam Browne, Neal Chen, Robbie Harrell, Edgar, Jr. Parenti (Editor), Eric Knipp (Editor), Paul Fong (Editor)362 pages; Syngress Media Inc; ISBN 1928994849; (July 12, 2002).


    25.1.1.2. General

    • IPv6 in Practice: A Unixer's Guide to the Next Generation Internet von Benedikt Stockebrand, November 2006; ISBN 3-540-24524-3

    • IPv6 Essentials by Silvia Hagen, 2nd Edition, May 2006; ISBN 0-5961-0058-2 -ToC, Index, Sample Chapter etc.; O'Reilly Pressrelease

    • IPv6: The New Internet Protocol. By Christian Huitema; Published by Prentice-Hall; ISBN 0138505055. -Description: This book, written by Christian Huitema - a member of the InternetArchitecture Board, gives an excellent description of IPv6, how it differs from IPv4, and the hows and whys of it's development. -Source: http://www.cs.uu.nl/wais/html/na-dir/internet/tcp-ip/resource-list.html

    • IPv6 Networks by Niles, Kitty; (ISBN 0070248079); 550 pages; Date Published 05/01/1998.

    • Implementing IPV6. Supporting the Next Generation Internet Protocols by P. E. Miller, Mark A. Miller; Publisher: John Wiley & Sons; ISBN 0764545892; 2nd edition (March 15, 2000); 402 pages.

    • Big Book of Ipv6 Addressing Rfcs by Peter H. Salus (Compiler), Morgan Kaufmann Publishers, April 2000, 450 pages ISBN 0126167702.

    • Understanding IPV6 by Davies, Joseph; ISBN 0735612455; Date Published 05/01/2001; Number of Pages: 350.

    • Migrating to IPv6 - IPv6 in Practice by Marc Blanchet Publisher: John Wiley & Sons; ISBN 0471498920; 1st edition (November 2002); 368 pages.

    • Ipv6 Network Programming by Jun-ichiro Hagino; ISBN 1555583180

    • Wireless boosting IPv6 by Carolyn Duffy Marsan, 10/23/2000.

    • O'reilly Network search for keyword IPv6 results in 29 hits (28. January 2002)


    25.1.2. Articles, eBooks, Online Reviews (mixed)


    25.1.3. Science Publications (abstracts, bibliographies, online resources)

    See also: liinwww.ira.uka.de/ipv6 or Google / Scholar / IPv6


    25.2. Conferences, Meetings, Summits

    Something missing? Suggestions are welcome!


    25.2.1. 2004

    • 1st Global IPv6 Summit in Sao Paul, Brazil


    25.3. Online information

    25.3.1. Join the IPv6 backbone

    More to be filled later...suggestions are welcome!


    25.3.1.1. Global registries

    See regional registries.


    25.3.1.3. Tunnel brokers

    Note: A list of available Tunnel broker can be found in the section Tunnel broker below.


    25.3.2. Latest news and URLs to other documents

    • Lot of URLs to others documents by Anil Edathara

    • go6 - The IPv6 Portal: an IPv6 online portal with a wiki-based IPv6 knowledge center, an IPv6 discussion forum, an up-to-date collection of IPv6 Events and News, free IPv6 access and services, IPv6 software applications, and much more


    25.3.3. Protocol references

    25.3.3.1. IPv6-related Request For Comments (RFCs)

    Publishing the list of IPv6-related RFCs is beyond the scope of this document, but given URLs will lead you to such lists:


    25.3.3.3. Others


    25.3.4. More information

    DeepSpace6 / more interesting links


    25.3.4.3. General

    Something missing? Suggestions are welcome!


    25.3.5. By countries

    25.3.5.1. Europe

    • www.ist-ipv6.org: IST IPv6 Cluster, European IPv6 Research and Development Projects

    • Euro6IX: European IPv6 Internet Exchanges Backbone


    25.3.5.2. Austria


    25.3.5.4. Belgium

    Suggestions are welcome!


    25.3.5.6. China

    Suggestions are welcome!


    25.3.5.7. Czech

    Suggestions are welcome!


    25.3.5.10. Italy


    25.3.5.11. Japan


    25.3.5.12. Korea

    • ETRI: Electronics and Telecommunications Research Institut

    • IPv6 Forum Korea: Korean IPv6 Deployment Project


    25.3.5.13. Mexico

    • IPv6 Mexico (spain & english version): IPv6 Project Hompeage of The National Autonomous University of Mexico (UNAM)


    25.3.5.14. Netherland

    • SURFnet: SURFnet IPv6 Backbone

    • STACK, STACK (IPv6): Students' computer association of the Eindhoven University of Technology, Netherland

    • IPng.nl: collaboration between WiseGuys and Intouch


    25.3.5.15. Portugal

    Suggestions are welcome!


    25.3.5.16. Russia


    25.3.5.17. Switzerland

    Suggestions are welcome!


    25.3.5.18. United Kingdom


    25.3.6. By operating systems


    25.3.6.2. Cisco IOS


    25.3.6.4. IBM


    25.3.7. IPv6 Security


    25.3.8. Application lists


    25.3.8.1. Analyzer tools

    • Wireshark (former known as Ethereal) is a free network protocol analyzer for Unix and Windows

    • Radcom RC100-WL - Download Radcom RC100-WL protocol analyzer version 3.20


    25.3.8.2. IPv6 Products


    25.4. IPv6 Infrastructure


    25.4.2. Internet Exchanges

    Another list of IPv6 Internet Exchanges can be found here: IPv6 status of IXPs in Europe


    25.4.2.1. Estonia

    • TIX (tallinn interneti exchange with ipv6 support)


    25.4.2.2. Europe

    • Euro6IX, European IPv6 Internet Exchange Backbone


    25.4.2.3. France


    25.4.2.4. Germany

    • INXS: (Cable & Wireless) Munich and Hamburg


    25.4.2.5. Japan


    25.4.2.7. Netherlands

    • AMS-IX: Amsterdam Internet Exchange


    25.4.2.9. USA

    • 6TAP: Chicago. Supports peerings around the globe.

    • PAIX: Palo Alto


    25.4.3. Tunnel broker

    See also: http://www.deepspace6.net/docs/tunnelbrokers.html


    25.4.3.1. Belgium

    Something missing? Suggestions are welcome!


    25.4.3.3. China

    Something missing? Suggestions are welcome!


    25.4.3.6. Italy


    25.4.3.7. Japan

    Something missing? Suggestions are welcome!


    25.4.3.8. Malaysia

    Something missing? Suggestions are welcome!


    25.4.3.9. Netherlands

    • IPng Netherland - Intouch, SurfNet, AMS-IX, UUNet, Cistron, RIPE NCC and AT&T are connected at the AMS-IX. It is possible (there are requirements...) to get an static tunnel.

    • SURFnet Customers


    25.4.3.10. Norway


    25.4.3.12. Switzerland

    Something missing? Suggestions are welcome!


    25.4.3.13. UK

    • NTT, United Kingdom - IPv6 Trial. IPv4 Tunnel and native IPv6 leased Line connections. POPs are located in London, UK Dusseldorf, Germany New Jersey, USA (East Coast) Cupertino, USA (West Coast) Tokyo, Japan


    25.4.3.14. USA


    25.4.3.15. Singapore

    Something missing? Suggestions are welcome!


    25.4.4. Native IPv6 Services

    Note: These services are mostly only available with a valid IPv6 connection!


    25.4.4.1. Net News (NNTP)

    Something missing? Suggestions are welcome!


    25.4.4.3. IRC Server

    Something missing? Suggestions are welcome!


    25.4.4.4. Radio Stations, Music Streams

    Something missing? Suggestions are welcome!


    25.4.4.5. Webserver

    Something missing? Suggestions are welcome!


    25.5. Maillists

    Lists of maillists are available at:

    Major Mailinglists are listed in following table:

    FocusRequest e-mail addressWhat to subscribeMaillist e-mail addressLanguageAccess through WWW
    Linux kernel networking including IPv6majordomo (at) vger.kernel.orgnetdevnetdev (at) vger.kernel.orgEnglishInfo, Archive
    Mobile IP(v6) for LinuxWeb-based, see URLmiplmipl (at) mobile-ipv6.orgEnglishInfo, Archive
    Linux IPv6 users using USAGI extensionusagi-users-ctl (at) linux-ipv6.org usagi-users (at) linux-ipv6.orgEnglishInfo / Search, Archive
    IPv6 on Debian Linux  debian-ipv6 (at) lists.debian.orgEnglishInfo/Subscription/Archive
    6bonemajordomo (at) isi.edu6bone6bone (at) isi.eduEnglishInfo, Archive
    IPv6 users in generalmajordomo (at) ipv6.orgusersusers (at) ipv6.orgEnglishInfo, Archive
    Bugtracking of Internet applications (1)bugtraq-subscribe (at) securityfocus.com bugtraq (at) securityfocus.com (2)EnglishInfo, Archive

    (1) very recommended if you provide server applications.

    (2) list is moderated.

    Something missing? Suggestions are welcome!

    Following other maillinglists & newsgroups are available via web:

    • student-ipv6 (India) -Description: This is the group for the Student Awareness group of IPv6 in India

    • sun-ipv6-users -Description: Please report problems/suggestions regarding SUN Microsystems IPng implementation

    • IPv6-BITS -Description: This List will co-ordinate the working of Project Vertebrae.

    • linux-bangalore-ipv6 -Description: The IPv6 deployment list of the Bangalore Linux User Group

    • packet-switching -Description: This mailing list provides a forum for discussion of packet switching theory, technology, implementation and application in any relevant aspect including without limitation LAPB, X.25, SDLC, P802.1d, LLC, IP, IPv6, IPX, DECNET, APPLETALK, FR, PPP, IP Telephony, LAN PBX systems, management protocols like SNMP, e-mail, network transparent window systems, protocol implementation, protocol verification, conformance testing and tools used in maintaining or developing packet switching systems.

    • de.comm.protocols.tcp-ip -Description: Umstellung auf IPv6 -Source: Chartas der Newsgruppen in de.*

    • Google Group: comp.protocols.tcp-ip

    • Google Group: linux.debian.maint.ipv6

    • Google Group: microsoft.public.platformsdk.networking.ipv6

    • Google Group: fa.openbsd.ipv6


    25.7. Trainings, Seminars

    Something missing? Suggestions are welcome!


    25.8. 'The Online Discovery' ...

    IPv6: Addressing The Needs Of the Future by Yankee Group (Author) -List Price: $595.00 -Edition: e-book (Acrobat Reader) -Pages: 3 (three) -Publisher: MarketResearch.com; ISBN B00006334Y; (November 1, 2001)

    ;-) The number of copies would be interesting...


    Chapter 26. Revision history / Credits / The End

    26.1. Revision history

    Versions x.y are published on the Internet.

    Versions x.y.z are work-in-progress and published as LyX and SGML file on CVS. Because Deep Space 6 mirrors these SGML files and generate independend from TLDP public versions, this versions will show up there and also on its mirrors.


    26.1.1. Releases 0.x

    0.67wip

    2015-08-18/PB: fix some broken URLs, 20151016/bie: remove broken URL to Spanish transation, 20161215/bie: update some URLs

    0.66

    2010-04-20/PB: extend QoS section with examples, 20130513/PB: add IPv6 NAT hints, 20130521/PB: review dhcpd, 20131019/bie: general review, 20140502/bie: add hints for nftables, 20140513/bie: extend section regarding address resolution and add source/destination address selection information, 20140515/bie: add hints for activation of privacy extension

    0.65

    2009-12-13/PB: minor fixes

    0.64

    2009-06-11/PB: extend DHCP server examples (ISC DHCP, Dibbler)

    0.63

    2009-02-14/PB: Fix FSF address, major update on 4in6 tunnels, add new section for address resolving, add some URLs, remove broken URLs

    0.62

    2008-11-09/PB: Adjust URL to Turkish howto, add some HIP related URLs, remove broken URLs

    0.61.1

    2007-11-11/PB: fix broken description of shortcut BIND

    0.61

    2007-10-06/PB: fix broken URLs to TLDP-CVS, minor URL update.

    0.60.2

    2007-10-03/PB: fix description of sysctl/autoconf (credits to Francois-Xavier Le Bail)

    0.60.1

    2007-06-16/PB: speling fixes (credits to Larry W. Burton)

    0.60

    2007-05-29/PB: import major contribution to Programming using C-API written by John Wenker, minor fixes

    0.52

    2007-05-23/PB: update firewalling chapter, improve document for proper SGML validation, minor bugfixes

    0.51

    2006-11-08/PB: remove broken URLs, add a new book (credits to Bryan Vukich)

    0.50.2

    2006-10-25/PB: fix typo in dhcp6 section (credits to Michele Ferritto)

    0.50.1

    2006-09-23/PB: add some URLs

    0.50

    2006-08-24/PB: check RFC URLs, fix URL to Chinese translation, finalize for publishing

    0.49.5

    2006-08-23/PB: fix/remove broken URLs

    0.49.4

    2006-08-21/PB: some review, update and enhancement of the content, replace old 6bone example addresses with the current defined ones.

    0.49.3

    2006-08-20/PB: fix bug in maillist entries, 'mobility' is now a separate chapter

    0.49.2

    2006-08-20/PB: update and cleanup of maillist entries

    0.49.1

    2006-06-13/PB: major update of mobility section (contributed by Benjamin Thery)

    0.49

    2005-10-03/PB: add configuration hints for DHCPv6, major broken URL cleanup (credits to Necdet Yucel)

    0.48.1

    2005-01-15/PB: minor fixes

    0.48

    2005-01-11/PB: grammar check and minor review of IPv6 IPsec section

    0.47.1

    2005-01-01/PB: add information and examples about IPv6 IPsec, add some URLs

    0.47

    2004-08-30/PB: add some notes about proftpd, vsftpd and other daemons, add some URLs, minor fixes, update status of Spanish translation

    0.46.4

    2004-07-19/PB: minor fixes

    0.46.3

    2004-06-23/PB: add note about started Greek translation, replace Taiwanese with Chinese for related translation

    0.46.2

    2004-05-22/PB: minor fixes

    0.46.1

    2004-04-18/PB: minor fixes

    0.46

    2004-03-04/PB: announce Italian translation, add information about DHCPv6, minor updates

    0.45.1

    2004-01-12/PB: add note about the official example address space

    0.45

    2004-01-11/PB: minor fixes, add/fix some URLs, some extensions

    0.44.2

    2003-10-30/PB: fix some copy&paste text bugs

    0.44.1

    2003-10-19/PB: add note about start of Italian translation

    0.44

    2003-08-15/PB: fix URLs, add hint on tcp_wrappers (about broken notation in some versions) and Apache2

    0.43.4

    2003-07-26/PB: fix URL, add archive URL for maillist users at ipv6.org, add some ds6 URLs

    0.43.3

    2003-06-19/PB: fix typos

    0.43.2

    2003-06-11/PB: fix URL

    0.43.1

    2003-06-07/PB: fix some URLs, fix credits, add some notes at IPsec

    0.43

    2003-06-05/PB: add some notes about configuration in SuSE Linux, add URL of French translation

    0.42

    2003-05-09/PB: minor fixes, announce French translation

    0.41.4

    2003-05-02/PB: Remove a broken URL, update some others.

    0.41.3

    2003-04-23/PB: Minor fixes, remove a broken URL, fix URL to Taiwanese translation

    0.41.2

    2003-04-13/PB: Fix some typos, add a note about a French translation is in progress

    0.41.1

    2003-03-31/PB: Remove a broken URL, fix another

    0.41

    2003-03-22/PB: Add URL of German translation

    0.40.2

    2003-02-27/PB: Fix a misaddressed URL

    0.40.1

    2003-02-12/PB: Add Debian-Linux-Configuration, add a minor note on translations

    0.40

    2003-02-10/PB: Announcing available German version

    0.39.2

    2003-02-10/GK: Minor syntax and spelling fixes

    0.39.1

    2003-01-09/PB: fix an URL (draft adopted to an RFC)

    0.39

    2003-01-13/PB: fix a bug (forgotten 'link” on “ip link set” (credits to Yaniv Kaul)

    0.38.1

    2003-01-09/PB: a minor fix

    0.38

    2003-01-06/PB: minor fixes

    0.37.1

    2003-01-05/PB: minor updates

    0.37

    2002-12-31/GK: 270 new links added (searched in 1232 SearchEngines) in existing and 53 new (sub)sections

    0.36.1

    2002-12-20/PB: Minor fixes

    0.36

    2002-12-16/PB: Check of and fix broken links (credits to Georg Käfer), some spelling fixes

    0.35

    2002-12-11/PB: Some fixes and extensions

    0.34.1

    2002-11-25/PB: Some fixes (e.g. broken linuxdoc URLs)

    0.34

    2002-11-19/PB: Add information about German translation (work in progress), some fixes, create a small shortcut explanation list, extend “used terms” and add two German books

    0.33

    2002-11-18/PB: Fix broken RFC-URLs, add parameter ttl on 6to4 tunnel setup example

    0.32

    2002-11-03/PB: Add information about Taiwanese translation

    0.31.1

    2002-10-06/PB: Add another maillist

    0.31

    2002-09-29/PB: Extend information in proc-filesystem entries

    0.30

    2002-09-27/PB: Add some maillists

    0.29

    2002-09-18/PB: Update statement about nmap (triggered by Fyodor)

    0.28.1

    2002-09-16/PB: Add note about ping6 to multicast addresses, add some labels

    0.28

    2002-08-17/PB: Fix broken LDP/CVS links, add info about Polish translation, add URL of the IPv6 Address Oracle

    0.27

    2002-08-10/PB: Some minor updates

    0.26.2

    2002-07-15/PB: Add information neighbor discovery, split of firewalling (got some updates) and security into extra chapters

    0.26.1

    2002-07-13/PB: Update nmap/IPv6 information

    0.26

    2002-07-13/PB: Fill /proc-filesystem chapter, update DNS information about depricated A6/DNAME, change P-t-P tunnel setup to use of “ip” only

    0.25.2

    2002-07-11/PB: Minor spelling fixes

    0.25.1

    2002-06-23/PB: Minor spelling and other fixes

    0.25

    2002-05-16/PB: Cosmetic fix for 2^128, thanks to José Abílio Oliveira Matos for help with LyX

    0.24

    2002-05-02/PB: Add entries in URL list, minor spelling fixes

    0.23

    2002-03-27/PB: Add entries in URL list and at maillists, add a label and minor information about IPv6 on RHL

    0.22

    2002-03-04/PB: Add info about 6to4 support in kernel series 2.2.x and add an entry in URL list and at maillists

    0.21

    2002-02-26/PB: Migrate next grammar checks submitted by John Ronan

    0.20.4

    2002-02-21/PB: Migrate more grammar checks submitted by John Ronan, add some additional hints at DNS section

    0.20.3

    2002-02-12/PB: Migrate a minor grammar check patch submitted by John Ronan

    0.20.2

    2002-02-05/PB: Add mipl to maillist table

    0.20.1

    2002-01-31/PB: Add a hint how to generate 6to4 addresses

    0.20

    2002-01-30/PB: Add a hint about default route problem, some minor updates

    0.19.2

    2002-01-29/PB: Add many new URLs

    0.19.1

    2002-01-27/PB: Add some forgotten URLs

    0.19

    2002-01-25/PB: Add two German books, fix quote entinities in exported SGML code

    0.18.2

    2002-01-23/PB: Add a FAQ on the program chapter

    0.18.1

    2002-01-23/PB: Move “the end” to the end, add USAGI to maillists

    0.18

    2002-01-22/PB: Fix bugs in explanation of multicast address types

    0.17.2

    2002-01-22/PB: Cosmetic fix double existing text in history (at 0.16), move all credits to the end of the document

    0.17.1

    2002-01-20/PB: Add a reference, fix URL text in online-test-tools

    0.17

    2002-01-19/PB: Add some forgotten information and URLs about global IPv6 addresses

    0.16

    2002-01-19/PB: Minor fixes, remove “bold” and “emphasize” formats on code lines, fix “too long unwrapped code lines” using selfmade utility, extend list of URLs.

    0.15

    2002-01-15/PB: Fix bug in addresstype/anycast, move content related credits to end of document

    0.14

    2002-01-14/PB: Minor review at all, new chapter “debugging”, review “addresses”, spell checking, grammar checking (from beginning to 3.4.1) by Martin Krafft, add tcpdump examples, copy firewalling/netfilter6 from IPv6+Linux-HowTo, minor enhancements

    0.13

    2002-01-05/PB: Add example BIND9/host, move revision history to end of document, minor extensions

    0.12

    2002-01-03/PB: Merge review of David Ranch

    0.11

    2002-01-02/PB: Spell checking and merge review of Pekka Savola

    0.10

    2002-01-02/PB: First public release of chapter 1


    26.2. Credits

    The quickest way to be added to this nice list is to send bug fixes, corrections, and/or updates to me ;-).

    If you want to do a major review, you can use the native LyX file (see original source) and send diffs against it, because diffs against SGML don't help too much.


    26.2.1. Major credits

    • David Ranch <dranch at trinnet dot net>: For encouraging me to write this HOWTO, his editorial comments on the first few revisions, and his contributions to various IPv6 testing results on my IPv6 web site. Also for his major reviews and suggestions.

    • Pekka Savola <pekkas at netcore dot fi>: For major reviews, input and suggestions.

    • Martin F. Krafft <madduck at madduck dot net>: For grammar checks and general reviewing of the document.

    • John Ronan <j0n at tssg dot wit dot ie>: For grammar checks.

    • Georg Käfer <gkaefer at gmx dot at>: For detection of no proper PDF creation (fixed now by LDP maintainer Greg Ferguson), input for German books, big list of URLs, checking all URLs, many more suggestions, corrections and contributions, and the German translation

    • Michel Boucey <mboucey at free dot fr>: Finding typos and some broken URLs, contribute some suggestions and URLs, and the French translation

    • Michele Ferritto <m dot ferritto at virgilio dot it>: Finding bugs and the Italian translation

    • Daniel Roesen <dr at cluenet dot de>: For grammar checks

    • Benjamin Thery <benjamin dot thery at bull dot net>: For contribution of updated mobility section

    • John Wenker <jjw at pt dot com>: major contribution to Programming using C-API

    • Srivats P. <Srivats dot P at conexant dot com>: major contribution for 4in6 tunnels


    26.2.2. Other credits

    26.2.2.1. Document technique related

    Writing a LDP HOWTO as a newbie (in LyX and exporting this to DocBook to conform to SGML) isn't as easy as some people say. There are some strange pitfalls... Nevertheless, thanks to:


    26.2.2.2. Content related credits

    Credits for fixes and hints are listed here, will grow sure in the future

    • S .P. Meenakshi <meena at cs dot iitm dot ernet dot in>: For a hint using a “send mail” shell program on tcp_wrapper/hosts.deny

    • Frank Dinies <FrankDinies at web dot de>: For a bugfix on IPv6 address explanation

    • John Freed <jfreed at linux-mag dot com>: For finding a bug in IPv6 multicast address explanation

    • Craig Rodrigues <crodrigu at bbn dot com>: For suggestion about RHL IPv6 setup

    • Fyodor <fyodor at insecure dot org>: Note me about outdated nmap information

    • Mauro Tortonesi <mauro at deepspace6 dot net>: For some suggestions

    • Tom Goodale <goodale at aei-potsdam dot mpg dot de>: For some suggestions

    • Martin Luemkemann <mluemkem at techfak dot uni-bielefeld dot de>: For a suggestion

    • Jean-Marc V. Liotier <jim at jipo dot com>: Finding a bug

    • Yaniv Kaul <ykaul at checkpoint dot com>: Finding a bug

    • Arnout Engelen <arnouten at bzzt dot net>: For sending note about a draft was adopted to RFC now

    • Stephane Bortzmeyer <bortzmeyer at nic dot fr>: Contributing persistent configuration on Debian

    • lithis von saturnsys <lithis at saturnsys dot com>: Reporting a misaddressed URL

    • Guy Hulbert <gwhulbert at rogers dot com>: Send a note that RFC1924 is probably an April fool's joke

    • Tero Pelander <tpeland at tkukoulu dot fi>: Reporting a broken URL

    • Walter Jontofsohn <wjontof at gmx dot de>: Hints for SuSE Linux 8.0/8.1

    • Benjamin Hofstetter <benjamin dot hofstetter at netlabs dot org>: Reporting a mispointing URL

    • J.P. Larocque <piranha at ely dot ath dot cx>: Reporting archive URL for maillist users at ipv6 dot org

    • Jorrit Kronjee <jorrit at wafel dot org>: Reporting broken URLs

    • Colm MacCarthaigh <colm dot maccarthaigh at heanet dot ie>: Hint for sendfile issue on Apache2

    • Tiago Camilo <tandre at ipg dot pt>: Contribute some URLs about Mobile IPv6

    • Harald Geiger: Reporting a bug in how described the bit counting of the universal/global bit

    • Bjoern Jacke <bjoern at j3e dot de>: Triggered me to fix some outdated information on xinetd

    • Christoph Egger <cegger at chrrr dot com>: Sending note about “ip” has problems with IPv4-compatible addresses on SuSE Linux 9.0 and trigger to add a hint on 6to4-radvd example

    • David Lee Haw Ling <hawling at singnet dot com dot sg>: Sending information about a tunnel broker

    • Michael H. Warfield <mhw at iss dot net>: Sending note about suffix for 6to4 routers

    • Tomasz Mrugalski <thomson at klub dot com dot pl>: Sending updates for DHCPv6 section

    • Jan Minar <jjminar at fastmail dot fm>: Reporting minor bugs

    • Kalin KOZHUHAROV <kalin at tar dot bz>: Fixing a not so well explanation

    • Roel van Dijk <rdvdijk at planet dot nl>: Reporting broken URLs

    • Catalin Muresan <catalin dot muresan at astral dot ro>: Reporting minor bugs

    • Dennis van Dok <dvandok at quicknet dot nl>: Reporting minor bugs

    • Necdet Yucel <nyucel at comu dot edu dot tr>: Reporting broken URLs

    • Bryan Vukich: Reporting a broken URL

    • Daniele Masini: reporting a broken iptables example

    • Yao Zhao: reporting a bug in IPv6 route remove description

    • Aaron Kunde: reporting a broken URL and a content related bug

    • Larry W. Burton: speling fixes

    • Justin Pryzby: reporting broken shortcut description of BIND


    26.3. The End

    Thanks for reading. Hope it helps!

    If you have any questions, subscribe to proper maillist and describe your problem providing as much as information as possible.

    \ No newline at end of file diff --git a/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.lyx b/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.lyx deleted file mode 100644 index c83943e9..00000000 --- a/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.lyx +++ /dev/null @@ -1,31055 +0,0 @@ -#LyX 2.2 created this file. For more info see http://www.lyx.org/ -\lyxformat 508 -\begin_document -\begin_header -\save_transient_properties true -\origin unavailable -\textclass docbook-book -\begin_preamble - -\end_preamble -\use_default_options false -\maintain_unincluded_children false -\language english -\language_package default -\inputencoding default -\fontencoding global -\font_roman "default" "default" -\font_sans "default" "default" -\font_typewriter "default" "default" -\font_math "auto" "auto" -\font_default_family default -\use_non_tex_fonts false -\font_sc false -\font_osf false -\font_sf_scale 100 100 -\font_tt_scale 100 100 -\graphics default -\default_output_format default -\output_sync 0 -\bibtex_command default -\index_command default -\paperfontsize default -\spacing single -\use_hyperref false -\papersize default -\use_geometry false -\use_package amsmath 1 -\use_package amssymb 1 -\use_package cancel 0 -\use_package esint 0 -\use_package mathdots 1 -\use_package mathtools 0 -\use_package mhchem 1 -\use_package stackrel 0 -\use_package stmaryrd 0 -\use_package undertilde 0 -\cite_engine basic -\cite_engine_type default -\biblio_style plain -\use_bibtopic false -\use_indices false -\paperorientation portrait -\suppress_date false -\justification true -\use_refstyle 0 -\index Index -\shortcut idx -\color #008000 -\end_index -\secnumdepth 3 -\tocdepth 3 -\paragraph_separation indent -\paragraph_indentation default -\quotes_language swedish -\papercolumns 1 -\papersides 1 -\paperpagestyle default -\tracking_changes false -\output_changes false -\html_math_output 0 -\html_css_as_file 0 -\html_be_strict false -\end_header - -\begin_body - -\begin_layout Title -Linux IPv6 HOWTO (en) -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - -PeterBieringerpb at bieringer dot de -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - - 0.67wip 2016-12-15 PB -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - - 0.66 2014-05-15 PB - -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - - 0.65 2009-12-13 PB - -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - - 0.64 2009-06-11 PB - -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - - 0.60 2007-05-31 PB - -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - - 0.51 2006-11-08 PB - -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Abstract -The goal of the Linux IPv6 HOWTO is to answer both basic and advanced questions - about IPv6 on the Linux operating system. - This HOWTO will provide the reader with enough information to install, - configure, and use IPv6 applications on Linux machines. - Intermediate releases of this HOWTO are available at -\begin_inset CommandInset href -LatexCommand href -name "mirrors.bieringer.de" -target "http://mirrors.bieringer.de/Linux+IPv6-HOWTO/" - -\end_inset - - or -\begin_inset CommandInset href -LatexCommand href -name "mirrors.deepspace6.net" -target "http://mirrors.deepspace6.net/Linux+IPv6-HOWTO/" - -\end_inset - -. - See also -\begin_inset CommandInset ref -LatexCommand ref -name "revision history" -reference "revision-history" - -\end_inset - - for changes. -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-general" - -\end_inset - -General -\end_layout - -\begin_layout Standard -Information about available translations you will find in section -\begin_inset CommandInset ref -LatexCommand ref -name "Translations" -reference "general-translations" - -\end_inset - -. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "general-copright" - -\end_inset - -Copyright, license and others -\end_layout - -\begin_layout Subsection -Copyright -\end_layout - -\begin_layout Standard -Written and Copyright (C) 2001-2014 by Peter Bieringer -\end_layout - -\begin_layout Subsection -License -\end_layout - -\begin_layout Standard - -\series bold -This Linux IPv6 HOWTO is published under GNU GPL version 2 -\series default -: -\begin_inset Newline newline -\end_inset - - -\end_layout - -\begin_layout Standard -The Linux IPv6 HOWTO, a guide how to configure and use IPv6 on Linux systems. - -\begin_inset Newline newline -\end_inset - - -\end_layout - -\begin_layout Standard -Copyright -\lang ngerman -© -\lang english - 2001-2014 Peter Bieringer -\begin_inset Newline newline -\end_inset - - -\end_layout - -\begin_layout Standard -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. - -\end_layout - -\begin_layout Standard -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. - -\end_layout - -\begin_layout Standard -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., - 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA. -\end_layout - -\begin_layout Subsection -About the author -\end_layout - -\begin_layout Subsubsection -Internet/IPv6 history of the author -\end_layout - -\begin_layout Itemize -1993: I got in contact with the Internet using console based e-mail and - news client (e.g. - look for -\begin_inset Quotes sld -\end_inset - -e91abier -\begin_inset Quotes srd -\end_inset - - on -\begin_inset CommandInset href -LatexCommand href -name "groups.google.com" -target "http://groups.google.com/" - -\end_inset - -, that's me). -\end_layout - -\begin_layout Itemize -1996: I got a request for designing a course on IPv6, including a workshop - with the Linux operating system. -\end_layout - -\begin_layout Itemize -1997: Started writing a guide on how to install, configure and use IPv6 - on Linux systems, called -\begin_inset CommandInset href -LatexCommand href -name "IPv6 & Linux - HowTo" -target "http://www.bieringer.de/linux/IPv6/" - -\end_inset - - (see -\begin_inset CommandInset href -LatexCommand href -name "IPv6 & Linux - HowTo/History" -target "http://www.bieringer.de/linux/IPv6/IPv6-HOWTO/IPv6-HOWTO-0.html#history" - -\end_inset - - for more information). -\end_layout - -\begin_layout Itemize -2001: Started writing this new Linux IPv6 HOWTO. - -\end_layout - -\begin_layout Subsubsection -Contact -\end_layout - -\begin_layout Standard -The author can be contacted via e-mail at and also - via his -\begin_inset CommandInset href -LatexCommand href -name "homepage" -target "http://www.bieringer.de/pb/" - -\end_inset - -. -\end_layout - -\begin_layout Standard -He's currently living in Munich / Bavaria / Germany / Europe / Earth. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "general-category" - -\end_inset - -Category -\end_layout - -\begin_layout Standard -This HOWTO should be listed in category -\begin_inset Quotes sld -\end_inset - - -\emph on -Networking -\emph default -/ -\emph on -Protocols -\emph default - -\begin_inset Quotes srd -\end_inset - -. -\end_layout - -\begin_layout Section -Version, History and To-Do -\end_layout - -\begin_layout Subsection -Version -\end_layout - -\begin_layout Standard -The current version is shown at the beginning of the document. -\end_layout - -\begin_layout Standard -For other available versions/translations see also -\begin_inset CommandInset href -LatexCommand href -name "http://www.bieringer.de/linux/IPv6/" -target "http://www.bieringer.de/linux/IPv6/" - -\end_inset - -. -\end_layout - -\begin_layout Subsection -History -\end_layout - -\begin_layout Subsubsection -Major history -\end_layout - -\begin_layout Standard -2001-11-30: Starting to design new HOWTO. -\end_layout - -\begin_layout Standard -2002-01-02: A lot of content completed, first public release of chapter - 1 (version 0.10). -\end_layout - -\begin_layout Standard -2002-01-14: More completed, some reviews, public release of the whole document - (version 0.14). -\end_layout - -\begin_layout Standard -2002-08-16: Polish translation is in progress -\end_layout - -\begin_layout Standard -2002-10-31: Chinese translation is available (see -\begin_inset CommandInset ref -LatexCommand ref -name "Translations" -reference "general-translations" - -\end_inset - - for more) -\end_layout - -\begin_layout Standard -2002-11-10: German translation is in progress -\end_layout - -\begin_layout Standard -2003-02-10: German translation is available -\end_layout - -\begin_layout Standard -2003-04-09: French translation is in progress -\end_layout - -\begin_layout Standard -2003-05-09: French translation is available -\end_layout - -\begin_layout Standard -2003-10-16: Italian translation is in progress -\end_layout - -\begin_layout Standard -2004-03-12: Italian translation is available -\end_layout - -\begin_layout Standard -2004-06-18: Greek translation is in progress -\end_layout - -\begin_layout Standard -2005-07-25: Turkish translation is availble -\end_layout - -\begin_layout Standard -2007-03-28: Portuguese-Brazil translation is in progress -\end_layout - -\begin_layout Standard -2008-07-30: Spanish translation is available (but still in progress) -\end_layout - -\begin_layout Standard -2011-05-09: Portuguese-Brazil translation is again in progress -\end_layout - -\begin_layout Subsubsection -Full history -\end_layout - -\begin_layout Standard -See -\begin_inset CommandInset ref -LatexCommand ref -name "revision history" -reference "revision-history" - -\end_inset - - at the end of this document. -\end_layout - -\begin_layout Subsection -To-Do -\end_layout - -\begin_layout Itemize -Fill in missing content -\end_layout - -\begin_layout Itemize -Finishing grammar checking -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "general-translations" - -\end_inset - -Translations -\end_layout - -\begin_layout Standard -Translations always have to contain the URL, version number and copyright - of the original document (but yours, too). - Pls. - don't translate the original changelog, this is not very useful - also - do not translate the full section about available translations, can be - run out-of-date, add an URL to this section here in the English howto. -\end_layout - -\begin_layout Standard -Looks like the document's change frequency is mostly less than once per - month. - Since version 0.27 it looks like that most of the content contributed by - me has been written. - Translations always have to use the English version as source. -\end_layout - -\begin_layout Subsection -To language -\end_layout - -\begin_layout Standard -Note: an overview with URLs can be found at -\begin_inset CommandInset href -LatexCommand href -name "http://www.bieringer.de/linux/IPv6/" -target "http://www.bieringer.de/linux/IPv6/" - -\end_inset - -. -\end_layout - -\begin_layout Subsubsection -Chinese -\end_layout - -\begin_layout Standard -A Chinese translation by Burma Chen (announced - to me at 2002-10-31) can be found on the TLDP: -\begin_inset CommandInset href -LatexCommand href -name "http://www.ibiblio.org/pub/Linux/docs/HOWTO/translations/zh/Linux-IPv6-HOWTO.txt.gz (g'zipped txt)" -target "http://www.ibiblio.org/pub/Linux/docs/HOWTO/translations/zh/Linux-IPv6-HOWTO.txt.gz" - -\end_inset - -. - It's a snapshot translation, don't know whether kept up-to-date. -\end_layout - -\begin_layout Subsubsection -Polish -\end_layout - -\begin_layout Standard -Since 2002-08-16 a Polish translation was started and is still in progress - by Lukasz Jokiel . - Taken source: CVS-version 1.29 of LyX file, which was source for howto version - 0.27. - Status is still work-in-progress (2004-08-30). -\end_layout - -\begin_layout Subsubsection -German -\end_layout - -\begin_layout Standard -With 2002-11-10 a German translation was started by Georg Käfer and the first public version was published 2003-02-10. - It's originally available on Deep Space 6 at -\begin_inset CommandInset href -LatexCommand href -name "http://mirrors.deepspace6.net/Linux+IPv6-HOWTO-de/" -target "http://mirrors.deepspace6.net/Linux+IPv6-HOWTO-de/" - -\end_inset - - (mirrored e.g. - on -\begin_inset CommandInset href -LatexCommand href -name "http://mirrors.bieringer.de/Linux+IPv6-HOWTO-de/" -target "http://mirrors.bieringer.de/Linux+IPv6-HOWTO-de/" - -\end_inset - -). - This version will stay up-to-date as much as possible. -\end_layout - -\begin_layout Subsubsection -French -\end_layout - -\begin_layout Standard -With 2003-04-09 a French translation was started by Michel Boucey and the first public version was published 2003-05-09. - It's originally available on Deep Space 6 at -\begin_inset CommandInset href -LatexCommand href -name "http://mirrors.deepspace6.net/Linux+IPv6-HOWTO-fr/" -target "http://mirrors.deepspace6.net/Linux+IPv6-HOWTO-fr/" - -\end_inset - - (mirrored e.g. - on -\begin_inset CommandInset href -LatexCommand href -name "http://mirrors.bieringer.de/Linux+IPv6-HOWTO-fr/" -target "http://mirrors.bieringer.de/Linux+IPv6-HOWTO-fr/" - -\end_inset - -). -\end_layout - -\begin_layout Subsubsection -Spanish -\end_layout - -\begin_layout Standard -A member of the MontevideoLibre, a project in Uruguay (South America) started - the translation into Spanish in wiki format some time ago, but the URL - is no longer available. -\end_layout - -\begin_layout Subsubsection -Italian -\end_layout - -\begin_layout Standard -With 2003-10-16 a Italian translation was started by Michele Ferritto for the -\begin_inset CommandInset href -LatexCommand href -name "ILDP" -target "http://ildp.pluto.linux.it/" - -\end_inset - - (Italian Linux Documentation Project) and the first public version was - published 2004-03-12. - It's originally available on the ILDP at -\begin_inset CommandInset href -LatexCommand href -name "http://it.tldp.org/HOWTO/Linux+IPv6-HOWTO/" -target "http://it.tldp.org/HOWTO/Linux+IPv6-HOWTO/" - -\end_inset - -. -\end_layout - -\begin_layout Subsubsection -Japanese -\end_layout - -\begin_layout Standard -On 2003-05-14 Shino Taketani send me a note - that he planned to translate the HowTo into Japanese. -\end_layout - -\begin_layout Subsubsection -Greek -\end_layout - -\begin_layout Standard -On 2004-06-18 Nikolaos Tsarmpopoulos send me a note - that he planned to translate the HowTo into Greek. -\end_layout - -\begin_layout Subsubsection -Turkish -\end_layout - -\begin_layout Standard -On 2005-07-18 Necdet Yucel send me a note - that a Turkish translation is available. - It's a snapshot translation (currently of 0.61) and can be found at -\begin_inset CommandInset href -LatexCommand href -name "http://docs.comu.edu.tr/howto/ipv6-howto.html" -target "http://docs.comu.edu.tr/howto/ipv6-howto.html" - -\end_inset - -. -\end_layout - -\begin_layout Subsubsection -Portuguese-Brazil -\end_layout - -\begin_layout Standard -On 2011-05-06 Gustavo Mendes de Carvalho start - to translate the HowTo in Portuguese-Brazil. - The first try in 2007 by Claudemir da Luz was never finished. -\end_layout - -\begin_layout Section -Technical -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "general-original-source" - -\end_inset - -Original source of this HOWTO -\end_layout - -\begin_layout Standard -This HOWTO is currently written with LyX version 1.6.1 on a Fedora 10 Linux - system with template SGML/XML (DocBook book). - It's available on -\begin_inset CommandInset href -LatexCommand href -name "github / tLDP / LDP / users / Peter-Bieringer" -target "https://github.com/tLDP/LDP/tree/master/LDP/users/Peter-Bieringer/" - -\end_inset - - for contribution. -\end_layout - -\begin_layout Subsubsection -Code line wrapping -\end_layout - -\begin_layout Standard -Code line wrapping is done using selfmade utility -\begin_inset Quotes sld -\end_inset - -lyxcodelinewrapper.pl -\begin_inset Quotes srd -\end_inset - -, you can get it from CVS for your own usage: -\begin_inset CommandInset href -LatexCommand href -name "TLDP-CVS / users / Peter-Bieringer" -target "http://cvs.tldp.org/go.to/LDP/LDP/users/Peter-Bieringer/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -SGML generation -\end_layout - -\begin_layout Standard -SGML/XML is generated using export function in LyX. -\end_layout - -\begin_layout Subsection -On-line references to the HTML version of this HOWTO (linking/anchors) -\end_layout - -\begin_layout Subsubsection -Master index page -\end_layout - -\begin_layout Standard -Generally, a reference to the master index page is recommended. - -\end_layout - -\begin_layout Subsubsection -Dedicated pages -\end_layout - -\begin_layout Standard -Because the HTML pages are generated out of the SGML file, the HTML filenames - turn out to be quite random. - However, some pages are tagged in LyX, resulting in static names. - These tags are useful for references and shouldn't be changed in the future. -\end_layout - -\begin_layout Standard -If you think that I have forgotten a tag, please let me know, and I will - add it. -\end_layout - -\begin_layout Section -Preface -\end_layout - -\begin_layout Standard -Some things first: -\end_layout - -\begin_layout Subsection -How many versions of a Linux & IPv6 related HOWTO are floating around? -\end_layout - -\begin_layout Standard -Including this, there are three (3) HOWTO documents available. - Apologies, if that is too many ;-) -\end_layout - -\begin_layout Subsubsection -Linux IPv6 FAQ/HOWTO (outdated) -\end_layout - -\begin_layout Standard -The first IPv6 related document was written by -\emph on -Eric Osborne -\emph default - and called -\begin_inset CommandInset href -LatexCommand href -name "Linux IPv6 FAQ/HOWTO" -target "http://www.linuxhq.com/IPv6/" - -\end_inset - - (please use it only for historical issues). - -\series bold -Latest -\series default - -\series bold -version -\series default - was 3.2.1 released July, 14 -\series bold -1997 -\series default -. -\end_layout - -\begin_layout Standard -Please help: if someone knows the date of birth of this HOWTO, please send - me an e-mail (information will be needed in -\begin_inset Quotes sld -\end_inset - -history -\begin_inset Quotes srd -\end_inset - -). -\end_layout - -\begin_layout Subsubsection -IPv6 & Linux - HowTo (maintained) -\end_layout - -\begin_layout Standard -There exists a second version called -\begin_inset CommandInset href -LatexCommand href -name "IPv6 & Linux - HowTo" -target "http://www.bieringer.de/linux/IPv6/" - -\end_inset - - written by me ( -\emph on -Peter Bieringer -\emph default -) in pure HTML. - -\series bold -It was born -\series default - April -\series bold -1997 -\series default - and the first English version was published in June 1997. - I will continue to -\series bold -maintain -\series default -it, but it will slowly fade (but not full) in favour of the Linux IPv6 HOWTO - you are currently reading. -\end_layout - -\begin_layout Subsubsection -Linux IPv6 HOWTO (this document) -\end_layout - -\begin_layout Standard -Because the -\begin_inset CommandInset href -LatexCommand href -name "IPv6 & Linux - HowTo" -target "http://www.bieringer.de/linux/IPv6/" - -\end_inset - - is written in pure HTML it's not really compatible with the -\begin_inset CommandInset href -LatexCommand href -name "The Linux Documentation Project (TLDP)" -target "http://www.tldp.org/" - -\end_inset - -. - I ( -\emph on -Peter Bieringer -\emph default -) got a request in late November 2001 to rewrite the -\begin_inset CommandInset href -LatexCommand href -name "IPv6 & Linux - HowTo" -target "http://www.bieringer.de/linux/IPv6/" - -\end_inset - - in SGML. - However, because of the discontinuation of that HOWTO ( -\begin_inset CommandInset href -LatexCommand href -name "Future of IPv6 & Linux - HowTo" -target "http://www.bieringer.de/linux/IPv6/IPv6-HOWTO/IPv6-HOWTO-0.html#history" - -\end_inset - -), and as IPv6 is becoming more and more standard, I decided to write a - new document covering basic and advanced issues which will remain important - over the next few years. - More dynamic and some advanced content will be still found further on in - the second HOWTO ( -\begin_inset CommandInset href -LatexCommand href -name "IPv6 & Linux - HowTo" -target "http://www.bieringer.de/linux/IPv6/" - -\end_inset - -). -\end_layout - -\begin_layout Section -Used terms, glossary and shortcuts -\end_layout - -\begin_layout Subsection -Network related -\end_layout - -\begin_layout Description -Base -\begin_inset space ~ -\end_inset - -10 Well known decimal number system, represent any value with digit 0-9. -\end_layout - -\begin_layout Description -Base -\begin_inset space ~ -\end_inset - -16 Usually used in lower and higher programming languages, known also as - hexadecimal number system, represent any value with digit 0-9 and char - A-F (case insensitive). -\end_layout - -\begin_layout Description -Base -\begin_inset space ~ -\end_inset - -85 Representation of a value with 85 different digits/chars, this can lead - to shorter strings but never seen in the wild. -\end_layout - -\begin_layout Description -Bit Smallest storage unit, on/true (1) or off/false (0) -\end_layout - -\begin_layout Description -Byte Mostly a collection of 8 (but not really a must - see older computer - systems) bits -\end_layout - -\begin_layout Description -Device Here, hardware of network connection, see also NIC -\end_layout - -\begin_layout Description -Dual -\begin_inset space ~ -\end_inset - -homed -\begin_inset space ~ -\end_inset - -host A dual homed host is a node with two network (physical or virtual) - interfaces on two different links, but does not forward any packets between - the interfaces. -\end_layout - -\begin_layout Description -Host Generally a single homed host on a link. - Normally it has only one active network interface, e.g. - Ethernet or (not and) PPP. -\end_layout - -\begin_layout Description -Interface Mostly same as -\begin_inset Quotes sld -\end_inset - -device -\begin_inset Quotes srd -\end_inset - -, see also NIC -\end_layout - -\begin_layout Description -IP -\begin_inset space ~ -\end_inset - -Header Header of an IP packet (each network packet has a header, kind of - is depending on network layer) -\end_layout - -\begin_layout Description -Link A link is a layer 2 network packet transport medium, examples are Ethernet, - Token Ring, PPP, SLIP, ATM, ISDN, Frame Relay,... -\end_layout - -\begin_layout Description -Node A node is a host or a router. -\end_layout - -\begin_layout Description -Octet A collection of 8 real bits, today also similar to -\begin_inset Quotes sld -\end_inset - -byte -\begin_inset Quotes srd -\end_inset - -. -\end_layout - -\begin_layout Description -Port Information for the TCP/UDP dispatcher (layer 4) to transport information - to upper layers -\end_layout - -\begin_layout Description -Protocol Each network layer contains mostly a protocol field to make life - easier on dispatching transported information to upper layer, seen in layer - 2 (MAC) and 3 (IP) -\end_layout - -\begin_layout Description -Router A router is a node with two or more network (physical or virtual) - interfaces, capable of forwarding packets between the interfaces. -\end_layout - -\begin_layout Description -Socket An IP socket is defined by source and destination IP addresses and - Ports and (binding) -\end_layout - -\begin_layout Description -Stack Network related a collection of layers -\end_layout - -\begin_layout Description -Subnetmask IP networks uses bit masks to separate local networks from remote - ones -\end_layout - -\begin_layout Description -Tunnel A tunnel is typically a point-to-point connection over which packets - are exchanged which carry the data of another protocol, e.g. - an IPv6-in-IPv4 tunnel. -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "Glossar" - -\end_inset - -Shortcuts -\end_layout - -\begin_layout Description -ACL Access Control List -\end_layout - -\begin_layout Description -API Application Programming Interface -\end_layout - -\begin_layout Description -ASIC Application Specified Integrated Circuit -\end_layout - -\begin_layout Description -BSD Berkeley Software Distribution -\end_layout - -\begin_layout Description -CAN-Bus Controller Area Network Bus (physical bus system) -\end_layout - -\begin_layout Description -ISP Internet Service Provider -\end_layout - -\begin_layout Description -KAME Project - a joint effort of six companies in Japan to provide a free - IPv6 and IPsec (for both IPv4 and IPv6) stack for BSD variants to the world - -\begin_inset CommandInset href -LatexCommand href -name "www.kame.net" -target "http://www.kame.net/" - -\end_inset - - -\end_layout - -\begin_layout Description -LIR Local Internet Registry -\end_layout - -\begin_layout Description -NIC Network Interface Card -\end_layout - -\begin_layout Description -RFC Request For Comments - set of technical and organizational notes about - the Internet -\end_layout - -\begin_layout Description -USAGI UniverSAl playGround for Ipv6 Project - works to deliver the production - quality IPv6 protocol stack for the Linux system. -\end_layout - -\begin_layout Subsection -Document related -\end_layout - -\begin_layout Subsubsection -Long code line wrapping signal char -\end_layout - -\begin_layout Standard -The special character -\begin_inset Quotes sld -\end_inset - -¬ -\begin_inset Quotes srd -\end_inset - - is used for signaling that this code line is wrapped for better viewing - in PDF and PS files. -\end_layout - -\begin_layout Subsubsection -Placeholders -\end_layout - -\begin_layout Standard -In generic examples you will sometimes find the following: -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Standard -For real use on your system command line or in scripts this has to be replaced - with relevant content (removing the < and > of course), the result would - be e.g. -\end_layout - -\begin_layout Code -1.2.3.4 -\end_layout - -\begin_layout Subsubsection -Commands in the shell -\end_layout - -\begin_layout Standard -Commands executable as non-root user begin with $, e.g. -\end_layout - -\begin_layout Code -$ whoami -\end_layout - -\begin_layout Standard -Commands executable as root user begin with #, e.g. -\end_layout - -\begin_layout Code -# whoami -\end_layout - -\begin_layout Section -Requirements for using this HOWTO -\end_layout - -\begin_layout Subsection -Personal prerequisites -\end_layout - -\begin_layout Subsubsection -Experience with Unix tools -\end_layout - -\begin_layout Standard -You should be familiar with the major Unix tools e.g. - -\emph on -grep -\emph default -, -\emph on -awk -\emph default -, -\emph on -find -\emph default -, ... - , and know about their most commonly used command-line options. -\end_layout - -\begin_layout Subsubsection -Experience with networking theory -\end_layout - -\begin_layout Standard -You should know about layers, protocols, addresses, cables, plugs, etc. - If you are new to this field, here is one good starting point for you: - -\lang ngerman - -\begin_inset CommandInset href -LatexCommand href -name "http://www.rigacci.org/docs/biblio/online/intro_to_networking/book1.htm" -target "http://www.rigacci.org/docs/biblio/online/intro_to_networking/book1.htm" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Experience with IPv4 configuration -\end_layout - -\begin_layout Standard -You should definitely have some experience in IPv4 configuration, otherwise - it will be hard for you to understand what is really going on. -\end_layout - -\begin_layout Subsubsection -Experience with the Domain Name System (DNS) -\end_layout - -\begin_layout Standard -Also you should understand what the Domain Name System (DNS) is, what it - provides and how to use it. -\end_layout - -\begin_layout Subsubsection -Experience with network debugging strategies -\end_layout - -\begin_layout Standard -You should at least understand how to use -\emph on -tcpdump -\emph default - and what -\emph on - -\emph default -it can show you. - Otherwise, network debugging will very difficult for you. -\end_layout - -\begin_layout Subsection -Linux operating system compatible hardware -\end_layout - -\begin_layout Standard -Surely you wish to experiment with real hardware, and not only read this - HOWTO to fall asleep here and there. - ;-7) -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-basics" - -\end_inset - -Basics -\end_layout - -\begin_layout Section -What is IPv6? -\end_layout - -\begin_layout Standard -IPv6 is a new layer 3 protocol -\color none - which will supersede IPv4 (also known as IP). - IPv4 was designed a long time ago ( -\begin_inset CommandInset href -LatexCommand href -name "RFC 760 / Internet Protocol" -target "http://www.faqs.org/rfcs/rfc760.html" - -\end_inset - - from January 1980) and since its inception, there have been many requests - for more addresses and enhanced capabilities. - Latest RFC is -\begin_inset CommandInset href -LatexCommand href -name "RFC 2460 / Internet Protocol Version 6 Specification" -target "http://www.faqs.org/rfcs/rfc2460.html" - -\end_inset - -. - Major changes in IPv6 are the redesign of the header, including the increase - of address size from 32 bits to 128 bits. - Because layer 3 is responsible for end-to-end packet transport using packet - routing based on addresses, it must include the new IPv6 addresses (source - and destination), like IPv4. -\end_layout - -\begin_layout Standard -For more information about the IPv6 history take a look at older IPv6 related - RFCs listed e.g. - at -\begin_inset CommandInset href -LatexCommand href -name "SWITCH IPv6 Pilot / References" -target "http://www.switch.ch/lan/ipv6/references.html" - -\end_inset - -. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "basic-history-IPv6-Linux" - -\end_inset - -History of IPv6 in Linux -\end_layout - -\begin_layout Standard -The years 1992, 1993 and 1994 of the IPv6 History (in general) are covered - by the following document: -\begin_inset CommandInset href -LatexCommand href -name "IPv6 or IPng (IP next generation)" -target "http://www.laynetworks.com/IPv6.htm#CH3" - -\end_inset - -. -\end_layout - -\begin_layout Standard -To-do: better time-line, more content... -\end_layout - -\begin_layout Subsection -Beginning -\end_layout - -\begin_layout Standard -The first IPv6 related network code was added to the Linux kernel 2.1.8 in - November 1996 by Pedro Roque. - It was based on the BSD API: -\end_layout - -\begin_layout Code -diff -u --recursive --new-file v2.1.7/linux/include/linux/in6.h -\end_layout - -\begin_layout Code -¬ linux/include/linux/in6.h -\end_layout - -\begin_layout Code ---- v2.1.7/linux/include/linux/in6.h Thu Jan 1 02:00:00 1970 -\end_layout - -\begin_layout Code -+++ linux/include/linux/in6.h Sun Nov 3 11:04:42 1996 -\end_layout - -\begin_layout Code -@@ -0,0 +1,99 @@ -\end_layout - -\begin_layout Code -+/* -\end_layout - -\begin_layout Code -+ * Types and definitions for AF_INET6 -\end_layout - -\begin_layout Code -+ * Linux INET6 implementation -\end_layout - -\begin_layout Code -+ * + * Authors: -\end_layout - -\begin_layout Code -+ * Pedro Roque <******> -\end_layout - -\begin_layout Code -+ * -\end_layout - -\begin_layout Code -+ * Source: -\end_layout - -\begin_layout Code -+ * IPv6 Program Interfaces for BSD Systems -\end_layout - -\begin_layout Code -+ * -\end_layout - -\begin_layout Standard -The shown lines were copied from patch-2.1.8 (e-mail address was blanked on - copy&paste). -\end_layout - -\begin_layout Subsection -In between -\end_layout - -\begin_layout Standard -Because of lack of manpower, the IPv6 implementation in the kernel was unable - to follow the discussed drafts or newly released RFCs. - In October 2000, a project was started in Japan, called -\begin_inset CommandInset href -LatexCommand href -name "USAGI" -target "http://www.linux-ipv6.org/" - -\end_inset - -, whose aim was to implement all missing, or outdated IPv6 support in Linux. - It tracks the current IPv6 implementation in FreeBSD made by the -\begin_inset CommandInset href -LatexCommand href -name "KAME project" -target "http://www.kame.net/" - -\end_inset - -. - From time to time they create snapshots against current vanilla Linux kernel - sources. -\end_layout - -\begin_layout Standard -Until kernel development series 2.5.x was started, the -\begin_inset CommandInset href -LatexCommand href -name "USAGI" -target "http://www.linux-ipv6.org/" - -\end_inset - - patch was so big, that Linux networking maintainers were unable to include - it completly in the production source of the Linux kernel 2.4.x series. -\end_layout - -\begin_layout Standard -During kernel development series 2.5.x, -\begin_inset CommandInset href -LatexCommand href -name "USAGI" -target "http://www.linux-ipv6.org/" - -\end_inset - - tried to insert all of their current extensions into this. -\end_layout - -\begin_layout Subsection -Current -\end_layout - -\begin_layout Standard -Many of the long-term developed IPv6 related patches by -\begin_inset CommandInset href -LatexCommand href -name "USAGI" -target "http://www.linux-ipv6.org/" - -\end_inset - - and others are integrated into vanilla kernel series 2.6.x. -\end_layout - -\begin_layout Subsection -Future -\end_layout - -\begin_layout Standard -\begin_inset CommandInset href -LatexCommand href -name "USAGI" -target "http://www.linux-ipv6.org/" - -\end_inset - - and others are still working on implementation of newer features like mobililty - and others. - From time to time, new extension patches are released and also integration - into vanilla kernel series is made. -\end_layout - -\begin_layout Section -What do IPv6 addresses look like? -\end_layout - -\begin_layout Standard -\align left -As previously mentioned, IPv6 addresses are 128 bits long. - This number of bits generates very high decimal numbers with up to 39 digits: - -\end_layout - -\begin_layout Code -2^128-1: 340282366920938463463374607431768211455 -\end_layout - -\begin_layout Standard -\align left -Such numbers are not really addresses that can be memorized. - Also the IPv6 address schema is bitwise oriented (just like IPv4, but that's - not often recognized). - Therefore a better notation of such big numbers is hexadecimal. - In hexadecimal, 4 bits (also known as -\begin_inset Quotes sld -\end_inset - -nibble -\begin_inset Quotes srd -\end_inset - -) are represented by a digit or character from 0-9 and a-f (10-15). - This format reduces the length of the IPv6 address to 32 characters. -\end_layout - -\begin_layout Code -2^128-1: 0xffffffffffffffffffffffffffffffff -\end_layout - -\begin_layout Standard -\align left -This representation is still not very convenient (possible mix-up or loss - of single hexadecimal digits), so the designers of IPv6 chose a hexadecimal - format with a colon as separator after each block of 16 bits. - In addition, the leading " -\family typewriter -0x -\family default -" (a signifier for hexadecimal values used in programming languages) is - removed: -\end_layout - -\begin_layout Code -2^128-1: ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff -\end_layout - -\begin_layout Standard -\align left -A usable address (see address types later) is e.g.: -\end_layout - -\begin_layout Code -2001:0db8:0100:f101:0210:a4ff:fee3:9566 -\end_layout - -\begin_layout Standard -\align left -For simplifications, leading zeros of each 16 bit block can be omitted: - -\end_layout - -\begin_layout Code -2001:0db8:0100:f101:0210:a4ff:fee3:9566 -> -\end_layout - -\begin_layout Code -¬ 2001:db8:100:f101:210:a4ff:fee3:9566 -\end_layout - -\begin_layout Standard -\align left -One sequence of 16 bit blocks containing only zeroes can be replaced with - -\begin_inset Quotes eld -\end_inset - - -\family typewriter -:: -\family default - -\begin_inset Quotes eld -\end_inset - -. - But not more than one at a time, otherwise it is no longer a unique representat -ion. - -\end_layout - -\begin_layout Code -2001:0db8:100:f101:0:0:0:1 -> 2001:db8:100:f101::1 -\end_layout - -\begin_layout Standard -\align left -The biggest reduction is seen by the IPv6 localhost address: -\end_layout - -\begin_layout Code -0000:0000:0000:0000:0000:0000:0000:0001 -> ::1 -\end_layout - -\begin_layout Standard -\align left -There is also a so-called -\emph on -compact -\emph default - (base85 coded) representation defined in -\begin_inset CommandInset href -LatexCommand href -name "RFC 1924 / A Compact Representation of IPv6 Addresses" -target "http://www.faqs.org/rfcs/rfc1924.html" - -\end_inset - - (published on 1. - April 1996), never seen in the wild, probably an April fool's joke, but - here is an example: -\end_layout - -\begin_layout Code -# ipv6calc --addr_to_base85 2001:0db8:0100:f101:0210:a4ff:fee3:9566 -\end_layout - -\begin_layout Code -9R}vSQZ1W=9A_Q74Lz&R -\end_layout - -\begin_layout Quotation -Info: -\emph on -ipv6calc -\emph default - is an IPv6 address format calculator and converter program and can be found - here: -\lang ngerman - -\begin_inset CommandInset href -LatexCommand href -name "ipv6calc homepage" -target "http://www.deepspace6.net/projects/ipv6calc.html" - -\end_inset - - ( -\begin_inset CommandInset href -LatexCommand href -name "Mirror" -target "http://mirrors.bieringer.de/www.deepspace6.net/projects/ipv6calc.html" - -\end_inset - -) -\end_layout - -\begin_layout Section -FAQ (Basics) -\end_layout - -\begin_layout Subsection -Why is the name IPv6 and not IPv5 as successor for IPv4? -\end_layout - -\begin_layout Standard -\align left -On any IP header, the first 4 bits are reserved for protocol version. - So theoretically a protocol number between 0 and 15 is possible: -\end_layout - -\begin_layout Itemize -\align left -4: is already used for IPv4 -\end_layout - -\begin_layout Itemize -\align left -5: is reserved for the Stream Protocol (STP, -\begin_inset CommandInset href -LatexCommand href -name "RFC 1819 / Internet Stream Protocol Version 2" -target "http://www.faqs.org/rfcs/rfc1819.html" - -\end_inset - -) (which never really made it to the public) -\end_layout - -\begin_layout Standard -\align left -The next free number was 6. - Hence IPv6 was born! -\end_layout - -\begin_layout Subsection -IPv6 addresses: why such a high number of bits? -\end_layout - -\begin_layout Standard -\align left -During the design of IPv4, people thought that 32 bits were enough for the - world. - Looking back into the past, 32 bits were enough until now and will perhaps - be enough for another few years. - However, 32 bits are not enough to provide each network device with a global - address in the future. - Think about mobile phones, cars (including electronic devices on its CAN-bus), - toasters, refrigerators, light switches, and so on... -\end_layout - -\begin_layout Standard -\align left -So designers have chosen 128 bits, 4 times more in length than in IPv4 today. -\end_layout - -\begin_layout Standard -The usable size is smaller than it may appear however. - This is because in the currently defined address schema, 64 bits are used - for interface identifiers. - The other 64 bits are used for routing. - Assuming the current strict levels of aggregation (/48, /32, ...), it is still - possible to -\begin_inset Quotes sld -\end_inset - -run out -\begin_inset Quotes srd -\end_inset - - of space, but hopefully not in the near future. -\end_layout - -\begin_layout Standard -See also for more information -\begin_inset CommandInset href -LatexCommand href -name "RFC 1715 / The H Ratio for Address Assignment Efficiency" -target "http://www.faqs.org/rfcs/rfc1715.html" - -\end_inset - - and -\begin_inset CommandInset href -LatexCommand href -name "RFC 3194 / The Host-Density Ratio for Address Assignment Efficiency" -target "http://www.faqs.org/rfcs/rfc3194.html" - -\end_inset - -. -\end_layout - -\begin_layout Subsection -IPv6 addresses: why so small a number of bits on a new design? -\end_layout - -\begin_layout Standard -\align left -While, there are (possibly) some people (only know about Jim Fleming...) on - the Internet who are thinking about IPv8 and IPv16, their design is far - away from acceptance and implementation. - In the meantime 128 bits was the best choice regarding header overhead - and data transport. - Consider the minimum Maximum Transfer Unit (MTU) in IPv4 (576 octets) and - in IPv6 (1280 octets), the header length in IPv4 is 20 octets (minimum, - can increase to 60 octets with IPv4 options) and in IPv6 is 40 octets (fixed). - This is 3.4 % of minimum MTU in IPv4 and 3.1 % of minimum MTU in IPv6. - This means the header overhead is almost equal. - More bits for addresses would require bigger headers and therefore more - overhead. - Also, consider the maximum MTU on normal links (like Ethernet today): it's - 1500 octets (in special cases: 9k octets using Jumbo frames). - Ultimately, it wouldn't be a proper design if 10 % or 20 % of transported - data in a Layer-3 packet were used for addresses and not for payload. -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-addresstypes" - -\end_inset - -Address types -\end_layout - -\begin_layout Standard -Like IPv4, IPv6 addresses can be split into network and host parts using - subnet masks. -\end_layout - -\begin_layout Standard -IPv4 has shown that sometimes it would be nice, if more than one IP address - can be assigned to an interface, each for a different purpose (aliases, - multi-cast). - To remain extensible in the future, IPv6 is going further and allows more - than one IPv6 address to be assigned to an interface. - There is currently no limit defined by an RFC, only in the implementation - of the IPv6 stack (to prevent DoS attacks). -\end_layout - -\begin_layout Standard -Using this large number of bits for addresses, IPv6 defines address types - based on some leading bits, which are hopefully never going to be broken - in the future (unlike IPv4 today and the history of class A, B, and C). -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_layout Standard -\align left -Also the number of bits are separated into a network part (upper 64 bits) - and a host part (lower 64 bits), to facilitate auto-configuration. -\end_layout - -\begin_layout Section -Addresses without a special prefix -\end_layout - -\begin_layout Subsection -Localhost address -\end_layout - -\begin_layout Standard -This is a special address for the loopback interface, similiar to IPv4 with - its -\begin_inset Quotes sld -\end_inset - -127.0.0.1 -\begin_inset Quotes srd -\end_inset - -. - With IPv6, the localhost address is: -\end_layout - -\begin_layout Code -0000:0000:0000:0000:0000:0000:0000:0001 -\end_layout - -\begin_layout Standard -or compressed: -\end_layout - -\begin_layout Code -::1 -\end_layout - -\begin_layout Standard -\align left -Packets with this address as source or destination should never leave the - sending host. -\end_layout - -\begin_layout Subsection -Unspecified address -\end_layout - -\begin_layout Standard -This is a special address like -\begin_inset Quotes sld -\end_inset - -any -\begin_inset Quotes srd -\end_inset - - or -\begin_inset Quotes sld -\end_inset - -0.0.0.0 -\begin_inset Quotes srd -\end_inset - - in IPv4 . - For IPv6 it's: -\end_layout - -\begin_layout Code -0000:0000:0000:0000:0000:0000:0000:0000 -\end_layout - -\begin_layout Standard -or: -\end_layout - -\begin_layout Code -:: -\end_layout - -\begin_layout Standard -These addresses are mostly used/seen in socket binding (to any IPv6 address) - or routing tables. -\end_layout - -\begin_layout Standard -Note: the unspecified address cannot be used as destination address. -\end_layout - -\begin_layout Subsection -IPv6 address with embedded IPv4 address -\end_layout - -\begin_layout Standard -There are two addresses which contain an IPv4 address. -\end_layout - -\begin_layout Subsubsection -IPv4-mapped IPv6 address -\end_layout - -\begin_layout Standard -IPv4-only IPv6-compatible addresses are sometimes used/shown for sockets - created by an IPv6-enabled daemon, but only binding to an IPv4 address. -\end_layout - -\begin_layout Standard -These addresses are defined with a special prefix of length 96 (a.b.c.d is - the IPv4 address): -\end_layout - -\begin_layout Code -0:0:0:0:0:ffff:a.b.c.d/96 -\end_layout - -\begin_layout Standard -or in compressed format -\end_layout - -\begin_layout Code -::ffff:a.b.c.d/96 -\end_layout - -\begin_layout Standard -For example, the IPv4 address 1.2.3.4 looks like this: -\end_layout - -\begin_layout Code -::ffff:1.2.3.4 -\end_layout - -\begin_layout Subsubsection -IPv4-compatible IPv6 address -\end_layout - -\begin_layout Standard -IPv4-compatible IPv6 addresses are used for automatic tunneling ( -\begin_inset CommandInset href -LatexCommand href -name "RFC 2893 / Transition Mechanisms for IPv6 Hosts and Routers" -target "http://www.faqs.org/rfcs/rfc2893.html" - -\end_inset - -), which is being replaced by -\begin_inset CommandInset ref -LatexCommand ref -name "6to4 tunneling" -reference "tunneling-6to4" - -\end_inset - -. -\end_layout - -\begin_layout Code -0:0:0:0:0:0:a.b.c.d/96 -\end_layout - -\begin_layout Standard -or in compressed format -\end_layout - -\begin_layout Code -::a.b.c.d/96 -\end_layout - -\begin_layout Section -Network part, also known as prefix -\end_layout - -\begin_layout Standard -Designers defined some address types and left a lot of scope for future - definitions as currently unknown requirements arise. - -\begin_inset CommandInset href -LatexCommand href -name "RFC 4291 / IP Version 6 Addressing Architecture" -target "http://www.faqs.org/rfcs/rfc4291.html" - -\end_inset - - defines the current addressing scheme. -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_layout Standard -\align left -Now lets take a look at the different types of prefixes (and therefore address - types): -\end_layout - -\begin_layout Subsection -Link local address type -\end_layout - -\begin_layout Standard -\align left -These are special addresses which will only be valid on a link of an interface. - Using this address as destination the packet would never pass through a - router. - It's used for link communications such as: -\end_layout - -\begin_layout Itemize -\align left -anyone else here on this link? -\end_layout - -\begin_layout Itemize -\align left -anyone here with a special address (e.g. - looking for a router)? -\end_layout - -\begin_layout Standard -\align left -They begin with ( where -\emph on - -\begin_inset Quotes sld -\end_inset - -x -\begin_inset Quotes srd -\end_inset - - -\emph default - is any hex character, normally -\emph on - -\begin_inset Quotes sld -\end_inset - -0 -\emph default - -\begin_inset Quotes srd -\end_inset - -) -\end_layout - -\begin_layout Code -fe8x: <- currently the only one in use -\end_layout - -\begin_layout Code -fe9x: -\end_layout - -\begin_layout Code -feax: -\end_layout - -\begin_layout Code -febx: -\end_layout - -\begin_layout Standard -An address with this prefix is found on each IPv6-enabled interface after - stateless auto-configuration (which is normally always the case). -\end_layout - -\begin_layout Subsection -Site local address type -\end_layout - -\begin_layout Standard -\align left -These are addresses similar to the -\begin_inset CommandInset href -LatexCommand href -name "RFC 1918 / Address Allocation for Private Internets" -target "http://www.faqs.org/rfcs/rfc1918.html" - -\end_inset - - in IPv4 today, with the added advantage that everyone who use this address - type has the capability to use the given 16 bits for a maximum number of - 65536 subnets. - Comparable with the -\family typewriter -10.0.0.0/8 -\family default - in IPv4 today. -\end_layout - -\begin_layout Standard -\align left -Another advantage: because it's possible to assign more than one address - to an interface with IPv6, you can also assign such a site local address - in addition to a global one. -\end_layout - -\begin_layout Standard -\align left -It begins with: -\end_layout - -\begin_layout Code -fecx: <- most commonly used -\end_layout - -\begin_layout Code -fedx: -\end_layout - -\begin_layout Code -feex: -\end_layout - -\begin_layout Code -fefx: -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Standard -(where -\emph on - -\begin_inset Quotes sld -\end_inset - -x -\begin_inset Quotes srd -\end_inset - - -\emph default - is any hex character, normally -\emph on - -\begin_inset Quotes sld -\end_inset - -0 -\emph default - -\begin_inset Quotes srd -\end_inset - -) -\end_layout - -\begin_layout Standard -This address type is now deprecated -\begin_inset CommandInset href -LatexCommand href -name "RFC 3879 / Deprecating Site Local Addresses" -target "http://www.faqs.org/rfcs/rfc3879.html" - -\end_inset - -, but for a test in a lab, such addresses are still a good choice in my - humble opinion. -\end_layout - -\begin_layout Subsection -Unique Local IPv6 Unicast Addresses -\end_layout - -\begin_layout Standard -Because the original defined site local addresses are not unique, this can - lead to major problems, if two former independend networks would be connected - later (overlapping of subnets). - This and other issues lead to a new address type named -\begin_inset CommandInset href -LatexCommand href -name "RFC 4193 / Unique Local IPv6 Unicast Addresses" -target "http://www.faqs.org/rfcs/rfc4193.html" - -\end_inset - -. - -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_layout Standard -\align left -It begins with: -\end_layout - -\begin_layout Code -fcxx: -\end_layout - -\begin_layout Code -fdxx: <- currently the only one in use -\end_layout - -\begin_layout Standard -\align left -A part of the prefix (40 bits) are generated using a pseudo-random algorithm - and it's improbable, that two generated ones are equal. -\end_layout - -\begin_layout Standard -Example for a prefix (generated using a web-based tool: -\begin_inset CommandInset href -LatexCommand href -name "Goebel Consult / createLULA" -target "http://www.goebel-consult.de/ipv6/createLULA" - -\end_inset - -): -\end_layout - -\begin_layout Code -fd0f:8b72:ac90::/48 -\end_layout - -\begin_layout Subsection -Global address type "(Aggregatable) global unicast" -\end_layout - -\begin_layout Standard -\align left -Today, there is one global address type defined (the first design, called - "provider based," was thrown away some years ago -\begin_inset CommandInset href -LatexCommand href -name "RFC 1884 / IP Version 6 Addressing Architecture [obsolete]" -target "http://www.faqs.org/rfcs/rfc1884.html" - -\end_inset - -, you will find some remains in older Linux kernel sources). -\end_layout - -\begin_layout Standard -\align left -It begins with ( -\emph on -x -\emph default - are hex characters) -\end_layout - -\begin_layout Code -2xxx: -\end_layout - -\begin_layout Code -3xxx: -\end_layout - -\begin_layout Standard -Note: the prefix -\begin_inset Quotes sld -\end_inset - -aggregatable -\begin_inset Quotes srd -\end_inset - - is thrown away in current drafts. -\begin_inset Newline newline -\end_inset - -There are some further subtypes defined, see below: -\end_layout - -\begin_layout Subsubsection -6bone test addresses -\end_layout - -\begin_layout Standard -\align left -These were the first global addresses which were defined and in use. - They all start with -\end_layout - -\begin_layout Code -3ffe: -\end_layout - -\begin_layout Standard -Example: -\end_layout - -\begin_layout Code -3ffe:ffff:100:f102::1 -\end_layout - -\begin_layout Standard -A special 6bone test address which will never be globally unique begins - with -\end_layout - -\begin_layout Code -3ffe:ffff: -\end_layout - -\begin_layout Standard -and is mostly shown in older examples. - The reason for this is, if real addresses are are shown, it's possible - for someone to do a copy & paste to their configuration files, thus inadvertent -ly causing duplicates on a globally unique address. - This would cause serious problems for the original host (e.g. - getting answer packets for request that were never sent). -\begin_inset Newline newline -\end_inset - -Because IPv6 is now in production, this prefix is no longer be delegated - and is removed from routing after 6.6.2006 (see -\begin_inset CommandInset href -LatexCommand href -name "RFC 3701 / 6bone Phaseout" -target "http://www.faqs.org/rfcs/rfc3701.html" - -\end_inset - - for more). -\end_layout - -\begin_layout Subsubsection -6to4 addresses -\end_layout - -\begin_layout Standard -\align left -These addresses, designed for a special tunneling mechanism [ -\begin_inset CommandInset href -LatexCommand href -name "RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds" -target "http://www.faqs.org/rfcs/rfc3056.html" - -\end_inset - - and -\begin_inset CommandInset href -LatexCommand href -name "RFC 2893 / Transition Mechanisms for IPv6 Hosts and Routers" -target "http://www.faqs.org/rfcs/rfc2893.html" - -\end_inset - -], encode a given IPv4 address and a possible subnet and begin with -\end_layout - -\begin_layout Code -2002: -\end_layout - -\begin_layout Standard -For example, representing 192.168.1.1/5: -\end_layout - -\begin_layout Code -2002:c0a8:0101:5::1 -\end_layout - -\begin_layout Standard -A small shell command line can help you generating such address out of a - given IPv4 one: -\end_layout - -\begin_layout Code -ipv4="1.2.3.4"; sla="5"; printf "2002:%02x%02x:%02x%02x:%04x::1" `echo $ipv4 -\end_layout - -\begin_layout Code -¬ | tr "." " "` $sla -\end_layout - -\begin_layout Standard -See also -\begin_inset CommandInset ref -LatexCommand ref -name "tunneling using 6to4" -reference "tunneling-6to4" - -\end_inset - - and -\begin_inset CommandInset ref -LatexCommand ref -name "information about 6to4 relay routers" -reference "information-joinipv6-6to4-tunneling" - -\end_inset - -. -\end_layout - -\begin_layout Subsubsection -Assigned by provider for hierarchical routing -\end_layout - -\begin_layout Standard -These addresses are delegated to Internet service providers (ISP) and begin - currently with -\end_layout - -\begin_layout Code -2001: -\end_layout - -\begin_layout Standard -Prefixes to major (backbone owning) ISPs (also known as LIRs) are delegated - by -\begin_inset CommandInset ref -LatexCommand ref -name "local registries" -reference "information-majorregionregistries" - -\end_inset - - and currently have a prefix with length 32 assigned. -\end_layout - -\begin_layout Standard -Any ISP customer can get a prefix with length 48. -\end_layout - -\begin_layout Subsubsection -Addresses reserved for examples and documentation -\end_layout - -\begin_layout Standard -Currently, two address ranges are reserved for examples and documentation - -\begin_inset CommandInset href -LatexCommand href -name "RFC 3849 / IPv6 Address Prefix Reserved for Documentation" -target "http://www.faqs.org/rfcs/rfc3849.html" - -\end_inset - -: -\end_layout - -\begin_layout Code -3fff:ffff::/32 -\end_layout - -\begin_layout Code -2001:0DB8::/32 EXAMPLENET-WF -\end_layout - -\begin_layout Standard -These address ranges should be filtered based on source addresses and should - NOT be routed on border routers to the internet, if possible. -\end_layout - -\begin_layout Subsection -Multicast addresses -\end_layout - -\begin_layout Standard -\align left -Multicast addresses are used for related services. - -\end_layout - -\begin_layout Standard -\align left -They alway start with ( -\emph on -xx -\emph default - is the scope value) -\end_layout - -\begin_layout Code -ffxy: -\end_layout - -\begin_layout Standard -They are split into scopes and types: -\end_layout - -\begin_layout Subsubsection -Multicast scopes -\end_layout - -\begin_layout Standard -Multicast scope is a parameter to specify the maximum distance a multicast - packet can travel from the sending entity. -\end_layout - -\begin_layout Standard -Currently, the following regions (scopes) are defined: -\end_layout - -\begin_layout Itemize -ffx1: node-local, packets never leave the node. -\end_layout - -\begin_layout Itemize -ffx2: link-local, packets are never forwarded by routers, so they never - leave the specified link. -\end_layout - -\begin_layout Itemize -ffx5: site-local, packets never leave the site. -\end_layout - -\begin_layout Itemize -ffx8: organization-local, packets never leave the organization (not so easy - to implement, must be covered by routing protocol). -\end_layout - -\begin_layout Itemize -ffxe: global scope. -\end_layout - -\begin_layout Itemize -others are reserved -\end_layout - -\begin_layout Subsubsection -Multicast types -\end_layout - -\begin_layout Standard -There are many types already defined/reserved (see -\begin_inset CommandInset href -LatexCommand href -name "RFC 4291 / IP Version 6 Addressing Architecture" -target "http://www.faqs.org/rfcs/rfc4291.html" - -\end_inset - - for details). - Some examples are: -\end_layout - -\begin_layout Itemize -All Nodes Address: ID = 1h, addresses all hosts on the local node (ff01:0:0:0:0: -0:0:1) or the connected link (ff02:0:0:0:0:0:0:1). -\end_layout - -\begin_layout Itemize -All Routers Address: ID = 2h, addresses all routers on the local node (ff01:0:0: -0:0:0:0:2), on the connected link (ff02:0:0:0:0:0:0:2), or on the local - site (ff05:0:0:0:0:0:0:2) -\end_layout - -\begin_layout Subsubsection -Solicited node link-local multicast address -\end_layout - -\begin_layout Standard -Special multicast address used as destination address in neighborhood discovery, - because unlike in IPv4, ARP no longer exists in IPv6. -\end_layout - -\begin_layout Standard -An example of this address looks like -\end_layout - -\begin_layout Code -ff02::1:ff00:1234 -\end_layout - -\begin_layout Standard -Used prefix shows that this is a link-local multicast address. - The suffix is generated from the destination address. - In this example, a packet should be sent to address -\begin_inset Quotes eld -\end_inset - -fe80::1234 -\begin_inset Quotes erd -\end_inset - -, but the network stack doesn't know the current layer 2 MAC address. - It replaces the upper 104 bits with -\begin_inset Quotes eld -\end_inset - -ff02:0:0:0:0:1:ff00::/104 -\begin_inset Quotes erd -\end_inset - - and leaves the lower 24 bits untouched. - This address is now used `on-link' to find the corresponding node which - has to send a reply containing its layer 2 MAC address. -\end_layout - -\begin_layout Subsection -Anycast addresses -\end_layout - -\begin_layout Standard -Anycast addresses are special addresses and are used to cover things like - nearest DNS server, nearest DHCP server, or similar dynamic groups. - Addresses are taken out of the unicast address space (aggregatable global - or site-local at the moment). - The anycast mechanism (client view) will be handled by dynamic routing - protocols. -\end_layout - -\begin_layout Standard -Note: Anycast addresses cannot be used as source addresses, they are only - used as destination addresses. -\end_layout - -\begin_layout Subsubsection -Subnet-router anycast address -\end_layout - -\begin_layout Standard -A simple example for an anycast address is the subnet-router anycast address. - Assuming that a node has the following global assigned IPv6 address: -\end_layout - -\begin_layout Code -2001:db8:100:f101:210:a4ff:fee3:9566/64 <- Node's address -\end_layout - -\begin_layout Standard -The subnet-router anycast address will be created blanking the suffix (least - significant 64 bits) completely: -\end_layout - -\begin_layout Code -2001:db8:100:f101::/64 <- subnet-router anycast address -\end_layout - -\begin_layout Section -Address types (host part) -\end_layout - -\begin_layout Standard -\align left -For auto-configuration and mobility issues, it was decided to use the lower - 64 bits as the host part of the address in most of the current address - types. - Therefore each single subnet can hold a large amount of addresses. -\end_layout - -\begin_layout Standard -\align left -This host part can be inspected differently: -\end_layout - -\begin_layout Subsection -Automatically computed (also known as stateless) -\end_layout - -\begin_layout Standard -With auto-configuration, the host part of the address is computed by converting - the MAC address of an interface (if available), with the EUI-64 method, - to a unique IPv6 address. - If no MAC address is available for this device (happens e.g. - on virtual devices), something else (like the IPv4 address or the MAC address - of a physical interface) is used instead. -\end_layout - -\begin_layout Standard -E.g. - a NIC has following MAC address (48 bit): -\end_layout - -\begin_layout Code -00:10:a4:01:23:45 -\end_layout - -\begin_layout Standard -\align left -This would be expanded according to the -\begin_inset CommandInset href -LatexCommand href -name "IEEE-Tutorial EUI-64" -target "http://standards.ieee.org/regauth/oui/tutorials/EUI64.html" - -\end_inset - - design for EUI-48 identifiers to the 64 bit interface identifier: -\end_layout - -\begin_layout Code -0210:a4ff:fe01:2345 -\end_layout - -\begin_layout Standard -\align left -With a given prefix, the result is the IPv6 address shown in example above: -\end_layout - -\begin_layout Code -2001:0db8:0100:f101:0210:a4ff:fe01:2345 -\end_layout - -\begin_layout Subsubsection -Privacy problem with automatically computed addresses and a solution -\end_layout - -\begin_layout Standard -\align left -Because the "automatically computed" host part is globally unique (except - when a vendor of a NIC uses the same MAC address on more than one NIC), - client tracking is possible on the host when not using a proxy of any kind. -\end_layout - -\begin_layout Standard -\align left -This is a known problem, and a solution was defined: privacy extension, - defined in -\begin_inset CommandInset href -LatexCommand href -name "RFC 3041 / Privacy Extensions for Stateless Address Autoconfiguration in IPv6" -target "http://www.faqs.org/rfcs/rfc3041.html" - -\end_inset - - (there is also already a newer draft available: -\begin_inset CommandInset href -LatexCommand href -name "draft-ietf-ipv6-privacy-addrs-v2-*" -target "http://www.ietf.org/ids.by.wg/ipv6.html" - -\end_inset - -). - Using a random and a static value a new suffix is generated from time to - time. - Note: this is only reasonable for outgoing client connections and isn't - really useful for well-known servers. -\end_layout - -\begin_layout Subsection -Manually set -\end_layout - -\begin_layout Standard -For servers, it's probably easier to remember simpler addresses, this can - also be accommodated. - It is possible to assign an additional IPv6 address to an interface, e.g. - -\end_layout - -\begin_layout Code -2001:0db8:100:f101::1 -\end_layout - -\begin_layout Standard -For manual suffixes like -\begin_inset Quotes sld -\end_inset - -::1 -\begin_inset Quotes srd -\end_inset - - shown in the above example, it's required that the 7th most significant - bit is set to 0 (the universal/local bit of the automatically generated - identifier). - Also some other (otherwise unchosen ) bit combinations are reserved for - anycast addresses, too. -\end_layout - -\begin_layout Section -Prefix lengths for routing -\end_layout - -\begin_layout Standard -In the early design phase it was planned to use a fully hierarchical routing - approach to reduce the size of the routing tables maximally. - The reasons behind this approach were the number of current IPv4 routing - entries in core routers (> 400 thousand in 2013), reducing the need of - memory in hardware routers (ASIC -\begin_inset Quotes sld -\end_inset - -Application Specified Integrated Circuit -\begin_inset Quotes srd -\end_inset - - driven) to hold the routing table and increase speed (fewer entries hopefully - result in faster lookups). -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_layout Standard -\align left -Todays view is that routing will be mostly hierarchically designed for networks - with only one service provider. - With more than one ISP connections, this is not possible, and subject to - an issue named multi-homing (infos on multi-homing: -\begin_inset CommandInset href -LatexCommand href -name "drafts-ietf-multi6-*" -target "http://www.ietf.org/ids.by.wg/multi6.html" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Multihoming Solutions" -target "http://arneill-py.sacramento.ca.us/ipv6mh/" - -\end_inset - -). -\end_layout - -\begin_layout Subsection -Prefix lengths (also known as "netmasks") -\end_layout - -\begin_layout Standard -\align left -Similar to IPv4, the routable network path for routing to take place. - Because standard netmask notation for 128 bits doesn't look nice, designers - employed the IPv4 Classless Inter Domain Routing (CIDR, -\begin_inset CommandInset href -LatexCommand href -name "RFC 1519 / Classless Inter-Domain Routing" -target "http://www.faqs.org/rfcs/rfc1519.html" - -\end_inset - -) scheme, which specifies the number of bits of the IP address to be used - for routing. - It is also called the "slash" notation. -\end_layout - -\begin_layout Standard -\align left -An example: -\end_layout - -\begin_layout Code -2001:0db8:100:1:2:3:4:5/48 -\end_layout - -\begin_layout Standard -\align left -This notation will be expanded: -\end_layout - -\begin_layout Itemize -Network: -\end_layout - -\begin_layout Code -2001:0db8:0100:0000:0000:0000:0000:0000 -\end_layout - -\begin_layout Itemize -Netmask: -\end_layout - -\begin_layout Code -ffff:ffff:ffff:0000:0000:0000:0000:0000 -\end_layout - -\begin_layout Subsection -Matching a route -\end_layout - -\begin_layout Standard -Under normal circumstances (no QoS), a lookup in a routing table results - in the route with the most significant number of address bits being selected. - In other words, the route with the biggest prefix length matches first. -\end_layout - -\begin_layout Standard -For example if a routing table shows following entries (list is not complete): -\end_layout - -\begin_layout Code -2001:0db8:100::/48 :: U 1 0 0 sit1 -\end_layout - -\begin_layout Code -2000::/3 ::192.88.99.1 UG 1 0 0 tun6to4 -\end_layout - -\begin_layout Standard -Shown destination addresses of IPv6 packets will be routed through shown - device -\end_layout - -\begin_layout Code -2001:0db8:100:1:2:3:4:5/48 -> routed through device sit1 -\end_layout - -\begin_layout Code -2001:0db8:200:1:2:3:4:5/48 -> routed through device tun6to4 -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-systemcheck" - -\end_inset - -IPv6-ready system check -\end_layout - -\begin_layout Standard -\align left -Before you can start using IPv6 on a Linux host, you have to test, whether - your system is IPv6-ready. - You may have to do some work to enable it first. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "systemcheck-kernel" - -\end_inset - -IPv6-ready kernel -\end_layout - -\begin_layout Standard -\align left -Modern Linux distributions already contain IPv6-ready kernels, the IPv6 - capability is generally compiled as a module, but it's possible that this - module is not loaded automatically on startup. -\end_layout - -\begin_layout Standard - -\series bold -Note: you shouldn't anymore use kernel series 2.2.x, because it's not IPv6-up-to-d -ate anymore. - Also the IPv6 support in series 2.4.x is no longer improved according to - definitions in latest RFCs. - It's recommend to use series 2.6.x now. -\end_layout - -\begin_layout Subsection -Check for IPv6 support in the current running kernel -\end_layout - -\begin_layout Standard -\align left -To check, whether your current running kernel supports IPv6, take a look - into your -\family typewriter -/proc -\family default --file-system. - Following entry must exists: -\end_layout - -\begin_layout Code -/proc/net/if_inet6 -\end_layout - -\begin_layout Standard -\align left -A short automatical test looks like: -\end_layout - -\begin_layout Code -# test -f /proc/net/if_inet6 && echo "Running kernel is IPv6 ready" -\end_layout - -\begin_layout Standard -\align left -If this fails, it is quite likely, that the IPv6 module is not loaded. -\end_layout - -\begin_layout Subsection -Try to load IPv6 module -\end_layout - -\begin_layout Standard -\align left -You can try to load the IPv6 module executing -\end_layout - -\begin_layout Code -# modprobe ipv6 -\end_layout - -\begin_layout Standard -\align left -If this is successful, this module should be listed, testable with following - auto-magically line: -\end_layout - -\begin_layout Code -# lsmod |grep -w 'ipv6' && echo "IPv6 module successfully loaded" -\end_layout - -\begin_layout Standard -\align left -And the check shown above should now run successfully. -\end_layout - -\begin_layout Standard -Note: unloading the module is currently not supported and can result, under - some circumstances, in a kernel crash. -\end_layout - -\begin_layout Subsubsection -Automatically loading of module -\end_layout - -\begin_layout Standard -Its possible to automatically load the IPv6 module on demand. - You only have to add following line in the configuration file of the kernel - module loader (normally /etc/modules.conf or /etc/conf.modules): -\end_layout - -\begin_layout Code -alias net-pf-10 ipv6 # automatically load IPv6 module on demand -\end_layout - -\begin_layout Standard -It's also possible to disable automatically loading of the IPv6 module using - following line -\end_layout - -\begin_layout Code -alias net-pf-10 off # disable automatically load of IPv6 module on demand -\end_layout - -\begin_layout Standard -Additional note: in kernels series 2.6.x, the module loader mechanism was - changed. - The new configuration file has to be named /etc/modprobe.conf instead of - /etc/modules.conf. -\end_layout - -\begin_layout Subsection -Compile kernel with IPv6 capabilities -\end_layout - -\begin_layout Standard -\align left -If both above shown results were negative and your kernel has no IP6 support, - than you have the following options: -\end_layout - -\begin_layout Itemize -\align left -Update your distribution to a current one which supports IPv6 out-of-the-box - (recommended for newbies) -\end_layout - -\begin_layout Itemize -\align left -Compile a new vanilla kernel (easy, if you know which options you needed) -\end_layout - -\begin_layout Itemize -Recompile kernel sources given by your Linux distribution (sometimes not - so easy) -\end_layout - -\begin_layout Itemize -\align left -Compile a kernel with USAGI extensions -\end_layout - -\begin_layout Standard -\align left -If you decide to compile a kernel, you should have previous experience in - kernel compiling and read the -\begin_inset CommandInset href -LatexCommand href -name "Linux Kernel HOWTO" -target "http://www.tldp.org/HOWTO/Kernel-HOWTO.html" - -\end_inset - -. -\end_layout - -\begin_layout Standard -A comparison between vanilla and USAGI extended kernels is available on - -\begin_inset CommandInset href -LatexCommand href -name "IPv6+Linux-Status-Kernel" -target "http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status-kernel.html" - -\end_inset - -. -\end_layout - -\begin_layout Subsubsection -Compiling a vanilla kernel -\end_layout - -\begin_layout Standard -More detailed hints about compiling an IPv6-enabled kernel can be found - e.g. - on -\begin_inset CommandInset href -LatexCommand href -name "IPv6-HOWTO-2#kernel" -target "http://www.bieringer.de/linux/IPv6/IPv6-HOWTO/IPv6-HOWTO-2.html#kernel" - -\end_inset - -. -\end_layout - -\begin_layout Standard -Note: you should use whenever possible kernel series 2.6.x or above, because - the IPv6 support in series 2.4.x only will no longer get backported features - from 2.6.x and IPv6 support in series 2.2.x is hopeless outdated. -\end_layout - -\begin_layout Subsubsection -Compiling a kernel with USAGI extensions -\end_layout - -\begin_layout Standard -\align left -Same as for vanilla kernel, only recommend for advanced users, which are - already familiar with IPv6 and kernel compilation. - See also -\begin_inset CommandInset href -LatexCommand href -name "USAGI project / FAQ" -target "http://www.linux-ipv6.org/faq.html" - -\end_inset - - and -\begin_inset CommandInset href -LatexCommand href -name "Obtaining the best IPv6 support with Linux (Article)" -target "http://www.deepspace6.net/docs/best_ipv6_support.html" - -\end_inset - - ( -\begin_inset CommandInset href -LatexCommand href -name "Mirror" -target "http://mirrors.bieringer.de/www.deepspace6.net/docs/best_ipv6_support.html" - -\end_inset - -). -\end_layout - -\begin_layout Subsection -IPv6-ready network devices -\end_layout - -\begin_layout Standard -Not all existing network devices have already (or ever) the capability to - transport IPv6 packets. - A current status can be found at -\begin_inset CommandInset href -LatexCommand href -name "IPv6+Linux-status-kernel.html#transport" -target "http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status-kernel.html#transport" - -\end_inset - -. -\end_layout - -\begin_layout Standard -A major issue is that because of the network layer structure of kernel implement -ation an IPv6 packet isn't really recognized by it's IP header number (6 - instead of 4). - It's recognized by the protocol number of the Layer 2 transport protocol. - Therefore any transport protocol which doesn't use such protocol number - cannot dispatch IPv6 packets. - Note: the packet is still transported over the link, but on receivers side, - the dispatching won't work (you can see this e.g. - using tcpdump). -\end_layout - -\begin_layout Subsubsection -Currently known never -\begin_inset Quotes sld -\end_inset - -IPv6 capable links -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Itemize -Serial Line IP (SLIP, -\begin_inset CommandInset href -LatexCommand href -name "RFC 1055 / SLIP" -target "http://www.faqs.org/rfcs/rfc1055.html" - -\end_inset - -), should be better called now to SLIPv4, device named: slX -\end_layout - -\begin_layout Itemize -Parallel Line IP (PLIP), same like SLIP, device names: plipX -\end_layout - -\begin_layout Itemize -ISDN with encapsulation -\emph on -rawip -\emph default -, device names: isdnX -\end_layout - -\begin_layout Subsubsection -Currently known -\begin_inset Quotes sld -\end_inset - -not supported IPv6 capable links -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Itemize -ISDN with encapsulation -\emph on -syncppp -\emph default -, device names: ipppX (design issue of the ipppd, will be merged into more - general PPP layer in kernel series 2.5.x) -\end_layout - -\begin_layout Section -IPv6-ready network configuration tools -\end_layout - -\begin_layout Standard -\align left -You wont get very far, if you are running an IPv6-ready kernel, but have - no tools to configure IPv6. - There are several packages in existence which can configure IPv6. -\end_layout - -\begin_layout Subsection -net-tools package -\end_layout - -\begin_layout Standard -\align left -The net-tool package includes some tools like -\family typewriter -ifconfig -\family default - and -\family typewriter -route -\family default -, which helps you to configure IPv6 on an interface. - Look at the output of -\family typewriter -ifconfig -? -\family default - or -\family typewriter -route -? -\family default -, if something is shown like IPv6 or inet6, then the tool is IPv6-ready. -\end_layout - -\begin_layout Standard -\align left -Auto-magically check: -\end_layout - -\begin_layout Code -# /sbin/ifconfig -? 2>& 1|grep -qw 'inet6' && echo "utility 'ifconfig' is -\end_layout - -\begin_layout Code -¬ IPv6-ready" -\end_layout - -\begin_layout Standard -\align left -Same check can be done for -\family typewriter -route -\family default -: -\end_layout - -\begin_layout Code -# /sbin/route -? 2>& 1|grep -qw 'inet6' && echo "utility 'route' is IPv6-ready" -\end_layout - -\begin_layout Subsection -iproute package -\end_layout - -\begin_layout Standard -\align left -Alexey N. - Kuznetsov (current a maintainer of the Linux networking code) created a - tool-set which configures networks through the netlink device. - Using this tool-set you have more functionality than net-tools provides, - but its not very well documented and isn't for the faint of heart. - -\end_layout - -\begin_layout Code -# /sbin/ip 2>&1 |grep -qw 'inet6' && echo "utility 'ip' is IPv6-ready" -\end_layout - -\begin_layout Standard -If the program /sbin/ip isn't found, then I strongly recommend you install - the iproute package. - -\end_layout - -\begin_layout Itemize -You can get it from your Linux distribution (if contained) -\end_layout - -\begin_layout Itemize -You're able to look for a proper RPM package at -\begin_inset CommandInset href -LatexCommand href -name "RPMfind/iproute" -target "http://rpmfind.net/linux/rpm2html/search.php?query=iproute" - -\end_inset - - (sometimes rebuilding of a SRPMS package is recommended) -\end_layout - -\begin_layout Section -IPv6-ready test/debug programs -\end_layout - -\begin_layout Standard -\align left -After you have prepared your system for IPv6, you now want to use IPv6 for - network communications. - First you should learn how to examine IPv6 packets with a sniffer program. - This is strongly recommended because for debugging/troubleshooting issues - this can aide in providing a diagnosis very quickly. -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "program-ping6" - -\end_inset - -IPv6 ping -\end_layout - -\begin_layout Standard -This program is normally included in package -\emph on -iputils -\emph default -. - It is designed for simple transport tests sending ICMPv6 echo-request packets - and wait for ICMPv6 echo-reply packets. -\end_layout - -\begin_layout Standard -Usage -\end_layout - -\begin_layout Code -# ping6 -\end_layout - -\begin_layout Code -# ping6 -\end_layout - -\begin_layout Code -# ping6 [-I ] -\end_layout - -\begin_layout Standard -Some implementation also support % suffix instead of using -I , - e.g. -\end_layout - -\begin_layout Code -# ping6 % -\end_layout - -\begin_layout Standard -Example -\end_layout - -\begin_layout Code -# ping6 -c 1 ::1 -\end_layout - -\begin_layout Code -PING ::1(::1) from ::1 : 56 data bytes -\end_layout - -\begin_layout Code -64 bytes from ::1: icmp_seq=0 hops=64 time=292 usec -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code ---- ::1 ping statistics --- -\end_layout - -\begin_layout Code -1 packets transmitted, 1 packets received, 0% packet loss -\end_layout - -\begin_layout Code -round-trip min/avg/max/mdev = 0.292/0.292/0.292/0.000 ms -\end_layout - -\begin_layout Standard -Hint: ping6 needs raw access to socket and therefore root permissions. - So if non-root users cannot use ping6 then there are two possible problems: -\end_layout - -\begin_layout Enumerate -ping6 is not in users path (probably, because ping6 is generally stored - in /usr/sbin -> add path (not really recommended) -\end_layout - -\begin_layout Enumerate -ping6 doesn't execute properly, generally because of missing root permissions - -> chmod u+s /usr/sbin/ping6 -\end_layout - -\begin_layout Subsubsection -Specifying interface for IPv6 ping -\end_layout - -\begin_layout Standard -Using link-local addresses for an IPv6 ping, the kernel does not know through - which (physically or virtual) device it must send the packet - each device - has a link-local address. - A try will result in following error message: -\end_layout - -\begin_layout Code -# ping6 fe80::212:34ff:fe12:3456 -\end_layout - -\begin_layout Code -connect: Invalid argument -\end_layout - -\begin_layout Standard -In this case you have to specify the interface additionally like shown here: -\end_layout - -\begin_layout Code -# ping6 -I eth0 -c 1 fe80::2e0:18ff:fe90:9205 -\end_layout - -\begin_layout Code -PING fe80::212:23ff:fe12:3456(fe80::212:23ff:fe12:3456) from -\end_layout - -\begin_layout Code -¬ fe80::212:34ff:fe12:3478 eth0: 56 data bytes -\end_layout - -\begin_layout Code -64 bytes from fe80::212:23ff:fe12:3456: icmp_seq=0 hops=64 time=445 usec -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code ---- fe80::2e0:18ff:fe90:9205 ping statistics --- -\end_layout - -\begin_layout Code -1 packets transmitted, 1 packets received, 0% packet loss round-trip -\end_layout - -\begin_layout Code -¬ min/avg/max/mdev = 0.445/0.445/0.445/0.000 ms -\end_layout - -\begin_layout Standard -Example for % notation: -\end_layout - -\begin_layout Code -# ping6 -c 1 fe80::2e0:18ff:fe90:9205%eth0 -\end_layout - -\begin_layout Subsubsection -Ping6 to multicast addresses -\end_layout - -\begin_layout Standard -An interesting mechanism to detect IPv6-active hosts on a link is to ping6 - to the link-local all-node multicast address: -\end_layout - -\begin_layout Code -# ping6 -I eth0 ff02::1 -\end_layout - -\begin_layout Code -PING ff02::1(ff02::1) from fe80:::2ab:cdff:feef:0123 eth0: 56 data bytes -\end_layout - -\begin_layout Code -64 bytes from ::1: icmp_seq=1 ttl=64 time=0.104 ms -\end_layout - -\begin_layout Code -64 bytes from fe80::212:34ff:fe12:3450: icmp_seq=1 ttl=64 time=0.549 ms (DUP!) - -\end_layout - -\begin_layout Standard -Example for % notation: -\end_layout - -\begin_layout Code -# ping6 ff02::1%eth0 -\end_layout - -\begin_layout Standard -Unlike in IPv4, where replies to a ping on the broadcast address can be - disabled, in IPv6 currently this behavior cannot be disable except by local - IPv6 firewalling. -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "program-traceroute6" - -\end_inset - -IPv6 traceroute6 -\end_layout - -\begin_layout Standard -This program is normally included in package -\emph on -iputils -\emph default -. - It's a program similar to IPv4 traceroute. - Below you will see an example: -\end_layout - -\begin_layout Code -# traceroute6 www.6bone.net -\end_layout - -\begin_layout Code -traceroute to 6bone.net (3ffe:b00:c18:1::10) from 2001:0db8:0000:f101::2, - 30 -\end_layout - -\begin_layout Code -¬ hops max, 16 byte packets -\end_layout - -\begin_layout Code - 1 localipv6gateway (2001:0db8:0000:f101::1) 1.354 ms 1.566 ms 0.407 ms -\end_layout - -\begin_layout Code - 2 swi6T1-T0.ipv6.switch.ch (3ffe:2000:0:400::1) 90.431 ms 91.956 ms 92.377 ms - -\end_layout - -\begin_layout Code - 3 3ffe:2000:0:1::132 (3ffe:2000:0:1::132) 118.945 ms 107.982 ms 114.557 ms - -\end_layout - -\begin_layout Code - 4 3ffe:c00:8023:2b::2 (3ffe:c00:8023:2b::2) 968.468 ms 993.392 ms 973.441 - ms -\end_layout - -\begin_layout Code - 5 3ffe:2e00:e:c::3 (3ffe:2e00:e:c::3) 507.784 ms 505.549 ms 508.928 ms -\end_layout - -\begin_layout Code - 6 www.6bone.net (3ffe:b00:c18:1::10) 1265.85 ms * 1304.74 ms -\end_layout - -\begin_layout Standard -Note: unlike some modern versions of IPv4 traceroute, which can use ICMPv4 - echo-request packets as well as UDP packets (default), current IPv6-traceroute - is only able to send UDP packets. - As you perhaps already know, ICMP echo-request packets are more accepted - by firewalls or ACLs on routers inbetween than UDP packets. - -\end_layout - -\begin_layout Standard - -\lang ngerman -If a dedicated interface must be specified, this can be done by -i - or using
    %. -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "program-tracepath6" - -\end_inset - -IPv6 tracepath6 -\end_layout - -\begin_layout Standard -This program is normally included in package -\emph on -iputils -\emph default -. - It's a program like traceroute6 and traces the path to a given destination - discovering the MTU along this path. - Below you will see an example: -\end_layout - -\begin_layout Code -# tracepath6 www.6bone.net -\end_layout - -\begin_layout Code - 1?: [LOCALHOST] pmtu 1480 -\end_layout - -\begin_layout Code - 1: 3ffe:401::2c0:33ff:fe02:14 150.705ms -\end_layout - -\begin_layout Code - 2: 3ffe:b00:c18::5 267.864ms -\end_layout - -\begin_layout Code - 3: 3ffe:b00:c18::5 asymm 2 266.145ms pmtu 1280 -\end_layout - -\begin_layout Code - 3: 3ffe:3900:5::2 asymm 4 346.632ms -\end_layout - -\begin_layout Code - 4: 3ffe:28ff:ffff:4::3 asymm 5 365.965ms -\end_layout - -\begin_layout Code - 5: 3ffe:1cff:0:ee::2 asymm 4 534.704ms -\end_layout - -\begin_layout Code - 6: 3ffe:3800::1:1 asymm 4 578.126ms !N -\end_layout - -\begin_layout Code -Resume: pmtu 1280 -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "program-tcpdump" - -\end_inset - -IPv6 tcpdump -\end_layout - -\begin_layout Standard -On Linux, tcpdump is the major tool for packet capturing. - Below you find some examples. - IPv6 support is normally built-in in current releases of version 3.6. -\end_layout - -\begin_layout Standard -tcpdump uses expressions for filtering packets to minimize the noise: -\end_layout - -\begin_layout Itemize -icmp6: filters native ICMPv6 traffic -\end_layout - -\begin_layout Itemize -ip6: filters native IPv6 traffic (including ICMPv6) -\end_layout - -\begin_layout Itemize -proto ipv6: filters tunneled IPv6-in-IPv4 traffic -\end_layout - -\begin_layout Itemize -not port ssh: to suppress displaying SSH packets for running tcpdump in - a remote SSH session -\end_layout - -\begin_layout Standard -Also some command line options are very useful to catch and print more informati -on in a packet, mostly interesting for digging into ICMPv6 packets: -\end_layout - -\begin_layout Itemize -\begin_inset Quotes eld -\end_inset - --s 512 -\begin_inset Quotes erd -\end_inset - -: increase the snap length during capturing of a packet to 512 bytes -\end_layout - -\begin_layout Itemize -\begin_inset Quotes eld -\end_inset - --vv -\begin_inset Quotes erd -\end_inset - -: really verbose output -\end_layout - -\begin_layout Itemize -\begin_inset Quotes eld -\end_inset - --n -\begin_inset Quotes erd -\end_inset - -: don't resolve addresses to names, useful if reverse DNS resolving isn't - working proper -\end_layout - -\begin_layout Subsubsection -IPv6 ping to -\size footnotesize - 2001:0db8:100:f101::1 -\size default - native over a local link -\end_layout - -\begin_layout Code -# tcpdump -t -n -i eth0 -s 512 -vv ip6 or proto ipv6 -\end_layout - -\begin_layout Code -tcpdump: listening on eth0 -\end_layout - -\begin_layout Code -2001:0db8:100:f101:2e0:18ff:fe90:9205 > 2001:0db8:100:f101::1: icmp6: echo -\end_layout - -\begin_layout Code -¬ request (len 64, hlim 64) -\end_layout - -\begin_layout Code -2001:0db8:100:f101::1 > 2001:0db8:100:f101:2e0:18ff:fe90:9205: icmp6: echo -\end_layout - -\begin_layout Code -¬ reply (len 64, hlim 64) -\end_layout - -\begin_layout Subsubsection -IPv6 ping to -\size footnotesize -2001:0db8:100::1 -\size default - routed through an IPv6-in-IPv4-tunnel -\end_layout - -\begin_layout Standard -1.2.3.4 and 5.6.7.8 are tunnel endpoints (all addresses are examples) -\end_layout - -\begin_layout Code -# tcpdump -t -n -i ppp0 -s 512 -vv ip6 or proto ipv6 -\end_layout - -\begin_layout Code -tcpdump: listening on ppp0 -\end_layout - -\begin_layout Code -1.2.3.4 > 5.6.7.8: 2002:ffff:f5f8::1 > 2001:0db8:100::1: icmp6: echo request -\end_layout - -\begin_layout Code -¬ (len 64, hlim 64) (DF) (ttl 64, id 0, len 124) -\end_layout - -\begin_layout Code -5.6.7.8 > 1.2.3.4: 2001:0db8:100::1 > 2002:ffff:f5f8::1: icmp6: echo reply (len -\end_layout - -\begin_layout Code -¬ 64, hlim 61) (ttl 23, id 29887, len 124) -\end_layout - -\begin_layout Code -1.2.3.4 > 5.6.7.8: 2002:ffff:f5f8::1 > 2001:0db8:100::1: icmp6: echo request -\end_layout - -\begin_layout Code -¬ (len 64, hlim 64) (DF) (ttl 64, id 0, len 124) -\end_layout - -\begin_layout Code -5.6.7.8 > 1.2.3.4: 2001:0db8:100::1 > 2002:ffff:f5f8::1: icmp6: echo reply (len -\end_layout - -\begin_layout Code -¬ 64, hlim 61) (ttl 23, id 29919, len 124) -\end_layout - -\begin_layout Section -IPv6-ready programs -\end_layout - -\begin_layout Standard -Current distributions already contain the most needed IPv6 enabled client - and servers. - See first on -\begin_inset CommandInset href -LatexCommand href -name "IPv6+Linux-Status-Distribution" -target "http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status-distributions.html" - -\end_inset - -. - If still not included, you can check -\lang ngerman - -\begin_inset CommandInset href -LatexCommand href -name "Current Status of IPv6 Support for Networking Applications" -target "http://www.deepspace6.net/docs/ipv6_status_page_apps.html" - -\end_inset - - -\lang english - whether the program is already ported to IPv6 and usable with Linux. - For common used programs there are some hints available here later in this - document. -\end_layout - -\begin_layout Section -IPv6-ready client programs (selection) -\end_layout - -\begin_layout Standard -To run the following shown tests, it's required that your system is IPv6 - enabled, and some examples show addresses which only can be reached if - a connection to the global IPv6 network is available. -\end_layout - -\begin_layout Standard -Note: if using names instead of dedicated IPv4/IPv6 addresses which resolves - to IPv4 and IPv6 addresses, some command line clients support explicitly - use of specified protocol. - Usually such clients have option -\begin_inset Quotes sld -\end_inset - --4 -\begin_inset Quotes srd -\end_inset - - for IPv4 and -\begin_inset Quotes sld -\end_inset - --6 -\begin_inset Quotes srd -\end_inset - - for IPv6. -\end_layout - -\begin_layout Subsection -Checking DNS for resolving IPv6 addresses -\end_layout - -\begin_layout Standard -Because of security updates in the last years every Domain Name System (DNS) - server should run newer software which already understands the (intermediate) - IPv6 address-type AAAA (the newer one named A6 isn't still common at the - moment because only supported using BIND9 and newer and also the non-existent - support of root domain IP6.ARPA). - A simple test whether the used system can resolve IPv6 addresses is -\end_layout - -\begin_layout Code -# host -t AAAA www.join.uni-muenster.de -\end_layout - -\begin_layout Standard -and should show something like following: -\end_layout - -\begin_layout Code -www.join.uni-muenster.de. - is an alias for tolot.join.uni-muenster.de. - -\end_layout - -\begin_layout Code -tolot.join.uni-muenster.de. - has AAAA address -\end_layout - -\begin_layout Code -¬ 2001:638:500:101:2e0:81ff:fe24:37c6 -\end_layout - -\begin_layout Subsection -IPv6-ready telnet clients -\end_layout - -\begin_layout Standard -IPv6-ready telnet clients are available. - A simple test can be done with -\end_layout - -\begin_layout Code -$ telnet 3ffe:400:100::1 80 -\end_layout - -\begin_layout Code -Trying 3ffe:400:100::1... - -\end_layout - -\begin_layout Code -Connected to 3ffe:400:100::1. - -\end_layout - -\begin_layout Code -Escape character is '^]'. - -\end_layout - -\begin_layout Code -HEAD / HTTP/1.0 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code -HTTP/1.1 200 OK -\end_layout - -\begin_layout Code -Date: Sun, 16 Dec 2001 16:07:21 -\end_layout - -\begin_layout Code -GMT Server: Apache/2.0.28 (Unix) -\end_layout - -\begin_layout Code -Last-Modified: Wed, 01 Aug 2001 21:34:42 GMT -\end_layout - -\begin_layout Code -ETag: "3f02-a4d-b1b3e080" -\end_layout - -\begin_layout Code -Accept-Ranges: bytes -\end_layout - -\begin_layout Code -Content-Length: 2637 -\end_layout - -\begin_layout Code -Connection: close -\end_layout - -\begin_layout Code -Content-Type: text/html; charset=ISO-8859-1 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code -Connection closed by foreign host. -\end_layout - -\begin_layout Standard -If the telnet client don't understand the IPv6 address and says something - like -\begin_inset Quotes sld -\end_inset - -cannot resolve hostname -\begin_inset Quotes srd -\end_inset - -, then it's not IPv6-enabled. -\end_layout - -\begin_layout Subsection -IPv6-ready ssh clients -\end_layout - -\begin_layout Subsubsection -openssh -\end_layout - -\begin_layout Standard -Current versions of openssh are IPv6-ready. - Depending on configuring before compiling it has two behavior. -\end_layout - -\begin_layout Itemize ---without-ipv4-default: the client tries an IPv6 connect first automatically - and fall back to IPv4 if not working -\end_layout - -\begin_layout Itemize ---with-ipv4-default: default connection is IPv4, IPv6 connection must be - force like following example shows -\end_layout - -\begin_layout Code -$ ssh -6 ::1 -\end_layout - -\begin_layout Code -user@::1's password: ****** -\end_layout - -\begin_layout Code -[user@ipv6host user]$ -\end_layout - -\begin_layout Standard -If your ssh client doesn't understand the option -\begin_inset Quotes sld -\end_inset - --6 -\begin_inset Quotes srd -\end_inset - - then it's not IPv6-enabled, like most ssh version 1 packages. -\end_layout - -\begin_layout Subsubsection -ssh.com -\end_layout - -\begin_layout Standard -SSH.com's SSH client and server is also IPv6 aware now and is free for all - Linux and FreeBSD machine regardless if used for personal or commercial - use. -\end_layout - -\begin_layout Subsection -IPv6-ready web browsers -\end_layout - -\begin_layout Standard -A current status of IPv6 enabled web browsers is available at -\begin_inset CommandInset href -LatexCommand href -name "Current Status of IPv6 Support for Networking Applications - HTTP" -target "http://www.deepspace6.net/docs/ipv6_status_page_apps.html#http" - -\end_inset - -. -\end_layout - -\begin_layout Standard -Most of them have unresolved problems at the moment -\end_layout - -\begin_layout Enumerate -If using an IPv4 only proxy in the settings, IPv6 requests will be sent - to the proxy, but the proxy will fail to understand the request and the - request fails. - Solution: update proxy software (see later). -\end_layout - -\begin_layout Enumerate -Automatic proxy settings (*.pac) cannot be extended to handle IPv6 requests - differently (e.g. - don't use proxy) because of their nature (written in Java-script and well - hard coded in source like to be seen in Mozilla source code). -\end_layout - -\begin_layout Standard -Also older versions don't understand an URL with IPv6 encoded addresses - like -\begin_inset CommandInset href -LatexCommand href -name "http://[2001:4dd0:f838:a006::6]/" -target "http://[2001:4dd0:f838:a006::6]/" - -\end_inset - -, IPv6 address of -\begin_inset CommandInset href -LatexCommand href -name "http://www.ipv6.bieringer.de/" -target "http://www.ipv6.bieringer.de/" - -\end_inset - - (this given URLs only works with an IPv6-enabled browser!). -\end_layout - -\begin_layout Standard -A short test is to try shown URL with a given browser and using no proxy. -\end_layout - -\begin_layout Subsubsection -URLs for testing -\end_layout - -\begin_layout Standard -A good starting point for browsing using IPv6 is -\begin_inset CommandInset href -LatexCommand href -name "http://www.kame.net/" -target "http://www.kame.net/" - -\end_inset - -. - If the turtle on this page is animated, the connection is via IPv6, otherwise - the turtle is static. -\end_layout - -\begin_layout Standard - -\lang ngerman -Other test servers are e.g. -\end_layout - -\begin_layout Itemize - -\lang ngerman -\begin_inset CommandInset href -LatexCommand href -name "What Is My IPv6" -target "http://www.whatismyipv6.com/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang ngerman -\begin_inset CommandInset href -LatexCommand href -name "ip.bieringer.de" -target "http://ip.bieringer.de/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang ngerman -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Test" -target "http://ipv6-test.com/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang ngerman -\begin_inset CommandInset href -LatexCommand href -name "test-ipv6.com" -target "http://test-ipv6.com/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang ngerman -\begin_inset CommandInset href -LatexCommand href -name "The ICSI Netalyzr" -target "http://netalyzr.icsi.berkeley.edu/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang ngerman -\begin_inset CommandInset href -LatexCommand href -name "Speedtest Comcast" -target "http://speedtest.comcast.net/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Speedtest Comcast" -target "http://ipv6.speedtest.comcast.net/" - -\end_inset - - -\end_layout - -\begin_layout Section -IPv6-ready server programs -\end_layout - -\begin_layout Standard -In this part of this HOWTO, more client specific issues are mentioned. - Therefore hints for IPv6-ready servers like sshd, httpd, telnetd, etc. - are shown below in -\begin_inset CommandInset ref -LatexCommand ref -name "Hints for IPv6-enabled daemons" -reference "chapter-hints-daemons" - -\end_inset - -. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "faq-ipv6-ready-system-check" - -\end_inset - -FAQ (IPv6-ready system check) -\end_layout - -\begin_layout Subsection -Using tools -\end_layout - -\begin_layout Subsubsection -Q: Cannot ping6 to link-local addresses -\end_layout - -\begin_layout Standard -Error message: " -\emph on -connect: Invalid argument -\emph default -" -\end_layout - -\begin_layout Standard -Kernel doesn't know, which physical or virtual link you want to use to send - such ICMPv6 packets. - Therefore it displays this error message. -\end_layout - -\begin_layout Standard -Solution: Specify interface like: -\begin_inset Quotes sld -\end_inset - -ping6 -\series bold --I eth0 -\series default - fe80::2e0:18ff:fe90:9205 -\begin_inset Quotes srd -\end_inset - -, see also -\begin_inset CommandInset ref -LatexCommand ref -name "program ping6 usage" -reference "program-ping6" - -\end_inset - -. -\end_layout - -\begin_layout Subsubsection -Q: Cannot ping6 or traceroute6 as normal user -\end_layout - -\begin_layout Standard -Error message: -\begin_inset Quotes sld -\end_inset - - -\emph on -icmp socket: Operation not permitted -\emph default - -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -These utilities create special ICMPv6 packets and send them out. - This is done by using raw sockets in the kernel. - But raw sockets can only be used by the -\begin_inset Quotes sld -\end_inset - -root -\begin_inset Quotes srd -\end_inset - - user. - Therefore normal users get such error message. -\end_layout - -\begin_layout Standard -Solution: If it's really needed that all users should be able to use these - utilities, you can add the -\begin_inset Quotes sld -\end_inset - -suid -\begin_inset Quotes srd -\end_inset - - bit using -\begin_inset Quotes srd -\end_inset - -chmod u+s /path/to/program -\begin_inset Quotes srd -\end_inset - -, see also -\begin_inset CommandInset ref -LatexCommand ref -name "program ping6 usage" -reference "program-ping6" - -\end_inset - -. - If not all users should be able to, you can change the group of the program - to e.g. - -\begin_inset Quotes sld -\end_inset - -wheel -\begin_inset Quotes srd -\end_inset - -, add these power users to this group and remove the execution bit for other - users using -\begin_inset Quotes sld -\end_inset - -chmod o-rwx /path/to/program -\begin_inset Quotes srd -\end_inset - -. - Or configure -\begin_inset Quotes sld -\end_inset - -sudo -\begin_inset Quotes srd -\end_inset - - to enable your security policy. - -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-configuration-interface" - -\end_inset - -Configuring interfaces -\end_layout - -\begin_layout Section -Different network devices -\end_layout - -\begin_layout Standard -On a node, there exist different network devices. - They can be collected in classes -\end_layout - -\begin_layout Itemize -Physically bounded, like eth0, tr0 -\end_layout - -\begin_layout Itemize -Virtually existing, like ppp0, tun0, tap0, sit0, isdn0, ippp0 -\end_layout - -\begin_layout Subsection -Physically bounded -\end_layout - -\begin_layout Standard -Physically bounded interfaces like Ethernet or Token-Ring are normal ones - and need no special treatment. -\end_layout - -\begin_layout Subsection -Virtually bounded -\end_layout - -\begin_layout Standard -Virtually bounded interfaces always need special support -\end_layout - -\begin_layout Subsubsection -IPv6-in-IPv4 tunnel interfaces -\end_layout - -\begin_layout Standard -These interfaces are normally named -\series bold -sit -\emph on -x -\series default -\emph default -. - The name -\emph on -sit -\emph default - is a shortcut for -\series bold -S -\series default -imple -\series bold -I -\series default -nternet -\series bold -T -\series default -ransition. - This device has the capability to encapsulate IPv6 packets into IPv4 ones - and tunnel them to a foreign endpoint. -\end_layout - -\begin_layout Standard - -\series bold -sit0 -\series default - has a special meaning and cannot be used for dedicated tunnels. -\end_layout - -\begin_layout Subsubsection -PPP interfaces -\end_layout - -\begin_layout Standard -PPP interfaces get their IPv6 capability from an IPv6 enabled PPP daemon. -\end_layout - -\begin_layout Subsubsection -ISDN HDLC interfaces -\end_layout - -\begin_layout Standard -IPv6 capability for HDLC with encapsulation -\series bold -ip -\series default - is already built-in in the kernel -\end_layout - -\begin_layout Subsubsection -ISDN PPP interfaces -\end_layout - -\begin_layout Standard -ISDN PPP interfaces (ippp) aren't IPv6 enabled by kernel. - Also there are also no plans to do that because in kernel 2.5.+ they will - be replaced by a more generic ppp interface layer. -\end_layout - -\begin_layout Subsubsection -SLIP + PLIP -\end_layout - -\begin_layout Standard -Like mentioned earlier, this interfaces don't support IPv6 transport (sending - is OK, but dispatching on receiving don't work). -\end_layout - -\begin_layout Subsubsection -Ether-tap device -\end_layout - -\begin_layout Standard -Ether-tap devices are IPv6-enabled and also stateless configured. - For use, the module -\begin_inset Quotes sld -\end_inset - -ethertap -\begin_inset Quotes srd -\end_inset - - has to be loaded before. -\end_layout - -\begin_layout Subsubsection -tun devices -\end_layout - -\begin_layout Standard -Currently not tested by me. -\end_layout - -\begin_layout Subsubsection -ATM -\end_layout - -\begin_layout Standard -01/2002: Aren't currently supported by vanilla kernel, supported by USAGI - extension -\end_layout - -\begin_layout Subsubsection -Others -\end_layout - -\begin_layout Standard -Did I forget an interface?... -\end_layout - -\begin_layout Section -Bringing interfaces up/down -\end_layout - -\begin_layout Standard -Two methods can be used to bring interfaces up or down. -\end_layout - -\begin_layout Subsection -Using "ip" -\end_layout - -\begin_layout Standard -Usage: -\end_layout - -\begin_layout Code -# ip link set dev up -\end_layout - -\begin_layout Code -# ip link set dev down -\end_layout - -\begin_layout Standard -Example: -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code -# ip link set dev eth0 up -\end_layout - -\begin_layout Code -# ip link set dev eth0 down -\end_layout - -\begin_layout Subsection -Using "ifconfig" -\end_layout - -\begin_layout Standard -\align left -Usage: -\end_layout - -\begin_layout Code -# /sbin/ifconfig up -\end_layout - -\begin_layout Code -# /sbin/ifconfig down -\end_layout - -\begin_layout Standard -Example: -\end_layout - -\begin_layout Code -# /sbin/ifconfig eth0 up -\end_layout - -\begin_layout Code -# /sbin/ifconfig eth0 down -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-configuration-address" - -\end_inset - -Configuring IPv6 addresses -\end_layout - -\begin_layout Standard -\align left -There are different ways to configure an IPv6 address on an interface. - You can use use "ifconfig" or "ip". -\end_layout - -\begin_layout Section -Displaying existing IPv6 addresses -\end_layout - -\begin_layout Standard -\align left -First you should check, whether and which IPv6 addresses are already configured - (perhaps auto-magically during stateless auto-configuration). -\end_layout - -\begin_layout Standard -Just note that addresses beginning with -\begin_inset Quotes sld -\end_inset - -fec0 -\begin_inset Quotes srd -\end_inset - - are deprecated, but shown here for completness! -\end_layout - -\begin_layout Subsection -Using "ip" -\end_layout - -\begin_layout Standard -Usage: -\end_layout - -\begin_layout Code -# /sbin/ip -6 addr show dev -\end_layout - -\begin_layout Standard -Example for a static configured host: -\end_layout - -\begin_layout Code -# /sbin/ip -6 addr show dev eth0 -\end_layout - -\begin_layout Code -2: eth0: -\end_layout - -\begin_layout Standard -Example (output filtered with grep to display only IPv6 addresses). - Here you see different IPv6 addresses with different scopes. -\end_layout - -\begin_layout Code -# /sbin/ifconfig eth0 |grep "inet6 addr:" -\end_layout - -\begin_layout Code -inet6 addr: fe80::210:a4ff:fee3:9566/10 Scope:Link -\end_layout - -\begin_layout Code -inet6 addr: 2001:0db8:0:f101::1/64 Scope:Global -\end_layout - -\begin_layout Code -inet6 addr: fec0:0:0:f101::1/64 Scope:Site -\end_layout - -\begin_layout Section -Add an IPv6 address -\end_layout - -\begin_layout Standard -Adding an IPv6 address is similar to the mechanism of "IP ALIAS" addresses - in Linux IPv4 addressed interfaces. -\end_layout - -\begin_layout Subsection -Using "ip" -\end_layout - -\begin_layout Standard -Usage: -\end_layout - -\begin_layout Code -# /sbin/ip -6 addr add / dev -\end_layout - -\begin_layout Standard -Example: -\end_layout - -\begin_layout Code -# /sbin/ip -6 addr add 2001:0db8:0:f101::1/64 dev eth0 -\end_layout - -\begin_layout Subsection -Using "ifconfig" -\end_layout - -\begin_layout Standard -\align left -Usage: -\end_layout - -\begin_layout Code -# /sbin/ifconfig inet6 add / -\end_layout - -\begin_layout Standard -Example: -\end_layout - -\begin_layout Code -# /sbin/ifconfig eth0 inet6 add 2001:0db8:0:f101::1/64 -\end_layout - -\begin_layout Section -Removing an IPv6 address -\end_layout - -\begin_layout Standard -\align left -Not so often needed, be carefully with removing non existent IPv6 address, - sometimes using older kernels it results in a crash. -\end_layout - -\begin_layout Subsection -Using "ip" -\end_layout - -\begin_layout Standard -Usage: -\end_layout - -\begin_layout Code -# /sbin/ip -6 addr del / dev -\end_layout - -\begin_layout Standard -Example: -\end_layout - -\begin_layout Code -# /sbin/ip -6 addr del 2001:0db8:0:f101::1/64 dev eth0 -\end_layout - -\begin_layout Subsection -Using "ifconfig" -\end_layout - -\begin_layout Standard -\align left -Usage: -\end_layout - -\begin_layout Code -# /sbin/ifconfig inet6 del / -\end_layout - -\begin_layout Standard -Example: -\end_layout - -\begin_layout Code -# /sbin/ifconfig eth0 inet6 del 2001:0db8:0:f101::1/64 -\end_layout - -\begin_layout Section -Automatic IPv6 Address Configuration -\end_layout - -\begin_layout Standard -In case, a Router Advertisement is received by a client, and IPv6 autoconfigurat -ion is enabled (default on non-router), the client configures itself an - IPv6 address according to the prefix contained in the advertisement (see - also -\begin_inset CommandInset ref -LatexCommand ref -reference "hints-daemons-radvd" - -\end_inset - -). -\end_layout - -\begin_layout Section -Enable Privacy Extension -\end_layout - -\begin_layout Standard -Privacy Extension as described in -\begin_inset CommandInset href -LatexCommand href -name "RFC 4941 / Privacy Extensions for Stateless Address Autoconfiguration in IPv6" -target "http://www.faqs.org/rfcs/rfc4941.html" - -\end_inset - - (obsoleted -\begin_inset CommandInset href -LatexCommand href -name "RFC 3041" -target "http://www.faqs.org/rfcs/rfc3041.html" - -\end_inset - -) is replacing the static interface ID (mostly based on word-wide unique - MAC address) used during autoconfiguration by a pseudo-random one and generatin -g from time to time a new one deprecating the old one. -\end_layout - -\begin_layout Subsection -Enable Privacy Extension using sysctl -\end_layout - -\begin_layout Subsection* -Temporary activation -\end_layout - -\begin_layout Standard -Enable privacy extension for e.g. - interface -\begin_inset Quotes sld -\end_inset - -eth0 -\begin_inset Quotes srd -\end_inset - - and prefer the generated address: -\end_layout - -\begin_layout Code -# sysctl -w net.ipv6.conf.eth0.use_tempaddr=2 -\end_layout - -\begin_layout Standard -Afterwards, restart of the interface is necessary -\end_layout - -\begin_layout Code -# ip link set dev eth0 down -\end_layout - -\begin_layout Code -# ip link set dev eth0 up -\end_layout - -\begin_layout Standard -Once a router advertisement is received, the result should look like following -\end_layout - -\begin_layout Code -# ip -6 addr show dev eth0 -\end_layout - -\begin_layout Code -2: eth0: mtu 1500 qlen 1000 -\end_layout - -\begin_layout Code - inet6 2001:db8:0:1:8992:3c03:d6e2:ed72/64 scope global secondary dynamic - <- pseudo-random IID -\end_layout - -\begin_layout Code - valid_lft 604711sec preferred_lft 86311sec -\end_layout - -\begin_layout Code - inet6 2001:db8:0:1::224:21ff:fe01:2345/64 scope global <- IID based - on MAC -\end_layout - -\begin_layout Code - valid_lft 604711sec preferred_lft 86311sec -\end_layout - -\begin_layout Code - ... -\end_layout - -\begin_layout Subsection* -Permanent activation -\end_layout - -\begin_layout Standard -For permanent activation, either a special initscript value per interface - will enable privacy or an entry in the /etc/sysctl.conf file like -\end_layout - -\begin_layout Code -net.ipv6.conf.eth0.use_tempaddr=2 -\end_layout - -\begin_layout Standard -Note: interface must already exists with proper name when sysctl.conf is - applied. - If this is not the case (e.g. - after reboot) one has to configure privacy for all interfaces by default: -\end_layout - -\begin_layout Code -net.ipv6.conf.all.use_tempaddr=2 -\end_layout - -\begin_layout Code -net.ipv6.conf.default.use_tempaddr=2 -\end_layout - -\begin_layout Standard -Changed/added values in /etc/sysctl.conf can be activated during runtime, - but at least an interface down/up or a reboot is recommended. -\end_layout - -\begin_layout Code -# sysctl -p -\end_layout - -\begin_layout Subsection -Enable Privacy Extension using NetworkManager -\end_layout - -\begin_layout Standard -Modern (client) systems are using NetworkManager for configuring interfaces. - A command line tool is built-in which can be used to change settings which - are not available via GUI. -\end_layout - -\begin_layout Standard -Examples based on version 0.9.9.1-5.git20140319.fc21 -\end_layout - -\begin_layout Standard -Check existing interfaces with: -\end_layout - -\begin_layout Code -# nmcli connection -\end_layout - -\begin_layout Code -NAME UUID TYPE DEVICE -\end_layout - -\begin_layout Code -ens4v1 d0fc2b2e-5fa0-4675-96b5-b723ca5c46db 802-3-ethernet ens4v1 -\end_layout - -\begin_layout Standard -Current amount of IPv6 privacy extension addresses can be checked with -\end_layout - -\begin_layout Code -# ip -o addr show dev ens4v1 | grep temporary | wc -l -\end_layout - -\begin_layout Code -0 -\end_layout - -\begin_layout Standard -Current IPv6 privacy extension settings can be checked with -\end_layout - -\begin_layout Code -# nmcli connection show ens4v1 |grep ip6-privacy -\end_layout - -\begin_layout Code -ipv6.ip6-privacy: -1 (unknown) -\end_layout - -\begin_layout Standard -Enable IPv6 privacy extension and restart interface -\end_layout - -\begin_layout Code -# nmcli connection modify ens4v1 ipv6.ip6-privacy 2 -\end_layout - -\begin_layout Code -# nmcli connection down ens4v1; nmcli connection up ens4v1 -\end_layout - -\begin_layout Standard -New IPv6 privacy extension settings can be checked with -\end_layout - -\begin_layout Code -# nmcli connection show ens4v1 |grep ip6-privacy -\end_layout - -\begin_layout Code -ipv6.ip6-privacy: 2 (active, prefer temporary IP) -\end_layout - -\begin_layout Standard -Now IPv6 privacy extension addresses are configured on the interface -\end_layout - -\begin_layout Code -# ip -o addr show dev ens4v1 | grep temporary | wc -l -\end_layout - -\begin_layout Code -2 -\end_layout - -\begin_layout Subsection -Test real use of Privacy Extension IPv6 Addresses -\end_layout - -\begin_layout Standard -Whether the IPv6 address with an Interface ID generated by Privacy Extension - is really used for outgoing connections, one can browse to -\begin_inset CommandInset href -LatexCommand href -name "http://ip.bieringer.de/" -target "http://ip.bieringer.de/" - -\end_inset - -, in case EUI64_SCOPE shows -\begin_inset Quotes sld -\end_inset - -iid-privacy -\begin_inset Quotes srd -\end_inset - -, then everything is working fine. -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-configuration-route" - -\end_inset - -Configuring normal IPv6 routes -\end_layout - -\begin_layout Standard -\align left -If you want to leave your link and want to send packets in the world wide - IPv6-Internet, you need routing. - If there is already an IPv6 enabled router on your link, it's possible - enough to add IPv6 routes. -\end_layout - -\begin_layout Standard -Just note that addresses beginning with -\begin_inset Quotes sld -\end_inset - -fec0 -\begin_inset Quotes srd -\end_inset - - are deprecated, but shown here for completness! -\end_layout - -\begin_layout Section -Displaying existing IPv6 routes -\end_layout - -\begin_layout Standard -\align left -First you should check, whether and which IPv6 addresses are already configured - (perhaps auto-magically during auto-configuration). -\end_layout - -\begin_layout Subsection -Using "ip" -\end_layout - -\begin_layout Standard -Usage: -\end_layout - -\begin_layout Code -# /sbin/ip -6 route show [dev ] -\end_layout - -\begin_layout Standard -\align left -Example: -\end_layout - -\begin_layout Code -# /sbin/ip -6 route show dev eth0 -\end_layout - -\begin_layout Code -2001:0db8:0:f101::/64 proto kernel metric 256 mtu 1500 advmss 1440 -\end_layout - -\begin_layout Code -fe80::/10 proto kernel metric 256 mtu 1500 advmss 1440 -\end_layout - -\begin_layout Code -ff00::/8 proto kernel metric 256 mtu 1500 advmss 1440 -\end_layout - -\begin_layout Code -default proto kernel metric 256 mtu 1500 advmss 1440 -\end_layout - -\begin_layout Subsection -Using "route" -\end_layout - -\begin_layout Standard -\align left -Usage: -\end_layout - -\begin_layout Code -# /sbin/route -A inet6 -\end_layout - -\begin_layout Standard -\align left -Example (output is filtered for interface eth0). - Here you see different IPv6 routes for different addresses on a single - interface. -\end_layout - -\begin_layout Code -# /sbin/route -A inet6 |grep -w "eth0" -\end_layout - -\begin_layout Code -2001:0db8:0:f101 ::/64 :: UA 256 0 0 eth0 <- Interface route for global -\end_layout - -\begin_layout Code -¬ address -\end_layout - -\begin_layout Code -fe80::/10 :: UA 256 0 0 eth0 <- Interface route for link-local -\end_layout - -\begin_layout Code -¬ address -\end_layout - -\begin_layout Code -ff00::/8 :: UA 256 0 0 eth0 <- Interface route for all multicast -\end_layout - -\begin_layout Code -¬ addresses -\end_layout - -\begin_layout Code -::/0 :: UDA 256 0 0 eth0 <- Automatic default route -\end_layout - -\begin_layout Section -Add an IPv6 route through a gateway -\end_layout - -\begin_layout Standard -\align left -Mostly needed to reach the outside with IPv6 using an IPv6-enabled router - on your link. -\end_layout - -\begin_layout Subsection -Using "ip" -\end_layout - -\begin_layout Standard -Usage: -\end_layout - -\begin_layout Code -# /sbin/ip -6 route add / via -\end_layout - -\begin_layout Code -¬ [dev ] -\end_layout - -\begin_layout Standard -Example: -\end_layout - -\begin_layout Code -# /sbin/ip -6 route add default via 2001:0db8:0:f101::1 -\end_layout - -\begin_layout Subsection -Using "route" -\end_layout - -\begin_layout Standard -\align left -Usage: -\end_layout - -\begin_layout Code -# /sbin/route -A inet6 add / gw -\end_layout - -\begin_layout Code -¬ [dev ] -\end_layout - -\begin_layout Standard -\align left -A device can be needed, too, if the IPv6 address of the gateway is a link - local one. -\end_layout - -\begin_layout Standard -Following shown example adds a default route through gateway -\family typewriter -\lang afrikaans -2001:0db8:0:f101::1 -\end_layout - -\begin_layout Code -# /sbin/route -A inet6 add default gw 2001:0db8:0:f101::1 -\end_layout - -\begin_layout Section -Removing an IPv6 route through a gateway -\end_layout - -\begin_layout Standard -\align left -Not so often needed manually, mostly done by network configure scripts on - shutdown (full or per interface) -\end_layout - -\begin_layout Subsection -Using "ip" -\end_layout - -\begin_layout Standard -\align left -Usage: -\end_layout - -\begin_layout Code -# /sbin/ip -6 route del / via -\end_layout - -\begin_layout Code -¬ [dev ] -\end_layout - -\begin_layout Standard -Example: -\end_layout - -\begin_layout Code -# /sbin/ip -6 route del default via 2001:0db8:0:f101::1 -\end_layout - -\begin_layout Subsection -Using "route" -\end_layout - -\begin_layout Standard -\align left -Usage: -\end_layout - -\begin_layout Code -# /sbin/route -A inet6 del / gw [dev -\end_layout - -\begin_layout Code -¬ ] -\end_layout - -\begin_layout Standard -Example for removing upper added route again: -\end_layout - -\begin_layout Code -# /sbin/route -A inet6 del default gw 2001:0db8:0:f101::1 -\end_layout - -\begin_layout Section -Add an IPv6 route through an interface -\end_layout - -\begin_layout Standard -\align left -Not often needed, sometimes in cases of dedicated point-to-point links. -\end_layout - -\begin_layout Subsection -Using "ip" -\end_layout - -\begin_layout Standard -\align left -Usage: -\end_layout - -\begin_layout Code -# /sbin/ip -6 route add / dev -\end_layout - -\begin_layout Code -¬ metric 1 -\end_layout - -\begin_layout Standard -Example: -\end_layout - -\begin_layout Code -# /sbin/ip -6 route add default dev eth0 metric 1 -\end_layout - -\begin_layout Standard -Metric -\begin_inset Quotes sld -\end_inset - -1 -\begin_inset Quotes srd -\end_inset - - is used here to be compatible with the metric used by route, because the - default metric on using -\begin_inset Quotes sld -\end_inset - -ip -\begin_inset Quotes srd -\end_inset - - is -\begin_inset Quotes sld -\end_inset - -1024 -\begin_inset Quotes srd -\end_inset - -. -\end_layout - -\begin_layout Subsection -Using "route" -\end_layout - -\begin_layout Standard -\align left -Usage: -\end_layout - -\begin_layout Code -# /sbin/route -A inet6 add / dev -\end_layout - -\begin_layout Standard -Example: -\end_layout - -\begin_layout Code -# /sbin/route -A inet6 add default dev eth0 -\end_layout - -\begin_layout Section -Removing an IPv6 route through an interface -\end_layout - -\begin_layout Standard -\align left -Not so often needed to use by hand, configuration scripts will use such - on shutdown. -\end_layout - -\begin_layout Subsection -Using "ip" -\end_layout - -\begin_layout Standard -Usage: -\end_layout - -\begin_layout Code -# /sbin/ip -6 route del / dev -\end_layout - -\begin_layout Standard -Example: -\end_layout - -\begin_layout Code -# /sbin/ip -6 route del default dev eth0 -\end_layout - -\begin_layout Subsection -Using "route" -\end_layout - -\begin_layout Standard -\align left -Usage: -\end_layout - -\begin_layout Code -# /sbin/route -A inet6 del / dev -\end_layout - -\begin_layout Standard -\align left -Example: -\end_layout - -\begin_layout Code -# /sbin/route -A inet6 del default dev eth0 -\end_layout - -\begin_layout Section -FAQ for IPv6 routes -\end_layout - -\begin_layout Subsection -Support of an IPv6 default route -\end_layout - -\begin_layout Standard -One idea of IPv6 was a hierachical routing, therefore only less routing - entries are needed in routers. -\end_layout - -\begin_layout Standard -There are some issues in current Linux kernels: -\end_layout - -\begin_layout Subsubsection -Clients (not routing any packet!) -\end_layout - -\begin_layout Standard -Client can setup a default route like prefix -\begin_inset Quotes sld -\end_inset - -::/0 -\begin_inset Quotes srd -\end_inset - -, they also learn such route on autoconfiguration e.g. - using radvd on the link like following example shows: -\end_layout - -\begin_layout Code -# ip -6 route show | grep ^default -\end_layout - -\begin_layout Code -default via fe80::212:34ff:fe12:3450 dev eth0 proto kernel metric 1024 expires -\end_layout - -\begin_layout Code -¬ 29sec mtu 1500 advmss 1440 -\end_layout - -\begin_layout Subsubsection -Routers in case of packet forwarding -\end_layout - -\begin_layout Standard -Older Linux kernel (at least <= 2.4.17) don't support default routes. - You can set them up, but the route lookup fails when a packet should be - forwarded (normal intention of a router). - If you're still using such older kernel, -\begin_inset Quotes sld -\end_inset - -default routing -\begin_inset Quotes srd -\end_inset - - can be setup using the currently used global address prefix -\begin_inset Quotes sld -\end_inset - -2000::/3 -\begin_inset Quotes srd -\end_inset - -. -\end_layout - -\begin_layout Standard -Note: take care about default routing without address filtering on edge - routers. - Otherwise unwanted multicast or site-local traffic can leave the edge. -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-Neighbor-Discovery" - -\end_inset - -Neighbor Discovery -\end_layout - -\begin_layout Standard -Neighbor discovery was the IPv6 successor for the ARP (Address Resolution - Protocol) in IPv4. - You can retrieve information about the current neighbors, in addition you - can set and delete entries. - The kernel keeps tracking of successful neighbor detection (like ARP in - IPv4). - You can dig into the learnt table using -\begin_inset Quotes sld -\end_inset - -ip -\begin_inset Quotes srd -\end_inset - -. -\end_layout - -\begin_layout Section -Displaying neighbors using -\begin_inset Quotes sld -\end_inset - -ip -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -With following command you can display the learnt or configured IPv6 neighbors -\end_layout - -\begin_layout Code -# ip -6 neigh show [dev ] -\end_layout - -\begin_layout Standard -The following example shows one neighbor, which is a reachable router -\end_layout - -\begin_layout Code -# ip -6 neigh show -\end_layout - -\begin_layout Code -fe80::201:23ff:fe45:6789 dev eth0 lladdr 00:01:23:45:67:89 router nud reachable -\end_layout - -\begin_layout Section -Manipulating neighbors table using -\begin_inset Quotes sld -\end_inset - -ip -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Subsection -Manually add an entry -\end_layout - -\begin_layout Standard -With following command you are able to manually add an entry -\end_layout - -\begin_layout Code -# ip -6 neigh add lladdr dev -\end_layout - -\begin_layout Standard -Example: -\end_layout - -\begin_layout Code -# ip -6 neigh add fec0::1 lladdr 02:01:02:03:04:05 dev eth0 -\end_layout - -\begin_layout Subsection -Manually delete an entry -\end_layout - -\begin_layout Standard -Like adding also an entry can be deleted: -\end_layout - -\begin_layout Code -# ip -6 neigh del lladdr dev -\end_layout - -\begin_layout Standard -Example: -\end_layout - -\begin_layout Code -# ip -6 neigh del fec0::1 lladdr 02:01:02:03:04:05 dev eth0 -\end_layout - -\begin_layout Subsection -More advanced settings -\end_layout - -\begin_layout Standard -The tool -\begin_inset Quotes sld -\end_inset - -ip -\begin_inset Quotes srd -\end_inset - - is less documentated, but very strong. - See online -\begin_inset Quotes sld -\end_inset - -help -\begin_inset Quotes srd -\end_inset - - for more: -\end_layout - -\begin_layout Code -# ip -6 neigh help -\end_layout - -\begin_layout Code -Usage: ip neigh { add | del | change | replace } { ADDR [ lladdr LLADDR - ] -\end_layout - -\begin_layout Code - [ nud { permanent | noarp | stale | reachable } ] -\end_layout - -\begin_layout Code - | proxy ADDR } [ dev DEV ] -\end_layout - -\begin_layout Code - ip neigh {show|flush} [ to PREFIX ] [ dev DEV ] [ nud STATE ] -\end_layout - -\begin_layout Standard -Looks like some options are only for IPv4...if you can contribute information - about flags and advanced usage, pls. - send. -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-configuring-ipv6-in-ipv4-tunnels" - -\end_inset - -Configuring IPv6-in-IPv4 tunnels -\end_layout - -\begin_layout Standard -\align left -If you want to leave your link and you have no IPv6 capable network around - you, you need IPv6-in-IPv4 tunneling to reach the world wide IPv6-Internet. -\end_layout - -\begin_layout Standard -\align left -There are some kind of tunnel mechanism and also some possibilities to setup - tunnels. -\end_layout - -\begin_layout Section -Types of tunnels -\end_layout - -\begin_layout Standard -There are more than one possibility to tunnel IPv6 packets over IPv4-only - links. -\end_layout - -\begin_layout Subsection -Static point-to-point tunneling -\end_layout - -\begin_layout Standard -\align left -A point-to-point tunnel is a dedicated tunnel to an endpoint, which knows - about your IPv6 network (for backward routing) and the IPv4 address of - your tunnel endpoint and defined in -\begin_inset CommandInset href -LatexCommand href -name "RFC 4213 / Basic Transition Mechanisms for IPv6 Hosts and Routers" -target "http://www.faqs.org/rfcs/rfc4213.html" - -\end_inset - -. - Requirements: -\end_layout - -\begin_layout Itemize -\align left -IPv4 address of your local tunnel endpoint must be static, global unique - and reachable from the foreign tunnel endpoint -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_deeper -\begin_layout Itemize -If no static IPv4 address is available, the tunnel provider must support - authentication of the dynamic IPv4 address, like -\begin_inset CommandInset href -LatexCommand href -name "SixXS / AICCU" -target "http://www.sixxs.net/" - -\end_inset - - (3740/udp) or -\begin_inset CommandInset href -LatexCommand href -name "gogo6" -target "http://gogo6.com/" - -\end_inset - - (3653/udp). -\end_layout - -\end_deeper -\begin_layout Itemize -\align left -A global IPv6 prefix assigned to you -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_deeper -\begin_layout Itemize -It is also possible that additional IPv6 networks are routed through this - tunnel. -\end_layout - -\end_deeper -\begin_layout Itemize -\align left -A foreign tunnel endpoint which is capable to route your IPv6 prefix to - your local tunnel endpoint (mostly remote manual configuration required) -\end_layout - -\begin_layout Standard - -\lang ngerman -Tunnel provider for static point-to-point tunneling: -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Hurricane Electric" -target "http://he.com/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "SixXS" -target "http://www.sixxs.net/" - -\end_inset - - -\end_layout - -\begin_layout Subsection -Automatically tunneling -\end_layout - -\begin_layout Standard -Automatic tunneling occurs, when a node directly connects another node gotten - the IPv4 address of the other node before. -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "tunneling-6to4" - -\end_inset - -6to4-Tunneling -\end_layout - -\begin_layout Standard -6to4 tunneling ( -\begin_inset CommandInset href -LatexCommand href -name "RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds" -target "http://www.faqs.org/rfcs/rfc3056.html" - -\end_inset - -) uses a simple mechanism to create automatic tunnels. - Each node with a global unique IPv4 address is able to be a 6to4 tunnel - endpoint (if no IPv4 firewall prohibits traffic). - 6to4 tunneling is mostly not a one-to-one tunnel. - This case of tunneling can be divided into upstream and downstream tunneling. - Also, a special IPv6 address indicates that this node will use 6to4 tunneling - for connecting the world-wide IPv6 network -\end_layout - -\begin_layout Subsubsection -Generation of 6to4 prefix -\end_layout - -\begin_layout Standard -The 6to4 address is defined like following (schema is taken from -\begin_inset CommandInset href -LatexCommand href -name "RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds" -target "http://www.faqs.org/rfcs/rfc3056.html" - -\end_inset - -): -\end_layout - -\begin_layout Code -| 3+13 | 32 | 16 | 64 bits | -\end_layout - -\begin_layout Code -+---+------+-----------+--------+--------------------------------+ -\end_layout - -\begin_layout Code -| FP+TLA | V4ADDR | SLA ID | Interface ID | -\end_layout - -\begin_layout Code -| 0x2002 | | | | -\end_layout - -\begin_layout Code -+---+------+-----------+--------+--------------------------------+ -\end_layout - -\begin_layout Standard -FP and TLA together (16 bits) have the value 0x2002. - V4ADDR is the node's global unique IPv4 address (in hexadecimal notation). - SLA is the subnet identifier (65536 local subnets possible) and are usable - to represent your local network structure. -\end_layout - -\begin_layout Standard -For gateways, such prefix is generated by normally using SLA -\begin_inset Quotes sld -\end_inset - -0000 -\begin_inset Quotes srd -\end_inset - - and suffix -\begin_inset Quotes sld -\end_inset - -::1 -\begin_inset Quotes srd -\end_inset - - (not a must, can be an arbitrary one with local-scope) and assigned to - the 6to4 tunnel interface. - Note that Microsoft Windows uses V4ADDR also for suffix. -\end_layout - -\begin_layout Subsubsection -6to4 upstream tunneling -\end_layout - -\begin_layout Standard -The node has to know to which foreign tunnel endpoint its in IPv4 packed - IPv6 packets should be send to. - In -\begin_inset Quotes sld -\end_inset - -early -\begin_inset Quotes srd -\end_inset - - days of 6to4 tunneling, dedicated upstream accepting routers were defined. - See -\begin_inset CommandInset href -LatexCommand href -name "NSayer's 6to4 information" -target "http://www.kfu.com/~nsayer/6to4/" - -\end_inset - - for a list of routers. -\end_layout - -\begin_layout Standard -Nowadays, 6to4 upstream routers can be found auto-magically using the anycast - address 192.88.99.1. - In the background routing protocols handle this, see -\begin_inset CommandInset href -LatexCommand href -name "RFC 3068 / An Anycast Prefix for 6to4 Relay Routers" -target "http://www.faqs.org/rfcs/rfc3068.html" - -\end_inset - - for details. - -\end_layout - -\begin_layout Subsubsection -6to4 downstream tunneling -\end_layout - -\begin_layout Standard -The downstream (IPv6 backbone -> your 6to4 enabled node) is not really fix - and can vary from foreign host which originated packets were send to. - There exist two possibilities: -\end_layout - -\begin_layout Itemize -Foreign host uses 6to4 and sends packet direct back to your node (see below) -\end_layout - -\begin_layout Itemize -Foreign host sends packets back to the world-wide IPv6 network and depending - on the dynamic routing a relay router of an ISP which announces 2002::/16 - via BGP will create a automatic tunnel back to your node. -\end_layout - -\begin_layout Subsubsection -Possible 6to4 traffic -\end_layout - -\begin_layout Itemize -from 6to4 to 6to4: is normally directly tunneled between the both 6to4 enabled - hosts -\end_layout - -\begin_layout Itemize -from 6to4 to non-6to4: is sent via upstream tunneling -\end_layout - -\begin_layout Itemize -non-6to4 to 6to4: is sent via downstream tunneling -\end_layout - -\begin_layout Standard - -\lang ngerman -Note, that because of possible asymmetric routing problems with a broken - 6to4 relay can be hard to troubleshoot. -\end_layout - -\begin_layout Subsection -UDP encapsulated IPv6 tunneling -\end_layout - -\begin_layout Standard -UDP encapsulated IPv6 tunneling is usally used if no global IPv4 address - is available on the internal endpoint, but using Network Adress Translation - (NAT) it can still reach related endpoints using UDP ports described below. -\end_layout - -\begin_layout Subsubsection -Teredo Tunnel -\end_layout - -\begin_layout Standard -\begin_inset CommandInset href -LatexCommand href -name "RFC 4380 / Teredo: Tunneling IPv6 over UDP through Network Address Translations" -target "http://www.faqs.org/rfcs/rfc4380.html" - -\end_inset - -describes tunneling of IPv6 packets via IPv4 UDP bubbles, see also -\begin_inset CommandInset href -LatexCommand href -name "Wikipedia / Teredo" -target "http://de.wikipedia.org/wiki/Teredo" - -\end_inset - -. - It uses usually 3544/udp. - Linux client is named -\begin_inset CommandInset href -LatexCommand href -name "miredo" -target "http://www.remlab.net/miredo/" - -\end_inset - - and usable out-of-the-box. - This tunnel method can only connect a single client to the global IPv6 - network.. -\end_layout - -\begin_layout Subsubsection -AYIYA Tunnel -\end_layout - -\begin_layout Standard -Tunnel provider -\begin_inset CommandInset href -LatexCommand href -name "SixXS" -target "http://www.sixxs.net/" - -\end_inset - - has also IPv6-in-UDP-in-IPv4 (5072/udp) capability, for using it, the AYIYA - mode must be enabled. -\end_layout - -\begin_layout Subsubsection -gogo6 Tunnel -\end_layout - -\begin_layout Standard -Tunnel provider -\begin_inset CommandInset href -LatexCommand href -name "gogo6" -target "http://gogo6.com/" - -\end_inset - - has also IPv6-in-UDP-in-IPv4 (3653/udp) capability, for using it, the v6udpv4 - mode must be enabled. -\end_layout - -\begin_layout Section -Displaying existing tunnels -\end_layout - -\begin_layout Subsection -Using "ip" -\end_layout - -\begin_layout Standard -Usage: -\end_layout - -\begin_layout Code -# /sbin/ip -6 tunnel show [] -\end_layout - -\begin_layout Standard -Example: -\end_layout - -\begin_layout Code -# /sbin/ip -6 tunnel show -\end_layout - -\begin_layout Code -sit0: ipv6/ip remote any local any ttl 64 nopmtudisc -\end_layout - -\begin_layout Code -sit1: ipv6/ip remote 195.226.187.50 local any ttl 64 -\end_layout - -\begin_layout Subsection -Using "route" -\end_layout - -\begin_layout Standard -Usage: -\end_layout - -\begin_layout Code -# /sbin/route -A inet6 -\end_layout - -\begin_layout Standard -Example (output is filtered to display only tunnels through virtual interface - sit0): -\end_layout - -\begin_layout Code -# /sbin/route -A inet6 | grep " -\backslash -Wsit0 -\backslash -W*$" -\end_layout - -\begin_layout Code -::/96 :: U 256 2 0 sit0 -\end_layout - -\begin_layout Code -2002::/16 :: UA 256 0 0 sit0 -\end_layout - -\begin_layout Code -2000::/3 ::193.113.58.75 UG 1 0 0 sit0 -\end_layout - -\begin_layout Code -fe80::/10 :: UA 256 0 0 sit0 -\end_layout - -\begin_layout Code -ff00::/8 :: UA 256 0 0 sit0 -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "conf-ipv6-in-ipv4-point-to-point-tunnels" - -\end_inset - -Setup of point-to-point tunnel -\end_layout - -\begin_layout Standard -\align left -There are 3 possibilities to add or remove point-to-point tunnels. -\end_layout - -\begin_layout Standard -A good additional information about tunnel setup using -\begin_inset Quotes sld -\end_inset - -ip -\begin_inset Quotes srd -\end_inset - - is -\begin_inset CommandInset href -LatexCommand href -name "Configuring tunnels with iproute2 (article)" -target "http://www.deepspace6.net/docs/iproute2tunnel-en.html" - -\end_inset - - ( -\begin_inset CommandInset href -LatexCommand href -name "Mirror" -target "http://mirrors.bieringer.de/www.deepspace6.net/docs/iproute2tunnel-en.html" - -\end_inset - -). -\end_layout - -\begin_layout Subsection -Add point-to-point tunnels -\end_layout - -\begin_layout Subsubsection -Using "ip" -\end_layout - -\begin_layout Standard -\align left -Common method at the moment for a small amount of tunnels. -\end_layout - -\begin_layout Standard -Usage for creating a tunnel device (but it's not up afterward, also a TTL - must be specified because the default value is 0). -\end_layout - -\begin_layout Code -# /sbin/ip tunnel add mode sit ttl remote -\end_layout - -\begin_layout Code -¬ local -\end_layout - -\begin_layout Standard -Usage (generic example for three tunnels): -\end_layout - -\begin_layout Code -# /sbin/ip tunnel add sit1 mode sit ttl remote -\end_layout - -\begin_layout Code -¬ local -\end_layout - -\begin_layout Code -# /sbin/ip link set dev sit1 up -\end_layout - -\begin_layout Code -# /sbin/ip -6 route add dev sit1 metric 1 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code -# /sbin/ip tunnel add sit2 mode sit ttl -\end_layout - -\begin_layout Code -¬ local -\end_layout - -\begin_layout Code -# /sbin/ip link set dev sit2 up -\end_layout - -\begin_layout Code -# /sbin/ip -6 route add dev sit2 metric 1 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code -# /sbin/ip tunnel add sit3 mode sit ttl -\end_layout - -\begin_layout Code -¬ local -\end_layout - -\begin_layout Code -# /sbin/ip link set dev sit3 up -\end_layout - -\begin_layout Code -# /sbin/ip -6 route add dev sit3 metric 1 -\end_layout - -\begin_layout Subsubsection -Using "ifconfig" and "route" (deprecated) -\end_layout - -\begin_layout Standard -\align left -This not very recommended way to add a tunnel because it's a little bit - strange. - No problem if adding only one, but if you setup more than one, you cannot - easy shutdown the first ones and leave the others running. -\end_layout - -\begin_layout Standard -Usage (generic example for three tunnels): -\end_layout - -\begin_layout Code -# /sbin/ifconfig sit0 up -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code -# /sbin/ifconfig sit0 tunnel -\end_layout - -\begin_layout Code -# /sbin/ifconfig sit1 up -\end_layout - -\begin_layout Code -# /sbin/route -A inet6 add dev sit1 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code -# /sbin/ifconfig sit0 tunnel -\end_layout - -\begin_layout Code -# /sbin/ifconfig sit2 up -\end_layout - -\begin_layout Code -# /sbin/route -A inet6 add dev sit2 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code -# /sbin/ifconfig sit0 tunnel -\end_layout - -\begin_layout Code -# /sbin/ifconfig sit3 up -\end_layout - -\begin_layout Code -# /sbin/route -A inet6 add dev sit3 -\end_layout - -\begin_layout Standard -Important: DON'T USE THIS, because this setup implicit enable "automatic - tunneling" from anywhere in the Internet, this is a risk, and it should - not be advocated. -\end_layout - -\begin_layout Subsubsection -Using "route" only -\end_layout - -\begin_layout Standard -\align left -It's also possible to setup tunnels in Non Broadcast Multiple Access (NBMA) - style, it's a easy way to add many tunnels at once. - But none of the tunnel can be numbered (which is a not required feature). -\end_layout - -\begin_layout Standard -Usage (generic example for three tunnels): -\end_layout - -\begin_layout Code -# /sbin/ifconfig sit0 up -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code -# /sbin/route -A inet6 add gw -\end_layout - -\begin_layout Code -¬ :: dev sit0 -\end_layout - -\begin_layout Code -# /sbin/route -A inet6 add gw -\end_layout - -\begin_layout Code -¬ :: dev sit0 -\end_layout - -\begin_layout Code -# /sbin/route -A inet6 add gw -\end_layout - -\begin_layout Code -¬ :: dev sit0 -\end_layout - -\begin_layout Standard -Important: DON'T USE THIS, because this setup implicit enable "automatic - tunneling" from anywhere in the Internet, this is a risk, and it should - not be advocated. -\end_layout - -\begin_layout Subsection -Removing point-to-point tunnels -\end_layout - -\begin_layout Standard -\align left -Manually not so often needed, but used by scripts for clean shutdown or - restart of IPv6 configuration. -\end_layout - -\begin_layout Subsubsection -Using "ip" -\end_layout - -\begin_layout Standard -Usage for removing a tunnel device: -\end_layout - -\begin_layout Code -# /sbin/ip tunnel del -\end_layout - -\begin_layout Standard -Usage (generic example for three tunnels): -\end_layout - -\begin_layout Code -# /sbin/ip -6 route del dev sit1 -\end_layout - -\begin_layout Code -# /sbin/ip link set sit1 down -\end_layout - -\begin_layout Code -# /sbin/ip tunnel del sit1 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code -# /sbin/ip -6 route del dev sit2 -\end_layout - -\begin_layout Code -# /sbin/ip link set sit2 down -\end_layout - -\begin_layout Code -# /sbin/ip tunnel del sit2 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code -# /sbin/ip -6 route del dev sit3 -\end_layout - -\begin_layout Code -# /sbin/ip link set sit3 down -\end_layout - -\begin_layout Code -# /sbin/ip tunnel del sit3 -\end_layout - -\begin_layout Subsubsection -Using "ifconfig" and "route" (deprecated because not very funny) -\end_layout - -\begin_layout Standard -\align left -Not only the creation is strange, the shutdown also...you have to remove the - tunnels in backorder, means the latest created must be removed first. -\end_layout - -\begin_layout Standard -Usage (generic example for three tunnels): -\end_layout - -\begin_layout Code -# /sbin/route -A inet6 del dev sit3 -\end_layout - -\begin_layout Code -# /sbin/ifconfig sit3 down -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code -# /sbin/route -A inet6 del dev sit2 -\end_layout - -\begin_layout Code -# /sbin/ifconfig sit2 down -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code -# /sbin/route -A inet6 add dev sit1 -\end_layout - -\begin_layout Code -# /sbin/ifconfig sit1 down -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code -# /sbin/ifconfig sit0 down -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Subsubsection -Using "route" -\end_layout - -\begin_layout Standard -This is like removing normal IPv6 routes. -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_layout Standard -\align left -Usage (generic example for three tunnels): -\end_layout - -\begin_layout Code -# /sbin/route -A inet6 del gw -\end_layout - -\begin_layout Code -¬ :: dev sit0 -\end_layout - -\begin_layout Code -# /sbin/route -A inet6 del gw -\end_layout - -\begin_layout Code -¬ :: dev sit0 -\end_layout - -\begin_layout Code -# /sbin/route -A inet6 del gw -\end_layout - -\begin_layout Code -¬ :: dev sit0 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code -# /sbin/ifconfig sit0 down -\end_layout - -\begin_layout Subsection -Numbered point-to-point tunnels -\end_layout - -\begin_layout Standard -Sometimes it's needed to configure a point-to-point tunnel with IPv6 addresses - like in IPv4 today. - This is only possible with the first (ifconfig+route - deprecated) and - third (ip+route) tunnel setup. - In such cases, you can add the IPv6 address to the tunnel interface like - shown on interface configuration. - -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "configuring-ipv6to4-tunnels" - -\end_inset - -Setup of 6to4 tunnels -\end_layout - -\begin_layout Standard -Pay attention that the support of 6to4 tunnels currently lacks on vanilla - kernel series 2.2.x (see -\begin_inset CommandInset ref -LatexCommand ref -name "systemcheck/kernel" -reference "systemcheck-kernel" - -\end_inset - - for more information). - Also note that that the prefix length for a 6to4 address is 16 because - of from network point of view, all other 6to4 enabled hosts are on the - same layer 2. -\end_layout - -\begin_layout Subsection -Add a 6to4 tunnel -\end_layout - -\begin_layout Standard -First, you have to calculate your 6to4 prefix using your local assigned - global routable IPv4 address (if your host has no global routable IPv4 - address, in special cases NAT on border gateways is possible): -\end_layout - -\begin_layout Standard -Assuming your IPv4 address is -\end_layout - -\begin_layout Code -1.2.3.4 -\end_layout - -\begin_layout Standard -the generated 6to4 prefix will be -\end_layout - -\begin_layout Code -2002:0102:0304:: -\end_layout - -\begin_layout Standard -Local 6to4 gateways should (but it's not a must, you can choose an arbitrary - suffix with local-scope, if you feel better) always assigned the suffix - -\begin_inset Quotes sld -\end_inset - -::1 -\begin_inset Quotes srd -\end_inset - -, therefore your local 6to4 address will be -\end_layout - -\begin_layout Code -2002:0102:0304::1 -\end_layout - -\begin_layout Standard -Use e.g. - following for automatic generation: -\end_layout - -\begin_layout Code -ipv4="1.2.3.4"; printf "2002:%02x%02x:%02x%02x::1" `echo $ipv4 | tr "." " "` -\end_layout - -\begin_layout Standard -There are two ways possible to setup 6to4 tunneling now. -\end_layout - -\begin_layout Subsubsection -Using "ip" and a dedicated tunnel device -\end_layout - -\begin_layout Standard -This is now the recommended way (a TTL must be specified because the default - value is 0). -\end_layout - -\begin_layout Standard -Create a new tunnel device -\end_layout - -\begin_layout Code -# /sbin/ip tunnel add tun6to4 mode sit ttl remote any local -\end_layout - -\begin_layout Code -¬ -\end_layout - -\begin_layout Standard -Bring interface up -\end_layout - -\begin_layout Code -# /sbin/ip link set dev tun6to4 up -\end_layout - -\begin_layout Standard -Add local 6to4 address to interface (note: prefix length 16 is important!) -\end_layout - -\begin_layout Code -# /sbin/ip -6 addr add /16 dev tun6to4 -\end_layout - -\begin_layout Standard -Add (default) route to the global IPv6 network using the all-6to4-routers - IPv4 anycast address -\end_layout - -\begin_layout Code -# /sbin/ip -6 route add default via ::192.88.99.1 dev tun6to4 metric 1 -\end_layout - -\begin_layout Standard -It was reported that some versions of -\begin_inset Quotes sld -\end_inset - -ip -\begin_inset Quotes srd -\end_inset - - (e.g. - SuSE Linux 9.0) don't support IPv4-compatible IPv6 addresses for gateways, - in this case the related IPv6 address has to be used: -\end_layout - -\begin_layout Code -# /sbin/ip -6 route add default via 2002:c058:6301::1 dev tun6to4 metric - 1 -\end_layout - -\begin_layout Subsubsection -Using "ifconfig" and "route" and generic tunnel device -\begin_inset Quotes sld -\end_inset - -sit0 -\begin_inset Quotes srd -\end_inset - - (deprecated) -\end_layout - -\begin_layout Standard -This is now deprecated because using the generic tunnel device sit0 doesn't - let specify filtering per device. -\end_layout - -\begin_layout Standard -Bring generic tunnel interface sit0 up -\end_layout - -\begin_layout Code -# /sbin/ifconfig sit0 up -\end_layout - -\begin_layout Standard -Add local 6to4 address to interface -\end_layout - -\begin_layout Code -# /sbin/ifconfig sit0 add /16 -\end_layout - -\begin_layout Standard -Add (default) route to the global IPv6 network using the all-6to4-relays - IPv4 anycast address -\end_layout - -\begin_layout Code -# /sbin/route -A inet6 add default gw ::192.88.99.1 dev sit0 -\end_layout - -\begin_layout Subsection -Remove a 6to4 tunnel -\end_layout - -\begin_layout Subsubsection -Using "ip" and a dedicated tunnel device -\end_layout - -\begin_layout Standard -Remove all routes through this dedicated tunnel device -\end_layout - -\begin_layout Code -# /sbin/ip -6 route flush dev tun6to4 -\end_layout - -\begin_layout Standard -Shut down interface -\end_layout - -\begin_layout Code -# /sbin/ip link set dev tun6to4 down -\end_layout - -\begin_layout Standard -Remove created tunnel device -\end_layout - -\begin_layout Code -# /sbin/ip tunnel del tun6to4 -\end_layout - -\begin_layout Subsubsection -Using -\begin_inset Quotes sld -\end_inset - -ifconfig -\begin_inset Quotes srd -\end_inset - - and -\begin_inset Quotes sld -\end_inset - -route -\begin_inset Quotes srd -\end_inset - - and generic tunnel device -\begin_inset Quotes sld -\end_inset - -sit0 -\begin_inset Quotes srd -\end_inset - - (deprecated) -\end_layout - -\begin_layout Standard -Remove (default) route through the 6to4 tunnel interface -\end_layout - -\begin_layout Code -# /sbin/route -A inet6 del default gw ::192.88.99.1 dev sit0 -\end_layout - -\begin_layout Standard -Remove local 6to4 address to interface -\end_layout - -\begin_layout Code -# /sbin/ifconfig sit0 del /16 -\end_layout - -\begin_layout Standard -Shut down generic tunnel device (take care about this, perhaps it's still - in use...) -\end_layout - -\begin_layout Code -# /sbin/ifconfig sit0 down -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-configuring-ipv4-in-ipv6-tunnels" - -\end_inset - -Configuring IPv4-in-IPv6 tunnels -\end_layout - -\begin_layout Standard -\begin_inset CommandInset href -LatexCommand href -name "RFC 2473 / Generic Packet Tunneling in IPv6 Specification" -target "http://www.faqs.org/rfcs/rfc2473.html" - -\end_inset - - specifies mechanisms to tunnel several different packet types over IPv6 - including IPv4. -\end_layout - -\begin_layout Standard -NOTE: Support for IPv4-in-IPv6 tunnel is available only since kernel version - 2.6.22. -\end_layout - -\begin_layout Section -Displaying existing tunnels -\end_layout - -\begin_layout Standard -Usage: -\end_layout - -\begin_layout Code -# /sbin/ip -6 tunnel show [] -\end_layout - -\begin_layout Standard -Example: -\end_layout - -\begin_layout Code -# /sbin/ip -6 tunnel show mode any -\end_layout - -\begin_layout Code -ip6tnl0: ipv6/ipv6 remote :: local :: encaplimit 0 hoplimit 0 tclass 0x00 -\end_layout - -\begin_layout Code -¬ flowlabel 0x00000 (flowinfo 0x00000000) -\end_layout - -\begin_layout Code -ip6tnl1: ip/ipv6 remote fd00:0:0:2::a local fd00:0:0:2::1 dev eth1 encaplimit - 4 -\end_layout - -\begin_layout Code -¬ hoplimit 64 tclass 0x00 flowlabel 0x00000 (flowinfo 0x00000000) -\end_layout - -\begin_layout Standard -NOTE: If you don't include "mode any", only IPv6-in-IPv6 tunnels are displayed. -\end_layout - -\begin_layout Section -Setup of point-to-point tunnel -\end_layout - -\begin_layout Standard -Usage for creating a 4over6 tunnel device (but it's not up afterward) -\end_layout - -\begin_layout Code -# /sbin/ip tunnel add mode ip4ip6 remote -\end_layout - -\begin_layout Code -¬ local -\end_layout - -\begin_layout Standard -Usage (generic example for three tunnels): -\end_layout - -\begin_layout Code -# /sbin/ip -6 tunnel add ip6tnl1 mode ip4ip6 remote -\end_layout - -\begin_layout Code -¬ local -\end_layout - -\begin_layout Code -# /sbin/ip link set dev ip6tnl1 up -\end_layout - -\begin_layout Code -# /sbin/ip -6 route add dev ip6tnl1 metric 1 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code -# /sbin/ip -6 tunnel add ip6tnl2 mode ip4ip6 remote -\end_layout - -\begin_layout Code -¬ local -\end_layout - -\begin_layout Code -# /sbin/ip link set dev ip6tnl2 up -\end_layout - -\begin_layout Code -# /sbin/ip -6 route add dev ip6tnl2 metric 1 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code -# /sbin/ip -6 tunnel add ip6tnl3 mode ip4ip6 remote -\end_layout - -\begin_layout Code -¬ local -\end_layout - -\begin_layout Code -# /sbin/ip link set dev ip6tnl3 up -\end_layout - -\begin_layout Code -# /sbin/ip -6 route add dev ip6tnl3 metric 1 -\end_layout - -\begin_layout Section -Removing point-to-point tunnels -\end_layout - -\begin_layout Standard -Usage for removing a tunnel device: -\end_layout - -\begin_layout Code -# /sbin/ip -6 tunnel del -\end_layout - -\begin_layout Standard -Usage (generic example for three tunnels): -\end_layout - -\begin_layout Code -# /sbin/ip -6 route del dev ip6tnl1 -\end_layout - -\begin_layout Code -# /sbin/ip link set ip6tnl1 down -\end_layout - -\begin_layout Code -# /sbin/ip -6 tunnel del ip6tnl1 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code -# /sbin/ip -6 route del dev ip6tnl2 -\end_layout - -\begin_layout Code -# /sbin/ip link set ip6tnl2 down -\end_layout - -\begin_layout Code -# /sbin/ip -6 tunnel del ip6tnl2 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code -# /sbin/ip -6 route del dev ip6tnl3 -\end_layout - -\begin_layout Code -# /sbin/ip link set ip6tnl3 down -\end_layout - -\begin_layout Code -# /sbin/ip -6 tunnel del ip6tnl3 -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-kernel-settings" - -\end_inset - -Kernel settings in /proc-filesystem -\end_layout - -\begin_layout Standard -\begin_inset CommandInset label -LatexCommand label -name "proc-filesystem" - -\end_inset - -Note: the source of this section is mostly the file -\begin_inset Quotes sld -\end_inset - -ip-sysctl.txt -\begin_inset Quotes srd -\end_inset - - which is included in current kernel sources in directory -\begin_inset Quotes sld -\end_inset - -Documentation/networking -\begin_inset Quotes srd -\end_inset - -. - Credits to Pekka Savola for maintaining the IPv6-related part in this file. - Also some text is more or less copied & pasted into this document. -\end_layout - -\begin_layout Section -How to access the /proc-filesystem -\end_layout - -\begin_layout Subsection -Using -\begin_inset Quotes sld -\end_inset - -cat -\begin_inset Quotes srd -\end_inset - - and -\begin_inset Quotes sld -\end_inset - -echo -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -Using -\begin_inset Quotes sld -\end_inset - -cat -\begin_inset Quotes srd -\end_inset - - and -\begin_inset Quotes sld -\end_inset - -echo -\begin_inset Quotes srd -\end_inset - - is the simplest way to access the /proc filesystem, but some requirements - are needed for that -\end_layout - -\begin_layout Itemize -The /proc-filesystem had to be enabled in kernel, means on compiling following - switch has to be set -\end_layout - -\begin_layout Code -CONFIG_PROC_FS=y -\end_layout - -\begin_layout Itemize -The /proc-filesystem was mounted before, which can be tested using -\end_layout - -\begin_layout Code -# mount | grep "type proc" -\end_layout - -\begin_layout Code -none on /proc type proc (rw) -\end_layout - -\begin_layout Itemize -You need read and sometimes also write access (normally root only) to the - /proc-filesystem -\end_layout - -\begin_layout Standard -Normally, only entries in /proc/sys/* are writable, the others are readonly - and for information retrieving only. -\end_layout - -\begin_layout Subsubsection -Retrieving a value -\end_layout - -\begin_layout Standard -The value of an entry can be retrieved using -\begin_inset Quotes sld -\end_inset - -cat -\begin_inset Quotes srd -\end_inset - -: -\end_layout - -\begin_layout Code -# cat /proc/sys/net/ipv6/conf/all/forwarding -\end_layout - -\begin_layout Code -0 -\end_layout - -\begin_layout Subsubsection -Setting a value -\end_layout - -\begin_layout Standard -A new value can be set (if entry is writable) using -\begin_inset Quotes sld -\end_inset - -echo -\begin_inset Quotes srd -\end_inset - -: -\end_layout - -\begin_layout Code -# echo "1" >/proc/sys/net/ipv6/conf/all/forwarding -\end_layout - -\begin_layout Subsection -Using -\begin_inset Quotes sld -\end_inset - -sysctl -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -Using the -\begin_inset Quotes sld -\end_inset - -sysctl -\begin_inset Quotes srd -\end_inset - - program to access the kernel switches is a modern method today. - You can use it also, if the /proc-filesystem isn't mounted. - But you have only access to /proc/sys/*! -\end_layout - -\begin_layout Standard -The program -\begin_inset Quotes sld -\end_inset - -sysctl -\begin_inset Quotes srd -\end_inset - - is included in package -\begin_inset Quotes sld -\end_inset - -procps -\begin_inset Quotes srd -\end_inset - - (on Red Hat Linux systems). -\end_layout - -\begin_layout Itemize -The sysctl-interface had to be enabled in kernel, means on compiling following - switch has to be set -\end_layout - -\begin_layout Code -CONFIG_SYSCTL=y -\end_layout - -\begin_layout Subsubsection -Retrieving a value -\end_layout - -\begin_layout Standard -The value of an entry can be retrieved now: -\end_layout - -\begin_layout Code -# sysctl net.ipv6.conf.all.forwarding -\end_layout - -\begin_layout Code -net.ipv6.conf.all.forwarding = 0 -\end_layout - -\begin_layout Subsubsection -Setting a value -\end_layout - -\begin_layout Standard -A new value can be set (if entry is writable): -\end_layout - -\begin_layout Code -# sysctl -w net.ipv6.conf.all.forwarding=1 -\end_layout - -\begin_layout Code -net.ipv6.conf.all.forwarding = 1 -\end_layout - -\begin_layout Standard -Note: Don't use spaces around the -\begin_inset Quotes sld -\end_inset - -= -\begin_inset Quotes srd -\end_inset - - on setting values. - Also on multiple values per line, quote them like e.g. -\end_layout - -\begin_layout Code -# sysctl -w net.ipv4.ip_local_port_range="32768 61000" -\end_layout - -\begin_layout Code -net.ipv4.ip_local_port_range = 32768 61000 -\end_layout - -\begin_layout Subsubsection -Additionals -\end_layout - -\begin_layout Standard -Note: There are sysctl versions in the wild which displaying -\begin_inset Quotes sld -\end_inset - -/ -\begin_inset Quotes srd -\end_inset - - instead of the -\begin_inset Quotes sld -\end_inset - -. -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -For more details take a look into sysctl's manpage. -\end_layout - -\begin_layout Standard -Hint: for digging fast into the settings, use the option -\begin_inset Quotes sld -\end_inset - --a -\begin_inset Quotes srd -\end_inset - - (display all entries) in conjunction with -\begin_inset Quotes sld -\end_inset - -grep -\begin_inset Quotes srd -\end_inset - -. -\end_layout - -\begin_layout Subsection -Values found in /proc-filesystems -\end_layout - -\begin_layout Standard -There are several formats seen in /proc-filesystem: -\end_layout - -\begin_layout Itemize -BOOLEAN: simple a -\begin_inset Quotes sld -\end_inset - -0 -\begin_inset Quotes srd -\end_inset - - (false) or a -\begin_inset Quotes sld -\end_inset - -1 -\begin_inset Quotes srd -\end_inset - - (true) -\end_layout - -\begin_layout Itemize -INTEGER: an integer value, can be unsigned, too -\end_layout - -\begin_layout Itemize -more sophisticated lines with several values: sometimes a header line is - displayed also, if not, have a look into the kernel source to retrieve - information about the meaning of each value... -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "proc-sys-net-ipv6" - -\end_inset - -Entries in /proc/sys/net/ipv6/ -\end_layout - -\begin_layout Subsection -conf/default/* -\end_layout - -\begin_layout Standard -Change the interface-specific default settings. -\end_layout - -\begin_layout Subsection -conf/all/* -\end_layout - -\begin_layout Standard -Change all the interface-specific settings. -\end_layout - -\begin_layout Standard -Exception: -\begin_inset Quotes sld -\end_inset - -conf/all/forwarding -\begin_inset Quotes srd -\end_inset - - has a different meaning here -\end_layout - -\begin_layout Subsubsection -conf/all/forwarding -\end_layout - -\begin_layout Itemize -Type: BOOLEAN -\end_layout - -\begin_layout Standard -This enables global IPv6 forwarding between all interfaces. -\end_layout - -\begin_layout Standard -In IPv6 you can't control forwarding per device, forwarding control has - to be done using IPv6-netfilter (controlled with ip6tables) rulesets and - specify input and output devices (see -\begin_inset CommandInset ref -LatexCommand ref -name "Firewalling/Netfilter6" -reference "firewalling-netfilter6" - -\end_inset - - for more). - This is different to IPv4, where you are able to control forwarding per - device (decision is made on interface where packet came in). -\end_layout - -\begin_layout Standard -This also sets all interfaces' Host/Router setting 'forwarding' to the specified - value. - See below for details. - This referred to as global forwarding. -\end_layout - -\begin_layout Standard -If this value is 0, no IPv6 forwarding is enabled, packets never leave another - interface, neither physical nor logical like e.g. - tunnels. -\end_layout - -\begin_layout Subsection -conf/interface/* -\end_layout - -\begin_layout Standard -Change special settings per interface. -\end_layout - -\begin_layout Standard -The functional behaviour for certain settings is different depending on - whether local forwarding is enabled or not. -\end_layout - -\begin_layout Subsubsection -accept_ra -\end_layout - -\begin_layout Itemize -Type: BOOLEAN -\end_layout - -\begin_layout Itemize -Functional default: enabled if local forwarding is disabled. - disabled if local forwarding is enabled. -\end_layout - -\begin_layout Standard -Accept Router Advertisements, and autoconfigure this interface with received - data. -\end_layout - -\begin_layout Subsubsection -accept_redirects -\end_layout - -\begin_layout Itemize -Type: BOOLEAN -\end_layout - -\begin_layout Itemize -Functional default: enabled if local forwarding is disabled. - disabled if local forwarding is enabled. -\end_layout - -\begin_layout Standard -Accept Redirects sent by an IPv6 router. -\end_layout - -\begin_layout Subsubsection -autoconf -\end_layout - -\begin_layout Itemize -Type: BOOLEAN -\end_layout - -\begin_layout Itemize -Functional default: enabled if accept_ra_pinfo is enabled. - disabled if accept_ra_pinfo is disabled. -\end_layout - -\begin_layout Standard -Autoconfigure addresses using prefix information from router advertisements. -\end_layout - -\begin_layout Subsubsection -dad_transmits -\end_layout - -\begin_layout Itemize -Type: INTEGER -\end_layout - -\begin_layout Itemize -Default: 1 -\end_layout - -\begin_layout Standard -The amount of Duplicate Address Detection probes to send. -\end_layout - -\begin_layout Subsubsection -forwarding -\end_layout - -\begin_layout Itemize -Type: BOOLEAN -\end_layout - -\begin_layout Itemize -Default: FALSE if global forwarding is disabled (default), otherwise TRUE -\end_layout - -\begin_layout Standard -Configure interface-specific Host/Router behaviour. -\end_layout - -\begin_layout Standard -Note: It is recommended to have the same setting on all interfaces; mixed - router/host scenarios are rather uncommon. -\end_layout - -\begin_layout Itemize -Value FALSE: By default, Host behaviour is assumed. - This means: -\end_layout - -\begin_layout Enumerate -IsRouter flag is not set in Neighbour Advertisements. -\end_layout - -\begin_layout Enumerate -Router Solicitations are being sent when necessary. -\end_layout - -\begin_layout Enumerate -If accept_ra is TRUE (default), accept Router Advertisements (and do autoconfigu -ration). -\end_layout - -\begin_layout Enumerate -If accept_redirects is TRUE (default), accept Redirects. -\end_layout - -\begin_layout Itemize -Value TRUE: If local forwarding is enabled, Router behaviour is assumed. - This means exactly the reverse from the above: -\end_layout - -\begin_layout Enumerate -IsRouter flag is set in Neighbour Advertisements. -\end_layout - -\begin_layout Enumerate -Router Solicitations are not sent. -\end_layout - -\begin_layout Enumerate -Router Advertisements are ignored. -\end_layout - -\begin_layout Enumerate -Redirects are ignored. -\end_layout - -\begin_layout Subsubsection -hop_limit -\end_layout - -\begin_layout Itemize -Type: INTEGER -\end_layout - -\begin_layout Itemize -Default: 64 -\end_layout - -\begin_layout Standard -Default Hop Limit to set. -\end_layout - -\begin_layout Subsubsection -mtu -\end_layout - -\begin_layout Itemize -Type: INTEGER -\end_layout - -\begin_layout Itemize -Default: 1280 (IPv6 required minimum) -\end_layout - -\begin_layout Standard -Default Maximum Transfer Unit -\end_layout - -\begin_layout Subsubsection -router_solicitation_delay -\end_layout - -\begin_layout Itemize -Type: INTEGER -\end_layout - -\begin_layout Itemize -Default: 1 -\end_layout - -\begin_layout Standard -Number of seconds to wait after interface is brought up before sending Router - Solicitations. -\end_layout - -\begin_layout Subsubsection -router_solicitation_interval -\end_layout - -\begin_layout Itemize -Type: INTEGER -\end_layout - -\begin_layout Itemize -Default: 4 -\end_layout - -\begin_layout Standard -Number of seconds to wait between Router Solicitations. - -\end_layout - -\begin_layout Subsubsection -router_solicitations -\end_layout - -\begin_layout Itemize -Type: INTEGER -\end_layout - -\begin_layout Itemize -Default: 3 -\end_layout - -\begin_layout Standard -Number of Router Solicitations to send until assuming no routers are present. -\end_layout - -\begin_layout Subsection -neigh/default/* -\end_layout - -\begin_layout Standard -Change default settings for neighbor detection and some special global interval - and threshold values: -\end_layout - -\begin_layout Subsubsection -gc_thresh1 -\end_layout - -\begin_layout Itemize -Type: INTEGER -\end_layout - -\begin_layout Itemize -Default: 128 -\end_layout - -\begin_layout Standard -More to be filled. -\end_layout - -\begin_layout Subsubsection -gc_thresh2 -\end_layout - -\begin_layout Itemize -Type: INTEGER -\end_layout - -\begin_layout Itemize -Default: 512 -\end_layout - -\begin_layout Standard -More to be filled. -\end_layout - -\begin_layout Subsubsection -gc_thresh3 -\end_layout - -\begin_layout Itemize -Type: INTEGER -\end_layout - -\begin_layout Itemize -Default: 1024 -\end_layout - -\begin_layout Standard -Tuning parameter for neighbour table size. -\end_layout - -\begin_layout Standard -Increase this value if you have a lot of interfaces and problem with routes - start to act mysteriously and fail. - Or if a running -\begin_inset CommandInset href -LatexCommand href -name "Zebra (routing daemon)" -target "http://www.zebra.org/" - -\end_inset - - reports: -\end_layout - -\begin_layout Code -ZEBRA: netlink-listen error: No buffer space available, type=RTM_NEWROUTE(24), -\end_layout - -\begin_layout Code -¬ seq=426, pid=0 -\end_layout - -\begin_layout Subsubsection -gc_interval -\end_layout - -\begin_layout Itemize -Type: INTEGER -\end_layout - -\begin_layout Itemize -Default: 30 -\end_layout - -\begin_layout Standard -More to be filled. -\end_layout - -\begin_layout Subsection -neigh/interface/* -\end_layout - -\begin_layout Standard -Change special settings per interface for neighbor detection. -\end_layout - -\begin_layout Subsubsection -anycast_delay -\end_layout - -\begin_layout Itemize -Type: INTEGER -\end_layout - -\begin_layout Itemize -Default: 100 -\end_layout - -\begin_layout Standard -More to be filled. -\end_layout - -\begin_layout Subsubsection -gc_stale_time -\end_layout - -\begin_layout Itemize -Type: INTEGER -\end_layout - -\begin_layout Itemize -Default: 60 -\end_layout - -\begin_layout Standard -More to be filled. -\end_layout - -\begin_layout Subsubsection -proxy_qlen -\end_layout - -\begin_layout Itemize -Type: INTEGER -\end_layout - -\begin_layout Itemize -Default: 64 -\end_layout - -\begin_layout Standard -More to be filled. -\end_layout - -\begin_layout Subsubsection -unres_qlen -\end_layout - -\begin_layout Itemize -Type: INTEGER -\end_layout - -\begin_layout Itemize -Default: 3 -\end_layout - -\begin_layout Standard -More to be filled. -\end_layout - -\begin_layout Subsubsection -app_solicit -\end_layout - -\begin_layout Itemize -Type: INTEGER -\end_layout - -\begin_layout Itemize -Default: 0 -\end_layout - -\begin_layout Standard -More to be filled. -\end_layout - -\begin_layout Subsubsection -locktime -\end_layout - -\begin_layout Itemize -Type: INTEGER -\end_layout - -\begin_layout Itemize -Default: 0 -\end_layout - -\begin_layout Standard -More to be filled. -\end_layout - -\begin_layout Subsubsection -retrans_time -\end_layout - -\begin_layout Itemize -Type: INTEGER -\end_layout - -\begin_layout Itemize -Default: 100 -\end_layout - -\begin_layout Standard -More to be filled. -\end_layout - -\begin_layout Subsubsection -base_reachable_time -\end_layout - -\begin_layout Itemize -Type: INTEGER -\end_layout - -\begin_layout Itemize -Default: 30 -\end_layout - -\begin_layout Standard -More to be filled. -\end_layout - -\begin_layout Subsubsection -mcast_solicit -\end_layout - -\begin_layout Itemize -Type: INTEGER -\end_layout - -\begin_layout Itemize -Default: 3 -\end_layout - -\begin_layout Standard -More to be filled. -\end_layout - -\begin_layout Subsubsection -ucast_solicit -\end_layout - -\begin_layout Itemize -Type: INTEGER -\end_layout - -\begin_layout Itemize -Default: 3 -\end_layout - -\begin_layout Standard -More to be filled -\end_layout - -\begin_layout Subsubsection -delay_first_probe_time -\end_layout - -\begin_layout Itemize -Type: INTEGER -\end_layout - -\begin_layout Itemize -Default: 5 -\end_layout - -\begin_layout Standard -More to be filled. -\end_layout - -\begin_layout Subsubsection -proxy_delay -\end_layout - -\begin_layout Itemize -Type: INTEGER -\end_layout - -\begin_layout Itemize -Default: 80 -\end_layout - -\begin_layout Standard -More to be filled. -\end_layout - -\begin_layout Subsection -route/* -\end_layout - -\begin_layout Standard -Change global settings for routing. -\end_layout - -\begin_layout Subsubsection -flush -\end_layout - -\begin_layout Standard -Removed in newer kernel releases - more to be filled. -\end_layout - -\begin_layout Subsubsection -gc_interval -\end_layout - -\begin_layout Itemize -Type: INTEGER -\end_layout - -\begin_layout Itemize -Default: 30 -\end_layout - -\begin_layout Standard -More to be filled. -\end_layout - -\begin_layout Subsubsection -gc_thresh -\end_layout - -\begin_layout Itemize -Type: INTEGER -\end_layout - -\begin_layout Itemize -Default: 1024 -\end_layout - -\begin_layout Standard -More to be filled. -\end_layout - -\begin_layout Subsubsection -mtu_expires -\end_layout - -\begin_layout Itemize -Type: INTEGER -\end_layout - -\begin_layout Itemize -Default: 600 -\end_layout - -\begin_layout Standard -More to be filled. -\end_layout - -\begin_layout Subsubsection -gc_elasticity -\end_layout - -\begin_layout Itemize -Type: INTEGER -\end_layout - -\begin_layout Itemize -Default: 0 -\end_layout - -\begin_layout Standard -More to be filled. -\end_layout - -\begin_layout Subsubsection -gc_min_interval -\end_layout - -\begin_layout Itemize -Type: INTEGER -\end_layout - -\begin_layout Itemize -Default: 5 -\end_layout - -\begin_layout Standard -More to be filled. -\end_layout - -\begin_layout Subsubsection -gc_timeout -\end_layout - -\begin_layout Itemize -Type: INTEGER -\end_layout - -\begin_layout Itemize -Default: 60 -\end_layout - -\begin_layout Standard -More to be filled. -\end_layout - -\begin_layout Subsubsection -min_adv_mss -\end_layout - -\begin_layout Itemize -Type: INTEGER -\end_layout - -\begin_layout Itemize -Default: 12 -\end_layout - -\begin_layout Standard -More to be filled. -\end_layout - -\begin_layout Subsubsection -max_size -\end_layout - -\begin_layout Itemize -Type: INTEGER -\end_layout - -\begin_layout Itemize -Default: 4096 -\end_layout - -\begin_layout Standard -More to be filled. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "proc-sys-net-ipv4" - -\end_inset - -IPv6-related entries in /proc/sys/net/ipv4/ -\end_layout - -\begin_layout Standard -At the moment (and this will be until IPv4 is completly converted to an - independend kernel module) some switches are also used here for IPv6. -\end_layout - -\begin_layout Subsection -ip_* -\end_layout - -\begin_layout Subsubsection -ip_local_port_range -\end_layout - -\begin_layout Standard -This control setting is used by IPv6 also. -\end_layout - -\begin_layout Subsection -tcp_* -\end_layout - -\begin_layout Standard -This control settings are used by IPv6 also. -\end_layout - -\begin_layout Subsection -icmp_* -\end_layout - -\begin_layout Standard -This control settings are not used by IPv6. - To enable ICMPv6 rate limiting (which is very recommended because of the - capability of ICMPv6 storms) netfilter-v6 rules must be used. -\end_layout - -\begin_layout Subsection -others -\end_layout - -\begin_layout Standard -Unknown, but probably not used by IPv6. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "proc-net" - -\end_inset - -IPv6-related entries in /proc/net/ -\end_layout - -\begin_layout Standard -In /proc/net there are several read-only entries available. - You cannot retrieve information using -\begin_inset Quotes sld -\end_inset - -sysctl -\begin_inset Quotes srd -\end_inset - - here, so use e.g. - -\begin_inset Quotes sld -\end_inset - -cat -\begin_inset Quotes srd -\end_inset - -. -\end_layout - -\begin_layout Subsection -if_inet6 -\end_layout - -\begin_layout Itemize -Type: One line per addresss containing multiple values -\end_layout - -\begin_layout Standard -Here all configured IPv6 addresses are shown in a special format. - The example displays for loopback interface only. - The meaning is shown below (see -\begin_inset Quotes sld -\end_inset - -net/ipv6/addrconf.c -\begin_inset Quotes srd -\end_inset - - for more). -\end_layout - -\begin_layout Code -# cat /proc/net/if_inet6 -\end_layout - -\begin_layout Code -00000000000000000000000000000001 01 80 10 80 lo -\end_layout - -\begin_layout Code -+------------------------------+ ++ ++ ++ ++ ++ -\end_layout - -\begin_layout Code -| | | | | | -\end_layout - -\begin_layout Code -1 2 3 4 5 6 -\end_layout - -\begin_layout Enumerate -IPv6 address displayed in 32 hexadecimal chars without colons as separator -\end_layout - -\begin_layout Enumerate -Netlink device number (interface index) in hexadecimal (see -\begin_inset Quotes sld -\end_inset - -ip addr -\begin_inset Quotes srd -\end_inset - - , too) -\end_layout - -\begin_layout Enumerate -Prefix length in hexadecimal -\end_layout - -\begin_layout Enumerate -Scope value (see kernel source -\begin_inset Quotes sld -\end_inset - - include/net/ipv6.h -\begin_inset Quotes srd -\end_inset - - and -\begin_inset Quotes sld -\end_inset - -net/ipv6/addrconf.c -\begin_inset Quotes srd -\end_inset - - for more) -\end_layout - -\begin_layout Enumerate -Interface flags (see -\begin_inset Quotes sld -\end_inset - -include/linux/rtnetlink.h -\begin_inset Quotes srd -\end_inset - - and -\begin_inset Quotes sld -\end_inset - -net/ipv6/addrconf.c -\begin_inset Quotes srd -\end_inset - - for more) -\end_layout - -\begin_layout Enumerate -Device name -\end_layout - -\begin_layout Subsection -ipv6_route -\end_layout - -\begin_layout Itemize -Type: One line per route containing multiple values -\end_layout - -\begin_layout Standard -Here all configured IPv6 routes are shown in a special format. - The example displays for loopback interface only. - The meaning is shown below (see -\begin_inset Quotes sld -\end_inset - -net/ipv6/route.c -\begin_inset Quotes srd -\end_inset - - for more). -\end_layout - -\begin_layout Code -# cat /proc/net/ipv6_route -\end_layout - -\begin_layout Code -00000000000000000000000000000000 00 00000000000000000000000000000000 00 -\end_layout - -\begin_layout Code -+------------------------------+ ++ +------------------------------+ ++ -\end_layout - -\begin_layout Code -| | | | -\end_layout - -\begin_layout Code -1 2 3 4 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code -¬ 00000000000000000000000000000000 ffffffff 00000001 00000001 00200200 lo -\end_layout - -\begin_layout Code -¬ +------------------------------+ +------+ +------+ +------+ +------+ ++ -\end_layout - -\begin_layout Code -¬ | | | | | | -\end_layout - -\begin_layout Code -¬ 5 6 7 8 9 10 -\end_layout - -\begin_layout Enumerate -IPv6 destination network displayed in 32 hexadecimal chars without colons - as separator -\end_layout - -\begin_layout Enumerate -IPv6 destination prefix length in hexadecimal -\end_layout - -\begin_layout Enumerate -IPv6 source network displayed in 32 hexadecimal chars without colons as - separator -\end_layout - -\begin_layout Enumerate -IPv6 source prefix length in hexadecimal -\end_layout - -\begin_layout Enumerate -IPv6 next hop displayed in 32 hexadecimal chars without colons as separator -\end_layout - -\begin_layout Enumerate -Metric in hexadecimal -\end_layout - -\begin_layout Enumerate -Reference counter -\end_layout - -\begin_layout Enumerate -Use counter -\end_layout - -\begin_layout Enumerate -Flags -\end_layout - -\begin_layout Enumerate -Device name -\end_layout - -\begin_layout Subsection -sockstat6 -\end_layout - -\begin_layout Itemize -Type: One line per protocol with description and value -\end_layout - -\begin_layout Standard -Statistics about used IPv6 sockets. - Example: -\end_layout - -\begin_layout Code -# cat /proc/net/sockstat6 -\end_layout - -\begin_layout Code -TCP6: inuse 7 -\end_layout - -\begin_layout Code -UDP6: inuse 2 -\end_layout - -\begin_layout Code -RAW6: inuse 1 -\end_layout - -\begin_layout Code -FRAG6: inuse 0 memory 0 -\end_layout - -\begin_layout Subsection -tcp6 -\end_layout - -\begin_layout Standard -To be filled. -\end_layout - -\begin_layout Subsection -udp6 -\end_layout - -\begin_layout Standard -To be filled. -\end_layout - -\begin_layout Subsection -igmp6 -\end_layout - -\begin_layout Standard -To be filled. -\end_layout - -\begin_layout Subsection -raw6 -\end_layout - -\begin_layout Standard -To be filled. -\end_layout - -\begin_layout Subsection -ip6_flowlabel -\end_layout - -\begin_layout Standard -To be filled. -\end_layout - -\begin_layout Subsection -rt6_stats -\end_layout - -\begin_layout Standard -To be filled. -\end_layout - -\begin_layout Subsection -snmp6 -\end_layout - -\begin_layout Itemize -Type: One line per SNMP description and value -\end_layout - -\begin_layout Standard -SNMP statistics, can be retrieved via SNMP server and related MIB table - by network management software. -\end_layout - -\begin_layout Subsection -ip6_tables_names -\end_layout - -\begin_layout Standard -Available netfilter6 tables -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "netlink" - -\end_inset - -Netlink-Interface to kernel -\end_layout - -\begin_layout Standard -To be filled...I have no experience with that... -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "resolver" - -\end_inset - -Address Resolver & Selection -\end_layout - -\begin_layout Standard -Additional info can be found at -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Linux & IPv6: getaddrinfo and search domains - Research" -target "http://www.bieringer.de/linux/IPv6/getaddrinfo/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "RFC 3484 on Linux" -target "http://people.redhat.com/drepper/linux-rfc3484.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Karl Auer's Blog: -\begin_inset CommandInset href -LatexCommand href -name "Controlling IPv6 source address selection" -target "http://biplane.com.au/blog/?p=30" - -\end_inset - - , -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Source Address Selection - what, why, how" -target "http://biplane.com.au/blog/?p=22" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Into6: -\begin_inset CommandInset href -LatexCommand href -name "/etc/gai.conf - it ain't what you think it is" -target "http://into6.com.au/?p=288" - -\end_inset - - -\end_layout - -\begin_layout Section* -Address Resolver & Destination Address Selection -\end_layout - -\begin_layout Standard -Name to IPv4 or IPv6 address resolving is usually done using a libc resolver - library. - Usually the function -\emph on -getaddrinfo -\emph default - is used for that. - In case of more than one IPv6 address is returned, according to -\begin_inset CommandInset href -LatexCommand href -name "RFC 3484 / Default Address Selection for Internet Protocol version 6" -target "http://www.faqs.org/rfcs/rfc3484.html" - -\end_inset - - a sorting should be applied, which can be optionally configured. -\end_layout - -\begin_layout Standard -The -\begin_inset Quotes sld -\end_inset - -magic -\begin_inset Quotes srd -\end_inset - - is controlled by a file named /etc/gai.conf (it can be that it is empty - or missing by default). - Default is usually somewhere stored in documentation, see -\begin_inset Quotes sld -\end_inset - -man gai.conf -\begin_inset Quotes srd -\end_inset - - or e.g. - /usr/share/doc/glibc-common/gai.conf. -\end_layout - -\begin_layout Standard -For controlling sort order by configuration following are needed for testing: -\end_layout - -\begin_layout Itemize -A host in DNS returning more than one IPv6 address, e.g. -\end_layout - -\begin_layout Code -$ dig +short aaaa st1.bieringer.de -\end_layout - -\begin_layout Code -2001:4dd0:ff00:834::2 -\end_layout - -\begin_layout Code -2a01:238:423d:8800:85b3:9e6b:3019:8909 -\end_layout - -\begin_layout Itemize -Lookup via DNS (/etc/hosts won't work) -\end_layout - -\begin_layout Itemize -/etc/gai.conf with proper config, e.g. -\end_layout - -\begin_layout Code -precedence ::1/128 50 # default -\end_layout - -\begin_layout Code -precedence ::/0 40 # default -\end_layout - -\begin_layout Code -precedence 2002::/16 30 # default -\end_layout - -\begin_layout Code -precedence ::/96 20 # default -\end_layout - -\begin_layout Code -precedence ::ffff:0:0/96 10 # default -\end_layout - -\begin_layout Code -precedence 2001:4dd0:ff00:834::/64 80 # dst-A -\end_layout - -\begin_layout Code -precedence 2a01:238:423d:8800::/64 90 # dst-B -\end_layout - -\begin_layout Itemize -For tests use e.g. - telnet client -\end_layout - -\begin_layout Code -$ telnet st1.bieringer.de -\end_layout - -\begin_layout Code -Trying 2a01:238:423d:8800:85b3:9e6b:3019:8909... - (dst-B) -\end_layout - -\begin_layout Code -... -\end_layout - -\begin_layout Code -Trying 2001:4dd0:ff00:834::2... - (dst-A) -\end_layout - -\begin_layout Code -... -\end_layout - -\begin_layout Itemize -If precedence is changed in configuration -\end_layout - -\begin_layout Code -precedence 2001:4dd0:ff00:834::/64 90 # dst-A ex 80 -\end_layout - -\begin_layout Code -precedence 2a01:238:423d:8800::/64 80 # dst-B ex 90 -\end_layout - -\begin_layout Itemize -The order is changed accordingly -\end_layout - -\begin_layout Code -$ telnet st1.bieringer.de -\end_layout - -\begin_layout Code -Trying 2001:4dd0:ff00:834::2... - (dst-A) -\end_layout - -\begin_layout Code -... -\end_layout - -\begin_layout Code -Trying 2a01:238:423d:8800:85b3:9e6b:3019:8909... - (dst-B) -\end_layout - -\begin_layout Code -... -\end_layout - -\begin_layout Section* -Source Address Selection -\end_layout - -\begin_layout Standard -Source address selection in Linux is done automatically by kernel and usually - only using information from routing tables and try to match the same scope - of address. -\end_layout - -\begin_layout Subsection* -Source Address Selection with -\begin_inset Quotes sld -\end_inset - -ip addrlabel -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -With extension of internal -\begin_inset Quotes sld -\end_inset - -ip addrlabel -\begin_inset Quotes srd -\end_inset - - a source address can be bound to a destination address (e.g. - selected via mechanisms above). - Binding means here: -\begin_inset Quotes sld -\end_inset - -same label -\begin_inset Quotes srd -\end_inset - - (label is a number). -\end_layout - -\begin_layout Itemize -Default of -\begin_inset Quotes sld -\end_inset - -ip addrlabel -\begin_inset Quotes srd -\end_inset - - (here on CentOS 6): -\end_layout - -\begin_layout Code -# ip addrlabel -\end_layout - -\begin_layout Code -prefix ::1/128 label 0 -\end_layout - -\begin_layout Code -prefix ::/96 label 3 -\end_layout - -\begin_layout Code -prefix ::ffff:0.0.0.0/96 label 4 -\end_layout - -\begin_layout Code -prefix 2001::/32 label 6 -\end_layout - -\begin_layout Code -prefix 2001:10::/28 label 7 -\end_layout - -\begin_layout Code -prefix 2002::/16 label 2 -\end_layout - -\begin_layout Code -prefix fc00::/7 label 5 -\end_layout - -\begin_layout Code -prefix ::/0 label 1 -\end_layout - -\begin_layout Itemize -System is multihomed (here on one interface), router provides 2 prefixes - via radvd: -\end_layout - -\begin_layout Code -# ip -6 addr show dev eth1 | grep -w inet6 |grep -w global -\end_layout - -\begin_layout Code - inet6 2001:6f8:12d8:2:5054:ff:fefb:6582/64 scope global dynamic -\end_layout - -\begin_layout Code - inet6 2001:6f8:900:8cbc:5054:ff:fefb:6582/64 scope global dynamic -\end_layout - -\begin_layout Itemize -Connect now to server (shown above) -\end_layout - -\begin_layout Code -$ telnet st1.bieringer.de -\end_layout - -\begin_layout Code -Trying 2001:4dd0:ff00:834::2... - (dst-A) -\end_layout - -\begin_layout Code -... -\end_layout - -\begin_layout Code -Trying 2a01:238:423d:8800:85b3:9e6b:3019:8909... - (dst-B) -\end_layout - -\begin_layout Code -... -\end_layout - -\begin_layout Itemize -Related tcpdump with filter -\begin_inset Quotes sld -\end_inset - -tcp and dst port 23 -\begin_inset Quotes srd -\end_inset - - shows only the use of the upper local source IPv6 address -\end_layout - -\begin_layout Code -IP6 2001:6f8:12d8:2:5054:ff:fefb:6582.37762 > 2001:4dd0:ff00:834::2.telnet: - (src-A -> dst-A) -\end_layout - -\begin_layout Code -IP6 2001:6f8:12d8:2:5054:ff:fefb:6582.45754 > 2a01:238:423d:8800:85b3:9e6b:3019:8 -909.telnet: (src-A -> dst-B) -\end_layout - -\begin_layout Itemize -Binding now source and destination with -\begin_inset Quotes sld -\end_inset - -ip addrlabel -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Code -# ip addrlabel add prefix 2001:6f8:12d8:2::/64 label 200 -\end_layout - -\begin_layout Code -# ip addrlabel add prefix 2001:6f8:900:8cbc::/64 label 300 -\end_layout - -\begin_layout Code -# ip addrlabel add prefix 2001:4dd0:ff00:834::/64 label 200 -\end_layout - -\begin_layout Code -# ip addrlabel add prefix 2a01:238:423d:8800::/64 label 300 -\end_layout - -\begin_layout Itemize -Resulting -\begin_inset Quotes sld -\end_inset - -ip addrlabel -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Code -# ip addrlabel -\end_layout - -\begin_layout Code -prefix ::1/128 label 0 -\end_layout - -\begin_layout Code -prefix ::/96 label 3 -\end_layout - -\begin_layout Code -prefix ::ffff:0.0.0.0/96 label 4 -\end_layout - -\begin_layout Code -prefix 2a01:238:423d:8800::/64 label 300 # dst-B -\end_layout - -\begin_layout Code -prefix 2001:4dd0:ff00:834::/64 label 200 # dst-A -\end_layout - -\begin_layout Code -prefix 2001:6f8:900:8cbc::/64 label 300 # src-B -\end_layout - -\begin_layout Code -prefix 2001:6f8:12d8:2::/64 label 200 # src-A -\end_layout - -\begin_layout Code -prefix 2001::/32 label 6 -\end_layout - -\begin_layout Code -prefix 2001:10::/28 label 7 -\end_layout - -\begin_layout Code -prefix 2002::/16 label 2 -\end_layout - -\begin_layout Code -prefix fc00::/7 label 5 -\end_layout - -\begin_layout Code -prefix ::/0 label 1 -\end_layout - -\begin_layout Itemize -Connect now to server again -\end_layout - -\begin_layout Code -$ telnet st1.bieringer.de -\end_layout - -\begin_layout Code -Trying 2001:4dd0:ff00:834::2... - (dst-A) -\end_layout - -\begin_layout Code -... -\end_layout - -\begin_layout Code -Trying 2a01:238:423d:8800:85b3:9e6b:3019:8909... - (dst-B) -\end_layout - -\begin_layout Code -... -\end_layout - -\begin_layout Itemize -Related tcpdump with filter -\begin_inset Quotes sld -\end_inset - -tcp and dst port 23 -\begin_inset Quotes srd -\end_inset - - shows now the use of both local source IPv6 addresses according to the - configured pairs A and B -\end_layout - -\begin_layout Code -IP6 2001:6f8:12d8:2:5054:ff:fefb:6582.37765 > 2001:4dd0:ff00:834::2.telnet: - (src-A -> dst-A) -\end_layout - -\begin_layout Code -IP6 2001:6f8:900:8cbc:5054:ff:fefb:6582.39632 > 2a01:238:423d:8800:85b3:9e6b:3019 -:8909.telnet: (src-B -> dst-B) -\end_layout - -\begin_layout Standard -Setup of persistent -\begin_inset Quotes sld -\end_inset - -ip addrtable -\begin_inset Quotes srd -\end_inset - - is probably currently not supported by Linux distributions, so extension - of network init scripts or rc.local must be used for that. - A script which uses information from /etc/gai.conf and configure -\begin_inset Quotes sld -\end_inset - -ip addrtable -\begin_inset Quotes srd -\end_inset - - accordingly can be found here: -\begin_inset CommandInset href -LatexCommand href -name "/etc/gai.conf - it ain't what you think it is" -target "http://into6.com.au/?p=288" - -\end_inset - - -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "network-debugging" - -\end_inset - -Network debugging -\end_layout - -\begin_layout Section -Server socket binding -\end_layout - -\begin_layout Subsection -Using -\begin_inset Quotes sld -\end_inset - -netstat -\begin_inset Quotes srd -\end_inset - - for server socket binding check -\end_layout - -\begin_layout Standard -It's always interesting which server sockets are currently active on a node. - Using -\begin_inset Quotes sld -\end_inset - -netstat -\begin_inset Quotes srd -\end_inset - - is a short way to get such information: -\end_layout - -\begin_layout Standard -Used options: -nlptu -\end_layout - -\begin_layout Standard -Example: -\end_layout - -\begin_layout Code -# netstat -nlptu -\end_layout - -\begin_layout Code -Active Internet connections (only servers) -\end_layout - -\begin_layout Code -Proto Recv-Q Send-Q Local Address Foreign Address State - -\end_layout - -\begin_layout Code -¬ PID/Program name -\end_layout - -\begin_layout Code -tcp 0 0 0.0.0.0:32768 0.0.0.0:* LISTEN - -\end_layout - -\begin_layout Code -¬ 1258/rpc.statd -\end_layout - -\begin_layout Code -tcp 0 0 0.0.0.0:32769 0.0.0.0:* LISTEN - -\end_layout - -\begin_layout Code -¬ 1502/rpc.mountd -\end_layout - -\begin_layout Code -tcp 0 0 0.0.0.0:515 0.0.0.0:* LISTEN - -\end_layout - -\begin_layout Code -¬ 22433/lpd Waiting -\end_layout - -\begin_layout Code -tcp 0 0 1.2.3.1:139 0.0.0.0:* LISTEN - -\end_layout - -\begin_layout Code -¬ 1746/smbd -\end_layout - -\begin_layout Code -tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN - -\end_layout - -\begin_layout Code -¬ 1230/portmap -\end_layout - -\begin_layout Code -tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN - -\end_layout - -\begin_layout Code -¬ 3551/X -\end_layout - -\begin_layout Code -tcp 0 0 1.2.3.1:8081 0.0.0.0:* LISTEN - -\end_layout - -\begin_layout Code -¬ 18735/junkbuster -\end_layout - -\begin_layout Code -tcp 0 0 1.2.3.1:3128 0.0.0.0:* LISTEN - -\end_layout - -\begin_layout Code -¬ 18822/(squid) -\end_layout - -\begin_layout Code -tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN - -\end_layout - -\begin_layout Code -¬ 30734/named -\end_layout - -\begin_layout Code -tcp 0 0 ::ffff:1.2.3.1:993 :::* LISTEN - -\end_layout - -\begin_layout Code -¬ 6742/xinetd-ipv6 -\end_layout - -\begin_layout Code -tcp 0 0 :::13 :::* LISTEN - -\end_layout - -\begin_layout Code -¬ 6742/xinetd-ipv6 -\end_layout - -\begin_layout Code -tcp 0 0 ::ffff:1.2.3.1:143 :::* LISTEN - -\end_layout - -\begin_layout Code -¬ 6742/xinetd-ipv6 -\end_layout - -\begin_layout Code -tcp 0 0 :::53 :::* LISTEN - -\end_layout - -\begin_layout Code -¬ 30734/named -\end_layout - -\begin_layout Code -tcp 0 0 :::22 :::* LISTEN - -\end_layout - -\begin_layout Code -¬ 1410/sshd -\end_layout - -\begin_layout Code -tcp 0 0 :::6010 :::* LISTEN - -\end_layout - -\begin_layout Code -¬ 13237/sshd -\end_layout - -\begin_layout Code -udp 0 0 0.0.0.0:32768 0.0.0.0:* - -\end_layout - -\begin_layout Code -¬ 1258/rpc.statd -\end_layout - -\begin_layout Code -udp 0 0 0.0.0.0:2049 0.0.0.0:* - -\end_layout - -\begin_layout Code -¬ - -\end_layout - -\begin_layout Code -udp 0 0 0.0.0.0:32770 0.0.0.0:* - -\end_layout - -\begin_layout Code -¬ 1502/rpc.mountd -\end_layout - -\begin_layout Code -udp 0 0 0.0.0.0:32771 0.0.0.0:* - -\end_layout - -\begin_layout Code -¬ - -\end_layout - -\begin_layout Code -udp 0 0 1.2.3.1:137 0.0.0.0:* - -\end_layout - -\begin_layout Code -¬ 1751/nmbd -\end_layout - -\begin_layout Code -udp 0 0 0.0.0.0:137 0.0.0.0:* - -\end_layout - -\begin_layout Code -¬ 1751/nmbd -\end_layout - -\begin_layout Code -udp 0 0 1.2.3.1:138 0.0.0.0:* - -\end_layout - -\begin_layout Code -¬ 1751/nmbd -\end_layout - -\begin_layout Code -udp 0 0 0.0.0.0:138 0.0.0.0:* - -\end_layout - -\begin_layout Code -¬ 1751/nmbd -\end_layout - -\begin_layout Code -udp 0 0 0.0.0.0:33044 0.0.0.0:* - -\end_layout - -\begin_layout Code -¬ 30734/named -\end_layout - -\begin_layout Code -udp 0 0 1.2.3.1:53 0.0.0.0:* - -\end_layout - -\begin_layout Code -¬ 30734/named -\end_layout - -\begin_layout Code -udp 0 0 127.0.0.1:53 0.0.0.0:* - -\end_layout - -\begin_layout Code -¬ 30734/named -\end_layout - -\begin_layout Code -udp 0 0 0.0.0.0:67 0.0.0.0:* - -\end_layout - -\begin_layout Code -¬ 1530/dhcpd -\end_layout - -\begin_layout Code -udp 0 0 0.0.0.0:67 0.0.0.0:* - -\end_layout - -\begin_layout Code -¬ 1530/dhcpd -\end_layout - -\begin_layout Code -udp 0 0 0.0.0.0:32858 0.0.0.0:* - -\end_layout - -\begin_layout Code -¬ 18822/(squid) -\end_layout - -\begin_layout Code -udp 0 0 0.0.0.0:4827 0.0.0.0:* - -\end_layout - -\begin_layout Code -¬ 18822/(squid) -\end_layout - -\begin_layout Code -udp 0 0 0.0.0.0:111 0.0.0.0:* - -\end_layout - -\begin_layout Code -¬ 1230/portmap -\end_layout - -\begin_layout Code -udp 0 0 :::53 :::* - -\end_layout - -\begin_layout Code -¬ 30734/named -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "examples-tcpdump" - -\end_inset - -Examples for tcpdump packet dumps -\end_layout - -\begin_layout Standard -Here some examples of captured packets are shown, perhaps useful for your - own debugging... -\end_layout - -\begin_layout Standard -...more coming next... -\end_layout - -\begin_layout Subsection -Router discovery -\end_layout - -\begin_layout Subsubsection -Router advertisement -\end_layout - -\begin_layout Code -15:43:49.484751 fe80::212:34ff:fe12:3450 > ff02::1: icmp6: router -\end_layout - -\begin_layout Code -¬ advertisement(chlim=64, router_ltime=30, reachable_time=0, -\end_layout - -\begin_layout Code -¬ retrans_time=0)(prefix info: AR valid_ltime=30, preffered_ltime=20, -\end_layout - -\begin_layout Code -¬ prefix=2002:0102:0304:1::/64)(prefix info: LAR valid_ltime=2592000, -\end_layout - -\begin_layout Code -¬ preffered_ltime=604800, prefix=2001:0db8:0:1::/64)(src lladdr: -\end_layout - -\begin_layout Code -¬ 0:12:34:12:34:50) (len 88, hlim 255) -\end_layout - -\begin_layout Standard -Router with link-local address -\begin_inset Quotes sld -\end_inset - -fe80::212:34ff:fe12:3450 -\begin_inset Quotes srd -\end_inset - - send an advertisement to the all-node-on-link multicast address -\begin_inset Quotes sld -\end_inset - -ff02::1 -\begin_inset Quotes srd -\end_inset - - containing two prefixes -\begin_inset Quotes sld -\end_inset - -2002:0102:0304:1::/64 -\begin_inset Quotes srd -\end_inset - - (lifetime 30 s) and -\begin_inset Quotes sld -\end_inset - -2001:0db8:0:1::/64 -\begin_inset Quotes srd -\end_inset - - (lifetime 2592000 s) including its own layer 2 MAC address -\begin_inset Quotes sld -\end_inset - -0:12:34:12:34:50 -\begin_inset Quotes srd -\end_inset - -. -\end_layout - -\begin_layout Subsubsection -Router solicitation -\end_layout - -\begin_layout Code -15:44:21.152646 fe80::212:34ff:fe12:3456 > ff02::2: icmp6: router solicitation -\end_layout - -\begin_layout Code -¬ (src lladdr: 0:12:34:12:34:56) (len 16, hlim 255) -\end_layout - -\begin_layout Standard -Node with link-local address -\begin_inset Quotes sld -\end_inset - -fe80::212:34ff:fe12:3456 -\begin_inset Quotes srd -\end_inset - - and layer 2 MAC address -\begin_inset Quotes sld -\end_inset - -0:12:34:12:34:56 -\begin_inset Quotes srd -\end_inset - - is looking for a router on-link, therefore sending this solicitation to - the all-router-on-link multicast address -\begin_inset Quotes sld -\end_inset - -ff02::2 -\begin_inset Quotes srd -\end_inset - -. -\end_layout - -\begin_layout Subsection -Neighbor discovery -\end_layout - -\begin_layout Subsubsection -Neighbor discovery solicitation for duplicate address detection -\end_layout - -\begin_layout Standard -Following packets are sent by a node with layer 2 MAC address -\begin_inset Quotes sld -\end_inset - -0:12:34:12:34:56 -\begin_inset Quotes srd -\end_inset - - during autoconfiguration to check whether a potential address is already - used by another node on the link sending this to the solicited-node link-local - multicast address. -\end_layout - -\begin_layout Itemize -Node wants to configure its link-local address -\begin_inset Quotes sld -\end_inset - -fe80::212:34ff:fe12:3456 -\begin_inset Quotes srd -\end_inset - -, checks for duplicate now -\end_layout - -\begin_layout Code -15:44:17.712338 :: > ff02::1:ff12:3456: icmp6: neighbor sol: who has -\end_layout - -\begin_layout Code -¬ fe80::212:34ff:fe12:3456(src lladdr: 0:12:34:12:34:56) (len 32, hlim 255) -\end_layout - -\begin_layout Itemize -Node wants to configure its global address -\begin_inset Quotes sld -\end_inset - -2002:0102:0304:1:212:34ff:fe12:3456 -\begin_inset Quotes srd -\end_inset - - (after receiving advertisement shown above), checks for duplicate now -\end_layout - -\begin_layout Code -15:44:21.905596 :: > ff02::1:ff12:3456: icmp6: neighbor sol: who has -\end_layout - -\begin_layout Code -¬ 2002:0102:0304:1:212:34ff:fe12:3456(src lladdr: 0:12:34:12:34:56) (len - 32, -\end_layout - -\begin_layout Code -¬ hlim 255) -\end_layout - -\begin_layout Itemize -Node wants to configure its global address -\begin_inset Quotes sld -\end_inset - -2001:0db8:0:1:212:34ff:fe12:3456 -\begin_inset Quotes srd -\end_inset - - (after receiving advertisement shown above), checks for duplicate now -\end_layout - -\begin_layout Code -15:44:22.304028 :: > ff02::1:ff12:3456: icmp6: neighbor sol: who has -\end_layout - -\begin_layout Code -¬ 2001:0db8:0:1:212:34ff:fe12:3456(src lladdr: 0:12:34:12:34:56) (len 32, - hlim -\end_layout - -\begin_layout Code -¬ 255) -\end_layout - -\begin_layout Subsubsection -Neighbor discovery solicitation for looking for host or gateway -\end_layout - -\begin_layout Itemize -Node wants to send packages to -\begin_inset Quotes sld -\end_inset - -2001:0db8:0:1::10 -\begin_inset Quotes srd -\end_inset - - but has no layer 2 MAC address to send packet, so send solicitation now -\end_layout - -\begin_layout Code -13:07:47.664538 2002:0102:0304:1:2e0:18ff:fe90:9205 > ff02::1:ff00:10: icmp6: -\end_layout - -\begin_layout Code -¬ neighbor sol: who has 2001:0db8:0:1::10(src lladdr: 0:e0:18:90:92:5) (len - 32, -\end_layout - -\begin_layout Code -¬ hlim 255) -\end_layout - -\begin_layout Itemize -Node looks for -\begin_inset Quotes sld -\end_inset - -fe80::10 -\begin_inset Quotes srd -\end_inset - - now -\end_layout - -\begin_layout Code -13:11:20.870070 fe80::2e0:18ff:fe90:9205 > ff02::1:ff00:10: icmp6: neighbor -\end_layout - -\begin_layout Code -¬ sol: who has fe80::10(src lladdr: 0:e0:18:90:92:5) (len 32, hlim 255) -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-support-persistent-configuration" - -\end_inset - -Support for persistent IPv6 configuration in Linux distributions -\end_layout - -\begin_layout Standard -Some Linux distribution contain already support of a persistent IPv6 configurati -on using existing or new configuration and script files and some hook in - the IPv4 script files. -\end_layout - -\begin_layout Section -Red Hat Linux and -\begin_inset Quotes sld -\end_inset - -clones -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -Since starting writing the -\begin_inset CommandInset href -LatexCommand href -name "IPv6 & Linux - HowTo" -target "http://www.bieringer.de/linux/IPv6/" - -\end_inset - - it was my intention to enable a persistent IPv6 configuration which catch - most of the wished cases like host-only, router-only, dual-homed-host, - router with second stub network, normal tunnels, 6to4 tunnels, and so on. - Nowadays there exists a set of configuration and script files which do - the job very well (never heard about real problems, but I don't know how - many use the set). - Because this configuration and script files are extended from time to time, - they got their own homepage: -\begin_inset CommandInset href -LatexCommand href -name "initscripts-ipv6 homepage" -target "http://www.deepspace6.net/projects/initscripts-ipv6.html" - -\end_inset - - ( -\begin_inset CommandInset href -LatexCommand href -name "Mirror" -target "http://mirrors.bieringer.de/www.deepspace6.net/projects/initscripts-ipv6.html" - -\end_inset - -). - Because I began my IPv6 experience using a Red Hat Linux 5.0 clone, my IPv6 - development systems are mostly Red Hat Linux based now, it's kind a logic - that the scripts are developed for this kind of distribution (so called - -\emph on -historic issue -\emph default -). - Also it was very easy to extend some configuration files, create new ones - and create some simple hook for calling IPv6 setup during IPv4 setup. -\end_layout - -\begin_layout Standard -Fortunately, in Red Hat Linux since 7.1 a snapshot of my IPv6 scripts is - included, this was and is still further on assisted by Pekka Savola. -\end_layout - -\begin_layout Standard -Mandrake since version 8.0 also includes an IPv6-enabled initscript package, - but a minor bug still prevents usage ( -\begin_inset Quotes sld -\end_inset - -ifconfig -\begin_inset Quotes srd -\end_inset - - misses -\begin_inset Quotes sld -\end_inset - -inet6 -\begin_inset Quotes srd -\end_inset - - before -\begin_inset Quotes sld -\end_inset - -add -\begin_inset Quotes srd -\end_inset - -). -\end_layout - -\begin_layout Subsection -Test for IPv6 support of network configuration scripts -\end_layout - -\begin_layout Standard -You can test, whether your Linux distribution contain support for persistent - IPv6 configuration using my set. - Following script library should exist: -\end_layout - -\begin_layout Code -/etc/sysconfig/network-scripts/network-functions-ipv6 -\end_layout - -\begin_layout Standard -Auto-magically test: -\end_layout - -\begin_layout Code -# test -f /etc/sysconfig/network-scripts/network-functions-ipv6 && echo - "Main -\end_layout - -\begin_layout Code -¬ IPv6 script library exists" -\end_layout - -\begin_layout Standard -The version of the library is important if you miss some features. - You can get it executing following (or easier look at the top of the file): -\end_layout - -\begin_layout Code -# source /etc/sysconfig/network-scripts/network-functions-ipv6 && -\end_layout - -\begin_layout Code -¬ getversion_ipv6_functions -\end_layout - -\begin_layout Code -20011124 -\end_layout - -\begin_layout Standard -In shown example, the used version is -\series bold -20011124 -\series default -. - Check this against latest information on -\begin_inset CommandInset href -LatexCommand href -name "initscripts-ipv6 homepage" -target "http://www.deepspace6.net/projects/initscripts-ipv6.html" - -\end_inset - - ( -\begin_inset CommandInset href -LatexCommand href -name "Mirror" -target "http://mirrors.bieringer.de/www.deepspace6.net/projects/initscripts-ipv6.html" - -\end_inset - -) to see what has been changed. - You will find there also a change-log. -\end_layout - -\begin_layout Subsection -Short hint for enabling IPv6 on current RHL 7.1, 7.2, 7.3, ... -\end_layout - -\begin_layout Itemize -Check whether running system has already IPv6 module loaded -\end_layout - -\begin_layout Code -# modprobe -c | grep net-pf-10 -\end_layout - -\begin_layout Code -alias net-pf-10 off -\end_layout - -\begin_layout Itemize -If result is -\begin_inset Quotes sld -\end_inset - -off -\begin_inset Quotes srd -\end_inset - -, then enable IPv6 networking by editing /etc/sysconfig/network, add following - new line -\end_layout - -\begin_layout Code -NETWORKING_IPV6=yes -\end_layout - -\begin_layout Itemize -Reboot or restart networking using -\end_layout - -\begin_layout Code -# service network restart -\end_layout - -\begin_layout Itemize -Now IPv6 module should be loaded -\end_layout - -\begin_layout Code -# modprobe -c | grep ipv6 -\end_layout - -\begin_layout Code -alias net-pf-10 ipv6 -\end_layout - -\begin_layout Standard -If your system is on a link which provides router advertisement, autoconfigurati -on will be done automatically. - For more information which settings are supported see /usr/share/doc/initscript -s-$version/sysconfig.txt. -\end_layout - -\begin_layout Section -SuSE Linux -\end_layout - -\begin_layout Standard -In newer 7.x versions there is a really rudimentary support available, see - /etc/rc.config for details. -\end_layout - -\begin_layout Standard -Because of the really different configuration and script file structure - it is hard (or impossible) to use the set for Red Hat Linux and clones - with this distribution. -\begin_inset Newline newline -\end_inset - -In versions 8.x they completly change their configuration setup. - -\end_layout - -\begin_layout Subsection -SuSE Linux 7.3 -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "How to setup 6to4 IPv6 with SuSE 7.3" -target "http://www.feyrer.de/IPv6/SuSE73-IPv6+6to4-setup.html" - -\end_inset - - -\end_layout - -\begin_layout Subsection -SuSE Linux 8.0 -\end_layout - -\begin_layout Subsubsection -IPv6 address configuration -\end_layout - -\begin_layout Standard -Edit file /etc/sysconfig/network/ifcfg- and setup following - value -\end_layout - -\begin_layout Code -IP6ADDR="/" -\end_layout - -\begin_layout Subsubsection -Additional information -\end_layout - -\begin_layout Standard -See file /usr/share/doc/packages/sysconfig/README -\end_layout - -\begin_layout Subsection -SuSE Linux 8.1 -\end_layout - -\begin_layout Subsubsection -IPv6 address configuration -\end_layout - -\begin_layout Standard -Edit file /etc/sysconfig/network/ifcfg- and setup following - value -\end_layout - -\begin_layout Code -IPADDR="/" -\end_layout - -\begin_layout Subsubsection -Additional information -\end_layout - -\begin_layout Standard -See file /usr/share/doc/packages/sysconfig/Network -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "Configuration-Debian-Linux" - -\end_inset - -Debian Linux -\end_layout - -\begin_layout Standard -Following information was contributed by Stephane Bortzmeyer -\end_layout - -\begin_layout Enumerate -Be sure that IPv6 is loaded, either because it is compiled into the kernel - or because the module is loaded. - For the latest, three solutions, adding it to /etc/modules, using the pre-up - trick shown later or using kmod (not detailed here). -\end_layout - -\begin_layout Enumerate -Configure your interface. - Here we assume eth0 and address (2001:0db8:1234:5::1:1). - Edit /etc/network/interfaces: -\end_layout - -\begin_layout Code -iface eth0 inet6 static -\end_layout - -\begin_layout Code - pre-up modprobe ipv6 -\end_layout - -\begin_layout Code - address 2001:0db8:1234:5::1:1 -\end_layout - -\begin_layout Code - # To suppress completely autoconfiguration: -\end_layout - -\begin_layout Code - # up echo 0 > /proc/sys/net/ipv6/conf/all/autoconf -\end_layout - -\begin_layout Code - netmask 64 -\end_layout - -\begin_layout Code - # The router is autoconfigured and has no fixed address. -\end_layout - -\begin_layout Code - # It is magically -\end_layout - -\begin_layout Code - # found. - (/proc/sys/net/ipv6/conf/all/accept_ra). - Otherwise: -\end_layout - -\begin_layout Code - #gateway 2001:0db8:1234:5::1 -\end_layout - -\begin_layout Standard -And you reboot or you just -\end_layout - -\begin_layout Code -# ifup --force eth0 -\end_layout - -\begin_layout Standard -and you have your static address. - -\end_layout - -\begin_layout Subsection -Further information -\end_layout - -\begin_layout Itemize - -\lang ngerman -\begin_inset CommandInset href -LatexCommand href -name "IPv6 with Debian Linux" -target "http://ipv6.debian.net/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Jean-Marc V. - Liotier's -\begin_inset CommandInset href -LatexCommand href -name "HOWTO for Freenet6 & Debian Users" -target "http://www.ruwenzori.net/ipv6/Jims_LAN_IPv6_global_connectivity_howto.html" - -\end_inset - - (announced 24.12.2002 on -\begin_inset CommandInset ref -LatexCommand ref -name "mailinglist" -reference "information-maillists" - -\end_inset - - users@ipv6.org ) -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-autoconfiguration" - -\end_inset - -Auto-configuration -\end_layout - -\begin_layout Section -Stateless auto-configuration out-of-the-box -\end_layout - -\begin_layout Standard -Is supported and seen on the assigned link-local address after an IPv6-enabled - interface is up. -\end_layout - -\begin_layout Standard -Example: -\end_layout - -\begin_layout Code -# ip -6 addr show dev eth0 scope link -\end_layout - -\begin_layout Code -2: eth0: mtu 1500 qlen1000 -\end_layout - -\begin_layout Code - inet6 fe80::211:d8ff:fe6b:f0f5/64 scope link -\end_layout - -\begin_layout Code - valid_lft forever preferred_lft forever -\end_layout - -\begin_layout Section -Stateless auto-configuration using Router Advertisement Daemon (radvd) -\end_layout - -\begin_layout Standard -to be filled. - See -\begin_inset CommandInset ref -LatexCommand ref -name "radvd daemon autoconfiguration" -reference "hints-daemons-radvd" - -\end_inset - - below. -\end_layout - -\begin_layout Section -Dynamic Host Configuration Protocol v6 (DHCPv6) -\end_layout - -\begin_layout Standard -After a long time discussing issues, finally -\begin_inset CommandInset href -LatexCommand href -name "RFC 3315 / Dynamic Host Configuration Protocol for IPv6 (DHCPv6)" -target "http://www.faqs.org/rfcs/rfc3315.html" - -\end_inset - - was finished. - At time updating this part (10/2005) currently two implementations are - available: -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Dibbler" -target "http://klub.com.pl/dhcpv6/" - -\end_inset - - by Tomasz Mrugalski ( -\begin_inset CommandInset ref -LatexCommand ref -name "Hints for configuration" -reference "hints-daemons-dibbler" - -\end_inset - -) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "dhcpv6" -target "https://fedorahosted.org/dhcpv6/" - -\end_inset - - ( -\begin_inset CommandInset ref -LatexCommand ref -name "Hints for configuration" -reference "hints-daemons-dhcpv6" - -\end_inset - -) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "ISC DHCP" -target "http://www.isc.org/software/dhcp" - -\end_inset - - ( -\begin_inset CommandInset ref -LatexCommand ref -name "Hints for configuration" -reference "hints-daemons-isc-dhcp" - -\end_inset - -) -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-mobility" - -\end_inset - -Mobility -\end_layout - -\begin_layout Section -Common information -\end_layout - -\begin_layout Subsection -Node Mobility -\end_layout - -\begin_layout Standard -Support for IPv6 mobility can be enabled in Linux by installing the MIPL2 - implementation found at: -\begin_inset CommandInset href -LatexCommand href -name "http://www.mobile-ipv6.org/" -target "http://www.mobile-ipv6.org/" - -\end_inset - - -\end_layout - -\begin_layout Standard -This implementation is compliant with RFC 3775. - It is composed of a kernel patch and a mobility daemon called mip6d. - Version 2.0.1 applies on Linux kernel 2.6.15. -\end_layout - -\begin_layout Standard -Installation and setup are described in the -\begin_inset CommandInset href -LatexCommand href -name "Linux Mobile IPv6 HOWTO" -target "http://tldp.org/HOWTO/Mobile-IPv6-HOWTO/" - -\end_inset - -. -\end_layout - -\begin_layout Subsection -Network Mobility -\end_layout - -\begin_layout Standard -There also exists an implementation of network mobility for Linux, it is - called NEPL and is based on MIPL. - It can also be downloaded from: -\begin_inset CommandInset href -LatexCommand href -name "http://www.mobile-ipv6.org/" -target "http://www.mobile-ipv6.org/" - -\end_inset - -. -\end_layout - -\begin_layout Standard -The HOWTO document describing setup and configuration is available at: -\begin_inset CommandInset href -LatexCommand href -name "http://www.nautilus6.org/doc/nepl-howto/" -target "http://www.nautilus6.org/doc/nepl-howto/" - -\end_inset - -. -\end_layout - -\begin_layout Subsection -Links -\end_layout - -\begin_layout Itemize -Mobile IPv6 for Linux (MIPL) project: -\begin_inset CommandInset href -LatexCommand href -name "http://www.mobile-ipv6.org/" -target "http://www.mobile-ipv6.org/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Nautilus6 working group: -\begin_inset CommandInset href -LatexCommand href -name "http://nautilus6.org/" -target "http://nautilus6.org/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Fast Handovers for Mobile IPv6 for Linux project: -\begin_inset CommandInset href -LatexCommand href -name "http://www.fmipv6.org/" -target "http://www.fmipv6.org/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -USAGI-patched Mobile IPv6 for Linux (UMIP): -\begin_inset CommandInset href -LatexCommand href -name "http://umip.linux-ipv6.org/" -target "http://umip.linux-ipv6.org/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Deploying IPsec/IKE-protected MIPv6 under Linux: -\begin_inset CommandInset href -LatexCommand href -name "http://natisbad.org/MIPv6/" -target "http://natisbad.org/MIPv6/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "RFC 3775 / Mobility Support in IPv6" -target "http://www.faqs.org/rfcs/rfc3775.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "RFC 3776 / Using IPsec to Protect Mobile IPv6 Signaling Between Mobile Nodes and Home Agents" -target "http://www.faqs.org/rfcs/rfc3776.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "RFC 3963 / Network Mobility (NEMO)" -target "http://www.faqs.org/rfcs/rfc3963.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "RFC 4068 / Fast Handovers for Mobile IPv6" -target "http://www.faqs.org/rfcs/rfc4068.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "RFC 4423 / Host Identity Protocol (HIP) Architecture" -target "http://www.faqs.org/rfcs/rfc4423.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "RFC 5201 / Host Identity Protocol" -target "http://www.faqs.org/rfcs/rfc5201.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -HIP implementations: -\begin_inset CommandInset href -LatexCommand href -name "http://infrahip.hiit.fi/" -target "http://infrahip.hiit.fi/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "http://hip4inter.net/" -target "http://hip4inter.net/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "http://www.openhip.org/" -target "http://www.openhip.org/" - -\end_inset - - -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-firewalling-security" - -\end_inset - -Firewalling -\end_layout - -\begin_layout Standard -IPv6 firewalling is important, especially if using IPv6 on internal networks - with global IPv6 addresses. - Because unlike at IPv4 networks where in common internal hosts are protected - automatically using private IPv4 addresses like -\begin_inset CommandInset href -LatexCommand href -name "RFC 1918 / Address Allocation for Private Internets" -target "http://www.faqs.org/rfcs/rfc1918.html" - -\end_inset - - or Automatic Private IP Addressing (APIPA) -\begin_inset CommandInset href -LatexCommand href -name "Google search for Microsoft + APIPA" -target "http://www.google.com/search?q=apipa+microsoft" - -\end_inset - -, in IPv6 normally global addresses are used and someone with IPv6 connectivity - can reach all internal IPv6 enabled nodes. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "firewalling-netfilter6" - -\end_inset - -Firewalling using netfilter6 -\end_layout - -\begin_layout Standard -Native IPv6 firewalling is only supported in kernel versions 2.4+. - In older 2.2- you can only filter IPv6-in-IPv4 by protocol 41. - -\end_layout - -\begin_layout Standard -Attention: no warranty that described rules or examples can really protect - your system! -\end_layout - -\begin_layout Standard -Audit your ruleset after installation, see -\begin_inset CommandInset ref -LatexCommand ref -reference "IPv6-security-auditing" - -\end_inset - - for more. -\end_layout - -\begin_layout Standard -Since kernel version 2.6.20 (February 2007) IPv6 connection tracking is fully - working (and does not break IPv4 NAT anymore like versions before) -\end_layout - -\begin_layout Standard -Since kernel version 3.9.0 (April 2013) NAT for IPv6 is supported with ip6tables - >= 1.4.18 -\end_layout - -\begin_layout Standard -Since kernel version 3.13 (April 2014) new framework introduced named: nftables -\end_layout - -\begin_layout Subsection -More information -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Netfilter project" -target "http://www.netfilter.org/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "maillist archive of netfilter users" -target "https://lists.netfilter.org/mailman/listinfo/netfilter" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "maillist archive of netfilter developers" -target "https://lists.netfilter.org/mailman/listinfo/netfilter-devel" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Unofficial status informations" -target "http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status-kernel.html#netfilter6 " - -\end_inset - - -\end_layout - -\begin_layout Section -Preparation -\end_layout - -\begin_layout Standard -This step is only needed if distributed kernel and netfilter doesn't fit - your requirements and new features are available but still not built-in. -\end_layout - -\begin_layout Subsection -Get sources -\end_layout - -\begin_layout Standard -Get the latest kernel source: -\begin_inset CommandInset href -LatexCommand href -name "http://www.kernel.org/" -target "http://www.kernel.org/" - -\end_inset - - -\end_layout - -\begin_layout Standard -Get the latest iptables package: -\end_layout - -\begin_layout Itemize -Source tarball (for kernel patches): -\begin_inset CommandInset href -LatexCommand href -name "http://www.netfilter.org/" -target "http://www.netfilter.org/" - -\end_inset - - -\end_layout - -\begin_layout Subsection -Extract sources -\end_layout - -\begin_layout Standard -Change to source directory: -\end_layout - -\begin_layout Code -# cd /path/to/src -\end_layout - -\begin_layout Standard -Unpack and rename kernel sources -\end_layout - -\begin_layout Code -# tar z|jxf kernel-version.tar.gz|bz2 -\end_layout - -\begin_layout Code -# mv linux linux-version-iptables-version+IPv6 -\end_layout - -\begin_layout Standard -Unpack iptables sources -\end_layout - -\begin_layout Code -# tar z|jxf iptables-version.tar.gz|bz2 -\end_layout - -\begin_layout Subsection -Apply latest iptables/IPv6-related patches to kernel source -\end_layout - -\begin_layout Standard -Change to iptables directory -\end_layout - -\begin_layout Code -# cd iptables-version -\end_layout - -\begin_layout Standard -Apply pending patches -\end_layout - -\begin_layout Code -# make pending-patches KERNEL_DIR=/path/to/src/linux-version-iptables-version/ - -\end_layout - -\begin_layout Standard -Apply additional IPv6 related patches (still not in the vanilla kernel included) - -\end_layout - -\begin_layout Code -# make patch-o-matic KERNEL_DIR=/path/to/src/linux-version-iptables-version/ - -\end_layout - -\begin_layout Standard -Say yes at following options (iptables-1.2.2) -\end_layout - -\begin_layout Itemize -ah-esp.patch -\end_layout - -\begin_layout Itemize -masq-dynaddr.patch (only needed for systems with dynamic IP assigned WAN - connections like PPP or PPPoE) -\end_layout - -\begin_layout Itemize -ipv6-agr.patch.ipv6 -\end_layout - -\begin_layout Itemize -ipv6-ports.patch.ipv6 -\end_layout - -\begin_layout Itemize -LOG.patch.ipv6 -\end_layout - -\begin_layout Itemize -REJECT.patch.ipv6 -\end_layout - -\begin_layout Standard -Check IPv6 extensions -\end_layout - -\begin_layout Code -# make print-extensions -\end_layout - -\begin_layout Code -Extensions found: IPv6:owner IPv6:limit IPv6:mac IPv6:multiport -\end_layout - -\begin_layout Subsection -Configure, build and install new kernel -\end_layout - -\begin_layout Standard -Change to kernel sources -\end_layout - -\begin_layout Code -# cd /path/to/src/linux-version-iptables-version/ -\end_layout - -\begin_layout Standard -Edit Makefile -\end_layout - -\begin_layout Code -- EXTRAVERSION = -\end_layout - -\begin_layout Code -+ EXTRAVERSION = -iptables-version+IPv6-try -\end_layout - -\begin_layout Standard -Run configure, enable IPv6 related -\end_layout - -\begin_layout Code - Code maturity level options -\end_layout - -\begin_layout Code - Prompt for development and/or incomplete code/drivers - : yes -\end_layout - -\begin_layout Code - Networking options -\end_layout - -\begin_layout Code - Network packet filtering: yes -\end_layout - -\begin_layout Code - The IPv6 protocol: module -\end_layout - -\begin_layout Code - IPv6: Netfilter Configuration -\end_layout - -\begin_layout Code - IP6 tables support: module -\end_layout - -\begin_layout Code - All new options like following: -\end_layout - -\begin_layout Code - limit match support: module -\end_layout - -\begin_layout Code - MAC address match support: module -\end_layout - -\begin_layout Code - Multiple port match support: module -\end_layout - -\begin_layout Code - Owner match support: module -\end_layout - -\begin_layout Code - netfilter MARK match support: module - -\end_layout - -\begin_layout Code - Aggregated address check: module -\end_layout - -\begin_layout Code - Packet filtering: module -\end_layout - -\begin_layout Code - REJECT target support: module -\end_layout - -\begin_layout Code - LOG target support: module -\end_layout - -\begin_layout Code - Packet mangling: module -\end_layout - -\begin_layout Code - MARK target support: module -\end_layout - -\begin_layout Standard -Configure other related to your system, too -\end_layout - -\begin_layout Standard -Compilation and installing: see the kernel section here and other HOWTOs - -\end_layout - -\begin_layout Subsection -Rebuild and install binaries of iptables -\end_layout - -\begin_layout Standard -Make sure, that upper kernel source tree is also available at /usr/src/linux/ - -\end_layout - -\begin_layout Standard -Rename older directory -\end_layout - -\begin_layout Code -# mv /usr/src/linux /usr/src/linux.old -\end_layout - -\begin_layout Standard -Create a new softlink -\end_layout - -\begin_layout Code -# ln -s /path/to/src/linux-version-iptables-version /usr/src/linux -\end_layout - -\begin_layout Standard -Rebuild SRPMS -\end_layout - -\begin_layout Code -# rpm --rebuild /path/to/SRPMS/iptables-version-release.src.rpm -\end_layout - -\begin_layout Standard -Install new iptables packages (iptables + iptables-ipv6) -\end_layout - -\begin_layout Itemize -On RH 7.1 systems, normally, already an older version is installed, therefore - use "freshen" -\end_layout - -\begin_layout Code -# rpm -Fhv /path/to/RPMS/cpu/iptables*-version-release.cpu.rpm -\end_layout - -\begin_layout Itemize -If not already installed, use "install" -\end_layout - -\begin_layout Code -# rpm -ihv /path/to/RPMS/cpu/iptables*-version-release.cpu.rpm -\end_layout - -\begin_layout Itemize -On RH 6.2 systems, normally, no kernel 2.4.x is installed, therefore the requiremen -ts don't fit. - Use "--nodeps" to install it -\end_layout - -\begin_layout Code -# rpm -ihv --nodeps /path/to/RPMS/cpu/iptables*-version-release.cpu.rpm -\end_layout - -\begin_layout Standard -Perhaps it's necessary to create a softlink for iptables libraries where - iptables looks for them -\end_layout - -\begin_layout Code -# ln -s /lib/iptables/ /usr/lib/iptables -\end_layout - -\begin_layout Section -Usage of ip6tables -\end_layout - -\begin_layout Subsection -Check for support -\end_layout - -\begin_layout Standard -Load module, if so compiled -\end_layout - -\begin_layout Code -# modprobe ip6_tables -\end_layout - -\begin_layout Standard -Check for capability -\end_layout - -\begin_layout Code -# [ ! -f /proc/net/ip6_tables_names ] && echo "Current kernel doesn't support -\end_layout - -\begin_layout Code -¬ 'ip6tables' firewalling (IPv6)!" -\end_layout - -\begin_layout Subsection -Learn how to use ip6tables -\end_layout - -\begin_layout Subsubsection -List all IPv6 netfilter entries -\end_layout - -\begin_layout Itemize -Short -\end_layout - -\begin_layout Code -# ip6tables -L -\end_layout - -\begin_layout Itemize -Extended -\end_layout - -\begin_layout Code -# ip6tables -n -v --line-numbers -L -\end_layout - -\begin_layout Subsubsection -List specified filter -\end_layout - -\begin_layout Code -# ip6tables -n -v --line-numbers -L INPUT -\end_layout - -\begin_layout Subsubsection -Insert a log rule at the input filter with options -\end_layout - -\begin_layout Code -# ip6tables --table filter --append INPUT -j LOG --log-prefix "INPUT:" -\end_layout - -\begin_layout Code -¬ --log-level 7 -\end_layout - -\begin_layout Subsubsection -Insert a drop rule at the input filter -\end_layout - -\begin_layout Code -# ip6tables --table filter --append INPUT -j DROP -\end_layout - -\begin_layout Subsubsection -Delete a rule by number -\end_layout - -\begin_layout Code -# ip6tables --table filter --delete INPUT 1 -\end_layout - -\begin_layout Subsubsection -Enable connection tracking -\end_layout - -\begin_layout Standard -Since kernel version 2.6.20 IPv6 connection tracking is well supported and - should be used instead of using stateless filter rules. -\end_layout - -\begin_layout Code -# ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -\end_layout - -\begin_layout Subsubsection -Allow ICMPv6 -\end_layout - -\begin_layout Standard -Using older kernels (unpatched kernel 2.4.5 and iptables-1.2.2) no type can - be specified -\end_layout - -\begin_layout Itemize -Accept incoming ICMPv6 through tunnels -\end_layout - -\begin_layout Code -# ip6tables -A INPUT -i sit+ -p icmpv6 -j ACCEPT -\end_layout - -\begin_layout Itemize -Allow outgoing ICMPv6 through tunnels -\end_layout - -\begin_layout Code -# ip6tables -A OUTPUT -o sit+ -p icmpv6 -j ACCEPT -\end_layout - -\begin_layout Standard -Newer kernels allow specifying of ICMPv6 types: -\end_layout - -\begin_layout Code -# ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j ACCEPT -\end_layout - -\begin_layout Subsubsection -Rate-limiting -\end_layout - -\begin_layout Standard -Because it can happen (author already saw it to times) that an ICMPv6 storm - will raise up, you should use available rate limiting for at least ICMPv6 - ruleset. - In addition logging rules should also get rate limiting to prevent DoS - attacks against syslog and storage of log file partition. - An example for a rate limited ICMPv6 looks like: -\end_layout - -\begin_layout Code -# ip6tables -A INPUT --protocol icmpv6 --icmpv6-type echo-request -\end_layout - -\begin_layout Code -¬ -j ACCEPT --match limit --limit 30/minute -\end_layout - -\begin_layout Subsubsection -Allow incoming SSH -\end_layout - -\begin_layout Standard -Here an example is shown for a ruleset which allows incoming SSH connection - from a specified IPv6 address -\end_layout - -\begin_layout Itemize -Allow incoming SSH from 2001:0db8:100::1/128 -\end_layout - -\begin_layout Code -# ip6tables -A INPUT -i sit+ -p tcp -s 2001:0db8:100::1/128 --sport 512:65535 -\end_layout - -\begin_layout Code -¬ --dport 22 -j ACCEPT -\end_layout - -\begin_layout Itemize -Allow response packets ( -\series bold -no longer needed if connection tracking is used! -\series default -) -\end_layout - -\begin_layout Code -# ip6tables -A OUTPUT -o sit+ -p tcp -d 2001:0db8:100::1/128 --dport 512:65535 -\end_layout - -\begin_layout Code -¬ --sport 22 ! --syn -j ACCEPT -\end_layout - -\begin_layout Subsubsection -Enable tunneled IPv6-in-IPv4 -\end_layout - -\begin_layout Standard -To accept tunneled IPv6-in-IPv4 packets, you have to insert rules in your - -\series bold -IPv4 firewall setup -\series default - relating to such packets, for example -\end_layout - -\begin_layout Itemize -Accept incoming IPv6-in-IPv4 on interface ppp0 -\end_layout - -\begin_layout Code -# iptables -A INPUT -i ppp0 -p ipv6 -j ACCEPT -\end_layout - -\begin_layout Itemize -Allow outgoing IPv6-in-IPv4 to interface ppp0 -\end_layout - -\begin_layout Code -# iptables -A OUTPUT -o ppp0 -p ipv6 -j ACCEPT -\end_layout - -\begin_layout Standard -If you have only a static tunnel, you can specify the IPv4 addresses, too, - like -\end_layout - -\begin_layout Itemize -Accept incoming IPv6-in-IPv4 on interface ppp0 from tunnel endpoint 192.0.2.2 -\end_layout - -\begin_layout Code -# iptables -A INPUT -i ppp0 -p ipv6 -s 192.0.2.2 -j ACCEPT -\end_layout - -\begin_layout Itemize -Allow outgoing IPv6-in-IPv4 to interface ppp0 to tunnel endpoint 192.0.2.2 -\end_layout - -\begin_layout Code -# iptables -A OUTPUT -o ppp0 -p ipv6 -d 192.0.2.2 -j ACCEPT -\end_layout - -\begin_layout Subsubsection -Protection against incoming TCP connection requests -\end_layout - -\begin_layout Standard - -\series bold -VERY RECOMMENDED! -\series default - For security issues you should really insert a rule which blocks incoming - TCP connection requests. - Adapt "-i" option, if other interface names are in use! -\end_layout - -\begin_layout Itemize -Block incoming TCP connection requests to this host -\end_layout - -\begin_layout Code -# ip6tables -I INPUT -i sit+ -p tcp --syn -j DROP -\end_layout - -\begin_layout Itemize -Block incoming TCP connection requests to hosts behind this router -\end_layout - -\begin_layout Code -# ip6tables -I FORWARD -i sit+ -p tcp --syn -j DROP -\end_layout - -\begin_layout Standard -Perhaps the rules have to be placed below others, but that is work you have - to think about it. - Best way is to create a script and execute rules in a specified way. - -\end_layout - -\begin_layout Subsubsection -Protection against incoming UDP connection requests -\end_layout - -\begin_layout Standard - -\series bold -ALSO RECOMMENDED! -\series default - Like mentioned on my firewall information it's possible to control the - ports on outgoing UDP/TCP sessions. - So if all of your local IPv6 systems are using local ports e.g. - from 32768 to 60999 you are able to filter UDP connections also (until - connection tracking works) like: -\end_layout - -\begin_layout Itemize -Block incoming UDP packets which cannot be responses of outgoing requests - of this host -\end_layout - -\begin_layout Code -# ip6tables -I INPUT -i sit+ -p udp ! --dport 32768:60999 -j DROP -\end_layout - -\begin_layout Itemize -Block incoming UDP packets which cannot be responses of forwarded requests - of hosts behind this router -\end_layout - -\begin_layout Code -# ip6tables -I FORWARD -i sit+ -p udp ! --dport 32768:60999 -j DROP -\end_layout - -\begin_layout Subsection -Examples -\end_layout - -\begin_layout Subsubsection -Simple example for Fedora -\end_layout - -\begin_layout Standard -Following lines show a simple firewall configuration for Fedora 6 (since - kernel version 2.6.20). - It was modfied from the default one (generated by -\shape italic -system-config-firewall -\shape default -) for supporting connection -\series bold -tracking -\series default - and return the proper ICMPv6 code for rejects. - Incoming SSH (port 22) connections are allowed. -\end_layout - -\begin_layout Code -File: /etc/sysconfig/ip6tables -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code -*filter :INPUT ACCEPT [0:0] -\end_layout - -\begin_layout Code -:FORWARD ACCEPT [0:0] -\end_layout - -\begin_layout Code -:OUTPUT ACCEPT [0:0] -\end_layout - -\begin_layout Code -:RH-Firewall-1-INPUT - [0:0] -\end_layout - -\begin_layout Code --A INPUT -j RH-Firewall-1-INPUT -\end_layout - -\begin_layout Code --A FORWARD -j RH-Firewall-1-INPUT -\end_layout - -\begin_layout Code --A RH-Firewall-1-INPUT -i lo -j ACCEPT -\end_layout - -\begin_layout Code --A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT -\end_layout - -\begin_layout Code --A RH-Firewall-1-INPUT -p 50 -j ACCEPT -\end_layout - -\begin_layout Code --A RH-Firewall-1-INPUT -p 51 -j ACCEPT -\end_layout - -\begin_layout Code --A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT -\end_layout - -\begin_layout Code --A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT -\end_layout - -\begin_layout Code --A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT -\end_layout - -\begin_layout Code --A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -\end_layout - -\begin_layout Code --A RH-Firewall-1-INPUT -m state --state NEW -p tcp --dport 22 -j ACCEPT -\end_layout - -\begin_layout Code --A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited -\end_layout - -\begin_layout Code -COMMIT -\end_layout - -\begin_layout Standard -For completeness also the IPv4 configuration is shown here: -\end_layout - -\begin_layout Code -File: /etc/sysconfig/iptables -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code -*filter :INPUT ACCEPT [0:0] -\end_layout - -\begin_layout Code -:FORWARD ACCEPT [0:0] -\end_layout - -\begin_layout Code -:OUTPUT ACCEPT [0:0] -\end_layout - -\begin_layout Code -:RH-Firewall-1-INPUT - [0:0] -\end_layout - -\begin_layout Code --A INPUT -j RH-Firewall-1-INPUT -\end_layout - -\begin_layout Code --A FORWARD -j RH-Firewall-1-INPUT -\end_layout - -\begin_layout Code --A RH-Firewall-1-INPUT -i lo -j ACCEPT -\end_layout - -\begin_layout Code --A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT -\end_layout - -\begin_layout Code --A RH-Firewall-1-INPUT -p 50 -j ACCEPT -\end_layout - -\begin_layout Code --A RH-Firewall-1-INPUT -p 51 -j ACCEPT -\end_layout - -\begin_layout Code --A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT -\end_layout - -\begin_layout Code --A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT -\end_layout - -\begin_layout Code --A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT -\end_layout - -\begin_layout Code --A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -\end_layout - -\begin_layout Code --A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j - ACCEPT -\end_layout - -\begin_layout Code --A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited -\end_layout - -\begin_layout Code -COMMIT -\end_layout - -\begin_layout Standard -Usage: -\end_layout - -\begin_layout Itemize -Create/modify the configuration files -\end_layout - -\begin_layout Itemize -Activate IPv4 & IPv6 firewalling -\end_layout - -\begin_layout Code -# service iptables start -\end_layout - -\begin_layout Code -# service ip6tables start -\end_layout - -\begin_layout Itemize -Enable automatic start after reboot -\end_layout - -\begin_layout Code -# chkconfig iptables on -\end_layout - -\begin_layout Code -# chkconfig ip6tables on -\end_layout - -\begin_layout Subsubsection -Sophisticated example -\end_layout - -\begin_layout Standard -Following lines show a more sophisticated -\series bold -but still stateless filter -\series default - setup as an example. - Happy netfilter6 ruleset creation.... - -\end_layout - -\begin_layout Code -# ip6tables -n -v -L -\end_layout - -\begin_layout Code -Chain INPUT (policy DROP 0 packets, 0 bytes) -\end_layout - -\begin_layout Code - pkts bytes target prot opt in out source destination -\end_layout - -\begin_layout Code - 0 0 extIN all sit+ * ::/0 ::/0 - -\end_layout - -\begin_layout Code - 4 384 intIN all eth0 * ::/0 ::/0 - -\end_layout - -\begin_layout Code - 0 0 ACCEPT all * * ::1/128 ::1/128 - -\end_layout - -\begin_layout Code - 0 0 ACCEPT all lo * ::/0 ::/0 - -\end_layout - -\begin_layout Code - 0 0 LOG all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code -¬ LOG flags 0 level 7 prefix `INPUT-default:' -\end_layout - -\begin_layout Code - 0 0 DROP all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code -Chain FORWARD (policy DROP 0 packets, 0 bytes) -\end_layout - -\begin_layout Code - pkts bytes target prot opt in out source destination -\end_layout - -\begin_layout Code -¬ -\end_layout - -\begin_layout Code - 0 0 int2ext all eth0 sit+ ::/0 ::/0 - -\end_layout - -\begin_layout Code - 0 0 ext2int all sit+ eth0 ::/0 ::/0 - -\end_layout - -\begin_layout Code - 0 0 LOG all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code -¬ LOG flags 0 level 7 prefix `FORWARD-default:' -\end_layout - -\begin_layout Code - 0 0 DROP all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code -Chain OUTPUT (policy DROP 0 packets, 0 bytes) -\end_layout - -\begin_layout Code - pkts bytes target prot opt in out source destination -\end_layout - -\begin_layout Code -¬ -\end_layout - -\begin_layout Code - 0 0 extOUT all * sit+ ::/0 ::/0 - -\end_layout - -\begin_layout Code - 4 384 intOUT all * eth0 ::/0 ::/0 - -\end_layout - -\begin_layout Code - 0 0 ACCEPT all * * ::1/128 ::1/128 - -\end_layout - -\begin_layout Code - 0 0 ACCEPT all * lo ::/0 ::/0 - -\end_layout - -\begin_layout Code - 0 0 LOG all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code -¬ LOG flags 0 level 7 prefix `OUTPUT-default:' -\end_layout - -\begin_layout Code - 0 0 DROP all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code -Chain ext2int (1 references) -\end_layout - -\begin_layout Code - pkts bytes target prot opt in out source destination -\end_layout - -\begin_layout Code -¬ -\end_layout - -\begin_layout Code - 0 0 ACCEPT icmpv6 * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - 0 0 ACCEPT tcp * * ::/0 ::/0 - -\end_layout - -\begin_layout Code -¬ tcp spts:1:65535 dpts:1024:65535 flags:!0x16/0x02 -\end_layout - -\begin_layout Code - 0 0 LOG all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code -¬ LOG flags 0 level 7 prefix `ext2int-default:' -\end_layout - -\begin_layout Code - 0 0 DROP tcp * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - 0 0 DROP udp * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - 0 0 DROP all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code -Chain extIN (1 references) -\end_layout - -\begin_layout Code - pkts bytes target prot opt in out source destination -\end_layout - -\begin_layout Code -¬ -\end_layout - -\begin_layout Code - 0 0 ACCEPT tcp * * 3ffe:400:100::1/128 ::/0 - -\end_layout - -\begin_layout Code -¬ tcp spts:512:65535 dpt:22 -\end_layout - -\begin_layout Code - 0 0 ACCEPT tcp * * 3ffe:400:100::2/128 ::/0 - -\end_layout - -\begin_layout Code -¬ tcp spts:512:65535 dpt:22 -\end_layout - -\begin_layout Code - 0 0 ACCEPT icmpv6 * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - 0 0 ACCEPT tcp * * ::/0 ::/0 - -\end_layout - -\begin_layout Code -¬ tcp spts:1:65535 dpts:1024:65535 flags:!0x16/0x02 -\end_layout - -\begin_layout Code - 0 0 ACCEPT udp * * ::/0 ::/0 - -\end_layout - -\begin_layout Code -¬ udp spts:1:65535 dpts:1024:65535 -\end_layout - -\begin_layout Code - 0 0 LOG all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code -¬ limit: avg 5/min burst 5 LOG flags 0 level 7 prefix `extIN-default:' - -\end_layout - -\begin_layout Code - 0 0 DROP all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code -Chain extOUT (1 references) -\end_layout - -\begin_layout Code - pkts bytes target prot opt in out source destination -\end_layout - -\begin_layout Code -¬ -\end_layout - -\begin_layout Code - 0 0 ACCEPT tcp * * ::/0 -\end_layout - -\begin_layout Code -¬ 2001:0db8:100::1/128tcp spt:22 dpts:512:65535 flags:!0x16/0x02 -\end_layout - -\begin_layout Code - 0 0 ACCEPT tcp * * ::/0 -\end_layout - -\begin_layout Code -¬ 2001:0db8:100::2/128tcp spt:22 dpts:512:65535 flags:!0x16/0x02 -\end_layout - -\begin_layout Code - 0 0 ACCEPT icmpv6 * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - 0 0 ACCEPT tcp * * ::/0 ::/0 - -\end_layout - -\begin_layout Code -¬ tcp spts:1024:65535 dpts:1:65535 -\end_layout - -\begin_layout Code - 0 0 ACCEPT udp * * ::/0 ::/0 - -\end_layout - -\begin_layout Code -¬ udp spts:1024:65535 dpts:1:65535 -\end_layout - -\begin_layout Code - 0 0 LOG all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code -¬ LOG flags 0 level 7 prefix `extOUT-default:' -\end_layout - -\begin_layout Code - 0 0 DROP all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code -Chain int2ext (1 references) -\end_layout - -\begin_layout Code - pkts bytes target prot opt in out source destination -\end_layout - -\begin_layout Code -¬ -\end_layout - -\begin_layout Code - 0 0 ACCEPT icmpv6 * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - 0 0 ACCEPT tcp * * ::/0 ::/0 - -\end_layout - -\begin_layout Code -¬ tcp spts:1024:65535 dpts:1:65535 -\end_layout - -\begin_layout Code - 0 0 LOG all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code -¬ LOG flags 0 level 7 prefix `int2ext:' -\end_layout - -\begin_layout Code - 0 0 DROP all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - 0 0 LOG all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code -¬ LOG flags 0 level 7 prefix `int2ext-default:' -\end_layout - -\begin_layout Code - 0 0 DROP tcp * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - 0 0 DROP udp * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - 0 0 DROP all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code -Chain intIN (1 references) -\end_layout - -\begin_layout Code - pkts bytes target prot opt in out source destination -\end_layout - -\begin_layout Code -¬ -\end_layout - -\begin_layout Code - 0 0 ACCEPT all * * ::/0 -\end_layout - -\begin_layout Code -¬ fe80::/ffc0:: -\end_layout - -\begin_layout Code - 4 384 ACCEPT all * * ::/0 ff02::/16 - -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code -Chain intOUT (1 references) -\end_layout - -\begin_layout Code - pkts bytes target prot opt in out source destination -\end_layout - -\begin_layout Code -¬ -\end_layout - -\begin_layout Code - 0 0 ACCEPT all * * ::/0 -\end_layout - -\begin_layout Code -¬ fe80::/ffc0:: -\end_layout - -\begin_layout Code - 4 384 ACCEPT all * * ::/0 ff02::/16 - -\end_layout - -\begin_layout Code - 0 0 LOG all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code -¬ LOG flags 0 level 7 prefix `intOUT-default:' -\end_layout - -\begin_layout Code - 0 0 DROP all * * ::/0 ::/0 - -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "nat-netfilter6" - -\end_inset - -Network Address Translation (NAT) using netfilter6 -\end_layout - -\begin_layout Standard -Since at least Linux kernel version 3.9.0 and using ip6tables since 1.4.18 also - Network Address Translation (NAT) is usable. -\end_layout - -\begin_layout Subsection -IPv6 Masquerading -\end_layout - -\begin_layout Standard -Like in IPv4 clients behind a router can be hided by using IPv6 masquerading - (hide/overlap NAT), e.g. -\end_layout - -\begin_layout Code -# ip6tables -t nat -A POSTROUTING -o sixxs -s fec0::/64 -j MASQUERADE -\end_layout - -\begin_layout Subsection -IPv6 Destination NAT -\end_layout - -\begin_layout Standard -A dedicated public IPv6 address can be forwarded to an internal IPv6 address, - e.g. -\end_layout - -\begin_layout Code -# ip6tables -t nat -A PREROUTING -d 2001:db8:0:1:5054:ff:fe01:2345 -i sixxs - -j DNAT --to-destination fec0::5054:ff:fe01:2345 -\end_layout - -\begin_layout Subsection -IPv6 Port Forwarding -\end_layout - -\begin_layout Standard -A dedicated specified port can be forwarded to an internal system, e.g. -\end_layout - -\begin_layout Code -# ip6tables -t nat -A PREROUTING -i sixxs -p tcp --dport 8080 -j DNAT --to-desti -nation [fec0::1234]:80 -\end_layout - -\begin_layout Section -Firewalling using nftables -\end_layout - -\begin_layout Standard -nftables adds in addition to protocol specific tables -\begin_inset Quotes sld -\end_inset - -ip -\begin_inset Quotes srd -\end_inset - - (IPv4) and -\begin_inset Quotes sld -\end_inset - -ip6 -\begin_inset Quotes srd -\end_inset - - (IPv6) support for a IPv4/IPv6 aware table named -\begin_inset Quotes sld -\end_inset - -inet -\begin_inset Quotes srd -\end_inset - -. - Using this table it's possible to add only one rule and match both protocols - (in case of UDP and TCP). -\end_layout - -\begin_layout Standard -Take care if rules are contained in more than one table, because the tables - are checked in sequence: -\end_layout - -\begin_layout Code -IPv4-Packet --> table "ip" --> table "inet" --> further checks -\end_layout - -\begin_layout Code -IPv6-Packet --> table "ip6" --> table "inet" --> further checks -\end_layout - -\begin_layout Standard -If table -\begin_inset Quotes sld -\end_inset - -ip6 -\begin_inset Quotes srd -\end_inset - - accepts the packet, also table -\begin_inset Quotes sld -\end_inset - -inet -\begin_inset Quotes srd -\end_inset - - must accept the packet, otherwise it can be dropped by a later drop rule. -\end_layout - -\begin_layout Subsection -Preparation for nftables usage -\end_layout - -\begin_layout Standard -Install a Linux distribution which has nftables support already included. - At time of writing (May 2014) at least Fedora Rawhide (upcoming version - 21) has support in conjunction with nftables version 0.2.0. -\end_layout - -\begin_layout Subsection -Basic nftables configuration -\end_layout - -\begin_layout Standard -Load kernel modules: -\end_layout - -\begin_layout Code -# modprobe nf_tables -\end_layout - -\begin_layout Code -# modprobe nf_tables_ipv4 -\end_layout - -\begin_layout Code -# modprobe nf_tables_ipv6 -\end_layout - -\begin_layout Code -# modprobe nf_tables_inet -\end_layout - -\begin_layout Standard -Flush iptables and ip6tables to avoid interferences: -\end_layout - -\begin_layout Code -# iptables -F -\end_layout - -\begin_layout Code -# ip6tables -F -\end_layout - -\begin_layout Standard -Create filter table: -\end_layout - -\begin_layout Code -# nft add table inet filter -\end_layout - -\begin_layout Standard -Create input chain: -\end_layout - -\begin_layout Code -# nft add chain inet filter input { type filter hook input priority 0 -\backslash -; } -\end_layout - -\begin_layout Subsection -Simple filter policy with nftables using only table -\begin_inset Quotes sld -\end_inset - -inet -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Configuration -\end_layout - -\begin_layout Standard -Allow packets which are related to existing connection tracking entries -\end_layout - -\begin_layout Code -# nft add rule inet filter input ct state established,related counter accept -\end_layout - -\begin_layout Standard -Allow IPv4 and IPv6 ICMP echo-request (aka ping) -\end_layout - -\begin_layout Code -# nft add rule inet filter input meta nfproto ipv4 icmp type { echo-request - } counter accept -\end_layout - -\begin_layout Code -# nft add rule inet filter input meta nfproto ipv6 icmpv6 type echo-request - counter accept -\end_layout - -\begin_layout Standard -Allow some important IPv6 ICMP traffic, without counter, but checking hop-limit - for security -\end_layout - -\begin_layout Code -# nft add rule inet filter input meta nfproto ipv6 -\end_layout - -\begin_layout Code -¬ icmpv6 type { nd-neighbor-advert, nd-neighbor-solicit, nd-router-advert} - ip6 hoplimit 1 accept -\end_layout - -\begin_layout Code -# nft add rule inet filter input meta nfproto ipv6 -\end_layout - -\begin_layout Code -¬ icmpv6 type { nd-neighbor-advert, nd-neighbor-solicit, nd-router-advert} - ip6 hoplimit 255 counter accept -\end_layout - -\begin_layout Standard -Allow incoming SSH for IPv4 and IPv6 -\end_layout - -\begin_layout Code -# nft add rule inet filter input tcp dport 22 ct state new tcp flags -\backslash -& -\backslash -(syn -\backslash -| ack -\backslash -) == syn counter accept -\end_layout - -\begin_layout Standard -Reject/drop others -\end_layout - -\begin_layout Code -# nft add rule inet filter input tcp dport 0-65535 reject -\end_layout - -\begin_layout Code -# nft add rule inet filter input udp dport 0-65535 counter drop -\end_layout - -\begin_layout Code -# nft add rule inet filter input counter drop -\end_layout - -\begin_layout Subsubsection -Result -\end_layout - -\begin_layout Standard -Table for IP version aware filter -\end_layout - -\begin_layout Code -table inet filter { -\end_layout - -\begin_layout Code - chain input { -\end_layout - -\begin_layout Code - type filter hook input priority 0; -\end_layout - -\begin_layout Code - ct state established,related counter packets 0 bytes 0 accept -\end_layout - -\begin_layout Code - ip protocol icmp icmp type { echo-request} counter packets 0 bytes 0 - accept -\end_layout - -\begin_layout Code - ip6 nexthdr ipv6-icmp icmpv6 type echo-request counter packets 0 bytes - 0 accept -\end_layout - -\begin_layout Code - ip6 nexthdr ipv6-icmp ip6 hoplimit 1 icmpv6 type { nd-neighbor-advert, - nd-neighbor-solicit, nd-router-advert} accept -\end_layout - -\begin_layout Code - ip6 nexthdr ipv6-icmp ip6 hoplimit 255 icmpv6 type { nd-neighbor-advert, - nd-neighbor-solicit, nd-router-advert} accept -\end_layout - -\begin_layout Code - tcp dport ssh ct state new tcp flags & (syn | ack) == syn counter packets - 0 bytes 0 accept -\end_layout - -\begin_layout Code - tcp dport >= 0 tcp dport <= 65535 counter packets 0 bytes 0 reject -\end_layout - -\begin_layout Code - udp dport >= 0 udp dport <= 65535 counter packets 0 bytes 0 drop -\end_layout - -\begin_layout Code - log prefix counter packets 0 bytes 0 drop -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code -} -\end_layout - -\begin_layout Subsubsection -Hints for logging -\end_layout - -\begin_layout Standard -To enable logging, an additonal kernel module must be loaded -\end_layout - -\begin_layout Code -# modprobe xt_LOG -\end_layout - -\begin_layout Standard -BUT TAKE CARE, IT LOOKS LIKE THAT NO LOG LEVEL CAN BE SPEFICIED CURRENTLY - IN nftables, resulting that events are logged with kern.emerg - POSSIBILITY - OF FLODDING THE CONSOLE WITH LOG ENTRIES! -\end_layout - -\begin_layout Standard -Fir initial test with logging it can be useful to disable kernel console - logging in e.g. - /etc/rsyslog.conf by putting a -\begin_inset Quotes sld -\end_inset - -# -\begin_inset Quotes srd -\end_inset - - in front of the related entry and restart logging daemon -\end_layout - -\begin_layout Code -#*.emerg :omusrmsg:* -\end_layout - -\begin_layout Standard -Rule from above accepting SSH on port 22, but now with logging: -\end_layout - -\begin_layout Code -# nft add rule inet filter input tcp dport 22 ct state new tcp flags -\backslash -& -\backslash -(syn -\backslash -| ack -\backslash -) == syn log prefix -\backslash -"inet/input/accept: -\backslash -" counter accept -\end_layout - -\begin_layout Subsection -Filter policy with nftables using tables -\begin_inset Quotes sld -\end_inset - -ip -\begin_inset Quotes srd -\end_inset - -, -\begin_inset Quotes sld -\end_inset - -ip6 -\begin_inset Quotes srd -\end_inset - - and -\begin_inset Quotes sld -\end_inset - -inet -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -As written above, if rules should be stored in related tables, it must be - assured that earlier accepts are not discarded in the further table. - This can be done using -\begin_inset Quotes sld -\end_inset - -meta mark set xxxx -\begin_inset Quotes srd -\end_inset - - on every accept rule and generic rules which accepts packets with -\begin_inset Quotes sld -\end_inset - -mark xxxx -\begin_inset Quotes srd -\end_inset - -. - A resulting filter set would look like the following: -\end_layout - -\begin_layout Code -# for table in ip ip6 inet; do nft list table $table filter; done -\end_layout - -\begin_layout Code -table ip filter { -\end_layout - -\begin_layout Code - chain input { -\end_layout - -\begin_layout Code - type filter hook input priority 0; -\end_layout - -\begin_layout Code - ct state established,related counter packets 241 bytes 25193 accept -\end_layout - -\begin_layout Code - counter packets 2 bytes 120 mark 0x00000100 accept -\end_layout - -\begin_layout Code - icmp type { echo-request} counter packets 0 bytes 0 meta mark set 0x00000100 - accept -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code -} -\end_layout - -\begin_layout Code -table ip6 filter { -\end_layout - -\begin_layout Code - chain input { -\end_layout - -\begin_layout Code - type filter hook input priority 0; -\end_layout - -\begin_layout Code - ct state established,related counter packets 14 bytes 4077 accept -\end_layout - -\begin_layout Code - counter packets 4 bytes 408 mark 0x00000100 accept -\end_layout - -\begin_layout Code - icmpv6 type echo-request counter packets 1 bytes 104 meta mark set 0x00000100 -\end_layout - -\begin_layout Code - icmpv6 type { nd-neighbor-advert, nd-neighbor-solicit, nd-router-advert} - counter packets 2 bytes 224 meta mark set 0x00000100 accept -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code -} -\end_layout - -\begin_layout Code -table inet filter { -\end_layout - -\begin_layout Code - chain input { -\end_layout - -\begin_layout Code - type filter hook input priority 0; -\end_layout - -\begin_layout Code - ct state established,related counter packets 307 bytes 31974 accept -\end_layout - -\begin_layout Code - counter packets 6 bytes 528 mark 0x00000100 accept -\end_layout - -\begin_layout Code - tcp dport ssh ct state new tcp flags & (syn | ack) == syn log prefix - "inet/input/accept: " meta mark set 0x00000100 counter packets 3 bytes - 200 accept -\end_layout - -\begin_layout Code - log prefix "inet/input/reject: " counter packets 0 bytes 0 reject -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code -} -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-security" - -\end_inset - -Security -\end_layout - -\begin_layout Section -Node security -\end_layout - -\begin_layout Standard -It's very recommended to apply all available patches and disable all not - necessary services. - Also bind services to the needed IPv4/IPv6 addresses only and install local - firewalling. -\end_layout - -\begin_layout Standard -More to be filled... -\end_layout - -\begin_layout Section -Access limitations -\end_layout - -\begin_layout Standard -Many services uses the tcp_wrapper library for access control. - Below is described the -\begin_inset CommandInset ref -LatexCommand ref -name "use of tcp_wrapper" -reference "hints-daemons-tcpwrapper" - -\end_inset - -. -\end_layout - -\begin_layout Standard -More to be filled... -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "IPv6-security-auditing" - -\end_inset - -IPv6 security auditing -\end_layout - -\begin_layout Standard -Currently there are no comfortable tools out which are able to check a system - over network for IPv6 security issues. - Neither -\begin_inset CommandInset href -LatexCommand href -name "Nessus" -target "http://www.nessus.org/" - -\end_inset - - nor any commercial security scanner is as far as I know able to scan IPv6 - addresses. -\end_layout - -\begin_layout Subsection -Legal issues -\end_layout - -\begin_layout Standard -ATTENTION: always take care that you only scan your own systems or after - receiving a written order, otherwise legal issues are able to come up to - you. -\begin_inset Newline newline -\end_inset - -CHECK destination IPv6 addresses TWICE before starting a scan. -\end_layout - -\begin_layout Subsection -Security auditing using IPv6-enabled netcat -\end_layout - -\begin_layout Standard -With the IPv6-enabled netcat (see -\begin_inset CommandInset href -LatexCommand href -name "IPv6+Linux-status-apps/security-auditing" -target "http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status-apps.html#security-auditing" - -\end_inset - - for more) you can run a portscan by wrapping a script around which run - through a port range, grab banners and so on. - Usage example: -\end_layout - -\begin_layout Code -# nc6 ::1 daytime -\end_layout - -\begin_layout Code -13 JUL 2002 11:22:22 CEST -\end_layout - -\begin_layout Subsection -Security auditing using IPv6-enabled nmap -\end_layout - -\begin_layout Standard -\begin_inset CommandInset href -LatexCommand href -name "NMap" -target "http://www.insecure.org/nmap/" - -\end_inset - -, one of the best portscaner around the world, supports IPv6 since version - 3.10ALPHA1. - Usage example: -\end_layout - -\begin_layout Code -# nmap -6 -sT ::1 -\end_layout - -\begin_layout Code -Starting nmap V. - 3.10ALPHA3 ( www.insecure.org/nmap/ ) -\end_layout - -\begin_layout Code -Interesting ports on localhost6 (::1): -\end_layout - -\begin_layout Code -(The 1600 ports scanned but not shown below are in state: closed) -\end_layout - -\begin_layout Code -Port State Service -\end_layout - -\begin_layout Code -22/tcp open ssh -\end_layout - -\begin_layout Code -53/tcp open domain -\end_layout - -\begin_layout Code -515/tcp open printer -\end_layout - -\begin_layout Code -2401/tcp open cvspserver -\end_layout - -\begin_layout Code -Nmap run completed -- 1 IP address (1 host up) scanned in 0.525 seconds -\end_layout - -\begin_layout Subsection -Security auditing using IPv6-enabled strobe -\end_layout - -\begin_layout Standard -Strobe is a (compared to NMap) more a low budget portscanner, but there - is an IPv6-enabling patch available (see -\begin_inset CommandInset href -LatexCommand href -name "IPv6+Linux-status-apps/security-auditing" -target "http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status-apps.html#security-auditing" - -\end_inset - - for more). - Usage example: -\end_layout - -\begin_layout Code -# ./strobe ::1 strobe 1.05 (c) 1995-1999 Julian Assange . -\end_layout - -\begin_layout Code -::1 2401 unassigned unknown -\end_layout - -\begin_layout Code -::1 22 ssh Secure Shell - RSA encrypted rsh -\end_layout - -\begin_layout Code -::1 515 printer spooler (lpd) -\end_layout - -\begin_layout Code -::1 6010 unassigned unknown -\end_layout - -\begin_layout Code -::1 53 domain Domain Name Server -\end_layout - -\begin_layout Standard -Note: strobe isn't really developed further on, the shown version number - isn't the right one. -\end_layout - -\begin_layout Subsection -Security auditing using online tools -\end_layout - -\begin_layout Standard -There are some IPv6 enabled online tools available which can support in - testing inbound firewall configuration: -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Tim's Online IPv6 TCP/UDP Port Scanner" -target "http://ipv6.chappell-family.com/ipv6tcptest/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "SubnetOnline IPv6 Scanner" -target "http://www.subnetonline.com/pages/ipv6-network-tools/online-ipv6-port-scanner.php" - -\end_inset - - -\end_layout - -\begin_layout Subsection -Audit results -\end_layout - -\begin_layout Standard -If the result of an audit mismatch your IPv6 security policy, use IPv6 firewalli -ng to close the holes, e.g. - using netfilter6 (see -\begin_inset CommandInset ref -LatexCommand ref -name "Firewalling/Netfilter6" -reference "firewalling-netfilter6" - -\end_inset - - for more). -\end_layout - -\begin_layout Standard -Info: More detailed information concerning IPv6 Security can be found here: - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IETF drafts - IPv6 Operations (v6ops)" -target "http://www.ietf.org/ids.by.wg/v6ops.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "RFC 3964 / Security Considerations for 6to4" -target "http://www.faqs.org/rfcs/rfc3964.html" - -\end_inset - - -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-encryption-authentication" - -\end_inset - -Encryption and Authentication -\end_layout - -\begin_layout Standard -Unlike in IPv4, encryption and authentication is a mandatory feature of - IPv6. - Those features are normally implemented using IPsec (which can be also - used by IPv4). -\end_layout - -\begin_layout Section -Modes of using encryption and authentication -\end_layout - -\begin_layout Standard -Two modes of encryption and authentication of a connection are possible: -\end_layout - -\begin_layout Subsection -Transport mode -\end_layout - -\begin_layout Standard -Transport mode is a real end-to-end connection mode. - Here, only the payload (usually ICMP, TCP or UDP) is encrypted with their - particular header, while the IP header is not encrypted (but usually included - in authentication). -\end_layout - -\begin_layout Standard -Using AES-128 for encryption and SHA1 for authentication, this mode decreases - the MTU by 42 octets. -\end_layout - -\begin_layout Subsection -Tunnel mode -\end_layout - -\begin_layout Standard -Tunnel mode can be used either for end-to-end or for gateway-to-gateway - connection modes. - Here, the complete IP packet is being encrypted and gets a new IP header - prepended, all together constituing a new IP packet (this mechanism is - also known as "encapsulation") -\end_layout - -\begin_layout Standard -This mode usually decreases the MTU by 40 octets from the MTU of transport - mode. - I.e. - using AES-128 for encryption and SHA1 for authentication 82 octets less - than the normal MTU. -\end_layout - -\begin_layout Section -Support in kernel (ESP and AH) -\end_layout - -\begin_layout Subsection -Support in vanilla Linux kernel 2.4.x -\end_layout - -\begin_layout Standard -At the time of writing missing in vanilla up to 2.4.28. - There was an issue about keeping the Linux kernel source free of export/import- -control-laws regarding encryption code. - This is also one case why -\begin_inset CommandInset href -LatexCommand href -name "FreeS/WAN project" -target "http://www.freeswan.org/" - -\end_inset - - wasn't included in vanilla source. - Perhaps a backport from 2.6.x will be done in the future. -\end_layout - -\begin_layout Subsection -Support in vanilla Linux kernel 2.6.x -\end_layout - -\begin_layout Standard -Current versions (as time of writing 2.6.9 and upper) support native IPsec - for IPv4 and IPv6. -\end_layout - -\begin_layout Standard -Implementation was helped by the USAGI project. -\end_layout - -\begin_layout Section -Automatic key exchange (IKE) -\end_layout - -\begin_layout Standard -IPsec requires a key exchange of a secret. - This is mostly done automatically by so called IKE daemons. - They also handle the authentication of the peers, either by a common known - secret (so called -\begin_inset Quotes sld -\end_inset - -pre-shared secret -\begin_inset Quotes srd -\end_inset - -) or by RSA keys (which can also be used from X.509 certificates). -\end_layout - -\begin_layout Standard -Currently, two different IKE daemons are available for Linux, which totally - differ in configuration and usage. -\end_layout - -\begin_layout Standard -I prefer -\begin_inset Quotes sld -\end_inset - -pluto -\begin_inset Quotes srd -\end_inset - - from the *S/WAN implementation because of the easier and one-config-only - setup. -\end_layout - -\begin_layout Subsection -IKE daemon -\begin_inset Quotes sld -\end_inset - -racoon -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -The IKE daemon -\begin_inset Quotes sld -\end_inset - -racoon -\begin_inset Quotes srd -\end_inset - - is taken from the KAME project and ported to Linux. - Modern Linux distributions contain this daemon in the package -\begin_inset Quotes sld -\end_inset - -ipsec-tools -\begin_inset Quotes srd -\end_inset - -. - Two executables are required for a proper IPsec setup. - Take a look on -\begin_inset CommandInset href -LatexCommand href -name "Linux Advanced Routing & Traffic Control HOWTO / IPSEC" -target "http://lartc.org/howto/lartc.ipsec.html" - -\end_inset - -, too. -\end_layout - -\begin_layout Subsubsection -Manipulation of the IPsec SA/SP database with the tool -\begin_inset Quotes sld -\end_inset - -setkey -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset Quotes sld -\end_inset - -setkey -\begin_inset Quotes srd -\end_inset - - is important to define the security policy (SP) for the kernel. -\end_layout - -\begin_layout Standard -File: /etc/racoon/setkey.sh -\end_layout - -\begin_layout Itemize -Example for an end-to-end encrypted connection in transport mode -\end_layout - -\begin_layout Code -#!/sbin/setkey -f -\end_layout - -\begin_layout Code -flush; -\end_layout - -\begin_layout Code -spdflush; -\end_layout - -\begin_layout Code -spdadd 2001:db8:1:1::1 2001:db8:2:2::2 any -P out ipsec esp/transport//require; -\end_layout - -\begin_layout Code -spdadd 2001:db8:2:2::2 2001:db8:1:1::1 any -P in ipsec esp/transport//require; -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Itemize -Example for a end-to-end encrypted connection in tunnel mode -\end_layout - -\begin_layout Code -#!/sbin/setkey -f -\end_layout - -\begin_layout Code -flush; -\end_layout - -\begin_layout Code -spdflush; -\end_layout - -\begin_layout Code -spdadd 2001:db8:1:1::1 2001:db8:2:2::2 any -P out ipsec -\end_layout - -\begin_layout Code -¬ esp/tunnel/2001:db8:1:1::1-2001:db8:2:2::2/require; -\end_layout - -\begin_layout Code -spdadd 2001:db8:2:2::2 2001:db8:1:1::1 any -P in ipsec -\end_layout - -\begin_layout Code -¬ esp/tunnel/2001:db8:2:2::2-2001:db8:1:1::1/require; -\end_layout - -\begin_layout Standard -For the other peer, you have to replace -\begin_inset Quotes sld -\end_inset - -in -\begin_inset Quotes srd -\end_inset - - with -\begin_inset Quotes sld -\end_inset - -out -\begin_inset Quotes srd -\end_inset - -. -\end_layout - -\begin_layout Subsubsection -Configuration of the IKE daemon -\begin_inset Quotes sld -\end_inset - -racoon -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset Quotes sld -\end_inset - -racoon -\begin_inset Quotes srd -\end_inset - - requires a configuration file for proper execution. - It includes the related settings to the security policy, which should be - set up previously using -\begin_inset Quotes sld -\end_inset - -setkey -\begin_inset Quotes srd -\end_inset - -. -\end_layout - -\begin_layout Standard -File: /etc/racoon/racoon.conf -\end_layout - -\begin_layout Code -# Racoon IKE daemon configuration file. -\end_layout - -\begin_layout Code -# See 'man racoon.conf' for a description of the format and entries. -\end_layout - -\begin_layout Code -path include "/etc/racoon"; -\end_layout - -\begin_layout Code -path pre_shared_key "/etc/racoon/psk.txt"; -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code -listen -\end_layout - -\begin_layout Code -{ -\end_layout - -\begin_layout Code - isakmp 2001:db8:1:1::1; -\end_layout - -\begin_layout Code -} -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code -remote 2001:db8:2:2::2 -\end_layout - -\begin_layout Code -{ -\end_layout - -\begin_layout Code - exchange_mode main; -\end_layout - -\begin_layout Code - lifetime time 24 hour; -\end_layout - -\begin_layout Code - proposal -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - encryption_algorithm 3des; -\end_layout - -\begin_layout Code - hash_algorithm md5; -\end_layout - -\begin_layout Code - authentication_method pre_shared_key; -\end_layout - -\begin_layout Code - dh_group 2; -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code -} -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code -# gateway-to-gateway -\end_layout - -\begin_layout Code -sainfo address 2001:db8:1:1::1 any address 2001:db8:2:2::2 any -\end_layout - -\begin_layout Code -{ -\end_layout - -\begin_layout Code - lifetime time 1 hour; -\end_layout - -\begin_layout Code - encryption_algorithm 3des; -\end_layout - -\begin_layout Code - authentication_algorithm hmac_md5; -\end_layout - -\begin_layout Code - compression_algorithm deflate; -\end_layout - -\begin_layout Code -} -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code -sainfo address 2001:db8:2:2::2 any address 2001:db8:1:1::1 any -\end_layout - -\begin_layout Code -{ -\end_layout - -\begin_layout Code - lifetime time 1 hour; -\end_layout - -\begin_layout Code - encryption_algorithm 3des; -\end_layout - -\begin_layout Code - authentication_algorithm hmac_md5; -\end_layout - -\begin_layout Code - compression_algorithm deflate; -\end_layout - -\begin_layout Code -} -\end_layout - -\begin_layout Standard -Also set up the pre-shared secret: -\end_layout - -\begin_layout Standard -File: /etc/racoon/psk.txt -\end_layout - -\begin_layout Code -# file for pre-shared keys used for IKE authentication -\end_layout - -\begin_layout Code -# format is: 'identifier' 'key' -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code -2001:db8:2:2::2 verysecret -\end_layout - -\begin_layout Subsubsection -Running IPsec with IKE daemon -\begin_inset Quotes sld -\end_inset - -racoon -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -At least the daemon needs to be started. - For the first time, use debug and foreground mode. - The following example shows a successful IKE phase 1 (ISAKMP-SA) and 2 - (IPsec-SA) negotiation: -\end_layout - -\begin_layout Code -# racoon -F -v -f /etc/racoon/racoon.conf -\end_layout - -\begin_layout Code -Foreground mode. - -\end_layout - -\begin_layout Code -2005-01-01 20:30:15: INFO: @(#)ipsec-tools 0.3.3 -\end_layout - -\begin_layout Code -¬ (http://ipsec-tools.sourceforge.net) -\end_layout - -\begin_layout Code -2005-01-01 20:30:15: INFO: @(#)This product linked -\end_layout - -\begin_layout Code -¬ OpenSSL 0.9.7a Feb 19 2003 (http://www.openssl.org/) -\end_layout - -\begin_layout Code -2005-01-01 20:30:15: INFO: 2001:db8:1:1::1[500] used as isakmp port (fd=7) -\end_layout - -\begin_layout Code -2005-01-01 20:31:06: INFO: IPsec-SA request for 2001:db8:2:2::2 -\end_layout - -\begin_layout Code -¬ queued due to no phase1 found. -\end_layout - -\begin_layout Code -2005-01-01 20:31:06: INFO: initiate new phase 1 negotiation: -\end_layout - -\begin_layout Code -¬ 2001:db8:1:1::1[500]<=>2001:db8:2:2::2[500] -\end_layout - -\begin_layout Code -2005-01-01 20:31:06: INFO: begin Identity Protection mode. -\end_layout - -\begin_layout Code -2005-01-01 20:31:09: INFO: ISAKMP-SA established -\end_layout - -\begin_layout Code -¬ 2001:db8:1:1::1[500]-2001:db8:2:2::2[500] spi:da3d3693289c9698:ac039a402b2db40 -1 -\end_layout - -\begin_layout Code -2005-01-01 20:31:09: INFO: initiate new phase 2 negotiation: -\end_layout - -\begin_layout Code -¬ 2001:6f8:900:94::2[0]<=>2001:db8:2:2::2[0] -\end_layout - -\begin_layout Code -2005-01-01 20:31:10: INFO: IPsec-SA established: -\end_layout - -\begin_layout Code -¬ ESP/Tunnel 2001:db8:2:2::2->2001:db8:1:1::1 spi=253935531(0xf22bfab) -\end_layout - -\begin_layout Code -2005-01-01 20:31:10: INFO: IPsec-SA established: -\end_layout - -\begin_layout Code -¬ ESP/Tunnel 2001:db8:1:1::1->2001:db8:2:2::2 spi=175002564(0xa6e53c4) -\end_layout - -\begin_layout Standard -Each direction got its own IPsec-SA (like defined in the IPsec standard). - With -\begin_inset Quotes sld -\end_inset - -tcpdump -\begin_inset Quotes srd -\end_inset - - on the related interface, you will see as result of an IPv6 ping: -\end_layout - -\begin_layout Code -20:35:55.305707 2001:db8:1:1::1 > 2001:db8:2:2::2: ESP(spi=0x0a6e53c4,seq=0x3) -\end_layout - -\begin_layout Code -20:35:55.537522 2001:db8:2:2::2 > 2001:db8:1:1::1: ESP(spi=0x0f22bfab,seq=0x3) -\end_layout - -\begin_layout Standard -As expected, the negotiated SPIs are being used here. -\end_layout - -\begin_layout Standard -And using -\begin_inset Quotes sld -\end_inset - -setkey -\begin_inset Quotes srd -\end_inset - -, current active parameters are shown: -\end_layout - -\begin_layout Code -# setkey -D -\end_layout - -\begin_layout Code -2001:db8:1:1::1 2001:db8:2:2::2 -\end_layout - -\begin_layout Code - esp mode=tunnel spi=175002564(0x0a6e53c4) reqid=0(0x00000000) -\end_layout - -\begin_layout Code - E: 3des-cbc bd26bc45 aea0d249 ef9c6b89 7056080f 5d9fa49c 924e2edd -\end_layout - -\begin_layout Code - A: hmac-md5 60c2c505 517dd8b7 c9609128 a5efc2db -\end_layout - -\begin_layout Code - seq=0x00000000 replay=4 flags=0x00000000 state=mature -\end_layout - -\begin_layout Code - created: Jan 1 20:31:10 2005 current: Jan 1 20:40:47 2005 -\end_layout - -\begin_layout Code - diff: 577(s) hard: 3600(s) soft: 2880(s) -\end_layout - -\begin_layout Code - last: Jan 1 20:35:05 2005 hard: 0(s) soft: 0(s) -\end_layout - -\begin_layout Code - current: 540(bytes) hard: 0(bytes) soft: 0(bytes) -\end_layout - -\begin_layout Code - allocated: 3 hard: 0 soft: 0 -\end_layout - -\begin_layout Code - sadb_seq=1 pid=22358 refcnt=0 -\end_layout - -\begin_layout Code -2001:db8:2:2::2 2001:db8:1:1::1 -\end_layout - -\begin_layout Code - esp mode=tunnel spi=253935531(0x0f22bfab) reqid=0(0x00000000) -\end_layout - -\begin_layout Code - E: 3des-cbc c1ddba65 83debd62 3f6683c1 20e747ac 933d203f 4777a7ce -\end_layout - -\begin_layout Code - A: hmac-md5 3f957db9 9adddc8c 44e5739d 3f53ca0e -\end_layout - -\begin_layout Code - seq=0x00000000 replay=4 flags=0x00000000 state=mature -\end_layout - -\begin_layout Code - created: Jan 1 20:31:10 2005 current: Jan 1 20:40:47 2005 -\end_layout - -\begin_layout Code - diff: 577(s) hard: 3600(s) soft: 2880(s) -\end_layout - -\begin_layout Code - last: Jan 1 20:35:05 2005 hard: 0(s) soft: 0(s) -\end_layout - -\begin_layout Code - current: 312(bytes) hard: 0(bytes) soft: 0(bytes) -\end_layout - -\begin_layout Code - allocated: 3 hard: 0 soft: 0 -\end_layout - -\begin_layout Code - sadb_seq=0 pid=22358 refcnt=0 -\end_layout - -\begin_layout Subsection -IKE daemon -\begin_inset Quotes sld -\end_inset - -pluto -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -The IKE daemon -\begin_inset Quotes sld -\end_inset - -pluto -\begin_inset Quotes srd -\end_inset - - is included in distributions of the *S/WAN projects. - *S/WAN project starts at the beginning as -\begin_inset CommandInset href -LatexCommand href -name "FreeS/WAN" -target "http://www.freeswan.org/" - -\end_inset - -. - Unfortunately, the FreeS/WAN project stopped further development in 2004. - Because of the slow pace of development in the past, two spin-offs started: - -\begin_inset CommandInset href -LatexCommand href -name "strongSwan" -target "http://www.strongswan.org/" - -\end_inset - - and -\begin_inset CommandInset href -LatexCommand href -name "Openswan" -target "http://www.openswan.org/" - -\end_inset - -. - Today, readily installable packages are available for at least Openswan - (included in Fedora Core 3). -\end_layout - -\begin_layout Standard -A major difference to -\begin_inset Quotes sld -\end_inset - -racoon -\begin_inset Quotes srd -\end_inset - -, only one configuration file is required. - Also, an initscript exists for automatic setup after booting. -\end_layout - -\begin_layout Subsubsection -Configuration of the IKE daemon -\begin_inset Quotes sld -\end_inset - -pluto -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -The configuration is very similar to the IPv4 one, only one important option - is necessary. -\end_layout - -\begin_layout Standard -File: /etc/ipsec.conf -\end_layout - -\begin_layout Code -# /etc/ipsec.conf - Openswan IPsec configuration file -\end_layout - -\begin_layout Code -# -\end_layout - -\begin_layout Code -# Manual: ipsec.conf.5 -\end_layout - -\begin_layout Code -version 2.0 # conforms to second version of ipsec.conf specification -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code -# basic configuration -\end_layout - -\begin_layout Code -config setup -\end_layout - -\begin_layout Code - # Debug-logging controls: "none" for (almost) none, "all" for lots. -\end_layout - -\begin_layout Code - # klipsdebug=none -\end_layout - -\begin_layout Code - # plutodebug="control parsing" -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code -#Disable Opportunistic Encryption -\end_layout - -\begin_layout Code -include /etc/ipsec.d/examples/no_oe.conf -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code -conn ipv6-p1-p2 -\end_layout - -\begin_layout Code - connaddrfamily=ipv6 # Important for IPv6, but no longer needed - since StrongSwan 4 -\end_layout - -\begin_layout Code - left=2001:db8:1:1::1 -\end_layout - -\begin_layout Code - right=2001:db8:2:2::2 -\end_layout - -\begin_layout Code - authby=secret -\end_layout - -\begin_layout Code - esp=aes128-sha1 -\end_layout - -\begin_layout Code - ike=aes128-sha-modp1024 -\end_layout - -\begin_layout Code - type=transport -\end_layout - -\begin_layout Code - #type=tunnel -\end_layout - -\begin_layout Code - compress=no -\end_layout - -\begin_layout Code - #compress=yes -\end_layout - -\begin_layout Code - auto=add -\end_layout - -\begin_layout Code - #auto=up -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Standard -Don't forget to define the pre-shared secret here also. -\end_layout - -\begin_layout Standard -File: /etc/ipsec.secrets -\end_layout - -\begin_layout Code -2001:db8:1:1::1 2001:db8:2:2::2 : PSK "verysecret" -\end_layout - -\begin_layout Subsubsection -Running IPsec with IKE daemon -\begin_inset Quotes sld -\end_inset - -pluto -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -If installation of Openswan was successfully, an initscript should exist - for starting IPsec, simply run (on each peer): -\end_layout - -\begin_layout Code -# /etc/rc.d/init.d/ipsec start -\end_layout - -\begin_layout Standard -Afterwards, start this connection on one peer. - If you saw the line -\begin_inset Quotes sld -\end_inset - -IPsec SA established -\begin_inset Quotes srd -\end_inset - -, all worked fine. -\end_layout - -\begin_layout Code -# ipsec auto --up ipv6-peer1-peer2 -\end_layout - -\begin_layout Code -104 "ipv6-p1-p2" #1: STATE_MAIN_I1: initiate -\end_layout - -\begin_layout Code -106 "ipv6-p1-p2" #1: STATE_MAIN_I2: sent MI2, expecting MR2 -\end_layout - -\begin_layout Code -108 "ipv6-p1-p2" #1: STATE_MAIN_I3: sent MI3, expecting MR3 -\end_layout - -\begin_layout Code -004 "ipv6-p1-p2" #1: STATE_MAIN_I4: ISAKMP SA established -\end_layout - -\begin_layout Code -112 "ipv6-p1-p2" #2: STATE_QUICK_I1: initiate -\end_layout - -\begin_layout Code -004 "ipv6-p1-p2" #2: STATE_QUICK_I2: sent QI2, -\end_layout - -\begin_layout Code -¬ IPsec SA established {ESP=>0xa98b7710 <0xa51e1f22} -\end_layout - -\begin_layout Standard -Because *S/WAN and setkey/racoon do use the same IPsec implementation in - Linux 2.6.x kernel, -\begin_inset Quotes sld -\end_inset - -setkey -\begin_inset Quotes srd -\end_inset - - can be used here too to show current active parameters: -\end_layout - -\begin_layout Code -# setkey -D -\end_layout - -\begin_layout Code -2001:db8:1:1::1 2001:db8:2:2::2 -\end_layout - -\begin_layout Code - esp mode=transport spi=2844489488(0xa98b7710) reqid=16385(0x00004001) -\end_layout - -\begin_layout Code - E: aes-cbc 082ee274 2744bae5 7451da37 1162b483 -\end_layout - -\begin_layout Code - A: hmac-sha1 b7803753 757417da 477b1c1a 64070455 ab79082c -\end_layout - -\begin_layout Code - seq=0x00000000 replay=64 flags=0x00000000 state=mature -\end_layout - -\begin_layout Code - created: Jan 1 21:16:32 2005 current: Jan 1 21:22:20 2005 -\end_layout - -\begin_layout Code - diff: 348(s) hard: 0(s) soft: 0(s) -\end_layout - -\begin_layout Code - last: hard: 0(s) soft: 0(s) -\end_layout - -\begin_layout Code - current: 0(bytes) hard: 0(bytes) soft: 0(bytes) -\end_layout - -\begin_layout Code - allocated: 0 hard: 0 soft: 0 -\end_layout - -\begin_layout Code - sadb_seq=1 pid=23825 refcnt=0 -\end_layout - -\begin_layout Code -2001:db8:2:2::2 2001:db8:1:1::1 -\end_layout - -\begin_layout Code - esp mode=transport spi=2770214690(0xa51e1f22) reqid=16385(0x00004001) -\end_layout - -\begin_layout Code - E: aes-cbc 6f59cc30 8d856056 65e07b76 552cac18 -\end_layout - -\begin_layout Code - A: hmac-sha1 c7c7d82b abfca8b1 5440021f e0c3b335 975b508b -\end_layout - -\begin_layout Code - seq=0x00000000 replay=64 flags=0x00000000 state=mature -\end_layout - -\begin_layout Code - created: Jan 1 21:16:31 2005 current: Jan 1 21:22:20 2005 -\end_layout - -\begin_layout Code - diff: 349(s) hard: 0(s) soft: 0(s) -\end_layout - -\begin_layout Code - last: hard: 0(s) soft: 0(s) -\end_layout - -\begin_layout Code - current: 0(bytes) hard: 0(bytes) soft: 0(bytes) -\end_layout - -\begin_layout Code - allocated: 0 hard: 0 soft: 0 -\end_layout - -\begin_layout Code - sadb_seq=0 pid=23825 refcnt=0 -\end_layout - -\begin_layout Section -Additional informations: -\end_layout - -\begin_layout Standard -On Linux Kernel 2.6.x you can get the policy and status of IPsec also using - -\begin_inset Quotes sld -\end_inset - -ip -\begin_inset Quotes srd -\end_inset - -: -\end_layout - -\begin_layout Code -# ip xfrm policy -\end_layout - -\begin_layout Code -... -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code -# ip xfrm state -\end_layout - -\begin_layout Code -... -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-qos" - -\end_inset - -Quality of Service (QoS) -\end_layout - -\begin_layout Standard -IPv6 supports QoS with use of Flow Labels and Traffic Classes. -\end_layout - -\begin_layout Standard -Additional infos: -\end_layout - -\begin_layout Itemize - -\lang ngerman -\begin_inset CommandInset href -LatexCommand href -name "RFC 3697 / IPv6 Flow Label Specification" -target "http://www.faqs.org/rfcs/rfc3697.html" - -\end_inset - - -\end_layout - -\begin_layout Section -General -\end_layout - -\begin_layout Standard -Proper working QoS is only possible on the outgoing interface of a router - or host, where the bottleneck begins. - Everything else is a hickup and not subject to work as expected or has - a successful result. -\end_layout - -\begin_layout Code --------------->------- -\end_layout - -\begin_layout Code - Queue 1 -\backslash - -\end_layout - -\begin_layout Code - --->--- ---->--------->--------->--------------- -\end_layout - -\begin_layout Code -Big pipe Queue 2 Queue 1 / Queue 2 / Queue 3 Thin Pipe -\end_layout - -\begin_layout Code - --->---- ---->--------->--------->--------------- -\end_layout - -\begin_layout Code - Queue 3 / -\end_layout - -\begin_layout Code --------------->------- -\end_layout - -\begin_layout Section -Linux QoS using -\begin_inset Quotes sld -\end_inset - -tc -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -Linux is using -\begin_inset Quotes sld -\end_inset - -tc -\begin_inset Quotes srd -\end_inset - - from the -\begin_inset Quotes sld -\end_inset - -iproute2 -\begin_inset Quotes srd -\end_inset - - package to configure traffic shaping, generally described in the -\begin_inset CommandInset href -LatexCommand href -name "Linux Advanced Routing & Traffic Control HOWTO" -target "http://lartc.org/" - -\end_inset - -. -\end_layout - -\begin_layout Subsection -Example for a constant bitrate queuing -\end_layout - -\begin_layout Standard -With the -\begin_inset Quotes sld -\end_inset - -cbq -\begin_inset Quotes srd -\end_inset - - scheduler, pipes with constant bit rates can be defined. -\end_layout - -\begin_layout Subsubsection -Root qdisc definition -\end_layout - -\begin_layout Standard -Define root qdisc with a bandwidth of 1000 MBit/s on eth1 -\end_layout - -\begin_layout Code -# tc qdisc add dev eth1 root handle 1: cbq avpkt 1000 bandwidth 1000Mbit -\end_layout - -\begin_layout Subsubsection -QoS class definition -\end_layout - -\begin_layout Standard -Define a class 1:1 with 1 MBit/s -\end_layout - -\begin_layout Code -# tc class add dev eth1 parent 1: classid 1:1 cbq rate 1Mbit allot 1500 - bounded -\end_layout - -\begin_layout Standard -Define a class 1:2 with 50 MBit/s -\end_layout - -\begin_layout Code -# tc class add dev eth1 parent 1: classid 1:2 cbq rate 50Mbit allot 1500 - bounded -\end_layout - -\begin_layout Standard -Define a class 1:3 with 10 MBit/s -\end_layout - -\begin_layout Code -# tc class add dev eth1 parent 1: classid 1:3 cbq rate 10Mbit allot 1500 - bounded -\end_layout - -\begin_layout Standard -Define a class 1:4 with 200 kBit/s -\end_layout - -\begin_layout Code -# tc class add dev eth1 parent 1: classid 1:4 cbq rate 200kbit allot 1500 - bounded -\end_layout - -\begin_layout Subsubsection -QoS filter definition -\end_layout - -\begin_layout Standard -Define a filter for IPv4 ( -\emph on -protocol ip -\emph default -), TCP ( -\emph on -match ip protocol 6 0xff -\emph default -) destination port 5001 ( -\emph on -match ip dport 5001 0xffff -\emph default -) using class 1:2 from above -\end_layout - -\begin_layout Code -# tc filter add dev eth1 parent 1: protocol ip u32 match ip protocol - 6 0xff match ip dport 5001 0xffff flowid 1:1 -\end_layout - -\begin_layout Standard -Define a filter for IPv6 ( -\emph on -protocol ip -\emph default -), TCP ( -\emph on -match ip6 protocol 6 0xff -\emph default -) destination port 5001 using class 1:2 from above -\end_layout - -\begin_layout Code -# tc filter add dev eth1 parent 1: protocol ipv6 u32 match ip6 protocol - 6 0xff match ip6 dport 5001 0xffff flowid 1:2 -\end_layout - -\begin_layout Standard -Define a filter for IPv6 for packets having flow label 12345 ( -\emph on -match ip6 flowlabel 12345 0x3ffff -\emph default -) using class 1:3 from above -\end_layout - -\begin_layout Code -# tc filter add dev eth1 parent 1: protocol ipv6 u32 match ip6 flowlabel - 12345 0x3ffff flowid 1:3 -\end_layout - -\begin_layout Standard -Define a filter for IPv6 for packets having Linux iptables mark 32 ( -\emph on -handle 32 fw -\emph default -) specified using class 1:4 from above -\end_layout - -\begin_layout Code -# tc filter add dev eth1 parent 1: protocol ipv6 handle 32 fw flowid 1:4 -\end_layout - -\begin_layout Standard -The last filter definition requires an entry in the ip6tables to mark a - packet -\end_layout - -\begin_layout Code -# ip6tables -A POSTROUTING -t mangle -p tcp --dport 5003 -j MARK --set-mark - 32 -\end_layout - -\begin_layout Subsubsection -Testing filter definitions using iperf -\end_layout - -\begin_layout Standard -Start on server side each one one separate console: -\end_layout - -\begin_layout Code -# iperf -V -s -p 5001 -\end_layout - -\begin_layout Code -# iperf -V -s -p 5002 -\end_layout - -\begin_layout Code -# iperf -V -s -p 5003 -\end_layout - -\begin_layout Standard -Start on client side and compare results: -\end_layout - -\begin_layout Code -# iperf -V -c SERVER-IPv4 -p 5001 (expected: 1 MBit/s) -\end_layout - -\begin_layout Code -# iperf -V -c SERVER-IPv6 -p 5001 (expected: 50 MBit/s) -\end_layout - -\begin_layout Code -# iperf -V -c SERVER-IPv4 -p 5002 (expected: >> 50 MBit/s && <= 1000 - MBit/s) -\end_layout - -\begin_layout Code -# iperf -V -c SERVER-IPv6 -p 5002 (expected: >> 50 MBit/s && <= 1000 - MBit/s) -\end_layout - -\begin_layout Code -# iperf -V -c SERVER-IPv4 -p 5003 (expected: >> 50 MBit/s && <= 1000 - MBit/s) -\end_layout - -\begin_layout Code -# iperf -V -c SERVER-IPv6 -p 5003 (expected: 200 kBit/s) -\end_layout - -\begin_layout Standard -The rate result should be as defined in the classes (see above), the results - on port 5002 should be very similar independend from used IP version. -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-hints-daemons" - -\end_inset - -Hints for IPv6-enabled daemons -\end_layout - -\begin_layout Standard -Here some hints are shown for IPv6-enabled daemons. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-bind" - -\end_inset - -Berkeley Internet Name Domain (BIND) daemon -\begin_inset Quotes sld -\end_inset - -named -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -IPv6 is supported since version 9. - Always use newest available version. - At least version 9.1.3 must be used, older versions can contain remote exploitabl -e security holes. -\end_layout - -\begin_layout Subsection -Listening on IPv6 addresses -\end_layout - -\begin_layout Standard -Note: unlike in IPv4 current versions doesn't allow to bind a server socket - to dedicated IPv6 addresses, so only -\emph on -any -\emph default - or -\emph on -none -\emph default - are valid. - Because this can be a security issue, check the Access Control List (ACL) - section below, too! -\end_layout - -\begin_layout Subsubsection -Enable BIND named for listening on IPv6 address -\end_layout - -\begin_layout Standard -To enable IPv6 for listening, following options are requested to change -\end_layout - -\begin_layout Code -options { -\end_layout - -\begin_layout Code - # sure other options here, too -\end_layout - -\begin_layout Code - listen-on-v6 { any; }; -\end_layout - -\begin_layout Code -}; -\end_layout - -\begin_layout Standard -This should result after restart in e.g. -\end_layout - -\begin_layout Code -# netstat -lnptu |grep "named -\backslash -W*$" -\end_layout - -\begin_layout Code -tcp 0 0 :::53 :::* LISTEN 1234/named -\end_layout - -\begin_layout Code -¬ # incoming TCP requests -\end_layout - -\begin_layout Code -udp 0 0 1.2.3.4:53 0.0.0.0:* 1234/named -\end_layout - -\begin_layout Code -¬ # incoming UDP requests to IPv4 1.2.3.4 -\end_layout - -\begin_layout Code -udp 0 0 127.0.0.1:53 0.0.0.0:* 1234/named -\end_layout - -\begin_layout Code -¬ # incoming UDP requests to IPv4 localhost -\end_layout - -\begin_layout Code -udp 0 0 0.0.0.0:32868 0.0.0.0:* 1234/named -\end_layout - -\begin_layout Code -¬ # dynamic chosen port for outgoing queries -\end_layout - -\begin_layout Code -udp 0 0 :::53 :::* 1234/named -\end_layout - -\begin_layout Code -¬ # incoming UDP request to any IPv6 -\end_layout - -\begin_layout Standard -And a simple test looks like -\end_layout - -\begin_layout Code -# dig localhost @::1 -\end_layout - -\begin_layout Standard -and should show you a result. -\end_layout - -\begin_layout Subsubsection -Disable BIND named for listening on IPv6 address -\end_layout - -\begin_layout Standard -To disable IPv6 for listening, following options are requested to change -\end_layout - -\begin_layout Code -options { -\end_layout - -\begin_layout Code - # sure other options here, too -\end_layout - -\begin_layout Code - listen-on-v6 { none; }; -\end_layout - -\begin_layout Code -}; -\end_layout - -\begin_layout Subsection -IPv6 enabled Access Control Lists (ACL) -\end_layout - -\begin_layout Standard -IPv6 enabled ACLs are possible and should be used whenever it's possible. - An example looks like following: -\end_layout - -\begin_layout Code -acl internal-net { -\end_layout - -\begin_layout Code - 127.0.0.1; -\end_layout - -\begin_layout Code - 1.2.3.0/24; -\end_layout - -\begin_layout Code - 2001:0db8:100::/56; -\end_layout - -\begin_layout Code - ::1/128; -\end_layout - -\begin_layout Code - ::ffff:1.2.3.4/128; -\end_layout - -\begin_layout Code -}; -\end_layout - -\begin_layout Code -acl ns-internal-net { -\end_layout - -\begin_layout Code - 1.2.3.4; -\end_layout - -\begin_layout Code - 1.2.3.5; -\end_layout - -\begin_layout Code - 2001:0db8:100::4/128; -\end_layout - -\begin_layout Code - 2001:0db8:100::5/128; -\end_layout - -\begin_layout Code -}; -\end_layout - -\begin_layout Standard -This ACLs can be used e.g. - for queries of clients and transfer zones to secondary name-servers. - This prevents also your caching name-server to be used from outside using - IPv6. -\end_layout - -\begin_layout Code -options { -\end_layout - -\begin_layout Code - # sure other options here, too -\end_layout - -\begin_layout Code - listen-on-v6 { none; }; -\end_layout - -\begin_layout Code - allow-query { internal-net; }; -\end_layout - -\begin_layout Code - allow-transfer { ns-internal-net; }; -\end_layout - -\begin_layout Code -}; -\end_layout - -\begin_layout Standard -It's also possible to set the -\emph on -allow-query -\emph default -and -\emph on -allow-transfer -\emph default - option for most of single zone definitions, too. -\end_layout - -\begin_layout Subsection -Sending queries with dedicated IPv6 address -\end_layout - -\begin_layout Standard -This option is not required, but perhaps needed: -\end_layout - -\begin_layout Code -query-source-v6 address port ; -\end_layout - -\begin_layout Subsection -Per zone defined dedicated IPv6 addresses -\end_layout - -\begin_layout Standard -It's also possible to define per zone some IPv6 addresses. -\end_layout - -\begin_layout Subsubsection -Transfer source address -\end_layout - -\begin_layout Standard -Transfer source address is used for outgoing zone transfers: -\end_layout - -\begin_layout Code -transfer-source-v6 [port port]; -\end_layout - -\begin_layout Subsubsection -Notify source address -\end_layout - -\begin_layout Standard -Notify source address is used for outgoing notify messages: -\end_layout - -\begin_layout Code -notify-source-v6 [port port]; -\end_layout - -\begin_layout Subsection -IPv6 DNS zone files examples -\end_layout - -\begin_layout Standard -Some information can be also found at -\begin_inset CommandInset href -LatexCommand href -name "IPv6 DNS Setup Information (article)" -target "http://www.isi.edu/~bmanning/v6DNS.html" - -\end_inset - -. - Perhaps also helpful is the -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Reverse DNS zone builder for BIND 8/9 (webtool)" -target "http://tools.fpsn.net/ipv6-inaddr/" - -\end_inset - -. -\end_layout - -\begin_layout Subsection -Serving IPv6 related DNS data -\end_layout - -\begin_layout Standard -For IPv6 new types and root zones for reverse lookups are defined: -\end_layout - -\begin_layout Itemize -AAAA and reverse IP6.INT: specified in -\begin_inset CommandInset href -LatexCommand href -name "RFC 1886 / DNS Extensions to support IP version 6" -target "http://www.faqs.org/rfcs/rfc1886.html" - -\end_inset - -, usable since BIND version 4.9.6 -\end_layout - -\begin_layout Itemize -A6, DNAME (DEPRECATED NOW!) and reverse IP6.ARPA: specified in -\begin_inset CommandInset href -LatexCommand href -name "RFC 2874 / DNS Extensions to Support IPv6 Address Aggregation and Renumbering" -target "http://www.faqs.org/rfcs/rfc2874.html" - -\end_inset - -, usable since BIND 9, but see also an information about the current state - at -\begin_inset CommandInset href -LatexCommand href -name "Domain Name System Extension (dnsext)" -target "http://www.ietf.org/ids.by.wg/dnsext.html" - -\end_inset - - -\end_layout - -\begin_layout Standard -Perhaps filled later more content, for the meantime take a look at given - RFCs and -\end_layout - -\begin_layout Itemize -AAAA and reverse IP6.INT: -\begin_inset CommandInset href -LatexCommand href -name "IPv6 DNS Setup Information" -target "http://www.isi.edu/~bmanning/v6DNS.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -A6, DNAME (DEPRECATED NOW!) and reverse IP6.ARPA: take a look into chapter - 4 and 6 of the BIND 9 Administrator Reference Manual (ARM) distributed - with the bind-package or get this here: -\begin_inset CommandInset href -LatexCommand href -name "BIND manual version 9.3" -target "http://www.isc.org/sw/bind/arm93/" - -\end_inset - - -\end_layout - -\begin_layout Standard -Because IP6.INT is deprecated (but still in use), a DNS server which will - support IPv6 information has to serve both reverse zones. -\end_layout - -\begin_layout Subsubsection -Current best practice -\end_layout - -\begin_layout Standard -Because there are some troubles around using the new formats, current best - practice is: -\end_layout - -\begin_layout Standard -Forward lookup support: -\end_layout - -\begin_layout Itemize -AAAA -\end_layout - -\begin_layout Standard -Reverse lookup support: -\end_layout - -\begin_layout Itemize -Reverse nibble format for zone ip6.int (FOR BACKWARD COMPATIBILITY) -\end_layout - -\begin_layout Itemize -Reverse nibble format for zone ip6.arpa (RECOMMENDED) -\end_layout - -\begin_layout Subsection -Checking IPv6-enabled connect -\end_layout - -\begin_layout Standard -To check, whether BIND named is listening on an IPv6 socket and serving - data see following examples. -\end_layout - -\begin_layout Subsubsection -IPv6 connect, but denied by ACL -\end_layout - -\begin_layout Standard -Specifying a dedicated server for the query, an IPv6 connect can be forced: -\end_layout - -\begin_layout Code -$ host -t aaaa www.6bone.net 2001:0db8:200:f101::1 -\end_layout - -\begin_layout Code -Using domain server: -\end_layout - -\begin_layout Code -Name: 2001:0db8:200:f101::1 -\end_layout - -\begin_layout Code -Address: 2001:0db8:200:f101::1#53 -\end_layout - -\begin_layout Code -Aliases: -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code -Host www.6bone.net. - not found: 5(REFUSED) -\end_layout - -\begin_layout Standard -Related log entry looks like following: -\end_layout - -\begin_layout Code -Jan 3 12:43:32 gate named[12347]: client -\end_layout - -\begin_layout Code -¬ 2001:0db8:200:f101:212:34ff:fe12:3456#32770: -\end_layout - -\begin_layout Code - query denied -\end_layout - -\begin_layout Standard -If you see such entries in the log, check whether requests from this client - should be allowed and perhaps review your ACL configuration. -\end_layout - -\begin_layout Subsubsection -Successful IPv6 connect -\end_layout - -\begin_layout Standard -A successful IPv6 connect looks like following: -\end_layout - -\begin_layout Code -$ host -t aaaa www.6bone.net 2001:0db8:200:f101::1 -\end_layout - -\begin_layout Code -Using domain server: -\end_layout - -\begin_layout Code -Name: 2001:0db8:200:f101::1 -\end_layout - -\begin_layout Code -Address: 2001:0db8:200:f101::1#53 -\end_layout - -\begin_layout Code -Aliases: -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code -www.6bone.net. - is an alias for 6bone.net. - -\end_layout - -\begin_layout Code -6bone.net. - has AAAA address 3ffe:b00:c18:1::10 -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-xinetd" - -\end_inset - -Internet super daemon (xinetd) -\end_layout - -\begin_layout Standard -IPv6 is supported since -\begin_inset CommandInset href -LatexCommand href -name "xinetd" -target "http://www.xinetd.org/" - -\end_inset - - version around 1.8.9. - Always use newest available version. - At least version 2.3.3 must be used, older versions can contain remote exploitabl -e security holes. -\end_layout - -\begin_layout Standard -Some Linux distribution contain an extra package for the IPv6 enabled xinetd, - some others start the IPv6-enabled xinetd if following variable is set: - NETWORKING_IPV6="yes", mostly done by /etc/sysconfig/network (only valid - for Red Hat like distributions). - In newer releases, one binary supports IPv4 and IPv6. -\end_layout - -\begin_layout Standard -If you enable a built-in service like e.g. - daytime by modifying the configuration file in /etc/xinetd.d/daytime like -\end_layout - -\begin_layout Code -# diff -u /etc/xinetd.d/daytime.orig /etc/xinetd.d/daytime -\end_layout - -\begin_layout Code ---- /etc/xinetd.d/daytime.orig Sun Dec 16 19:00:14 2001 -\end_layout - -\begin_layout Code -+++ /etc/xinetd.d/daytime Sun Dec 16 19:00:22 2001 -\end_layout - -\begin_layout Code -@@ -10,5 +10,5 @@ -\end_layout - -\begin_layout Code - protocol = tcp -\end_layout - -\begin_layout Code - user = root -\end_layout - -\begin_layout Code - wait = no -\end_layout - -\begin_layout Code -- disable = yes -\end_layout - -\begin_layout Code -+ disable = no -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Standard -After restarting the xinetd you should get a positive result like: -\end_layout - -\begin_layout Code -# netstat -lnptu -A inet6 |grep "xinetd*" -\end_layout - -\begin_layout Code -tcp 0 0 ::ffff:192.168.1.1:993 :::* LISTEN 12345/xinetd-ipv6 -\end_layout - -\begin_layout Code -tcp 0 0 :::13 :::* LISTEN 12345/xinetd-ipv6 <- service -\end_layout - -\begin_layout Code -¬ daytime/tcp -\end_layout - -\begin_layout Code -tcp 0 0 ::ffff:192.168.1.1:143 :::* LISTEN 12345/xinetd-ipv6 -\end_layout - -\begin_layout Standard -Shown example also displays an IMAP and IMAP-SSL IPv4-only listening xinetd. -\end_layout - -\begin_layout Standard -Note: earlier versions had a problem that an IPv4-only xinetd won't start - on an IPv6-enabled node and also the IPv6-enabled xinetd won't start on - an IPv4-only node. - This is known to be fixed in later versions, at least version 2.3.11. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-apache2" - -\end_inset - -Webserver Apache2 (httpd2) -\end_layout - -\begin_layout Standard -Apache web server supports IPv6 native by maintainers since 2.0.14. - Available patches for the older 1.3.x series are not current and shouldn't - be used in public environment, but available at -\begin_inset CommandInset href -LatexCommand href -name "KAME / Misc" -target "ftp://ftp.kame.net/pub/kame/misc/" - -\end_inset - -. -\end_layout - -\begin_layout Subsection -Listening on IPv6 addresses -\end_layout - -\begin_layout Standard -Note: virtual hosts on IPv6 addresses are broken in versions until 2.0.28 - (a patch is available for 2.0.28). - But always try latest available version first because earlier versions - had some security issues. -\end_layout - -\begin_layout Subsubsection -Virtual host listen on an IPv6 address only -\end_layout - -\begin_layout Code -Listen [2001:0db8:100::1]:80 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - ServerName ipv6only.yourdomain.yourtopleveldomain -\end_layout - -\begin_layout Code - # ...sure more config lines -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Subsubsection -Virtual host listen on an IPv6 and on an IPv4 address -\end_layout - -\begin_layout Code -Listen [2001:0db8:100::2]:80 -\end_layout - -\begin_layout Code -Listen 1.2.3.4:80 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - ServerName ipv6andipv4.yourdomain.yourtopleveldomain -\end_layout - -\begin_layout Code - # ...sure more config lines -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Standard -This should result after restart in e.g. -\end_layout - -\begin_layout Code -# netstat -lnptu |grep "httpd2 -\backslash -W*$" -\end_layout - -\begin_layout Code -tcp 0 0 1.2.3.4:80 0.0.0.0:* LISTEN 12345/httpd2 -\end_layout - -\begin_layout Code -tcp 0 0 2001:0db8:100::1:80 :::* LISTEN 12345/httpd2 -\end_layout - -\begin_layout Code -tcp 0 0 2001:0db8:100::2:80 :::* LISTEN 12345/httpd2 -\end_layout - -\begin_layout Standard -For simple tests use the telnet example already shown. -\end_layout - -\begin_layout Subsubsection -Additional notes -\end_layout - -\begin_layout Itemize -Apache2 supports a method called -\begin_inset Quotes sld -\end_inset - -sendfile -\begin_inset Quotes srd -\end_inset - - to speedup serving data. - Some NIC drivers also support offline checksumming. - In some cases, this can lead to connection problems and invalid TCP checksums. - In this cases, disable -\begin_inset Quotes sld -\end_inset - -sendfile -\begin_inset Quotes srd -\end_inset - - either by recompiling using configure option -\begin_inset Quotes sld -\end_inset - ---without-sendfile -\begin_inset Quotes srd -\end_inset - - or by using the "EnableSendfile off" directive in configuration file. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-radvd" - -\end_inset - -Router Advertisement Daemon (radvd) -\end_layout - -\begin_layout Standard -The router advertisement daemon is very useful on a LAN, if clients should - be auto-configured. - The daemon itself should run on the Linux default IPv6 gateway router (it's - not required that this is also the default IPv4 gateway, so pay attention - who on your LAN is sending router advertisements). - -\end_layout - -\begin_layout Standard -You can specify some information and flags which should be contained in - the advertisement. - Common used are -\end_layout - -\begin_layout Itemize -Prefix (needed) -\end_layout - -\begin_layout Itemize -Lifetime of the prefix -\end_layout - -\begin_layout Itemize -Frequency of sending advertisements (optional) -\end_layout - -\begin_layout Standard -After a proper configuration, the daemon sends advertisements through specified - interfaces and clients are hopefully receive them and auto-magically configure - addresses with received prefix and the default route. -\end_layout - -\begin_layout Subsection -Configuring radvd -\end_layout - -\begin_layout Subsubsection -Simple configuration -\end_layout - -\begin_layout Standard -Radvd's config file is normally /etc/radvd.conf. - An simple example looks like following: -\end_layout - -\begin_layout Code -interface eth0 { -\end_layout - -\begin_layout Code - AdvSendAdvert on; -\end_layout - -\begin_layout Code - MinRtrAdvInterval 3; -\end_layout - -\begin_layout Code - MaxRtrAdvInterval 10; -\end_layout - -\begin_layout Code - prefix 2001:0db8:0100:f101::/64 { -\end_layout - -\begin_layout Code - AdvOnLink on; -\end_layout - -\begin_layout Code - AdvAutonomous on; -\end_layout - -\begin_layout Code - AdvRouterAddr on; -\end_layout - -\begin_layout Code - }; -\end_layout - -\begin_layout Code -}; -\end_layout - -\begin_layout Standard -This results on client side in -\end_layout - -\begin_layout Code -# ip -6 addr show eth0 -\end_layout - -\begin_layout Code -3: eth0: mtu 1500 qdisc pfifo_fast qlen 100 -\end_layout - -\begin_layout Code - inet6 2001:0db8:100:f101:2e0:12ff:fe34:1234/64 scope global dynamic - -\end_layout - -\begin_layout Code - valid_lft 2591992sec preferred_lft 604792sec -\end_layout - -\begin_layout Code - inet6 fe80::2e0:12ff:fe34:1234/10 scope link -\end_layout - -\begin_layout Standard -Because no lifetime was defined, a very high value was used. -\end_layout - -\begin_layout Subsubsection -Special 6to4 configuration -\end_layout - -\begin_layout Standard -Version since 0.6.2pl3 support the automatic (re)-generation of the prefix - depending on an IPv4 address of a specified interface. - This can be used to distribute advertisements in a LAN after the 6to4 tunneling - has changed. - Mostly used behind a dynamic dial-on-demand Linux router. - Because of the sure shorter lifetime of such prefix (after each dial-up, - another prefix is valid), the lifetime configured to minimal values: -\end_layout - -\begin_layout Code -interface eth0 { -\end_layout - -\begin_layout Code - AdvSendAdvert on; -\end_layout - -\begin_layout Code - MinRtrAdvInterval 3; -\end_layout - -\begin_layout Code - MaxRtrAdvInterval 10; -\end_layout - -\begin_layout Code - prefix 0:0:0:f101::/64 { -\end_layout - -\begin_layout Code - AdvOnLink off; -\end_layout - -\begin_layout Code - AdvAutonomous on; -\end_layout - -\begin_layout Code - AdvRouterAddr on; -\end_layout - -\begin_layout Code - Base6to4Interface ppp0; -\end_layout - -\begin_layout Code - AdvPreferredLifetime 20; -\end_layout - -\begin_layout Code - AdvValidLifetime 30; -\end_layout - -\begin_layout Code - }; -\end_layout - -\begin_layout Code -}; -\end_layout - -\begin_layout Standard -This results on client side in (assuming, ppp0 has currently 1.2.3.4 as local - IPv4 address): -\end_layout - -\begin_layout Code -# /sbin/ip -6 addr show eth0 -\end_layout - -\begin_layout Code -3: eth0: mtu 1500 qdisc pfifo_fast qlen 100 -\end_layout - -\begin_layout Code - inet6 2002:0102:0304:f101:2e0:12ff:fe34:1234/64 scope global dynamic - -\end_layout - -\begin_layout Code - valid_lft 22sec preferred_lft 12sec -\end_layout - -\begin_layout Code - inet6 fe80::2e0:12ff:fe34:1234/10 scope link -\end_layout - -\begin_layout Standard -Because a small lifetime was defined, such prefix will be thrown away quickly, - if no related advertisement was received. -\end_layout - -\begin_layout Standard -Additional note: if you do not used special 6to4 support in initscripts, - you have to setup a special route on the internal interface on the router, - otherwise you will get some backrouting problems. - for the example showh here: -\end_layout - -\begin_layout Code -# /sbin/ip -6 route add 2002:0102:0304:f101::/64 dev eth0 metric 1 -\end_layout - -\begin_layout Standard -This route needs to be replaced every time the prefix changes, which is - the case after a new IPv4 address was assigned to the dial-up interface. -\end_layout - -\begin_layout Subsection -Debugging -\end_layout - -\begin_layout Standard -A program called -\begin_inset Quotes sld -\end_inset - -radvdump -\begin_inset Quotes srd -\end_inset - - can help you looking into sent or received advertisements. - Simple to use: -\end_layout - -\begin_layout Code -# radvdump -\end_layout - -\begin_layout Code -Router advertisement from fe80::280:c8ff:feb9:cef9 (hoplimit 255) -\end_layout - -\begin_layout Code - AdvCurHopLimit: 64 -\end_layout - -\begin_layout Code - AdvManagedFlag: off -\end_layout - -\begin_layout Code - AdvOtherConfigFlag: off -\end_layout - -\begin_layout Code - AdvHomeAgentFlag: off -\end_layout - -\begin_layout Code - AdvReachableTime: 0 -\end_layout - -\begin_layout Code - AdvRetransTimer: 0 -\end_layout - -\begin_layout Code - Prefix 2002:0102:0304:f101::/64 -\end_layout - -\begin_layout Code - AdvValidLifetime: 30 -\end_layout - -\begin_layout Code - AdvPreferredLifetime: 20 -\end_layout - -\begin_layout Code - AdvOnLink: off -\end_layout - -\begin_layout Code - AdvAutonomous: on -\end_layout - -\begin_layout Code - AdvRouterAddr: on -\end_layout - -\begin_layout Code - Prefix 2001:0db8:100:f101::/64 -\end_layout - -\begin_layout Code - AdvValidLifetime: 2592000 -\end_layout - -\begin_layout Code - AdvPreferredLifetime: 604800 -\end_layout - -\begin_layout Code - AdvOnLink: on -\end_layout - -\begin_layout Code - AdvAutonomous: on -\end_layout - -\begin_layout Code - AdvRouterAddr: on -\end_layout - -\begin_layout Code - AdvSourceLLAddress: 00 80 12 34 56 78 -\end_layout - -\begin_layout Standard -Output shows you each advertisement package in readable format. - You should see your configured values here again, if not, perhaps it's - not your radvd which sends the advertisement...look for another router on - the link (and take the LLAddress, which is the MAC address for tracing). -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-dhcpv6" - -\end_inset - -Dynamic Host Configuration v6 Server (dhcp6s) -\end_layout - -\begin_layout Standard -DHCPv6 can be used for stateful configurations. - The daemon itself need not necessary run on the Linux default IPv6 gateway - router. - -\end_layout - -\begin_layout Standard -You can specify more information than by using radvd. - The are most similar to IPv4 DHCP server. -\end_layout - -\begin_layout Standard -After a proper configuration, the daemon reacts on received ICMPv6 multicast - packets sent by a client to address ff02::1:2 -\end_layout - -\begin_layout Subsection -Configuration of the DHCPv6 server (dhcp6s) -\end_layout - -\begin_layout Subsubsection -Simple configuration -\end_layout - -\begin_layout Standard -dhcp6s's config file is normally /etc/dhcp6s.conf. - An simple example looks like following: -\end_layout - -\begin_layout Code -interface eth0 { -\end_layout - -\begin_layout Code - server-preference 255; -\end_layout - -\begin_layout Code - renew-time 60; -\end_layout - -\begin_layout Code - rebind-time 90; -\end_layout - -\begin_layout Code - prefer-life-time 130; -\end_layout - -\begin_layout Code - valid-life-time 200; -\end_layout - -\begin_layout Code - allow rapid-commit; -\end_layout - -\begin_layout Code - option dns_servers 2001:db8:0:f101::1 sub.domain.example; -\end_layout - -\begin_layout Code - link AAA { -\end_layout - -\begin_layout Code - range 2001:db8:0:f101::1000 to 2001:db8:0:f101::ffff/64; -\end_layout - -\begin_layout Code - prefix 2001:db8:0:f101::/64; -\end_layout - -\begin_layout Code - }; -\end_layout - -\begin_layout Code -}; -\end_layout - -\begin_layout Subsection -Configuration of the DHCPv6 client (dhcp6c) -\end_layout - -\begin_layout Subsubsection -Simple configuration -\end_layout - -\begin_layout Standard -dhcp6c's config file is normally /etc/dhcp6c.conf. - An simple example looks like following: -\end_layout - -\begin_layout Code -interface eth0 { -\end_layout - -\begin_layout Code - send rapid-commit; -\end_layout - -\begin_layout Code - request domain-name-servers; -\end_layout - -\begin_layout Code -}; -\end_layout - -\begin_layout Subsection -Usage -\end_layout - -\begin_layout Subsubsection -dhcpv6_server -\end_layout - -\begin_layout Standard -Start server, e.g. -\end_layout - -\begin_layout Code -# service dhcp6s start -\end_layout - -\begin_layout Subsubsection -dhcpv6_client -\end_layout - -\begin_layout Standard -Start client in foreground, e.g. -\end_layout - -\begin_layout Code -# dhcp6c -f eth0 -\end_layout - -\begin_layout Subsection -Debugging -\end_layout - -\begin_layout Subsubsection -dhcpv6_server -\end_layout - -\begin_layout Standard -The server has one foreground and two debug toggles (both should be used - for debugging), here is an example: -\end_layout - -\begin_layout Code -# dhcp6s -d -D -f eth0 -\end_layout - -\begin_layout Subsubsection -dhcpv6_client -\end_layout - -\begin_layout Standard -As general debugging for test whether the IPv6 DHCP server is reable on - the link use an IPv6 ping to the DHCP multicast address: -\end_layout - -\begin_layout Code -# ping6 -I eth0 ff02::1:2 -\end_layout - -\begin_layout Standard -The client has one foreground and two debug toggles, here is an example: -\end_layout - -\begin_layout Code -# dhcp6c -d -f eth0 -\end_layout - -\begin_layout Code -Oct/03/2005 17:18:16 dhcpv6 doesn't support hardware type 776 -\end_layout - -\begin_layout Code -Oct/03/2005 17:18:16 doesn't support sit0 address family 0 -\end_layout - -\begin_layout Code -Oct/03/2005 17:18:16 netlink_recv_rtgenmsg error -\end_layout - -\begin_layout Code -Oct/03/2005 17:18:16 netlink_recv_rtgenmsg error -\end_layout - -\begin_layout Code -Oct/03/2005 17:18:17 status code for this address is: success -\end_layout - -\begin_layout Code -Oct/03/2005 17:18:17 status code: success -\end_layout - -\begin_layout Code -Oct/03/2005 17:18:17 netlink_recv_rtgenmsg error -\end_layout - -\begin_layout Code -Oct/03/2005 17:18:17 netlink_recv_rtgenmsg error -\end_layout - -\begin_layout Code -Oct/03/2005 17:18:17 assigned address 2001:db8:0:f101::1002 prefix len is - not -\end_layout - -\begin_layout Code -¬ in any RAs prefix length using 64 bit instead -\end_layout - -\begin_layout Code -Oct/03/2005 17:18:17 renew time 60, rebind time 9 -\end_layout - -\begin_layout Standard -Note that the netlink error messages have no impact. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-isc-dhcp" - -\end_inset - -ISC Dynamic Host Configuration Server (dhcpd) -\end_layout - -\begin_layout Standard -ISC DHCP supports IPv6 since version 4.x. -\end_layout - -\begin_layout Subsection -Configuration of the ISC DHCP server for IPv6 (dhcpd) -\end_layout - -\begin_layout Standard -Note that currently, the ISC DHCP server can only serve IPv4 or IPv6, means - you have to start the daemon twice (for IPv6 with option -\begin_inset Quotes sld -\end_inset - --6 -\begin_inset Quotes srd -\end_inset - -) to support both protocols. -\end_layout - -\begin_layout Subsubsection -Simple configuration -\end_layout - -\begin_layout Standard -Create a dedicated configuration file /etc/dhcp/dhcpd6.conf for the IPv6 - part of the dhcpd. - Note, that the router requires to have a interface configured with an IPv6 - address out of the defined subnet. -\end_layout - -\begin_layout Code -default-lease-time 600; -\end_layout - -\begin_layout Code -max-lease-time 7200; -\end_layout - -\begin_layout Code -log-facility local7; -\end_layout - -\begin_layout Code -subnet6 2001:db8:0:1::/64 { -\end_layout - -\begin_layout Code - # Range for clients -\end_layout - -\begin_layout Code - range6 2001:db8:0:1::129 2001:db8:0:1::254; -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - # Range for clients requesting a temporary address -\end_layout - -\begin_layout Code - range6 2001:db8:0:1::/64 temporary; -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - # Additional options -\end_layout - -\begin_layout Code - option dhcp6.name-servers fec0:0:0:1::1; -\end_layout - -\begin_layout Code - option dhcp6.domain-search "domain.example"; -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - # Prefix range for delegation to sub-routers -\end_layout - -\begin_layout Code - prefix6 2001:db8:0:100:: 2001:db8:0:f00:: /56; -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - # Example for a fixed host address -\end_layout - -\begin_layout Code - host specialclient { -\end_layout - -\begin_layout Code - host-identifier option dhcp6.client-id 00:01:00:01:4a:1f:ba:e3:60:b9:1f:01: -23:45; -\end_layout - -\begin_layout Code - fixed-address6 2001:db8:0:1::127; -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code -} -\end_layout - -\begin_layout Standard -Note that the -\begin_inset Quotes sld -\end_inset - -dhcp.client-id -\begin_inset Quotes srd -\end_inset - - no longer belongs to a MAC address, an unique ID is used instead! -\begin_inset Quotes sld -\end_inset - -dhcp6c -\begin_inset Quotes srd -\end_inset - - (see above) uses the file /var/lib/dhcpv6/dhcp6c_duid (would be created - during first start, if not existing) as unique identity. - It's a 14 byte long identifier, starting with a 2 byte length information - (usually -\begin_inset Quotes sld -\end_inset - -0x000e -\begin_inset Quotes srd -\end_inset - -): -\end_layout - -\begin_layout Code -# hexdump -e '"%07.7_ax " 1/2 "%04x" " " 14/1 "%02x:" " -\backslash -n"' /var/lib/dhcpv6/dhcp6c_duid 0000000 000e 00:01:00:01:4a:1f:ba:e3:60:b9:1f:01 -:23:45: -\end_layout - -\begin_layout Subsection -Usage -\end_layout - -\begin_layout Subsubsection -dhcpd -\end_layout - -\begin_layout Standard -Start server in foreground: -\end_layout - -\begin_layout Code -# /usr/sbin/dhcpd -6 -d -cf /etc/dhcp/dhcpd6.conf eth1 -\end_layout - -\begin_layout Code -Internet Systems Consortium DHCP Server 4.1.0 -\end_layout - -\begin_layout Code -Copyright 2004-2008 Internet Systems Consortium. - -\end_layout - -\begin_layout Code -All rights reserved. - -\end_layout - -\begin_layout Code -For info, please visit http://www.isc.org/sw/dhcp/ -\end_layout - -\begin_layout Code -Not searching LDAP since ldap-server, ldap-port and ldap-base-dn were not - specified in the config file -\end_layout - -\begin_layout Code -Wrote 0 leases to leases file. - -\end_layout - -\begin_layout Code -Bound to *:547 -\end_layout - -\begin_layout Code -Listening on Socket/5/eth1/2001:db8:0:1::/64 -\end_layout - -\begin_layout Code -Sending on Socket/5/eth1/2001:db8:0:1::/64 -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-dibbler" - -\end_inset - -DHCP Server Dibbler -\end_layout - -\begin_layout Standard -Dibbler is also a DHCP server -\end_layout - -\begin_layout Subsection -Configuration of the Dibbler DHCP server for IPv6 -\end_layout - -\begin_layout Subsubsection -Simple configuration -\end_layout - -\begin_layout Standard -Create a dedicated configuration file /etc/dibbler/server.conf . - Note, that the router requires to have a interface configured with an IPv6 - address out of the defined subnet. -\end_layout - -\begin_layout Code -log-level 8 -\end_layout - -\begin_layout Code -log-mode short -\end_layout - -\begin_layout Code -preference 0 -\end_layout - -\begin_layout Code -iface "eth1" { -\end_layout - -\begin_layout Code - // also ranges can be defines, instead of exact values t1 1800-2000 t2 - 2700-3000 -\end_layout - -\begin_layout Code - prefered-lifetime 3600 -\end_layout - -\begin_layout Code - valid-lifetime 7200 -\end_layout - -\begin_layout Code - class { -\end_layout - -\begin_layout Code - pool 2001:6f8:12d8:1::/64 -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - option dns-server fec0:0:0:1::1 -\end_layout - -\begin_layout Code - option domain domain.example -\end_layout - -\begin_layout Code -} -\end_layout - -\begin_layout Subsection -Usage -\end_layout - -\begin_layout Subsubsection -dibbler-server -\end_layout - -\begin_layout Standard -Start server in foreground: -\end_layout - -\begin_layout Code -# dibbler-server run -\end_layout - -\begin_layout Code -| Dibbler - a portable DHCPv6, version 0.7.3 (SERVER, Linux port) -\end_layout - -\begin_layout Code -| Authors : Tomasz Mrugalski,Marek Senderski -\end_layout - -\begin_layout Code -| Licence : GNU GPL v2 only. - Developed at Gdansk University of Technology. - -\end_layout - -\begin_layout Code -| Homepage: http://klub.com.pl/dhcpv6/ -\end_layout - -\begin_layout Code -2009.05.28 10:18:48 Server Notice My pid (1789) is stored in /var/lib/dibbler/s -erver.pid -\end_layout - -\begin_layout Code -2009.05.28 10:18:48 Server Notice Detected iface eth0/3, MAC=54:52:00:01:23:45. - -\end_layout - -\begin_layout Code -2009.05.28 10:18:48 Server Notice Detected iface eth1/2, MAC=54:52:00:67:89:ab. - -\end_layout - -\begin_layout Code -2009.05.28 10:18:48 Server Notice Detected iface lo/1, MAC=00:00:00:00:00:00. - -\end_layout - -\begin_layout Code -2009.05.28 10:18:48 Server Debug Skipping database loading. - -\end_layout - -\begin_layout Code -2009.05.28 10:18:48 Server Debug Cache:server-cache.xml file: parsing started, - expecting 0 entries. - -\end_layout - -\begin_layout Code -2009.05.28 10:18:48 Server Notice Parsing /etc/dibbler/server.conf config - file... - -\end_layout - -\begin_layout Code -18:48 Server Debug Setting 0 generic option(s). - -\end_layout - -\begin_layout Code -18:48 Server Debug 0 per-client configurations (exceptions) added. - -\end_layout - -\begin_layout Code -18:48 Server Debug Parsing /etc/dibbler/server.conf done. - -\end_layout - -\begin_layout Code -18:48 Server Info 0 client class(es) defined. - -\end_layout - -\begin_layout Code -18:48 Server Debug 1 interface(s) specified in /etc/dibbler/server.conf - -\end_layout - -\begin_layout Code -18:48 Server Info Mapping allow, deny list to class 0:0 allow/deny - entries in total. - -\end_layout - -\begin_layout Code -18:48 Server Info Interface eth1/2 configuration has been loaded. - -\end_layout - -\begin_layout Code -18:48 Server Notice Running in stateful mode. - -\end_layout - -\begin_layout Code -18:48 Server Info My DUID is 00:01:00:01:11:aa:6d:a7:54:52:00:67:89:ab. - -\end_layout - -\begin_layout Code -18:48 Server Notice Creating multicast (ff02::1:2) socket on eth1/2 (eth1/2) - interface. - -\end_layout - -\begin_layout Code -18:48 Server Debug Cache: size set to 1048576 bytes, 1 cache entry size - is 87 bytes, so maximum 12052 address-client pair(s) may be cached. - -\end_layout - -\begin_layout Code -18:48 Server Notice Accepting connections. - Next event in 4294967295 second(s). -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-tcpwrapper" - -\end_inset - -tcp_wrapper -\end_layout - -\begin_layout Standard -tcp_wrapper is a library which can help you to protect service against misuse. -\end_layout - -\begin_layout Subsection -Filtering capabilities -\end_layout - -\begin_layout Standard -You can use tcp_wrapper for -\end_layout - -\begin_layout Itemize -Filtering against source addresses (IPv4 or IPv6) -\end_layout - -\begin_layout Itemize -Filtering against users (requires a running ident daemon on the client) -\end_layout - -\begin_layout Subsection -Which program uses tcp_wrapper -\end_layout - -\begin_layout Standard -Following are known: -\end_layout - -\begin_layout Itemize -Each service which is called by xinetd (if xinetd is compiled using tcp_wrapper - library) -\end_layout - -\begin_layout Itemize -sshd (if compiled using tcp_wrapper) -\end_layout - -\begin_layout Subsection -Usage -\end_layout - -\begin_layout Standard -tcp_wrapper is controlled by two files name /etc/hosts.allow and /etc/hosts.deny. - For more information see -\end_layout - -\begin_layout Code -$ man hosts.allow -\end_layout - -\begin_layout Subsubsection -Example for /etc/hosts.allow -\end_layout - -\begin_layout Standard -In this file, each service which should be positive filtered (means connects - are accepted) need a line. -\end_layout - -\begin_layout Code -sshd: 1.2.3. - [2001:0db8:100:200::]/64 -\end_layout - -\begin_layout Code -daytime-stream: 1.2.3. - [2001:0db8:100:200::]/64 -\end_layout - -\begin_layout Standard -Note: there are broken implementations around, which uses following broken - IPv6 network description: [2001:0db8:100:200::/64]. - Hopefully, such versions will be fixed soon. -\end_layout - -\begin_layout Subsubsection -Example for /etc/hosts.deny -\end_layout - -\begin_layout Standard -This file contains all negative filter entries and should normally deny - the rest using -\end_layout - -\begin_layout Code -ALL: ALL -\end_layout - -\begin_layout Standard -If this node is a more sensible one you can replace the standard line above - with this one, but this can cause a DoS attack (load of mailer and spool - directory), if too many connects were made in short time. - Perhaps a logwatch is better for such issues. -\end_layout - -\begin_layout Code -ALL: ALL: spawn (echo "Attempt from %h %a to %d at `date`" -\end_layout - -\begin_layout Code - | tee -a /var/log/tcp.deny.log | mail root@localhost) -\end_layout - -\begin_layout Subsection -Logging -\end_layout - -\begin_layout Standard -Depending on the entry in the syslog daemon configuration file /etc/syslog.conf - the tcp_wrapper logs normally into /var/log/secure. -\end_layout - -\begin_layout Subsubsection -Refused connection -\end_layout - -\begin_layout Standard -A refused connection via IPv4 to an xinetd covered daytime service produces - a line like following example -\end_layout - -\begin_layout Code -Jan 2 20:40:44 gate xinetd-ipv6[12346]: FAIL: daytime-stream libwrap -\end_layout - -\begin_layout Code -¬ from=::ffff:1.2.3.4 -\end_layout - -\begin_layout Code -Jan 2 20:32:06 gate xinetd-ipv6[12346]: FAIL: daytime-stream libwrap -\end_layout - -\begin_layout Code - from=2001:0db8:100:200::212:34ff:fe12:3456 -\end_layout - -\begin_layout Standard -A refused connection via IPv4 to an dual-listen sshd produces a line like - following example -\end_layout - -\begin_layout Code -Jan 2 20:24:17 gate sshd[12345]: refused connect from ::ffff:1.2.3.4 -\end_layout - -\begin_layout Code -¬ (::ffff:1.2.3.4) -\end_layout - -\begin_layout Code -Jan 2 20:39:33 gate sshd[12345]: refused connect -\end_layout - -\begin_layout Code - from 2001:0db8:100:200::212:34ff:fe12:3456 -\end_layout - -\begin_layout Code -¬ (2001:0db8:100:200::212:34ff:fe12:3456) -\end_layout - -\begin_layout Subsubsection -Permitted connection -\end_layout - -\begin_layout Standard -A permitted connection via IPv4 to an xinetd covered daytime service produces - a line like following example -\end_layout - -\begin_layout Code -Jan 2 20:37:50 gate xinetd-ipv6[12346]: START: daytime-stream pid=0 -\end_layout - -\begin_layout Code -¬ from=::ffff:1.2.3.4 -\end_layout - -\begin_layout Code -Jan 2 20:37:56 gate xinetd-ipv6[12346]: START: daytime-stream pid=0 -\end_layout - -\begin_layout Code - from=2001:0db8:100:200::212:34ff:fe12:3456 -\end_layout - -\begin_layout Standard -A permitted connection via IPv4 to an dual-listen sshd produces a line like - following example -\end_layout - -\begin_layout Code -Jan 2 20:43:10 gate sshd[21975]: Accepted password for user from ::ffff:1.2.3.4 -\end_layout - -\begin_layout Code -¬ port 33381 ssh2 -\end_layout - -\begin_layout Code -Jan 2 20:42:19 gate sshd[12345]: Accepted password for user -\end_layout - -\begin_layout Code - from 2001:0db8:100:200::212:34ff:fe12:3456 port 33380 ssh2 -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-vsftpd" - -\end_inset - -vsftpd -\end_layout - -\begin_layout Subsection -Listening on IPv6 addresses -\end_layout - -\begin_layout Standard -Edit the configuration file, ususally /etc/vsftpd/vsftpd.conf, and adjust - the listen option like -\end_layout - -\begin_layout Code -listen_ipv6=yes -\end_layout - -\begin_layout Standard -That's all. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-proftpd" - -\end_inset - -proftpd -\end_layout - -\begin_layout Subsection -Listening on IPv6 addresses -\end_layout - -\begin_layout Standard -Edit the configuration file, ususally /etc/proftpd.conf, but take care, not - 100% logical in virtual host setup -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - ... -\end_layout - -\begin_layout Code - Bind 2001:0DB8::1 -\end_layout - -\begin_layout Code - ... -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Standard -That's all. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-others" - -\end_inset - -Other daemons -\end_layout - -\begin_layout Standard -Nowadays it's mostly simple, look for either a command line option or a - configuration value to enable IPv6 listening. - See manual page of the daemon or check related FAQs. - It can happen that you can bind a daemon only to the IPv6- -\begin_inset Quotes sld -\end_inset - -any -\begin_inset Quotes srd -\end_inset - --address (::) and not to bind to a dedicated IPv6 address, because the lack - of support (depends on that what the programmer has implemented so far...). -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-programming" - -\end_inset - -Programming -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "chapter-section-using-API" - -\end_inset - - -\begin_inset CommandInset label -LatexCommand label -name "chapter-programming-using-API" - -\end_inset - -Programming using C-API -\end_layout - -\begin_layout Standard -Related RFCs: -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "RFC 3493 / Basic Socket Interface Extensions for IPv6" -target "http://www.faqs.org/rfcs/rfc3493.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "RFC 3542 / Advanced Sockets Application Program Interface (API) for IPv6" -target "http://www.faqs.org/rfcs/rfc3542.html" - -\end_inset - - -\end_layout - -\begin_layout Standard -Following contents of this section is contributed by John Wenker, Sr. - Software Engineer Performance Technologies San Diego, CA USA -\begin_inset CommandInset href -LatexCommand href -name "http://www.pt.com/" -target "http://www.pt.com/" - -\end_inset - -. -\end_layout - -\begin_layout Standard -\begin_inset VSpace defskip -\end_inset - - -\end_layout - -\begin_layout Standard -This section describes how to write IPv6 client-server applications under - the Linux operating system. - First thing's first, and credit must be given where it is due. - The information contained in this section is derived from Chapters 2 through - 4 of IPv6 Network Programming by Jun-ichiro itojun Hagino (ISBN 1-55558-318-0). - The reader is encouraged to consult that book for more detailed information. - It describes how to convert IPv4 applications to be IPv6 compatible in - a protocol-independent way, and describes some of the common -\bar under -problems -\bar default - encountered during the conversion along with suggested solutions. - At the time of this writing, this is the only book of which the author - is aware that specifically addresses how to program IPv6 applications [since - writing this section, the author has also become aware of the Porting applicati -ons to IPv6 HowTo by Eva M. - Castro at -\begin_inset CommandInset href -LatexCommand href -name "http://jungla.dit.upm.es/~ecastro/IPv6-web/ipv6.html" -target "http://jungla.dit.upm.es/~ecastro/IPv6-web/ipv6.html" - -\end_inset - -]. - Unfortunately, of the almost 360 pages in the book, maybe 60 are actually - useful (the chapters mentioned). - Nevertheless, without the guidance of that book, the author would have - been unable to perform his job duties or compose this HowTo. - While most (but certainly not all) of the information in the Hagino book - is available via the Linux 'man' pages, application programmers will save - a significant amount of time and frustration by reading the indicated chapters - of the book rather than searching through the 'man' pages and online documentat -ion. -\end_layout - -\begin_layout Standard -Other than the Hagino book, any other information presented in this HowTo - was obtained through trial and error. - Some items or explanations may not be entirely -\begin_inset Quotes sld -\end_inset - -correct -\begin_inset Quotes srd -\end_inset - - in the grand IPv6 scheme, but seem to work in practical application. -\end_layout - -\begin_layout Standard -The discussion that follows assumes the reader is already experienced with - the traditional TCP/IP socket API. - For more information on traditional socket programming, the Internetworking - with TCP/IP series of textbooks by Comer & Stevens is hard to beat, specificall -y Volume III: Client-Server Programming and Applications, Linux/POSIX Sockets - Version (ISBN 0-13-032071-4). - This HowTo also assumes that the reader has had at least a bare basic introduct -ion to IPv6 and in particular the addressing scheme for network addresses - (see Section 2.3). -\end_layout - -\begin_layout Subsection -Address Structures -\end_layout - -\begin_layout Standard -This section provides a brief overview of the structures provided in the - socket API to represent network addresses (or more specifically transport - endpoints) when using the Internet protocols in a client-server application. -\end_layout - -\begin_layout Subsubsection -IPv4 sockaddr_in -\end_layout - -\begin_layout Standard -In IPv4, network addresses are 32 bits long and define a network node. - Addresses are written in dotted decimal notation, such as 192.0.2.1, where - each number represents eight bits of the address. - Such an IPv4 address is represented by the -\family typewriter -struct sockaddr_in -\family default - data type, which is defined in -\family typewriter - -\family default -. -\end_layout - -\begin_layout Code -struct sockaddr_in -\end_layout - -\begin_layout Code -{ -\end_layout - -\begin_layout Code - sa_family_t sin_family; -\end_layout - -\begin_layout Code - in_port_t sin_port; -\end_layout - -\begin_layout Code - struct in_addr sin_addr; -\end_layout - -\begin_layout Code - /* Plus some padding for alignment */ -\end_layout - -\begin_layout Code -}; -\end_layout - -\begin_layout Standard -The -\family typewriter -sin_family -\family default - component indicates the address family. - For IPv4 addresses, this is always set to -\family typewriter -AF_INET -\family default -. - The -\family typewriter -sin_addr -\family default - field contains the 32-bit network address (in network byte order). - Finally, the -\family typewriter -sin_port -\family default - component represents the transport layer port number (in network byte order). - Readers should already be familiar with this structure, as this is the - standard IPv4 address structure. -\end_layout - -\begin_layout Subsubsection -IPv6 sockaddr_in6 -\end_layout - -\begin_layout Standard -The biggest feature of IPv6 is its increased address space. - Instead of 32-bit network addresses, IPv6 allots 128 bits to an address. - Addresses are written in colon-hex notation of the form fe80::2c0:8cff:fe01:234 -5, where each hex number separated by colons represents 16 bits of the address. - Two consecutive colons indicate a string of consecutive zeros for brevity, - and at most only one double-colon may appear in the address. - IPv6 addresses are represented by the -\family typewriter -struct sockaddr_in6 -\family default - data type, also defined in -\family typewriter - -\family default -. -\end_layout - -\begin_layout Code -struct sockaddr_in6 -\end_layout - -\begin_layout Code -{ -\end_layout - -\begin_layout Code - sa_family_t sin6_family; -\end_layout - -\begin_layout Code - in_port_t sin6_port; -\end_layout - -\begin_layout Code - uint32_t sin6_flowinfo; -\end_layout - -\begin_layout Code - struct in6_addr sin6_addr; -\end_layout - -\begin_layout Code - uint32_t sin6_scope_id; -\end_layout - -\begin_layout Code -}; -\end_layout - -\begin_layout Standard -The -\family typewriter -sin6_family -\family default -, -\family typewriter -sin6_port -\family default -, and -\family typewriter -sin6_addr -\family default - components of the structure have the same meaning as the corresponding - fields in the -\family typewriter -sockaddr_in -\family default - structure. - However, the -\family typewriter -sin6_family -\family default - member is set to -\family typewriter -AF_INET6 -\family default - for IPv6 addresses, and the -\family typewriter -sin6_addr -\family default - field holds a 128-bit address instead of only 32 bits. -\end_layout - -\begin_layout Standard -The -\family typewriter -sin6_flowinfo -\family default - field is used for flow control, but is not yet standardized and can be - ignored. -\end_layout - -\begin_layout Standard -The -\family typewriter -sin6_scope_id -\family default - field has an odd use, and it seems (at least to this naïve author) that - the IPv6 designers took a huge step backwards when devising this. - Apparently, 128-bit IPv6 network addresses are not unique. - For example, it is possible to have two hosts, on separate networks, with - the same link-local address (see Figure 1). - In order to pass information to a specific host, more than just the network - address is required; the scope identifier must also be specified. - In Linux, the network interface name is used for the scope identifier (e.g. - -\begin_inset Quotes sld -\end_inset - -eth0 -\begin_inset Quotes srd -\end_inset - -) [be warned that the scope identifier is implementation dependent!]. - Use the -\family typewriter -ifconfig(1M) -\family default - command to display a list of active network interfaces. -\end_layout - -\begin_layout Standard -A colon-hex network address can be augmented with the scope identifier to - produce a "scoped address -\begin_inset Quotes srd -\end_inset - -. - The percent sign ('%') is used to delimit the network address from the - scope identifier. - For example, -\family typewriter -fe80::1%eth0 -\family default - is a scoped IPv6 address where -\family typewriter -fe80::1 -\family default - represents the 128-bit network address and -\family typewriter -eth0 -\family default - is the network interface (i.e. - the scope identifier). - Thus, if a host resides on two networks, such as Host B in example below, - the user now has to know which path to take in order to get to a particular - host. - In Figure 1, Host B addresses Host A using the scoped address -\family typewriter -fe80::1%eth0 -\family default -, while Host C is addressed with -\family typewriter -fe80::1%eth1 -\family default -. -\end_layout - -\begin_layout Code -Host A (fe80::1) ---- eth0 ---- Host B ---- eth1 ---- Host C (fe80::1) -\end_layout - -\begin_layout Standard -Getting back to the -\family typewriter -sockaddr_in6 -\family default - structure, its -\family typewriter -sin6_scope_id -\family default - field contains the index of the network interface on which a host may be - found. - Server applications will have this field set automatically by the socket - API when they accept a connection or receive a datagram. - For client applications, if a scoped address is passed as the node parameter - to -\family typewriter -getaddrinfo(3) -\family default - (described later in this HowTo), then the -\family typewriter -sin6_scope_id -\family default - field will be filled in correctly by the system upon return from the function; - if a scoped address is not supplied, then the sin6_scope_id field must - be explicitly set by the client software prior to attempting to communicate - with the remote server. - The -\family typewriter -if_nametoindex(3) -\family default - function is used to translate a network interface name into its corresponding - index. - It is declared in -\family typewriter - -\family default -. -\end_layout - -\begin_layout Subsubsection -Generic Addresses -\end_layout - -\begin_layout Standard -As any programmer familiar with the traditional TCP/IP socket API knows, - several socket functions deal with "generic" pointers. - For example, a pointer to a generic -\family typewriter -struct sockaddr -\family default - data type is passed as a parameter to some socket functions (such as -\family typewriter -connect(2) -\family default - or -\family typewriter -bind(2) -\family default -) rather than a pointer to a specific address type. - Be careful\SpecialChar ldots - the -\family typewriter -sockaddr_in6 -\family default - structure is larger than the generic -\family typewriter -sockaddr -\family default - structure! Thus, if your program -\bar under -receives -\bar default - a generic address whose actual type is unknown (e.g. - it could be an IPv4 address structure or an IPv6 address structure), you - must supply sufficient storage to hold the entire address. - The -\family typewriter -struct sockaddr_storage -\family default - data type is defined in -\family typewriter - -\family default - for this purpose [do not #include this file directly within an application; - use -\family typewriter - -\family default - as usual, and -\family typewriter - -\family default - will be implicitly included]. -\end_layout - -\begin_layout Standard -For example, consider the -\family typewriter -recvfrom(2) -\family default - system call, which is used to receive a message from a remote peer. - Its function prototype is: -\end_layout - -\begin_layout Code -ssize_t recvfrom( int s, -\end_layout - -\begin_layout Code - void *buf, -\end_layout - -\begin_layout Code - size_t len, -\end_layout - -\begin_layout Code - int flags, -\end_layout - -\begin_layout Code - struct sockaddr *from, -\end_layout - -\begin_layout Code - socklen_t *fromlen ); -\end_layout - -\begin_layout Standard -The from parameter points to a generic -\family typewriter -sockaddr -\family default - structure. - If data can be received from an IPv6 peer on the socket referenced by -\family typewriter -s -\family default -, then -\family typewriter -from -\family default - should point to a data type of -\family typewriter -struct sockaddr_storage -\family default -, as in the following dummy example: -\end_layout - -\begin_layout Code -/* -\end_layout - -\begin_layout Code -** Read a message from a remote peer, and return a buffer pointer to -\end_layout - -\begin_layout Code -** the caller. -\end_layout - -\begin_layout Code -** -\end_layout - -\begin_layout Code -** 's' is the file descriptor for the socket. -\end_layout - -\begin_layout Code -*/ -\end_layout - -\begin_layout Code -char *rcvMsg( int s ) -\end_layout - -\begin_layout Code -{ -\end_layout - -\begin_layout Code - static char bfr[ 1025 ]; /* Where the msg is stored. - */ -\end_layout - -\begin_layout Code - ssize_t count; -\end_layout - -\begin_layout Code - struct sockaddr_storage ss; /* Where the peer adr goes. - */ -\end_layout - -\begin_layout Code - socklen_t sslen; -\end_layout - -\begin_layout Code - sslen = sizeof( ss ); -\end_layout - -\begin_layout Code - count = recvfrom( s, -\end_layout - -\begin_layout Code - bfr, -\end_layout - -\begin_layout Code - sizeof( bfr ) - 1, -\end_layout - -\begin_layout Code - 0, -\end_layout - -\begin_layout Code - (struct sockaddr*) &ss, -\end_layout - -\begin_layout Code - &sslen ); -\end_layout - -\begin_layout Code - bfr[ count ] = ' -\backslash -0'; /* Null-terminates the message. - */ -\end_layout - -\begin_layout Code - return bfr; -\end_layout - -\begin_layout Code -} /* End rcvMsg() */ -\end_layout - -\begin_layout Standard -As seen in the above example, -\family typewriter -ss -\family default - (a -\family typewriter -struct sockaddr_storage -\family default - data object) is used to receive the peer address information, but it's - address is typecast to a generic -\family typewriter -struct sockaddr* -\family default - pointer in the call to -\family typewriter -recvfrom(2) -\family default -. - -\end_layout - -\begin_layout Subsection -Lookup Functions -\end_layout - -\begin_layout Standard -Traditionally, hostname and service name resolution were performed by functions - such as -\family typewriter -gethostbyname(3) -\family default - and -\family typewriter -getservbyname(3) -\family default -. - These traditional lookup functions are still available, but they are not - forward compatible to IPv6. - Instead, the IPv6 socket API provides new lookup functions that consolidate - the functionality of several traditional functions. - These new lookup functions are also backward compatible with IPv4, so a - programmer can use the same translation algorithm in an application for - both the IPv4 and IPv6 protocols. - This is an important feature, because obviously a global IPv6 infrastructure - isn't going to be put in place overnight. - Thus, during the transition period from IPv4 to IPv6, client-server application -s should be designed with the flexibility to handle both protocols simultaneousl -y. - The example programs at the end of this chapter do just that. -\end_layout - -\begin_layout Standard -The primary lookup function in the new socket API is -\family typewriter -getaddrinfo(3) -\family default -. - Its prototype is as follows. - -\end_layout - -\begin_layout Code -int getaddrinfo( const char *node, -\end_layout - -\begin_layout Code - const char *service, -\end_layout - -\begin_layout Code - const struct addrinfo *hints, -\end_layout - -\begin_layout Code - struct addrinfo **res ); -\end_layout - -\begin_layout Standard -The node parameter is a pointer to the hostname or IP address being translated. - The referenced string can be a hostname, IPv4 dotted decimal address, or - IPv6 colon-hex address (possibly scoped). - The -\family typewriter -service -\family default - parameter is a pointer to the transport layer's service name or port number. - It can be specified as a name found in -\family typewriter -/etc/services -\family default - or a decimal number. - -\family typewriter -getaddrinfo(3) -\family default - resolves the host/service combination and returns a -\bar under -list -\bar default - of address records; a pointer to the list is placed in the location pointed - at by -\family typewriter -res -\family default -. - For example, suppose a host can be identified by both an IPv4 and IPv6 - address, and that the indicated service has both a TCP entry and UDP entry - in -\family typewriter -/etc/services -\family default -. - In such a scenario, it is not inconceivable that four address records are - returned; one for TCP/IPv6, one for UDP/IPv6, one for TCP/IPv4, and one - for UDP/IPv4. -\end_layout - -\begin_layout Standard -The definition for -\family typewriter -struct addrinfo -\family default - is found in -\family typewriter - -\family default - (as is the declaration for getaddrinfo(3) and the other functions described - in this section). - The structure has the following format: -\end_layout - -\begin_layout Code -struct addrinfo -\end_layout - -\begin_layout Code -{ -\end_layout - -\begin_layout Code - int ai_flags; -\end_layout - -\begin_layout Code - int ai_family; -\end_layout - -\begin_layout Code - int ai_socktype; -\end_layout - -\begin_layout Code - int ai_protocol; -\end_layout - -\begin_layout Code - socklen_t ai_addrlen; -\end_layout - -\begin_layout Code - struct sockaddr *ai_addr; -\end_layout - -\begin_layout Code - char *ai_canonname; -\end_layout - -\begin_layout Code - struct addrinfo *ai_next; -\end_layout - -\begin_layout Code -}; -\end_layout - -\begin_layout Standard -Consult the 'man' page for -\family typewriter -getaddrinfo(3) -\family default - for detailed information about the various fields; this HowTo only describes - a subset of them, and only to the extent necessary for normal IPv6 programming. -\end_layout - -\begin_layout Standard -The -\family typewriter -ai_family -\family default -, -\family typewriter -ai_socktype -\family default -, and -\family typewriter -ai_protocol -\family default - fields have the exact same meaning as the parameters to the -\family typewriter -socket(2) -\family default - system call. - The -\family typewriter -ai_family -\family default - field indicates the -\bar under -protocol -\bar default - family (not the address family) associated with the record, and will be - -\family typewriter -PF_INET6 -\family default - for IPv6 or -\family typewriter -PF_INET -\family default - for IPv4. - The -\family typewriter -ai_socktype -\family default - parameter indicates the type of socket to which the record corresponds; - -\family typewriter -SOCK_STREAM -\family default - for a reliable connection-oriented byte-stream or -\family typewriter -SOCK_DGRAM -\family default - for connectionless communication. - The -\family typewriter -ai_protocol -\family default - field specifies the underlying transport protocol for the record. -\end_layout - -\begin_layout Standard -The -\family typewriter -ai_addr -\family default - field points to a generic -\family typewriter -struct sockaddr -\family default - object. - Depending on the value in the -\family typewriter -ai_family -\family default - field, it will point to either a -\family typewriter -struct sockaddr_in -\family default - ( -\family typewriter -PF_INET -\family default -) or a -\family typewriter -struct sockaddr_in6 -\family default - ( -\family typewriter -PF_INET6 -\family default -). - The -\family typewriter -ai_addrlen -\family default - field contains the size of the object pointed at by the -\family typewriter -ai_addr -\family default - field. -\end_layout - -\begin_layout Standard -As mentioned, -\family typewriter -getaddrinfo(3) -\family default - returns a list of address records. - The -\family typewriter -ai_next -\family default - field points to the next record in the list. -\end_layout - -\begin_layout Standard -The -\family typewriter -hints -\family default - parameter to -\family typewriter -getaddrinfo(3) -\family default - is also of type -\family typewriter -struct addrinfo -\family default - and acts as a filter for the address records returned in -\family typewriter -res -\family default -. - If -\family typewriter -hints -\family default - is -\family typewriter -NULL -\family default -, all matching records are returned; but if -\family typewriter -hints -\family default - is non- -\family typewriter -NULL -\family default -, the referenced structure gives "hints" to -\family typewriter -getaddrinfo(3) -\family default - about which records to return. - Only the -\family typewriter -ai_flags -\family default -, -\family typewriter -ai_family -\family default -, -\family typewriter -ai_socktype -\family default -, and -\family typewriter -ai_protocol -\family default - fields are significant in the -\family typewriter -hints -\family default - structure, and all other fields should be set to zero. -\end_layout - -\begin_layout Standard -Programs can use -\family typewriter -hints->ai_family -\family default - to specify the protocol family. - For example, if it is set to -\family typewriter -PF_INET6 -\family default -, then only IPv6 address records are returned. - Likewise, setting -\family typewriter -hints->ai_family -\family default - to -\family typewriter -PF_INET -\family default - results in only IPv4 address records being returned. - If an application wants both IPv4 and IPv6 records, the field should be - set to -\family typewriter -PF_UNSPEC -\family default -. -\end_layout - -\begin_layout Standard -The -\family typewriter -hints->socktype -\family default - field can be set to -\family typewriter -SOCK_STREAM -\family default - to return only records that correspond to connection-oriented byte streams, - -\family typewriter -SOCK_DGRAM -\family default - to return only records corresponding to connectionless communication, or - -\family typewriter -0 -\family default - to return both. -\end_layout - -\begin_layout Standard -For the Internet protocols, there is only one protocol associated with connectio -n-oriented sockets (TCP) and one protocol associated with connectionless - sockets (UDP), so setting -\family typewriter -hints->ai_socktype -\family default - to -\family typewriter -SOCK_STREAM -\family default - or -\family typewriter -SOCK_DGRAM -\family default - is the same as saying, "Give me only TCP records," or "Give me only UDP - records," respectively. - With that in mind, the -\family typewriter -hints->ai_protocol -\family default - field isn't really that important with the Internet protocols, and pretty - much mirrors the -\family typewriter -hints->ai_socktype -\family default - field. - Nevertheless, -\family typewriter -hints->ai_protocol -\family default - can be set to -\family typewriter -IPPROTO_TCP -\family default - to return only TCP records, -\family typewriter -IPPROTO_UDP -\family default - to return only UDP records, or -\family typewriter -0 -\family default - for both. -\end_layout - -\begin_layout Standard -The -\family typewriter -node -\family default - or -\family typewriter -service -\family default - parameter to -\family typewriter -gethostbyname(3) -\family default - can be -\family typewriter -NULL -\family default -, but not both. - If -\family typewriter -node -\family default - is -\family typewriter -NULL -\family default -, then the -\family typewriter -ai_flags field -\family default - of the -\family typewriter -hints -\family default - parameter specifies how the network address in a returned record is set - (i.e. - the -\family typewriter -sin_addr -\family default - or -\family typewriter -sin6_addr -\family default - field of the object pointed at by the -\family typewriter -ai_addr -\family default - component in a returned record). - If the -\family typewriter -AI_PASSIVE -\family default - flag is set in -\family typewriter -hints -\family default -, then the returned network addresses are left unresolved (all zeros). - This is how server applications would use -\family typewriter -getaddrinfo(3) -\family default -. - If the flag is not set, then the address is set to the local loopback address - (::1 for IPv6 or 127.0.0.1 for IPv4). - This is one way a client application can specify that the target server - is running on the same machine as the client. - If the -\family typewriter -service -\family default - parameter is -\family typewriter -NULL -\family default -, the port number in the returned address records remains unresolved. -\end_layout - -\begin_layout Standard -The -\family typewriter -getaddrinfo(3) -\family default - function returns zero on success, or an error code. - In the case of an error, the -\family typewriter -gai_strerror(3) -\family default - function is used to obtain a character pointer to an error message correspondin -g to the error code, just like -\family typewriter -strerror(3) -\family default - does in the standard 'C' library. -\end_layout - -\begin_layout Standard -Once the address list is no longer needed, it must be freed by the application. - This is done with the -\family typewriter -freeaddrinfo(3) -\family default - function. -\end_layout - -\begin_layout Standard -The last function that will be mentioned in this section is -\family typewriter -getnameinfo(3) -\family default -. - This function is the inverse of -\family typewriter -getaddrinfo(3) -\family default -; it is used to create a string representation of the hostname and service - from a generic -\family typewriter -struct sockaddr -\family default - data object. - It has the following prototype. - -\end_layout - -\begin_layout Code -int getnameinfo( const struct sockaddr *sa, -\end_layout - -\begin_layout Code - socklen_t salen, -\end_layout - -\begin_layout Code - char *host, -\end_layout - -\begin_layout Code - size_t hostlen, -\end_layout - -\begin_layout Code - char *serv, -\end_layout - -\begin_layout Code - size_t servlen, -\end_layout - -\begin_layout Code - int flags ); -\end_layout - -\begin_layout Standard -The -\family typewriter -sa -\family default - parameter points to the address structure in question, and -\family typewriter -salen -\family default - contains its size. - The -\family typewriter -host -\family default - parameter points to a buffer where the null-terminated hostname string - is placed, and the hostlen parameter is the size of that buffer. - If there is no hostname that corresponds to the address, then the network - address (dotted decimal or colon-hex) is placed in -\family typewriter -host -\family default -. - Likewise, the -\family typewriter -serv -\family default - parameter points to a buffer where the null-terminated service name string - (or port number) is placed, and the -\family typewriter -servlen -\family default - parameter is the size of that buffer. - The -\family typewriter -flags -\family default - parameter modifies the function's behavior; in particular, the -\family typewriter -NI_NUMERICHOST -\family default - flag indicates that the converted hostname should always be formatted in - numeric form (i.e. - dotted decimal or colon-hex), and the -\family typewriter -NI_NUMERICSERV -\family default - flag indicates that the converted service should always be in numeric form - (i.e. - the port number). -\end_layout - -\begin_layout Standard -The symbols -\family typewriter -NI_MAXHOST -\family default - and -\family typewriter -NI_MAXSERV -\family default - are available to applications and represent the maximum size of any converted - hostname or service name, respectively. - Use these when declaring output buffers for -\family typewriter -getnameinfo(3) -\family default -. -\end_layout - -\begin_layout Subsection -Quirks Encountered -\end_layout - -\begin_layout Standard -Before jumping into the programming examples, there are several quirks in - IPv6 of which the reader should be aware. - The more significant ones (in addition to the non-uniqueness of IPv6 network - addresses already discussed) are described in the paragraphs below. - -\end_layout - -\begin_layout Subsubsection -IPv4 Mapped Addresses -\end_layout - -\begin_layout Standard -For security reasons that this author won't pretend to understand, "IPv4 - mapped addresses" should not be allowed in IPv6-capable server applications. - To put it in terms that everyone can understand, this simply means that - a server should not accept IPv4 traffic on an IPv6 socket (an otherwise - legal operation). - An IPv4 mapped address is a mixed-format address of the form: -\end_layout - -\begin_layout Code -::ffff:192.0.2.1 -\end_layout - -\begin_layout Standard -where the first portion is in IPv6 colon-hex format and the last portion - is in IPv4 dotted decimal notation. - The dotted decimal IPv4 address is the actual network address, but it is - being mapped into an IPv6 compatible format. -\end_layout - -\begin_layout Standard -To prevent IPv4 mapped addresses from being accepted on an IPv6 socket, - server applications must explicitly set the -\family typewriter -IPV6_V6ONLY -\family default - socket option on all IPv6 sockets created [the Hagino book implies that - this is only a concern with server applications. - However, it has been observed during testing that if a client application - uses an IPv4 mapped address to specify the target server, and the target - server has IPv4 mapped addresses disabled, the connection still completes - regardless. - On the server side, the connection endpoint is an IPv4 socket as desired; - but on the client side, the connection endpoint is an IPv6 socket. - Setting the IPV6_V6ONLY socket option on the client side as well as the - server side prevents any connection from being established at all.]. - There's only one problem. - Apparently, -\family typewriter -IPV6_V6ONLY -\family default - isn't defined on all systems [or at least it wasn't in 2005 when the Hagino - book was written]. - The server example at the end of this chapter provides a method for handling - this problem. -\end_layout - -\begin_layout Standard -If IPv4 traffic cannot be handled on IPv6 sockets, then that implies that - server applications must open both an IPv4 and IPv6 socket for a particular - network service if it wants to handle requests from either protocol. - This goes back to the flexibility issue mentioned earlier. - If -\family typewriter -getaddrinfo(3) -\family default - returns multiple address records, then server applications should traverse - the list and open a passive socket for each address provided. - -\end_layout - -\begin_layout Subsubsection -Cannot Specify the Scope Identifier in /etc/hosts -\end_layout - -\begin_layout Standard -It is possible to assign a hostname to an IPv6 network address in -\family typewriter -/etc/hosts -\family default -. - For example, the following is an excerpt from the -\family typewriter -/etc/hosts -\family default - file on the author's development system. - -\end_layout - -\begin_layout Code - ::1 localhost -\end_layout - -\begin_layout Code - 127.0.0.1 localhost -\end_layout - -\begin_layout Code - fe80::2c0:8cff:fe01:2345 pt141 -\end_layout - -\begin_layout Code - 192.0.2.1 pt141 -\end_layout - -\begin_layout Standard -The "localhost" and "pt141" hostnames can be translated to either an IPv4 - or IPv6 network address. - So, for example, if "pt141" is passed as the node parameter to -\family typewriter -getaddrinfo(3) -\family default -, the function returns both an IPv4 and IPv6 address record for the host - (assuming the behavior hasn't been modified by the hints parameter). - Unfortunately, a scoped address cannot be used in -\family typewriter -/etc/hosts -\family default -. - Doing so results in -\family typewriter -getaddrinfo(3) -\family default - returning only the IPv4 record. -\end_layout - -\begin_layout Subsubsection -Client & Server Residing on the Same Machine -\end_layout - -\begin_layout Standard -Suppose a machine has the IPv4 address 192.0.2.1. - A client application running on that machine can connect to a server applicatio -n on the same machine by using either the local loopback address (127.0.0.1) - or the network address (192.0.2.1) as the target server. - Much to this author's surprise (and dismay), it turns out that an IPv6 - client application cannot connect to a server application on the same machine - if it uses the network address of that machine as the target; it must use - the local loopback address (::1). - -\end_layout - -\begin_layout Subsection -Putting It All Together (A Client-Server Programming Example) -\end_layout - -\begin_layout Standard -Now it's time to put everything discussed thus far together into a sample - client-server application. - The remainder of this section is devoted to a remote time-of-day application - (the 'daytime' Internet service) [I noticed that Ms. - Castro used a 'daytime' example in her -\emph on -Porting applications to IPv6 HowTo -\emph default -. - For the record, the source code presented here is original, developed from - scratch, and any similarity between it and any other publicly available - 'daytime' example is purely coincidental.]. - The source code presented in this section was developed and tested on a - RedHat Linux release using the 2.6 kernel (2.6.9 to be specific). - Readers may use the source code freely, so long as proper credit is attributed; - but of course the standard disclaimer must be given first: -\end_layout - -\begin_layout Quotation -Although the sample source code is believed to be free of errors, the author - makes no guarantees as to its reliability, especially considering that - some error paths were intentionally omitted for brevity. - Use it at your own risk! -\end_layout - -\begin_layout Standard -When you get right down to it, there really aren't that many differences - between IPv4 and IPv6 applications. - The trick is to code IPv6 applications in a protocol-independent manner, - such that they can handle both IPv4 and IPv6 simultaneously and transparently. - This sample application does just that. - The only protocol-dependent code in the example occurs when printing network - addresses in verbose mode; but only -\bar under -after -\bar default - the -\family typewriter -ai_family field -\family default - in the -\family typewriter -addrinfo -\family default - structure has been checked, so the programs know exactly what type of address - they're handling at the time. -\end_layout - -\begin_layout Subsubsection -'Daytime' Server Code -\end_layout - -\begin_layout Standard -The server code is found in file tod6d.c (time-of-day IPv6 daemon). - Once built, the server may be started using the following command syntax - (assuming tod6d is the executable file): -\end_layout - -\begin_layout Code -tod6d [-v] [service] -\end_layout - -\begin_layout Standard -ARGUMENTS: -\end_layout - -\begin_layout Description -service The service (or well-known port) on which to listen. - Default is "daytime". -\end_layout - -\begin_layout Standard -OPTIONS: -\end_layout - -\begin_layout Description --v Turn on verbose mode. -\end_layout - -\begin_layout Standard -The server handles both TCP and UDP requests on the network. - The server source code contained in tod6d.c follows: -\end_layout - -\begin_layout Code -/****************************************************************************** -\end_layout - -\begin_layout Code -* File: tod6d.c -\end_layout - -\begin_layout Code -* Description: Contains source code for an IPv6-capable 'daytime' server. -\end_layout - -\begin_layout Code -* Author: John Wenker, Sr. - Software Engineer, -\end_layout - -\begin_layout Code -* Performance Technologies, San Diego, USA -\end_layout - -\begin_layout Code -******************************************************************************/ -\end_layout - -\begin_layout Code -/* -\end_layout - -\begin_layout Code -** System header files. -\end_layout - -\begin_layout Code -*/ -\end_layout - -\begin_layout Code -#include /* errno declaration & error codes. - */ -\end_layout - -\begin_layout Code -#include /* getaddrinfo(3) et al. - */ -\end_layout - -\begin_layout Code -#include /* sockaddr_in & sockaddr_in6 definition. - */ -\end_layout - -\begin_layout Code -#include /* printf(3) et al. - */ -\end_layout - -\begin_layout Code -#include /* exit(2). - */ -\end_layout - -\begin_layout Code -#include /* String manipulation & memory functions. - */ -\end_layout - -\begin_layout Code -#include /* poll(2) and related definitions. - */ -\end_layout - -\begin_layout Code -#include /* Socket functions (socket(2), bind(2), etc). - */ -\end_layout - -\begin_layout Code -#include /* time(2) & ctime(3). - */ -\end_layout - -\begin_layout Code -#include /* getopt(3), read(2), etc. - */ -\end_layout - -\begin_layout Code -/* -\end_layout - -\begin_layout Code -** Constants. -\end_layout - -\begin_layout Code -*/ -\end_layout - -\begin_layout Code -#define DFLT_SERVICE "daytime" /* Default service name. - */ -\end_layout - -\begin_layout Code -#define INVALID_DESC -1 /* Invalid file descriptor. - */ -\end_layout - -\begin_layout Code -#define MAXCONNQLEN 3 /* Max nbr of connection requests to queue. - */ -\end_layout - -\begin_layout Code -#define MAXTCPSCKTS 2 /* One TCP socket for IPv4 & one for IPv6. - */ -\end_layout - -\begin_layout Code -#define MAXUDPSCKTS 2 /* One UDP socket for IPv4 & one for IPv6. - */ -\end_layout - -\begin_layout Code -#define VALIDOPTS "v" /* Valid command options. - */ -\end_layout - -\begin_layout Code -/* -\end_layout - -\begin_layout Code -** Simple boolean type definition. -\end_layout - -\begin_layout Code -*/ -\end_layout - -\begin_layout Code -typedef enum { false = 0, true } boolean; -\end_layout - -\begin_layout Code -/* -\end_layout - -\begin_layout Code -** Prototypes for internal helper functions. -\end_layout - -\begin_layout Code -*/ -\end_layout - -\begin_layout Code -static int openSckt( const char *service, -\end_layout - -\begin_layout Code - const char *protocol, -\end_layout - -\begin_layout Code - int desc[ ], -\end_layout - -\begin_layout Code - size_t *descSize ); -\end_layout - -\begin_layout Code -static void tod( int tSckt[ ], -\end_layout - -\begin_layout Code - size_t tScktSize, -\end_layout - -\begin_layout Code - int uSckt[ ], -\end_layout - -\begin_layout Code - size_t uScktSize ); -\end_layout - -\begin_layout Code -/* -\end_layout - -\begin_layout Code -** Global (within this file only) data objects. -\end_layout - -\begin_layout Code -*/ -\end_layout - -\begin_layout Code -static char hostBfr[ NI_MAXHOST ]; /* For use w/getnameinfo(3). - */ -\end_layout - -\begin_layout Code -static const char *pgmName; /* Program name w/o dir prefix. - */ -\end_layout - -\begin_layout Code -static char servBfr[ NI_MAXSERV ]; /* For use w/getnameinfo(3). - */ -\end_layout - -\begin_layout Code -static boolean verbose = false; /* Verbose mode indication. - */ -\end_layout - -\begin_layout Code -/* -\end_layout - -\begin_layout Code -** Usage macro for command syntax violations. -\end_layout - -\begin_layout Code -*/ -\end_layout - -\begin_layout Code -#define USAGE -\backslash - -\end_layout - -\begin_layout Code - { -\backslash - -\end_layout - -\begin_layout Code - fprintf( stderr, -\backslash - -\end_layout - -\begin_layout Code - "Usage: %s [-v] [service] -\backslash -n", -\backslash - -\end_layout - -\begin_layout Code - pgmName ); -\backslash - -\end_layout - -\begin_layout Code - exit( 127 ); -\backslash - -\end_layout - -\begin_layout Code - } /* End USAGE macro. - */ -\end_layout - -\begin_layout Code -/* -\end_layout - -\begin_layout Code -** Macro to terminate the program if a system call error occurs. - The system -\end_layout - -\begin_layout Code -** call must be one of the usual type that returns -1 on error. - This macro is -\end_layout - -\begin_layout Code -** a modified version of a macro authored by Dr. - V. - Vinge, SDSU Dept. - of -\end_layout - -\begin_layout Code -** Computer Science (retired)... - best professor I ever had. - I hear he writes -\end_layout - -\begin_layout Code -** great science fiction in addition to robust code, too. -\end_layout - -\begin_layout Code -*/ -\end_layout - -\begin_layout Code -#define CHK(expr) -\backslash - -\end_layout - -\begin_layout Code - do -\backslash - -\end_layout - -\begin_layout Code - { -\backslash - -\end_layout - -\begin_layout Code - if ( (expr) == -1 ) -\backslash - -\end_layout - -\begin_layout Code - { -\backslash - -\end_layout - -\begin_layout Code - fprintf( stderr, -\backslash - -\end_layout - -\begin_layout Code - "%s (line %d): System call ERROR - %s. -\backslash -n", -\backslash - -\end_layout - -\begin_layout Code - pgmName, -\backslash - -\end_layout - -\begin_layout Code - __LINE__, -\backslash - -\end_layout - -\begin_layout Code - strerror( errno ) ); -\backslash - -\end_layout - -\begin_layout Code - exit( 1 ); -\backslash - -\end_layout - -\begin_layout Code - } /* End IF system call failed. - */ -\backslash - -\end_layout - -\begin_layout Code - } while ( false ) -\end_layout - -\begin_layout Code -/****************************************************************************** -\end_layout - -\begin_layout Code -* Function: main -\end_layout - -\begin_layout Code -* -\end_layout - -\begin_layout Code -* Description: -\end_layout - -\begin_layout Code -* Set up a time-of-day server and handle network requests. - This server -\end_layout - -\begin_layout Code -* handles both TCP and UDP requests. -\end_layout - -\begin_layout Code -* -\end_layout - -\begin_layout Code -* Parameters: -\end_layout - -\begin_layout Code -* The usual argc and argv parameters to a main() function. -\end_layout - -\begin_layout Code -* -\end_layout - -\begin_layout Code -* Return Value: -\end_layout - -\begin_layout Code -* This is a daemon program and never returns. - However, in the degenerate -\end_layout - -\begin_layout Code -* case where no sockets are created, the function returns zero. -\end_layout - -\begin_layout Code -******************************************************************************/ -\end_layout - -\begin_layout Code -int main( int argc, -\end_layout - -\begin_layout Code - char *argv[ ] ) -\end_layout - -\begin_layout Code -{ -\end_layout - -\begin_layout Code - int opt; -\end_layout - -\begin_layout Code - const char *service = DFLT_SERVICE; -\end_layout - -\begin_layout Code - int tSckt[ MAXTCPSCKTS ]; /* Array of TCP socket descriptors. - */ -\end_layout - -\begin_layout Code - size_t tScktSize = MAXTCPSCKTS; /* Size of uSckt (# of elements). - */ -\end_layout - -\begin_layout Code - int uSckt[ MAXUDPSCKTS ]; /* Array of UDP socket descriptors. - */ -\end_layout - -\begin_layout Code - size_t uScktSize = MAXUDPSCKTS; /* Size of uSckt (# of elements). - */ -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Set the program name (w/o directory prefix). -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - pgmName = strrchr( argv[ 0 ], '/' ); -\end_layout - -\begin_layout Code - pgmName = pgmName == NULL ? argv[ 0 ] : pgmName + 1; -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Process command options. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - opterr = 0; /* Turns off "invalid option" error messages. - */ -\end_layout - -\begin_layout Code - while ( ( opt = getopt( argc, argv, VALIDOPTS ) ) >= 0 ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - switch ( opt ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - case 'v': /* Verbose mode. - */ -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - verbose = true; -\end_layout - -\begin_layout Code - break; -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - default: -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - USAGE; -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - } /* End SWITCH on command option. - */ -\end_layout - -\begin_layout Code - } /* End WHILE processing options. - */ -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Process command line arguments. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - switch ( argc - optind ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - case 0: break; -\end_layout - -\begin_layout Code - case 1: service = argv[ optind ]; break; -\end_layout - -\begin_layout Code - default: USAGE; -\end_layout - -\begin_layout Code - } /* End SWITCH on number of command line arguments. - */ -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Open both a TCP and UDP socket, for both IPv4 & IPv6, on which to - receive -\end_layout - -\begin_layout Code - ** service requests. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - if ( ( openSckt( service, "tcp", tSckt, &tScktSize ) < 0 ) || -\end_layout - -\begin_layout Code - ( openSckt( service, "udp", uSckt, &uScktSize ) < 0 ) ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - exit( 1 ); -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Run the time-of-day server. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - if ( ( tScktSize > 0 ) || ( uScktSize > 0 ) ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - tod( tSckt, /* tod() never returns. - */ -\end_layout - -\begin_layout Code - tScktSize, -\end_layout - -\begin_layout Code - uSckt, -\end_layout - -\begin_layout Code - uScktSize ); -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Since tod() never returns, execution only gets here if no sockets - were -\end_layout - -\begin_layout Code - ** created. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - if ( verbose ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - fprintf( stderr, -\end_layout - -\begin_layout Code - "%s: No sockets opened... - terminating. -\backslash -n", -\end_layout - -\begin_layout Code - pgmName ); -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - return 0; -\end_layout - -\begin_layout Code -} /* End main() */ -\end_layout - -\begin_layout Code -/****************************************************************************** -\end_layout - -\begin_layout Code -* Function: openSckt -\end_layout - -\begin_layout Code -* -\end_layout - -\begin_layout Code -* Description: -\end_layout - -\begin_layout Code -* Open passive (server) sockets for the indicated inet service & protocol. -\end_layout - -\begin_layout Code -* Notice in the last sentence that "sockets" is plural. - During the interim -\end_layout - -\begin_layout Code -* transition period while everyone is switching over to IPv6, the server -\end_layout - -\begin_layout Code -* application has to open two sockets on which to listen for connections... -\end_layout - -\begin_layout Code -* one for IPv4 traffic and one for IPv6 traffic. -\end_layout - -\begin_layout Code -* -\end_layout - -\begin_layout Code -* Parameters: -\end_layout - -\begin_layout Code -* service - Pointer to a character string representing the well-known - port -\end_layout - -\begin_layout Code -* on which to listen (can be a service name or a decimal number). -\end_layout - -\begin_layout Code -* protocol - Pointer to a character string representing the transport - layer -\end_layout - -\begin_layout Code -* protocol (only "tcp" or "udp" are valid). -\end_layout - -\begin_layout Code -* desc - Pointer to an array into which the socket descriptors are -\end_layout - -\begin_layout Code -* placed when opened. -\end_layout - -\begin_layout Code -* descSize - This is a value-result parameter. - On input, it contains the -\end_layout - -\begin_layout Code -* max number of descriptors that can be put into 'desc' (i.e. - the -\end_layout - -\begin_layout Code -* number of elements in the array). - Upon return, it will contain -\end_layout - -\begin_layout Code -* the number of descriptors actually opened. - Any unused slots in -\end_layout - -\begin_layout Code -* 'desc' are set to INVALID_DESC. -\end_layout - -\begin_layout Code -* -\end_layout - -\begin_layout Code -* Return Value: -\end_layout - -\begin_layout Code -* 0 on success, -1 on error. -\end_layout - -\begin_layout Code -******************************************************************************/ -\end_layout - -\begin_layout Code -static int openSckt( const char *service, -\end_layout - -\begin_layout Code - const char *protocol, -\end_layout - -\begin_layout Code - int desc[ ], -\end_layout - -\begin_layout Code - size_t *descSize ) -\end_layout - -\begin_layout Code -{ -\end_layout - -\begin_layout Code - struct addrinfo *ai; -\end_layout - -\begin_layout Code - int aiErr; -\end_layout - -\begin_layout Code - struct addrinfo *aiHead; -\end_layout - -\begin_layout Code - struct addrinfo hints = { .ai_flags = AI_PASSIVE, /* Server mode. - -\end_layout - -\begin_layout Code -¬ */ -\end_layout - -\begin_layout Code - .ai_family = PF_UNSPEC }; /* IPv4 or IPv6. -\end_layout - -\begin_layout Code -¬ */ -\end_layout - -\begin_layout Code - size_t maxDescs = *descSize; -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Initialize output parameters. - When the loop completes, *descSize is 0. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - while ( *descSize > 0 ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - desc[ --( *descSize ) ] = INVALID_DESC; -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Check which protocol is selected (only TCP and UDP are valid). -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - if ( strcmp( protocol, "tcp" ) == 0 ) /* TCP protocol. - */ -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - hints.ai_socktype = SOCK_STREAM; -\end_layout - -\begin_layout Code - hints.ai_protocol = IPPROTO_TCP; -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - else if ( strcmp( protocol, "udp" ) == 0 ) /* UDP protocol. - */ -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - hints.ai_socktype = SOCK_DGRAM; -\end_layout - -\begin_layout Code - hints.ai_protocol = IPPROTO_UDP; -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - else /* Invalid protocol. - */ -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - fprintf( stderr, -\end_layout - -\begin_layout Code - "%s (line %d): ERROR - Unknown transport " -\end_layout - -\begin_layout Code - "layer protocol -\backslash -"%s -\backslash -". -\backslash -n", -\end_layout - -\begin_layout Code - pgmName, -\end_layout - -\begin_layout Code - __LINE__, -\end_layout - -\begin_layout Code - protocol ); -\end_layout - -\begin_layout Code - return -1; -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Look up the service's well-known port number. - Notice that NULL is being -\end_layout - -\begin_layout Code - ** passed for the 'node' parameter, and that the AI_PASSIVE flag is set - in -\end_layout - -\begin_layout Code - ** 'hints'. - Thus, the program is requesting passive address information. -\end_layout - -\begin_layout Code - ** The network address is initialized to :: (all zeros) for IPv6 records, - or -\end_layout - -\begin_layout Code - ** 0.0.0.0 for IPv4 records. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - if ( ( aiErr = getaddrinfo( NULL, -\end_layout - -\begin_layout Code - service, -\end_layout - -\begin_layout Code - &hints, -\end_layout - -\begin_layout Code - &aiHead ) ) != 0 ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - fprintf( stderr, -\end_layout - -\begin_layout Code - "%s (line %d): ERROR - %s. -\backslash -n", -\end_layout - -\begin_layout Code - pgmName, -\end_layout - -\begin_layout Code - __LINE__, -\end_layout - -\begin_layout Code - gai_strerror( aiErr ) ); -\end_layout - -\begin_layout Code - return -1; -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** For each of the address records returned, attempt to set up a passive -\end_layout - -\begin_layout Code - ** socket. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - for ( ai = aiHead; -\end_layout - -\begin_layout Code - ( ai != NULL ) && ( *descSize < maxDescs ); -\end_layout - -\begin_layout Code - ai = ai->ai_next ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - if ( verbose ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Display the current address info. - Start with the protocol- -\end_layout - -\begin_layout Code - ** independent fields first. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - fprintf( stderr, -\end_layout - -\begin_layout Code - "Setting up a passive socket based on the " -\end_layout - -\begin_layout Code - "following address info: -\backslash -n" -\end_layout - -\begin_layout Code - " ai_flags = 0x%02X -\backslash -n" -\end_layout - -\begin_layout Code - " ai_family = %d (PF_INET = %d, PF_INET6 = %d) -\backslash -n" -\end_layout - -\begin_layout Code - " ai_socktype = %d (SOCK_STREAM = %d, SOCK_DGRAM = - %d) -\backslash -n" -\end_layout - -\begin_layout Code - " ai_protocol = %d (IPPROTO_TCP = %d, IPPROTO_UDP = - %d) -\backslash -n" -\end_layout - -\begin_layout Code - " ai_addrlen = %d (sockaddr_in = %d, " -\end_layout - -\begin_layout Code - "sockaddr_in6 = %d) -\backslash -n", -\end_layout - -\begin_layout Code - ai->ai_flags, -\end_layout - -\begin_layout Code - ai->ai_family, -\end_layout - -\begin_layout Code - PF_INET, -\end_layout - -\begin_layout Code - PF_INET6, -\end_layout - -\begin_layout Code - ai->ai_socktype, -\end_layout - -\begin_layout Code - SOCK_STREAM, -\end_layout - -\begin_layout Code - SOCK_DGRAM, -\end_layout - -\begin_layout Code - ai->ai_protocol, -\end_layout - -\begin_layout Code - IPPROTO_TCP, -\end_layout - -\begin_layout Code - IPPROTO_UDP, -\end_layout - -\begin_layout Code - ai->ai_addrlen, -\end_layout - -\begin_layout Code - sizeof( struct sockaddr_in ), -\end_layout - -\begin_layout Code - sizeof( struct sockaddr_in6 ) ); -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Now display the protocol-specific formatted socket address. - Note -\end_layout - -\begin_layout Code - ** that the program is requesting that getnameinfo(3) convert the -\end_layout - -\begin_layout Code - ** host & service into numeric strings. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - getnameinfo( ai->ai_addr, -\end_layout - -\begin_layout Code - ai->ai_addrlen, -\end_layout - -\begin_layout Code - hostBfr, -\end_layout - -\begin_layout Code - sizeof( hostBfr ), -\end_layout - -\begin_layout Code - servBfr, -\end_layout - -\begin_layout Code - sizeof( servBfr ), -\end_layout - -\begin_layout Code - NI_NUMERICHOST | NI_NUMERICSERV ); -\end_layout - -\begin_layout Code - switch ( ai->ai_family ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - case PF_INET: /* IPv4 address record. - */ -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - struct sockaddr_in *p = (struct sockaddr_in*) ai->ai_addr; -\end_layout - -\begin_layout Code - fprintf( stderr, -\end_layout - -\begin_layout Code - " ai_addr = sin_family: %d (AF_INET = %d, - " -\end_layout - -\begin_layout Code - "AF_INET6 = %d) -\backslash -n" -\end_layout - -\begin_layout Code - " sin_addr: %s -\backslash -n" -\end_layout - -\begin_layout Code - " sin_port: %s -\backslash -n", -\end_layout - -\begin_layout Code - p->sin_family, -\end_layout - -\begin_layout Code - AF_INET, -\end_layout - -\begin_layout Code - AF_INET6, -\end_layout - -\begin_layout Code - hostBfr, -\end_layout - -\begin_layout Code - servBfr ); -\end_layout - -\begin_layout Code - break; -\end_layout - -\begin_layout Code - } /* End CASE of IPv4. - */ -\end_layout - -\begin_layout Code - case PF_INET6: /* IPv6 address record. - */ -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - struct sockaddr_in6 *p = (struct sockaddr_in6*) ai->ai_addr; -\end_layout - -\begin_layout Code - fprintf( stderr, -\end_layout - -\begin_layout Code - " ai_addr = sin6_family: %d (AF_INET = - %d, " -\end_layout - -\begin_layout Code - "AF_INET6 = %d) -\backslash -n" -\end_layout - -\begin_layout Code - " sin6_addr: %s -\backslash -n" -\end_layout - -\begin_layout Code - " sin6_port: %s -\backslash -n" -\end_layout - -\begin_layout Code - " sin6_flowinfo: %d -\backslash -n" -\end_layout - -\begin_layout Code - " sin6_scope_id: %d -\backslash -n", -\end_layout - -\begin_layout Code - p->sin6_family, -\end_layout - -\begin_layout Code - AF_INET, -\end_layout - -\begin_layout Code - AF_INET6, -\end_layout - -\begin_layout Code - hostBfr, -\end_layout - -\begin_layout Code - servBfr, -\end_layout - -\begin_layout Code - p->sin6_flowinfo, -\end_layout - -\begin_layout Code - p->sin6_scope_id ); -\end_layout - -\begin_layout Code - break; -\end_layout - -\begin_layout Code - } /* End CASE of IPv6. - */ -\end_layout - -\begin_layout Code - default: /* Can never get here, but just for completeness. - */ -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - fprintf( stderr, -\end_layout - -\begin_layout Code - "%s (line %d): ERROR - Unknown protocol family (%d). -\backslash -n", -\end_layout - -\begin_layout Code - pgmName, -\end_layout - -\begin_layout Code - __LINE__, -\end_layout - -\begin_layout Code - ai->ai_family ); -\end_layout - -\begin_layout Code - freeaddrinfo( aiHead ); -\end_layout - -\begin_layout Code - return -1; -\end_layout - -\begin_layout Code - } /* End DEFAULT case (unknown protocol family). - */ -\end_layout - -\begin_layout Code - } /* End SWITCH on protocol family. - */ -\end_layout - -\begin_layout Code - } /* End IF verbose mode. - */ -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Create a socket using the info in the addrinfo structure. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - CHK( desc[ *descSize ] = socket( ai->ai_family, -\end_layout - -\begin_layout Code - ai->ai_socktype, -\end_layout - -\begin_layout Code - ai->ai_protocol ) ); -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Here is the code that prevents "IPv4 mapped addresses", as discussed -\end_layout - -\begin_layout Code - ** in Section 22.1.3.1. - If an IPv6 socket was just created, then set the -\end_layout - -\begin_layout Code - ** IPV6_V6ONLY socket option. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - if ( ai->ai_family == PF_INET6 ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code -#if defined( IPV6_V6ONLY ) -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Disable IPv4 mapped addresses. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - int v6Only = 1; -\end_layout - -\begin_layout Code - CHK( setsockopt( desc[ *descSize ], -\end_layout - -\begin_layout Code - IPPROTO_IPV6, -\end_layout - -\begin_layout Code - IPV6_V6ONLY, -\end_layout - -\begin_layout Code - &v6Only, -\end_layout - -\begin_layout Code - sizeof( v6Only ) ) ); -\end_layout - -\begin_layout Code -#else -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** IPV6_V6ONLY is not defined, so the socket option can't be set - and -\end_layout - -\begin_layout Code - ** thus IPv4 mapped addresses can't be disabled. - Print a warning -\end_layout - -\begin_layout Code - ** message and close the socket. - Design note: If the -\end_layout - -\begin_layout Code - ** #if...#else...#endif construct were removed, then this program -\end_layout - -\begin_layout Code - ** would not compile (because IPV6_V6ONLY isn't defined). - That's an -\end_layout - -\begin_layout Code - ** acceptable approach; IPv4 mapped addresses are certainly disabled -\end_layout - -\begin_layout Code - ** if the program can't build! However, since this program is - also -\end_layout - -\begin_layout Code - ** designed to work for IPv4 sockets as well as IPv6, I decided - to -\end_layout - -\begin_layout Code - ** allow the program to compile when IPV6_V6ONLY is not defined, - and -\end_layout - -\begin_layout Code - ** turn it into a run-time warning rather than a compile-time error. -\end_layout - -\begin_layout Code - ** IPv4 mapped addresses are still disabled because _all_ IPv6 - traffic -\end_layout - -\begin_layout Code - ** is disabled (all IPv6 sockets are closed here), but at least - this -\end_layout - -\begin_layout Code - ** way the server can still service IPv4 network traffic. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - fprintf( stderr, -\end_layout - -\begin_layout Code - "%s (line %d): WARNING - Cannot set IPV6_V6ONLY socket - " -\end_layout - -\begin_layout Code - "option. - Closing IPv6 %s socket. -\backslash -n", -\end_layout - -\begin_layout Code - pgmName, -\end_layout - -\begin_layout Code - __LINE__, -\end_layout - -\begin_layout Code - ai->ai_protocol == IPPROTO_TCP ? "TCP" : "UDP" ); -\end_layout - -\begin_layout Code - CHK( close( desc[ *descSize ] ) ); -\end_layout - -\begin_layout Code - continue; /* Go to top of FOR loop w/o updating *descSize! */ -\end_layout - -\begin_layout Code -#endif /* IPV6_V6ONLY */ -\end_layout - -\begin_layout Code - } /* End IF this is an IPv6 socket. - */ -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Bind the socket. - Again, the info from the addrinfo structure is used. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - CHK( bind( desc[ *descSize ], -\end_layout - -\begin_layout Code - ai->ai_addr, -\end_layout - -\begin_layout Code - ai->ai_addrlen ) ); -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** If this is a TCP socket, put the socket into passive listening - mode -\end_layout - -\begin_layout Code - ** (listen is only valid on connection-oriented sockets). -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - if ( ai->ai_socktype == SOCK_STREAM ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - CHK( listen( desc[ *descSize ], -\end_layout - -\begin_layout Code - MAXCONNQLEN ) ); -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Socket set up okay. - Bump index to next descriptor array element. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - *descSize += 1; -\end_layout - -\begin_layout Code - } /* End FOR each address info structure returned. - */ -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Dummy check for unused address records. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - if ( verbose && ( ai != NULL ) ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - fprintf( stderr, -\end_layout - -\begin_layout Code - "%s (line %d): WARNING - Some address records were " -\end_layout - -\begin_layout Code - "not processed due to insufficient array space. -\backslash -n", -\end_layout - -\begin_layout Code - pgmName, -\end_layout - -\begin_layout Code - __LINE__ ); -\end_layout - -\begin_layout Code - } /* End IF verbose and some address records remain unprocessed. - */ -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Clean up. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - freeaddrinfo( aiHead ); -\end_layout - -\begin_layout Code - return 0; -\end_layout - -\begin_layout Code -} /* End openSckt() */ -\end_layout - -\begin_layout Code -/****************************************************************************** -\end_layout - -\begin_layout Code -* Function: tod -\end_layout - -\begin_layout Code -* -\end_layout - -\begin_layout Code -* Description: -\end_layout - -\begin_layout Code -* Listen on a set of sockets and send the current time-of-day to any -\end_layout - -\begin_layout Code -* clients. - This function never returns. -\end_layout - -\begin_layout Code -* -\end_layout - -\begin_layout Code -* Parameters: -\end_layout - -\begin_layout Code -* tSckt - Array of TCP socket descriptors on which to listen. -\end_layout - -\begin_layout Code -* tScktSize - Size of the tSckt array (nbr of elements). -\end_layout - -\begin_layout Code -* uSckt - Array of UDP socket descriptors on which to listen. -\end_layout - -\begin_layout Code -* uScktSize - Size of the uSckt array (nbr of elements). -\end_layout - -\begin_layout Code -* -\end_layout - -\begin_layout Code -* Return Value: None. -\end_layout - -\begin_layout Code -******************************************************************************/ -\end_layout - -\begin_layout Code -static void tod( int tSckt[ ], -\end_layout - -\begin_layout Code - size_t tScktSize, -\end_layout - -\begin_layout Code - int uSckt[ ], -\end_layout - -\begin_layout Code - size_t uScktSize ) -\end_layout - -\begin_layout Code -{ -\end_layout - -\begin_layout Code - char bfr[ 256 ]; -\end_layout - -\begin_layout Code - ssize_t count; -\end_layout - -\begin_layout Code - struct pollfd *desc; -\end_layout - -\begin_layout Code - size_t descSize = tScktSize + uScktSize; -\end_layout - -\begin_layout Code - int idx; -\end_layout - -\begin_layout Code - int newSckt; -\end_layout - -\begin_layout Code - struct sockaddr *sadr; -\end_layout - -\begin_layout Code - socklen_t sadrLen; -\end_layout - -\begin_layout Code - struct sockaddr_storage sockStor; -\end_layout - -\begin_layout Code - int status; -\end_layout - -\begin_layout Code - size_t timeLen; -\end_layout - -\begin_layout Code - char *timeStr; -\end_layout - -\begin_layout Code - time_t timeVal; -\end_layout - -\begin_layout Code - ssize_t wBytes; -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Allocate memory for the poll(2) array. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - desc = malloc( descSize * sizeof( struct pollfd ) ); -\end_layout - -\begin_layout Code - if ( desc == NULL ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - fprintf( stderr, -\end_layout - -\begin_layout Code - "%s (line %d): ERROR - %s. -\backslash -n", -\end_layout - -\begin_layout Code - pgmName, -\end_layout - -\begin_layout Code - __LINE__, -\end_layout - -\begin_layout Code - strerror( ENOMEM ) ); -\end_layout - -\begin_layout Code - exit( 1 ); -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Initialize the poll(2) array. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - for ( idx = 0; idx < descSize; idx++ ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - desc[ idx ].fd = idx < tScktSize ? tSckt[ idx ] -\end_layout - -\begin_layout Code - : uSckt[ idx - tScktSize ]; -\end_layout - -\begin_layout Code - desc[ idx ].events = POLLIN; -\end_layout - -\begin_layout Code - desc[ idx ].revents = 0; -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Main time-of-day server loop. - Handles both TCP & UDP requests. - This is -\end_layout - -\begin_layout Code - ** an interative server, and all requests are handled directly within - the -\end_layout - -\begin_layout Code - ** main loop. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - while ( true ) /* Do forever. - */ -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Wait for activity on one of the sockets. - The DO..WHILE construct is -\end_layout - -\begin_layout Code - ** used to restart the system call in the event the process is -\end_layout - -\begin_layout Code - ** interrupted by a signal. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - do -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - status = poll( desc, -\end_layout - -\begin_layout Code - descSize, -\end_layout - -\begin_layout Code - -1 /* Wait indefinitely for input. - */ ); -\end_layout - -\begin_layout Code - } while ( ( status < 0 ) && ( errno == EINTR ) ); -\end_layout - -\begin_layout Code - CHK( status ); /* Check for a bona fide system call error. - */ -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Get the current time. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - timeVal = time( NULL ); -\end_layout - -\begin_layout Code - timeStr = ctime( &timeVal ); -\end_layout - -\begin_layout Code - timeLen = strlen( timeStr ); -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Indicate that there is new network activity. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - if ( verbose ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - char *s = malloc( timeLen+1 ); -\end_layout - -\begin_layout Code - strcpy( s, timeStr ); -\end_layout - -\begin_layout Code - s[ timeLen-1 ] = ' -\backslash -0'; /* Overwrite ' -\backslash -n' in date string. - */ -\end_layout - -\begin_layout Code - fprintf( stderr, -\end_layout - -\begin_layout Code - "%s: New network activity on %s. -\backslash -n", -\end_layout - -\begin_layout Code - pgmName, -\end_layout - -\begin_layout Code - s ); -\end_layout - -\begin_layout Code - free( s ); -\end_layout - -\begin_layout Code - } /* End IF verbose. - */ -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Process sockets with input available. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - for ( idx = 0; idx < descSize; idx++ ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - switch ( desc[ idx ].revents ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - case 0: /* No activity on this socket; try the next. - */ -\end_layout - -\begin_layout Code - continue; -\end_layout - -\begin_layout Code - case POLLIN: /* Network activity. - Go process it. - */ -\end_layout - -\begin_layout Code - break; -\end_layout - -\begin_layout Code - default: /* Invalid poll events. - */ -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - fprintf( stderr, -\end_layout - -\begin_layout Code - "%s (line %d): ERROR - Invalid poll event (0x%02X). -\backslash -n", -\end_layout - -\begin_layout Code - pgmName, -\end_layout - -\begin_layout Code - __LINE__, -\end_layout - -\begin_layout Code - desc[ idx ].revents ); -\end_layout - -\begin_layout Code - exit( 1 ); -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - } /* End SWITCH on returned poll events. - */ -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Determine if this is a TCP request or UDP request. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - if ( idx < tScktSize ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** TCP connection requested. - Accept it. - Notice the use of -\end_layout - -\begin_layout Code - ** the sockaddr_storage data type. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - sadrLen = sizeof( sockStor ); -\end_layout - -\begin_layout Code - sadr = (struct sockaddr*) &sockStor; -\end_layout - -\begin_layout Code - CHK( newSckt = accept( desc[ idx ].fd, -\end_layout - -\begin_layout Code - sadr, -\end_layout - -\begin_layout Code - &sadrLen ) ); -\end_layout - -\begin_layout Code - CHK( shutdown( newSckt, /* Server never recv's anything. - */ -\end_layout - -\begin_layout Code - SHUT_RD ) ); -\end_layout - -\begin_layout Code - if ( verbose ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Display the socket address of the remote client. - Begin with -\end_layout - -\begin_layout Code - ** the address-independent fields. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - fprintf( stderr, -\end_layout - -\begin_layout Code - "Sockaddr info for new TCP client: -\backslash -n" -\end_layout - -\begin_layout Code - " sa_family = %d (AF_INET = %d, AF_INET6 = %d) -\backslash -n" -\end_layout - -\begin_layout Code - " addr len = %d (sockaddr_in = %d, " -\end_layout - -\begin_layout Code - "sockaddr_in6 = %d) -\backslash -n", -\end_layout - -\begin_layout Code - sadr->sa_family, -\end_layout - -\begin_layout Code - AF_INET, -\end_layout - -\begin_layout Code - AF_INET6, -\end_layout - -\begin_layout Code - sadrLen, -\end_layout - -\begin_layout Code - sizeof( struct sockaddr_in ), -\end_layout - -\begin_layout Code - sizeof( struct sockaddr_in6 ) ); -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Display the address-specific fields. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - getnameinfo( sadr, -\end_layout - -\begin_layout Code - sadrLen, -\end_layout - -\begin_layout Code - hostBfr, -\end_layout - -\begin_layout Code - sizeof( hostBfr ), -\end_layout - -\begin_layout Code - servBfr, -\end_layout - -\begin_layout Code - sizeof( servBfr ), -\end_layout - -\begin_layout Code - NI_NUMERICHOST | NI_NUMERICSERV ); -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Notice that we're switching on an address family now, - not a -\end_layout - -\begin_layout Code - ** protocol family. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - switch ( sadr->sa_family ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - case AF_INET: /* IPv4 address. - */ -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - struct sockaddr_in *p = (struct sockaddr_in*) sadr; -\end_layout - -\begin_layout Code - fprintf( stderr, -\end_layout - -\begin_layout Code - " sin_addr = sin_family: %d -\backslash -n" -\end_layout - -\begin_layout Code - " sin_addr: %s -\backslash -n" -\end_layout - -\begin_layout Code - " sin_port: %s -\backslash -n", -\end_layout - -\begin_layout Code - p->sin_family, -\end_layout - -\begin_layout Code - hostBfr, -\end_layout - -\begin_layout Code - servBfr ); -\end_layout - -\begin_layout Code - break; -\end_layout - -\begin_layout Code - } /* End CASE of IPv4. - */ -\end_layout - -\begin_layout Code - case AF_INET6: /* IPv6 address. - */ -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - struct sockaddr_in6 *p = (struct sockaddr_in6*) sadr; -\end_layout - -\begin_layout Code - fprintf( stderr, -\end_layout - -\begin_layout Code - " sin6_addr = sin6_family: %d -\backslash -n" -\end_layout - -\begin_layout Code - " sin6_addr: %s -\backslash -n" -\end_layout - -\begin_layout Code - " sin6_port: %s -\backslash -n" -\end_layout - -\begin_layout Code - " sin6_flowinfo: %d -\backslash -n" -\end_layout - -\begin_layout Code - " sin6_scope_id: %d -\backslash -n", -\end_layout - -\begin_layout Code - p->sin6_family, -\end_layout - -\begin_layout Code - hostBfr, -\end_layout - -\begin_layout Code - servBfr, -\end_layout - -\begin_layout Code - p->sin6_flowinfo, -\end_layout - -\begin_layout Code - p->sin6_scope_id ); -\end_layout - -\begin_layout Code - break; -\end_layout - -\begin_layout Code - } /* End CASE of IPv6. - */ -\end_layout - -\begin_layout Code - default: /* Can never get here, but for completeness. - */ -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - fprintf( stderr, -\end_layout - -\begin_layout Code - "%s (line %d): ERROR - Unknown address " -\end_layout - -\begin_layout Code - "family (%d). -\backslash -n", -\end_layout - -\begin_layout Code - pgmName, -\end_layout - -\begin_layout Code - __LINE__, -\end_layout - -\begin_layout Code - sadr->sa_family ); -\end_layout - -\begin_layout Code - break; -\end_layout - -\begin_layout Code - } /* End DEFAULT case (unknown address family). - */ -\end_layout - -\begin_layout Code - } /* End SWITCH on address family. - */ -\end_layout - -\begin_layout Code - } /* End IF verbose mode. - */ -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Send the TOD to the client. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - wBytes = timeLen; -\end_layout - -\begin_layout Code - while ( wBytes > 0 ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - do -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - count = write( newSckt, -\end_layout - -\begin_layout Code - timeStr, -\end_layout - -\begin_layout Code - wBytes ); -\end_layout - -\begin_layout Code - } while ( ( count < 0 ) && ( errno == EINTR ) ); -\end_layout - -\begin_layout Code - CHK( count ); /* Check for a bona fide error. - */ -\end_layout - -\begin_layout Code - wBytes -= count; -\end_layout - -\begin_layout Code - } /* End WHILE there is data to send. - */ -\end_layout - -\begin_layout Code - CHK( close( newSckt ) ); -\end_layout - -\begin_layout Code - } /* End IF this was a TCP connection request. - */ -\end_layout - -\begin_layout Code - else -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** This is a UDP socket, and a datagram is available. - The funny -\end_layout - -\begin_layout Code - ** thing about UDP requests is that this server doesn't require - any -\end_layout - -\begin_layout Code - ** client input; but it can't send the TOD unless it knows a - client -\end_layout - -\begin_layout Code - ** wants the data, and the only way that can occur with UDP - is if -\end_layout - -\begin_layout Code - ** the server receives a datagram from the client. - Thus, the -\end_layout - -\begin_layout Code - ** server must receive _something_, but the content of the datagram -\end_layout - -\begin_layout Code - ** is irrelevant. - Read in the datagram. - Again note the use of -\end_layout - -\begin_layout Code - ** sockaddr_storage to receive the address. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - sadrLen = sizeof( sockStor ); -\end_layout - -\begin_layout Code - sadr = (struct sockaddr*) &sockStor; -\end_layout - -\begin_layout Code - CHK( count = recvfrom( desc[ idx ].fd, -\end_layout - -\begin_layout Code - bfr, -\end_layout - -\begin_layout Code - sizeof( bfr ), -\end_layout - -\begin_layout Code - 0, -\end_layout - -\begin_layout Code - sadr, -\end_layout - -\begin_layout Code - &sadrLen ) ); -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Display whatever was received on stdout. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - if ( verbose ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - ssize_t rBytes = count; -\end_layout - -\begin_layout Code - fprintf( stderr, -\end_layout - -\begin_layout Code - "%s: UDP datagram received (%d bytes). -\backslash -n", -\end_layout - -\begin_layout Code - pgmName, -\end_layout - -\begin_layout Code - count ); -\end_layout - -\begin_layout Code - while ( count > 0 ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - fputc( bfr[ rBytes - count-- ], -\end_layout - -\begin_layout Code - stdout ); -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - if ( bfr[ rBytes-1 ] != ' -\backslash -n' ) -\end_layout - -\begin_layout Code - fputc( ' -\backslash -n', stdout ); /* Newline also flushes stdout. - */ -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Display the socket address of the remote client. - Address- -\end_layout - -\begin_layout Code - ** independent fields first. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - fprintf( stderr, -\end_layout - -\begin_layout Code - "Remote client's sockaddr info: -\backslash -n" -\end_layout - -\begin_layout Code - " sa_family = %d (AF_INET = %d, AF_INET6 = %d) -\backslash -n" -\end_layout - -\begin_layout Code - " addr len = %d (sockaddr_in = %d, " -\end_layout - -\begin_layout Code - "sockaddr_in6 = %d) -\backslash -n", -\end_layout - -\begin_layout Code - sadr->sa_family, -\end_layout - -\begin_layout Code - AF_INET, -\end_layout - -\begin_layout Code - AF_INET6, -\end_layout - -\begin_layout Code - sadrLen, -\end_layout - -\begin_layout Code - sizeof( struct sockaddr_in ), -\end_layout - -\begin_layout Code - sizeof( struct sockaddr_in6 ) ); -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Display the address-specific information. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - getnameinfo( sadr, -\end_layout - -\begin_layout Code - sadrLen, -\end_layout - -\begin_layout Code - hostBfr, -\end_layout - -\begin_layout Code - sizeof( hostBfr ), -\end_layout - -\begin_layout Code - servBfr, -\end_layout - -\begin_layout Code - sizeof( servBfr ), -\end_layout - -\begin_layout Code - NI_NUMERICHOST | NI_NUMERICSERV ); -\end_layout - -\begin_layout Code - switch ( sadr->sa_family ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - case AF_INET: /* IPv4 address. - */ -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - struct sockaddr_in *p = (struct sockaddr_in*) sadr; -\end_layout - -\begin_layout Code - fprintf( stderr, -\end_layout - -\begin_layout Code - " sin_addr = sin_family: %d -\backslash -n" -\end_layout - -\begin_layout Code - " sin_addr: %s -\backslash -n" -\end_layout - -\begin_layout Code - " sin_port: %s -\backslash -n", -\end_layout - -\begin_layout Code - p->sin_family, -\end_layout - -\begin_layout Code - hostBfr, -\end_layout - -\begin_layout Code - servBfr ); -\end_layout - -\begin_layout Code - break; -\end_layout - -\begin_layout Code - } /* End CASE of IPv4 address. - */ -\end_layout - -\begin_layout Code - case AF_INET6: /* IPv6 address. - */ -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - struct sockaddr_in6 *p = (struct sockaddr_in6*) sadr; -\end_layout - -\begin_layout Code - fprintf( stderr, -\end_layout - -\begin_layout Code - " sin6_addr = sin6_family: %d -\backslash -n" -\end_layout - -\begin_layout Code - " sin6_addr: %s -\backslash -n" -\end_layout - -\begin_layout Code - " sin6_port: %s -\backslash -n" -\end_layout - -\begin_layout Code - " sin6_flowinfo: %d -\backslash -n" -\end_layout - -\begin_layout Code - " sin6_scope_id: %d -\backslash -n", -\end_layout - -\begin_layout Code - p->sin6_family, -\end_layout - -\begin_layout Code - hostBfr, -\end_layout - -\begin_layout Code - servBfr, -\end_layout - -\begin_layout Code - p->sin6_flowinfo, -\end_layout - -\begin_layout Code - p->sin6_scope_id ); -\end_layout - -\begin_layout Code - break; -\end_layout - -\begin_layout Code - } /* End CASE of IPv6 address. - */ -\end_layout - -\begin_layout Code - default: /* Can never get here, but for completeness. - */ -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - fprintf( stderr, -\end_layout - -\begin_layout Code - "%s (line %d): ERROR - Unknown address " -\end_layout - -\begin_layout Code - "family (%d). -\backslash -n", -\end_layout - -\begin_layout Code - pgmName, -\end_layout - -\begin_layout Code - __LINE__, -\end_layout - -\begin_layout Code - sadr->sa_family ); -\end_layout - -\begin_layout Code - break; -\end_layout - -\begin_layout Code - } /* End DEFAULT case (unknown address family). - */ -\end_layout - -\begin_layout Code - } /* End SWITCH on address family. - */ -\end_layout - -\begin_layout Code - } /* End IF verbose mode. - */ -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Send the time-of-day to the client. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - wBytes = timeLen; -\end_layout - -\begin_layout Code - while ( wBytes > 0 ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - do -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - count = sendto( desc[ idx ].fd, -\end_layout - -\begin_layout Code - timeStr, -\end_layout - -\begin_layout Code - wBytes, -\end_layout - -\begin_layout Code - 0, -\end_layout - -\begin_layout Code - sadr, /* Address & address length - */ -\end_layout - -\begin_layout Code - sadrLen ); /* received in recvfrom(). - */ -\end_layout - -\begin_layout Code - } while ( ( count < 0 ) && ( errno == EINTR ) ); -\end_layout - -\begin_layout Code - CHK( count ); /* Check for a bona fide error. - */ -\end_layout - -\begin_layout Code - wBytes -= count; -\end_layout - -\begin_layout Code - } /* End WHILE there is data to send. - */ -\end_layout - -\begin_layout Code - } /* End ELSE a UDP datagram is available. - */ -\end_layout - -\begin_layout Code - desc[ idx ].revents = 0; /* Clear the returned poll events. - */ -\end_layout - -\begin_layout Code - } /* End FOR each socket descriptor. - */ -\end_layout - -\begin_layout Code - } /* End WHILE forever. - */ -\end_layout - -\begin_layout Code -} /* End tod() */ -\end_layout - -\begin_layout Subsubsection -'Daytime' TCP Client Code -\end_layout - -\begin_layout Standard -The TCP client code is found in file tod6tc.c (time-of-day IPv6 TCP client). - Once built, the TCP client may be started using the following command syntax - (assuming tod6tc is the executable file): -\end_layout - -\begin_layout Code -tod6tc [-v] [-s scope_id] [host [service]] -\end_layout - -\begin_layout Standard -ARGUMENTS: -\end_layout - -\begin_layout Description -host The hostname or IP address (dotted decimal or colon-hex) of the remote - host providing the service. - Default is "localhost". -\end_layout - -\begin_layout Description -service The TCP service (or well-known port number) to which a connection - attempt is made. - Default is "daytime". -\end_layout - -\begin_layout Standard -OPTIONS: -\end_layout - -\begin_layout Description --s This option is only meaningful for IPv6 addresses, and is used to set - the scope identifier (i.e. - the network interface on which to establish the connection). - Default is "eth0". - If host is a scoped address, this option is ignored. -\end_layout - -\begin_layout Description --v Turn on verbose mode. -\end_layout - -\begin_layout Standard -The TCP client source code contained in tod6tc.c follows: -\end_layout - -\begin_layout Code -/****************************************************************************** -\end_layout - -\begin_layout Code -* File: tod6tc.c -\end_layout - -\begin_layout Code -* Description: Contains source code for an IPv6-capable 'daytime' TCP client. -\end_layout - -\begin_layout Code -* Author: John Wenker, Sr. - Software Engineer -\end_layout - -\begin_layout Code -* Performance Technologies, San Diego, USA -\end_layout - -\begin_layout Code -******************************************************************************/ -\end_layout - -\begin_layout Code -/* -\end_layout - -\begin_layout Code -** System header files. -\end_layout - -\begin_layout Code -*/ -\end_layout - -\begin_layout Code -#include /* errno declaration and error codes. - */ -\end_layout - -\begin_layout Code -#include /* if_nametoindex(3). - */ -\end_layout - -\begin_layout Code -#include /* getaddrinfo(3) and associated definitions. - */ -\end_layout - -\begin_layout Code -#include /* sockaddr_in and sockaddr_in6 definitions. - */ -\end_layout - -\begin_layout Code -#include /* printf(3) et al. - */ -\end_layout - -\begin_layout Code -#include /* exit(2). - */ -\end_layout - -\begin_layout Code -#include /* String manipulation and memory functions. - */ -\end_layout - -\begin_layout Code -#include /* Socket functions (socket(2), connect(2), etc). - */ -\end_layout - -\begin_layout Code -#include /* getopt(3), read(2), etc. - */ -\end_layout - -\begin_layout Code -/* -\end_layout - -\begin_layout Code -** Constants & macros. -\end_layout - -\begin_layout Code -*/ -\end_layout - -\begin_layout Code -#define DFLT_HOST "localhost" /* Default server name. - */ -\end_layout - -\begin_layout Code -#define DFLT_SCOPE_ID "eth0" /* Default scope identifier. - */ -\end_layout - -\begin_layout Code -#define DFLT_SERVICE "daytime" /* Default service name. - */ -\end_layout - -\begin_layout Code -#define INVALID_DESC -1 /* Invalid file (socket) descriptor. - */ -\end_layout - -\begin_layout Code -#define MAXBFRSIZE 256 /* Max bfr sz to read remote TOD. - */ -\end_layout - -\begin_layout Code -#define VALIDOPTS "s:v" /* Valid command options. - */ -\end_layout - -\begin_layout Code -/* -\end_layout - -\begin_layout Code -** Type definitions (for convenience). -\end_layout - -\begin_layout Code -*/ -\end_layout - -\begin_layout Code -typedef enum { false = 0, true } boolean; -\end_layout - -\begin_layout Code -typedef struct sockaddr_in sockaddr_in_t; -\end_layout - -\begin_layout Code -typedef struct sockaddr_in6 sockaddr_in6_t; -\end_layout - -\begin_layout Code -/* -\end_layout - -\begin_layout Code -** Prototypes for internal helper functions. -\end_layout - -\begin_layout Code -*/ -\end_layout - -\begin_layout Code -static int openSckt( const char *host, -\end_layout - -\begin_layout Code - const char *service, -\end_layout - -\begin_layout Code - unsigned int scopeId ); -\end_layout - -\begin_layout Code -static void tod( int sckt ); -\end_layout - -\begin_layout Code -/* -\end_layout - -\begin_layout Code -** Global (within this file only) data objects. -\end_layout - -\begin_layout Code -*/ -\end_layout - -\begin_layout Code -static const char *pgmName; /* Program name (w/o directory). - */ -\end_layout - -\begin_layout Code -static boolean verbose = false; /* Verbose mode. - */ -\end_layout - -\begin_layout Code -/* -\end_layout - -\begin_layout Code -** Usage macro. -\end_layout - -\begin_layout Code -*/ -\end_layout - -\begin_layout Code -#define USAGE - -\backslash - -\end_layout - -\begin_layout Code - { - -\backslash - -\end_layout - -\begin_layout Code - fprintf( stderr, - -\backslash - -\end_layout - -\begin_layout Code - "Usage: %s [-v] [-s scope_id] [host [service]] -\backslash -n", -\backslash - -\end_layout - -\begin_layout Code - pgmName ); - -\backslash - -\end_layout - -\begin_layout Code - exit( 127 ); - -\backslash - -\end_layout - -\begin_layout Code - } /* End USAGE macro. - */ -\end_layout - -\begin_layout Code -/* -\end_layout - -\begin_layout Code -** This "macro" (even though it's really a function) is loosely based on - the -\end_layout - -\begin_layout Code -** CHK() macro by Dr. - V. - Vinge (see server code). - The status parameter is -\end_layout - -\begin_layout Code -** a boolean expression indicating the return code from one of the usual - system -\end_layout - -\begin_layout Code -** calls that returns -1 on error. - If a system call error occurred, an alert -\end_layout - -\begin_layout Code -** is written to stderr. - It returns a boolean value indicating success/failure -\end_layout - -\begin_layout Code -** of the system call. -\end_layout - -\begin_layout Code -** -\end_layout - -\begin_layout Code -** Example: if ( !SYSCALL( "write", -\end_layout - -\begin_layout Code -** count = write( fd, bfr, size ) ) ) -\end_layout - -\begin_layout Code -** { -\end_layout - -\begin_layout Code -** // Error processing... - but SYSCALL() will have already taken -\end_layout - -\begin_layout Code -** // care of dumping an error alert to stderr. -\end_layout - -\begin_layout Code -** } -\end_layout - -\begin_layout Code -*/ -\end_layout - -\begin_layout Code -static __inline boolean SYSCALL( const char *syscallName, -\end_layout - -\begin_layout Code - int lineNbr, -\end_layout - -\begin_layout Code - int status ) -\end_layout - -\begin_layout Code -{ -\end_layout - -\begin_layout Code - if ( ( status == -1 ) && verbose ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - fprintf( stderr, -\end_layout - -\begin_layout Code - "%s (line %d): System call failed ('%s') - %s. -\backslash -n", -\end_layout - -\begin_layout Code - pgmName, -\end_layout - -\begin_layout Code - lineNbr, -\end_layout - -\begin_layout Code - syscallName, -\end_layout - -\begin_layout Code - strerror( errno ) ); -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - return status != -1; /* True if the system call was successful. - */ -\end_layout - -\begin_layout Code -} /* End SYSCALL() */ -\end_layout - -\begin_layout Code -/****************************************************************************** -\end_layout - -\begin_layout Code -* Function: main -\end_layout - -\begin_layout Code -* -\end_layout - -\begin_layout Code -* Description: -\end_layout - -\begin_layout Code -* Connect to a remote time-of-day service and write the remote host's - TOD to -\end_layout - -\begin_layout Code -* stdout. -\end_layout - -\begin_layout Code -* -\end_layout - -\begin_layout Code -* Parameters: -\end_layout - -\begin_layout Code -* The usual argc & argv parameters to a main() program. -\end_layout - -\begin_layout Code -* -\end_layout - -\begin_layout Code -* Return Value: -\end_layout - -\begin_layout Code -* This function always returns zero. -\end_layout - -\begin_layout Code -******************************************************************************/ -\end_layout - -\begin_layout Code -int main( int argc, -\end_layout - -\begin_layout Code - char *argv[ ] ) -\end_layout - -\begin_layout Code -{ -\end_layout - -\begin_layout Code - const char *host = DFLT_HOST; -\end_layout - -\begin_layout Code - int opt; -\end_layout - -\begin_layout Code - int sckt; -\end_layout - -\begin_layout Code - unsigned int scopeId = if_nametoindex( DFLT_SCOPE_ID ); -\end_layout - -\begin_layout Code - const char *service = DFLT_SERVICE; -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Determine the program name (w/o directory prefix). -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - pgmName = (const char*) strrchr( argv[ 0 ], '/' ); -\end_layout - -\begin_layout Code - pgmName = pgmName == NULL ? argv[ 0 ] : pgmName+1; -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Process command line options. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - opterr = 0; /* Turns off "invalid option" error messages. - */ -\end_layout - -\begin_layout Code - while ( ( opt = getopt( argc, argv, VALIDOPTS ) ) != -1 ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - switch ( opt ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - case 's': /* Scope identifier (IPv6 kluge). - */ -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - scopeId = if_nametoindex( optarg ); -\end_layout - -\begin_layout Code - if ( scopeId == 0 ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - fprintf( stderr, -\end_layout - -\begin_layout Code - "%s: Unknown network interface (%s). -\backslash -n", -\end_layout - -\begin_layout Code - pgmName, -\end_layout - -\begin_layout Code - optarg ); -\end_layout - -\begin_layout Code - USAGE; -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - break; -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - case 'v': /* Verbose mode. - */ -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - verbose = true; -\end_layout - -\begin_layout Code - break; -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - default: -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - USAGE; -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - } /* End SWITCH on command option. - */ -\end_layout - -\begin_layout Code - } /* End WHILE processing command options. - */ -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Process command arguments. - At the end of the above loop, optind is the -\end_layout - -\begin_layout Code - ** index of the first NON-option argv element. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - switch ( argc - optind ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - case 2: /* Both host & service are specified on the command line. - */ -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - service = argv[ optind + 1 ]; -\end_layout - -\begin_layout Code - /***** Fall through *****/ -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - case 1: /* Host is specified on the command line. - */ -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - host = argv[ optind ]; -\end_layout - -\begin_layout Code - /***** Fall through *****/ -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - case 0: /* Use default host & service. - */ -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - break; -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - default: -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - USAGE; -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - } /* End SWITCH on number of command arguments. - */ -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Open a connection to the indicated host/service. -\end_layout - -\begin_layout Code - ** -\end_layout - -\begin_layout Code - ** Note that if all three of the following conditions are met, then the -\end_layout - -\begin_layout Code - ** scope identifier remains unresolved at this point. -\end_layout - -\begin_layout Code - ** 1) The default network interface is unknown for some reason. -\end_layout - -\begin_layout Code - ** 2) The -s option was not used on the command line. -\end_layout - -\begin_layout Code - ** 3) An IPv6 "scoped address" was not specified for the hostname - on the -\end_layout - -\begin_layout Code - ** command line. -\end_layout - -\begin_layout Code - ** If the above three conditions are met, then only an IPv4 socket can - be -\end_layout - -\begin_layout Code - ** opened (connect(2) fails without the scope ID properly set for IPv6 -\end_layout - -\begin_layout Code - ** sockets). -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - if ( ( sckt = openSckt( host, -\end_layout - -\begin_layout Code - service, -\end_layout - -\begin_layout Code - scopeId ) ) == INVALID_DESC ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - fprintf( stderr, -\end_layout - -\begin_layout Code - "%s: Sorry... - a connection could not be established. -\backslash -n", -\end_layout - -\begin_layout Code - pgmName ); -\end_layout - -\begin_layout Code - exit( 1 ); -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Get the remote time-of-day. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - tod( sckt ); -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Close the connection and terminate. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - (void) SYSCALL( "close", -\end_layout - -\begin_layout Code - __LINE__, -\end_layout - -\begin_layout Code - close( sckt ) ); -\end_layout - -\begin_layout Code - return 0; -\end_layout - -\begin_layout Code -} /* End main() */ -\end_layout - -\begin_layout Code -/****************************************************************************** -\end_layout - -\begin_layout Code -* Function: openSckt -\end_layout - -\begin_layout Code -* -\end_layout - -\begin_layout Code -* Description: -\end_layout - -\begin_layout Code -* Sets up a TCP connection to a remote server. - Getaddrinfo(3) is used to -\end_layout - -\begin_layout Code -* perform lookup functions and can return multiple address records (i.e. - a -\end_layout - -\begin_layout Code -* list of 'struct addrinfo' records). - This function traverses the list and -\end_layout - -\begin_layout Code -* tries to establish a connection to the remote server. - The function ends -\end_layout - -\begin_layout Code -* when either a connection has been established or all records in the - list -\end_layout - -\begin_layout Code -* have been processed. -\end_layout - -\begin_layout Code -* -\end_layout - -\begin_layout Code -* Parameters: -\end_layout - -\begin_layout Code -* host - A pointer to a character string representing the hostname - or IP -\end_layout - -\begin_layout Code -* address (IPv4 or IPv6) of the remote server. -\end_layout - -\begin_layout Code -* service - A pointer to a character string representing the service - name or -\end_layout - -\begin_layout Code -* well-known port number. -\end_layout - -\begin_layout Code -* scopeId - For IPv6 sockets only. - This is the index corresponding to the -\end_layout - -\begin_layout Code -* network interface on which to set up the connection. - This -\end_layout - -\begin_layout Code -* parameter is ignored for IPv4 sockets or when an IPv6 "scoped -\end_layout - -\begin_layout Code -* address" is specified in 'host' (i.e. - where the colon-hex -\end_layout - -\begin_layout Code -* network address is augmented with the scope ID). -\end_layout - -\begin_layout Code -* -\end_layout - -\begin_layout Code -* Return Value: -\end_layout - -\begin_layout Code -* Returns the socket descriptor for the connection, or INVALID_DESC if - all -\end_layout - -\begin_layout Code -* address records have been processed and a connection could not be -\end_layout - -\begin_layout Code -* established. -\end_layout - -\begin_layout Code -******************************************************************************/ -\end_layout - -\begin_layout Code -static int openSckt( const char *host, -\end_layout - -\begin_layout Code - const char *service, -\end_layout - -\begin_layout Code - unsigned int scopeId ) -\end_layout - -\begin_layout Code -{ -\end_layout - -\begin_layout Code - struct addrinfo *ai; -\end_layout - -\begin_layout Code - int aiErr; -\end_layout - -\begin_layout Code - struct addrinfo *aiHead; -\end_layout - -\begin_layout Code - struct addrinfo hints; -\end_layout - -\begin_layout Code - sockaddr_in6_t *pSadrIn6; -\end_layout - -\begin_layout Code - int sckt; -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Initialize the 'hints' structure for getaddrinfo(3). -\end_layout - -\begin_layout Code - ** -\end_layout - -\begin_layout Code - ** Notice that the 'ai_family' field is set to PF_UNSPEC, indicating - to -\end_layout - -\begin_layout Code - ** return both IPv4 and IPv6 address records for the host/service. - Most of -\end_layout - -\begin_layout Code - ** the time, the user isn't going to care whether an IPv4 connection - or an -\end_layout - -\begin_layout Code - ** IPv6 connection is established; the user simply wants to exchange - data -\end_layout - -\begin_layout Code - ** with the remote host and doesn't care how it's done. - Sometimes, however, -\end_layout - -\begin_layout Code - ** the user might want to explicitly specify the type of underlying socket. -\end_layout - -\begin_layout Code - ** It is left as an exercise for the motivated reader to add a command - line -\end_layout - -\begin_layout Code - ** option allowing the user to specify the IP protocol, and then process - the -\end_layout - -\begin_layout Code - ** list of addresses accordingly (it's not that difficult). -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - memset( &hints, 0, sizeof( hints ) ); -\end_layout - -\begin_layout Code - hints.ai_family = PF_UNSPEC; /* IPv4 or IPv6 records (don't care). - */ -\end_layout - -\begin_layout Code - hints.ai_socktype = SOCK_STREAM; /* Connection-oriented byte stream. - */ -\end_layout - -\begin_layout Code - hints.ai_protocol = IPPROTO_TCP; /* TCP transport layer protocol only. - */ -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Look up the host/service information. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - if ( ( aiErr = getaddrinfo( host, -\end_layout - -\begin_layout Code - service, -\end_layout - -\begin_layout Code - &hints, -\end_layout - -\begin_layout Code - &aiHead ) ) != 0 ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - fprintf( stderr, -\end_layout - -\begin_layout Code - "%s (line %d): ERROR - %s. -\backslash -n", -\end_layout - -\begin_layout Code - pgmName, -\end_layout - -\begin_layout Code - __LINE__, -\end_layout - -\begin_layout Code - gai_strerror( aiErr ) ); -\end_layout - -\begin_layout Code - return INVALID_DESC; -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Go through the list and try to open a connection. - Continue until either -\end_layout - -\begin_layout Code - ** a connection is established or the entire list is exhausted. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - for ( ai = aiHead, sckt = INVALID_DESC; -\end_layout - -\begin_layout Code - ( ai != NULL ) && ( sckt == INVALID_DESC ); -\end_layout - -\begin_layout Code - ai = ai->ai_next ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** IPv6 kluge. - Make sure the scope ID is set. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - if ( ai->ai_family == PF_INET6 ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - pSadrIn6 = (sockaddr_in6_t*) ai->ai_addr; -\end_layout - -\begin_layout Code - if ( pSadrIn6->sin6_scope_id == 0 ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - pSadrIn6->sin6_scope_id = scopeId; -\end_layout - -\begin_layout Code - } /* End IF the scope ID wasn't set. - */ -\end_layout - -\begin_layout Code - } /* End IPv6 kluge. - */ -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Display the address info for the remote host. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - if ( verbose ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Temporary character string buffers for host & service. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - char hostBfr[ NI_MAXHOST ]; -\end_layout - -\begin_layout Code - char servBfr[ NI_MAXSERV ]; -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Display the address information just fetched. - Start with the -\end_layout - -\begin_layout Code - ** common (protocol-independent) stuff first. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - fprintf( stderr, -\end_layout - -\begin_layout Code - "Address info: -\backslash -n" -\end_layout - -\begin_layout Code - " ai_flags = 0x%02X -\backslash -n" -\end_layout - -\begin_layout Code - " ai_family = %d (PF_INET = %d, PF_INET6 = %d) -\backslash -n" -\end_layout - -\begin_layout Code - " ai_socktype = %d (SOCK_STREAM = %d, SOCK_DGRAM = - %d) -\backslash -n" -\end_layout - -\begin_layout Code - " ai_protocol = %d (IPPROTO_TCP = %d, IPPROTO_UDP = - %d) -\backslash -n" -\end_layout - -\begin_layout Code - " ai_addrlen = %d (sockaddr_in = %d, " -\end_layout - -\begin_layout Code - "sockaddr_in6 = %d) -\backslash -n", -\end_layout - -\begin_layout Code - ai->ai_flags, -\end_layout - -\begin_layout Code - ai->ai_family, -\end_layout - -\begin_layout Code - PF_INET, -\end_layout - -\begin_layout Code - PF_INET6, -\end_layout - -\begin_layout Code - ai->ai_socktype, -\end_layout - -\begin_layout Code - SOCK_STREAM, -\end_layout - -\begin_layout Code - SOCK_DGRAM, -\end_layout - -\begin_layout Code - ai->ai_protocol, -\end_layout - -\begin_layout Code - IPPROTO_TCP, -\end_layout - -\begin_layout Code - IPPROTO_UDP, -\end_layout - -\begin_layout Code - ai->ai_addrlen, -\end_layout - -\begin_layout Code - sizeof( struct sockaddr_in ), -\end_layout - -\begin_layout Code - sizeof( struct sockaddr_in6 ) ); -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Display the protocol-specific formatted address. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - getnameinfo( ai->ai_addr, -\end_layout - -\begin_layout Code - ai->ai_addrlen, -\end_layout - -\begin_layout Code - hostBfr, -\end_layout - -\begin_layout Code - sizeof( hostBfr ), -\end_layout - -\begin_layout Code - servBfr, -\end_layout - -\begin_layout Code - sizeof( servBfr ), -\end_layout - -\begin_layout Code - NI_NUMERICHOST | NI_NUMERICSERV ); -\end_layout - -\begin_layout Code - switch ( ai->ai_family ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - case PF_INET: /* IPv4 address record. - */ -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - sockaddr_in_t *pSadrIn = (sockaddr_in_t*) ai->ai_addr; -\end_layout - -\begin_layout Code - fprintf( stderr, -\end_layout - -\begin_layout Code - " ai_addr = sin_family: %d (AF_INET = %d, - " -\end_layout - -\begin_layout Code - "AF_INET6 = %d) -\backslash -n" -\end_layout - -\begin_layout Code - " sin_addr: %s -\backslash -n" -\end_layout - -\begin_layout Code - " sin_port: %s -\backslash -n", -\end_layout - -\begin_layout Code - pSadrIn->sin_family, -\end_layout - -\begin_layout Code - AF_INET, -\end_layout - -\begin_layout Code - AF_INET6, -\end_layout - -\begin_layout Code - hostBfr, -\end_layout - -\begin_layout Code - servBfr ); -\end_layout - -\begin_layout Code - break; -\end_layout - -\begin_layout Code - } /* End CASE of IPv4 record. - */ -\end_layout - -\begin_layout Code - case PF_INET6: /* IPv6 address record. - */ -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - pSadrIn6 = (sockaddr_in6_t*) ai->ai_addr; -\end_layout - -\begin_layout Code - fprintf( stderr, -\end_layout - -\begin_layout Code - " ai_addr = sin6_family: %d (AF_INET = - %d, " -\end_layout - -\begin_layout Code - "AF_INET6 = %d) -\backslash -n" -\end_layout - -\begin_layout Code - " sin6_addr: %s -\backslash -n" -\end_layout - -\begin_layout Code - " sin6_port: %s -\backslash -n" -\end_layout - -\begin_layout Code - " sin6_flowinfo: %d -\backslash -n" -\end_layout - -\begin_layout Code - " sin6_scope_id: %d -\backslash -n", -\end_layout - -\begin_layout Code - pSadrIn6->sin6_family, -\end_layout - -\begin_layout Code - AF_INET, -\end_layout - -\begin_layout Code - AF_INET6, -\end_layout - -\begin_layout Code - hostBfr, -\end_layout - -\begin_layout Code - servBfr, -\end_layout - -\begin_layout Code - pSadrIn6->sin6_flowinfo, -\end_layout - -\begin_layout Code - pSadrIn6->sin6_scope_id ); -\end_layout - -\begin_layout Code - break; -\end_layout - -\begin_layout Code - } /* End CASE of IPv6 record. - */ -\end_layout - -\begin_layout Code - default: /* Can never get here, but just for completeness. - */ -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - fprintf( stderr, -\end_layout - -\begin_layout Code - "%s (line %d): ERROR - Unknown protocol family (%d). -\backslash -n", -\end_layout - -\begin_layout Code - pgmName, -\end_layout - -\begin_layout Code - __LINE__, -\end_layout - -\begin_layout Code - ai->ai_family ); -\end_layout - -\begin_layout Code - break; -\end_layout - -\begin_layout Code - } /* End DEFAULT case (unknown protocol family). - */ -\end_layout - -\begin_layout Code - } /* End SWITCH on protocol family. - */ -\end_layout - -\begin_layout Code - } /* End IF verbose mode. - */ -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Create a socket. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - if ( !SYSCALL( "socket", -\end_layout - -\begin_layout Code - __LINE__, -\end_layout - -\begin_layout Code - sckt = socket( ai->ai_family, -\end_layout - -\begin_layout Code - ai->ai_socktype, -\end_layout - -\begin_layout Code - ai->ai_protocol ) ) ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - sckt = INVALID_DESC; -\end_layout - -\begin_layout Code - continue; /* Try the next address record in the list. - */ -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Connect to the remote host. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - if ( !SYSCALL( "connect", -\end_layout - -\begin_layout Code - __LINE__, -\end_layout - -\begin_layout Code - connect( sckt, -\end_layout - -\begin_layout Code - ai->ai_addr, -\end_layout - -\begin_layout Code - ai->ai_addrlen ) ) ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - (void) close( sckt ); /* Could use SYSCALL() again here, but - why? */ -\end_layout - -\begin_layout Code - sckt = INVALID_DESC; -\end_layout - -\begin_layout Code - continue; /* Try the next address record in the list. - */ -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - } /* End FOR each address record returned by getaddrinfo(3). - */ -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Clean up & return. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - freeaddrinfo( aiHead ); -\end_layout - -\begin_layout Code - return sckt; -\end_layout - -\begin_layout Code -} /* End openSckt() */ -\end_layout - -\begin_layout Code -/****************************************************************************** -\end_layout - -\begin_layout Code -* Function: tod -\end_layout - -\begin_layout Code -* -\end_layout - -\begin_layout Code -* Description: -\end_layout - -\begin_layout Code -* Receive the time-of-day from the remote server and write it to stdout. -\end_layout - -\begin_layout Code -* -\end_layout - -\begin_layout Code -* Parameters: -\end_layout - -\begin_layout Code -* sckt - The socket descriptor for the connection. -\end_layout - -\begin_layout Code -* -\end_layout - -\begin_layout Code -* Return Value: None. -\end_layout - -\begin_layout Code -******************************************************************************/ -\end_layout - -\begin_layout Code -static void tod( int sckt ) -\end_layout - -\begin_layout Code -{ -\end_layout - -\begin_layout Code - char bfr[ MAXBFRSIZE+1 ]; -\end_layout - -\begin_layout Code - int inBytes; -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** The client never sends anything, so shut down the write side of the -\end_layout - -\begin_layout Code - ** connection. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - if ( !SYSCALL( "shutdown", -\end_layout - -\begin_layout Code - __LINE__, -\end_layout - -\begin_layout Code - shutdown( sckt, SHUT_WR ) ) ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - return; -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Read the time-of-day from the remote host. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - do -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - if ( !SYSCALL( "read", -\end_layout - -\begin_layout Code - __LINE__, -\end_layout - -\begin_layout Code - inBytes = read( sckt, -\end_layout - -\begin_layout Code - bfr, -\end_layout - -\begin_layout Code - MAXBFRSIZE ) ) ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - return; -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - bfr[ inBytes ] = ' -\backslash -0'; /* Null-terminate the received string. - */ -\end_layout - -\begin_layout Code - fputs( bfr, stdout ); /* Null string if EOF (inBytes == 0). - */ -\end_layout - -\begin_layout Code - } while ( inBytes > 0 ); -\end_layout - -\begin_layout Code - fflush( stdout ); -\end_layout - -\begin_layout Code -} /* End tod() */ -\end_layout - -\begin_layout Subsubsection -'Daytime' UDP Client Code -\end_layout - -\begin_layout Standard -The UDP client code is found in file tod6uc.c (time-of-day IPv6 UDP client). - It is almost an exact duplicate of the TCP client (and in fact was derived - from it), but is included in this HowTo for completeness. - Once built, the UDP client may be started using the following command syntax - (assuming tod6uc is the executable file): -\end_layout - -\begin_layout Code -tod6uc [-v] [-s scope_id] [host [service]] -\end_layout - -\begin_layout Standard -ARGUMENTS: -\end_layout - -\begin_layout Description -host The hostname or IP address (dotted decimal or colon-hex) of the remote - host providing the service. - Default is "localhost". -\end_layout - -\begin_layout Description -service The UDP service (or well-known port number) to which datagrams are - sent. - Default is "daytime". -\end_layout - -\begin_layout Standard -OPTIONS: -\end_layout - -\begin_layout Description --s This option is only meaningful for IPv6 addresses, and is used to set - the scope identifier (i.e. - the network interface on which to exchange datagrams). - Default is "eth0". - If host is a scoped address, this option is ignored. -\end_layout - -\begin_layout Description --v Turn on verbose mode. -\end_layout - -\begin_layout Standard -The UDP client source code contained in tod6uc.c follows: -\end_layout - -\begin_layout Code -/****************************************************************************** -\end_layout - -\begin_layout Code -* File: tod6uc.c -\end_layout - -\begin_layout Code -* Description: Contains source code for an IPv6-capable 'daytime' UDP client. -\end_layout - -\begin_layout Code -* Author: John Wenker, Sr. - Software Engineer -\end_layout - -\begin_layout Code -* Performance Technologies, San Diego, USA -\end_layout - -\begin_layout Code -******************************************************************************/ -\end_layout - -\begin_layout Code -/* -\end_layout - -\begin_layout Code -** System header files. -\end_layout - -\begin_layout Code -*/ -\end_layout - -\begin_layout Code -#include /* errno declaration and error codes. - */ -\end_layout - -\begin_layout Code -#include /* if_nametoindex(3). - */ -\end_layout - -\begin_layout Code -#include /* getaddrinfo(3) and associated definitions. - */ -\end_layout - -\begin_layout Code -#include /* sockaddr_in and sockaddr_in6 definitions. - */ -\end_layout - -\begin_layout Code -#include /* printf(3) et al. - */ -\end_layout - -\begin_layout Code -#include /* exit(2). - */ -\end_layout - -\begin_layout Code -#include /* String manipulation and memory functions. - */ -\end_layout - -\begin_layout Code -#include /* Socket functions (socket(2), connect(2), etc). - */ -\end_layout - -\begin_layout Code -#include /* getopt(3), recvfrom(2), sendto(2), etc. - */ -\end_layout - -\begin_layout Code -/* -\end_layout - -\begin_layout Code -** Constants & macros. -\end_layout - -\begin_layout Code -*/ -\end_layout - -\begin_layout Code -#define DFLT_HOST "localhost" /* Default server name. - */ -\end_layout - -\begin_layout Code -#define DFLT_SCOPE_ID "eth0" /* Default scope identifier. - */ -\end_layout - -\begin_layout Code -#define DFLT_SERVICE "daytime" /* Default service name. - */ -\end_layout - -\begin_layout Code -#define INVALID_DESC -1 /* Invalid file (socket) descriptor. - */ -\end_layout - -\begin_layout Code -#define MAXBFRSIZE 256 /* Max bfr sz to read remote TOD. - */ -\end_layout - -\begin_layout Code -#define VALIDOPTS "s:v" /* Valid command options. - */ -\end_layout - -\begin_layout Code -/* -\end_layout - -\begin_layout Code -** Type definitions (for convenience). -\end_layout - -\begin_layout Code -*/ -\end_layout - -\begin_layout Code -typedef enum { false = 0, true } boolean; -\end_layout - -\begin_layout Code -typedef struct sockaddr_in sockaddr_in_t; -\end_layout - -\begin_layout Code -typedef struct sockaddr_in6 sockaddr_in6_t; -\end_layout - -\begin_layout Code -/* -\end_layout - -\begin_layout Code -** Prototypes for internal helper functions. -\end_layout - -\begin_layout Code -*/ -\end_layout - -\begin_layout Code -static int openSckt( const char *host, -\end_layout - -\begin_layout Code - const char *service, -\end_layout - -\begin_layout Code - unsigned int scopeId ); -\end_layout - -\begin_layout Code -static void tod( int sckt ); -\end_layout - -\begin_layout Code -/* -\end_layout - -\begin_layout Code -** Global (within this file only) data objects. -\end_layout - -\begin_layout Code -*/ -\end_layout - -\begin_layout Code -static const char *pgmName; /* Program name (w/o directory). - */ -\end_layout - -\begin_layout Code -static boolean verbose = false; /* Verbose mode. - */ -\end_layout - -\begin_layout Code -/* -\end_layout - -\begin_layout Code -** Usage macro. -\end_layout - -\begin_layout Code -*/ -\end_layout - -\begin_layout Code -#define USAGE - -\backslash - -\end_layout - -\begin_layout Code - { - -\backslash - -\end_layout - -\begin_layout Code - fprintf( stderr, - -\backslash - -\end_layout - -\begin_layout Code - "Usage: %s [-v] [-s scope_id] [host [service]] -\backslash -n", -\backslash - -\end_layout - -\begin_layout Code - pgmName ); - -\backslash - -\end_layout - -\begin_layout Code - exit( 127 ); - -\backslash - -\end_layout - -\begin_layout Code - } /* End USAGE macro. - */ -\end_layout - -\begin_layout Code -/* -\end_layout - -\begin_layout Code -** This "macro" (even though it's really a function) is loosely based on - the -\end_layout - -\begin_layout Code -** CHK() macro by Dr. - V. - Vinge (see server code). - The status parameter is -\end_layout - -\begin_layout Code -** a boolean expression indicating the return code from one of the usual - system -\end_layout - -\begin_layout Code -** calls that returns -1 on error. - If a system call error occurred, an alert -\end_layout - -\begin_layout Code -** is written to stderr. - It returns a boolean value indicating success/failure -\end_layout - -\begin_layout Code -** of the system call. -\end_layout - -\begin_layout Code -** -\end_layout - -\begin_layout Code -** Example: if ( !SYSCALL( "write", -\end_layout - -\begin_layout Code -** count = write( fd, bfr, size ) ) ) -\end_layout - -\begin_layout Code -** { -\end_layout - -\begin_layout Code -** // Error processing... - but SYSCALL() will have already taken -\end_layout - -\begin_layout Code -** // care of dumping an error alert to stderr. -\end_layout - -\begin_layout Code -** } -\end_layout - -\begin_layout Code -*/ -\end_layout - -\begin_layout Code -static __inline boolean SYSCALL( const char *syscallName, -\end_layout - -\begin_layout Code - int lineNbr, -\end_layout - -\begin_layout Code - int status ) -\end_layout - -\begin_layout Code -{ -\end_layout - -\begin_layout Code - if ( ( status == -1 ) && verbose ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - fprintf( stderr, -\end_layout - -\begin_layout Code - "%s (line %d): System call failed ('%s') - %s. -\backslash -n", -\end_layout - -\begin_layout Code - pgmName, -\end_layout - -\begin_layout Code - lineNbr, -\end_layout - -\begin_layout Code - syscallName, -\end_layout - -\begin_layout Code - strerror( errno ) ); -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - return status != -1; /* True if the system call was successful. - */ -\end_layout - -\begin_layout Code -} /* End SYSCALL() */ -\end_layout - -\begin_layout Code -/****************************************************************************** -\end_layout - -\begin_layout Code -* Function: main -\end_layout - -\begin_layout Code -* -\end_layout - -\begin_layout Code -* Description: -\end_layout - -\begin_layout Code -* Connect to a remote time-of-day service and write the remote host's - TOD to -\end_layout - -\begin_layout Code -* stdout. -\end_layout - -\begin_layout Code -* -\end_layout - -\begin_layout Code -* Parameters: -\end_layout - -\begin_layout Code -* The usual argc & argv parameters to a main() program. -\end_layout - -\begin_layout Code -* -\end_layout - -\begin_layout Code -* Return Value: -\end_layout - -\begin_layout Code -* This function always returns zero. -\end_layout - -\begin_layout Code -******************************************************************************/ -\end_layout - -\begin_layout Code -int main( int argc, -\end_layout - -\begin_layout Code - char *argv[ ] ) -\end_layout - -\begin_layout Code -{ -\end_layout - -\begin_layout Code - const char *host = DFLT_HOST; -\end_layout - -\begin_layout Code - int opt; -\end_layout - -\begin_layout Code - int sckt; -\end_layout - -\begin_layout Code - unsigned int scopeId = if_nametoindex( DFLT_SCOPE_ID ); -\end_layout - -\begin_layout Code - const char *service = DFLT_SERVICE; -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Determine the program name (w/o directory prefix). -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - pgmName = (const char*) strrchr( argv[ 0 ], '/' ); -\end_layout - -\begin_layout Code - pgmName = pgmName == NULL ? argv[ 0 ] : pgmName+1; -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Process command line options. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - opterr = 0; /* Turns off "invalid option" error messages. - */ -\end_layout - -\begin_layout Code - while ( ( opt = getopt( argc, argv, VALIDOPTS ) ) != -1 ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - switch ( opt ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - case 's': /* Scope identifier (IPv6 kluge). - */ -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - scopeId = if_nametoindex( optarg ); -\end_layout - -\begin_layout Code - if ( scopeId == 0 ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - fprintf( stderr, -\end_layout - -\begin_layout Code - "%s: Unknown network interface (%s). -\backslash -n", -\end_layout - -\begin_layout Code - pgmName, -\end_layout - -\begin_layout Code - optarg ); -\end_layout - -\begin_layout Code - USAGE; -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - break; -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - case 'v': /* Verbose mode. - */ -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - verbose = true; -\end_layout - -\begin_layout Code - break; -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - default: -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - USAGE; -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - } /* End SWITCH on command option. - */ -\end_layout - -\begin_layout Code - } /* End WHILE processing command options. - */ -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Process command arguments. - At the end of the above loop, optind is the -\end_layout - -\begin_layout Code - ** index of the first NON-option argv element. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - switch ( argc - optind ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - case 2: /* Both host & service are specified on the command line. - */ -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - service = argv[ optind + 1 ]; -\end_layout - -\begin_layout Code - /***** Fall through *****/ -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - case 1: /* Host is specified on the command line. - */ -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - host = argv[ optind ]; -\end_layout - -\begin_layout Code - /***** Fall through *****/ -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - case 0: /* Use default host & service. - */ -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - break; -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - default: -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - USAGE; -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - } /* End SWITCH on number of command arguments. - */ -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Open a connection to the indicated host/service. -\end_layout - -\begin_layout Code - ** -\end_layout - -\begin_layout Code - ** Note that if all three of the following conditions are met, then the -\end_layout - -\begin_layout Code - ** scope identifier remains unresolved at this point. -\end_layout - -\begin_layout Code - ** 1) The default network interface is unknown for some reason. -\end_layout - -\begin_layout Code - ** 2) The -s option was not used on the command line. -\end_layout - -\begin_layout Code - ** 3) An IPv6 "scoped address" was not specified for the hostname - on the -\end_layout - -\begin_layout Code - ** command line. -\end_layout - -\begin_layout Code - ** If the above three conditions are met, then only an IPv4 socket can - be -\end_layout - -\begin_layout Code - ** opened (connect(2) fails without the scope ID properly set for IPv6 -\end_layout - -\begin_layout Code - ** sockets). -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - if ( ( sckt = openSckt( host, -\end_layout - -\begin_layout Code - service, -\end_layout - -\begin_layout Code - scopeId ) ) == INVALID_DESC ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - fprintf( stderr, -\end_layout - -\begin_layout Code - "%s: Sorry... - a connectionless socket could " -\end_layout - -\begin_layout Code - "not be set up. -\backslash -n", -\end_layout - -\begin_layout Code - pgmName ); -\end_layout - -\begin_layout Code - exit( 1 ); -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Get the remote time-of-day. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - tod( sckt ); -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Close the connection and terminate. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - (void) SYSCALL( "close", -\end_layout - -\begin_layout Code - __LINE__, -\end_layout - -\begin_layout Code - close( sckt ) ); -\end_layout - -\begin_layout Code - return 0; -\end_layout - -\begin_layout Code -} /* End main() */ -\end_layout - -\begin_layout Code -/****************************************************************************** -\end_layout - -\begin_layout Code -* Function: openSckt -\end_layout - -\begin_layout Code -* -\end_layout - -\begin_layout Code -* Description: -\end_layout - -\begin_layout Code -* Sets up a UDP socket to a remote server. - Getaddrinfo(3) is used to -\end_layout - -\begin_layout Code -* perform lookup functions and can return multiple address records (i.e. - a -\end_layout - -\begin_layout Code -* list of 'struct addrinfo' records). - This function traverses the list and -\end_layout - -\begin_layout Code -* tries to establish a connection to the remote server. - The function ends -\end_layout - -\begin_layout Code -* when either a connection has been established or all records in the - list -\end_layout - -\begin_layout Code -* have been processed. -\end_layout - -\begin_layout Code -* -\end_layout - -\begin_layout Code -* Parameters: -\end_layout - -\begin_layout Code -* host - A pointer to a character string representing the hostname - or IP -\end_layout - -\begin_layout Code -* address (IPv4 or IPv6) of the remote server. -\end_layout - -\begin_layout Code -* service - A pointer to a character string representing the service - name or -\end_layout - -\begin_layout Code -* well-known port number. -\end_layout - -\begin_layout Code -* scopeId - For IPv6 sockets only. - This is the index corresponding to the -\end_layout - -\begin_layout Code -* network interface on which to exchange datagrams. - This -\end_layout - -\begin_layout Code -* parameter is ignored for IPv4 sockets or when an IPv6 "scoped -\end_layout - -\begin_layout Code -* address" is specified in 'host' (i.e. - where the colon-hex -\end_layout - -\begin_layout Code -* network address is augmented with the scope ID). -\end_layout - -\begin_layout Code -* -\end_layout - -\begin_layout Code -* Return Value: -\end_layout - -\begin_layout Code -* Returns the socket descriptor for the connection, or INVALID_DESC if - all -\end_layout - -\begin_layout Code -* address records have been processed and a socket could not be initialized. -\end_layout - -\begin_layout Code -******************************************************************************/ -\end_layout - -\begin_layout Code -static int openSckt( const char *host, -\end_layout - -\begin_layout Code - const char *service, -\end_layout - -\begin_layout Code - unsigned int scopeId ) -\end_layout - -\begin_layout Code -{ -\end_layout - -\begin_layout Code - struct addrinfo *ai; -\end_layout - -\begin_layout Code - int aiErr; -\end_layout - -\begin_layout Code - struct addrinfo *aiHead; -\end_layout - -\begin_layout Code - struct addrinfo hints; -\end_layout - -\begin_layout Code - sockaddr_in6_t *pSadrIn6; -\end_layout - -\begin_layout Code - int sckt; -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Initialize the 'hints' structure for getaddrinfo(3). -\end_layout - -\begin_layout Code - ** -\end_layout - -\begin_layout Code - ** Notice that the 'ai_family' field is set to PF_UNSPEC, indicating - to -\end_layout - -\begin_layout Code - ** return both IPv4 and IPv6 address records for the host/service. - Most of -\end_layout - -\begin_layout Code - ** the time, the user isn't going to care whether an IPv4 connection - or an -\end_layout - -\begin_layout Code - ** IPv6 connection is established; the user simply wants to exchange - data -\end_layout - -\begin_layout Code - ** with the remote host and doesn't care how it's done. - Sometimes, however, -\end_layout - -\begin_layout Code - ** the user might want to explicitly specify the type of underlying socket. -\end_layout - -\begin_layout Code - ** It is left as an exercise for the motivated reader to add a command - line -\end_layout - -\begin_layout Code - ** option allowing the user to specify the IP protocol, and then process - the -\end_layout - -\begin_layout Code - ** list of addresses accordingly (it's not that difficult). -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - memset( &hints, 0, sizeof( hints ) ); -\end_layout - -\begin_layout Code - hints.ai_family = PF_UNSPEC; /* IPv4 or IPv6 records (don't care). - */ -\end_layout - -\begin_layout Code - hints.ai_socktype = SOCK_DGRAM; /* Connectionless communication. - */ -\end_layout - -\begin_layout Code - hints.ai_protocol = IPPROTO_UDP; /* UDP transport layer protocol only. - */ -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Look up the host/service information. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - if ( ( aiErr = getaddrinfo( host, -\end_layout - -\begin_layout Code - service, -\end_layout - -\begin_layout Code - &hints, -\end_layout - -\begin_layout Code - &aiHead ) ) != 0 ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - fprintf( stderr, -\end_layout - -\begin_layout Code - "%s (line %d): ERROR - %s. -\backslash -n", -\end_layout - -\begin_layout Code - pgmName, -\end_layout - -\begin_layout Code - __LINE__, -\end_layout - -\begin_layout Code - gai_strerror( aiErr ) ); -\end_layout - -\begin_layout Code - return INVALID_DESC; -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Go through the list and try to open a connection. - Continue until either -\end_layout - -\begin_layout Code - ** a connection is established or the entire list is exhausted. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - for ( ai = aiHead, sckt = INVALID_DESC; -\end_layout - -\begin_layout Code - ( ai != NULL ) && ( sckt == INVALID_DESC ); -\end_layout - -\begin_layout Code - ai = ai->ai_next ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** IPv6 kluge. - Make sure the scope ID is set. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - if ( ai->ai_family == PF_INET6 ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - pSadrIn6 = (sockaddr_in6_t*) ai->ai_addr; -\end_layout - -\begin_layout Code - if ( pSadrIn6->sin6_scope_id == 0 ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - pSadrIn6->sin6_scope_id = scopeId; -\end_layout - -\begin_layout Code - } /* End IF the scope ID wasn't set. - */ -\end_layout - -\begin_layout Code - } /* End IPv6 kluge. - */ -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Display the address info for the remote host. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - if ( verbose ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Temporary character string buffers for host & service. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - char hostBfr[ NI_MAXHOST ]; -\end_layout - -\begin_layout Code - char servBfr[ NI_MAXSERV ]; -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Display the address information just fetched. - Start with the -\end_layout - -\begin_layout Code - ** common (protocol-independent) stuff first. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - fprintf( stderr, -\end_layout - -\begin_layout Code - "Address info: -\backslash -n" -\end_layout - -\begin_layout Code - " ai_flags = 0x%02X -\backslash -n" -\end_layout - -\begin_layout Code - " ai_family = %d (PF_INET = %d, PF_INET6 = %d) -\backslash -n" -\end_layout - -\begin_layout Code - " ai_socktype = %d (SOCK_STREAM = %d, SOCK_DGRAM = - %d) -\backslash -n" -\end_layout - -\begin_layout Code - " ai_protocol = %d (IPPROTO_TCP = %d, IPPROTO_UDP = - %d) -\backslash -n" -\end_layout - -\begin_layout Code - " ai_addrlen = %d (sockaddr_in = %d, " -\end_layout - -\begin_layout Code - "sockaddr_in6 = %d) -\backslash -n", -\end_layout - -\begin_layout Code - ai->ai_flags, -\end_layout - -\begin_layout Code - ai->ai_family, -\end_layout - -\begin_layout Code - PF_INET, -\end_layout - -\begin_layout Code - PF_INET6, -\end_layout - -\begin_layout Code - ai->ai_socktype, -\end_layout - -\begin_layout Code - SOCK_STREAM, -\end_layout - -\begin_layout Code - SOCK_DGRAM, -\end_layout - -\begin_layout Code - ai->ai_protocol, -\end_layout - -\begin_layout Code - IPPROTO_TCP, -\end_layout - -\begin_layout Code - IPPROTO_UDP, -\end_layout - -\begin_layout Code - ai->ai_addrlen, -\end_layout - -\begin_layout Code - sizeof( struct sockaddr_in ), -\end_layout - -\begin_layout Code - sizeof( struct sockaddr_in6 ) ); -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Display the protocol-specific formatted address. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - getnameinfo( ai->ai_addr, -\end_layout - -\begin_layout Code - ai->ai_addrlen, -\end_layout - -\begin_layout Code - hostBfr, -\end_layout - -\begin_layout Code - sizeof( hostBfr ), -\end_layout - -\begin_layout Code - servBfr, -\end_layout - -\begin_layout Code - sizeof( servBfr ), -\end_layout - -\begin_layout Code - NI_NUMERICHOST | NI_NUMERICSERV ); -\end_layout - -\begin_layout Code - switch ( ai->ai_family ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - case PF_INET: /* IPv4 address record. - */ -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - sockaddr_in_t *pSadrIn = (sockaddr_in_t*) ai->ai_addr; -\end_layout - -\begin_layout Code - fprintf( stderr, -\end_layout - -\begin_layout Code - " ai_addr = sin_family: %d (AF_INET = %d, - " -\end_layout - -\begin_layout Code - "AF_INET6 = %d) -\backslash -n" -\end_layout - -\begin_layout Code - " sin_addr: %s -\backslash -n" -\end_layout - -\begin_layout Code - " sin_port: %s -\backslash -n", -\end_layout - -\begin_layout Code - pSadrIn->sin_family, -\end_layout - -\begin_layout Code - AF_INET, -\end_layout - -\begin_layout Code - AF_INET6, -\end_layout - -\begin_layout Code - hostBfr, -\end_layout - -\begin_layout Code - servBfr ); -\end_layout - -\begin_layout Code - break; -\end_layout - -\begin_layout Code - } /* End CASE of IPv4 record. - */ -\end_layout - -\begin_layout Code - case PF_INET6: /* IPv6 address record. - */ -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - pSadrIn6 = (sockaddr_in6_t*) ai->ai_addr; -\end_layout - -\begin_layout Code - fprintf( stderr, -\end_layout - -\begin_layout Code - " ai_addr = sin6_family: %d (AF_INET = - %d, " -\end_layout - -\begin_layout Code - "AF_INET6 = %d) -\backslash -n" -\end_layout - -\begin_layout Code - " sin6_addr: %s -\backslash -n" -\end_layout - -\begin_layout Code - " sin6_port: %s -\backslash -n" -\end_layout - -\begin_layout Code - " sin6_flowinfo: %d -\backslash -n" -\end_layout - -\begin_layout Code - " sin6_scope_id: %d -\backslash -n", -\end_layout - -\begin_layout Code - pSadrIn6->sin6_family, -\end_layout - -\begin_layout Code - AF_INET, -\end_layout - -\begin_layout Code - AF_INET6, -\end_layout - -\begin_layout Code - hostBfr, -\end_layout - -\begin_layout Code - servBfr, -\end_layout - -\begin_layout Code - pSadrIn6->sin6_flowinfo, -\end_layout - -\begin_layout Code - pSadrIn6->sin6_scope_id ); -\end_layout - -\begin_layout Code - break; -\end_layout - -\begin_layout Code - } /* End CASE of IPv6 record. - */ -\end_layout - -\begin_layout Code - default: /* Can never get here, but just for completeness. - */ -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - fprintf( stderr, -\end_layout - -\begin_layout Code - "%s (line %d): ERROR - Unknown protocol family (%d). -\backslash -n", -\end_layout - -\begin_layout Code - pgmName, -\end_layout - -\begin_layout Code - __LINE__, -\end_layout - -\begin_layout Code - ai->ai_family ); -\end_layout - -\begin_layout Code - break; -\end_layout - -\begin_layout Code - } /* End DEFAULT case (unknown protocol family). - */ -\end_layout - -\begin_layout Code - } /* End SWITCH on protocol family. - */ -\end_layout - -\begin_layout Code - } /* End IF verbose mode. - */ -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Create a socket. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - if ( !SYSCALL( "socket", -\end_layout - -\begin_layout Code - __LINE__, -\end_layout - -\begin_layout Code - sckt = socket( ai->ai_family, -\end_layout - -\begin_layout Code - ai->ai_socktype, -\end_layout - -\begin_layout Code - ai->ai_protocol ) ) ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - sckt = INVALID_DESC; -\end_layout - -\begin_layout Code - continue; /* Try the next address record in the list. - */ -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Set the target destination for the remote host on this socket. - That -\end_layout - -\begin_layout Code - ** is, this socket only communicates with the specified host. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - if ( !SYSCALL( "connect", -\end_layout - -\begin_layout Code - __LINE__, -\end_layout - -\begin_layout Code - connect( sckt, -\end_layout - -\begin_layout Code - ai->ai_addr, -\end_layout - -\begin_layout Code - ai->ai_addrlen ) ) ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - (void) close( sckt ); /* Could use SYSCALL() again here, but - why? */ -\end_layout - -\begin_layout Code - sckt = INVALID_DESC; -\end_layout - -\begin_layout Code - continue; /* Try the next address record in the list. - */ -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - } /* End FOR each address record returned by getaddrinfo(3). - */ -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Clean up & return. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - freeaddrinfo( aiHead ); -\end_layout - -\begin_layout Code - return sckt; -\end_layout - -\begin_layout Code -} /* End openSckt() */ -\end_layout - -\begin_layout Code -/****************************************************************************** -\end_layout - -\begin_layout Code -* Function: tod -\end_layout - -\begin_layout Code -* -\end_layout - -\begin_layout Code -* Description: -\end_layout - -\begin_layout Code -* Receive the time-of-day from the remote server and write it to stdout. -\end_layout - -\begin_layout Code -* -\end_layout - -\begin_layout Code -* Parameters: -\end_layout - -\begin_layout Code -* sckt - The socket descriptor for the connection. -\end_layout - -\begin_layout Code -* -\end_layout - -\begin_layout Code -* Return Value: None. -\end_layout - -\begin_layout Code -******************************************************************************/ -\end_layout - -\begin_layout Code -static void tod( int sckt ) -\end_layout - -\begin_layout Code -{ -\end_layout - -\begin_layout Code - char bfr[ MAXBFRSIZE+1 ]; -\end_layout - -\begin_layout Code - int inBytes; -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Send a datagram to the server to wake it up. - The content isn't -\end_layout - -\begin_layout Code - ** important, but something must be sent to let it know we want the TOD. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - if ( !SYSCALL( "write", -\end_layout - -\begin_layout Code - __LINE__, -\end_layout - -\begin_layout Code - write( sckt, "Are you there?", 14 ) ) ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - return; -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - /* -\end_layout - -\begin_layout Code - ** Read the time-of-day from the remote host. -\end_layout - -\begin_layout Code - */ -\end_layout - -\begin_layout Code - if ( !SYSCALL( "read", -\end_layout - -\begin_layout Code - __LINE__, -\end_layout - -\begin_layout Code - inBytes = read( sckt, -\end_layout - -\begin_layout Code - bfr, -\end_layout - -\begin_layout Code - MAXBFRSIZE ) ) ) -\end_layout - -\begin_layout Code - { -\end_layout - -\begin_layout Code - return; -\end_layout - -\begin_layout Code - } -\end_layout - -\begin_layout Code - bfr[ inBytes ] = ' -\backslash -0'; /* Null-terminate the received string. - */ -\end_layout - -\begin_layout Code - fputs( bfr, stdout ); /* Null string if EOF (inBytes == 0). - */ -\end_layout - -\begin_layout Code - fflush( stdout ); -\end_layout - -\begin_layout Code -} /* End tod() */ -\end_layout - -\begin_layout Section -Other programming languages -\end_layout - -\begin_layout Subsection -JAVA -\end_layout - -\begin_layout Standard -Sun Java versions since 1.4 are IPv6 enabled, see e.g. - -\begin_inset CommandInset href -LatexCommand href -name "Inet6Address (1.5/5.0)" -target "http://java.sun.com/j2se/1.5.0/docs/api/java/net/Inet6Address.html" - -\end_inset - - class. - Hints are available in the -\emph on -Networking IPv6 User Guide for JDK/JRE -\emph default - -\begin_inset CommandInset href -LatexCommand href -name "1.4" -target "http://java.sun.com/j2se/1.4.2/docs/guide/net/ipv6_guide/index.html" - -\end_inset - - and -\begin_inset CommandInset href -LatexCommand href -name "1.5 (5.0)" -target "http://java.sun.com/j2se/1.5.0/docs/guide/net/ipv6_guide/index.html" - -\end_inset - -. -\end_layout - -\begin_layout Subsection -Perl -\end_layout - -\begin_layout Standard -As of May 2007 it's not known that the Perl core itself already supports - IPv6. - It can be added by using following modules: -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Socket6" -target "http://search.cpan.org/~umemoto/Socket6/" - -\end_inset - - -\end_layout - -\begin_layout Standard -Anyway, some other modules exist for/with IPv6 support (e.g. - Net::IP), search for -\begin_inset Quotes sld -\end_inset - -IPv6 -\begin_inset Quotes srd -\end_inset - - on -\begin_inset CommandInset href -LatexCommand href -name "http://search.cpan.org/" -target "http://search.cpan.org/" - -\end_inset - -. -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-interoperability" - -\end_inset - -Interoperability -\end_layout - -\begin_layout Standard -The -\begin_inset CommandInset href -LatexCommand href -name "TAHI Project" -target "http://www.tahi.org/" - -\end_inset - - checks the interoperability of different operating systems regarding the - implementation of IPv6 features. - Linux kernel already got the -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Ready Logo Phase 1" -target "http://www.linux-ipv6.org/v6ready/" - -\end_inset - -. - -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-information" - -\end_inset - -Further information and URLs -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "information-books" - -\end_inset - -Paper printed books, articles, online reviews (mixed) -\end_layout - -\begin_layout Subsection -Printed Books (English) -\end_layout - -\begin_layout Subsubsection -Cisco -\end_layout - -\begin_layout Itemize -Cisco Self-Study: Implementing IPv6 Networks (IPV6) by Regis Desmeules. - Cisco Press; ISBN 1587050862; 500 pages; 1st edition (April 11, 2003). -\begin_inset Newline newline -\end_inset - -Note: This item will be published on April 11, 2003. -\end_layout - -\begin_layout Itemize -Configuring IPv6 with Cisco IOS by Sam Brown, Sam Browne, Neal Chen, Robbie - Harrell, Edgar, Jr. - Parenti (Editor), Eric Knipp (Editor), Paul Fong (Editor)362 pages; Syngress - Media Inc; ISBN 1928994849; (July 12, 2002). -\end_layout - -\begin_layout Subsubsection -General -\end_layout - -\begin_layout Itemize - -\lang ngerman -\begin_inset CommandInset href -LatexCommand href -name "IPv6 in Practice: A Unixer's Guide to the Next Generation Internet" -target "http://www.benedikt-stockebrand.de/books_e.html#ipv6-in-practice" - -\end_inset - - von Benedikt Stockebrand, November 2006; ISBN 3-540-24524-3 -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Essentials" -target "http://www.sunny.ch/publications/f_ipv6.htm" - -\end_inset - - by Silvia Hagen, -\lang ngerman -2nd Edition, May 2006; ISBN 0-5961-0058-2 -\lang english - -\begin_inset Newline newline -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name "ToC, Index, Sample Chapter etc." -target "http://www.oreilly.com/catalog/ipv6ess/" - -\end_inset - -; -\begin_inset CommandInset href -LatexCommand href -name "O'Reilly Pressrelease" -target "http://press.oreilly.com/ipv6ess.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -IPv6: The New Internet Protocol. - By Christian Huitema; Published by Prentice-Hall; ISBN 0138505055. - -\begin_inset Newline newline -\end_inset - -Description: This book, written by Christian Huitema - a member of the InternetA -rchitecture Board, gives an excellent description of IPv6, how it differs - from IPv4, and the hows and whys of it's development. - -\begin_inset Newline newline -\end_inset - -Source: -\begin_inset CommandInset href -LatexCommand href -name "http://www.cs.uu.nl/wais/html/na-dir/internet/tcp-ip/resource-list.html" -target "http://www.cs.uu.nl/wais/html/na-dir/internet/tcp-ip/resource-list.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Networks" -target "http://www.epinions.com/book_mu-3402412/display_~full_specs" - -\end_inset - - by Niles, Kitty; (ISBN 0070248079); 550 pages; Date Published 05/01/1998. -\end_layout - -\begin_layout Itemize -Implementing IPV6. - Supporting the Next Generation Internet Protocols by P. - E. - Miller, Mark A. - Miller; Publisher: John Wiley & Sons; ISBN 0764545892; 2nd edition (March - 15, 2000); 402 pages. -\end_layout - -\begin_layout Itemize -Big Book of Ipv6 Addressing Rfcs by Peter H. - Salus (Compiler), Morgan Kaufmann Publishers, April 2000, 450 pages ISBN - 0126167702. - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Understanding IPV6" -target "http://www.epinions.com/book_mu-3922588/display_~full_specs" - -\end_inset - - by Davies, Joseph; ISBN 0735612455; Date Published 05/01/2001; Number of - Pages: 350. -\end_layout - -\begin_layout Itemize -Migrating to IPv6 - IPv6 in Practice by Marc Blanchet Publisher: John Wiley - & Sons; ISBN 0471498920; 1st edition (November 2002); 368 pages. -\end_layout - -\begin_layout Itemize -Ipv6 Network Programming by Jun-ichiro Hagino; ISBN 1555583180 -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Wireless boosting IPv6" -target "http://www.nwfusion.com/news/2000/1023ipv6.html" - -\end_inset - - by Carolyn Duffy Marsan, 10/23/2000. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "O'reilly Network search for keyword IPv6" -target "http://www.oreillynet.com/search/index.ncsp?sp-q=IPv6" - -\end_inset - - results in 29 hits (28. - January 2002) -\end_layout - -\begin_layout Subsection -Articles, eBooks, Online Reviews (mixed) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Getting Connected with 6to4" -target "http://www.onlamp.com/pub/a/onlamp/2001/06/01/ipv6_tutorial.html" - -\end_inset - - by Huber Feyrer, 06/01/2001 -\end_layout - -\begin_layout Itemize -Transient Addressing for Related Processes: Improved Firewalling by Using - IPv6 and Multiple Addresses per Host; written by Peter M. - Gleiz, Steven M. - Bellovin ( -\begin_inset CommandInset href -LatexCommand href -name "PC-PDF-Version" -target "http://www.securiteinfo.com/ebooks/pdf/tarp.pdf" - -\end_inset - -; -\begin_inset CommandInset href -LatexCommand href -name "Palm-PDF-Version" -target "http://www.securiteinfo.com/ebooks/palm/tarp.pdf" - -\end_inset - -; -\begin_inset CommandInset href -LatexCommand href -name "PDB-Version" -target "http://www.securiteinfo.com/ebooks/pdb/tarp.pdb" - -\end_inset - -) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Internetworking IPv6 with Cisco Routers" -target "http://www.ip6.com/index.html" - -\end_inset - - by Silvano Gai, McGrawHill Italia, 1997. - The 13 chapters and appendix A-D are downloadable as PDF-documents. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Migration and Co-existence of IPv4 and IPv6 in Residential Networks" -target "http://www.csc.fi/~psavola/residential.html" - -\end_inset - - by Pekka Savola, CSC/FUNET, 2002 -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "information-sciencepublication" - -\end_inset - -Science Publications (abstracts, bibliographies, online resources) -\end_layout - -\begin_layout Standard -See also: -\begin_inset CommandInset href -LatexCommand href -name "liinwww.ira.uka.de/ipv6" -target "http://liinwww.ira.uka.de/mpsbib?query=ipv6&maxnum=200" - -\end_inset - - or -\begin_inset CommandInset href -LatexCommand href -name "Google / Scholar / IPv6" -target "http://www.google.com/scholar?q=ipv6" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "GEANT IPv6 Workplan" -target "http://www.ipv6.ac.uk/gtpv6/workplan.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Trials on UK Academic Networks: Bermuda Project Aug.2002" -target "http://www.ipv6.ac.uk/bermuda2/" - -\end_inset - -: Participants - Getting connected - Project deliverables - Network topology - - Address assignments - Wireless IPv6 access - IPv6 migration - Project - presentations - Internet 2 - Other IPv6 projects - IPv6 fora and standards - Bermuda 2... -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "http://www.ipv6.ac.uk/" -target "http://www.ipv6.ac.uk/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 at the University of Southampton" -target "http://www.ipv6.ecs.soton.ac.uk/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Microsoft Research IPv6 Implementation (MSRIPv6): -\begin_inset CommandInset href -LatexCommand href -name "MSRIPv6 Configuring 6to4 - Connectivity with MSR IPv6 - Our 6Bone Node... " -target "http://www.research.microsoft.com/msripv6/" - -\end_inset - - -\end_layout - -\begin_layout Subsection -Others -\end_layout - -\begin_layout Standard -See following URL for more: -\begin_inset CommandInset href -LatexCommand href -name "SWITCH IPv6 Pilot / References" -target "http://www.switch.ch/lan/ipv6/references.html" - -\end_inset - - -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "information-conferences" - -\end_inset - -Conferences, Meetings, Summits -\end_layout - -\begin_layout Standard -Something missing? Suggestions are welcome! -\end_layout - -\begin_layout Subsection -2004 -\end_layout - -\begin_layout Itemize -1st Global IPv6 Summit in Sao Paul, Brazil -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "information-onlineinformation" - -\end_inset - -Online information -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "information-joinipv6" - -\end_inset - -Join the IPv6 backbone -\end_layout - -\begin_layout Standard -More to be filled later...suggestions are welcome! -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-globalregistries" - -\end_inset - -Global registries -\end_layout - -\begin_layout Standard -See regional registries. -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-majorregionregistries" - -\end_inset - -Major regional registries -\end_layout - -\begin_layout Itemize -America: -\begin_inset CommandInset href -LatexCommand href -name "ARIN" -target "http://www.arin.net/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "ARIN / registration page" -target "http://www.arin.net/registration/ipv6/index.html" - -\end_inset - -, -\lang ngerman - -\begin_inset CommandInset href -LatexCommand href -name "ARIN / IPv6 guidelines" -target "http://www.arin.net/registration/ipv6/index.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -EMEA: -\begin_inset CommandInset href -LatexCommand href -name "Ripe NCC" -target "http://www.ripe.net/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "Ripe NCC / registration page" -target "http://www.ripe.net/ripencc/mem-services/registration/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "Ripe NCC / IPv6 registration" -target "http://www.ripe.net/ripencc/mem-services/registration/ipv6/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Asia/Pacific: -\begin_inset CommandInset href -LatexCommand href -name "APNIC" -target "http://www.apnic.net/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "APNIC / IPv6 ressource guide" -target "http://www.apnic.net/services/ipv6_guide.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Latin America and Caribbea: -\begin_inset CommandInset href -LatexCommand href -name "LACNIC" -target "http://lacnic.org/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Registration Services" -target "http://lacnic.net/en/bt-IPv6.html" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Allocation Policy" -target "http://lacnic.net/en/chapter-4-en.pdf" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Africa: -\begin_inset CommandInset href -LatexCommand href -name "AfriNIC" -target "http://www.afrinic.org/" - -\end_inset - - -\end_layout - -\begin_layout Standard -Also a list of major (prefix length 32) allocations per local registry is - available here: -\begin_inset CommandInset href -LatexCommand href -name "Ripe NCC / IPv6 allocations" -target "http://www.ripe.net/ripencc/mem-services/registration/ipv6/ipv6allocs.html" - -\end_inset - -. -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-joinipv6-tunnelbrokers" - -\end_inset - -Tunnel brokers -\end_layout - -\begin_layout Standard -Note: A list of available Tunnel broker can be found in the section -\begin_inset CommandInset ref -LatexCommand ref -name "Tunnel broker" -reference "information-Tunnelbroker" - -\end_inset - - below. - -\end_layout - -\begin_layout Itemize -Former IPng. - Tunnelbroker and IPv6 resources, now migrated to the -\begin_inset CommandInset href -LatexCommand href -name "SixXs System" -target "http://www.sixxs.net/main/" - -\end_inset - -. -\end_layout - -\begin_layout Itemize -Eckes' -\begin_inset CommandInset href -LatexCommand href -name "IPv6-with-Linux" -target "http://sites.inka.de/lina/linux/ipv6.html" - -\end_inset - - Page. -\end_layout - -\begin_layout Itemize -tunnelc - a perl based tunnel client script: -\begin_inset Newline newline -\end_inset - -freshmeat.net: -\begin_inset CommandInset href -LatexCommand href -name "Project details for tunnel client" -target "http://freshmeat.net/projects/tunnelc" - -\end_inset - - -\begin_inset Newline newline -\end_inset - -SourceForge: -\begin_inset CommandInset href -LatexCommand href -name "Project Info - tunnelc" -target "http://sourceforge.net/projects/tunnelc" - -\end_inset - - (also -\begin_inset CommandInset href -LatexCommand href -name "here" -target "http://tunnelc.sourceforge.net/" - -\end_inset - -) -\end_layout - -\begin_layout Itemize -Linux Advanced Routing & Traffic Control HOWTO, -\begin_inset CommandInset href -LatexCommand href -name "Chapter 6: IPv6 tunneling with Cisco and/or 6bone" -target "http://howtos.linuxbroker.com/howtoreader.shtml?file=Adv-Routing-HOWTO.html#LARTC.TUNNEL-IPV6.ADDRESSING" - -\end_inset - -. -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-joinipv6-6to4-tunneling" - -\end_inset - -6to4 -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "NSayer's 6to4 information" -target "http://www.kfu.com/~nsayer/6to4/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "RFC 3068 / An Anycast Prefix for 6to4 Relay Routers" -target "http://www.faqs.org/rfcs/rfc3068.html" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-joinipv6-isatap-tunneling" - -\end_inset - -ISATAP -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "ISATAP (Intra-Site Automatic Tunnel Access Protocol) Information" -target "http://www.join.uni-muenster.de/Dokumente/Howtos/Howto_ISATAP.php?lang=en" - -\end_inset - - by -\begin_inset CommandInset href -LatexCommand href -name "JOIN" -target "http://www.join.uni-muenster.de/" - -\end_inset - - -\end_layout - -\begin_layout Subsection -Latest news and URLs to other documents -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Lot of URLs to others documents" -target "http://www.estoile.com/links/ipv6" - -\end_inset - - by Anil Edathara -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "go6 - The IPv6 Portal" -target "http://www.go6.net/" - -\end_inset - -: an IPv6 online portal with a wiki-based IPv6 knowledge center, an IPv6 - discussion forum, an up-to-date collection of IPv6 Events and News, free - IPv6 access and services, IPv6 software applications, and much more -\end_layout - -\begin_layout Subsection -Protocol references -\end_layout - -\begin_layout Subsubsection -IPv6-related Request For Comments (RFCs) -\end_layout - -\begin_layout Standard -Publishing the list of IPv6-related RFCs is beyond the scope of this document, - but given URLs will lead you to such lists: -\end_layout - -\begin_layout Itemize -List sorted by -\begin_inset CommandInset href -LatexCommand href -name "IPng Standardization Status" -target "http://playground.sun.com/pub/ipng/html/specs/standards.html" - -\end_inset - - or -\begin_inset CommandInset href -LatexCommand href -name "IPng Current Specifications" -target "http://playground.sun.com/pub/ipng/html/specs/specifications.html" - -\end_inset - - by Robert Hinden -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Related Specifications" -target "http://www.ipv6.org/specs.html" - -\end_inset - - on IPv6.org -\end_layout - -\begin_layout Subsubsection -Current drafts of working groups -\end_layout - -\begin_layout Standard -Current (also) IPv6-related drafts can be found here: -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IP Version 6 (ipv6)" -target "http://www.ietf.org/ids.by.wg/ipv6.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Next Generation Transition (ngtrans)" -target "http://www.ietf.org/ids.by.wg/ngtrans.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Dynamic Host Configuration (dhc)" -target "http://www.ietf.org/ids.by.wg/dhc.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Domain Name System Extension (dnsext)" -target "http://www.ietf.org/ids.by.wg/dnsext.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Operations (v6ops)" -target "http://www.ietf.org/ids.by.wg/v6ops.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Mobile IP (mobileip)" -target "http://www.ietf.org/ids.by.wg/mobileip.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Get any information about IPv6, from overviews, through RFCs & drafts, to implementations" -target "http://playground.sun.com/pub/ipng/html/ipng-main.html" - -\end_inset - - (including availability of stacks on various platforms & source code for - IPv6 stacks) -\end_layout - -\begin_layout Subsubsection -Others -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "SWITCH IPv6 Pilot / References" -target "http://www.switch.ch/lan/ipv6/references.html" - -\end_inset - -, big list of IPv6 references maintained by Simon Leinen -\end_layout - -\begin_layout Subsection -More information -\end_layout - -\begin_layout Standard - -\lang ngerman -\begin_inset CommandInset href -LatexCommand href -name "DeepSpace6 / more interesting links" -target "http://www.deepspace6.net/sections/links.html" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Linux related -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "DeepSpace6 / (Not only) Linux IPv6 Portal" -target "http://www.deepspace6.net/" - -\end_inset - - - Italy ( -\begin_inset CommandInset href -LatexCommand href -name "Mirror" -target "http://mirrors.bieringer.de/www.deepspace6.net/" - -\end_inset - -) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6-HowTo for Linux by Peter Bieringer" -target "http://www.bieringer.de/linux/IPv6/" - -\end_inset - - - Germany, and his -\begin_inset CommandInset href -LatexCommand href -name "Bieringer / IPv6 - software archive" -target "ftp://ftp.bieringer.de/pub/linux/IPv6/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Linux+IPv6 status by Peter Bieringer" -target "http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status.html" - -\end_inset - - - Germany (going obsolete) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "DeepSpace6 / IPv6 Status Page" -target "http://www.deepspace6.net/docs/ipv6_status_page_apps.html" - -\end_inset - - - Italy ( -\begin_inset CommandInset href -LatexCommand href -name "Mirror" -target "http://mirrors.bieringer.de/www.deepspace6.net/docs/ipv6_status_page_apps.html" - -\end_inset - -) (will superseed upper one) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "USAGI project" -target "http://www.linux-ipv6.org/" - -\end_inset - - - Japan, and their -\begin_inset CommandInset href -LatexCommand href -name "USAGI project - software archive" -target "ftp://ftp.linux-ipv6.org/pub/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Linux Optimized Link State Routing Protocol (OLSR) IPv6 HOWTO" -target "http://www.tldp.org/HOWTO/OLSR-IPv6-HOWTO/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "LinShim6" -target "http://inl.info.ucl.ac.be/LinShim6/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Linux related per distribution -\end_layout - -\begin_layout Description -PLD -\begin_inset CommandInset href -LatexCommand href -name "PLD Linux Distribution" -target "http://www.pld-linux.org/" - -\end_inset - - ( -\begin_inset Quotes sld -\end_inset - -market leader -\begin_inset Quotes srd -\end_inset - - in containing IPv6 enabled packages) -\end_layout - -\begin_layout Description -Red -\begin_inset space ~ -\end_inset - -Hat -\begin_inset CommandInset href -LatexCommand href -name "Red Hat Enterprise Linux" -target "http://www.redhat.com/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name " Pekka Savola's IPv6 packages (Historic)" -target "http://www.netcore.fi/pekkas/linux/ipv6/" - -\end_inset - - -\end_layout - -\begin_layout Description - -\lang ngerman -Fedora -\begin_inset CommandInset href -LatexCommand href -name "Fedora (Project) Linux" -target "https://fedoraproject.org/" - -\end_inset - - -\end_layout - -\begin_layout Description -Debian -\begin_inset CommandInset href -LatexCommand href -name "Debian Linux" -target "http://www.debian.org/" - -\end_inset - -, -\lang ngerman - -\begin_inset CommandInset href -LatexCommand href -name "IPv6 with Debian Linux" -target "http://ipv6.debian.net/" - -\end_inset - - -\end_layout - -\begin_layout Description - -\lang ngerman -SuSE -\begin_inset CommandInset href -LatexCommand href -name "SuSE Linux" -target "https://www.suse.com/" - -\end_inset - - -\end_layout - -\begin_layout Description -Mandriva -\begin_inset CommandInset href -LatexCommand href -name "Mandriva (Historic)" -target "http://wiht.link/mandrivalinux" - -\end_inset - - -\end_layout - -\begin_layout Standard -For more see the -\begin_inset CommandInset href -LatexCommand href -name "IPv6+Linux Status Distributions" -target "http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status-distributions.html" - -\end_inset - - page. -\end_layout - -\begin_layout Subsubsection -General -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6.org" -target "http://www.ipv6.org/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "6bone" -target "http://www.6bone.net/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "WIDE project" -target "http://www.v6.wide.ad.jp/" - -\end_inset - - - Japan -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "SWITCH IPv6 Pilot" -target "http://www.switch.ch/lan/ipv6/" - -\end_inset - - - Switzerland -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Corner of Hubert Feyrer" -target "http://www.feyrer.de/IPv6/" - -\end_inset - - - Germany -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Forum" -target "http://www.ipv6forum.com/" - -\end_inset - - - a world-wide consortium of leading Internet vendors, Research & Education - Networks... -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Playground.sun.com / IPv6 Info Page" -target "http://playground.sun.com/pub/ipng/html/ipng-main.html" - -\end_inset - - - maintained by Robert Hinden, Nokia. - Get any information about IPv6, from overviews, through RFCs & drafts, - to implementations (including availability of stacks on various platforms - & source code for IPv6 stacks). -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "6INIT" -target "http://www.6init.com/" - -\end_inset - - - IPv6 Internet Initiative - an EU Fifth Framework Project under the IST - Programme. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Task Force (European Union)" -target "http://www.ipv6-taskforce.org/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "6init" -target "http://www.6init.org/" - -\end_inset - - - IPv6 INternet IniTiative -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6: The New Version of the Internet Protocol" -target "http://www.usenix.org/publications/library/proceedings/ana97/summaries/deering.html" - -\end_inset - -, by Steve Deering. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6: The Next Generation Internet Protocol" -target "http://www.garykessler.net/library/ipv6_exp.html" - -\end_inset - -, by Gary C. - Kessler. - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6: Next Generation Internet Protocol" -target "http://www.3com.com/nsc/ipv6.html" - -\end_inset - - - 3Com -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "internet || site" -target "http://www.internet2.org/" - -\end_inset - - and -\begin_inset CommandInset href -LatexCommand href -name "internet2 Working Group" -target "http://ipv6.internet2.edu/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -NetworkWorldFusion: Search / Doc Finder: -\begin_inset CommandInset href -LatexCommand href -name "searched for IPv6" -target "http://search.nwfusion.com/query.html?qt=IPv6&qp=&ch=cn&" - -\end_inset - - (102 documents found 22.12.2002) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "The Register" -target "http://www.theregister.co.uk/" - -\end_inset - - (Search for IPv6 will result in 30 documents, 22.12.2002) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "ZDNet Search for IPv6" -target "http://zdnet.search.com/search?cat=279&q=IPv6" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "TechTarget Search for IPv6" -target "http://whatis.techtarget.com/wsearchResults/1,290214,sid9,00.html?query=IPv6" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 & TCP Resources List" -target "http://www.faqs.org/faqs/internet/tcp-ip/resource-list/index.html" - -\end_inset - - -\end_layout - -\begin_layout Standard -Something missing? Suggestions are welcome! -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-marketresearch" - -\end_inset - -Market Research -\end_layout - -\begin_layout Itemize - -\lang ngerman -\begin_inset CommandInset href -LatexCommand href -name "statista - The Statistics Portal" -target "http://www.statista.com/search/internet+america/" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang ngerman -\begin_inset CommandInset href -LatexCommand href -name "Market Research" -target "http://www.marketresearch.com/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-patents" - -\end_inset - -Patents -\end_layout - -\begin_layout Itemize -Delphion Research: -\begin_inset CommandInset href -LatexCommand href -name "Patent Search Page" -target "http://www.delphion.com/research/" - -\end_inset - -. - Basic (free) registration needed. - Examples found 21.12.2002 searching for IPv6: -\begin_inset Newline newline -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name "Communicating method between IPv4 terminal and IPv6 terminal and IPv4-IPv6 converting apparatus" -target "http://www.delphion.com/details?pn=US06118784__" - -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name "Translator for IP networks, network system using the translator, and IP network coupling method therefor" -target "http://www.delphion.com/details?pn=US06038233__" - -\end_inset - - -\end_layout - -\begin_layout Subsection -By countries -\end_layout - -\begin_layout Subsubsection -Europe -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "www.ist-ipv6.org" -target "http://www.ist-ipv6.org/" - -\end_inset - -: IST IPv6 Cluster, European IPv6 Research and Development Projects -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Euro6IX" -target "http://www.euro6ix.org/" - -\end_inset - -: European IPv6 Internet Exchanges Backbone -\end_layout - -\begin_layout Subsubsection -Austria -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6@IKNnet and MIPv6 Research Group" -target "http://www.ikn.tuwien.ac.at/~ipv6/" - -\end_inset - -: TU Vienna, Austria (IPv6: project, publications, diploma / doctor thesis, - Conference Proceedings etc.) -\end_layout - -\begin_layout Subsubsection -Australia -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Carl's Australian IPv6 Pages" -target "http://oversteer.bl.echidna.id.au/IPv6/" - -\end_inset - - (old content) -\end_layout - -\begin_layout Subsubsection -Belgium -\end_layout - -\begin_layout Standard -Suggestions are welcome! -\end_layout - -\begin_layout Subsubsection -Brasil -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 do Brasil" -target "http://www.ipv6dobrasil.com.br/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -China -\end_layout - -\begin_layout Standard -Suggestions are welcome! -\end_layout - -\begin_layout Subsubsection -Czech -\end_layout - -\begin_layout Standard -Suggestions are welcome! -\end_layout - -\begin_layout Subsubsection -Germany -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Xing / IPv6" -target "https://www.xing.com/net/ipv6/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -France -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Renater" -target "http://www.renater.fr/Projets/IPv6/index.htm" - -\end_inset - -: Renater IPv6 Project Page -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 - RSVP - ATM at INRIA" -target "http://www.inria.fr/recherche/equipes/ipv6.fr.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "NetBSD IPv6 Documentation" -target "http://www.netbsd.org/fr/Documentation/network/ipv6/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Italy -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Project6" -target "http://project6.ferrara.linux.it/" - -\end_inset - -: IPv6 networking with Linux -\end_layout - -\begin_layout Subsubsection -Japan -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Yamaha IPv6" -target "http://www.rtpro.yamaha.co.jp/RT/ipv6/" - -\end_inset - - (sorry, all in japanese native ...) -\end_layout - -\begin_layout Subsubsection -Korea -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "ETRI" -target "http://www.krv6.net/" - -\end_inset - -: Electronics and Telecommunications Research Institut -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Forum Korea" -target "http://www.ipv6.or.kr/english/index.new.htm" - -\end_inset - -: Korean IPv6 Deployment Project -\end_layout - -\begin_layout Subsubsection -Mexico -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Mexico" -target "http://www.ipv6.unam.mx/" - -\end_inset - - (spain & english version): IPv6 Project Hompeage of The National Autonomous - University of Mexico (UNAM) -\end_layout - -\begin_layout Subsubsection -Netherland -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "SURFnet" -target "http://www.ipv6.surfnet.nl/" - -\end_inset - -: SURFnet IPv6 Backbone -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "STACK" -target "http://www.stack.nl/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "STACK (IPv6)" -target "http://www.stack.nl/ipv6/" - -\end_inset - -: Students' computer association of the Eindhoven University of Technology, - Netherland -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPng.nl" -target "http://www.ipng.nl/" - -\end_inset - -: collaboration between WiseGuys and Intouch -\end_layout - -\begin_layout Subsubsection -Portugal -\end_layout - -\begin_layout Standard -Suggestions are welcome! -\end_layout - -\begin_layout Subsubsection -Russia -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Forum for Russia" -target "http://www.ipv6.ru/" - -\end_inset - -: Yaroslavl State University Internet Center -\end_layout - -\begin_layout Subsubsection -Switzerland -\end_layout - -\begin_layout Standard -Suggestions are welcome! -\end_layout - -\begin_layout Subsubsection -United Kingdom -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "British Telecom IPv6 Home" -target "http://www.bt.com/ipv6/" - -\end_inset - -: BT's ISP IPv6 Trial, UK's first IPv6 Internet Exchange etc. -\end_layout - -\begin_layout Subsection -By operating systems -\end_layout - -\begin_layout Subsubsection -*BSD -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "KAME project" -target "http://www.kame.net/" - -\end_inset - - (*BSD) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "NetBSD's IPv6 Networking FAQ" -target "http://www.netbsd.org/Documentation/network/ipv6/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "FreeBSD Ports: Ipv6" -target "http://www.freebsd.org/ports/ipv6.html" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Cisco IOS -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Cisco IOS IPv6 Entry Page" -target "http://www.cisco.com/warp/public/732/Tech/ipv6/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 for Cisco IOS Software" -target "http://www.cisco.com/univercd/cc/td/doc/product/software/ios122/122newft/122t/122t2/ipv6/ftipv6c.htm" - -\end_inset - -, File 2 of 3: Aug 2002 -- Table of Contents: IPv6 for Cisco IOS Software; - Configuring Documentation Specifics; Enabling IPv6 Routing and Configuring; - IPv6 Addressing; Enabling IPv6 Processing Globally. -\end_layout - -\begin_layout Itemize -Cisco Internet Networking Handbook, -\begin_inset CommandInset href -LatexCommand href -name "Chapter IPv6" -target "http://www.cisco.com/univercd/cc/td/doc/cisintwk/ito_doc/ipv6.htm" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -HPUX -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "comp.sys.hp.hpux FAQ" -target "http://www.faqs.org/faqs/hp/hpux-faq/index.html" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -IBM -\end_layout - -\begin_layout Itemize -Now that IBM's announced the availability of z/OS V1.4, -\begin_inset CommandInset href -LatexCommand href -name "what's new in this release?" -target "http://search390.techtarget.com/ateQuestionNResponse/0,289625,sid10_cid486367_tax292523,00.html" - -\end_inset - - This question was posed on 15 August 2002 -\end_layout - -\begin_layout Subsubsection -Microsoft -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Microsoft Windows 2000 IPv6" -target "http://www.microsoft.com/windows2000/technologies/communications/ipv6/default.asp" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "MSRIPv6" -target "http://www.research.microsoft.com/msripv6" - -\end_inset - - - Microsoft Research Network - IPv6 Homepage -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Internet Connection Firewall Does Not Block Internet Protocol Version 6 Traffic" -target "http://support.microsoft.com/default.aspx?scid=kb;en-us;306203" - -\end_inset - - (6.11.2001) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Internet Protocol Numbers" -target "http://support.microsoft.com/default.aspx?scid=kb;en-us;289892" - -\end_inset - - (8.10.2002) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Technology Preview Refresh" -target "http://support.microsoft.com/default.aspx?scid=kb;en-us;273826" - -\end_inset - - (16.10.2002) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "HOW TO: Install and Configure IP Version 6 in Windows .NET Enterprise Server" -target "http://support.microsoft.com/default.aspx?scid=kb;en-us;325449" - -\end_inset - - (26.10.2002) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Windows .NET Server 6to4 Router Service Quits When You Advertise a 2002 Address on the Public Interface" -target "http://support.microsoft.com/default.aspx?scid=kb;en-us;329984" - -\end_inset - - (28.10.2002) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "msdn - Microsoft Windows CE .NET - IPv6 commands" -target "http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcetcpip/htm/cmconIPv6exe.asp" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Solaris -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Sun Microsystems Solaris" -target "http://www.sun.com/software/solaris/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Solaris 2 Frequently Asked Questions (FAQ) 1.73" -target "http://www.cs.uu.nl/wais/html/na-dir/Solaris2/FAQ.html" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Sumitoma -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Sumitomo Electric has implemented IPv6 on Suminet 3700 family routers" -target "http://playground.sun.com/pub/ipng/html/ipng-implementations.html#Sumitomo" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -ZebOS -\end_layout - -\begin_layout Itemize -IpInfusion's -\begin_inset CommandInset href -LatexCommand href -name "ZebOS Server Routing Software" -target "http://www.ipinfusion.com/products/server/products_server.html" - -\end_inset - - -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "information-ipv6andsecurity" - -\end_inset - -IPv6 Security -\end_layout - -\begin_layout Itemize -Internet Security Systems: Security Center, -\begin_inset CommandInset href -LatexCommand href -name "X-Force Database Search" -target "http://www.iss.net/security_center/search.php?type=3&type=3&pattern=IPv6" - -\end_inset - - (21.12.2002 - 6 topics found relating to IPv6) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "NIST IPsec Project" -target "http://csrc.nist.gov/ipsec/" - -\end_inset - - ( National Institute of Standards and Technology, NIST) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Information Security" -target "http://www.infosecuritymag.com/index.shtml" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "NewOrder.box.sk (search for IPv6)" -target "http://neworder.box.sk/search.php3?srch=IPv6" - -\end_inset - - (Articles, exploits, files database etc.) -\end_layout - -\begin_layout Subsection -Application lists -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "DeepSpace6 / IPv6 Status Page" -target "http://www.deepspace6.net/docs/ipv6_status_page_apps.html" - -\end_inset - - ( -\begin_inset CommandInset href -LatexCommand href -name "Mirror" -target "http://mirrors.bieringer.de/www.deepspace6.net/docs/ipv6_status_page_apps.html" - -\end_inset - -) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6.org / IPv6 enabled applications" -target "http://www.ipv6.org/v6-apps.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Freshmeat / IPv6 search" -target "http://freshmeat.net/search/?q=IPv6" - -\end_inset - -, currently (14 Dec 2002) 62 projects -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Forum / Web Links" -target "http://www.ipv6forum.com/modules.php?op=modload&name=Web_Links&file=index" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Analyzer tools -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Wireshark" -target "http://www.wireshark.org/" - -\end_inset - - (former known as -\emph on -Ethereal -\emph default -) is a free network protocol analyzer for Unix and Windows -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Radcom RC100-WL" -target "http://www.ip6.com/us/analyzer.htm" - -\end_inset - - - Download Radcom RC100-WL protocol analyzer version 3.20 -\end_layout - -\begin_layout Subsubsection -IPv6 Products -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "6wind" -target "http://www.6wind.com/" - -\end_inset - - - solutions for IPv4/IPv6 Router, QoS, Multicast, Mobility, Security/VPN/Firewa -ll. - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Fefe's patches for IPv6 with djbdns" -target "http://www.fefe.de/dns/" - -\end_inset - -Aug 2002 -- What is djbdns and why does it need IPv6? djbdns is a full blown - DNS server which outperforms BIND in nearly all respects. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "ZebOS Server Routing Suite " -target "http://www.ipinfusion.com/products/server/products_server.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Inframail (Advantage Server Edition)" -target "http://download.cnet.com/Inframail-Advantage-Server-Edition/3000-10248_4-8202652.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "HTTrack Website Copier" -target "http://download.cnet.com/HTTrack-Website-Copier/3000-2377_4-10149393.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "CommView" -target "http://download.cnet.com/CommView/3000-2085_4-10132748.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Posadis" -target "http://download.cnet.com/Posadis/3000-2155_4-10149750.html" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-snmp" - -\end_inset - -SNMP -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "comp.protocpols.snmp SNMP FAQ Part 1 of 2" -target "http://www.cs.uu.nl/wais/html/na-dir/snmp-faq/part1.html" - -\end_inset - - -\end_layout - -\begin_layout Section -IPv6 Infrastructure -\end_layout - -\begin_layout Subsection -Statistics -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 routing table history" -target "http://www.space.net/~gert/RIPE/" - -\end_inset - - created by Gert Döring, -\begin_inset CommandInset href -LatexCommand href -name "Space.Net" -target "http://www.space.net/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Official 6bone Webserver list Statisic" -target "http://6bone.informatik.uni-leipzig.de/ipv6/stats/stats.php3" - -\end_inset - - -\end_layout - -\begin_layout Subsection -Internet Exchanges -\end_layout - -\begin_layout Standard -Another list of IPv6 Internet Exchanges can be found here: -\begin_inset CommandInset href -LatexCommand href -name "IPv6 status of IXPs in Europe" -target "http://www.euro-ix.net/isp/choosing/search/matrix.php" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-ipv6exchanges-estonia" - -\end_inset - -Estonia -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "TIX" -target "http://tix.estpak.ee/" - -\end_inset - - (tallinn interneti exchange with ipv6 support) -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-ipv6exchanges-europe" - -\end_inset - -Europe -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Euro6IX" -target "http://www.euro6ix.net/" - -\end_inset - -, European IPv6 Internet Exchange Backbone -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-ipv6exchanges-france" - -\end_inset - -France -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "French National Internet Exchange IPv6" -target "http://www.fnix6.net/" - -\end_inset - - (since 1.11.2002 active). - -\begin_inset Newline newline -\end_inset - -FNIX6 provides a free and reliable high speed FastEthernet interconnection - between ISP located in TeleCity Paris. -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-ipv6exchanges-germany" - -\end_inset - -Germany -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "INXS" -target "http://www.inxs.de/" - -\end_inset - -: (Cable & Wireless) Munich and Hamburg -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-ipv6exchanges-japan" - -\end_inset - -Japan -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "NSPIXP-6" -target "http://www.wide.ad.jp/nspixp6/" - -\end_inset - -: IPv6-based Internet Exchange in Tokyo -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "JPIX" -target "http://www.jpix.co.jp/" - -\end_inset - -, Tokyo -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-ipv6exchanges-korea" - -\end_inset - -Korea -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "6NGIX" -target "http://www.ngix.ne.kr/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-ipv6exchanges-netherlands" - -\end_inset - -Netherlands -\end_layout - -\begin_layout Itemize - -\lang ngerman -\begin_inset CommandInset href -LatexCommand href -name "AMS-IX" -target "http://www.ams-ix.net/" - -\end_inset - - -\lang english -: Amsterdam Internet Exchange -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-ipv6exchanges-uk" - -\end_inset - -UK -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "UK6X" -target "http://www.uk6x.com/" - -\end_inset - -: London -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "XchangePoint" -target "http://www.xchangepoint.net/" - -\end_inset - -: London -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-ipv6exchanges-usa" - -\end_inset - -USA -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "6TAP" -target "http://www.6tap.net/" - -\end_inset - -: Chicago. - Supports peerings around the globe. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "PAIX" -target "http://www.paix.net/" - -\end_inset - -: Palo Alto -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "information-Tunnelbroker" - -\end_inset - -Tunnel broker -\end_layout - -\begin_layout Standard -See also: -\begin_inset CommandInset href -LatexCommand href -name "http://www.deepspace6.net/docs/tunnelbrokers.html" -target "http://www.deepspace6.net/docs/tunnelbrokers.html" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-belgium" - -\end_inset - -Belgium -\end_layout - -\begin_layout Standard -Something missing? Suggestions are welcome! -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-canada" - -\end_inset - -Canada -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Freenet6" -target "http://www.freenet6.net/" - -\end_inset - - - /48 Delegation, Canada -\begin_inset Newline newline -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name "Getting IPv6 Using Freenet6 on Debian" -target "http://www.linuxjournal.com/article.php?sid=5963&mode=thread&order=0" - -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name "Freenet6 creater" -target "http://www.viagenie.qc.ca/en/index.shtml" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-china" - -\end_inset - -China -\end_layout - -\begin_layout Standard -Something missing? Suggestions are welcome! -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-estonia" - -\end_inset - -Estonia -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Estpak" -target "http://tunnelbroker.ipv6.estpak.ee/?tunnel&PHPSESSID=aa2184190cc2cc6d3a6f6ddd01ae3635" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-germany" - -\end_inset - -Germany -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "6bone Knoten Leipzig" -target "http://6bone.informatik.uni-leipzig.de/" - -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name "Info bez. Hackangriff (2001)" -target "http://www.mail-archive.com/ipv6@uni-muenster.de/msg00056.html" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-italy" - -\end_inset - -Italy -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Comv6" -target "http://www.comv6.com/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Bersafe" -target "http://www.bersafe.it/" - -\end_inset - - (Italian language) -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-japan" - -\end_inset - -Japan -\end_layout - -\begin_layout Standard -Something missing? Suggestions are welcome! -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-malaysia" - -\end_inset - -Malaysia -\end_layout - -\begin_layout Standard -Something missing? Suggestions are welcome! -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-netherlands" - -\end_inset - -Netherlands -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPng Netherland" -target "http://www.ipng.nl/" - -\end_inset - - - Intouch, SurfNet, AMS-IX, UUNet, Cistron, RIPE NCC and AT&T are connected - at the AMS-IX. - It is possible (there are requirements...) to get an static tunnel. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "SURFnet Customers" -target "http://www.ipv6.surfnet.nl/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-norway" - -\end_inset - -Norway -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "UNINETT" -target "http://www.uninett.no/testnett/index.en.html" - -\end_inset - - - Pilot IPv6 Service (for Customers): tunnelbroker & address allocation - -\begin_inset Newline newline -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name "Uninett-Autoupdate-HOWTO" -target "http://www.guruz.de/Uninett-Autoupdate-HOWTO" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-spain" - -\end_inset - -Spain -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Consulintel" -target "http://tb.consulintel.euro6ix.org/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-switzerland" - -\end_inset - -Switzerland -\end_layout - -\begin_layout Standard -Something missing? Suggestions are welcome! -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-uk" - -\end_inset - -UK -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "NTT" -target "http://www.nttv6.net/" - -\end_inset - -, United Kingdom - IPv6 Trial. - IPv4 Tunnel and native IPv6 leased Line connections. - POPs are located in London, UK Dusseldorf, Germany New Jersey, USA (East - Coast) Cupertino, USA (West Coast) Tokyo, Japan -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-usa" - -\end_inset - -USA -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "ESnet" -target "http://www.es.net/hypertext/welcome/pr/ipv6.html" - -\end_inset - -, USA - Energy Sciences Network: Tunnel Registry & Address Delegation for - directly connected ESnet sites and ESnet collaborators. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Hurricane Electric" -target "http://ipv6tb.he.net/" - -\end_inset - -, US backbone; -\begin_inset Newline newline -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name "Hurrican Electric Tunnelbroker" -target "http://tunnelbroker.net/" - -\end_inset - - (also available under -\begin_inset CommandInset href -LatexCommand href -name "http://tunnelbroker.com/" -target "http://tunnelbroker.com/" - -\end_inset - -) -\begin_inset Newline newline -\end_inset - -Press Release: -\begin_inset CommandInset href -LatexCommand href -name "Hurricane Electric Upgrades IPv6 Tunnel Broker" -target "http://www.he.net/releases/release6.html" - -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name "Tunnel Broker Endpoint Autoupdate" -target "http://ipv6.he.net/tunnelbroker-update.php" - -\end_inset - -, Perl Script -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-singapore" - -\end_inset - -Singapore -\end_layout - -\begin_layout Standard -Something missing? Suggestions are welcome! -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-more" - -\end_inset - -More Tunnel brokers... -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Public 6to4 relay routers" -target "http://www.kfu.com/~nsayer/6to4/" - -\end_inset - - (MS IIE boycott!) -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "information-infrastructure-nativeipv6service" - -\end_inset - -Native IPv6 Services -\end_layout - -\begin_layout Standard -Note: These services are mostly only available with a valid IPv6 connection! -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-nativeipv6nntp" - -\end_inset - -Net News (NNTP) -\end_layout - -\begin_layout Standard -Something missing? Suggestions are welcome! -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-nativeipv6gameserver" - -\end_inset - -Game Server -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Quake2" -target "http://www.viagenie.qc.ca/en/ipv6/quake2/ipv6-quake2.shtml" - -\end_inset - - over IPv6 -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-nativeipv6ircserver" - -\end_inset - -IRC Server -\end_layout - -\begin_layout Standard -Something missing? Suggestions are welcome! -\end_layout - -\begin_layout Subsubsection -Radio Stations, Music Streams -\end_layout - -\begin_layout Standard -Something missing? Suggestions are welcome! -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-nativeipv6webserver" - -\end_inset - -Webserver -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Peter Bieringer's Home of Linux IPv6 HOWTO " -target "http://www.ipv6.bieringer.de/" - -\end_inset - - -\end_layout - -\begin_layout Standard -Something missing? Suggestions are welcome! -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "information-maillists" - -\end_inset - -Maillists -\end_layout - -\begin_layout Standard -Lists of maillists are available at: -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "DeepSpace6 / Mailling Lists" -target "http://www.deepspace6.net/sections/lists.html" - -\end_inset - - -\end_layout - -\begin_layout Standard -Major Mailinglists are listed in following table: -\end_layout - -\begin_layout Standard -\begin_inset Tabular - - - - - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Focus -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Request e-mail address -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -What to subscribe -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Maillist e-mail address -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Language -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Access through WWW -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Linux kernel networking including IPv6 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -majordomo (at) vger.kernel.org -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -netdev -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -netdev (at) vger.kernel.org -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -English -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -\begin_inset CommandInset href -LatexCommand href -name "Info" -target "http://vger.kernel.org/vger-lists.html#netdev" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "Archive" -target "http://www.spinics.net/lists/netdev/" - -\end_inset - - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Mobile IP(v6) for Linux -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Web-based, see URL -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -mipl -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -mipl (at) mobile-ipv6.org -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -English -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -\begin_inset CommandInset href -LatexCommand href -name "Info" -target "http://www.mobile-ipv6.org/cgi-bin/mailman/listinfo" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "Archive" -target "http://www.mobile-ipv6.org/pipermail/mipl/" - -\end_inset - - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Linux IPv6 users using USAGI extension -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -usagi-users-ctl (at) linux-ipv6.org -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -usagi-users (at) linux-ipv6.org -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -English -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -\begin_inset CommandInset href -LatexCommand href -name "Info / Search" -target "http://www.linux-ipv6.org/ml/index.html#usagi-users" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "Archive" -target "http://www.linux-ipv6.org/ml/usagi-users/" - -\end_inset - - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -IPv6 on Debian Linux -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -debian-ipv6 (at) lists.debian.org -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -English -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -\begin_inset CommandInset href -LatexCommand href -name "Info/Subscription/Archive" -target "http://lists.debian.org/debian-ipv6/" - -\end_inset - - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -6bone -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -majordomo (at) isi.edu -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -6bone -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -6bone (at) isi.edu -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -English -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -\begin_inset CommandInset href -LatexCommand href -name "Info" -target "http://www.6bone.net/6bone_email.html" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "Archive" -target "http://mailman.isi.edu/pipermail/6bone/" - -\end_inset - - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -IPv6 users in general -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -majordomo (at) ipv6.org -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -users -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -users (at) ipv6.org -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -English -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -\begin_inset CommandInset href -LatexCommand href -name "Info" -target "http://www.ipv6.org/mailing-lists.html" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "Archive" -target "http://www.mail-archive.com/users@ipv6.org/" - -\end_inset - - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Bugtracking of Internet applications (1) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -bugtraq-subscribe (at) securityfocus.com -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -bugtraq (at) securityfocus.com (2) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -English -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -\begin_inset CommandInset href -LatexCommand href -name "Info" -target "http://online.securityfocus.com/popups/forums/bugtraq/intro.shtml" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "Archive" -target "http://online.securityfocus.com/archive/1" - -\end_inset - - -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Standard -(1) very recommended if you provide server applications. -\end_layout - -\begin_layout Standard - -\lang ngerman -(2) list is moderated. -\begin_inset Newline newline -\end_inset - - -\end_layout - -\begin_layout Standard -Something missing? Suggestions are welcome! -\begin_inset Newline newline -\end_inset - - -\end_layout - -\begin_layout Standard -Following other maillinglists & newsgroups are available via web: -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "student-ipv6 (India)" -target "http://groups.yahoo.com/group/student-ipv6" - -\end_inset - - -\begin_inset Newline newline -\end_inset - -Description: This is the group for the Student Awareness group of IPv6 in - India -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "sun-ipv6-users" -target "http://groups.yahoo.com/group/sun-ipv6-users" - -\end_inset - - -\begin_inset Newline newline -\end_inset - -Description: Please report problems/suggestions regarding SUN Microsystems - IPng implementation -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6-BITS" -target "http://groups.yahoo.com/group/IPv6-BITS" - -\end_inset - - -\begin_inset Newline newline -\end_inset - -Description: This List will co-ordinate the working of Project Vertebrae. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "linux-bangalore-ipv6" -target "http://groups.yahoo.com/group/linux-bangalore-ipv6" - -\end_inset - - -\begin_inset Newline newline -\end_inset - -Description: The IPv6 deployment list of the Bangalore Linux User Group -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "packet-switching" -target "http://groups.yahoo.com/group/packet-switching" - -\end_inset - - -\begin_inset Newline newline -\end_inset - -Description: This mailing list provides a forum for discussion of packet - switching theory, technology, implementation and application in any relevant - aspect including without limitation LAPB, X.25, SDLC, P802.1d, LLC, IP, IPv6, - IPX, DECNET, APPLETALK, FR, PPP, IP Telephony, LAN PBX systems, management - protocols like SNMP, e-mail, network transparent window systems, protocol - implementation, protocol verification, conformance testing and tools used - in maintaining or developing packet switching systems. -\end_layout - -\begin_layout Itemize -de.comm.protocols.tcp-ip -\begin_inset Newline newline -\end_inset - -Description: Umstellung auf IPv6 -\begin_inset Newline newline -\end_inset - -Source: -\begin_inset CommandInset href -LatexCommand href -name "Chartas der Newsgruppen in de.*" -target "http://www.faqs.org/faqs/de-newsgroups/chartas/index.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Google Group: -\begin_inset CommandInset href -LatexCommand href -name "comp.protocols.tcp-ip" -target "http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF8&safe=off&group=comp.protocols.tcp-ip" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Google Group: -\begin_inset CommandInset href -LatexCommand href -name "linux.debian.maint.ipv6" -target "http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF8&safe=off&group=linux.debian.maint.ipv6" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Google Group: -\begin_inset CommandInset href -LatexCommand href -name "microsoft.public.platformsdk.networking.ipv6" -target "http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF8&safe=off&group=microsoft.public.platformsdk.networking.ipv6" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Google Group: -\begin_inset CommandInset href -LatexCommand href -name "fa.openbsd.ipv6" -target "http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF8&safe=off&group=fa.openbsd.ipv6" - -\end_inset - - -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "information-onlinetesttools" - -\end_inset - -Online tools -\end_layout - -\begin_layout Subsection -Testing tools -\end_layout - -\begin_layout Itemize -ping, traceroute, tracepath, 6bone registry, DNS: -\begin_inset CommandInset href -LatexCommand href -name "JOIN / Testtools" -target "http://www.join.uni-muenster.de/lab/testtools.html" - -\end_inset - - (German language only, but should be no problem for non German speakers) -\end_layout - -\begin_layout Itemize -traceroute6, whois: -\begin_inset CommandInset href -LatexCommand href -name "IPng.nl" -target "http://www.ipng.nl/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -AAAA Lookup Checker -\begin_inset CommandInset href -LatexCommand href -name "http://www.cnri.dit.ie/cgi-bin/check_aaaa.pl" -target "http://www.cnri.dit.ie/cgi-bin/check_aaaa.pl" - -\end_inset - - -\end_layout - -\begin_layout Subsection -Information retrievement -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "List of worldwide all IPv6-aggregated IP-Blocks" -target "http://www.ripe.net/ripencc/mem-services/registration/ipv6/ipv6allocs.html" - -\end_inset - - -\end_layout - -\begin_layout Subsection -IPv6 Looking Glasses -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "DRENv6 Looking Glass" -target "http://www.v6.dren.net/lg/" - -\end_inset - - -\end_layout - -\begin_layout Subsection -Helper applications -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Prefix Calculator" -target "http://www.tdoi.org/prefcalc.php" - -\end_inset - - by -\begin_inset CommandInset href -LatexCommand href -name "TDOI" -target "http://www.tdoi.org/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "DNS record checker" -target "http://www.maths.tcd.ie/cgi-bin/check_dns.pl" - -\end_inset - - -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "information-trainingsandseminars" - -\end_inset - -Trainings, Seminars -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "CIW Internetworking Professional Training CBT CD" -target "http://www.e-trainonline.com/html/ciw_internetworking_profession.html#IPv6" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang ngerman -\begin_inset CommandInset href -LatexCommand href -name "Training Pages" -target "http://www.trainingpages.com/x/category,kw-1628,.html" - -\end_inset - - -\lang english -, U.K. - - Search for IPv6 (13 Courses, 2006-08-21) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Erion IPv6 Training" -target "http://www.erion.co.uk/ipv6.html" - -\end_inset - -, UK -\end_layout - -\begin_layout Standard -Something missing? Suggestions are welcome! -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "information-onlinediscovery" - -\end_inset - -'The Online Discovery' ... -\end_layout - -\begin_layout Standard -IPv6: Addressing The Needs Of the Future by Yankee Group (Author) -\begin_inset Newline newline -\end_inset - -List Price: $595.00 -\begin_inset Newline newline -\end_inset - -Edition: e-book (Acrobat Reader) -\begin_inset Newline newline -\end_inset - -Pages: 3 (three) -\begin_inset Newline newline -\end_inset - -Publisher: MarketResearch.com; ISBN B00006334Y; (November 1, 2001) -\begin_inset Newline newline -\end_inset - - -\end_layout - -\begin_layout Standard -;-) The number of copies would be interesting... -\begin_inset Newline newline -\end_inset - - -\end_layout - -\begin_layout Chapter -Revision history / Credits / The End -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "revision-history" - -\end_inset - -Revision history -\end_layout - -\begin_layout Standard -Versions x.y are published on the Internet. -\end_layout - -\begin_layout Standard -Versions x.y.z are work-in-progress and published as LyX and SGML file on - CVS. - Because Deep Space 6 mirrors these SGML files and generate independend - from TLDP public versions, this versions will show up there and also on - its mirrors. -\end_layout - -\begin_layout Subsection -Releases 0.x -\end_layout - -\begin_layout Description -0.67wip 2015-08-18/PB: fix some broken URLs, 20151016/bie: remove broken - URL to Spanish transation, 20161215/bie: update some URLs -\end_layout - -\begin_layout Description -0.66 2010-04-20/PB: extend QoS section with examples, 20130513/PB: add IPv6 - NAT hints, 20130521/PB: review dhcpd, 20131019/bie: general review, 20140502/bi -e: add hints for nftables, 20140513/bie: extend section regarding address - resolution and add source/destination address selection information, 20140515/b -ie: add hints for activation of privacy extension -\end_layout - -\begin_layout Description -0.65 2009-12-13/PB: minor fixes -\end_layout - -\begin_layout Description -0.64 2009-06-11/PB: extend DHCP server examples (ISC DHCP, Dibbler) -\end_layout - -\begin_layout Description -0.63 2009-02-14/PB: Fix FSF address, major update on 4in6 tunnels, add new - section for address resolving, add some URLs, remove broken URLs -\end_layout - -\begin_layout Description -0.62 2008-11-09/PB: Adjust URL to Turkish howto, add some HIP related URLs, - remove broken URLs -\end_layout - -\begin_layout Description -0.61.1 2007-11-11/PB: fix broken description of shortcut BIND -\end_layout - -\begin_layout Description -0.61 2007-10-06/PB: fix broken URLs to TLDP-CVS, minor URL update. -\end_layout - -\begin_layout Description -0.60.2 2007-10-03/PB: fix description of sysctl/autoconf (credits to Francois-Xavi -er Le Bail) -\end_layout - -\begin_layout Description -0.60.1 2007-06-16/PB: speling fixes (credits to Larry W. - Burton) -\end_layout - -\begin_layout Description -0.60 2007-05-29/PB: import major contribution to Programming using C-API - written by John Wenker, minor fixes -\end_layout - -\begin_layout Description -0.52 2007-05-23/PB: update firewalling chapter, improve document for proper - SGML validation, minor bugfixes -\end_layout - -\begin_layout Description -0.51 2006-11-08/PB: remove broken URLs, add a new book (credits to Bryan - Vukich) -\end_layout - -\begin_layout Description -0.50.2 2006-10-25/PB: fix typo in dhcp6 section (credits to Michele Ferritto) -\end_layout - -\begin_layout Description -0.50.1 2006-09-23/PB: add some URLs -\end_layout - -\begin_layout Description -0.50 2006-08-24/PB: check RFC URLs, fix URL to Chinese translation, finalize - for publishing -\end_layout - -\begin_layout Description -0.49.5 2006-08-23/PB: fix/remove broken URLs -\end_layout - -\begin_layout Description -0.49.4 2006-08-21/PB: some review, update and enhancement of the content, - replace old 6bone example addresses with the current defined ones. -\end_layout - -\begin_layout Description -0.49.3 2006-08-20/PB: fix bug in maillist entries, 'mobility' is now a separate - chapter -\end_layout - -\begin_layout Description -0.49.2 2006-08-20/PB: update and cleanup of maillist entries -\end_layout - -\begin_layout Description -0.49.1 2006-06-13/PB: major update of mobility section (contributed by Benjamin - Thery) -\end_layout - -\begin_layout Description -0.49 2005-10-03/PB: add configuration hints for DHCPv6, major broken URL - cleanup (credits to Necdet Yucel) -\end_layout - -\begin_layout Description -0.48.1 2005-01-15/PB: minor fixes -\end_layout - -\begin_layout Description -0.48 2005-01-11/PB: grammar check and minor review of IPv6 IPsec section -\end_layout - -\begin_layout Description -0.47.1 2005-01-01/PB: add information and examples about IPv6 IPsec, add some - URLs -\end_layout - -\begin_layout Description -0.47 2004-08-30/PB: add some notes about proftpd, vsftpd and other daemons, - add some URLs, minor fixes, update status of Spanish translation -\end_layout - -\begin_layout Description -0.46.4 2004-07-19/PB: minor fixes -\end_layout - -\begin_layout Description -0.46.3 2004-06-23/PB: add note about started Greek translation, replace Taiwanese - with Chinese for related translation -\end_layout - -\begin_layout Description -0.46.2 2004-05-22/PB: minor fixes -\end_layout - -\begin_layout Description -0.46.1 2004-04-18/PB: minor fixes -\end_layout - -\begin_layout Description -0.46 2004-03-04/PB: announce Italian translation, add information about DHCPv6, - minor updates -\end_layout - -\begin_layout Description -0.45.1 2004-01-12/PB: add note about the official example address space -\end_layout - -\begin_layout Description -0.45 2004-01-11/PB: minor fixes, add/fix some URLs, some extensions -\end_layout - -\begin_layout Description -0.44.2 2003-10-30/PB: fix some copy&paste text bugs -\end_layout - -\begin_layout Description -0.44.1 2003-10-19/PB: add note about start of Italian translation -\end_layout - -\begin_layout Description -0.44 2003-08-15/PB: fix URLs, add hint on tcp_wrappers (about broken notation - in some versions) and Apache2 -\end_layout - -\begin_layout Description -0.43.4 2003-07-26/PB: fix URL, add archive URL for maillist users at ipv6.org, - add some ds6 URLs -\end_layout - -\begin_layout Description -0.43.3 2003-06-19/PB: fix typos -\end_layout - -\begin_layout Description -0.43.2 2003-06-11/PB: fix URL -\end_layout - -\begin_layout Description -0.43.1 2003-06-07/PB: fix some URLs, fix credits, add some notes at IPsec -\end_layout - -\begin_layout Description -0.43 2003-06-05/PB: add some notes about configuration in SuSE Linux, add - URL of French translation -\end_layout - -\begin_layout Description -0.42 2003-05-09/PB: minor fixes, announce French translation -\end_layout - -\begin_layout Description -0.41.4 2003-05-02/PB: Remove a broken URL, update some others. -\end_layout - -\begin_layout Description -0.41.3 2003-04-23/PB: Minor fixes, remove a broken URL, fix URL to Taiwanese - translation -\end_layout - -\begin_layout Description -0.41.2 2003-04-13/PB: Fix some typos, add a note about a French translation - is in progress -\end_layout - -\begin_layout Description -0.41.1 2003-03-31/PB: Remove a broken URL, fix another -\end_layout - -\begin_layout Description -0.41 2003-03-22/PB: Add URL of German translation -\end_layout - -\begin_layout Description -0.40.2 2003-02-27/PB: Fix a misaddressed URL -\end_layout - -\begin_layout Description -0.40.1 2003-02-12/PB: Add Debian-Linux-Configuration, add a minor note on - translations -\end_layout - -\begin_layout Description -0.40 2003-02-10/PB: Announcing available German version -\end_layout - -\begin_layout Description -0.39.2 2003-02-10/GK: Minor syntax and spelling fixes -\end_layout - -\begin_layout Description -0.39.1 2003-01-09/PB: fix an URL (draft adopted to an RFC) -\end_layout - -\begin_layout Description -0.39 2003-01-13/PB: fix a bug (forgotten 'link -\begin_inset Quotes srd -\end_inset - - on -\begin_inset Quotes sld -\end_inset - -ip link set -\begin_inset Quotes srd -\end_inset - - (credits to Yaniv Kaul) -\end_layout - -\begin_layout Description -0.38.1 2003-01-09/PB: a minor fix -\end_layout - -\begin_layout Description -0.38 2003-01-06/PB: minor fixes -\end_layout - -\begin_layout Description -0.37.1 2003-01-05/PB: minor updates -\end_layout - -\begin_layout Description -0.37 2002-12-31/GK: 270 new links added (searched in 1232 SearchEngines) - in existing and 53 new (sub)sections -\end_layout - -\begin_layout Description -0.36.1 2002-12-20/PB: Minor fixes -\end_layout - -\begin_layout Description -0.36 2002-12-16/PB: Check of and fix broken links (credits to Georg Käfer), - some spelling fixes -\end_layout - -\begin_layout Description -0.35 2002-12-11/PB: Some fixes and extensions -\end_layout - -\begin_layout Description -0.34.1 2002-11-25/PB: Some fixes (e.g. - broken linuxdoc URLs) -\end_layout - -\begin_layout Description -0.34 2002-11-19/PB: Add information about German translation (work in progress), - some fixes, create a small shortcut explanation list, extend -\begin_inset Quotes sld -\end_inset - -used terms -\begin_inset Quotes srd -\end_inset - - and add two German books -\end_layout - -\begin_layout Description -0.33 2002-11-18/PB: Fix broken RFC-URLs, add parameter ttl on 6to4 tunnel - setup example -\end_layout - -\begin_layout Description -0.32 2002-11-03/PB: Add information about Taiwanese translation -\end_layout - -\begin_layout Description -0.31.1 2002-10-06/PB: Add another maillist -\end_layout - -\begin_layout Description -0.31 2002-09-29/PB: Extend information in proc-filesystem entries -\end_layout - -\begin_layout Description -0.30 2002-09-27/PB: Add some maillists -\end_layout - -\begin_layout Description -0.29 2002-09-18/PB: Update statement about nmap (triggered by Fyodor) -\end_layout - -\begin_layout Description -0.28.1 2002-09-16/PB: Add note about ping6 to multicast addresses, add some - labels -\end_layout - -\begin_layout Description -0.28 2002-08-17/PB: Fix broken LDP/CVS links, add info about Polish translation, - add URL of the IPv6 Address Oracle -\end_layout - -\begin_layout Description -0.27 2002-08-10/PB: Some minor updates -\end_layout - -\begin_layout Description -0.26.2 2002-07-15/PB: Add information neighbor discovery, split of firewalling - (got some updates) and security into extra chapters -\end_layout - -\begin_layout Description -0.26.1 2002-07-13/PB: Update nmap/IPv6 information -\end_layout - -\begin_layout Description -0.26 2002-07-13/PB: Fill /proc-filesystem chapter, update DNS information - about depricated A6/DNAME, change P-t-P tunnel setup to use of -\begin_inset Quotes sld -\end_inset - -ip -\begin_inset Quotes srd -\end_inset - - only -\end_layout - -\begin_layout Description -0.25.2 2002-07-11/PB: Minor spelling fixes -\end_layout - -\begin_layout Description -0.25.1 2002-06-23/PB: Minor spelling and other fixes -\end_layout - -\begin_layout Description -0.25 2002-05-16/PB: Cosmetic fix for 2^128, thanks to José Abílio Oliveira - Matos for help with LyX -\end_layout - -\begin_layout Description -0.24 2002-05-02/PB: Add entries in URL list, minor spelling fixes -\end_layout - -\begin_layout Description -0.23 2002-03-27/PB: Add entries in URL list and at maillists, add a label - and minor information about IPv6 on RHL -\end_layout - -\begin_layout Description -0.22 2002-03-04/PB: Add info about 6to4 support in kernel series 2.2.x and - add an entry in URL list and at maillists -\end_layout - -\begin_layout Description -0.21 2002-02-26/PB: Migrate next grammar checks submitted by John Ronan -\end_layout - -\begin_layout Description -0.20.4 2002-02-21/PB: Migrate more grammar checks submitted by John Ronan, - add some additional hints at DNS section -\end_layout - -\begin_layout Description -0.20.3 2002-02-12/PB: Migrate a minor grammar check patch submitted by John - Ronan -\end_layout - -\begin_layout Description -0.20.2 2002-02-05/PB: Add mipl to maillist table -\end_layout - -\begin_layout Description -0.20.1 2002-01-31/PB: Add a hint how to generate 6to4 addresses -\end_layout - -\begin_layout Description -0.20 2002-01-30/PB: Add a hint about default route problem, some minor updates -\end_layout - -\begin_layout Description -0.19.2 2002-01-29/PB: Add many new URLs -\end_layout - -\begin_layout Description -0.19.1 2002-01-27/PB: Add some forgotten URLs -\end_layout - -\begin_layout Description -0.19 2002-01-25/PB: Add two German books, fix quote entinities in exported - SGML code -\end_layout - -\begin_layout Description -0.18.2 2002-01-23/PB: Add a FAQ on the program chapter -\end_layout - -\begin_layout Description -0.18.1 2002-01-23/PB: Move -\begin_inset Quotes sld -\end_inset - -the end -\begin_inset Quotes srd -\end_inset - - to the end, add USAGI to maillists -\end_layout - -\begin_layout Description -0.18 2002-01-22/PB: Fix bugs in explanation of multicast address types -\end_layout - -\begin_layout Description -0.17.2 2002-01-22/PB: Cosmetic fix double existing text in history (at 0.16), - move all credits to the end of the document -\end_layout - -\begin_layout Description -0.17.1 2002-01-20/PB: Add a reference, fix URL text in online-test-tools -\end_layout - -\begin_layout Description -0.17 2002-01-19/PB: Add some forgotten information and URLs about global - IPv6 addresses -\end_layout - -\begin_layout Description -0.16 2002-01-19/PB: Minor fixes, remove -\begin_inset Quotes sld -\end_inset - -bold -\begin_inset Quotes srd -\end_inset - - and -\begin_inset Quotes sld -\end_inset - -emphasize -\begin_inset Quotes srd -\end_inset - - formats on code lines, fix -\begin_inset Quotes sld -\end_inset - -too long unwrapped code lines -\begin_inset Quotes srd -\end_inset - - using selfmade utility, extend list of URLs. -\end_layout - -\begin_layout Description -0.15 2002-01-15/PB: Fix bug in addresstype/anycast, move content related - credits to end of document -\end_layout - -\begin_layout Description -0.14 2002-01-14/PB: Minor review at all, new chapter -\begin_inset Quotes sld -\end_inset - -debugging -\begin_inset Quotes srd -\end_inset - -, review -\begin_inset Quotes sld -\end_inset - -addresses -\begin_inset Quotes srd -\end_inset - -, spell checking, grammar checking (from beginning to 3.4.1) by Martin Krafft, - add tcpdump examples, copy firewalling/netfilter6 from IPv6+Linux-HowTo, - minor enhancements -\end_layout - -\begin_layout Description -0.13 2002-01-05/PB: Add example BIND9/host, move revision history to end - of document, minor extensions -\end_layout - -\begin_layout Description -0.12 2002-01-03/PB: Merge review of David Ranch -\end_layout - -\begin_layout Description -0.11 2002-01-02/PB: Spell checking and merge review of Pekka Savola -\end_layout - -\begin_layout Description -0.10 2002-01-02/PB: First public release of chapter 1 -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "credits" - -\end_inset - -Credits -\end_layout - -\begin_layout Standard -The quickest way to be added to this nice list is to send bug fixes, corrections -, and/or updates to me ;-). -\end_layout - -\begin_layout Standard -If you want to do a major review, you can use the native LyX file (see -\begin_inset CommandInset ref -LatexCommand ref -name "original source" -reference "general-original-source" - -\end_inset - -) and send diffs against it, because diffs against SGML don't help too much. -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "major-credits" - -\end_inset - -Major credits -\end_layout - -\begin_layout Itemize -David Ranch : For encouraging me to write this - HOWTO, his editorial comments on the first few revisions, and his contributions - to various IPv6 testing results on my IPv6 web site. - Also for his major reviews and suggestions. -\end_layout - -\begin_layout Itemize -Pekka Savola : For major reviews, input and suggestion -s. -\end_layout - -\begin_layout Itemize -Martin F. - Krafft : For grammar checks and general reviewing - of the document. -\end_layout - -\begin_layout Itemize -John Ronan : For grammar checks. -\end_layout - -\begin_layout Itemize -Georg Käfer : For detection of no proper PDF creation - (fixed now by LDP maintainer Greg Ferguson), input for German books, big - list of URLs, checking all URLs, many more suggestions, corrections and - contributions, and the German translation -\end_layout - -\begin_layout Itemize -Michel Boucey : Finding typos and some broken URLs, - contribute some suggestions and URLs, and the French translation -\end_layout - -\begin_layout Itemize -Michele Ferritto : Finding bugs and the - Italian translation -\end_layout - -\begin_layout Itemize -Daniel Roesen : For grammar checks -\end_layout - -\begin_layout Itemize -Benjamin Thery : For contribution of - updated mobility section -\end_layout - -\begin_layout Itemize -John Wenker : major contribution to Programming using - C-API -\end_layout - -\begin_layout Itemize -Srivats P. - : major contribution for 4in6 tunnels -\end_layout - -\begin_layout Subsection -Other credits -\end_layout - -\begin_layout Subsubsection -Document technique related -\end_layout - -\begin_layout Standard -Writing a LDP HOWTO as a newbie (in LyX and exporting this to DocBook to - conform to SGML) isn't as easy as some people say. - There are some strange pitfalls... - Nevertheless, thanks to: -\end_layout - -\begin_layout Itemize -Authors of the -\begin_inset CommandInset href -LatexCommand href -name "LDP Author Guide" -target "http://www.tldp.org/LDP/LDP-Author-Guide/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -B. - Guillon: For his -\begin_inset CommandInset href -LatexCommand href -name "DocBook with LyX HOWTO" -target "http://perso.libertysurf.fr/bgu/doc/db4lyx/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "content-related-credits" - -\end_inset - -Content related credits -\end_layout - -\begin_layout Standard -Credits for fixes and hints are listed here, will grow sure in the future -\end_layout - -\begin_layout Itemize -S .P. - Meenakshi : For a hint using a -\begin_inset Quotes sld -\end_inset - -send mail -\begin_inset Quotes srd -\end_inset - - shell program on tcp_wrapper/hosts.deny -\end_layout - -\begin_layout Itemize -Frank Dinies : For a bugfix on IPv6 address explanati -on -\end_layout - -\begin_layout Itemize -John Freed : For finding a bug in IPv6 multicast - address explanation -\end_layout - -\begin_layout Itemize -Craig Rodrigues : For suggestion about RHL IPv6 - setup -\end_layout - -\begin_layout Itemize -Fyodor : Note me about outdated nmap information -\end_layout - -\begin_layout Itemize -Mauro Tortonesi : For some suggestions -\end_layout - -\begin_layout Itemize -Tom Goodale : For some suggestions -\end_layout - -\begin_layout Itemize -Martin Luemkemann : For a - suggestion -\end_layout - -\begin_layout Itemize -Jean-Marc V. - Liotier : Finding a bug -\end_layout - -\begin_layout Itemize -Yaniv Kaul : Finding a bug -\end_layout - -\begin_layout Itemize -Arnout Engelen : For sending note about a draft - was adopted to RFC now -\end_layout - -\begin_layout Itemize -Stephane Bortzmeyer : Contributing persistent - configuration on Debian -\end_layout - -\begin_layout Itemize -lithis von saturnsys : Reporting a misaddressed - URL -\end_layout - -\begin_layout Itemize -Guy Hulbert : Send a note that RFC1924 is probably - an April fool's joke -\end_layout - -\begin_layout Itemize -Tero Pelander : Reporting a broken URL -\end_layout - -\begin_layout Itemize -Walter Jontofsohn : Hints for SuSE Linux 8.0/8.1 -\end_layout - -\begin_layout Itemize -Benjamin Hofstetter : Reporting - a mispointing URL -\end_layout - -\begin_layout Itemize -J.P. - Larocque : Reporting archive URL for maillist - users at ipv6 dot org -\end_layout - -\begin_layout Itemize -Jorrit Kronjee : Reporting broken URLs -\end_layout - -\begin_layout Itemize -Colm MacCarthaigh : Hint for sendfile - issue on Apache2 -\end_layout - -\begin_layout Itemize -Tiago Camilo : Contribute some URLs about Mobile IPv6 -\end_layout - -\begin_layout Itemize -Harald Geiger: Reporting a bug in how described the bit counting of the - universal/global bit -\end_layout - -\begin_layout Itemize -Bjoern Jacke : Triggered me to fix some outdated informati -on on xinetd -\end_layout - -\begin_layout Itemize -Christoph Egger : Sending note about -\begin_inset Quotes sld -\end_inset - -ip -\begin_inset Quotes srd -\end_inset - - has problems with IPv4-compatible addresses on SuSE Linux 9.0 and trigger - to add a hint on 6to4-radvd example -\end_layout - -\begin_layout Itemize -David Lee Haw Ling : Sending information - about a tunnel broker -\end_layout - -\begin_layout Itemize -Michael H. - Warfield : Sending note about suffix for 6to4 routers -\end_layout - -\begin_layout Itemize -Tomasz Mrugalski : Sending updates for DHCPv6 - section -\end_layout - -\begin_layout Itemize -Jan Minar : Reporting minor bugs -\end_layout - -\begin_layout Itemize -Kalin KOZHUHAROV : Fixing a not so well explanation -\end_layout - -\begin_layout Itemize -Roel van Dijk : Reporting broken URLs -\end_layout - -\begin_layout Itemize -Catalin Muresan : Reporting minor - bugs -\end_layout - -\begin_layout Itemize -Dennis van Dok : Reporting minor bugs -\end_layout - -\begin_layout Itemize -Necdet Yucel : Reporting broken URLs -\end_layout - -\begin_layout Itemize -Bryan Vukich: Reporting a broken URL -\end_layout - -\begin_layout Itemize -Daniele Masini: reporting a broken iptables example -\end_layout - -\begin_layout Itemize -Yao Zhao: reporting a bug in IPv6 route remove description -\end_layout - -\begin_layout Itemize -Aaron Kunde: reporting a broken URL and a content related bug -\end_layout - -\begin_layout Itemize -Larry W. - Burton: speling fixes -\end_layout - -\begin_layout Itemize -Justin Pryzby: reporting broken shortcut description of BIND -\end_layout - -\begin_layout Section -The End -\end_layout - -\begin_layout Standard -Thanks for reading. - Hope it helps! -\end_layout - -\begin_layout Standard -If you have any questions, subscribe to proper -\begin_inset CommandInset ref -LatexCommand ref -name "maillist" -reference "information-maillists" - -\end_inset - - and describe your problem providing as much as information as possible. -\end_layout - -\end_body -\end_document diff --git a/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.pdf b/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.pdf deleted file mode 100644 index a93f79b085488aa0d5764011e290e2b02cee7d2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 598702 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%0DWkV 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

    $igib=Z)i+j$}Pi*dW^sJ8~=WhN9L>7veTP6 z&Rc4Dr3ka-8gm6xZzG?3oR>+Vu?spkzpmn$-o(ipz4xN*ryZKkD7fic z*pYvGjpNlsOn3U3J>xGR&DcKPK^R@f#s&368_NrO-6}MHLIFo0j(ohrvH#-e>J?%- z3?xre0`3)MKH*)+vjtth?#?lU0*9#ecRtY5&@ID5fhpT*pCEs0&UzgpgSydcOMfqL z#tZ90eoXQK`1WZ>LvUp1Rl^3^bT)|jVqIUTY!(cDF>0rIdegug8G70fN0#3SK;p^z zSN<{%k7krQ+Q#w5V-dDoK6mtsbNo)63tLPw{NrO2LcHVWl&vkP3gr4LUCr)ZF|a0V z7|=Wt0pQUWk~^@)Wo6!b%G>Mh@%#%WI~&vq@;iBPzjF;mGWglLg^e4ek*=Q+Ov?(D zv3aGjug4MQ4>tTHP$639B+4Ijk*UcWbQ!G78*K2Yi?@9{TXYq_j~SfwvGmn<1H9TI zf=I-PtoMUorZzPRMRQNd#U=6IphQhQY7)NuIxUJ4xP-ulrf%S1hyrE~Bse7rpJ!W8 z>$1-c-0J5f7}YF1Z~UpcDOEZV567Zn=3B;T)o91^iKXB8QCp^UDp1RnyzjpEQ7uV5 zhrwL<)G>FpFaC7}L%2+t0GwMTgS_|gk9Z;r21i4cbm;q~_?v15RQ@sxi1jdra$ldG zc%lx5aQd=lH1$pfYro^Jc;}AM)&AQ|mF5$+w|lj2Dnt~TroTf;qbD% zoFy3oxXm&S!*=HQ$v2I$b2;*i05CG_1@&@Te0BJa0)Ua&wTe)v*0|epa?90SZN8p( zxyN7~jg+xW4UH7-``4d;J~#7w=1>6o?GBaHpN+=1onm3+Dk^#bB_zj8X&nCEV9eKX z|E<6G2V90IWaMDHoc~zfMtCdZEeGX*l^F~11!kM7UA1N(TQ>~C0EXaYI|1Z(1Xgix zHmESn|FNqI>aOjP*=fig%|H$EVQ7{W@u{T_($LBk5dl2WR#+!SaVO+0Rg~We`vz?3 z8g-F93RV=PvHJ{_P4z%e-hi8mf6RtShW!ud6WX*5Wve8^z6BsOxECAegP}}+sDIZU6*>ob;3Bs8aMG(JQ~JT&t-8Oe6&N zLy3j#iSqqt7u2ob_&u%8w#NY0Z0rm=ps207Iz@X(Mfs03+^sZR3hn5120Jjd(O~zX zz^%anK5U`PUL-+fs+*9vI$48AhRSr+BFVV@B??9X>g zh=vGlUs05UtFWNQK38EGi~`U#0>H~B@EcxdizBd>OOGcodji8J(0u}pCs2Nf_3M*7 zDO&CgKH=P;aV2KyxvCL$Wd zu%1Dp3F3+Kc3nj!RW)IyZthS-MosrHVSU?_CD1p2*JKdn(~*L zwl6#%k#-lc3-aNLAQ)oJgIoN8BMXH6`!6V$JYh!b6{U{5Zf5S|uV9ji@t~PC#=J?B zIzf9Vyn4+Yg%2_HQMP%EgVaC4QmHFd%a8CO4|+ z9X;o_A@Ae&B-ak7%h)+iCjA$<$%urc2f4>=R_CjL+|xFzB~(Gh-$%r=y=W$kMLcNM zjbDxk@jx1a6gR7Ttw75#k&A`YNuL*UQ zl-)~$yIH`RuerI=p{eZcp1Pi>)Uyysb=ZH1t~fOK`994NBL&t%u5pk)k?+;udp$YL z&5)R8^Y<9`Z<7^k?Q@b|_K-ks`g<_feZ|}C_Kf&xZ>ASfW3MliPrix3if_M<$f~j> zNfsdJ%-Pp;9JwA)z>5EJyT_FoZiFGYk$|ThYExjAlXlIX612sa%QwP1{arvz+S zvs)W+NHUNQmW_7LzDQqgZ%bf;^AZ6leF?M8CK1UO&z}Ebla2#FQlK!7k7#JjBtqPt zGbMX0tyel_Eh`U3pnW0^-l&2H*Sl|5wz#ADJg-(#d)Et$(yw|>BVW#0Du0rG7k*?3 zV?U9~?YFZdtI+{I%fn*DZRtB@mNm-a$?f1!lqIz>Jz4pvNd2+HsvwZ)=&jPY_K~X6 zxF;_R>1R_U*WVqd%CgT3gcNnPJ;sx%4jt|H4%B$z@mDB0y(Mf@n1y8?A|*QXm%KQ- z;~sZ0s_(5uWX{@9*?J$DyU#o$w>Xn$m(MU{ep{c^$i-gY$;x+pe4s%;NyoH1TMPu;$#PRf_B&*RZYU1qw0t-{ml~R8;8H4|_}KEH z`b=u*Cj*yo`2Wt` z$LDY>02cvTOsmk=DK~H?o=8r`j7qC8+94NiES~7CirJlJ;W5B`!|_C{DrWwgh8!NK zoDBD~vs8!9%@K(?(G<41d7beo5GrN|8ij<`xin4jDSOIh=^BNuR=If%@hNM{W=}l31Z~!BWrxEiEl!FxkMbw##}Z%q|StozMK+pLC;a8 zX|L*3Q|282Qa$YS36hm0$hcAZdFN2|JY~{s{ptYKTk>S%ySR z<0i@C181trA_Gz;$?O9n&0zMv-RsGj0)2Jm+W|WRwHH8CW_QiyqI+=RIY`atgLO+DX0jhE#p$Eq9 zSkVD04YVxJ6L(T|bD8#)>+h4gHQ;r1R)tnuL4udd4VYCb5N&b9UUm4~w5}QT0ctSw znNL@?DqQ+!^94wL3e?JUQR?mxR4xp2b`n1i$t9h;$(e1>U@-!Ly9okmmI)EY1_kuW zoKD0F-Z$&VREPKj>(&OS0rnUSzy->MPL$eS1Q$M}8}9o(b)~RbJW`2E-97Ud)cqUE zb^|@Oxy_BY?v8+wc69r=SUePgvlV6lhO;%mW$#GPrM>)ph5I_9aK{v)s*$#OGIiI$ z8B78&mobj5nnzn9Bd@Dwec|!wMHVK69lT_*_jo~uG;R>qLRt1$E;Fr@T-L_k;%Vr1 z-+y))!K?L{>+doiq7JvR73R`4>ct8rl)|!!Im9T$FwLgom@Ag+lWMWu6WtnIR zI>kjxC6xb+`3A#oOUB0iy%!d6ZGZ&)qeS-H4P1lrF+yJldsqu3UC+hZ#ME9|#_-%b z>qF|ws)BqV zI4VtiY2O$Nynp>tgkwIY*(>_WRj*t+IU24zG+8twZrVJq%JqApKZ! zk*V*LROck;|u*|inSM%OL|o9)muBS_4z`-NP6zPvxr1`k$$mvq-hp3`|tv&YTc`y zDG~&K^7`EvrUqL^n;+eaN*MU}ul0pdKR9%=6Xk3JM+KO~Z7Ta--1Cj_Y&$rftzZ;$ zS5G19rE*86h(w8pEv~*J@+*hnPrXA_UL%b&9~q5>Ln1KRyQ*LO%0|uktDNnKkh18$c?mJQiSg#_ zH6AlPpUo>_#^&g7o%OcRHr%%NS;V-kk!=<{FI{g7YF@>WQ)RT0NEL6R;&t z(Oi3NKYq>#nf!1OcWk4Q1l2?(miX3L(jieF6Zu#pB$uJvnjY`#QQYYVMlQ_Vcc0cT z&schuyR9V?824pQGBS{K7#S#nr7Pe0J7|XFQV3*y+pwqv3~0vRMKXk0a*XCe|7?g?3D=G-d^Zd8N9&D+FQ#L#xN!Jsw2%%9nRp{z$iaxOv2H z)c}?vQ(b$x(}A5=DHh~U9uIns1ifjG==vTrMgkAn1cLGC`z=jjm2w@ zhQp(tGpRTwu0)_~9tQ+8Dp+FvPFjyZfBOP%db%6@)#_kvs-IDBiHf9=>ZW_qJMrZ| zlSv~vEh1&05XWeW(#HBOx_8p925x*GP0rEPk-qx07*#?X@=JSTPJ!`+ayoEhF6xZ* z8`MvWZK5A-S$I*JqLC{`9~AhBiQ_dzv8=YyeiTzQayyXaOhj=KyCFr!`mVQ;dKpm^ z(8XloA2HJN-kKjnH*%j5Y16=lyLZtJ1q$#Aozc)YB>2mxpz?*Iw8$e_-NzoOY3248 z(JRebxSi;zDdxVCMDo0>ywZW(poV3c4kC=5j=WxWQjN!H*1#50MV%5WJZZL%pHwJ9 z>L8+1>d}plEh=3x-7dm9dgl-?kzZV-EAin-2w z>#tSp&v#mV$8F$-JNbf5A)n=GZ*?)VFyrDlOr`FKQm~<03I*O)BU&ZZh-`3xivW~1 z?!e(ffU3h*Yj5W|FDVUdnFl38+z8f zJU7w63Kd4^@`jJZ$ZhaXV=R$nbyl=2Ye9^nNCgl7-!DIsW!<1iZ&$ySCF{F+HziR8 ziaC!iiTvcj?=9}p6yy77M}N^CyYJytU;c{z%EOBX%=w$cF3XxMscBTA6hw4BRuC!f z!TCG;Jz4mT$%I7q|HQ@a5x0YENTsqYN-jnA{zkten*a@SfFwGf1&@bPp3D_*9is~N z;eWwqef`uCWb4XK`zA!Y|6-#{a=YRsd^~s@rFuO8Q}w}3vBSH7rxG^hkb@|_a+TJQ_bo9N`W65sK=P% zP+9O5&$I>rr3uPfJX9XlFc$4dTG+M~OIj`BV$v_~kRINqG2!(!y!$T3&KzSK9TxgY zlWLuk5dYb=#)M@Z?GoCpK{ZR+hlf~Okc5Xj4x}XO-c#0ocQAmASRVyP=papH-krOy~UIEEX11ppo+~$ECAlZ>| z&!A`JJEU78YRN|ML!k**zmPVY(9FOmpS_|)aUZQBNwG8;wKl<~Xc0D#XF}QcSBe>G zPyyFqmJ>_Twt~6x+tQvyGjtJ|@B&z5rb$xB0fxybKe2eTNFQO0TH1CfsakQF33cwm z3lswG_wHzn(I4F*8N)u#Lu^V+XhVgPPjdU@Mw*rT!bX~Dg6p8)ww91*0qE3zJZ1y)pgCmtaIgZM7iwI9pWu*XTd-=-|W)TL6>;~rw* z;~qqISpJ5y`>LlEhac}nCRuRqL^}RJB`ZE`TeqF2!z~uF)!4o?W3>`=Wfb0GYxjv7 ze5`M@&gaiBDn)~0eY05GqV|w$Tf4DTCvLEib$X;!Hm*hDSl<2vLRfOHME*VSW`Vg9 zc>>Bk9sm2#3NOqH7T`GBMceOXH zVw&albIqG)aUnm?)29A1?jL-D)N3~x9 zLqmU?z1O&+NXZai=@6eKijA98+7OhSd?75f&$yzmATDxHVL+iOv&>Asesl%gOICdz zW?ERU(~l(Nka^vnucq#?ZVOfS84@nBE(%pAq+w+co8-1@{@MDvcIctDKg;d@u}a`e zkRr4W>a-4X{%dDA^m+OuVU=udUk7#v2MRd+vxkY)9bI)vBo@soxRn>xD=3v0-73(O z7sXjObFDa3my3q?B3?77PR4sX7XN09m`?N1xq^SxXdcy=NyfQriC`Vq9hLafLE#v$ zyCJb?RRN)-g_=b7p&p-+TdAImkxj{%^W7J*oZk`Nx!J#ecQizOGtf;g_=c_9{%(<; zRU+pAMHQiF_-*uS1F7F4RpJdWiCKt)#Dz^rf33vMOP%OxPiw+3FH2VVfX`4W=&!1? z&(>XJCQmW-!5yvAcTPIkaXd_dFj(|QdU>l=n0L!oDD3DvZj6ESXbW;YwwDuc7`4O; zd{isK6rd|*)F`?|KKT;`=YB`v!axp-_vv7OeoI(kGXr4=x6Sq@64DK2)W91F`XfPR z=bJ&VtWF4AxB}KU0Y2H19YPP%Y|%X^Sw4HeItK%1+}%*3^u2MOi+V?kK;!?T8c<`9 zh{y!)6^er1KV053=)w2@8m_#9(SuLD(@27Gw<*7|Rg0U3eUC7cM)C9T`i) ztxM%XZ|JY=HH!m{#vZEyk95_8({8&A+5}=~l>wTd3|0Y4h8Ka49 z>n+bXwWfJBhZTQo8flCXQg`pYVQEReFDc@Qqhtri4GK4 z4xB*((|A|Jn!!RFgZu7rSDtYy2Tqy`ISjnfRbduP~2{!L^DMeHh$kL?^egZl{;T=R**5{wA zVAl6&{SG3@au}YzN7&D)cRq;ptQ4>`Iqm*9Nl{SPA9O{KWd1kKw>jQnUxK-?tBDH= zLSMF}l*}F9z9c%)6(N=R;Royi1v9-(&+(1*pN?XxcRfSuI#-RB^dBSk_ZZvlWjBO#Qtc361`0qZ?hhlDD zsk*9P+1aBX5ZZ%;ABxM2$Dqlm+@M;*+ECH?vlf?`m_d_Uxxu2uW>$5zs5a7I(~ZtFMbp*GdY9i8|4P?lI=(nO-bebc}#c@+_3m+cB_EhKBVbb z+%j4QO?l;p^b#9EwNruP7GPb~GAF#rx=f_T_$uB?W`g1teDZS=2=L_w&fbbULYxz-E-{In&>%GQ% zIZun8&8_OK3kH=gs(;GGc1X`Wh51(%{_nZC1X)72CeOgz(xa}lRjx(DijLZRBMe)v zH^bx3>8+<{U-AzHJhpcD<(K~xS0#5^Rc+%17Af=*aZ_fNw2UqlH%G`JH`XxB? zIsM?gYcnK#lU8%JtNP_Ffpm`(mJ2WAdIv9#l*bY4>1zq`mErm?yvoM#5yrdW?(@af zOg5gJmmAZwLd~oxw~Mv2`9s-_I-bcM>Lf$=>l1t931fF<#MSZ|5~q<5oVPWWoR5iK z!ywC`S&uF075^q5Zj>6m%<#!s1MF#u(?<XxO+hkEe^SPJzoxD(EgMPK26Uo`RY+b$A>LZS|5M%BMkRTMaXczD(DDV;rYtk% z5Nc4Gf{LV;B`%=EI<}@pwYf8U!SEy*qB7K?QV&tFiBTPtnKiA>nyD#o_F|qoX){)+ zfSF;Au$Mv2>26$EJN2PH?#utVum5vj*L}|O?K#i+{T~94lxlE#Qs;7Wm1~*Wm8NVT zR8~YZDr3Z7J1O-ig8ewR)PVbH9WjIxn8d~uA|Z=N*xDyAupF)_f7Ci+-fM0hdLwhf zbB~ob*J<+Ik*EGhS3bU(lbf+Qvo6cIspAr^DEMmcmh|4`&b`-9o71kF5&71(4NVy@ zOmmLs7Th=8+>?u!{^iazU5d`{^CcL2)AG#0OvD&>^D;;CZ7aYmiQ9BBAXm5U@1+t5 z&h1auCf7&aiZFgJ?tD($XLoTtzXRs0r~W$kh#S)MW_h>BM&+Pe;r;ucXmX9wqg9_= za<>PKceL%pKjv>hcSbRKpckm@SCKvY@D_d%+J(r_Lub&~bEAOqf?tbX9m5!g(rMy6 z)gAb}in4IyD3LzXdKLT}Jg?N*-x9I`!@F$3niMq8*F z(1Mxa3(v$E&W@x8^kEUZPc}Fgr!5?bXL!S!*Jz7XA7$M;P-`pY($8IrF(x~<%;g+w#FLzFwTGeF4ENGYH*`igQ5Zpad=epZVsWVXjqhC`XkiRnV( zPtvign6S4mE$W zS9stR-=H+=_)~(61sfbELO(Z zL;G{L0`Vr`hkEXb*|jVd+g`@t(OOWxWU&s~%lKcHjDq>MDIUFn?@2ZoSa-70r>XV> za%rLm9CxY`+hqEnu=WIvTgL^G8v&`VzMBHJ@gl{g4qBH34GtGo5!yK*_hE#G($0Ph zHAY*oNS@j<4_RdOKM|)2J)>A_n^vYQWg@8xvTfEo6q#iSXS!6CU~>T^nGI?GjO_?Q z_;h@n-V1B@4850@u3%yygD9W?GL zs23fQ$z|R2F3fx~gbYhejulQ9A}VBsfewMDwWgGM*{W)KgwVXc+IoQ=D?Bcw(#UdA zU<|4XEZ33+NnP|V6UHPuCTn?Zg8OnAeV0&p__-)2FDa@WjUkbNS%v~lO?Fd2OXdiT zhjW60V{lcWBGE}1zNXu^8(Pvnpp8ZEi7%%EMrl7d{daJ|@=S%&a*-=7|kid;cIwJkk8zllm zii>OGfqO_FCsV2Ai@Om@=>G2B=c&!fAbjKp ziov8^65)UdDStqy3I%(N0|-C4jnIA-L!ypm3(Dyn$tPRs+)&Sn%(lVCv8^*fB;qzc zWwFz`5gwJ-u<3R0%M9soEX^p^wrPR$3e;Df{&XtPVs#pooR_dVeCX-rzfx1hI(Y z)US57K|mmc%{^UBvxK!kj9EeB_1Jiv_h>rl)e;xn; diff --git a/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.pt_BR.html b/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.pt_BR.html deleted file mode 100644 index 6dd159ff..00000000 --- a/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.pt_BR.html +++ /dev/null @@ -1,20753 +0,0 @@ - -Linux IPv6 HOWTO (pt_BR)

    \ No newline at end of file diff --git a/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.pt_BR.lyx b/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.pt_BR.lyx deleted file mode 100644 index a807b14d..00000000 --- a/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.pt_BR.lyx +++ /dev/null @@ -1,31492 +0,0 @@ -#LyX 2.2 created this file. For more info see http://www.lyx.org/ -\lyxformat 508 -\begin_document -\begin_header -\save_transient_properties true -\origin unavailable -\textclass docbook-book -\begin_preamble - -\end_preamble -\use_default_options false -\maintain_unincluded_children false -\language english -\language_package default -\inputencoding default -\fontencoding global -\font_roman "default" "default" -\font_sans "default" "default" -\font_typewriter "default" "default" -\font_math "auto" "auto" -\font_default_family default -\use_non_tex_fonts false -\font_sc false -\font_osf false -\font_sf_scale 100 100 -\font_tt_scale 100 100 -\graphics default -\default_output_format default -\output_sync 0 -\bibtex_command default -\index_command default -\paperfontsize default -\spacing single -\use_hyperref false -\papersize default -\use_geometry false -\use_package amsmath 1 -\use_package amssymb 1 -\use_package cancel 1 -\use_package esint 0 -\use_package mathdots 1 -\use_package mathtools 1 -\use_package mhchem 1 -\use_package stackrel 1 -\use_package stmaryrd 1 -\use_package undertilde 1 -\cite_engine basic -\cite_engine_type default -\biblio_style plain -\use_bibtopic false -\use_indices false -\paperorientation portrait -\suppress_date false -\justification true -\use_refstyle 0 -\index Index -\shortcut idx -\color #008000 -\end_index -\secnumdepth 3 -\tocdepth 3 -\paragraph_separation indent -\paragraph_indentation default -\quotes_language swedish -\papercolumns 1 -\papersides 1 -\paperpagestyle default -\tracking_changes false -\output_changes false -\html_math_output 0 -\html_css_as_file 0 -\html_be_strict false -\end_header - -\begin_body - -\begin_layout Title -Linux IPv6 HOWTO (pt_BR) -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - -PeterBieringerpb at bieringer dot de

    Linux IPv6 HOWTO (pt_BR)

    Peter Bieringer

    pb at bieringer dot de

    Revision History
    Revision 0.66wip2010-04-20Revised by: PB
    Revision 0.652009-12-13Revised by: PB
    Revision 0.642009-06-11Revised by: PB
    Revision 0.602007-05-31Revised by: PB
    Revision 0.512006-11-08Revised by: PB

    A meta deste HOWTO de IPv6 em Linux é responder as questões básicas e avançadas sobre a versão 6 do protocolo IP em um sistema com Linux. Este HOWTO dará ao leitor informação suficiente para instalar, configurar e usar aplicações IPv6 em máquinas com o Linux. Versões intermediárias deste HOWTO estão disponíveis nos endereços mirrors.bieringer.de ou mirrors.deepspace6.net. Veja também revision history para saber das mudanças.


    Table of Contents
    1. Geral
    1.1. Copyright, licença e outros
    1.2. Categoria
    1.3. Versão, Histórico e To-Do
    1.4. Traduções
    1.5. Técnico
    1.6. Prefácio
    1.7. Termos usados, glossário e atalhos
    1.8. Necessidades para usar este HOWTO
    2. Básico
    2.1. O que é IPv6?
    2.2. História do IPv6 no Linux
    2.3. Como o endereço IPv6 se parece?
    2.4. FAQ (Básico)
    3. Tipos de endereço
    3.1. Endereços sem um prefixo especial
    3.2. Parte da rede, também conhecido como prefixo
    3.3. Tipos de endereço (parte de host)
    3.4. Tamanho de prefixos para roteamento
    4. Verificação do sistema para IPv6
    4.1. Kernel com IPv6
    4.2. Ferramentas de configuração de rede que suportam IPv6
    4.3. Programas de teste e debug IPv6
    4.4. Programas com suporte a IPv6
    4.5. Programas cliente com suporte a IPv6
    4.6. Programas servidores com suporte a IPv6
    4.7. FAQ (checagem de sistema com suporte a IPv6)
    5. Configurando interfaces
    5.1. Dispositivos de rede diferentes
    5.2. Colocando as interfaces em up e down
    6. Configurando endereços IPv6
    6.1. Mostrando os endereços IPv6 existentes
    6.2. Adicionando um endereço IPv6
    6.3. Removendo um endereço IPv6
    7. Configurando rotas IPv6
    7.1. Mostrando as rotas IPv6 existentes
    7.2. Adicionando uma rota IPv6 através de um gateway
    7.3. Removendo uma rota IPv6 através de um gateway
    7.4. Adicionando uma rota IPv6 através de uma interface
    7.5. Removendo uma rota IPv6 através de uma interface
    7.6. FAQ para rotas em IPv6
    8. Descoberta de vizinhos
    8.1. Mostrando os vizinhos usando "ip"
    8.2. Manipulando a tabela de vizinhos usando "ip"
    9. Configurando um túnel IPv6-in-IPv4
    9.1. Tipos de túneis
    9.2. Mostrando os túneis existentes
    9.3. Configuração de um túnel ponto a ponto
    9.4. Configuração de túneis 6to4
    10. Configurando túneis IPv4-in-IPv6
    10.1. Mostrando os túneis existentes
    10.2. Configuração de túnel ponto a ponto
    10.3. Removendo túneis ponto a ponto
    11. Configuraçoes de Kernel nos arquivos do /proc
    11.1. Como acessar os arquivos do /proc
    11.2. Entradas em /proc/sys/net/ipv6/
    11.3. Entradas relacionadas a IPv6 em /proc/sys/net/ipv4/
    11.4. Entradas em /proc/net relacionadas com IPv6
    12. Netlink-Interface to kernel
    13. Address Resolver
    14. Network debugging
    14.1. Server socket binding
    14.2. Examples for tcpdump packet dumps
    15. Support for persistent IPv6 configuration in Linux distributions
    15.1. Red Hat Linux and “clones”
    15.2. SuSE Linux
    15.3. Debian Linux
    16. Auto-configuration
    16.1. Stateless auto-configuration
    16.2. Stateful auto-configuration using Router Advertisement Daemon (radvd)
    16.3. Dynamic Host Configuration Protocol v6 (DHCPv6)
    17. Mobility
    17.1. Common information
    18. Firewalling
    18.1. Firewalling using netfilter6
    18.2. Preparation
    18.3. Usage
    19. Security
    19.1. Node security
    19.2. Access limitations
    19.3. IPv6 security auditing
    20. Encryption and Authentication
    20.1. Modes of using encryption and authentication
    20.2. Support in kernel (ESP and AH)
    20.3. Automatic key exchange (IKE)
    20.4. Additional informations:
    21. Quality of Service (QoS)
    21.1. General
    21.2. Linux QoS using “tc”
    22. Hints for IPv6-enabled daemons
    22.1. Berkeley Internet Name Domain (BIND) daemon “named”
    22.2. Internet super daemon (xinetd)
    22.3. Webserver Apache2 (httpd2)
    22.4. Router Advertisement Daemon (radvd)
    22.5. Dynamic Host Configuration v6 Server (dhcp6s)
    22.6. ISC Dynamic Host Configuration Server (dhcpd)
    22.7. DHCP Server Dibbler
    22.8. tcp_wrapper
    22.9. vsftpd
    22.10. proftpd
    22.11. Other daemons
    23. Programming
    23.1. Programming using C-API
    23.2. Other programming languages
    24. Interoperability
    25. Further information and URLs
    25.1. Paper printed books, articles, online reviews (mixed)
    25.2. Conferences, Meetings, Summits
    25.3. Online information
    25.4. IPv6 Infrastructure
    25.5. Maillists
    25.6. Online tools
    25.7. Trainings, Seminars
    25.8. 'The Online Discovery' ...
    26. Revision history / Credits / The End
    26.1. Revision history
    26.2. Credits
    26.3. The End

    Chapter 1. Geral

    As informações sobre as traduções disponíveis estão na seçãoTranslations.


    1.1. Copyright, licença e outros

    1.1.1. Copyright

    Escrito e com Copyright (C) 2001-2011 por Peter Bieringer


    1.1.2. Licença

    Este Linux IPv6 HOWTO está publicado sob a licença GNU GPL versão 2:

    Linux IPv6 HOWTO, um guia para configurar e usar o IPv6 em sistemas Linux.

    Copyright © 2001-2011 Peter Bieringer

    Este documento é um software livre; voce pode redistribui-lo e/ou modifica-lo sob os termos da licença GNU GPL, tal como está publicado pela Free Software Foundation; seja pela versão 2 da Licença, ou (em sua opinião) qualquer versão posterior.

    Este programa é distribuído na esperança de que seja útil, mas SEM QUALQUER GARANTIA; nem mesmo qualquer garantia de COMERCIALIZAÇÃO ou ADEQUAÇÃO PARA UM PROPÓSITO PARTICULAR. Veja a GNU GPL para mais detalhes.

    Se voce quiser uma cópia da licença GNU GPL, solicite através de carta para o endereço Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA.


    1.1.3. Sobre o autor

    1.1.3.1. História do autor com a Internet e IPv6

    • 1993: Eu entrei em contato com a internet utilizando um cliente de email e news baseado em console há bastante tempo (procure por "e91abier" no grupo groups.google.com, sou eu).

    • 1996: Foi solicitado que eu produzisse um curso de IPv6, incluindo um workshop com o Sistema Operacional Linux.

    • 1997: Comecei escrevendo um guia sobre como instalar, configurar e utilizar o IPv6 em Linux, chamadoIPv6 & Linux - HowTo (veja IPv6 & Linux - HowTo/History para mais informações).

    • 2001: Comecei a escrever este novo Linux IPv6 HOWTO.


    1.1.3.2. Contato

    O autor pode ser contactado através do endereço de email <pb at bieringer dot de> e também através de suahomepage.

    Atualmente ele mora em Munique [parte nordeste de Schwabing] / Bavaria / Alemanha (sul) / Europa (centro) / Terra (superfície).


    1.2. Categoria

    Este HOWTO deve ser listado na categoria "Networking/Protocols".


    1.3. Versão, Histórico e To-Do

    1.3.1. Versão

    A versão atual deste documento é mostrada no começo do documento.

    Para outras versões ou traduções disponíveis, veja o sitehttp://www.bieringer.de/linux/IPv6/.


    1.3.2. Histórico

    1.3.2.1. Relevantes

    2001-11-30: Começo do estilo do novo HOWTO.

    2002-01-02: Maioria do conteúdo feito, primeira publicação do capítulo 1(versão 0.10).

    2002-01-14: Mais conteúdo, algumas revisões, e publicação do documento completo (version 0.14).

    2002-08-16: Tradução para o Polones em progresso

    2002-10-31: Tradução para o Chines disponível (veja Translations para mais informações)

    2002-11-10: Tradução para o Alemão em progresso

    2003-02-10: Tradução para o Alemão disponível

    2003-04-09: Tradução para o Frances em progresso

    2003-05-09: Tradução para o Frances disponível

    2003-10-16: Tradução para o Italiano em progresso

    2004-03-12: Tradução para o Italiano disponível

    2004-06-18: Tradução para o Grego em progresso

    2005-07-25: Tradução para o Turco disponível

    2007-03-28: Tradução para o Portugues-Brazil em progresso

    2008-07-30: Tradução para o Espanhol disponível (mas ainda em progresso)


    1.3.2.2. História completa

    Veja revision history no final deste documento


    1.3.3. To-Do

    • Completar conteúdo que ainda falta

    • Finalizar a checagem gramatical


    1.4. Traduções

    As traduções devem sempre conter a URL, número da versão c copyright do documento original (e o seu também). Por favor não traduza o changelog original, pois isto não terá muita importancia. Também não traduza a seção sobre traduções disponíveis, pois elas podem estar desatualizadas. Ao invés disso, adicione uma URL para a seção em Ingles deste HOWTO.

    Aparentemente a frequencia de mudança deste documento ocorre menos de uma vez por mes. Desde a versão 0.2.7 parece que a maioria do conteúdo que eu fiz foi escrito. As traduções devem sempre ter a versão em ingles como original..


    1.4.1. Linguagens

    Nota: uma olhada nesta URL pode ajudarhttp://www.bieringer.de/linux/IPv6/.


    1.4.1.1. Chines

    A tradução para o Chines, feito por Burma Chen <expns at yahoo dot com> (informada a mim em 2002-10-31) e pode ser encontrada no TLDP:http://www.ibiblio.org/pub/Linux/docs/HOWTO/translations/zh/Linux-IPv6-HOWTO.txt.gz (g'zipped txt). É uma foto da tradução, eu não sei se está atualizada.


    1.4.1.2. Polones

    Desde 2002-08-16 a tradução para o Polones foi iniciada e ainda está em progresso por Lukasz Jokiel <Lukasz dot Jokiel at klonex dot com dot pl>. Versão usada: CVS-version 1.29 do arquivo LyX, a qual foi a origem para a versão 0.2.7. O status é de ainda em progresso (2004-08-30).


    1.4.1.3. German

    Em 2002-11-10 a versão Alemã foi iniciada por Georg Käfer <gkaefer at gmx dot at> iniciou a tradução para o alemão, e a primeira publicação foi feita em 2003-02-10. Ela está originalmenmte disponível na Deep Space 6http://mirrors.deepspace6.net/Linux+IPv6-HOWTO-de/ (e também em http://mirrors.bieringer.de/Linux+IPv6-HOWTO-de/). Esta versão se manterá atualizada tanto quanto for possível.


    1.4.1.4. Frances

    Em 2003-04-09 foi iniciada a tradução da versão em Frances, por Michel Boucey <mboucey at free dot fr> e a primeira publicação foi em 2003-05-09. Ela está originalmente disponível na Deep Space 6http://mirrors.deepspace6.net/Linux+IPv6-HOWTO-fr/ (e também em http://mirrors.bieringer.de/Linux+IPv6-HOWTO-fr/).


    1.4.1.5. Espanhol

    Um membro do projeto MontevideoLibre, localizado no Uruguai (América do Sul) iniciou a tradução para espanhol no formato wiki:http://www.montevideolibre.org./manuales:libros:ipv6


    1.4.1.6. Italiano

    Em 2003-10-16 a tradução para uma versão em Italiano foi iniciada Michele Ferritto <m dot ferritto at virgilio dot it> para oILDP (Italian Linux Documentation Project) e a sua primeira publicação foi em 2004-03-12. Ela está originalmente disponível no ILDP em http://it.tldp.org/HOWTO/Linux+IPv6-HOWTO/.


    1.4.1.7. Japones

    Em 2003-05-14 Shino Taketani <shino_1305 at hotmail dot com> me enviou uma nota dizendo que planejava traduzir o HOWTO para o japones.


    1.4.1.8. Grego

    Em 2004-06-18 Nikolaos Tsarmpopoulos <ntsarb at uth dot gr> me enviou uma nota dizendo que planejava traduzir o HOWTO para o Grego.


    1.4.1.9. Turco

    Em 2005-07-18 Necdet Yucel <nyucel at comu dot edu dot tr> me enviou uma nota dizendo que a tradução em Turco estava disponível. E uma fotografia da tradução (versão 0.61) pode ser encontrada na URLhttp://docs.comu.edu.tr/howto/ipv6-howto.html.


    1.4.1.10. Portuguese-Brazil

    Em 2011-05-06 Gustavo Mendes de Carvalho <gmcarvalho at gmail dot com> iniciou a tradução deste HowTo para Portugues-Brazil. A primeira tentativa realizada em 2007 por Claudemir da Luz <claudemir dot daluz at virtuallink dot com dot br> nunca foi finalizada.


    1.5. Técnico

    1.5.1. Fonte original deste HOWTO

    Este HOWTO foi escrito usando LyX versão 1.6.1 em um sistema Linux Fedora 10 com o template SGML/XML (DocBook). Ele está disponível em github / tLDP / LDP / users / Peter-Bieringer para contribuições.


    1.5.1.1. Divisor de linha de código

    Eu utilizei um utilitário divisor de linha de código (Code line wrapping - "lyxcodelinewrapper.pl") feito por mim mesmo, e ele está disponível para seu próprio uso emTLDP-CVS / users / Peter-Bieringer


    1.5.1.2. Geração de SGML

    O SGML/XML é gerado usando a função de exportar do LyX


    1.5.2. Referencias On-line para a versão em HTML deste HOWTO

    1.5.2.1. Página principal

    Como boa prática, uma referencia à página principal deste HOWTO é recomendada.


    1.5.2.2. Páginas dedicadas

    Como as páginas em HTML são geradas a partir dos arquivos SGML, os nomes dos arquivos em HTML podem ser bastante diferentes (randomicos). Entretanto, algumas páginas são etiquetadas em LyX, resultando em nomes estáticos. Estas etiquetas são úteis para referencias e não deveriam ser alteradas no futuro. Se voce acredita que eu esqueci qualquer etiqueta, por favor me avise, e eu colocarei.


    1.6. Prefácio

    Algumas coisas antes:


    1.6.1. Quantas versões deste HOWTO existem por aí ?

    Incluindo esta, existem 3 (tres) documentos HOWTO disponíveis. Minhas desculpas se forem demais ;-)


    1.6.1.1. Linux IPv6 FAQ/HOWTO (desatualizada)

    O primeiro documento HOWTO relacionado a IPv6 foi escrito pelo Eric Osborne e era chamadoLinux IPv6 FAQ/HOWTO (por favor use-o somente para fins históricos). Sua última versão foi a 3.2.1, lançada em 14 de Julho de 1997.

    Por favor ajude: Se alguém souber a data de nascimento deste HOWTO, por favor me envie um e-mail (estas informações são necessárias para o "histórico").


    1.6.1.2. IPv6 & Linux - HowTo (mantida)

    Esta segunda versão existe e se chamaIPv6 & Linux - HowTo escrita por mim (Peter Bieringer) em HTML puro. Ele nasceu em Abril de 1997 e sua primeira versão em ingles foi publicada em Junho de 1997. Eu vou continuar a manter esta versão, mas isto deve acontecer devagar e não será por completo, em favor da atualização da versão do Linux IPv6 HOWTO que voce está lendo agora.


    1.6.1.3. Linux IPv6 HOWTO (este documento)

    Já que esteIPv6 & Linux - HowTo foi escrito em HTML puro, ele não é compatível com o The Linux Documentation Project (TLDP). Eu recebi então um pedido no final de Novembro de 2001 para reescrever este HowTo IPv6 & Linux - HowTo em SGML. Entretanto, por causa da descontinuidade do HOWTO (Future of IPv6 & Linux - HowTo), e como o IPv6 estava ficando mais e mais padronizado, eu decidi escrever um novo documento cobrindo os pontos básicos e um pouco avançados que permaneceram importantes ao longo destes anos. Algum conteúdo mais dinamico e avançado ainda pode ser encontrado neste segundo HOWTO (IPv6 & Linux - HowTo).


    1.7. Termos usados, glossário e atalhos

    1.7.1. Rede

    Base 10

    Sistema numérico muito bem conhecido e representa qualquer valor com os dígitos 0 a 9.

    Base 16

    Geralmente usado em linguagens de programação, também conhecido como sistema numérico hexadecimal, representa qualquer valor com os dígitos 0 a 9 e caracteres A a F (case insensitive).

    Base 85

    Representação de um valor com 85 dígitos/caracteres diferentes, ele pode levar a strings menores, mas nunca vi ser usado em campo.

    Bit

    A menor unidade de armazenamento, representa on/verdade/1 e off/falso/0.

    Byte

    Geralmente uma coleção de 8 bits (mas não é necessariamente uma verdade - veja outros sistemas computacionais)

    Device

    Aqui, o hardware para a conexão de rede, veja também NIC

    Dual homed host

    Um sistema dual homed é um nó com duas redes (física ou virtual) com interfaces em dois links diferentes, mas sem encaminhar qualquer pacote entre eles (não é um router).

    Host

    Geralmente um sistema single homed com somente uma interface de rede ativa, exemplo Ethernet ou (não e) PPP.

    Interface

    Quase sempre o mesmo que "device", veja também NIC

    IP Header

    Cabeçalho de um pacote IP (cada pacote de rede tem um cabeçalho e seu tipo depende do nível de rede)

    Link

    Um link é o nível 2 de rede, ou meio de transporte de pacotes. exemplos são Ethernet, Token Ring, PPP, SLIP, ATM, ISDN, Frame Relay,...

    Node

    Um nó é um host ou um router.

    Octet

    É uma coleção de 8 bits, hoje bem similar a "byte".

    Port

    Informação utilizada pelo TCP/UDP dispatcher (camada 4) para transportar informações para as camadas superiores

    Protocolo

    Cada camada de rede que contém a maioria dos campos e informações para tornar a vida mais fácil ao enviar a informação transportada para as camadas superiores, veja camada 2 (MAC) e 3 (IP)

    Router

    Um router é um nó com 2 ou mais redes interfaces de rede (física ou virtual), capaz de encaminhar os pacotes entre as suas interfaces.

    Socket

    Um socket IP é definido pelo endereço de origem e destino, e suas portas

    Stack

    Relacionado às várias camadas de rede

    Subnetmask

    Redes IP usam bits de máscara para separar redes locais de redes remotas

    Tunnel

    Um túnel é tipicamente uma conexão ponto-a-ponto sobre a qual pacotes são trocados, e que carregam dados de outro protocolo. Exemplo túnel IPv6-in-IPv4.


    1.7.1.1. Atalhos

    ACL

    Access Control List - Lista de controle de acesso

    API

    Application Programming Interface - Interface de programação de aplicação

    ASIC

    Application Specified Integrated Circuit

    BSD

    Berkeley Software Distribution

    CAN-Bus

    Controller Area Network Bus (physical bus system)

    ISP

    Internet Service Provider - Provedor de serviços Internet

    KAME

    Projeto - um esforço conjunto de seis companhias no Japão para fornecer grátis uma pilha IPv6 e IPsec (para ambos IPv4 e IPv6) para as variantes BSD existentes no mundo www.kame.net

    LIR

    Local Internet Registry - No Brasil, o registro.br

    NIC

    Network Interface Card

    RFC

    Request For Comments - conjunto de notas técnicas organizacionais sobre a Internet

    USAGI

    UniverSAl playGround for Ipv6 Project - trabalho para entregar uma pilha IPv6 de qualidade para os sistemas Linux.


    1.7.2. Informações úteis

    1.7.2.1. Sinal de divisão de linha longa de código

    O caractere especial "¬" é usado para sinalizar que esta linha de código foi dividida para se obter uma melhor visualização em arquivos PFG e PS.


    1.7.2.2. Marcadores

    Nos exemplos genéricos voce encontrará as seguintes marcações:

    <myipaddress>

    Para o uso real em seu sistema de linha de comando ou em scripts, isto deve ser substituído pelo conteúdo correto (removendo os sinais < e >). Desta forma o resultado seria

    1.2.3.4

    1.7.2.3. Comandos no shell

    Comandos executados no shell por usuários normais (não root) começam com $

    $ whoami

    Comandos executados pelo usuário root começam com #

    # whoami

    1.8. Necessidades para usar este HOWTO

    1.8.1. Prerequisitos pessoais

    1.8.1.1. Experiencia com ferramentas Unix

    Voce deve estar familiarizado com a maioria das ferramentas Unix, como grep, awk, find, etc. , e saber sobre a maioria das opções mais usadas de cada um deles.


    1.8.1.2. Experiencia com teoria de rede

    Voce deve estar famliarizado com camadas, protocolos, endereços, cabos, conectores, etc. Se voce é novo nesta área, este é um bom local para voce iniciar seus estudoshttp://www.rigacci.org/docs/biblio/online/intro_to_networking/book1.htm


    1.8.1.3. Experiencia com configuração IPv4

    Voce deve definitivamente ter alguma experiencia em configuração de redes IPv4, caso contrário será difícil para voce entender o que realmente está acontecendo.


    1.8.1.4. Experiencia com Domain Name System (DNS)

    Permitirá a voce entender o que é um Domain Name System (DNS), que serviço ele fornece e como usa-lo.


    1.8.1.5. Experiencia com estratégias de debug de rede

    Voce deve pelo menos entender como usar o tcpdump e o que ele pode te mostrar. Caso contrário a depuração de problemas de rede será muito difícil para voce.


    1.8.2. Hardware compatível com o sistema Linux

    É claro que voce vai precisar usar algum hardware (pode ser uma maquina virtual), e não somente ler este HOWTO para dormir. ;-7)


    Chapter 2. Básico

    2.1. O que é IPv6?

    O IPv6 é um novo protocolo de camada 3 que tem a função de substituir o IPv4 (também conhecido apenas por IP). O IPv4 foi projetado a muito tempo atrás(RFC 760 / Internet Protocol de Janeiro de 1980) e desde o começo tem havido muitos pedidos de atender mais capacidades e funcionalidades. A última RFC é RFC 2460 / Internet Protocol Version 6 Specification.As grandes mudanças no IPv6 foram o novo formato do cabeçalho, incluindo o tamanho da capacidade de endereços, de 32 para 128 bits. Já que a camada 3 é a responsável por transporte de pacotes fim a fim usando o roteamento baseado em endereços, ele deveria incluir os endereços IPv6 de origem e destino tal como o IPv4.

    Para mais informações sobre a história do IPv6, de uma olhada nas RFC's mais antigas do IPv6 listadas aquiSWITCH IPv6 Pilot / References.


    2.2. História do IPv6 no Linux

    Os anos de 1992, 1993 e 1994 do IPv6 no Linux (linhas gerais) são cobertos pelo seguinte documento:IPv6 or IPng (IP next generation).

    To-do: melhorar a linha do tempo, adicionar conteúdo...


    2.2.1. O começo

    O primeiro trecho de código de rede relacionado com o IPv6 foi adicionado ao kernel 2.1.8 do Linux em novembro de 1996 por Pedro Roque. Ele foi baseado na API do 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 
    -+ * <draft-ietf-ipngwg-bsd-api-05.txt>

    As linhas mostradas foram copiadas do patch-2.1.8 (o email foi limpo para evitar spam).


    2.2.2. Enquanto isso

    Por conta do buraco da manpower, a implementação do IPv6 no kernel foi incapaz de seguir os rascunhos propostos pelos novos RFC's publicados. Em outubro de 2000, um projeto foi iniciado no Japão, chamadoUSAGI, cujo objetivo foi implantar todo o restante, ou desatualizado, suporte ao IPv6 para o Linux. Ele utiliza a implementação IPv6 atual para o FreeBSD feita pelo KAME project. De tempos em tempos, eles criavam fotos da versão vanilla do código do kernel do Linux.

    Até a implementação do desenvolvimento na série 2.5 do kernel ter sido iniciado, os patches doUSAGI eram tão grandes, que os mantenedores de rede do Linux eram incapazes de inclui-lo completamente no código final do kernel do Linux série 2.4.x.

    Durante o desenvolvimento da serie 2.5, o tentou inserir todas as suas extensões usadas nesta série.


    2.2.3. Atualmente

    Muito do desenvolvimento feito para o IPv6 e patches doUSAGI e outros estão integrados na série vanilla do kernel 2.6.x.


    2.2.4. O futuro

    O USAGI e outros ainda mantém o trabalho na implementação de novas características e funcionalidades, como a mobilidade e outros. De tempos em tempos, novos patches com extensões são lançados e também integrados à série vanilla do kernel.


    2.3. Como o endereço IPv6 se parece?

    Como já mencionado antes, os endereços IPv6 possuem 128 bits de tamanho. Este número de bits gera um número decimal extremamente grande, com 39 dígitos de tamanho:

    2^128-1: 340282366920938463463374607431768211455

    Tais números não são endereços fáceis de serem memorizados. Os endereços IPv6 também tem um esquema orientado a bits (assim como o IPv4, mas não tão facilmente reconhecido). Assim a melhor notação de números tão grandes é em formato hexadecimal. Em hexadecimal, 4 bits (também conhecidos como "nibble") são representados por um dígito ou caractere, de 0-9 e A-F. Desta forma, o tamanho do endereço é reduzido para 32 caracteres.

    2^128-1: 0xffffffffffffffffffffffffffffffff

    Esta representação ainda não é muito conveniente (com a possível mistura ou perda de um único dígito hexadecimal), então os desenvolvedores do IPv6 escolheram um formato hexadecimal com um ":" separando cada bloco de 16 bits. Com isso, o sinal inicial 0x (um prefixo para valores hexadecimais em linguagens de programação) foi removido:

    2^128-1: ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff

    Um endereço utilizável seria:

    2001:0db8:0100:f101:0210:a4ff:fee3:9566

    Para simplificar, os zeros iniciais de cada bloco de 16 bits pode ser omitido:

    2001:0db8:0100:f101:0210:a4ff:fee3:9566  -> 
    -¬ 2001:db8:100:f101:210:a4ff:fee3:9566

    Um bloco de 16 bits contendo somente zeros também pode ser omitida, sendo representada por "::", mas não mais de uma única vez no endereço. Caso contrário poderia haver duplicação de endereços.

    2001:0db8:100:f101:0:0:0:1  ->  2001:db8:100:f101::1

    A maior redução possível é vista do endereço IPv6 de localhost:

    0000:0000:0000:0000:0000:0000:0000:0001  ->  ::1

    Há também um outro representação em modo compacto (Código base 85) baseado naRFC 1924 / A Compact Representation of IPv6 Addresses(publicada em 1º Abril 1996), nunca vista em campo. Provavelmente é uma pegadinha ou mentirinha da data. Mas aqui está um exemplo:

    # ipv6calc --addr_to_base85 2001:0db8:0100:f101:0210:a4ff:fee3:9566 
    -9R}vSQZ1W=9A_Q74Lz&R

    Info: ipv6calc é uma calculadora de formato de endereços IPv6 que também faz conversões, e pode ser encontrada aqui: ipv6calc homepage (Mirror)


    2.4. FAQ (Básico)

    2.4.1. Porque o nome do sucessor do IPv4 é IPv6 e não IPv5 ?

    No cabeçalho IP, os primeiros 4 bits são reservados para a versão do protocolo. Então em teoria qualquer número entre 0 e 15 seria possível.

    O próximo número disponível era 6. Portando, assim nasceu o IPv6!


    2.4.2. Endereços IPv6: porque um número tão grande de bits ?

    Durante o desenvolvimento do IPv4, as pessoas pensaram que 32 bits seriam suficientes para o mundo. Olhando de volta, realmente 32 bits foram suficientes por bastante tempo. entretanto 32 bits não foram suficientes para prover endereços globais para todos os dispositivos de rede no futuro (ou será já no presente ?). Pense em telefones celulares, tablets, computadores virtuais, carros, GPS's, geladeiras, TV's, etc.

    Assim, os desenvolvedores escolheram 128 bits, 4 vezes maior (no campo do tamanho do endereço) do que o IPv4.

    Mas o tamanho utilizável é menor do que parece. Isto se deve por causa do esquema utilizado na definição do endereçamento: 64 bits são usados para identificar a interface. Os outros 64 bits são usados para o roteamento. Assumindo os níveis de agregação (/48, /32, ...), é possível que os endereços também se esgotem, mas esperamos que não em futuro próximo.

    Para mais informações veja tambémRFC 1715 / The H Ratio for Address Assignment Efficiency e RFC 3194 / The Host-Density Ratio for Address Assignment Efficiency.


    2.4.3. Endereços IPv6: porque um número tão pequeno de bits em um nova versão ?

    Enquanto existam (possivelmente) algumas pessoas (só sei do Jim Fleming...) na internet que estejam pensando sobre o IPv8 ou IPv16, estes projetos estão muito longe de serem aceitos e implementados. Enquanto isso, 128 bits foi a melhor escolha levando em consideração o overhead do cabeçalho e o transporte de dados. Considere o MTU mínimo no IPv4 (576 octetos) e no IPv6 (1280 octetos), o tamanho do cabeçalho em iIPv4 é de 20 octetos (mínimo, e pode aumentar até 60 octetos com outras opções usadas) e no IPv6 é de 40 octetos (fixo). Isto representa 3,4% de overhead no IPv4 (com o tamanho mínimo) e 3,1 % do menor MTU em IPv6. O overhead é praticamente igual. Mais bits para endereço necessitariam cabeçalhos maiores e consequentemente mais overhead. Além disso, considere o tamanho máximo de uma MTU em links normais (como em Ethernet hoje): são 1500 octetos (em alguns casos especiais 9.000 octetos usando jumbo frames). Assim, não seria um projeto apropriado se 10% a 20% dos dados transportados para a camada 3 fosse usado para endereçamento e não para dados propriamente ditos.


    Chapter 3. Tipos de endereço

    Como no IPv4, os endereços em IPv6 também podem ser divididos em duas partes - host e rede - com a utilização de máscaras de rede.

    O IPv4 tem mostrado que algumas vezes é bom, se mais de um endereço IP puder ser configurado em uma interface, cada um deles com um propósito bem diferente (aliases, multicast). Então para continuar extensível, o IPv6 também suporta esta característica e permite que mais de 1 endereço seja configurado na mesma interface. Atualmente não existe qualquer limitação definida pela RFC, a não ser na implementação da pilha IPv6 (para evitar ataques DoS).

    Ao usar este grande número de bits para endereço, o IPv6 define tipos de endereços baseado nos bits iniciais, os quais são, espera-se, não sejam quebrados no futuro, como acontece hoje com o IPv4 e as suas classes A, B e C.

    Estes números de bits são separados para endereçar redes (os primeiros 64 bits) e para endereços de host (os últimos 64 bits), para facilitar a auto-configuração.


    3.1. Endereços sem um prefixo especial

    3.1.1. Endereço localhost

    Este é um endereço especial para a interface de loopback, similar ao 127.0.0.1 no IPv4. Em IPv6, este endereço de localhost é:

    0000:0000:0000:0000:0000:0000:0000:0001 

    ou em sua forma comprimida:

    ::1

    Os pacotes com este endereço como origem ou destino nunca devem sair ou entrar em um host.


    3.1.2. Endereços não especificados

    Este é um endereço especial, como "any" ou "0.0.0.0". Em IPv6 é representado assim:

    0000:0000:0000:0000:0000:0000:0000:0000 

    ou:

    ::

    Este endereço é geralmente usado para especificação de portas (qualquer IPv6) ou tabelas de roteamento.

    Nota: este endereço nunca pode ser usado como um endereço de destino.


    3.1.3. Endereços IPv6 vinculados a endereços IPv4

    Existem dois endereços que contém endereços IPv4.


    3.1.3.1. IPv4-mapeado para IPv6

    Um endereço IPv4-único para compatibilidade IPv6 é às vezes usado ou mostrado para sockets criados por um daemon IPv6, mas que só recebe conexões de endereços IPv4.

    Estes endereços são definidos dentro de um prefixo especial, com o tamanho /96 (a.b.c.d é o endereço IPv4):

    0:0:0:0:0:ffff:a.b.c.d/96

    ou em seu formato comprimido

    ::ffff:a.b.c.d/96

    por exemplo, o endereço IP 1.2.3.4 seria assim:

    ::ffff:1.2.3.4

    3.1.3.2. por exemplo, o endereço IP 1.2.3.4 seria assim:

    Usado para tunelamento automático(RFC 2893 / Transition Mechanisms for IPv6 Hosts and Routers), o qual é substituído pelo 6to4 tunneling.

    0:0:0:0:0:0:a.b.c.d/96

    ou em seu formato comprimido

    ::a.b.c.d/96

    3.2. Parte da rede, também conhecido como prefixo

    Os designers definiram alguns tipos de endereços e deixaram muito disto para futuras definições quando novas necessidades surgirem. A RFC 4291 / IP Version 6 Addressing Architecture define o esquema utilizado no endereçamento atual.

    Vamos agora dar uma olhada nos diferentes tipos de prefixos (e também em tipos de endereços):


    3.2.1. Endereço tipo "link local"

    Estes são endereços epeciais que são válidos somente no link de uma interface. Usando este endereço como destino, os pacotes nunca serão encaminhados a um router. Isto é usado para links de comunicação, tais como:

    • Há alguém está aqui neste link ?

    • Há alguém aqui com endereços especiais (ex. procurando por um router) ?

    Eles começam com (onde "x" é qualquer caractere hexadecimal, normalmente "0")

    fe8x:  <- atualmente é o único em uso
    -fe9x:
    -feax:
    -febx:

    Um endereço com este prefixo é encontrado em cada interface com IPv6 habilitado após a auto-configuração stateless (a qual é normalmente sempre o caso).


    3.2.2. Endereço tipo "site local"

    Estes endereços são similares aos daRFC 1918 / Address Allocation for Private Internets em uso atualmente em IPv4, com a vantagem adicional de que qualquer pessoa que usar este tipo de endereço tem a capacidade de usar até 16 bits para a definição máxima de 65535 subredes. Comparável com o 10.0.0.0/8 do IPv4.

    Outra vantagem: como é possível colocar mais de 1 endereço em uma interface com IPv6, voce pode configurar um endereço de "site local" junto com um endereço global.

    Ele começa com:

    fecx:  <- mais usado, mais comum
    -fedx:
    -feex:
    -fefx:

    (onde o "x" é qualquer caractere hexadecimal, geralmente um "0")

    Este tipo de endereço não deveria mais ser usado, RFC 3879 / Deprecating Site Local Addresses, mas para um teste em laboratório, estes endereços ainda continuam sendo uma boa escolha (IMHO - em minha humilde opinião).


    3.2.3. Endereços locais Unicast IPv6

    Por causa da definição original de endereços de site local não serem únicos, pode haver algum problema se duas redes já configuradas forem se conectar em um futuro próximo (overlap de subredes). Este e outros problemas foram os motivos para um novo tipo de endereço definido naRFC 4193 / Unique Local IPv6 Unicast Addresses.

    Ele começa com:

    fcxx:
    -fdxx:  <- atualmente o único em uso

    Uma parte do prefixo (40 bits) é gerada usando um algoritmo pseudo-randomico e é improvável que dois resultados gerados por este algoritmo sejam iguais.

    Exemplo de um prefixo gerado por este algoritmo (veja em: Goebel Consult / createLULA):

    fd0f:8b72:ac90::/48

    3.2.4. Endereço tipo Global "(Aggregatable) global unicast"

    Atualmente, existe um tipo de endereço definido globalmente (o primeiro design, chamado "provider based") que foi jogado fora a alguns anos atrásRFC 1884 / IP Version 6 Addressing Architecture [obsolete], e voce consegue encontrar em algumas versões do kernel do Linux.

    Ele começa com (os caracteres "x" são hexadecimais)

    2xxx: 
    -3xxx:

    Nota: o prefixo "aggregatable" foi descartado nos atuais drafts. Há ainda alguns outros subtipos definidos. Veja abaixo:


    3.2.4.1. Endereço de teste 6bone

    Estes foram os primeiros endereços globais que foram definidos e usados. Eles começam com

    3ffe:

    Exemplo:

    3ffe:ffff:100:f102::1

    Um endereço de teste especial para o 6bone que nunca seria globalmente único começa com

    3ffe:ffff: 

    e a maioria deles é mostrado em exemplos antigos. A razão para isso é, se endereços reais são mostrados, seria possível alguém copiar e colar estes endereços de arquivos de configuração antigos, o que inadvertidamente causaria um erro de duplicação de endereço de um endereço global único. Isto poderia causar sérios problemas para o host original (como nunca receber as respostas de requisições feitas).

    Como o IPv6 agora já está em produção, este prefixo não é mais delegado e ele foi removido do processo de roteamento (vejaRFC 3701 / 6bone Phaseout para mais detalhes).


    3.2.4.2. Endereços 6to4

    Estes endereços, feitos para um mecanismo de túnel especial [RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds e RFC 2893 / Transition Mechanisms for IPv6 Hosts and Routers],utilizam um endereço IPv4 já fornecido e a sua possível subnet, e começam com

    2002:

    Por exemplo, este endereço 192.168.1.1/5 ficaria:

    2002:c0a8:0101:5::1

    Um pequeno comando em shell poderia ajudar voce a gerar este endereço, baseado em um endereço IPv4 fornecido:

    ipv4="1.2.3.4"; sla="5"; printf "2002:%02x%02x:%02x%02x:%04x::1" `echo $ipv4
    -¬ | tr "." " "` $sla

    Veja também tunneling using 6to4 e information about 6to4 relay routers.


    3.2.4.3. Designado pelo provedor para roteamento hierárquico

    Este endereço é delegado pelo ISP e começa com

    2001:

    Prefixos de ISP's maiores (ou AS's) são delegados pelos local registries e tem atualmente um tamanho de prefixo /32.

    Qualquer outro ISP/empresa pode solicitar um prefixo de tamanho /48, mas isto depende da política de distribuição de endereços dos registros locais de cada país ou região.


    3.2.4.4. Endereços reservados para exemplos e documentação

    Atualmente, dois blocos de endereço estão reservados para exemplos e documentação. Veja aRFC 3849 / IPv6 Address Prefix Reserved for Documentation:

    3fff:ffff::/32
    -2001:0DB8::/32   EXAMPLENET-WF

    Estes endereços devem ser filtrados baseados no endereço de origem e NÃO devem ser roteados em roteadores de borda em direção à internet, se possível.


    3.2.5. Endereços Multicast

    Endereços Multicast são usados por serviços específicos.

    Eles sempre começam com (xx é o valor de escopo)

    ffxy:

    Existem divisões entre escopo e tipo:


    3.2.5.1. Escopo Multicast

    O escopo Multicast é um parametro usado para especificar a distancia máxima que um pacote multicast pode "viajar" a partir de sua origem.

    Atualmente, os seguintes escopos (ou regiões) estão definidos:

    • ffx1: nó local, os pacotes nunca deixam o nó.

    • ffx2: link-local, os pacotes nunca são encaminhados pelos routers, assim eles nunca deixam o link especificado.

    • ffx5: site-local, os pacotes nunca deixam o site.

    • ffx8: organization-local, os pacotes nunca deixam a organização (não é tão fácil de implementar, mas deve ser coberto pelo protocolo de roteamento).

    • ffxe: escopo global.

    • outros são reservados


    3.2.5.2. Tipos Multicast

    Já existem muitos tipos definidos/reservados (vejaRFC 4291 / IP Version 6 Addressing Architecture para mais detalhes). Alguns exemplos são:

    • Endereço All Nodes: ID = 1h, endereça todos os host no nó local (ff01:0:0:0:0:0:0:1) ou no link conectado (ff02:0:0:0:0:0:0:1).

    • Endereço All Routers: ID = 2h, endereça tosos os routers no nó local (ff01:0:0:0:0:0:0:2), no link conectado (ff02:0:0:0:0:0:0:2), ou no site local (ff05:0:0:0:0:0:0:2)


    3.2.5.3. Endereço multicast solicitado nó link-local

    Um endereço de multicast especial que é usado como endereço de destino para a descoberta da vizinhança , uma vez que no IPv6 não há ARP, como existe no IPv4.

    Um exemplo deste endereço se parece com

    ff02::1:ff00:1234

    Os prefixos usados mostram que este é um endereço multicast link-local. O sufixo é gerado a partir do endereço de destino. Neste exemplo, um pacote deveria ser enviado ao endereço "fe80::1234", mas a parte de rede não conhece o MAC atual deste destino. Ele então substitui os 104 bits mais altos com "ff02:0:0:0:0:1:ff00::/104" e deixa os menores 24 bits intocados. Este endereço então é agora usado no link para achar o nó correspondente que tem que enviar uma resposta contendo o endereço MAC usado na camada 2.


    3.2.6. Endereços Anycast

    Endereços Anycast são endereços especiais e eles são usados para muitas coisas, como o servidor DNS ou DHCP mais próximo, e outras coisas. Estes endereços são obtidos do espaço de endereçamento Unicast (aggregatable global ou site-local). O mecanismo anycast (do ponto de vista do cliente) será tratado pelos protocolos de roteamento dinamico.

    Nota: Endereços anycast não podem ser usados como endereços de origem, pois eles se aplicam somente a endereços de destino.


    3.2.6.1. Endereços Anycast Subnet-router

    Um exemplo simples para um endereço unicast é o anycast subnet-router. Assumindo que um nó tem os seguintes endereços globais IPv6 configurados:

    2001:db8:100:f101:210:a4ff:fee3:9566/64  <- Node's address

    O endereço unicast subnet-router será criado removendo o sufixo (os 64 bits menos significantes) completamente:

    2001:db8:100:f101::/64  <- subnet-router anycast address

    3.3. Tipos de endereço (parte de host)

    Para a auto-configuração e questões de mobilidade, foi decidido usar os 64 bits de menor significado como a parte de host do endereço na maioria dos tipos de endereços atuais. Desta forma, cada subnet pode suportar uma grande quantidade de endereços.

    A parte de host pode ser verificada de maneira distinta:


    3.3.1. Computado automaticamente (também conhecido como stateless)

    Com a auto-configuração, a parte host do endereço é feita através da conversão do endereço MAC da interface (se disponível), através do método EUI-64, para um único endereço IPv6. Se nenhum MAC estiver disponível para este dispositivo (isto acontece bastante em dispositivos virtuais), outra coisa (como o endereço IPv4 ou o MAC da interface física) é usada no lugar.

    Exemplo: uma placa de rede tem o seguinte endereço MAC (48 bit):

    00:10:a4:01:23:45

    Isto poderia ser expandido de acordo com o tutorial do IEEE -IEEE-Tutorial EUI-64 resultando no endereço abaixo:

    0210:a4ff:fe01:2345

    Com um prefixo já fornecido, o resultado é o endereço IPv6 mostrado abaixo:

    2001:0db8:0100:f101:0210:a4ff:fe01:2345

    3.3.1.1. Problema de privacidade com os endereços automaticamente computados e uma solução

    Por causa da parte host do endereço "automaticamente computado" ser único, (exceto quando um fabricante de placas de rede usa o mesmo MAC em mais de um NIC), o rastreamento de um cliente é possível quando não há um proxy de qualquer tipo.

    Este é um problema já conhecido, e a sua solução foi definida através da extensão de privacidade, definida naRFC 3041 / Privacy Extensions for Stateless Address Autoconfiguration in IPv6 (já existe também um novo draft disponível: draft-ietf-ipv6-privacy-addrs-v2-*). Usando um valor estático e um valor randomico, um novo sufixo é gerado de tempos em tempos.

    Nota: isto é somente interessante em conexões finais de clientes, e não é realmente útil para servidores já conhecidos.


    3.3.2. Definido manualmente

    Para servidores, provavelmente é mais fácil se lembrar de endereços mais simples, mas isto também pode ser resolvido. Em IPv6, é possível configurar um endereço adicional para uma interface. Veja o exemplo:

    2001:0db8:100:f101::1

    Para sufixos manuais como o ::1 mostrado acima, é necessário que o sétimo bit mais significativo seja definido como 0 (o bit universal/local do identificador gerado automaticamente). Existe também uma outra combinação de bits (não utilizada) que é reservada para endereços unicast.


    3.4. Tamanho de prefixos para roteamento

    Na fase inicial de projeto e design do IPv6, foi planejada a utilização hierárquica de roteamento para reduzir o tamanho das tabelas de roteamento ao menor valor possível. As razões por trás desta abordagem foram o grande número de rotas nos grandes roteadores de borda (cerca de 300.000 em janeiro de 2011), reduzindo a necessidade de memória nos routers e a capacidade de se utilizar chips ASIC (Application Specified Integrated Circuit) para manipular esta tabela, aumentando a velocidade (uma tabela menor aumenta a velocidade).

    A visão de hoje é que o roteamento será mais hierárquico para redes com somente 1 ISP. Em redes com mais de 1 conexão, isto não é possível, e está sujeita a sistemas multi-homed (informações de multi-homing:drafts-ietf-multi6-*,IPv6 Multihoming Solutions).


    3.4.1. Tamanho de prefixo (também conhecido como "netmasks")

    Semelhante ao IPv4, a rede roteável entra em cena. Por causa da notação do padrão de máscara de rede (128 bits) não parecer bom, os designers utilizaram o mesmo método utilizado no IPv4, chamado Classless Inter Domain Routing (CIDR,RFC 1519 / Classless Inter-Domain Routing)o qual especifica o número de bits do endereço IP que será usado para o roteamento. E ele também é chamado notação "slash".

    Exemplo:

    2001:0db8:100:1:2:3:4:5/48

    Esta notação pode ser expandida:

    • Rede:

    2001:0db8:0100:0000:0000:0000:0000:0000

    • Máscara de rede:

    ffff:ffff:ffff:0000:0000:0000:0000:0000

    3.4.2. Encontrando uma rota

    Em circunstancias normais, (sem QoS), a procura em uma tabela de roteamento resulta na rota mais adequada com o número mais significante de bits do endereço. Em outras palavras, a rota com o maior prefixo tem a preferencia.

    Por exemplo, se uma tabela de rotas mostra as seguintes entradas (a lista é parcial):

    2001:0db8:100::/48     ::            U  1 0 0 sit1 
    -2000::/3               ::192.88.99.1 UG 1 0 0 tun6to4

    Os endereços de destino mostrados dos pacotes IPv6 serão roteados através das interfaces mostradas

    2001:0db8:100:1:2:3:4:5/48  ->  routed through device sit1
    -2001:0db8:200:1:2:3:4:5/48  ->  routed through device tun6to4

    Chapter 4. Verificação do sistema para IPv6

    Antes de voce começar a utilizar o IPv6 em uma máquina com Linux, é necessário testar para saber se seu sistema tem o suporte ao protocolo. Talvez voce tenha que fazer algum ajuste para prepara-lo antes de começar a usar.


    4.1. Kernel com IPv6

    As distribuições mais novas de Linux já tem o kernel com suporte ao IPv6, e este suporte geralmente acontece com a compilação em módulos, mas é possível que estes módulos sejam carregados no momento do boot.

    Nota: voce não deve usar o kernel da série 2.2, porque ele já não é mais atualizado. A série 2.4 também já não tem todas as atualizações de acordo com as últimas RFC's, então recomendamos utilizar um kernel da série 2.6.


    4.1.1. Verificação do suporte a IPv6 no kernel utilizado

    Para verificar se o seu kernel já está com o suporte a IPv6 habilitado, de uma olhada nos arquivos do diretório /proc. A seguinte entrada deve existir:

    /proc/net/if_inet6

    Para quem gosta de scripts, é possível usar estes comandos:

    # test -f /proc/net/if_inet6 && echo "Running kernel is IPv6 ready"

    Se este teste falhar, provavelmente seu sistema não está com os módulos de IPv6 carregados.


    4.1.2. Tentando carregar os módulos para o IPv6

    Voce pode tentar carregar os módulos do IPv6 com o comando

    # modprobe ipv6

    Se a carga ocorreu sem problemas, verifique o status com estes comandos:

    # lsmod |grep -w 'ipv6' && echo "IPv6 module successfully loaded"

    Depois disso, rode os comandos novamente do item 4.1.1 para ter certeza de que está tudo certo.

    Note: a remoção do módulo (rmmod) não é suportada, e recomendo não utilizar, pois pode haver alguma instabilidade no sistema.


    4.1.2.1. Carga automática do módulo

    É possível automatizar a carga do módulo IPv6 conforme seja necessário. Para isto, basta adicionar a seguinte entrada no arquivo de configuração (/etc/modules.conf ou /etc/conf.modules):

    alias net-pf-10 ipv6  # automatically load IPv6 module on demand

    Também é possível desabilitar a carga do módulo automaticamente usando a seguinte entrada:

    alias net-pf-10 off   # disable automatically load of IPv6 module on demand

    Nota: no kernel da série 2.6, o mecanismo carregador de módulos mudou, e o novo arquivo de configuração é o /etc/modprobe.conf.


    4.1.3. Compilando o kernel 2.6 para suportar o IPv6

    Se os dois resultados acima foram negativos, e o seu kernel não tem suporte para o IPv6, então voce tem algumas coisas a fazer:

    • Atualizar a sua distribuição para uma que suporte o IPv6 (recomendado para os novatos)

    • Compilar um novo kernel (fácil, se voce souber quais opções são necessárias)

    • Recompilar os fontes do kernel dado pela sua distribuição (nem sempre tão fácil)

    • Compilar um kernel com as extensões USAGI

    Se voce decidir compilar um kernel, voce precisa ter alguma experiencia nisso e também ler oLinux Kernel HOWTO.

    Uma comparação entre o kernel vanilla e as extensões USAGI está disponível aquiIPv6+Linux-Status-Kernel.


    4.1.3.1. Compilando um kernel vanilla

    Mais detalhes e dicas sobre a compilação de um kernel com suporte a IPv6 pode ser encontrado emIPv6-HOWTO-2#kernel.

    Nota: voce deve usar, sempre que possível, um kernel da séria 2.6, uma vez que o suporte ao IPv6 na série 2.4 já não teve as últimas atualizações definidas nas RFC's, e a série 2.2 não tem mais o suporte atualizado ou mesmo mantido por alguém.


    4.1.3.2. Compilando um kernel com as extensões USAGI

    Para a família vanilla de kernel, recomendado somente para usuários avançados, os quais já estão familiarizados com o IPv6 e com compilação de kernel. Veja tambémUSAGI project / FAQ e Obtaining the best IPv6 support with Linux (Article) (Mirror).


    4.1.4. Dispositivos de rede com suporte a IPv6

    Nem todos os dispositivos de rede tem suporte (ou terão) para transportar pacotes IPv6. Um status atualizado pode ser encontrado emIPv6+Linux-status-kernel.html#transport.

    O maior problema disso é causado na implementação da camada de rede, já que o pacote IPv6 não é reconhecido pelo cabeçalho IP (6 ao invés de 4). Ele é reconhecido pelo protocolo da camada 2 (transporte). Da mesma maneira, qualquer protocolo da camada 2 que não usa numeração de protocolo não conseguirá encaminhar os pacotes IPv6.

    Nota: mesmo assim o pacote ainda é transportado pelo link, mas no lado receptor, o encaminhamento não ocorrerá (voce pode verificar isso com a utilização do tcpdump).


    4.1.4.1. Estes links nunca suportarão IPv6

    • Serial Line IP (SLIP, RFC 1055 / SLIP), deveria ser chamado de SLIPv4, nome do dispositivo: slX

    • Parallel Line IP (PLIP), que nem o SLIP, nome do dispositivo: plipX

    • ISDN com encapsulamento rawip, nome do dispositivo: isdnX


    4.1.4.2. Este link atualmente não suporta IPv6

    • ISDN com encapsulamento syncppp, nome do dispositivo: ipppX (problema de projeto do ipppd, que deveria ter sido resolvido com um PPP mais generalista na série de kernel 2.5)


    4.2. Ferramentas de configuração de rede que suportam IPv6

    Voce não irá muito longe, se voce estiver rodando um kernel com suporte a IPv6, mas não tiver ferramentas que o ajudem a configurar o IPv6. Existem vários pacotes para ajudá-lo neste trabalho.


    4.2.1. Pacote net-tools

    O pacote net-tools inclui algumas ferramentas como ifconfig e route, que ajudam a configurar uma interface em IPv6. Veja a saída dos comandos ifconfig -? ou route -?, se eles mostrarem algo parecido com IPv6 ou inet6, então a ferramenta tem suporte a IPv6.

    Novamente, para quem gosta de scripts:

    # /sbin/ifconfig -? 2>& 1|grep -qw 'inet6' && echo "utility 'ifconfig' is
    -¬ IPv6-ready"

    Verificando o route:

    # /sbin/route -? 2>& 1|grep -qw 'inet6' && echo "utility 'route' is IPv6-ready"

    4.2.2. Pacote iproute

    Alexey N. Kuznetsov (atual mantenedor do código de rede no Linux) criou um grupo de ferramentas que configuram redes através do dispositivo netlink. O uso destas ferramentas dá mais funcionalidades do que as do pacote net-tools, mas elas não estão muito bem documentadas e não são para os fracos de coração.

    # /sbin/ip 2>&1 |grep -qw 'inet6' && echo "utility 'ip' is IPv6-ready"

    Se o programa /sbin/ip não for encontrado em seu sistema, então eu recomendo que voce instale o pacote iproute.

    • Voce pode pega-lo através de sua distribuição (se houver)

    • Voce pode procurar o pacote RPM emRPMfind/iproute (em alguns casos é recomendada a reconstrução do SRPMS)


    4.3. Programas de teste e debug IPv6

    Após a preparação do seu sistema para o IPv6, está na hora de usar este protocolo para a sua comunicação com outros sistemas. Primeiro voce deve aprender como analisar os pacotes através de um sniffer. Isto é altamente recomendável para que qualquer debug ou troubleshooting seja feito de maneira rápida.


    4.3.1. Ping IPv6

    Este programa está incluído no pacote iputils. Seu objetivo é enviar e testar o transporte de pacotes ICMPv6 echo-request packets e aguardar pelos pacotes ICMPv6 echo-reply.

    Uso

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

    Exemplo

    # 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

    Dica: o comando ping6 precisa de acesso direto ao socket e por isso precisa de permissão de root. Então se usuários comuns (não-root) tentarem usar o ping6 e não obtiverem sucesso, podem ser um dos dois problemas:

    1. ping6 não está na variável PATH deste usuário (provavelmente porque o ping6 é geralmente localizado em /usr/sbin, e adicionar este diretório ao path do usuário comum não é muito recomendado)

    2. ping6 não executa corretamente, geralmente porque faltam permissões de root. A sugestão neste caso é executar o comando chmod u+s /usr/sbin/ping6 para permitir o uso do programa.


    4.3.1.1. Especificando a interface para o ping em IPv6

    Ao usar um endereço link-local para pingar alguém em IPv6 o kernel pode não reconhecer ou saber através de qual interface (física ou virtual) o pacote deve ser enviado. Por causa disso, a seguinte mensagem de erro deve aparecer:

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

    Neste caso, voce precisa especificar qual interface deve ser usada para enviar o pacote, como mostrado abaixo:

    # 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 para endereços multicast

    Um mecanismo interessante para detectar hosts com endereço IPv6 é pingar o endereço all-node multicast:

    # 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!) 

    Diferente do IPv4, onde as respostas ao ping para endereços de broadcast podem ser desabilitadas, em IPv6 este comportamento não pode ser desabilitado, exceto pela utilização de um firewall IPv6 local.


    4.3.2. Traceroute6 IPv6

    Este programa geralmente está incluso no pacote iputils. É um programa conhecido, similar ao do IPv4. Veja o exemplo:

    # traceroute6 www.6bone.net 
    -traceroute to 6bone.net (3ffe:b00:c18:1::10) from 2001:0db8:0000:f101::2, 30
    -¬ hops max, 16 byte packets 
    - 1 localipv6gateway (2001:0db8: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: diferente das versões mais atuais co traceroute do IPv4, que usa pacotes ICMPv4 echo-request e pacotes UDP (default), o traceroute do IPv6 só é capaz de enviar pacotes UDP. Como voce já deve saber, pacotes ICMP echo-request são mais aceitos pelos firewalls e listas de acesso (ACL) de routers do que pacotes UDP.


    4.3.3. Tracepath6 IPv6

    Este programa costuma estar incluído no pacote iputils. É um programa similar ao traceroute6 e ele traça o caminho para um endereço dado, descobrindo o MTU ao longo deste caminho. Veja o exemplo abaixo:

    # 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

    No Linux, o tcpdump é a maior ferramenta para a captura de pacotes. Abaixo estão alguns exemplos. O suporte ao IPv6 já está adicionado nas versões 3.6 ou superiores deste programa.

    O tcpdump usa diversas expressões e argumentos para realizar a filtragem de pacotes para minimizar o volume de informações apresentado:

    • icmp6: filtra o tráfego ICMPv6 nativo

    • ip6: filtra o tráfego nativo IPv6 (incluindo ICMPv6)

    • proto ipv6: filtra o tráfego IPv6 tunelado em IPv4 (IPv6-in-IPv4)

    • not port ssh: para evitar mostrar os pacotes se voce estiver usando uma conexão SSH

    Além disso, algumas opções são muito úteis para obter mais informações de cada pacote, bem interessantes para pacotes ICMPv6:

    • "-s 512": aumenta o tamanho do pacote capturado para 512 bytes. Se for usada a opção "-s 0" o pacote é capturado por inteiro

    • "-s 512": aumenta o tamanho do pacote capturado para 512 bytes. Se for usada a opção "-s 0" o pacote é capturado por inteiro

    • "-n": não resolve os endereços para nomes, muito útil quando o DNS reverso não está funcionando corretamente


    4.3.4.1. Ping IPv6 para 2001:0db8:100:f101::1 nativo sobre um link local

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

    4.3.4.2. Ping IPv6 para 2001:0db8:100::1 roteado através de um túnel IPv6-in-IPv4

    Os endereços IPv4 1.2.3.4 e 5.6.7.8 são os tunnel endpoints (todos os endereços são exemplos)

    # 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 > 2001:0db8:100::1: icmp6: echo request
    -¬ (len 64, hlim 64) (DF) (ttl 64, id 0, len 124) 
    -5.6.7.8 > 1.2.3.4: 2001:0db8: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 > 2001:0db8:100::1: icmp6: echo request
    -¬ (len 64, hlim 64) (DF) (ttl 64, id 0, len 124) 
    -5.6.7.8 > 1.2.3.4: 2001:0db8:100::1 > 2002:ffff:f5f8::1: icmp6: echo reply (len
    -¬ 64, hlim 61) (ttl 23, id 29919, len 124)

    4.4. Programas com suporte a IPv6

    As distribuições Linux atuais já contém a maioria dos serviços Cliente e Servidor em IPv6. Veja aqui emIPv6+Linux-Status-Distribution. Se ainda não estiver incluído, voce pode verificar em IPv6 & Linux - Current Status - Applications se o programa já está portado para o IPv6 e pronto para o Linux. Para os programas mais comuns existem dicas disponíveis emIPv6 & Linux - HowTo - Part 3 e IPv6 & Linux - HowTo - Part 4.


    4.5. Programas cliente com suporte a IPv6

    Para executar os testes abaixo, é necessário que seu sistema seja um host IPv6 e os exemplos mostrados podem ser feitos se voce tiver acesso ao 6bone.


    4.5.1. Verificando a resolução DNS para endereços IPv6

    Por causa dos updates de segurança aplicados nos últimos anos, o Servidor DNS que roda a versão mais atual já tem a capacidade de entender os endereços IPv6 tipo AAAA (o named A6 mais novo ainda não é usado porque só no BIND9 o suporte aos root domais ARPA IP6 está em uso). Um teste bem simples para ver o sistema resolver endereços IPv6 é:

    # host -t AAAA www.join.uni-muenster.de

    e a resposta deve ser alguma coisa parecida com isso:

    www.join.uni-muenster.de. is an alias for tolot.join.uni-muenster.de. 
    -tolot.join.uni-muenster.de. has AAAA address
    -¬ 2001:638:500:101:2e0:81ff:fe24:37c6

    4.5.2. Cliente de Telnet com suporte a IPv6

    Cliente de telnet com suporte a IPv6 estão disponíveis. Um teste simples pode ser feito com o comando:

    $ 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 o cliente de telnet não entende o IPv6, a mensagem de erro será "cannot resolve hostname".


    4.5.3. SSH com suporte a IPv6

    4.5.3.1. openssh

    As versões atuais do openssh já suportam IPv6. Dependendo da configuração utilizada, ele tem dois comportamentos:

    • --without-ipv4-default: o cliente tenta se conectar primeiro em IPv6, e ele usa IPv4 se a conexão em IPv6 não for estabelecida

    • --with-ipv4-default: a conexão é feita primeiro em IPv4 e para usar algum endereço IPv6, deve-se forçar a sua utilização. Veja o exemplo

    $ ssh -6 ::1 
    -user@::1's password: ****** 
    -[user@ipv6host user]$

    Se seu cliente ssh não entende a opção "-6" então o suporte a IPv6 não está habilitado, como muitos pacotes de ssh na versão 1.


    4.5.3.2. ssh.com

    O software cliente e servidor SSH da SSH.com já suporta o IPv6 e agora ele é grátis para todos os Linux e FreeBSD, independente se o seu uso é pessoal ou comercial.


    4.5.4. Browsers com suporte a IPv6

    O status atual dos browsers com suporte a IPv6 pode ser encontrado aquiIPv6+Linux-status-apps.html#HTTP.

    A maioria deles ainda tem problemas pendentes, tais como:

    1. Se a configuração de proxy usa somente endereços IPv4, os pedidos em IPv6 também serão enviados a este proxy, emas como o proxy não saberá resolver o endereço, o pedido não vai funcionar. A única solução é verificar se o seu software de proxy tem alguma atualização para resolver este problema.

    2. Configuração automática de proxy (*.pac) não pode ser utilizada para manipular pedidos em IPv6 de maneira diferenciada (exemplo: não usar o proxy para o IPv6) por causa da sua natureza (escritos em Javascript e muito encrustado no código fonte, como é visto no Mozilla).

    As versões anteriores de browsers também não entenderiam uma URL com o endereço IPv6, como no exemplo http://[2001:4dd0:f838:a006::6]/ (isto funciona somente se a URL for usada em um browser que suporte IPv6).

    Um pequeno teste é tentar este endereço em um browser sem o proxy configurado.


    4.5.4.1. URLs para teste

    Um bom ponto de partida para browsers que usam IPv6 é o sitehttp://www.kame.net/.Se a tartaruga da página estiver animada, a sua conexão é em IPv6. caso contrário, a tartaruga ficará parada.


    4.6. Programas servidores com suporte a IPv6

    Nesta parte deste HowTo, outros softwares cliente IPv6 são mencionados, assim como dicas para servidores com suporte a IPv6, como sshd, httpd, telnetd, etc, assim como outras dicas emHints for IPv6-enabled daemons.


    4.7. FAQ (checagem de sistema com suporte a IPv6)

    4.7.1. Usando ferramentas

    4.7.1.1. Q: Não consigo pingar (ping6) o endereço link-local

    Mensagem de erro: "connect: Invalid argument"

    O kernel não conhece qual interface física ou virtual voce quer utilizar para enviar o pacote ICMPv6. Assim, a solução poderia aparecer assim.

    Solução:: Determine a interface, como: "ping6 -I eth0 fe80::2e0:18ff:fe90:9205", veja tambémprogram ping6 usage.


    4.7.1.2. Q: Não consigo pingar (ping6) ou efetuar traceroute (traceroute6) como usuário normal

    Menagem de erro: "icmp socket: Operation not permitted"

    Estes utilitários criam pacotes especiais ICMPv6 e então os enviam. Isto é feito usando conexões brutas no kernel. Mas estas conexões somente podem ser usadas pelo usuário "root". Desta forma, esta mensagem vai aparecer para os usuários normais.

    Solução: Se for realmente necessário que todos os usuários utilizem estas ferramentas, voce pode adicionar o "suid" bit usando o comando "chmod u+s /caminho/para/o/programa", e veja também este linkprogram ping6 usageSe nem todos os usuários necessitam usá-lo, voce pode mudar o grupo do programa, para "wheel" por exemplo, e todos os usuários pertencentes a este grupo poderão executar estes programas sem problema. Voce também pode configurar o "sudo" para isto também.


    Chapter 5. Configurando interfaces

    5.1. Dispositivos de rede diferentes

    Em um nó, podem haver diferentes tipos de interfaces. Elas podem estar agrupadas em classes

    • Físicas, como eth0, tr0

    • Virtuais, como ppp0, tun0, tap0, sit0, isdn0, ippp0


    5.1.1. Físicas

    As interfaces físicas, como Ethernet ou Token Ring são exemplos de interfaces comuns que não precisam de qualquer tipo de tratamento especial.


    5.1.2. Virtuais

    As interfaces virtuais sempre precisam de algum tratamento especial


    5.1.2.1. Interfaces Túnel IPv6-in-IPv4

    Estas interfaces normalmente recebem o nome sitx. O nome sit é uma atalho para Simple Internet Transition. Esta interface tem a capacidade de encapsular os pacotes IPv6 em pacotes IPv4 e tunelar estes pacotes para um endpoint remoto.

    A interface sit0 tem um papel especial e não pode ser usada para túneis dedicados.


    5.1.2.2. Interfaces PPP

    As interfaces PPP obteem sua capacidade IPv6 do daemon PPP para IPv6.


    5.1.2.3. Interfaces ISDN HDLC

    A capacidade IPv6 para HDLC com encapsulamento IP já está contida no kernel


    5.1.2.4. Interfaces ISDN PPP

    A interface ISDN PPP (ippp) não tem o suporte ao IPv6 no kernel. E também não há qualquer plano para suportar, porque o kernel da série 2.5 ele será substituído por uma camada de interface PPP mais genérica.


    5.1.2.5. SLIP + PLIP

    Como mencionado anteriormente neste documento, esta interface não suporta o IPv6 (no envio até que funciona, mas a recepção não funciona).


    5.1.2.6. Dispositivo Ether-tap

    Dispositivos Ether-tap já possuem o IPv6 habilitado e o stateless configurado. Para usá-lo, o módulo "ethertap" deve ter sido carregado antes.


    5.1.2.7. Dispositivos tun

    Atualmente não foi testado por mim


    5.1.2.8. ATM

    01/2002: Não são mais suportados pelo kernel vanilla, mas somente pelas extensões USAGI


    5.1.2.9. Outras

    Eu esqueci de alguma ?


    5.2. Colocando as interfaces em up e down

    Existem dois métodos usados para colocar as interfaces em up ou down..


    5.2.1. Usando "ip"

    Uso:

    # ip link set dev <interface> up
    -# ip link set dev <interface> down

    Exemplo:

    # ip link set dev eth0 up
    -# ip link set dev eth0 down

    5.2.2. Usando "ifconfig"

    Uso:

    # /sbin/ifconfig <interface> up
    -# /sbin/ifconfig <interface> down

    Exemplo:

    # /sbin/ifconfig eth0 up
    -# /sbin/ifconfig eth0 down

    Chapter 6. Configurando endereços IPv6

    Existem várias maneiras de configurar um endereço IPv6 em uma interface. As mais comuns são "ifconfig" e "ip".


    6.1. Mostrando os endereços IPv6 existentes

    Antes de mais nada, voce precisa checar se já existe algum endereço IPv6 configurado e qual é o seu tipo (talvez atribuído durante uma auto-configuração stateless).


    6.1.1. Usando "ip"

    Uso:

    # /sbin/ip -6 addr show dev <interface>

    Exemplo para uma configuração de host estático:

    # /sbin/ip -6 addr show dev eth0
    -2: eth0: <BROADCAST,MULTICAST,UP&gt; mtu 1500 qdisc pfifo_ fast qlen 100
    -inet6 fe80::210:a4ff:fee3:9566/10 scope link
    -inet6 2001:0db8:0:f101::1/64 scope global
    -inet6 fec0:0:0:f101::1/64 scope site 

    Exemplo de um host auto-configurado

    Aqui voce pode ver a configuração de IPv6 através do processo auto-magically, além do tempo de vida do endereço.

    # /sbin/ip -6 addr show dev eth0 
    -3: eth0: <BROADCAST,MULTICAST,PROMISC,UP&gt; mtu 1500 qdisc pfifo_fast qlen
    -¬ 100 
    -inet6 2002:d950:f5f8:f101:2e0:18ff:fe90:9205/64 scope global dynamic 
    -valid_lft 16sec preferred_lft 6sec 
    -inet6 3ffe:400:100:f101:2e0:18ff:fe90:9205/64 scope global dynamic 
    -valid_lft 2591997sec preferred_lft 604797sec inet6 fe80::2e0:18ff:fe90:9205/10
    -¬ scope link

    6.1.2. Usando "ifconfig"

    Uso:

    # /sbin/ifconfig <interface>

    Exemplo (a saída foi filtrada com o grep para mostrar somente os endereços IPv6). Aqui voce pode ver diferentes endereços IPv6 com diferentes escopos.

    # /sbin/ifconfig eth0 |grep "inet6 addr:"
    -inet6 addr: fe80::210:a4ff:fee3:9566/10 Scope:Link
    -inet6 addr: 2001:0db8:0:f101::1/64 Scope:Global
    -inet6 addr: fec0:0:0:f101::1/64 Scope:Site

    6.2. Adicionando um endereço IPv6

    A adição de um endereço IPv6 é muito similar ao endereço "IP ALIAS" nas interfaces IPv4 no Linux.


    6.2.1. Usando "ip"

    Uso:

    # /sbin/ip -6 addr add <ipv6address>/<prefixlength> dev <interface> 

    Exemplo:

    # /sbin/ip -6 addr add 2001:0db8:0:f101::1/64 dev eth0 

    6.2.2. Usando "ifconfig"

    Uso:

    # /sbin/ifconfig <interface> inet6 add <ipv6address>/<prefixlength>

    Exemplo:

    # /sbin/ifconfig eth0 inet6 add 2001:0db8:0:f101::1/64 

    6.3. Removendo um endereço IPv6

    Como esta ação não é tão necessária, tenha cuidado ao remover endereços IPv6 que não existem, pois ao realizar esta ação em kernels mais antigos, voce pode causar um grande estrago no sistema.


    6.3.1. Usando "ip"

    Uso:

    # /sbin/ip -6 addr del <ipv6address>/<prefixlength> dev <interface> 

    Exemplo:

    # /sbin/ip -6 addr del 2001:0db8:0:f101::1/64 dev eth0 

    6.3.2. Usando "ifconfig"

    Uso:

    # /sbin/ifconfig <interface> inet6 del <ipv6address>/<prefixlength>

    Exemplo:

    # /sbin/ifconfig eth0 inet6 del 2001:0db8:0:f101::1/64

    Chapter 7. Configurando rotas IPv6

    Se voce quer deixar seu link e quer enviar pacotes a todo o mundo que está só aguardando a sua conexão em IPv6, voce vai precisar de uma rota. Se já houver um router com IPv6 habilitado (e uma rota para ele), estes passos abaixo vão te ensinar como adicionar mais rotas em IPv6.


    7.1. Mostrando as rotas IPv6 existentes

    Antes de mais nada, é interessante verificar quais são as rotas IPv6 já configuradas (talvez atribuído durante uma auto-configuração).


    7.1.1. Usando "ip"

    Uso:

    # /sbin/ip -6 route show [dev <device>]

    Exemplo:

    # /sbin/ip -6 route show dev eth0
    -2001:0db8: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. Usando "route"

    Uso:

    # /sbin/route -A inet6 

    Exemplo (a saída foi filtrada para a interface eth0). Aqui voce pode ver rotas IPv6 para diferentes endereços em uma única interface.

    # /sbin/route -A inet6 |grep -w "eth0"
    -2001:0db8:0:f101 ::/64 :: UA  256 0 0 eth0 <- Interface route for global
    -¬ address
    -fe80::/10        ::       UA  256 0 0 eth0 <- Interface route for link-local
    -¬ address
    -ff00::/8         ::       UA  256 0 0 eth0 <- Interface route for all multicast
    -¬ addresses
    -::/0             ::       UDA 256 0 0 eth0 <- Automatic default route

    7.2. Adicionando uma rota IPv6 através de um gateway

    Bastante necessário quando se quer acessar outras redes com IPv6 usando um router IPv6-enabled em seu link.


    7.2.1. Usando "ip"

    Uso:

    # /sbin/ip -6 route add <ipv6network>/<prefixlength> via <ipv6address>
    -¬ [dev <device>]

    Exemplo:

    # /sbin/ip -6 route add 2000::/3 via 2001:0db8:0:f101::1

    7.2.2. Usando "route"

    Uso:

    # /sbin/route -A inet6 add <ipv6network>/<prefixlength> gw
    -¬ <ipv6address> [dev <device>] 

    Um dispositivo pode ser necessário se o dispositivo do endereço IPv6 do gateway for um dispositivo link local.

    Veja o exemplo abaixo, como adicionar uma rota para todos os endereços globais (2000::/3) através do gateway 2001:0db8:0:f101::1

    # /sbin/route -A inet6 add 2000::/3 gw 2001:0db8:0:f101::1

    7.3. Removendo uma rota IPv6 através de um gateway

    Não é geralmente usada no modo manual, pois sugerimos a utilização de scripts ou shutdown nas interfaces (todas ou por interface)


    7.3.1. Usando "ip"

    Uso:

    # /sbin/ip -6 route del <ipv6network>/<prefixlength> via <ipv6address>
    -¬ [dev <device>]

    Exemplo:

    # /sbin/ip -6 route del 2000::/3 via 2001:0db8:0:f101::1

    7.3.2. Usando "route"

    Uso:

    # /sbin/route -A inet6 del <network>/<prefixlength> gw <ipv6address> [dev
    -¬ <device>]

    Exemplo para remover a rota adicionada anteriormente (acima):

    # /sbin/route -A inet6 del 2000::/3 gw 2001:0db8:0:f101::1

    7.4. Adicionando uma rota IPv6 através de uma interface

    Nem sempre usado, mas quando usado é em links ponto a ponto.


    7.4.1. Usando "ip"

    Uso:

    # /sbin/ip -6 route add <ipv6network>/<prefixlength> dev <device>
    -¬ metric 1

    Exemplo:

    # /sbin/ip -6 route add 2000::/3 dev eth0 metric 1

    A métrica "1" é usada aqui para se manter compatível com as métricas usadas pelo comando route, já que a métrica default ao se usar "ip" é "1024".


    7.4.2. Usando "route"

    Uso:

    # /sbin/route -A inet6 add <ipv6network>/<prefixlength> dev <device>

    Exemplo:

    # /sbin/route -A inet6 add 2000::/3 dev eth0 

    7.5. Removendo uma rota IPv6 através de uma interface

    Nem sempre utilizado manualmente, pois recomenda-se a utilização de scripts.


    7.5.1. Usando "ip"

    Uso:

    # /sbin/ip -6 route del <ipv6network>/<prefixlength> dev <device>

    Exemplo:

    # /sbin/ip -6 route del 2000::/3 dev eth0 

    7.5.2. Usando "route"

    Uso:

    # /sbin/route -A inet6 del <network>/<prefixlength> dev <device>

    Exemplo:

    # /sbin/route -A inet6 del 2000::/3 dev eth0

    7.6. FAQ para rotas em IPv6

    7.6.1. Suporte de uma rota default IPv6

    Uma boa idéia do IPv6 foi o roteamento hierárquico, o que proporcionaria a necessidade de menos rotas nos roteadores.

    Aqui estão alguns problemas no kernel atual do Linux:


    7.6.1.1. Clientes (não roteando qualquer pacote!)

    Um cliente pode configurar uma rota default prefixo "::/0", mas eles também aprendem uma rota no processo de auto configuração, ex.: uso do radvd no link abaixo mostra:

    # 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. Roteadores em caso de packet forwarding

    Os linux mais velhos (pelo menos inferiores ao kernel 2.4.17) não suportam rotas default. Voce pode configura-las, mas a pesquisa na tabela vai retornar uma falha quando deveria ser encaminhado (intenção normal do roteador). Se voce ainda está usando uma versão antiga de kernel, as "rotas default" podem ser configuradas usando o prefixo de endereço global "2000::/3".

    Nota: tome cuidado com as rotas default sem filtragem de endereços em roteadores de borda, pois o tráfego multicast ou site-local pode sair para o mundo.


    Chapter 8. Descoberta de vizinhos

    A descoberta de vizinhos funciona como um sucessor do ARP (Address Resolution Protocol) em IPv4, no mundo IPv6. Voce pode obter estas informações sobre os vizinhos atuais, e adicionalmente voce pode configurar e excluir entradas. O kernel mantém o rastreamento das descobertas bem sucedidas (como no ARP em IPv4). Voce pode pesquisar as entradas nesta tabela usando o comando "ip".


    8.1. Mostrando os vizinhos usando "ip"

    Com o comando abaixo voce pode verificar a tabela de vizinhos aprendida ou configurada

    # ip -6 neigh show [dev <device>]

    O exemplo a seguir mostra um vizinho, o qual é um router acessível

    # ip -6 neigh show
    -fe80::201:23ff:fe45:6789 dev eth0 lladdr 00:01:23:45:67:89 router nud reachable

    8.2. Manipulando a tabela de vizinhos usando "ip"

    8.2.1. Adicionando uma entrada manualmente

    Com o comando abaixo, voce consegue adicionar uma entrada manualmente

    # ip -6 neigh add <IPv6 address> lladdr <link-layer address> dev <device>

    Exemplo:

    # ip -6 neigh add fec0::1 lladdr 02:01:02:03:04:05 dev eth0

    8.2.2. Excluindo uma entrada manualmente

    Similar à adição de uma entrada, uma entrada pode ser excluída

    # ip -6 neigh del <IPv6 address> lladdr <link-layer address> dev <device>

    Exemplo:

    # ip -6 neigh del fec0::1 lladdr 02:01:02:03:04:05 dev eth0

    8.2.3. Opções mais avançadas

    A ferramenta "ip" não é tão documentada, mas é bem útil e forte. Veja o seu help online para mais informações:

    # 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 ]

    Aparentemente algumas opções são somente para o IPv4... e se voce quiser contribuir com mais informações sobre outras opções da ferramenta e usos avançados, por favor, me envie.


    Chapter 9. Configurando um túnel IPv6-in-IPv4

    Se voce quer deixar seu link e ter uma rede IPv6 à sua volta, voce vai precisar de um túnel IPv6-in-IPv4 para acessar a web em modo IPv6.

    Existem alguns tipos de mecanismo e também algumas possibilidades da configuração deste túnel.


    9.1. Tipos de túneis

    Existe mais de uma possibilidade de transportar pacotes IPvb6 em links IPv4.


    9.1.1. Túnel estático ponto a ponto: 6bone

    Um túnel ponto a ponto é um túnel dedicado em direção a um ponto final., o qual sabe informações sobre uma rede IPv6A (para rotas de volta) e os endereços IPv4 deste túnel estão definidos na RFC 2893 / Transition Mechanisms for IPv6 Hosts and Routers. Necessidades:

    • O endereço IPv4 local do túnel precisa ser estático, global, único e acessível a partir da outra ponta

    • Um prefixo global IPv6 deve ser designado a voce (veja o registro 6bone)

    • Um ponto final remoto do túnel deve ser capaz de rotear seu prefixo IPv6para seu ponto final local (uma configuração manual pode ser necessária)


    9.1.2. Túnel automático

    Um túnel automático acontece quando um nó diretamente conectado a outro nó obtém um IPv4 do outro nó anterior.


    9.1.3. 6to4-Tunneling

    O túnel 6to4 (RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds) utiliza um mecanismo simples para criar túneis automáticos. Cada nó com um endereço global único é capaz de ser uma ponta final de um túnel 6to4 (se nenhum firewall no meio do caminho bloquear este tipo de tráfego). Túneis 6to4 não costumam ser túneis um a um. Este tipo de túnel pode ser dividido em Upstream e Downstream. Além disso, um endereço especial IPv6 indica que este nó vai usar o tunelamento 6to4 para se conectar a redes IPv6 mundiais.


    9.1.3.1. Geração de prefixo 6to4

    O endereço 6to4 está definido abaixo (o esquema foi pego da RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds):

    |   3+13   |    32     |    16  |            64 bits             | 
    -+---+------+-----------+--------+--------------------------------+ 
    -|  FP+TLA  |  V4ADDR   | SLA ID |           Interface ID         | 
    -|  0x2002  |           |        |                                | 
    -+---+------+-----------+--------+--------------------------------+

    FP e TLA juntos (16 bits) tem o valor 0x2002. V4ADDR é o endereço único IPv4 (em notação hexadecimal). SLA é o identificador de rede (65536 redes locais possíveis) e são usados para representar a sua estrutura de rede local.

    Para os gateways, tal prefixo é gerado normalmente usando o SLA “0000” e o sufixo "::1" (não é uma exigencia, pode ser arbitrário com um escopo local) e então assinalado a uma interface de túnel 6to4. Veja que a Microsoft também utiliza V4ADDR para o sufixo.


    9.1.3.2. Tunelamento Upstream 6to4

    O nó tem que saber para qual ponta remota de túnel os pacotes IPv4 com pacotes IPv6 devem ser encaminhados. No início dos tempos de tunelamento 6to4, upstreams dedicados aceitavam que os routers fizessem isso. Veja NSayer's 6to4 information para uma lista de routers.

    Hoje em dia, os routers upstream 6to4 podem ser encontrados automaticamente, usando o endereço de unicast 192.88.99.1. Os protocolos de roteamento se incumbem desta função, veja RFC 3068 / An Anycast Prefix for 6to4 Relay Routers para mais detalhes.


    9.1.3.3. Tunelamento Downstream 6to4

    O downstream (6bone -> seu nó com 6to4 habilitado) não é realmente correto e pode variar de um host remoto estranho que originou os pacotes que foram enviados a voce. Existem duas possibilidades:

    • Estes hosts remotos usam endereços 6to4 e enviam os pacotes de volta diretamente a seu nó (veja abaixo)

    • Estes hosts remotos enviam os pacotes de volta à rede IPv6 e dependendo do roteamento, um router no meio do caminho cria um túnel automaticamente em direção ao seu nó.


    9.1.3.4. Tráfego 6to4 possível

    • 6to4 para 6to4: normalmente é um túnel direto entre as duas pontas, ambos habilitados em 6to4

    • 6to4 para não-6to4: é enviado via um túnel upstream

    • não-6to4 para 6to4: é enviado via um túnel downstream


    9.2. Mostrando os túneis existentes

    9.2.1. Usando "ip"

    Uso:

    # /sbin/ip -6 tunnel show [<device>]

    Exemplo:

    # /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. Usando "route"

    Uso:

    # /sbin/route -A inet6 

    Exemplo (a saída está filtrada para mostrar somente os túneis através da interface virtual 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. Configuração de um túnel ponto a ponto

    Existem possibilidades para adicionar ou remover um túnel ponto a ponto.

    Uma boa informação adicional sobre a configuração de túneis fornecida através do comando “ip” está aqui Configuring tunnels with iproute2 (article) (Mirror).


    9.3.1. Adicionando túneis ponto a ponto

    9.3.1.1. Usando "ip"

    Um método comum para a criação de uma quantidade pequena de túneis.

    Use-o para criar um dispositivo túnel (mas não depois, o TTL também deve ser especificado, porque seu valor default é 0).

    # /sbin/ip tunnel add <device> mode sit ttl <ttldefault> remote
    -¬ <ipv4addressofforeigntunnel> local <ipv4addresslocal>

    Uso (exemplo genérico para 3 túneis):

    # /sbin/ip tunnel add sit1 mode sit ttl <ttldefault> remote
    -¬ <ipv4addressofforeigntunnel1> local <ipv4addresslocal>
    -# /sbin/ip link set dev sit1 up
    -# /sbin/ip -6 route add <prefixtoroute1> dev sit1 metric 1
    -
    -# /sbin/ip tunnel add sit2 mode sit ttl <ttldefault>
    -¬ <ipv4addressofforeigntunnel2> local <ipv4addresslocal>
    -# /sbin/ip link set dev sit2 up
    -# /sbin/ip -6 route add <prefixtoroute2> dev sit2 metric 1
    -
    -# /sbin/ip tunnel add sit3 mode sit ttl <ttldefault>
    -¬ <ipv4addressofforeigntunnel3> local <ipv4addresslocal>
    -# /sbin/ip link set dev sit3 up
    -# /sbin/ip -6 route add <prefixtoroute3> dev sit3 metric 1

    9.3.1.2. Usando "ifconfig" e "route" (obsoleto)

    Esta não é uma maneira muito recomendada de se criar um túnel porque ele é um pouco estranho. Não há qualquer problema se voce adicionar somente um, mas se voce for configurar mais de um, voce não poderá desfazer os primeiros túneis criados e deixar os últimos em funcionamento.

    Uso (exemplo genérico para 3 túneis):

    # /sbin/ifconfig sit0 up
    -
    -# /sbin/ifconfig sit0 tunnel <ipv4addressofforeigntunnel1>
    -# /sbin/ifconfig sit1 up
    -# /sbin/route -A inet6 add <prefixtoroute1> dev sit1
    -
    -# /sbin/ifconfig sit0 tunnel <ipv4addressofforeigntunnel2>
    -# /sbin/ifconfig sit2 up
    -# /sbin/route -A inet6 add <prefixtoroute2> dev sit2
    -
    -# /sbin/ifconfig sit0 tunnel <ipv4addressofforeigntunnel3>
    -# /sbin/ifconfig sit3 up
    -# /sbin/route -A inet6 add <prefixtoroute3> dev sit3

    Importante: NÃO USE ISSO, porque esta configuração habilita implicitamente um “tunelamento automático” de qualquer lugar na internet, e isto é um risco, então não o utilize.


    9.3.1.3. Usando somente "route"

    Também é possível configurar túneis no modo Non Broadcast Multiple Access (NBMA), pois é uma maneira fácil de adicionar muitos túneis de uma vez. Mas nenhum dos túneis pode ser numerado (o que não é uma característica).

    Uso (exemplo genérico para 3 túneis):

    # /sbin/ifconfig sit0 up
    -
    -# /sbin/route -A inet6 add <prefixtoroute1> gw
    -¬ ::<ipv4addressofforeigntunnel1> dev sit0
    -# /sbin/route -A inet6 add <prefixtoroute2> gw
    -¬ ::<ipv4addressofforeigntunnel2> dev sit0
    -# /sbin/route -A inet6 add <prefixtoroute3> gw
    -¬ ::<ipv4addressofforeigntunnel3> dev sit0

    Importante: NÃO USE ISSO, porque esta configuração habilita implicitamente um “tunelamento automático” de qualquer lugar na internet, e isto é um risco, então não o utilize.


    9.3.2. Removendo os túneis ponto a ponto

    Nem sempre é necessário fazer isso manualmente, mas pode ser usado em scripts para uma limpeza ou restart de uma configuração IPv6.


    9.3.2.1. Usando "ip"

    Uso para remover um dispositivo túnel:

    # /sbin/ip tunnel del <device>

    Uso (exemplo genérico para 3 túneis):

    # /sbin/ip -6 route del <prefixtoroute1> dev sit1
    -# /sbin/ip link set sit1 down
    -# /sbin/ip tunnel del sit1
    -
    -# /sbin/ip -6 route del <prefixtoroute2> dev sit2
    -# /sbin/ip link set sit2 down
    -# /sbin/ip tunnel del sit2
    -
    -# /sbin/ip -6 route del <prefixtoroute3> dev sit3
    -# /sbin/ip link set sit3 down
    -# /sbin/ip tunnel del sit3

    9.3.2.2. Usando "ifconfig" e "route" (não é mais usado por ser estranho)

    Não somente a criação é estranha, como também o shutdown... voce tem que remover os tuneis na ordem inversa em que eles foram criados.

    Uso (exemplo genérico para 3 túneis):

    # /sbin/route -A inet6 del <prefixtoroute3> dev sit3
    -# /sbin/ifconfig sit3 down
    -
    -# /sbin/route -A inet6 del <prefixtoroute2> dev sit2
    -# /sbin/ifconfig sit2 down
    -
    -# /sbin/route -A inet6 add <prefixtoroute1> dev sit1
    -# /sbin/ifconfig sit1 down
    -
    -# /sbin/ifconfig sit0 down

    9.3.2.3. Usando "route"

    Isto é como remover rotas normais em IPv6.

    Uso (exemplo genérico para 3 túneis):

    # /sbin/route -A inet6 del <prefixtoroute1> gw
    -¬ ::<ipv4addressofforeigntunnel1> dev sit0
    -# /sbin/route -A inet6 del <prefixtoroute2> gw
    -¬ ::<ipv4addressofforeigntunnel2> dev sit0
    -# /sbin/route -A inet6 del <prefixtoroute3> gw
    -¬ ::<ipv4addressofforeigntunnel3> dev sit0
    -
    -# /sbin/ifconfig sit0 down

    9.3.3. Tuneis ponto a ponto numerados

    Às vezes é necessário configurar túneis ponto a ponto com endereços IPv6 como em IPv4. Isto somente é possível utilizando o primeiro (ifconfig+route - obsoleto) e o terceiro (ip+route) modo de configuração. Em tais casos, voce pode adicionar os endereços IPv6 na interface de túnel conforme é mostrado na configuração de uma interface.


    9.4. Configuração de túneis 6to4

    Preste atenção pois o suporte aos túneis 6to4 atualmente não está implementado completamente no kernel vanilla da série 2.2.x (veja systemcheck/kernel para mais detalhes). Veja também que o tamanho do prefixo para um endereço 6to4 é 16, uma vez que do ponto de vista da rede, todos os outros hosts habilitados para 6to4 estão na mesma camada 2.


    9.4.1. Adição de um túnel 6to4

    Antes de tudo, voce precisa calcular o seu prefixo 6to4 usando o seu endereço público IPv4 (se seu host não tem este endereço, é possível utilizar um NAT no router de borda em alguns casos especiais):

    Assumindo que o seu endereço IPv4 seja este

    1.2.3.4

    o prefixo 6to4 gerado será este

    2002:0102:0304::

    Gateways locais 6to4 deveriam (mas não é uma regra fixa, pois voce pode escolher um sufixo arbitrário, se voce preferir) sempre assinalar o sufixo "::1", desta forma seu endereço local 6to4 será este

    2002:0102:0304::1

    Por exemplo, use a seguinte automação:

    ipv4="1.2.3.4"; printf "2002:%02x%02x:%02x%02x::1" `echo $ipv4 | tr "." " "`

    Atualmente existem duas maneiras possíveis de configurar um túnel 6to4.


    9.4.1.1. Usando "ip" e um dispositivo de túnel dedicado

    Esta é a maneira recomendada (um TTL deve ser especificado, pois o valor default é 0).

    Criando um dispositivo de túnel

    # /sbin/ip tunnel add tun6to4 mode sit ttl <ttldefault> remote any local
    -¬ <localipv4address> 

    Ativando a interface

    # /sbin/ip link set dev tun6to4 up 

    Adicionando o endereço local 6to4 na interface (nota: o tamanho do prefixo - /16 - é importante!)

    # /sbin/ip -6 addr add <local6to4address>/16 dev tun6to4 

    Adicionando uma rota default para a rede global IPv6 usando o endereço anycast IPv4 todos-6to4-router

    # /sbin/ip -6 route add 2000::/3 via ::192.88.99.1 dev tun6to4 metric 1

    É sabido que algumas versões do comando "ip" (exemplo SuSE Linux 9.0) não suportam endereços IPv6 no formato compatível IPv4 para seus gateways, e neste caso o endereço IPv6 relativo a ele deve ser usado:

    # /sbin/ip -6 route add 2000::/3 via 2002:c058:6301::1 dev tun6to4 metric 1

    9.4.1.2. Usando "ifconfig" e "route" e um dispositivo de túnel genérico "sit0" (obsoleto)

    Este método está obsoleto porque o uso de um túnel genérico sit0 não permite especificar filtros pelo dispositivo.

    Ativando a interface genérica sit0

    # /sbin/ifconfig sit0 up 

    Adicionando um endereço 6to4 na interface

    # /sbin/ifconfig sit0 add <local6to4address>/16

    Adicionando uma rota default para a rede global IPv6 usando o endereço anycast IPv4 todos-6to4-router

    # /sbin/route -A inet6 add 2000::/3 gw ::192.88.99.1 dev sit0

    9.4.2. Removendo um túnel 6to4

    9.4.2.1. Usando "ip" e um dispositivo de túnel dedicado

    Remova todas as rotas que utilizam este dispositivo

    # /sbin/ip -6 route flush dev tun6to4

    Desligue a interface

    # /sbin/ip link set dev tun6to4 down

    Remova o dispositivo criado

    # /sbin/ip tunnel del tun6to4 

    9.4.2.2. Usando "ifconfig" e "route" e o dispositivo genérico de túnel "sit0" (obsoleto)

    Remova as rotas default que usam esta interface

    # /sbin/route -A inet6 del 2000::/3 gw ::192.88.99.1 dev sit0

    Remova o endereço local 6to4 desta interface

    # /sbin/ifconfig sit0 del <local6to4address>/16

    Desligue o dispositivo genérico de túnel (cuidado com isto, pois ela ainda pode estar em uso...)

    # /sbin/ifconfig sit0 down 

    Chapter 10. Configurando túneis IPv4-in-IPv6

    A RFC 2473 / Generic Packet Tunneling in IPv6 Specification especifica o mecanismo para tunelar diferentes tipos de pacotes em IPv6 incluindo IPv4.

    NOTAE: O suporte para túneis IPv4-in-IPv6 está disponível somente a partir da versão de kernel 2.6.22.


    10.1. Mostrando os túneis existentes

    Uso:

    # /sbin/ip -6 tunnel show [<device>]

    Exemplo:

    # /sbin/ip -6 tunnel show mode any
    -ip6tnl0: ipv6/ipv6 remote :: local :: encaplimit 0 hoplimit 0 tclass 0x00
    -¬ flowlabel 0x00000 (flowinfo 0x00000000)
    -ip6tnl1: ip/ipv6 remote fd00:0:0:2::a local fd00:0:0:2::1 dev eth1 encaplimit 4
    -¬ hoplimit 64 tclass 0x00 flowlabel 0x00000 (flowinfo 0x00000000)

    NOTA: Se voce não incluir "mode any", somente os túneis IPv6-in-IPv6 serão mostrados.


    10.2. Configuração de túnel ponto a ponto

    Uso para criar um dispositivo de túnel 4over6

    # /sbin/ip tunnel add <device> mode ip4ip6 remote <ipv6addressofforeigntunnel>
    -¬ local <ipv6addresslocal>

    Uso (exemplo genérico para 3 túneis):

    # /sbin/ip -6 tunnel add ip6tnl1 mode ip4ip6 remote
    -¬ <ipv6addressofforeigntunnel1> local <ipv6addresslocal>
    -# /sbin/ip link set dev ip6tnl1 up 
    -# /sbin/ip -6 route add <prefixtoroute1> dev ip6tnl1 metric 1
    -
    -# /sbin/ip -6 tunnel add ip6tnl2 mode ip4ip6 remote
    -¬ <ipv6addressofforeigntunnel2> local <ipv6addresslocal>
    -# /sbin/ip link set dev ip6tnl2 up
    -# /sbin/ip -6 route add <prefixtoroute2> dev ip6tnl2 metric 1
    -
    -# /sbin/ip -6 tunnel add ip6tnl3 mode ip4ip6 remote
    -¬ <ipv6addressofforeigntunnel3> local <ipv6addresslocal>
    -# /sbin/ip link set dev ip6tnl3 up
    -# /sbin/ip -6 route add <prefixtoroute3> dev ip6tnl3 metric 1

    10.3. Removendo túneis ponto a ponto

    Uso ara remover um dispositivo de túnel:

    # /sbin/ip -6 tunnel del <device>

    Uso (exemplo genérico para 3 túneis):

    # /sbin/ip -6 route del <prefixtoroute1> dev ip6tnl1
    -# /sbin/ip link set ip6tnl1 down
    -# /sbin/ip -6 tunnel del ip6tnl1
    -
    -# /sbin/ip -6 route del <prefixtoroute2> dev ip6tnl2
    -# /sbin/ip link set ip6tnl2 down
    -# /sbin/ip -6 tunnel del ip6tnl2
    -
    -# /sbin/ip -6 route del <prefixtoroute3> dev ip6tnl3
    -# /sbin/ip link set ip6tnl3 down
    -# /sbin/ip -6 tunnel del ip6tnl3 

    Chapter 11. Configuraçoes de Kernel nos arquivos do /proc

    Nota: a fonte desta seção é em sua maioria o arquivo "ip-sysctl.txt", o qual está incluído no diretório "Documentation/networking" do código fonte do kernel usado. Crédito para Pekka Savola pela manutençao da parte IPv6 neste arquivo. Além disso, muito do que está escrito abaixo é um Copy & Paste deste arquivo mencionado.


    11.1. Como acessar os arquivos do /proc

    11.1.1. Usando "cat" e "echo"

    Usar os comandos "cat" e "echo" é a maneira mais simples de acessar os arquivos deste diretório, mas alguns pontos devem ser observados:

    • O sistema de arquivos /proc deve estar habilitado no kernel , ou seja, a seguinte chave deve estar configurada

    CONFIG_PROC_FS=y

    • O sistema de arquivos já deve estar montado, o que pode ser testado como comando

    # mount | grep "type proc"
    -none on /proc type proc (rw)

    • Voce pode ler e também escrever (geralmente como root) nos arquivos contidos aqui (/proc)

    Normalmente, somente as entradas localizadas em /proc/sys/* podem ser alteradas, as demais são somentepara leitura e para obtenção de informações.


    11.1.1.1. Obtendo um valor

    O valor de uma entrada pode ser obtido com o comando "cat":

    # cat /proc/sys/net/ipv6/conf/all/forwarding
    -0

    11.1.1.2. Definindo um valor

    Um novo valor pode ser definido (se a entrada aceitar a escrita) através do comando "echo":

    # echo "1" >/proc/sys/net/ipv6/conf/all/forwarding

    11.1.2. Usando "sysctl"

    O uso do programa "syysctl" para acessar as chaves do kernel é uma maneira moderna utilizada hoje em dia. Voce também pode usar se o sistema de arquivos /proc não estiver montado. Mas voce só terá acesso às entradas /proc/sys/*!

    O programa "sysctl" está incluído no pacote "procps" (em sistemas Red Hat Linux).

    • A interface do sysctl deve estar habilitada no kernel, então a seguinte chave deve estar habilitada

    CONFIG_SYSCTL=y

    11.1.2.1. Obtendo um valor

    O valor de uma entrada pode ser obtida da seguinte maneira:

    # sysctl net.ipv6.conf.all.forwarding
    -net.ipv6.conf.all.forwarding = 0

    11.1.2.2. Definindo um valor

    Um novo valor pode ser definido (se a entrada aceitar a escrita):

    # sysctl -w net.ipv6.conf.all.forwarding=1
    -net.ipv6.conf.all.forwarding = 1

    Nota: Não use espaços entre o sinal = para definir os valores. Se forem possíveis diversos valores, coloque-os entre aspas

    # sysctl -w net.ipv4.ip_local_port_range="32768 61000"
    -net.ipv4.ip_local_port_range = 32768 61000

    11.1.2.3. Adicionais

    Nota: Existem versões em campo que mostram "/" ao invés de "."

    Para mais detalhes, de uma olhada na manpage do sysctl.

    Dica: para achar mais rapidamente as definiçoes, use a opçao "-a" (mostra todas as entradas) junto com o comando "grep".


    11.1.3. Valores encontrados nas entradas /proc

    Existem vários formatos vistos no sistema de arquivos /proc:

    • BOOLEANO: simplesmente um "0" (falso) ou um "1" (verdadeiro)

    • INTEIRO: um valor inteiro, também pode ser sem sinal

    • linhas mais sofisticadas com muitos valores: às vezes uma linha de cabeçalho também é mostrada, senão, uma olhada no código fonte do kernel pode ser necessário para entender o significado dos valores apresentados...


    11.2. Entradas em /proc/sys/net/ipv6/

    11.2.1. conf/default/*

    Muda as configurações específicas da interface.


    11.2.2. conf/all/*

    Muda todas as configurações esoecíficas da interface.

    Exceção: "conf/all/forwarding" tem um significado diferente aqui


    11.2.2.1. conf/all/forwarding

    • Tipo: BOOLEANO

    Isto habilita o encaminhamento de pacotes IPv6 entre todas as interfaces.

    Em IPv6 voce não pode controlar o envio de pacotes por dispositivo. este encaminhamento deve ser feito através de regras do IPv6-netfilter (controlado com ip6tables) e especificando os dispositivos de entrada e saída (veja Firewalling/Netfilter6 para mais detalhes). Isto é diferente no IPv4, onde é possível controlar o encaminhamento por dispositivo (a decisão é feita na interface onde o pacote entra).

    Isto também define todas as interfaces do host e/ou router para o valor especificado. Veja os detalhes abaixo. Esta definição refere-se ao encaminhamento global.

    Se este valor é 0, nenhum pacote IPv6 é encaminhado, os pacotes nunca deixarão outra interface, seja ela física ou lógica, como os túneis.


    11.2.3. conf/interface/*

    Muda configurações especiais por interface.

    O comportamento funcional de certos ajustes é diferente, dependendo se o encaminhamento local está habilitado ou não.


    11.2.3.1. accept_ra

    • Tipo: BOOLEAN

    • Ajuste default: habilitado se o encaminhamento local está desabilitado, e desabilitado se o encaminhamento local está habilitado.

    Aceita Router Advertisements, e configura automaticamente esta interface com os dados recebidos.


    11.2.3.2. accept_redirects

    • Tipi: BOOLEAN

    • Ajuste default: habilitado se o encaminhamento local está desabilitado, e desabilitado se o encaminhamento local está habilitado.

    Aceita os Redirects enviados por um router IPv6.


    11.2.3.3. autoconf

    • Tipo: BOOLEAN

    • Ajuste default: habilitado se o accept_ra_pinfo está babilitado, e desabilitado se o accept_ra_pinfo estiver desabilitado.

    Os endereços e prefixos usados na configuração automática proveem de anúncios dos routers.


    11.2.3.4. dad_transmits

    • Tipo: INTEGER

    • Default: 1

    Quantidade de probes de detecção de endereços duplicados enviados.


    11.2.3.5. forwarding

    • Tipo: BOOLEAN

    • Default: FALSE se o encaminhamento global estiver desabilitado (default), caso contrário TRUE

    Comportamento Host/Router específico.

    Nota: É recomendado ter a mesma configuração em todas as interfaces; cenários diferentes são bem incomuns.

    • Valor FALSE: Por default, o comportamento do Host é assumido. Isto significa:

    1. O flag IsRouter não está definido em aúncios de vizinhança.

    2. Solicitaçoes Router são enviados quando necessário.

    3. Se accept_ra é TRUE (default), aceita anúncios router (e fazem auti configuração).

    4. Se accept_redirects é TRUE (default), aceita Redirects.

    • Valor TRUE: se o encaminhamento local está habilitado, o comportamento Router é assumido. Isto significa que o contrário da lista acima pode acontecer:

    1. O flag IsRouter é definido nos anúncios de vizinhança.

    2. Solicitaçoes Router não são enviadas.

    3. Anúncios Router são ignorados.

    4. Redirects são ignorados.


    11.2.3.6. hop_limit

    • Tipo: INTEGER

    • Default: 64

    Hop Limit default para definir.


    11.2.3.7. mtu

    • Tipo: INTEGER

    • Default: 1280 (mínimo necessário no IPv6)

    Default Maximum Transfer Unit


    11.2.3.8. router_solicitation_delay

    • Tipo: INTEGER

    • Default: 1

    Número de segundos a esperar após a interface ser ativada antes de enviar solicitaçoes Router.


    11.2.3.9. router_solicitation_interval

    • Tipo: INTEGER

    • Default: 4

    Número de segundos a esperar entre solicitaçoes Router.


    11.2.3.10. router_solicitations

    • Tipo: INTEGER

    • Default: 3

    Número de solicitaçoes Router a enviar até assumir que não há um router presente.


    11.2.4. neigh/default/*

    Muda as definiçoes default para detecçao de vizinhos e alguns valores globais e de limites:


    11.2.4.1. gc_thresh1

    • Tipo: INTEGER

    • Default: 128

    Precisa ser preenchido.


    11.2.4.2. gc_thresh2

    • Tipo: INTEGER

    • Default: 512

    Precisa ser preenchido.


    11.2.4.3. gc_thresh3

    • Tipo: INTEGER

    • Default: 1024

    Parametro para o tamanho da tabela de vizinhança.

    Aumente este valor se voce tem muitas interfaces e os routers começam a apresentar problemas misteriosos de funcionamento e falhas. Ou se uma mensagem dessas aparecer Zebra (routing daemon):

    ZEBRA: netlink-listen error: No buffer space available, type=RTM_NEWROUTE(24),
    -¬ seq=426, pid=0

    11.2.4.4. gc_interval

    • Tipo: INTEGER

    • Default: 30

    Precisa ser preenchido.


    11.2.5. neigh/interface/*

    Muda ajustes especiais por interface para detecção de vizinhos.


    11.2.5.1. anycast_delay

    • Tipo: INTEGER

    • Default: 100

    Precisa ser preenchido.


    11.2.5.2. gc_stale_time

    • Tipo: INTEGER

    • Default: 60

    Precisa ser preenchido.


    11.2.5.3. proxy_qlen

    • Tipo: INTEGER

    • Default: 64

    Precisa ser preenchido.


    11.2.5.4. unres_qlen

    • Tipo: INTEGER

    • Default: 3

    Precisa ser preenchido.


    11.2.5.5. app_solicit

    • Tipo: INTEGER

    • Default: 0

    Precisa ser preenchido.


    11.2.5.6. locktime

    • Tipo: INTEGER

    • Default: 0

    Precisa ser preenchido.


    11.2.5.7. retrans_time

    • Tipo: INTEGER

    • Default: 100

    Precisa ser preenchido.


    11.2.5.8. base_reachable_time

    • Tipo: INTEGER

    • Default: 30

    Precisa ser preenchido.


    11.2.5.9. mcast_solicit

    • Tipo: INTEGER

    • Default: 3

    Precisa ser preenchido.


    11.2.5.10. ucast_solicit

    • Tipo: INTEGER

    • Default: 3

    Precisa ser preenchido


    11.2.5.11. delay_first_probe_time

    • Tipo: INTEGER

    • Default: 5

    Precisa ser preenchido.


    11.2.5.12. proxy_delay

    • Tipo: INTEGER

    • Default: 80

    Precisa ser preenchido.


    11.2.6. route/*

    Ajustes globais para roteamento.


    11.2.6.1. flush

    Removido nas novas versões de kernel - Precisa ser preenchido.


    11.2.6.2. gc_interval

    • Tipo: INTEGER

    • Default: 30

    Precisa ser preenchido.


    11.2.6.3. gc_thresh

    • Tipo: INTEGER

    • Default: 1024

    Precisa ser preenchido.


    11.2.6.4. mtu_expires

    • Tipo: INTEGER

    • Default: 600

    Precisa ser preenchido.


    11.2.6.5. gc_elasticity

    • Tipo: INTEGER

    • Default: 0

    Precisa ser preenchido.


    11.2.6.6. gc_min_interval

    • Tipo: INTEGER

    • Default: 5

    Precisa ser preenchido.


    11.2.6.7. gc_timeout

    • Tipo: INTEGER

    • Default: 60

    Precisa ser preenchido.


    11.2.6.8. min_adv_mss

    • Tipo: INTEGER

    • Default: 12

    Precisa ser preenchido.


    11.2.6.9. max_size

    • Tipo: INTEGER

    • Default: 4096

    Precisa ser preenchido.


    11.3. Entradas relacionadas a IPv6 em /proc/sys/net/ipv4/

    Neste momento (e será até que o IPv6 seja completamente convertido para um módulo independente do kernel) algumas chaves para IPv6 são usadas aqui.


    11.3.1. ip_*

    11.3.1.1. ip_local_port_range

    Esta definição também é usada para o IPv6.


    11.3.2. tcp_*

    Esta definição também é usada para o IPv6.


    11.3.3. icmp_*

    Esta definição não é usada para o IPv6. Para habilitar o limite ICMPv6 (o que é muito recomendado) regras netfilter-v6 devem ser usadas.


    11.3.4. others

    Desconhecido, mas provavelmente não usado pelo IPv6.


    11.4. Entradas em /proc/net relacionadas com IPv6

    No /proc/net existem diversas variáveis disponíveis, somente para leitura, Não é possível obter informaçoes através do "sysctl", então utilize "cat".


    11.4.1. if_inet6

    • Tipo: Uma linha por endereço contendo vários valores

    Aqui todos os endereços IPv6 cpnfigurados são mostrados em um formato especial. O exemplo mostra somente a interface de loopback. O significado é mostrado abaixo (veja "net/ipv6/addrconf.c" para mais informações).

    # cat /proc/net/if_inet6
    -00000000000000000000000000000001 01 80 10 80 lo
    -+------------------------------+ ++ ++ ++ ++ ++
    -|                                |  |  |  |  |
    -1                                2  3  4  5  6

    1. Endereço IPv6 mostrado em hexadecimal (32 caracteres) sem os dois pontos ":" como separadores

    2. Número do dispositivo netlink (índice da interface) em hexadecimal (veja “ip addr” , também)

    3. tamanho do prefixo, em hexadecimal

    4. Valor do escopo (veja o fonte do kernel " include/net/ipv6.h" e "net/ipv6/addrconf.c" para mais informações)

    5. Flags da interface (veja "include/linux/rtnetlink.h" e"net/ipv6/addrconf.c" para mais informações)

    6. Nome do disppositivo


    11.4.2. ipv6_route

    • Tipo: Uma linha por rota contém várias valores

    Aqui toda a configuração de rotas em IPv6 é mostrada em um formato especialt. O exemplo mostra informações somente para a interface de loopback O significado é mostrado abaixo (veja "net/ipv6/route.c" para mais informações).

    # 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. Rede de destino IPv6 mostrada em hexadecimal (32 caracteres) som dois pontos ":" como separador

    2. Tamanho do prefixo de destino, em hexadecimal

    3. Rede de origem IPv6 mostrada em hexadecimal (32 caracteres) som dois pontos ":" como separador

    4. Tamanho do prefixo de origem, em hexadecimal

    5. Próximo salto IPv6 mostrado em hexadecimal (32 caracteres) som dois pontos ":" como separador

    6. Métrica em hexadecimal

    7. Contador de referencia

    8. Contadoer de uso

    9. Flags

    10. Nome do dispositivo


    11.4.3. sockstat6

    • Tipo: Uma linha por protocolo, com descrição e valor

    Estatísticas sobre o uso de sockets IPv6. Exemplo:

    # cat /proc/net/sockstat6
    -TCP6: inuse 7 
    -UDP6: inuse 2 
    -RAW6: inuse 1 
    -FRAG6: inuse 0 memory 0

    11.4.4. tcp6

    Precisa ser preenchido.


    11.4.5. udp6

    Precisa ser preenchido.


    11.4.6. igmp6

    Precisa ser preenchido.


    11.4.7. raw6

    Precisa ser preenchido.


    11.4.8. ip6_flowlabel

    Precisa ser preenchido.


    11.4.9. rt6_stats

    Precisa ser preenchido.


    11.4.10. snmp6

    • Tipo: Uma linha por descrição SNMP e valor

    Estatísticas SNMP podem ser obtidas via um servidor SNMP e suas MIB's relacionadas, através um software de gerencia de rede.


    11.4.11. ip6_tables_names

    Tabelas netfilter6 disponíveis


    Chapter 12. Netlink-Interface to kernel

    To be filled...I have no experience with that...


    Chapter 13. Address Resolver

    Name to IPv4 or IPv6 address resolving is usually done using a libc resolver library. There are some issues known using the function getaddrinfo.

    More info can be found at Linux & IPv6: getaddrinfo and search domains - Research and RFC 3484 on Linux.

    More to be filled later...


    Chapter 14. Network debugging

    14.1. Server socket binding

    14.1.1. Using “netstat” for server socket binding check

    It's always interesting which server sockets are currently active on a node. Using “netstat” is a short way to get such information:

    Used options: -nlptu

    Example:

    # 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

    14.2. Examples for tcpdump packet dumps

    Here some examples of captured packets are shown, perhaps useful for your own debugging...

    ...more coming next...


    14.2.1. Router discovery

    14.2.1.1. 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=2001:0db8:0:1::/64)(src lladdr:
    -¬ 0:12:34:12:34:50) (len 88, hlim 255)

    Router with link-local address “fe80::212:34ff:fe12:3450” send an advertisement to the all-node-on-link multicast address “ff02::1” containing two prefixes “2002:0102:0304:1::/64” (lifetime 30 s) and “2001:0db8:0:1::/64” (lifetime 2592000 s) including its own layer 2 MAC address “0:12:34:12:34:50”.


    14.2.1.2. 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)

    Node with link-local address “fe80::212:34ff:fe12:3456” and layer 2 MAC address “0:12:34:12:34:56” is looking for a router on-link, therefore sending this solicitation to the all-router-on-link multicast address “ff02::2”.


    14.2.2. Neighbor discovery

    14.2.2.1. Neighbor discovery solicitation for duplicate address detection

    Following packets are sent by a node with layer 2 MAC address “0:12:34:12:34:56” during autoconfiguration to check whether a potential address is already used by another node on the link sending this to the solicited-node link-local multicast address.

    • Node wants to configure its link-local address “fe80::212:34ff:fe12:3456”, checks for duplicate now

    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)

    • Node wants to configure its global address “2002:0102:0304:1:212:34ff:fe12:3456” (after receiving advertisement shown above), checks for duplicate now

    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)

    • Node wants to configure its global address “2001:0db8:0:1:212:34ff:fe12:3456” (after receiving advertisement shown above), checks for duplicate now

    15:44:22.304028 :: > ff02::1:ff12:3456: icmp6: neighbor sol: who has
    -¬ 2001:0db8:0:1:212:34ff:fe12:3456(src lladdr: 0:12:34:12:34:56) (len 32, hlim
    -¬ 255)

    14.2.2.2. Neighbor discovery solicitation for looking for host or gateway

    • Node wants to send packages to “2001:0db8:0:1::10” but has no layer 2 MAC address to send packet, so send solicitation now

    13:07:47.664538 2002:0102:0304:1:2e0:18ff:fe90:9205 > ff02::1:ff00:10: icmp6:
    -¬ neighbor sol: who has 2001:0db8:0:1::10(src lladdr: 0:e0:18:90:92:5) (len 32,
    -¬ hlim 255)

    • Node looks for “fe80::10” now

    13:11:20.870070 fe80::2e0:18ff:fe90:9205 > ff02::1:ff00:10: icmp6: neighbor
    -¬ sol: who has fe80::10(src lladdr: 0:e0:18:90:92:5) (len 32, hlim 255)

    Chapter 15. Support for persistent IPv6 configuration in Linux distributions

    Some Linux distribution contain already support of a persistent IPv6 configuration using existing or new configuration and script files and some hook in the IPv4 script files.


    15.1. Red Hat Linux and “clones”

    Since starting writing the IPv6 & Linux - HowTo it was my intention to enable a persistent IPv6 configuration which catch most of the wished cases like host-only, router-only, dual-homed-host, router with second stub network, normal tunnels, 6to4 tunnels, and so on. Nowadays there exists a set of configuration and script files which do the job very well (never heard about real problems, but I don't know how many use the set). Because this configuration and script files are extended from time to time, they got their own homepage: initscripts-ipv6 homepage (Mirror). Because I began my IPv6 experience using a Red Hat Linux 5.0 clone, my IPv6 development systems are mostly Red Hat Linux based now, it's kind a logic that the scripts are developed for this kind of distribution (so called historic issue). Also it was very easy to extend some configuration files, create new ones and create some simple hook for calling IPv6 setup during IPv4 setup.

    Fortunately, in Red Hat Linux since 7.1 a snapshot of my IPv6 scripts is included, this was and is still further on assisted by Pekka Savola.

    Mandrake since version 8.0 also includes an IPv6-enabled initscript package, but a minor bug still prevents usage (“ifconfig” misses “inet6” before “add”).


    15.1.1. Test for IPv6 support of network configuration scripts

    You can test, whether your Linux distribution contain support for persistent IPv6 configuration using my set. Following script library should exist:

    /etc/sysconfig/network-scripts/network-functions-ipv6

    Auto-magically test:

    # test -f /etc/sysconfig/network-scripts/network-functions-ipv6 && echo "Main
    -¬ IPv6 script library exists"

    The version of the library is important if you miss some features. You can get it executing following (or easier look at the top of the file):

    # source /etc/sysconfig/network-scripts/network-functions-ipv6 &&
    -¬ getversion_ipv6_functions 
    -20011124

    In shown example, the used version is 20011124. Check this against latest information on initscripts-ipv6 homepage (Mirror) to see what has been changed. You will find there also a change-log.


    15.1.2. Short hint for enabling IPv6 on current RHL 7.1, 7.2, 7.3, ...

    • Check whether running system has already IPv6 module loaded

    # modprobe -c | grep net-pf-10
    -alias net-pf-10 off

    • If result is “off”, then enable IPv6 networking by editing /etc/sysconfig/network, add following new line

    NETWORKING_IPV6=yes

    • Reboot or restart networking using

    # service network restart

    • Now IPv6 module should be loaded

    # modprobe -c | grep ipv6
    -alias net-pf-10 ipv6

    If your system is on a link which provides router advertisement, autoconfiguration will be done automatically. For more information which settings are supported see /usr/share/doc/initscripts-$version/sysconfig.txt.


    15.2. SuSE Linux

    In newer 7.x versions there is a really rudimentary support available, see /etc/rc.config for details.

    Because of the really different configuration and script file structure it is hard (or impossible) to use the set for Red Hat Linux and clones with this distribution. -In versions 8.x they completly change their configuration setup.


    15.2.2. SuSE Linux 8.0

    15.2.2.1. IPv6 address configuration

    Edit file /etc/sysconfig/network/ifcfg-<Interface-Name> and setup following value

    IP6ADDR="<ipv6-address>/<prefix>"

    15.2.2.2. Additional information

    See file /usr/share/doc/packages/sysconfig/README


    15.2.3. SuSE Linux 8.1

    15.2.3.1. IPv6 address configuration

    Edit file /etc/sysconfig/network/ifcfg-<Interface-Name> and setup following value

    IPADDR="<ipv6-address>/<prefix>"

    15.2.3.2. Additional information

    See file /usr/share/doc/packages/sysconfig/Network


    15.3. Debian Linux

    Following information was contributed by Stephane Bortzmeyer <bortzmeyer at nic dot fr>

    1. Be sure that IPv6 is loaded, either because it is compiled into the kernel or because the module is loaded. For the latest, three solutions, adding it to /etc/modules, using the pre-up trick shown later or using kmod (not detailed here).

    2. Configure your interface. Here we assume eth0 and address (2001:0db8:1234:5::1:1). Edit /etc/network/interfaces:

    iface eth0 inet6 static
    -        pre-up modprobe ipv6
    -        address 2001:0db8:1234:5::1:1
    -        # To suppress completely autoconfiguration:
    -        # up echo 0 > /proc/sys/net/ipv6/conf/all/autoconf
    -        netmask 64
    -        # The router is autoconfigured and has no fixed address.
    -        # It is magically
    -        # found. (/proc/sys/net/ipv6/conf/all/accept_ra). Otherwise:
    -        #gateway 2001:0db8:1234:5::1

    And you reboot or you just

    # ifup --force eth0

    and you have your static address.


    15.3.1. Further information


    Chapter 16. Auto-configuration

    16.1. Stateless auto-configuration

    Is supported and seen on the assigned link-local address after an IPv6-enabled interface is up.

    Example:

    # ip -6 addr show dev eth0 scope link
    -2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qlen1000
    -    inet6 fe80::211:d8ff:fe6b:f0f5/64 scope link
    -       valid_lft forever preferred_lft forever 

    16.3. Dynamic Host Configuration Protocol v6 (DHCPv6)

    After a long time discussing issues, finally RFC 3315 / Dynamic Host Configuration Protocol for IPv6 (DHCPv6) was finished. At time updating this part (10/2005) currently two implementations are available:


    Chapter 17. Mobility

    17.1. Common information

    17.1.1. Node Mobility

    Support for IPv6 mobility can be enabled in Linux by installing the MIPL2 implementation found at: http://www.mobile-ipv6.org/

    This implementation is compliant with RFC 3775. It is composed of a kernel patch and a mobility daemon called mip6d. Version 2.0.1 applies on Linux kernel 2.6.15.

    Installation and setup are described in the Linux Mobile IPv6 HOWTO.


    17.1.2. Network Mobility

    There also exists an implementation of network mobility for Linux, it is called NEPL and is based on MIPL. It can also be downloaded from: http://www.mobile-ipv6.org/.

    The HOWTO document describing setup and configuration is available at: http://www.nautilus6.org/doc/nepl-howto/.


    Chapter 18. Firewalling

    IPv6 firewalling is important, especially if using IPv6 on internal networks with global IPv6 addresses. Because unlike at IPv4 networks where in common internal hosts are protected automatically using private IPv4 addresses like RFC 1918 / Address Allocation for Private Internets or Automatic Private IP Addressing (APIPA)Google search for Microsoft + APIPA, in IPv6 normally global addresses are used and someone with IPv6 connectivity can reach all internal IPv6 enabled nodes.


    18.1. Firewalling using netfilter6

    Native IPv6 firewalling is only supported in kernel versions 2.4+. In older 2.2- you can only filter IPv6-in-IPv4 by protocol 41.

    Attention: no warranty that described rules or examples can really protect your system!

    Audit your ruleset after installation, see Section 19.3 for more.

    Since kernel version 2.6.20 IPv6 connection tracking is fully working (and does not break IPv4 NAT anymore like versions before)


    18.2. Preparation

    This step is only needed if distributed kernel and netfilter doesn't fit your requirements and new features are available but still not built-in.


    18.2.1. Get sources

    Get the latest kernel source: http://www.kernel.org/

    Get the latest iptables package:


    18.2.2. Extract sources

    Change to source directory:

    # cd /path/to/src 

    Unpack and rename kernel sources

    # tar z|jxf kernel-version.tar.gz|bz2 
    -# mv linux linux-version-iptables-version+IPv6 

    Unpack iptables sources

    # tar z|jxf iptables-version.tar.gz|bz2 

    18.2.3. Apply latest iptables/IPv6-related patches to kernel source

    Change to iptables directory

    # cd iptables-version 

    Apply pending patches

    # make pending-patches KERNEL_DIR=/path/to/src/linux-version-iptables-version/ 

    Apply additional IPv6 related patches (still not in the vanilla kernel included)

    # make patch-o-matic KERNEL_DIR=/path/to/src/linux-version-iptables-version/ 

    Say yes at following options (iptables-1.2.2)

    • ah-esp.patch

    • masq-dynaddr.patch (only needed for systems with dynamic IP assigned WAN connections like PPP or PPPoE)

    • ipv6-agr.patch.ipv6

    • ipv6-ports.patch.ipv6

    • LOG.patch.ipv6

    • REJECT.patch.ipv6

    Check IPv6 extensions

    # make print-extensions 
    -Extensions found: IPv6:owner IPv6:limit IPv6:mac IPv6:multiport

    18.2.4. Configure, build and install new kernel

    Change to kernel sources

    # cd /path/to/src/linux-version-iptables-version/ 

    Edit Makefile

    - EXTRAVERSION = 
    -+ EXTRAVERSION = -iptables-version+IPv6-try 

    Run configure, enable IPv6 related

                Code maturity level options 
    -                  Prompt for development and/or incomplete code/drivers : yes 
    -            Networking options 
    -                  Network packet filtering: yes 
    -                  The IPv6 protocol: module 
    -                       IPv6: Netfilter Configuration 
    -                             IP6 tables support: module 
    -                             All new options like following: 
    -                                   limit match support: module 
    -                                   MAC address match support: module 
    -                                   Multiple port match support: module 
    -                                   Owner match support: module 
    -                                   netfilter MARK match support: module 
    -                                   Aggregated address check: module 
    -                                   Packet filtering: module 
    -                                        REJECT target support: module 
    -                                        LOG target support: module 
    -                                   Packet mangling: module 
    -                                   MARK target support: module 

    Configure other related to your system, too

    Compilation and installing: see the kernel section here and other HOWTOs


    18.2.5. Rebuild and install binaries of iptables

    Make sure, that upper kernel source tree is also available at /usr/src/linux/

    Rename older directory

    # mv /usr/src/linux /usr/src/linux.old 

    Create a new softlink

    # ln -s /path/to/src/linux-version-iptables-version /usr/src/linux 

    Rebuild SRPMS

    # rpm --rebuild /path/to/SRPMS/iptables-version-release.src.rpm 

    Install new iptables packages (iptables + iptables-ipv6)

    • On RH 7.1 systems, normally, already an older version is installed, therefore use "freshen"

    # rpm -Fhv /path/to/RPMS/cpu/iptables*-version-release.cpu.rpm 

    • If not already installed, use "install"

    # rpm -ihv /path/to/RPMS/cpu/iptables*-version-release.cpu.rpm 

    • On RH 6.2 systems, normally, no kernel 2.4.x is installed, therefore the requirements don't fit. Use "--nodeps" to install it

    # rpm -ihv --nodeps /path/to/RPMS/cpu/iptables*-version-release.cpu.rpm 

    Perhaps it's necessary to create a softlink for iptables libraries where iptables looks for them

    # ln -s /lib/iptables/ /usr/lib/iptables 

    18.3. Usage

    18.3.1. Check for support

    Load module, if so compiled

    # modprobe ip6_tables 

    Check for capability

    # [ ! -f /proc/net/ip6_tables_names ] && echo "Current kernel doesn't support
    -¬ 'ip6tables' firewalling (IPv6)!" 

    18.3.2. Learn how to use ip6tables

    18.3.2.1. List all IPv6 netfilter entries

    • Short

    # ip6tables -L 

    • Extended

    # ip6tables -n -v --line-numbers -L 

    18.3.2.2. List specified filter

    # ip6tables -n -v --line-numbers -L INPUT 

    18.3.2.3. Insert a log rule at the input filter with options

    # ip6tables --table filter --append INPUT  -j LOG --log-prefix "INPUT:"
    -¬ --log-level 7 

    18.3.2.4. Insert a drop rule at the input filter

    # ip6tables --table filter --append INPUT  -j DROP 

    18.3.2.5. Delete a rule by number

    # ip6tables --table filter --delete INPUT 1 

    18.3.2.6. Enable connection tracking

    Since kernel version 2.6.20 IPv6 connection tracking is well supported and should be used instead of using stateless filter rules.

    # ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

    18.3.2.7. Allow ICMPv6

    Using older kernels (unpatched kernel 2.4.5 and iptables-1.2.2) no type can be specified

    • Accept incoming ICMPv6 through tunnels

    # ip6tables -A INPUT -i sit+ -p icmpv6 -j ACCEPT 

    • Allow outgoing ICMPv6 through tunnels

    # ip6tables -A OUTPUT -o sit+ -p icmpv6 -j ACCEPT 

    Newer kernels allow specifying of ICMPv6 types:

    # ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j ACCEPT

    18.3.2.8. Rate-limiting

    Because it can happen (author already saw it to times) that an ICMPv6 storm will raise up, you should use available rate limiting for at least ICMPv6 ruleset. In addition logging rules should also get rate limiting to prevent DoS attacks against syslog and storage of log file partition. An example for a rate limited ICMPv6 looks like:

    # ip6tables -A INPUT --protocol icmpv6 --icmpv6-type echo-request
    -¬ -j ACCEPT --match limit --limit 30/minute

    18.3.2.9. Allow incoming SSH

    Here an example is shown for a ruleset which allows incoming SSH connection from a specified IPv6 address

    • Allow incoming SSH from 2001:0db8:100::1/128

    # ip6tables -A INPUT -i sit+ -p tcp -s 2001:0db8:100::1/128 --sport 512:65535
    -¬ --dport 22 -j ACCEPT 

    • Allow response packets (no longer needed if connection tracking is used!)

    # ip6tables -A OUTPUT -o sit+ -p tcp -d 2001:0db8:100::1/128 --dport 512:65535
    -¬ --sport 22 ! --syn -j ACCEPT 

    18.3.2.10. Enable tunneled IPv6-in-IPv4

    To accept tunneled IPv6-in-IPv4 packets, you have to insert rules in your IPv4 firewall setup relating to such packets, for example

    • Accept incoming IPv6-in-IPv4 on interface ppp0

    # iptables -A INPUT -i ppp0 -p ipv6 -j ACCEPT 

    • Allow outgoing IPv6-in-IPv4 to interface ppp0

    # iptables -A OUTPUT -o ppp0 -p ipv6 -j ACCEPT 

    If you have only a static tunnel, you can specify the IPv4 addresses, too, like

    • Accept incoming IPv6-in-IPv4 on interface ppp0 from tunnel endpoint 192.0.2.2

    # iptables -A INPUT -i ppp0 -p ipv6 -s 192.0.2.2 -j ACCEPT 

    • Allow outgoing IPv6-in-IPv4 to interface ppp0 to tunnel endpoint 1.2.3.4

    # iptables -A OUTPUT -o ppp0 -p ipv6 -d 192.0.2.2 -j ACCEPT 

    18.3.2.11. Protection against incoming TCP connection requests

    VERY RECOMMENDED! For security issues you should really insert a rule which blocks incoming TCP connection requests. Adapt "-i" option, if other interface names are in use!

    • Block incoming TCP connection requests to this host

    # ip6tables -I INPUT -i sit+ -p tcp --syn -j DROP 

    • Block incoming TCP connection requests to hosts behind this router

    # ip6tables -I FORWARD -i sit+ -p tcp --syn -j DROP 

    Perhaps the rules have to be placed below others, but that is work you have to think about it. Best way is to create a script and execute rules in a specified way.


    18.3.2.12. Protection against incoming UDP connection requests

    ALSO RECOMMENDED! Like mentioned on my firewall information it's possible to control the ports on outgoing UDP/TCP sessions. So if all of your local IPv6 systems are using local ports e.g. from 32768 to 60999 you are able to filter UDP connections also (until connection tracking works) like:

    • Block incoming UDP packets which cannot be responses of outgoing requests of this host

    # ip6tables -I INPUT -i sit+ -p udp ! --dport 32768:60999 -j DROP 

    • Block incoming UDP packets which cannot be responses of forwarded requests of hosts behind this router

    # ip6tables -I FORWARD -i sit+ -p udp ! --dport 32768:60999 -j DROP 

    18.3.3. Examples

    18.3.3.1. Simple example for Fedora

    Following lines show a simple firewall configuration for Fedora 6 (since kernel version 2.6.20). It was modfied from the default one (generated by system-config-firewall) for supporting connection tracking and return the proper ICMPv6 code for rejects. Incoming SSH (port 22) connections are allowed.

    File: /etc/sysconfig/ip6tables
    -
    -*filter :INPUT ACCEPT [0:0]
    -:FORWARD ACCEPT [0:0]
    -:OUTPUT ACCEPT [0:0]
    -:RH-Firewall-1-INPUT - [0:0]
    --A INPUT -j RH-Firewall-1-INPUT
    --A FORWARD -j RH-Firewall-1-INPUT
    --A RH-Firewall-1-INPUT -i lo -j ACCEPT
    --A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT
    --A RH-Firewall-1-INPUT -p 50 -j ACCEPT
    --A RH-Firewall-1-INPUT -p 51 -j ACCEPT
    --A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT
    --A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT 
    --A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
    --A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    --A RH-Firewall-1-INPUT -m state --state NEW -p tcp --dport 22 -j ACCEPT
    --A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited
    -COMMIT 

    For completeness also the IPv4 configuration is shown here:

    File: /etc/sysconfig/iptables
    -
    -*filter :INPUT ACCEPT [0:0]
    -:FORWARD ACCEPT [0:0]
    -:OUTPUT ACCEPT [0:0]
    -:RH-Firewall-1-INPUT - [0:0]
    --A INPUT -j RH-Firewall-1-INPUT
    --A FORWARD -j RH-Firewall-1-INPUT
    --A RH-Firewall-1-INPUT -i lo -j ACCEPT
    --A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
    --A RH-Firewall-1-INPUT -p 50 -j ACCEPT
    --A RH-Firewall-1-INPUT -p 51 -j ACCEPT
    --A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
    --A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
    --A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
    --A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    --A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
    --A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
    -COMMIT 

    Usage:

    • Create/modify the configuration files

    • Activate IPv4 & IPv6 firewalling

    # service iptables start
    -# service ip6tables start

    • Enable automatic start after reboot

    # chkconfig iptables on
    -# chkconfig ip6tables on

    18.3.3.2. Sophisticated example

    Following lines show a more sophisticated but still stateless filter setup as an example. Happy netfilter6 ruleset creation....

    # ip6tables -n -v -L 
    -Chain INPUT (policy DROP 0 packets, 0 bytes) 
    - pkts bytes target     prot opt in     out     source               destination
    -    0     0 extIN      all      sit+   *       ::/0                 ::/0 
    -    4   384 intIN      all      eth0   *       ::/0                 ::/0 
    -    0     0 ACCEPT     all      *      *       ::1/128              ::1/128 
    -    0     0 ACCEPT     all      lo     *       ::/0                 ::/0 
    -    0     0 LOG        all      *      *       ::/0                 ::/0       
    -¬        LOG flags 0 level 7 prefix `INPUT-default:' 
    -    0     0 DROP       all      *      *       ::/0                 ::/0 
    - 
    -Chain FORWARD (policy DROP 0 packets, 0 bytes) 
    - pkts bytes target     prot opt in     out     source               destination
    -¬ 
    -    0     0 int2ext    all      eth0   sit+    ::/0                 ::/0 
    -    0     0 ext2int    all      sit+   eth0    ::/0                 ::/0 
    -    0     0 LOG        all      *      *       ::/0                 ::/0       
    -¬        LOG flags 0 level 7 prefix `FORWARD-default:' 
    -    0     0 DROP       all      *      *       ::/0                 ::/0 
    - 
    -Chain OUTPUT (policy DROP 0 packets, 0 bytes) 
    - pkts bytes target     prot opt in     out     source               destination
    -¬ 
    -    0     0 extOUT     all      *      sit+    ::/0                 ::/0 
    -    4   384 intOUT     all      *      eth0    ::/0                 ::/0 
    -    0     0 ACCEPT     all      *      *       ::1/128              ::1/128 
    -    0     0 ACCEPT     all      *      lo      ::/0                 ::/0 
    -    0     0 LOG        all      *      *       ::/0                 ::/0       
    -¬        LOG flags 0 level 7 prefix `OUTPUT-default:' 
    -    0     0 DROP       all      *      *       ::/0                 ::/0 
    - 
    -Chain ext2int (1 references) 
    - pkts bytes target     prot opt in     out     source               destination
    -¬ 
    -    0     0 ACCEPT     icmpv6    *      *       ::/0                 ::/0 
    -    0     0 ACCEPT     tcp      *      *       ::/0                 ::/0       
    -¬        tcp spts:1:65535 dpts:1024:65535 flags:!0x16/0x02 
    -    0     0 LOG        all      *      *       ::/0                 ::/0       
    -¬        LOG flags 0 level 7 prefix `ext2int-default:' 
    -    0     0 DROP       tcp      *      *       ::/0                 ::/0 
    -    0     0 DROP       udp      *      *       ::/0                 ::/0 
    -    0     0 DROP       all      *      *       ::/0                 ::/0 
    - 
    -Chain extIN (1 references) 
    - pkts bytes target     prot opt in     out     source               destination
    -¬ 
    -    0     0 ACCEPT     tcp      *      *       3ffe:400:100::1/128  ::/0       
    -¬        tcp spts:512:65535 dpt:22 
    -    0     0 ACCEPT     tcp      *      *       3ffe:400:100::2/128  ::/0       
    -¬        tcp spts:512:65535 dpt:22 
    -    0     0 ACCEPT     icmpv6    *      *       ::/0                 ::/0 
    -    0     0 ACCEPT     tcp      *      *       ::/0                 ::/0       
    -¬        tcp spts:1:65535 dpts:1024:65535 flags:!0x16/0x02 
    -    0     0 ACCEPT     udp      *      *       ::/0                 ::/0       
    -¬        udp spts:1:65535 dpts:1024:65535 
    -    0     0 LOG        all      *      *       ::/0                 ::/0       
    -¬        limit: avg 5/min burst 5 LOG flags 0 level 7 prefix `extIN-default:' 
    -    0     0 DROP       all      *      *       ::/0                 ::/0 
    - 
    -Chain extOUT (1 references) 
    - pkts bytes target     prot opt in     out     source               destination
    -¬ 
    -    0     0 ACCEPT     tcp      *      *       ::/0                
    -¬ 2001:0db8:100::1/128tcp spt:22 dpts:512:65535 flags:!0x16/0x02 
    -    0     0 ACCEPT     tcp      *      *       ::/0                
    -¬ 2001:0db8:100::2/128tcp spt:22 dpts:512:65535 flags:!0x16/0x02 
    -    0     0 ACCEPT     icmpv6    *      *       ::/0                 ::/0 
    -    0     0 ACCEPT     tcp      *      *       ::/0                 ::/0       
    -¬        tcp spts:1024:65535 dpts:1:65535 
    -    0     0 ACCEPT     udp      *      *       ::/0                 ::/0       
    -¬        udp spts:1024:65535 dpts:1:65535 
    -    0     0 LOG        all      *      *       ::/0                 ::/0       
    -¬        LOG flags 0 level 7 prefix `extOUT-default:' 
    -    0     0 DROP       all      *      *       ::/0                 ::/0 
    - 
    -Chain int2ext (1 references) 
    - pkts bytes target     prot opt in     out     source               destination
    -¬ 
    -    0     0 ACCEPT     icmpv6    *      *       ::/0                 ::/0 
    -    0     0 ACCEPT     tcp      *      *       ::/0                 ::/0       
    -¬        tcp spts:1024:65535 dpts:1:65535 
    -    0     0 LOG        all      *      *       ::/0                 ::/0       
    -¬        LOG flags 0 level 7 prefix `int2ext:' 
    -    0     0 DROP       all      *      *       ::/0                 ::/0 
    -    0     0 LOG        all      *      *       ::/0                 ::/0       
    -¬        LOG flags 0 level 7 prefix `int2ext-default:' 
    -    0     0 DROP       tcp      *      *       ::/0                 ::/0 
    -    0     0 DROP       udp      *      *       ::/0                 ::/0 
    -    0     0 DROP       all      *      *       ::/0                 ::/0 
    - 
    -Chain intIN (1 references) 
    - pkts bytes target     prot opt in     out     source               destination
    -¬ 
    -    0     0 ACCEPT     all      *      *       ::/0                
    -¬ fe80::/ffc0:: 
    -    4   384 ACCEPT     all      *      *       ::/0                 ff02::/16 
    - 
    -Chain intOUT (1 references) 
    - pkts bytes target     prot opt in     out     source               destination
    -¬ 
    -    0     0 ACCEPT     all      *      *       ::/0                
    -¬ fe80::/ffc0:: 
    -    4   384 ACCEPT     all      *      *       ::/0                 ff02::/16 
    -    0     0 LOG        all      *      *       ::/0                 ::/0       
    -¬        LOG flags 0 level 7 prefix `intOUT-default:' 
    -    0     0 DROP       all      *      *       ::/0                 ::/0 

    Chapter 19. Security

    19.1. Node security

    It's very recommended to apply all available patches and disable all not necessary services. Also bind services to the needed IPv4/IPv6 addresses only and install local firewalling.

    More to be filled...


    19.2. Access limitations

    Many services uses the tcp_wrapper library for access control. Below is described the use of tcp_wrapper.

    More to be filled...


    19.3. IPv6 security auditing

    Currently there are no comfortable tools out which are able to check a system over network for IPv6 security issues. Neither Nessus nor any commercial security scanner is as far as I know able to scan IPv6 addresses.


    19.3.1. Legal issues

    ATTENTION: always take care that you only scan your own systems or after receiving a written order, otherwise legal issues are able to come up to you. -CHECK destination IPv6 addresses TWICE before starting a scan.


    19.3.2. Security auditing using IPv6-enabled netcat

    With the IPv6-enabled netcat (see IPv6+Linux-status-apps/security-auditing for more) you can run a portscan by wrapping a script around which run through a port range, grab banners and so on. Usage example:

    # nc6 ::1 daytime
    -13 JUL 2002 11:22:22 CEST

    19.3.3. Security auditing using IPv6-enabled nmap

    NMap, one of the best portscaner around the world, supports IPv6 since version 3.10ALPHA1. Usage example:

    # nmap -6 -sT ::1
    -Starting nmap V. 3.10ALPHA3 ( www.insecure.org/nmap/ ) 
    -Interesting ports on localhost6 (::1): 
    -(The 1600 ports scanned but not shown below are in state: closed) 
    -Port       State       Service 
    -22/tcp     open        ssh 
    -53/tcp     open        domain 
    -515/tcp    open        printer 
    -2401/tcp   open        cvspserver
    -Nmap run completed -- 1 IP address (1 host up) scanned in 0.525 seconds

    19.3.4. Security auditing using IPv6-enabled strobe

    Strobe is a (compared to NMap) more a low budget portscanner, but there is an IPv6-enabling patch available (see IPv6+Linux-status-apps/security-auditing for more). Usage example:

    # ./strobe ::1 strobe 1.05 (c) 1995-1999 Julian Assange <proff@iq.org>.
    -::1 2401 unassigned unknown
    -::1 22 ssh Secure Shell - RSA encrypted rsh 
    -::1 515 printer spooler (lpd)
    -::1 6010 unassigned unknown 
    -::1 53 domain Domain Name Server

    Note: strobe isn't really developed further on, the shown version number isn't the right one.


    19.3.5. Audit results

    If the result of an audit mismatch your IPv6 security policy, use IPv6 firewalling to close the holes, e.g. using netfilter6 (see Firewalling/Netfilter6 for more).

    Info: More detailed information concerning IPv6 Security can be found here:


    Chapter 20. Encryption and Authentication

    Unlike in IPv4, encryption and authentication is a mandatory feature of IPv6. Those features are normally implemented using IPsec (which can be also used by IPv4).


    20.1. Modes of using encryption and authentication

    Two modes of encryption and authentication of a connection are possible:


    20.1.1. Transport mode

    Transport mode is a real end-to-end connection mode. Here, only the payload (usually ICMP, TCP or UDP) is encrypted with their particular header, while the IP header is not encrypted (but usually included in authentication).

    Using AES-128 for encryption and SHA1 for authentication, this mode decreases the MTU by 42 octets.


    20.1.2. Tunnel mode

    Tunnel mode can be used either for end-to-end or for gateway-to-gateway connection modes. Here, the complete IP packet is being encrypted and gets a new IP header prepended, all together constituing a new IP packet (this mechanism is also known as "encapsulation")

    This mode usually decreases the MTU by 40 octets from the MTU of transport mode. I.e. using AES-128 for encryption and SHA1 for authentication 82 octets less than the normal MTU.


    20.2. Support in kernel (ESP and AH)

    20.2.1. Support in vanilla Linux kernel 2.4.x

    At the time of writing missing in vanilla up to 2.4.28. There was an issue about keeping the Linux kernel source free of export/import-control-laws regarding encryption code. This is also one case why FreeS/WAN project wasn't included in vanilla source. Perhaps a backport from 2.6.x will be done in the future.


    20.2.2. Support in vanilla Linux kernel 2.6.x

    Current versions (as time of writing 2.6.9 and upper) support native IPsec for IPv4 and IPv6.

    Implementation was helped by the USAGI project.


    20.3. Automatic key exchange (IKE)

    IPsec requires a key exchange of a secret. This is mostly done automatically by so called IKE daemons. They also handle the authentication of the peers, either by a common known secret (so called “pre-shared secret”) or by RSA keys (which can also be used from X.509 certificates).

    Currently, two different IKE daemons are available for Linux, which totally differ in configuration and usage.

    I prefer “pluto” from the *S/WAN implementation because of the easier and one-config-only setup.


    20.3.1. IKE daemon “racoon”

    The IKE daemon “racoon” is taken from the KAME project and ported to Linux. Modern Linux distributions contain this daemon in the package “ipsec-tools”. Two executables are required for a proper IPsec setup. Take a look on Linux Advanced Routing & Traffic Control HOWTO / IPSEC, too.


    20.3.1.1. Manipulation of the IPsec SA/SP database with the tool “setkey”

    “setkey” is important to define the security policy (SP) for the kernel.

    File: /etc/racoon/setkey.sh

    • Example for an end-to-end encrypted connection in transport mode

    #!/sbin/setkey -f
    -flush;
    -spdflush;
    -spdadd 2001:db8:1:1::1 2001:db8:2:2::2 any -P out ipsec esp/transport//require;
    -spdadd 2001:db8:2:2::2 2001:db8:1:1::1 any -P in  ipsec esp/transport//require;

    • Example for a end-to-end encrypted connection in tunnel mode

    #!/sbin/setkey -f
    -flush;
    -spdflush;
    -spdadd 2001:db8:1:1::1 2001:db8:2:2::2 any -P out ipsec
    -¬ esp/tunnel/2001:db8:1:1::1-2001:db8:2:2::2/require;
    -spdadd 2001:db8:2:2::2 2001:db8:1:1::1 any -P in  ipsec
    -¬ esp/tunnel/2001:db8:2:2::2-2001:db8:1:1::1/require;

    For the other peer, you have to replace “in” with “out”.


    20.3.1.2. Configuration of the IKE daemon “racoon”

    “racoon” requires a configuration file for proper execution. It includes the related settings to the security policy, which should be set up previously using “setkey”.

    File: /etc/racoon/racoon.conf

    # Racoon IKE daemon configuration file.
    -# See 'man racoon.conf' for a description of the format and entries.
    -path include "/etc/racoon";
    -path pre_shared_key "/etc/racoon/psk.txt";
    -
    -listen
    -{
    -        isakmp 2001:db8:1:1::1;
    -}
    -
    -remote 2001:db8:2:2::2
    -{
    -        exchange_mode main;
    -        lifetime time 24 hour;
    -        proposal
    -        {
    -                encryption_algorithm 3des;
    -                hash_algorithm md5;
    -                authentication_method pre_shared_key;
    -                dh_group 2;
    -        }
    -}
    -
    -# gateway-to-gateway
    -sainfo address 2001:db8:1:1::1 any address 2001:db8:2:2::2 any
    -{
    -        lifetime time 1 hour;
    -        encryption_algorithm 3des;
    -        authentication_algorithm hmac_md5;
    -        compression_algorithm deflate;
    -}
    -
    -sainfo address 2001:db8:2:2::2 any address 2001:db8:1:1::1 any
    -{
    -        lifetime time 1 hour;
    -        encryption_algorithm 3des;
    -        authentication_algorithm hmac_md5;
    -        compression_algorithm deflate;
    -} 

    Also set up the pre-shared secret:

    File: /etc/racoon/psk.txt

    # file for pre-shared keys used for IKE authentication
    -# format is: 'identifier' 'key'
    -
    -2001:db8:2:2::2 verysecret 

    20.3.1.3. Running IPsec with IKE daemon “racoon”

    At least the daemon needs to be started. For the first time, use debug and foreground mode. The following example shows a successful IKE phase 1 (ISAKMP-SA) and 2 (IPsec-SA) negotiation:

    # racoon -F -v -f /etc/racoon/racoon.conf
    -Foreground mode. 
    -2005-01-01 20:30:15: INFO: @(#)ipsec-tools 0.3.3
    -¬ (http://ipsec-tools.sourceforge.net)
    -2005-01-01 20:30:15: INFO: @(#)This product linked
    -¬ OpenSSL 0.9.7a Feb 19 2003 (http://www.openssl.org/)
    -2005-01-01 20:30:15: INFO: 2001:db8:1:1::1[500] used as isakmp port (fd=7)
    -2005-01-01 20:31:06: INFO: IPsec-SA request for 2001:db8:2:2::2
    -¬ queued due to no phase1 found.
    -2005-01-01 20:31:06: INFO: initiate new phase 1 negotiation:
    -¬ 2001:db8:1:1::1[500]<=>2001:db8:2:2::2[500]
    -2005-01-01 20:31:06: INFO: begin Identity Protection mode.
    -2005-01-01 20:31:09: INFO: ISAKMP-SA established
    -¬ 2001:db8:1:1::1[500]-2001:db8:2:2::2[500] spi:da3d3693289c9698:ac039a402b2db401
    -2005-01-01 20:31:09: INFO: initiate new phase 2 negotiation:
    -¬ 2001:6f8:900:94::2[0]<=>2001:db8:2:2::2[0]
    -2005-01-01 20:31:10: INFO: IPsec-SA established:
    -¬ ESP/Tunnel 2001:db8:2:2::2->2001:db8:1:1::1 spi=253935531(0xf22bfab) 
    -2005-01-01 20:31:10: INFO: IPsec-SA established:
    -¬ ESP/Tunnel 2001:db8:1:1::1->2001:db8:2:2::2 spi=175002564(0xa6e53c4) 

    Each direction got its own IPsec-SA (like defined in the IPsec standard). With “tcpdump” on the related interface, you will see as result of an IPv6 ping:

    20:35:55.305707 2001:db8:1:1::1 > 2001:db8:2:2::2: ESP(spi=0x0a6e53c4,seq=0x3)
    -20:35:55.537522 2001:db8:2:2::2 > 2001:db8:1:1::1: ESP(spi=0x0f22bfab,seq=0x3)

    As expected, the negotiated SPIs are being used here.

    And using “setkey”, current active parameters are shown:

    # setkey -D
    -2001:db8:1:1::1 2001:db8:2:2::2
    -        esp mode=tunnel spi=175002564(0x0a6e53c4) reqid=0(0x00000000)
    -        E: 3des-cbc  bd26bc45 aea0d249 ef9c6b89 7056080f 5d9fa49c 924e2edd
    -        A: hmac-md5  60c2c505 517dd8b7 c9609128 a5efc2db
    -        seq=0x00000000 replay=4 flags=0x00000000 state=mature
    -        created: Jan  1 20:31:10 2005   current: Jan  1 20:40:47 2005
    -        diff: 577(s)    hard: 3600(s)   soft: 2880(s)
    -        last: Jan  1 20:35:05 2005      hard: 0(s)      soft: 0(s)
    -        current: 540(bytes)     hard: 0(bytes)  soft: 0(bytes)
    -        allocated: 3    hard: 0 soft: 0
    -        sadb_seq=1 pid=22358 refcnt=0
    -2001:db8:2:2::2 2001:db8:1:1::1
    -        esp mode=tunnel spi=253935531(0x0f22bfab) reqid=0(0x00000000)
    -        E: 3des-cbc  c1ddba65 83debd62 3f6683c1 20e747ac 933d203f 4777a7ce
    -        A: hmac-md5  3f957db9 9adddc8c 44e5739d 3f53ca0e
    -        seq=0x00000000 replay=4 flags=0x00000000 state=mature
    -        created: Jan  1 20:31:10 2005   current: Jan  1 20:40:47 2005
    -        diff: 577(s)    hard: 3600(s)   soft: 2880(s)
    -        last: Jan  1 20:35:05 2005      hard: 0(s)      soft: 0(s)
    -        current: 312(bytes)     hard: 0(bytes)  soft: 0(bytes)
    -        allocated: 3    hard: 0 soft: 0
    -        sadb_seq=0 pid=22358 refcnt=0 

    20.3.2. IKE daemon “pluto”

    The IKE daemon “pluto” is included in distributions of the *S/WAN projects. *S/WAN project starts at the beginning as FreeS/WAN. Unfortunately, the FreeS/WAN project stopped further development in 2004. Because of the slow pace of development in the past, two spin-offs started: strongSwan and Openswan. Today, readily installable packages are available for at least Openswan (included in Fedora Core 3).

    A major difference to “racoon”, only one configuration file is required. Also, an initscript exists for automatic setup after booting.


    20.3.2.1. Configuration of the IKE daemon “pluto”

    The configuration is very similar to the IPv4 one, only one important option is necessary.

    File: /etc/ipsec.conf

    # /etc/ipsec.conf - Openswan IPsec configuration file
    -#
    -# Manual:     ipsec.conf.5
    -version 2.0     # conforms to second version of ipsec.conf specification
    -
    -# basic configuration
    -config setup
    -        # Debug-logging controls:  "none" for (almost) none, "all" for lots.
    -        # klipsdebug=none
    -        # plutodebug="control parsing"
    -
    -#Disable Opportunistic Encryption
    -include /etc/ipsec.d/examples/no_oe.conf
    -
    -conn ipv6-p1-p2
    -        connaddrfamily=ipv6       # Important for IPv6!
    -        left=2001:db8:1:1::1
    -        right=2001:db8:2:2::2
    -        authby=secret
    -        esp=aes128-sha1
    -        ike=aes128-sha-modp1024
    -        type=transport
    -        #type=tunnel
    -        compress=no
    -        #compress=yes
    -        auto=add
    -        #auto=start

    Don't forget to define the pre-shared secret here also.

    File: /etc/ipsec.secrets

    2001:db8:1:1::1 2001:db8:2:2::2 : PSK      "verysecret"

    20.3.2.2. Running IPsec with IKE daemon “pluto”

    If installation of Openswan was successfully, an initscript should exist for starting IPsec, simply run (on each peer):

    # /etc/rc.d/init.d/ipsec start

    Afterwards, start this connection on one peer. If you saw the line “IPsec SA established”, all worked fine.

    # ipsec auto --up ipv6-peer1-peer2
    -104 "ipv6-p1-p2" #1: STATE_MAIN_I1: initiate
    -106 "ipv6-p1-p2" #1: STATE_MAIN_I2: sent MI2, expecting MR2
    -108 "ipv6-p1-p2" #1: STATE_MAIN_I3: sent MI3, expecting MR3
    -004 "ipv6-p1-p2" #1: STATE_MAIN_I4: ISAKMP SA established
    -112 "ipv6-p1-p2" #2: STATE_QUICK_I1: initiate
    -004 "ipv6-p1-p2" #2: STATE_QUICK_I2: sent QI2,
    -¬ IPsec SA established {ESP=>0xa98b7710 <0xa51e1f22} 

    Because *S/WAN and setkey/racoon do use the same IPsec implementation in Linux 2.6.x kernel, “setkey” can be used here too to show current active parameters:

    # setkey -D
    -2001:db8:1:1::1 2001:db8:2:2::2
    -        esp mode=transport spi=2844489488(0xa98b7710) reqid=16385(0x00004001)
    -        E: aes-cbc  082ee274 2744bae5 7451da37 1162b483
    -        A: hmac-sha1  b7803753 757417da 477b1c1a 64070455 ab79082c
    -        seq=0x00000000 replay=64 flags=0x00000000 state=mature
    -        created: Jan  1 21:16:32 2005   current: Jan  1 21:22:20 2005
    -        diff: 348(s)    hard: 0(s)      soft: 0(s)
    -        last:                           hard: 0(s)      soft: 0(s)
    -        current: 0(bytes)       hard: 0(bytes)  soft: 0(bytes)
    -        allocated: 0    hard: 0 soft: 0
    -        sadb_seq=1 pid=23825 refcnt=0
    -2001:db8:2:2::2 2001:db8:1:1::1
    -        esp mode=transport spi=2770214690(0xa51e1f22) reqid=16385(0x00004001)
    -        E: aes-cbc  6f59cc30 8d856056 65e07b76 552cac18
    -        A: hmac-sha1  c7c7d82b abfca8b1 5440021f e0c3b335 975b508b
    -        seq=0x00000000 replay=64 flags=0x00000000 state=mature
    -        created: Jan  1 21:16:31 2005   current: Jan  1 21:22:20 2005
    -        diff: 349(s)    hard: 0(s)      soft: 0(s)
    -        last:                           hard: 0(s)      soft: 0(s)
    -        current: 0(bytes)       hard: 0(bytes)  soft: 0(bytes)
    -        allocated: 0    hard: 0 soft: 0
    -        sadb_seq=0 pid=23825 refcnt=0 

    20.4. Additional informations:

    On Linux Kernel 2.6.x you can get the policy and status of IPsec also using “ip”:

    # ip xfrm policy
    -...
    -
    -# ip xfrm state
    -...

    Chapter 21. Quality of Service (QoS)

    IPv6 supports QoS with use of Flow Labels and Traffic Classes.

    Additional infos:


    21.1. General

    Proper working QoS is only possible on the outgoing interface of a router or host, where the bottleneck begins. Everything else is a hickup and not subject to work as expected or has a successful result.

    -------------->-------
    -           Queue 1    \
    -           --->---     ---->--------->--------->---------------
    -Big pipe   Queue 2      Queue 1 / Queue 2 / Queue 3   Thin Pipe
    -           --->----    ---->--------->--------->---------------
    -           Queue 3    /
    --------------->-------

    21.2. Linux QoS using “tc”

    Linux is using “tc” from the “iproute2” package to configure traffic shaping, generally described in the Linux Advanced Routing & Traffic Control HOWTO.


    21.2.1. Example for a constant bitrate queuing

    With the “cbq” scheduler, pipes with constant bit rates can be defined.


    21.2.1.1. Root qdisc definition

    Define root qdisc with a bandwidth of 1000 MBit/s on eth1

    # tc qdisc add dev eth1 root handle 1: cbq avpkt 1000 bandwidth 1000Mbit

    21.2.1.2. QoS class definition

    Define a class 1:1 with 1 MBit/s

    # tc class add dev eth1 parent 1: classid 1:1 cbq rate   1Mbit allot 1500 bounded 

    Define a class 1:2 with 50 MBit/s

    # tc class add dev eth1 parent 1: classid 1:2 cbq rate  50Mbit allot 1500 bounded

    Define a class 1:3 with 10 MBit/s

    # tc class add dev eth1 parent 1: classid 1:3 cbq rate  10Mbit allot 1500 bounded

    Define a class 1:4 with 200 kBit/s

    # tc class add dev eth1 parent 1: classid 1:4 cbq rate 200kbit allot 1500 bounded

    21.2.1.3. QoS filter definition

    Define a filter for IPv4 (protocol ip), TCP (match ip protocol 6 0xff) destination port 5001 (match ip dport 5001 0xffff) using class 1:2 from above

    # tc filter add dev eth1 parent 1: protocol ip   u32 match ip  protocol 6 0xff match ip dport 5001 0xffff flowid 1:1

    Define a filter for IPv6 (protocol ip), TCP (match ip6 protocol 6 0xff) destination port 5001 using class 1:2 from above

    # tc filter add dev eth1 parent 1: protocol ipv6 u32 match ip6 protocol 6 0xff match ip6 dport 5001 0xffff flowid 1:2

    Define a filter for IPv6 for packets having flow label 12345 (match ip6 flowlabel 12345 0x3ffff) using class 1:3 from above

    # tc filter add dev eth1 parent 1: protocol ipv6 u32 match ip6 flowlabel 12345 0x3ffff flowid 1:3 

    Define a filter for IPv6 for packets having Linux iptables mark 32 (handle 32 fw) specified using class 1:4 from above

    # tc filter add dev eth1 parent 1: protocol ipv6 handle 32 fw flowid 1:4

    The last filter definition requires an entry in the ip6tables to mark a packet

    # ip6tables -A POSTROUTING -t mangle -p tcp --dport 5003 -j MARK --set-mark 32 

    21.2.1.4. Testing filter definitions using iperf

    Start on server side each one one separate console:

    # iperf -V -s -p 5001
    -# iperf -V -s -p 5002
    -# iperf -V -s -p 5003

    Start on client side and compare results:

    # iperf -V -c SERVER-IPv4 -p 5001    (expected:      1 MBit/s)
    -# iperf -V -c SERVER-IPv6 -p 5001    (expected:     50 MBit/s)
    -# iperf -V -c SERVER-IPv4 -p 5002    (expected:  >> 50 MBit/s && <= 1000 MBit/s)
    -# iperf -V -c SERVER-IPv6 -p 5002    (expected:  >> 50 MBit/s && <= 1000 MBit/s)
    -# iperf -V -c SERVER-IPv4 -p 5003    (expected:  >> 50 MBit/s && <= 1000 MBit/s)
    -# iperf -V -c SERVER-IPv6 -p 5003    (expected:    200 kBit/s)

    The rate result should be as defined in the classes (see above), the results on port 5002 should be very similar independend from used IP version.


    Chapter 22. Hints for IPv6-enabled daemons

    Here some hints are shown for IPv6-enabled daemons.


    22.1. Berkeley Internet Name Domain (BIND) daemon “named”

    IPv6 is supported since version 9. Always use newest available version. At least version 9.1.3 must be used, older versions can contain remote exploitable security holes.


    22.1.1. Listening on IPv6 addresses

    Note: unlike in IPv4 current versions doesn't allow to bind a server socket to dedicated IPv6 addresses, so only any or none are valid. Because this can be a security issue, check the Access Control List (ACL) section below, too!


    22.1.1.1. Enable BIND named for listening on IPv6 address

    To enable IPv6 for listening, following options are requested to change

    options {
    -        # sure other options here, too
    -        listen-on-v6 { any; };
    -};

    This should result after restart in e.g.

    # netstat -lnptu |grep "named\W*$" 
    -tcp 0 0 :::53         :::*      LISTEN 1234/named
    -¬ # incoming TCP requests
    -udp 0 0 1.2.3.4:53    0.0.0.0:*        1234/named
    -¬ # incoming UDP requests to IPv4 1.2.3.4
    -udp 0 0 127.0.0.1:53  0.0.0.0:*        1234/named
    -¬ # incoming UDP requests to IPv4 localhost
    -udp 0 0 0.0.0.0:32868 0.0.0.0:*        1234/named
    -¬ # dynamic chosen port for outgoing queries
    -udp 0 0 :::53         :::*             1234/named
    -¬ # incoming UDP request to any IPv6

    And a simple test looks like

    # dig localhost @::1

    and should show you a result.


    22.1.1.2. Disable BIND named for listening on IPv6 address

    To disable IPv6 for listening, following options are requested to change

    options {
    -        # sure other options here, too
    -        listen-on-v6 { none; };
    -};

    22.1.2. IPv6 enabled Access Control Lists (ACL)

    IPv6 enabled ACLs are possible and should be used whenever it's possible. An example looks like following:

    acl internal-net { 
    -        127.0.0.1; 
    -        1.2.3.0/24;  
    -        2001:0db8:100::/56; 
    -        ::1/128; 
    -        ::ffff:1.2.3.4/128; 
    -};
    -acl ns-internal-net { 
    -        1.2.3.4;  
    -        1.2.3.5;  
    -        2001:0db8:100::4/128; 
    -        2001:0db8:100::5/128; 
    -};

    This ACLs can be used e.g. for queries of clients and transfer zones to secondary name-servers. This prevents also your caching name-server to be used from outside using IPv6.

    options {
    -        # sure other options here, too
    -        listen-on-v6 { none; };
    -        allow-query { internal-net; }; 
    -        allow-transfer { ns-internal-net; }; 
    -};

    It's also possible to set the allow-query and allow-transfer option for most of single zone definitions, too.


    22.1.3. Sending queries with dedicated IPv6 address

    This option is not required, but perhaps needed:

    query-source-v6 address <ipv6address|*> port <port|*>;

    22.1.4. Per zone defined dedicated IPv6 addresses

    It's also possible to define per zone some IPv6 addresses.


    22.1.4.1. Transfer source address

    Transfer source address is used for outgoing zone transfers:

    transfer-source-v6 <ipv6addr|*> [port port];

    22.1.4.2. Notify source address

    Notify source address is used for outgoing notify messages:

    notify-source-v6 <ipv6addr|*> [port port];

    22.1.6. Serving IPv6 related DNS data

    For IPv6 new types and root zones for reverse lookups are defined:

    Perhaps filled later more content, for the meantime take a look at given RFCs and

    • AAAA and reverse IP6.INT: IPv6 DNS Setup Information

    • A6, DNAME (DEPRECATED NOW!) and reverse IP6.ARPA: take a look into chapter 4 and 6 of the BIND 9 Administrator Reference Manual (ARM) distributed with the bind-package or get this here: BIND manual version 9.3

    Because IP6.INT is deprecated (but still in use), a DNS server which will support IPv6 information has to serve both reverse zones.


    22.1.6.1. Current best practice

    Because there are some troubles around using the new formats, current best practice is:

    Forward lookup support:

    • AAAA

    Reverse lookup support:

    • Reverse nibble format for zone ip6.int (FOR BACKWARD COMPATIBILITY)

    • Reverse nibble format for zone ip6.arpa (RECOMMENDED)


    22.1.7. Checking IPv6-enabled connect

    To check, whether BIND named is listening on an IPv6 socket and serving data see following examples.


    22.1.7.1. IPv6 connect, but denied by ACL

    Specifying a dedicated server for the query, an IPv6 connect can be forced:

    $ host -t aaaa www.6bone.net 2001:0db8:200:f101::1 
    -Using domain server: 
    -Name: 2001:0db8:200:f101::1 
    -Address: 2001:0db8:200:f101::1#53 
    -Aliases:
    -
    -Host www.6bone.net. not found: 5(REFUSED)

    Related log entry looks like following:

    Jan 3 12:43:32 gate named[12347]: client
    -¬ 2001:0db8:200:f101:212:34ff:fe12:3456#32770: 
    - query denied

    If you see such entries in the log, check whether requests from this client should be allowed and perhaps review your ACL configuration.


    22.1.7.2. Successful IPv6 connect

    A successful IPv6 connect looks like following:

    $ host -t aaaa www.6bone.net 2001:0db8:200:f101::1 
    -Using domain server: 
    -Name: 2001:0db8:200:f101::1 
    -Address: 2001:0db8:200:f101::1#53 
    -Aliases:
    -
    -www.6bone.net. is an alias for 6bone.net. 
    -6bone.net. has AAAA address 3ffe:b00:c18:1::10

    22.2. Internet super daemon (xinetd)

    IPv6 is supported since xinetd version around 1.8.9. Always use newest available version. At least version 2.3.3 must be used, older versions can contain remote exploitable security holes.

    Some Linux distribution contain an extra package for the IPv6 enabled xinetd, some others start the IPv6-enabled xinetd if following variable is set: NETWORKING_IPV6="yes", mostly done by /etc/sysconfig/network (only valid for Red Hat like distributions). In newer releases, one binary supports IPv4 and IPv6.

    If you enable a built-in service like e.g. daytime by modifying the configuration file in /etc/xinetd.d/daytime like

    # diff -u /etc/xinetd.d/daytime.orig /etc/xinetd.d/daytime 
    ---- /etc/xinetd.d/daytime.orig Sun Dec 16 19:00:14 2001 
    -+++ /etc/xinetd.d/daytime Sun Dec 16 19:00:22 2001 
    -@@ -10,5 +10,5 @@ 
    -        protocol = tcp 
    -        user = root 
    -        wait = no 
    --       disable = yes 
    -+       disable = no 
    - }

    After restarting the xinetd you should get a positive result like:

    # netstat -lnptu -A inet6 |grep "xinetd*" 
    -tcp 0 0 ::ffff:192.168.1.1:993  :::*  LISTEN  12345/xinetd-ipv6 
    -tcp 0 0 :::13                   :::*  LISTEN  12345/xinetd-ipv6 <- service
    -¬ daytime/tcp
    -tcp 0 0 ::ffff:192.168.1.1:143  :::*  LISTEN  12345/xinetd-ipv6

    Shown example also displays an IMAP and IMAP-SSL IPv4-only listening xinetd.

    Note: earlier versions had a problem that an IPv4-only xinetd won't start on an IPv6-enabled node and also the IPv6-enabled xinetd won't start on an IPv4-only node. This is known to be fixed in later versions, at least version 2.3.11.


    22.3. Webserver Apache2 (httpd2)

    Apache web server supports IPv6 native by maintainers since 2.0.14. Available patches for the older 1.3.x series are not current and shouldn't be used in public environment, but available at KAME / Misc.


    22.3.1. Listening on IPv6 addresses

    Note: virtual hosts on IPv6 addresses are broken in versions until 2.0.28 (a patch is available for 2.0.28). But always try latest available version first because earlier versions had some security issues.


    22.3.1.1. Virtual host listen on an IPv6 address only

    Listen [2001:0db8:100::1]:80
    -<VirtualHost [2001:0db8:100::1]:80>
    -        ServerName ipv6only.yourdomain.yourtopleveldomain
    -        # ...sure more config lines
    -</VirtualHost>

    22.3.1.2. Virtual host listen on an IPv6 and on an IPv4 address

    Listen [2001:0db8:100::2]:80 
    -Listen 1.2.3.4:80
    -<VirtualHost [2001:0db8:100::2]:80 1.2.3.4:80>
    -        ServerName ipv6andipv4.yourdomain.yourtopleveldomain
    -        # ...sure more config lines
    -</VirtualHost>

    This should result after restart in e.g.

    # netstat -lnptu |grep "httpd2\W*$" 
    -tcp 0 0 1.2.3.4:80          0.0.0.0:* LISTEN 12345/httpd2 
    -tcp 0 0 2001:0db8:100::1:80 :::*      LISTEN 12345/httpd2 
    -tcp 0 0 2001:0db8:100::2:80 :::*      LISTEN 12345/httpd2

    For simple tests use the telnet example already shown.


    22.3.1.3. Additional notes

    • Apache2 supports a method called “sendfile” to speedup serving data. Some NIC drivers also support offline checksumming. In some cases, this can lead to connection problems and invalid TCP checksums. In this cases, disable “sendfile” either by recompiling using configure option “--without-sendfile” or by using the "EnableSendfile off" directive in configuration file.


    22.4. Router Advertisement Daemon (radvd)

    The router advertisement daemon is very useful on a LAN, if clients should be auto-configured. The daemon itself should run on the Linux default IPv6 gateway router (it's not required that this is also the default IPv4 gateway, so pay attention who on your LAN is sending router advertisements).

    You can specify some information and flags which should be contained in the advertisement. Common used are

    • Prefix (needed)

    • Lifetime of the prefix

    • Frequency of sending advertisements (optional)

    After a proper configuration, the daemon sends advertisements through specified interfaces and clients are hopefully receive them and auto-magically configure addresses with received prefix and the default route.


    22.4.1. Configuring radvd

    22.4.1.1. Simple configuration

    Radvd's config file is normally /etc/radvd.conf. An simple example looks like following:

    interface eth0 { 
    -        AdvSendAdvert on;
    -        MinRtrAdvInterval 3; 
    -        MaxRtrAdvInterval 10;
    -        prefix 2001:0db8:0100:f101::/64 { 
    -                AdvOnLink on; 
    -                AdvAutonomous on; 
    -                AdvRouterAddr on; 
    -        };
    -};

    This results on client side in

    # ip -6 addr show eth0 
    -3: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 100 
    -    inet6 2001:0db8:100:f101:2e0:12ff:fe34:1234/64 scope global dynamic 
    -       valid_lft 2591992sec preferred_lft 604792sec 
    -    inet6 fe80::2e0:12ff:fe34:1234/10 scope link

    Because no lifetime was defined, a very high value was used.


    22.4.1.2. Special 6to4 configuration

    Version since 0.6.2pl3 support the automatic (re)-generation of the prefix depending on an IPv4 address of a specified interface. This can be used to distribute advertisements in a LAN after the 6to4 tunneling has changed. Mostly used behind a dynamic dial-on-demand Linux router. Because of the sure shorter lifetime of such prefix (after each dial-up, another prefix is valid), the lifetime configured to minimal values:

    interface eth0 { 
    -        AdvSendAdvert on;
    -        MinRtrAdvInterval 3; 
    -        MaxRtrAdvInterval 10;
    -        prefix 0:0:0:f101::/64 { 
    -                AdvOnLink off; 
    -                AdvAutonomous on; 
    -                AdvRouterAddr on; 
    -                Base6to4Interface ppp0;
    -                AdvPreferredLifetime 20; 
    -                AdvValidLifetime 30;
    -        };
    -};

    This results on client side in (assuming, ppp0 has currently 1.2.3.4 as local IPv4 address):

    # /sbin/ip -6 addr show eth0 
    -3: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 100 
    -   inet6 2002:0102:0304:f101:2e0:12ff:fe34:1234/64 scope global dynamic 
    -      valid_lft 22sec preferred_lft 12sec
    -   inet6 fe80::2e0:12ff:fe34:1234/10 scope link

    Because a small lifetime was defined, such prefix will be thrown away quickly, if no related advertisement was received.

    Additional note: if you do not used special 6to4 support in initscripts, you have to setup a special route on the internal interface on the router, otherwise you will get some backrouting problems. for the example showh here:

    # /sbin/ip -6 route add 2002:0102:0304:f101::/64 dev eth0 metric 1

    This route needs to be replaced every time the prefix changes, which is the case after a new IPv4 address was assigned to the dial-up interface.


    22.4.2. Debugging

    A program called “radvdump” can help you looking into sent or received advertisements. Simple to use:

    # radvdump 
    -Router advertisement from fe80::280:c8ff:feb9:cef9 (hoplimit 255) 
    -        AdvCurHopLimit: 64 
    -        AdvManagedFlag: off 
    -        AdvOtherConfigFlag: off 
    -        AdvHomeAgentFlag: off 
    -        AdvReachableTime: 0 
    -        AdvRetransTimer: 0 
    -        Prefix 2002:0102:0304:f101::/64 
    -                AdvValidLifetime: 30 
    -                AdvPreferredLifetime: 20 
    -                AdvOnLink: off 
    -                AdvAutonomous: on 
    -                AdvRouterAddr: on 
    -        Prefix 2001:0db8:100:f101::/64 
    -                AdvValidLifetime: 2592000 
    -                AdvPreferredLifetime: 604800 
    -                AdvOnLink: on 
    -                AdvAutonomous: on 
    -                AdvRouterAddr: on 
    -        AdvSourceLLAddress: 00 80 12 34 56 78

    Output shows you each advertisement package in readable format. You should see your configured values here again, if not, perhaps it's not your radvd which sends the advertisement...look for another router on the link (and take the LLAddress, which is the MAC address for tracing).


    22.5. Dynamic Host Configuration v6 Server (dhcp6s)

    DHCPv6 can be used for stateful configurations. The daemon itself need not necessary run on the Linux default IPv6 gateway router.

    You can specify more information than by using radvd. The are most similar to IPv4 DHCP server.

    After a proper configuration, the daemon reacts on received ICMPv6 multicast packets sent by a client to address ff02::1:2


    22.5.1. Configuration of the DHCPv6 server (dhcp6s)

    22.5.1.1. Simple configuration

    dhcp6s's config file is normally /etc/dhcp6s.conf. An simple example looks like following:

    interface eth0 {
    -        server-preference 255;
    -        renew-time 60;
    -        rebind-time 90;
    -        prefer-life-time 130;
    -        valid-life-time 200;
    -        allow rapid-commit;
    -        option dns_servers 2001:db8:0:f101::1 sub.domain.example;
    -        link AAA {
    -                range 2001:db8:0:f101::1000 to 2001:db8:0:f101::ffff/64;
    -                prefix 2001:db8:0:f101::/64;
    -        };
    -};

    22.5.2. Configuration of the DHCPv6 client (dhcp6c)

    22.5.2.1. Simple configuration

    dhcp6c's config file is normally /etc/dhcp6c.conf. An simple example looks like following:

    interface eth0 {
    -        send rapid-commit;
    -        request domain-name-servers;
    -}; 

    22.5.3. Usage

    22.5.3.1. dhcpv6_server

    Start server, e.g.

    # service dhcp6s start

    22.5.3.2. dhcpv6_client

    Start client in foreground, e.g.

    # dhcp6c -f eth0

    22.5.4. Debugging

    22.5.4.1. dhcpv6_server

    The server has one foreground and two debug toggles (both should be used for debugging), here is an example:

    # dhcp6s -d -D -f eth0

    22.5.4.2. dhcpv6_client

    As general debugging for test whether the IPv6 DHCP server is reable on the link use an IPv6 ping to the DHCP multicast address:

    # ping6 -I eth0 ff02::1:2

    The client has one foreground and two debug toggles, here is an example:

    # dhcp6c -d -f eth0
    -Oct/03/2005 17:18:16 dhcpv6 doesn't support hardware type 776 
    -Oct/03/2005 17:18:16 doesn't support sit0 address family 0 
    -Oct/03/2005 17:18:16 netlink_recv_rtgenmsg error 
    -Oct/03/2005 17:18:16 netlink_recv_rtgenmsg error 
    -Oct/03/2005 17:18:17 status code for this address is: success 
    -Oct/03/2005 17:18:17 status code: success 
    -Oct/03/2005 17:18:17 netlink_recv_rtgenmsg error 
    -Oct/03/2005 17:18:17 netlink_recv_rtgenmsg error 
    -Oct/03/2005 17:18:17 assigned address 2001:db8:0:f101::1002 prefix len is not
    -¬ in any RAs prefix length using 64 bit instead 
    -Oct/03/2005 17:18:17 renew time 60, rebind time 9

    Note that the netlink error messages have no impact.


    22.6. ISC Dynamic Host Configuration Server (dhcpd)

    ISC DHCP supports IPv6 since version 4.x.


    22.6.1. Configuration of the ISC DHCP server for IPv6 (dhcpd)

    Note that currently, the ISC DHCP server can only serve IPv4 or IPv6, means you have to start the daemon twice (for IPv6 with option “-6”) to support both protocols.


    22.6.1.1. Simple configuration

    Create a dedicated configuration file /etc/dhcp/dhcpd6.conf for the IPv6 part of the dhcpd. Note, that the router requires to have a interface configured with an IPv6 address out of the defined subnet.

    default-lease-time 600;
    -max-lease-time 7200; 
    -log-facility local7; 
    -subnet6 2001:db8:0:1::/64 {
    -        # Range for clients
    -        range6 2001:db8:0:1::129 2001:db8:0:1::254;
    -        # Additional options
    -        option dhcp6.name-servers fec0:0:0:1::1;
    -        option dhcp6.domain-search "domain.example";
    -        # Prefix range for delegation to sub-routers
    -        prefix6 2001:db8:0:100:: 2001:db8:0:f00:: /56;
    -        # Example for a fixed host address
    -        host specialclient {
    -    		host-identifier option dhcp6.client-id 00:01:00:01:4a:1f:ba:e3:60:b9:1f:01:23:45;
    -        	fixed-address6 2001:db8:0:1::127;
    -    	} 
    -} 

    Note that the “dhcp.client-id” no longer belongs to a MAC address, an unique ID is used instead! “dhcp6c” (see above) uses the file /var/lib/dhcpv6/dhcp6c_duid (would be created during first start, if not existing) as unique identity. It's a 14 byte long identifier, starting with a 2 byte length information (usually “0x000e”):

    # hexdump -e '"%07.7_ax " 1/2 "%04x" " " 14/1 "%02x:" "\n"' /var/lib/dhcpv6/dhcp6c_duid 0000000 000e 00:01:00:01:4a:1f:ba:e3:60:b9:1f:01:23:45:

    22.6.2. Usage

    22.6.2.1. dhcpd

    Start server in foreground:

    # /usr/sbin/dhcpd -6 -f -cf /etc/dhcp/dhcpd.conf eth1 
    -Internet Systems Consortium DHCP Server 4.1.0 
    -Copyright 2004-2008 Internet Systems Consortium. 
    -All rights reserved. 
    -For info, please visit http://www.isc.org/sw/dhcp/ 
    -Not searching LDAP since ldap-server, ldap-port and ldap-base-dn were not specified in the config file 
    -Wrote 0 leases to leases file. 
    -Bound to *:547 
    -Listening on Socket/5/eth1/2001:db8:0:1::/64 
    -Sending on   Socket/5/eth1/2001:db8:0:1::/64

    22.7. DHCP Server Dibbler

    Dibbler is also a DHCP server


    22.7.1. Configuration of the Dibbler DHCP server for IPv6

    22.7.1.1. Simple configuration

    Create a dedicated configuration file /etc/dibbler/server.conf . Note, that the router requires to have a interface configured with an IPv6 address out of the defined subnet.

    log-level 8 
    -log-mode short 
    -preference 0 
    -iface "eth1" {
    - // also ranges can be defines, instead of exact values  t1 1800-2000  t2 2700-3000
    -  prefered-lifetime 3600
    -  valid-lifetime 7200
    -  class {
    -    pool 2001:6f8:12d8:1::/64
    -  }
    -  option dns-server fec0:0:0:1::1
    -  option domain domain.example
    -} 

    22.7.2. Usage

    22.7.2.1. dibbler-server

    Start server in foreground:

    # dibbler-server run 
    -| Dibbler - a portable DHCPv6, version 0.7.3 (SERVER, Linux port) 
    -| Authors : Tomasz Mrugalski<thomson(at)klub.com.pl>,Marek Senderski<msend(at)o2.pl> 
    -| Licence : GNU GPL v2 only. Developed at Gdansk University of Technology. 
    -| Homepage: http://klub.com.pl/dhcpv6/ 
    -2009.05.28 10:18:48 Server Notice    My pid (1789) is stored in /var/lib/dibbler/server.pid 
    -2009.05.28 10:18:48 Server Notice    Detected iface eth0/3, MAC=54:52:00:01:23:45. 
    -2009.05.28 10:18:48 Server Notice    Detected iface eth1/2, MAC=54:52:00:67:89:ab. 
    -2009.05.28 10:18:48 Server Notice    Detected iface lo/1, MAC=00:00:00:00:00:00. 
    -2009.05.28 10:18:48 Server Debug     Skipping database loading. 
    -2009.05.28 10:18:48 Server Debug     Cache:server-cache.xml file: parsing started, expecting 0 entries. 
    -2009.05.28 10:18:48 Server Notice    Parsing /etc/dibbler/server.conf config file... 
    -18:48 Server Debug     Setting 0 generic option(s). 
    -18:48 Server Debug     0 per-client configurations (exceptions) added. 
    -18:48 Server Debug     Parsing /etc/dibbler/server.conf done. 
    -18:48 Server Info      0 client class(es) defined. 
    -18:48 Server Debug     1 interface(s) specified in /etc/dibbler/server.conf 
    -18:48 Server Info      Mapping allow, deny list to class 0:0 allow/deny entries in total. 
    -18:48 Server Info      Interface eth1/2 configuration has been loaded. 
    -18:48 Server Notice    Running in stateful mode. 
    -18:48 Server Info      My DUID is 00:01:00:01:11:aa:6d:a7:54:52:00:67:89:ab. 
    -18:48 Server Notice    Creating multicast (ff02::1:2) socket on eth1/2 (eth1/2) interface. 
    -18:48 Server Debug     Cache: size set to 1048576 bytes, 1 cache entry size is 87 bytes, so maximum 12052 address-client pair(s) may be cached. 
    -18:48 Server Notice    Accepting connections. Next event in 4294967295 second(s).

    22.8. tcp_wrapper

    tcp_wrapper is a library which can help you to protect service against misuse.


    22.8.1. Filtering capabilities

    You can use tcp_wrapper for

    • Filtering against source addresses (IPv4 or IPv6)

    • Filtering against users (requires a running ident daemon on the client)


    22.8.2. Which program uses tcp_wrapper

    Following are known:

    • Each service which is called by xinetd (if xinetd is compiled using tcp_wrapper library)

    • sshd (if compiled using tcp_wrapper)


    22.8.3. Usage

    tcp_wrapper is controlled by two files name /etc/hosts.allow and /etc/hosts.deny. For more information see

    $ man hosts.allow

    22.8.3.1. Example for /etc/hosts.allow

    In this file, each service which should be positive filtered (means connects are accepted) need a line.

    sshd:           1.2.3. [2001:0db8:100:200::]/64
    -daytime-stream: 1.2.3. [2001:0db8:100:200::]/64

    Note: there are broken implementations around, which uses following broken IPv6 network description: [2001:0db8:100:200::/64]. Hopefully, such versions will be fixed soon.


    22.8.3.2. Example for /etc/hosts.deny

    This file contains all negative filter entries and should normally deny the rest using

    ALL: ALL

    If this node is a more sensible one you can replace the standard line above with this one, but this can cause a DoS attack (load of mailer and spool directory), if too many connects were made in short time. Perhaps a logwatch is better for such issues.

    ALL: ALL: spawn (echo "Attempt from %h %a to %d at `date`" 
    - | tee -a /var/log/tcp.deny.log | mail root@localhost)

    22.8.4. Logging

    Depending on the entry in the syslog daemon configuration file /etc/syslog.conf the tcp_wrapper logs normally into /var/log/secure.


    22.8.4.1. Refused connection

    A refused connection via IPv4 to an xinetd covered daytime service produces a line like following example

    Jan 2 20:40:44 gate xinetd-ipv6[12346]: FAIL: daytime-stream libwrap
    -¬ from=::ffff:1.2.3.4
    -Jan 2 20:32:06 gate xinetd-ipv6[12346]: FAIL: daytime-stream libwrap 
    - from=2001:0db8:100:200::212:34ff:fe12:3456

    A refused connection via IPv4 to an dual-listen sshd produces a line like following example

    Jan 2 20:24:17 gate sshd[12345]: refused connect from ::ffff:1.2.3.4
    -¬ (::ffff:1.2.3.4)
    -Jan 2 20:39:33 gate sshd[12345]: refused connect 
    - from 2001:0db8:100:200::212:34ff:fe12:3456
    -¬ (2001:0db8:100:200::212:34ff:fe12:3456)

    22.8.4.2. Permitted connection

    A permitted connection via IPv4 to an xinetd covered daytime service produces a line like following example

    Jan 2 20:37:50 gate xinetd-ipv6[12346]: START: daytime-stream pid=0
    -¬ from=::ffff:1.2.3.4 
    -Jan 2 20:37:56 gate xinetd-ipv6[12346]: START: daytime-stream pid=0 
    - from=2001:0db8:100:200::212:34ff:fe12:3456

    A permitted connection via IPv4 to an dual-listen sshd produces a line like following example

    Jan 2 20:43:10 gate sshd[21975]: Accepted password for user from ::ffff:1.2.3.4
    -¬ port 33381 ssh2
    -Jan 2 20:42:19 gate sshd[12345]: Accepted password for user 
    - from 2001:0db8:100:200::212:34ff:fe12:3456 port 33380 ssh2

    22.9. vsftpd

    22.9.1. Listening on IPv6 addresses

    Edit the configuration file, ususally /etc/vsftpd/vsftpd.conf, and adjust the listen option like

    listen_ipv6=yes

    That's all.


    22.10. proftpd

    22.10.1. Listening on IPv6 addresses

    Edit the configuration file, ususally /etc/proftpd.conf, but take care, not 100% logical in virtual host setup

    <VirtualHost 192.0.2.1>
    -        ...
    -        Bind 2001:0DB8::1
    -        ...
    -</VirtualHost>

    That's all.


    22.11. Other daemons

    Nowadays it's mostly simple, look for either a command line option or a configuration value to enable IPv6 listening. See manual page of the daemon or check related FAQs. It can happen that you can bind a daemon only to the IPv6-“any”-address (::) and not to bind to a dedicated IPv6 address, because the lack of support (depends on that what the programmer has implemented so far...).


    Chapter 23. Programming

    23.1. Programming using C-API

    Related RFCs:

    Following contents of this section is contributed by John Wenker, Sr. Software Engineer Performance Technologies San Diego, CA USA http://www.pt.com/.

    This section describes how to write IPv6 client-server applications under the Linux operating system. First thing's first, and credit must be given where it is due. The information contained in this section is derived from Chapters 2 through 4 of IPv6 Network Programming by Jun-ichiro itojun Hagino (ISBN 1-55558-318-0). The reader is encouraged to consult that book for more detailed information. It describes how to convert IPv4 applications to be IPv6 compatible in a protocol-independent way, and describes some of the common problems encountered during the conversion along with suggested solutions. At the time of this writing, this is the only book of which the author is aware that specifically addresses how to program IPv6 applications [since writing this section, the author has also become aware of the Porting applications to IPv6 HowTo by Eva M. Castro at http://jungla.dit.upm.es/~ecastro/IPv6-web/ipv6.html]. Unfortunately, of the almost 360 pages in the book, maybe 60 are actually useful (the chapters mentioned). Nevertheless, without the guidance of that book, the author would have been unable to perform his job duties or compose this HowTo. While most (but certainly not all) of the information in the Hagino book is available via the Linux 'man' pages, application programmers will save a significant amount of time and frustration by reading the indicated chapters of the book rather than searching through the 'man' pages and online documentation.

    Other than the Hagino book, any other information presented in this HowTo was obtained through trial and error. Some items or explanations may not be entirely “correct” in the grand IPv6 scheme, but seem to work in practical application.

    The discussion that follows assumes the reader is already experienced with the traditional TCP/IP socket API. For more information on traditional socket programming, the Internetworking with TCP/IP series of textbooks by Comer & Stevens is hard to beat, specifically Volume III: Client-Server Programming and Applications, Linux/POSIX Sockets Version (ISBN 0-13-032071-4). This HowTo also assumes that the reader has had at least a bare basic introduction to IPv6 and in particular the addressing scheme for network addresses (see Section 2.3).


    23.1.1. Address Structures

    This section provides a brief overview of the structures provided in the socket API to represent network addresses (or more specifically transport endpoints) when using the Internet protocols in a client-server application.


    23.1.1.1. IPv4 sockaddr_in

    In IPv4, network addresses are 32 bits long and define a network node. Addresses are written in dotted decimal notation, such as 192.0.2.1, where each number represents eight bits of the address. Such an IPv4 address is represented by the struct sockaddr_in data type, which is defined in <netinet/in.h>.

    struct sockaddr_in
    -{
    -   sa_family_t    sin_family;
    -   in_port_t      sin_port;
    -   struct in_addr sin_addr;
    -   /* Plus some padding for alignment */
    -};

    The sin_family component indicates the address family. For IPv4 addresses, this is always set to AF_INET. The sin_addr field contains the 32-bit network address (in network byte order). Finally, the sin_port component represents the transport layer port number (in network byte order). Readers should already be familiar with this structure, as this is the standard IPv4 address structure.


    23.1.1.2. IPv6 sockaddr_in6

    The biggest feature of IPv6 is its increased address space. Instead of 32-bit network addresses, IPv6 allots 128 bits to an address. Addresses are written in colon-hex notation of the form fe80::2c0:8cff:fe01:2345, where each hex number separated by colons represents 16 bits of the address. Two consecutive colons indicate a string of consecutive zeros for brevity, and at most only one double-colon may appear in the address. IPv6 addresses are represented by the struct sockaddr_in6 data type, also defined in <netinet/in.h>.

    struct sockaddr_in6
    -{
    -   sa_family_t     sin6_family;
    -   in_port_t       sin6_port;
    -   uint32_t        sin6_flowinfo;
    -   struct in6_addr sin6_addr;
    -   uint32_t        sin6_scope_id;
    -};

    The sin6_family, sin6_port, and sin6_addr components of the structure have the same meaning as the corresponding fields in the sockaddr_in structure. However, the sin6_family member is set to AF_INET6 for IPv6 addresses, and the sin6_addr field holds a 128-bit address instead of only 32 bits.

    The sin6_flowinfo field is used for flow control, but is not yet standardized and can be ignored.

    The sin6_scope_id field has an odd use, and it seems (at least to this naïve author) that the IPv6 designers took a huge step backwards when devising this. Apparently, 128-bit IPv6 network addresses are not unique. For example, it is possible to have two hosts, on separate networks, with the same link-local address (see Figure 1). In order to pass information to a specific host, more than just the network address is required; the scope identifier must also be specified. In Linux, the network interface name is used for the scope identifier (e.g. “eth0”) [be warned that the scope identifier is implementation dependent!]. Use the ifconfig(1M) command to display a list of active network interfaces.

    A colon-hex network address can be augmented with the scope identifier to produce a "scoped address”. The percent sign ('%') is used to delimit the network address from the scope identifier. For example, fe80::1%eth0 is a scoped IPv6 address where fe80::1 represents the 128-bit network address and eth0 is the network interface (i.e. the scope identifier). Thus, if a host resides on two networks, such as Host B in example below, the user now has to know which path to take in order to get to a particular host. In Figure 1, Host B addresses Host A using the scoped address fe80::1%eth0, while Host C is addressed with fe80::1%eth1.

    Host A (fe80::1) ---- eth0 ---- Host B ---- eth1 ---- Host C (fe80::1)

    Getting back to the sockaddr_in6 structure, its sin6_scope_id field contains the index of the network interface on which a host may be found. Server applications will have this field set automatically by the socket API when they accept a connection or receive a datagram. For client applications, if a scoped address is passed as the node parameter to getaddrinfo(3) (described later in this HowTo), then the sin6_scope_id field will be filled in correctly by the system upon return from the function; if a scoped address is not supplied, then the sin6_scope_id field must be explicitly set by the client software prior to attempting to communicate with the remote server. The if_nametoindex(3) function is used to translate a network interface name into its corresponding index. It is declared in <net/if.h>.


    23.1.1.3. Generic Addresses

    As any programmer familiar with the traditional TCP/IP socket API knows, several socket functions deal with "generic" pointers. For example, a pointer to a generic struct sockaddr data type is passed as a parameter to some socket functions (such as connect(2) or bind(2)) rather than a pointer to a specific address type. Be careful… the sockaddr_in6 structure is larger than the generic sockaddr structure! Thus, if your program receives a generic address whose actual type is unknown (e.g. it could be an IPv4 address structure or an IPv6 address structure), you must supply sufficient storage to hold the entire address. The struct sockaddr_storage data type is defined in <bits/socket.h> for this purpose [do not #include this file directly within an application; use <sys/socket.h> as usual, and <bits/socket.h> will be implicitly included].

    For example, consider the recvfrom(2) system call, which is used to receive a message from a remote peer. Its function prototype is:

    ssize_t recvfrom( int              s,
    -                  void            *buf,
    -                  size_t           len,
    -                  int              flags,
    -                  struct sockaddr *from,
    -                  socklen_t       *fromlen );

    The from parameter points to a generic sockaddr structure. If data can be received from an IPv6 peer on the socket referenced by s, then from should point to a data type of struct sockaddr_storage, as in the following dummy example:

    /*
    -** Read a message from a remote peer, and return a buffer pointer to
    -** the caller.
    -**
    -** 's' is the file descriptor for the socket.
    -*/
    -char *rcvMsg( int s )
    -{
    -   static char             bfr[ 1025 ];  /* Where the msg is stored. */
    -   ssize_t                 count;
    -   struct sockaddr_storage ss;           /* Where the peer adr goes. */
    -   socklen_t               sslen;
    -   sslen = sizeof( ss );
    -   count = recvfrom( s,
    -                     bfr,
    -                     sizeof( bfr ) - 1,
    -                     0,
    -                     (struct sockaddr*) &ss,
    -                     &sslen );
    -   bfr[ count ] = '\0';   /* Null-terminates the message. */
    -   return bfr;
    -}  /* End rcvMsg() */

    As seen in the above example, ss (a struct sockaddr_storage data object) is used to receive the peer address information, but it's address is typecast to a generic struct sockaddr* pointer in the call to recvfrom(2).


    23.1.2. Lookup Functions

    Traditionally, hostname and service name resolution were performed by functions such as gethostbyname(3) and getservbyname(3). These traditional lookup functions are still available, but they are not forward compatible to IPv6. Instead, the IPv6 socket API provides new lookup functions that consolidate the functionality of several traditional functions. These new lookup functions are also backward compatible with IPv4, so a programmer can use the same translation algorithm in an application for both the IPv4 and IPv6 protocols. This is an important feature, because obviously a global IPv6 infrastructure isn't going to be put in place overnight. Thus, during the transition period from IPv4 to IPv6, client-server applications should be designed with the flexibility to handle both protocols simultaneously. The example programs at the end of this chapter do just that.

    The primary lookup function in the new socket API is getaddrinfo(3). Its prototype is as follows.

    int getaddrinfo( const char             *node,
    -                 const char             *service,
    -                 const struct addrinfo  *hints,
    -                 struct addrinfo       **res );

    The node parameter is a pointer to the hostname or IP address being translated. The referenced string can be a hostname, IPv4 dotted decimal address, or IPv6 colon-hex address (possibly scoped). The service parameter is a pointer to the transport layer's service name or port number. It can be specified as a name found in /etc/services or a decimal number. getaddrinfo(3) resolves the host/service combination and returns a list of address records; a pointer to the list is placed in the location pointed at by res. For example, suppose a host can be identified by both an IPv4 and IPv6 address, and that the indicated service has both a TCP entry and UDP entry in /etc/services. In such a scenario, it is not inconceivable that four address records are returned; one for TCP/IPv6, one for UDP/IPv6, one for TCP/IPv4, and one for UDP/IPv4.

    The definition for struct addrinfo is found in <netdb.h> (as is the declaration for getaddrinfo(3) and the other functions described in this section). The structure has the following format:

    struct addrinfo
    -{
    -   int              ai_flags;
    -   int              ai_family;
    -   int              ai_socktype;
    -   int              ai_protocol;
    -   socklen_t        ai_addrlen;
    -   struct sockaddr *ai_addr;
    -   char            *ai_canonname;
    -   struct addrinfo *ai_next;
    -};

    Consult the 'man' page for getaddrinfo(3) for detailed information about the various fields; this HowTo only describes a subset of them, and only to the extent necessary for normal IPv6 programming.

    The ai_family, ai_socktype, and ai_protocol fields have the exact same meaning as the parameters to the socket(2) system call. The ai_family field indicates the protocol family (not the address family) associated with the record, and will be PF_INET6 for IPv6 or PF_INET for IPv4. The ai_socktype parameter indicates the type of socket to which the record corresponds; SOCK_STREAM for a reliable connection-oriented byte-stream or SOCK_DGRAM for connectionless communication. The ai_protocol field specifies the underlying transport protocol for the record.

    The ai_addr field points to a generic struct sockaddr object. Depending on the value in the ai_family field, it will point to either a struct sockaddr_in (PF_INET) or a struct sockaddr_in6 (PF_INET6). The ai_addrlen field contains the size of the object pointed at by the ai_addr field.

    As mentioned, getaddrinfo(3) returns a list of address records. The ai_next field points to the next record in the list.

    The hints parameter to getaddrinfo(3) is also of type struct addrinfo and acts as a filter for the address records returned in res. If hints is NULL, all matching records are returned; but if hints is non-NULL, the referenced structure gives "hints" to getaddrinfo(3) about which records to return. Only the ai_flags, ai_family, ai_socktype, and ai_protocol fields are significant in the hints structure, and all other fields should be set to zero.

    Programs can use hints->ai_family to specify the protocol family. For example, if it is set to PF_INET6, then only IPv6 address records are returned. Likewise, setting hints->ai_family to PF_INET results in only IPv4 address records being returned. If an application wants both IPv4 and IPv6 records, the field should be set to PF_UNSPEC.

    The hints->socktype field can be set to SOCK_STREAM to return only records that correspond to connection-oriented byte streams, SOCK_DGRAM to return only records corresponding to connectionless communication, or 0 to return both.

    For the Internet protocols, there is only one protocol associated with connection-oriented sockets (TCP) and one protocol associated with connectionless sockets (UDP), so setting hints->ai_socktype to SOCK_STREAM or SOCK_DGRAM is the same as saying, "Give me only TCP records," or "Give me only UDP records," respectively. With that in mind, the hints->ai_protocol field isn't really that important with the Internet protocols, and pretty much mirrors the hints->ai_socktype field. Nevertheless, hints->ai_protocol can be set to IPPROTO_TCP to return only TCP records, IPPROTO_UDP to return only UDP records, or 0 for both.

    The node or service parameter to gethostbyname(3) can be NULL, but not both. If node is NULL, then the ai_flags field of the hints parameter specifies how the network address in a returned record is set (i.e. the sin_addr or sin6_addr field of the object pointed at by the ai_addr component in a returned record). If the AI_PASSIVE flag is set in hints, then the returned network addresses are left unresolved (all zeros). This is how server applications would use getaddrinfo(3). If the flag is not set, then the address is set to the local loopback address (::1 for IPv6 or 127.0.0.1 for IPv4). This is one way a client application can specify that the target server is running on the same machine as the client. If the service parameter is NULL, the port number in the returned address records remains unresolved.

    The getaddrinfo(3) function returns zero on success, or an error code. In the case of an error, the gai_strerror(3) function is used to obtain a character pointer to an error message corresponding to the error code, just like strerror(3) does in the standard 'C' library.

    Once the address list is no longer needed, it must be freed by the application. This is done with the freeaddrinfo(3) function.

    The last function that will be mentioned in this section is getnameinfo(3). This function is the inverse of getaddrinfo(3); it is used to create a string representation of the hostname and service from a generic struct sockaddr data object. It has the following prototype.

    int getnameinfo( const struct sockaddr *sa,
    -                 socklen_t              salen,
    -                 char                  *host,
    -                 size_t                 hostlen,
    -                 char                  *serv,
    -                 size_t                 servlen,
    -                 int                    flags );

    The sa parameter points to the address structure in question, and salen contains its size. The host parameter points to a buffer where the null-terminated hostname string is placed, and the hostlen parameter is the size of that buffer. If there is no hostname that corresponds to the address, then the network address (dotted decimal or colon-hex) is placed in host. Likewise, the serv parameter points to a buffer where the null-terminated service name string (or port number) is placed, and the servlen parameter is the size of that buffer. The flags parameter modifies the function's behavior; in particular, the NI_NUMERICHOST flag indicates that the converted hostname should always be formatted in numeric form (i.e. dotted decimal or colon-hex), and the NI_NUMERICSERV flag indicates that the converted service should always be in numeric form (i.e. the port number).

    The symbols NI_MAXHOST and NI_MAXSERV are available to applications and represent the maximum size of any converted hostname or service name, respectively. Use these when declaring output buffers for getnameinfo(3).


    23.1.3. Quirks Encountered

    Before jumping into the programming examples, there are several quirks in IPv6 of which the reader should be aware. The more significant ones (in addition to the non-uniqueness of IPv6 network addresses already discussed) are described in the paragraphs below.


    23.1.3.1. IPv4 Mapped Addresses

    For security reasons that this author won't pretend to understand, "IPv4 mapped addresses" should not be allowed in IPv6-capable server applications. To put it in terms that everyone can understand, this simply means that a server should not accept IPv4 traffic on an IPv6 socket (an otherwise legal operation). An IPv4 mapped address is a mixed-format address of the form:

    ::ffff:192.0.2.1

    where the first portion is in IPv6 colon-hex format and the last portion is in IPv4 dotted decimal notation. The dotted decimal IPv4 address is the actual network address, but it is being mapped into an IPv6 compatible format.

    To prevent IPv4 mapped addresses from being accepted on an IPv6 socket, server applications must explicitly set the IPV6_V6ONLY socket option on all IPv6 sockets created [the Hagino book implies that this is only a concern with server applications. However, it has been observed during testing that if a client application uses an IPv4 mapped address to specify the target server, and the target server has IPv4 mapped addresses disabled, the connection still completes regardless. On the server side, the connection endpoint is an IPv4 socket as desired; but on the client side, the connection endpoint is an IPv6 socket. Setting the IPV6_V6ONLY socket option on the client side as well as the server side prevents any connection from being established at all.]. There's only one problem. Apparently, IPV6_V6ONLY isn't defined on all systems [or at least it wasn't in 2005 when the Hagino book was written]. The server example at the end of this chapter provides a method for handling this problem.

    If IPv4 traffic cannot be handled on IPv6 sockets, then that implies that server applications must open both an IPv4 and IPv6 socket for a particular network service if it wants to handle requests from either protocol. This goes back to the flexibility issue mentioned earlier. If getaddrinfo(3) returns multiple address records, then server applications should traverse the list and open a passive socket for each address provided.


    23.1.3.2. Cannot Specify the Scope Identifier in /etc/hosts

    It is possible to assign a hostname to an IPv6 network address in /etc/hosts. For example, the following is an excerpt from the /etc/hosts file on the author's development system.

            ::1                        localhost
    -        127.0.0.1                  localhost
    -        fe80::2c0:8cff:fe01:2345   pt141
    -        192.0.2.1                  pt141

    The "localhost" and "pt141" hostnames can be translated to either an IPv4 or IPv6 network address. So, for example, if "pt141" is passed as the node parameter to getaddrinfo(3), the function returns both an IPv4 and IPv6 address record for the host (assuming the behavior hasn't been modified by the hints parameter). Unfortunately, a scoped address cannot be used in /etc/hosts. Doing so results in getaddrinfo(3) returning only the IPv4 record.


    23.1.3.3. Client & Server Residing on the Same Machine

    Suppose a machine has the IPv4 address 192.0.2.1. A client application running on that machine can connect to a server application on the same machine by using either the local loopback address (127.0.0.1) or the network address (192.0.2.1) as the target server. Much to this author's surprise (and dismay), it turns out that an IPv6 client application cannot connect to a server application on the same machine if it uses the network address of that machine as the target; it must use the local loopback address (::1).


    23.1.4. Putting It All Together (A Client-Server Programming Example)

    Now it's time to put everything discussed thus far together into a sample client-server application. The remainder of this section is devoted to a remote time-of-day application (the 'daytime' Internet service) [I noticed that Ms. Castro used a 'daytime' example in her Porting applications to IPv6 HowTo. For the record, the source code presented here is original, developed from scratch, and any similarity between it and any other publicly available 'daytime' example is purely coincidental.]. The source code presented in this section was developed and tested on a RedHat Linux release using the 2.6 kernel (2.6.9 to be specific). Readers may use the source code freely, so long as proper credit is attributed; but of course the standard disclaimer must be given first:

    Although the sample source code is believed to be free of errors, the author makes no guarantees as to its reliability, especially considering that some error paths were intentionally omitted for brevity. Use it at your own risk!

    When you get right down to it, there really aren't that many differences between IPv4 and IPv6 applications. The trick is to code IPv6 applications in a protocol-independent manner, such that they can handle both IPv4 and IPv6 simultaneously and transparently. This sample application does just that. The only protocol-dependent code in the example occurs when printing network addresses in verbose mode; but only after the ai_family field in the addrinfo structure has been checked, so the programs know exactly what type of address they're handling at the time.


    23.1.4.1. 'Daytime' Server Code

    The server code is found in file tod6d.c (time-of-day IPv6 daemon). Once built, the server may be started using the following command syntax (assuming tod6d is the executable file):

    tod6d [-v] [service]

    ARGUMENTS:

    service

    The service (or well-known port) on which to listen. Default is "daytime".

    OPTIONS:

    -v

    Turn on verbose mode.

    The server handles both TCP and UDP requests on the network. The server source code contained in tod6d.c follows:

    /******************************************************************************
    -* File: tod6d.c
    -* Description: Contains source code for an IPv6-capable 'daytime' server.
    -* Author: John Wenker, Sr. Software Engineer,
    -*         Performance Technologies, San Diego, USA
    -******************************************************************************/
    -/*
    -** System header files.
    -*/
    -#include <errno.h>        /* errno declaration & error codes.            */
    -#include <netdb.h>        /* getaddrinfo(3) et al.                       */
    -#include <netinet/in.h>   /* sockaddr_in & sockaddr_in6 definition.      */
    -#include <stdio.h>        /* printf(3) et al.                            */
    -#include <stdlib.h>       /* exit(2).                                    */
    -#include <string.h>       /* String manipulation & memory functions.     */
    -#include <sys/poll.h>     /* poll(2) and related definitions.            */
    -#include <sys/socket.h>   /* Socket functions (socket(2), bind(2), etc). */
    -#include <time.h>         /* time(2) & ctime(3).                         */
    -#include <unistd.h>       /* getopt(3), read(2), etc.                    */
    -/*
    -** Constants.
    -*/
    -#define DFLT_SERVICE "daytime"   /* Default service name.                    */
    -#define INVALID_DESC -1          /* Invalid file descriptor.                 */
    -#define MAXCONNQLEN  3           /* Max nbr of connection requests to queue. */
    -#define MAXTCPSCKTS  2           /* One TCP socket for IPv4 & one for IPv6.  */
    -#define MAXUDPSCKTS  2           /* One UDP socket for IPv4 & one for IPv6.  */
    -#define VALIDOPTS    "v"         /* Valid command options.                   */
    -/*
    -** Simple boolean type definition.
    -*/
    -typedef enum { false = 0, true } boolean;
    -/*
    -** Prototypes for internal helper functions.
    -*/
    -static int  openSckt( const char *service,
    -                      const char *protocol,
    -                      int         desc[ ],
    -                      size_t     *descSize );
    -static void tod( int    tSckt[ ],
    -                 size_t tScktSize,
    -                 int    uSckt[ ],
    -                 size_t uScktSize );
    -/*
    -** Global (within this file only) data objects.
    -*/
    -static char        hostBfr[ NI_MAXHOST ];   /* For use w/getnameinfo(3).    */
    -static const char *pgmName;                 /* Program name w/o dir prefix. */
    -static char        servBfr[ NI_MAXSERV ];   /* For use w/getnameinfo(3).    */
    -static boolean     verbose = false;         /* Verbose mode indication.     */
    -/*
    -** Usage macro for command syntax violations.
    -*/
    -#define USAGE                                       \
    -        {                                           \
    -           fprintf( stderr,                         \
    -                    "Usage: %s [-v] [service]\n",   \
    -                    pgmName );                      \
    -           exit( 127 );                             \
    -        }  /* End USAGE macro. */
    -/*
    -** Macro to terminate the program if a system call error occurs.  The system
    -** call must be one of the usual type that returns -1 on error.  This macro is
    -** a modified version of a macro authored by Dr. V. Vinge, SDSU Dept. of
    -** Computer Science (retired)... best professor I ever had.  I hear he writes
    -** great science fiction in addition to robust code, too.
    -*/
    -#define CHK(expr)                                                   \
    -        do                                                          \
    -        {                                                           \
    -           if ( (expr) == -1 )                                      \
    -           {                                                        \
    -              fprintf( stderr,                                      \
    -                       "%s (line %d): System call ERROR - %s.\n",   \
    -                       pgmName,                                     \
    -                       __LINE__,                                    \
    -                       strerror( errno ) );                         \
    -              exit( 1 );                                            \
    -           }   /* End IF system call failed. */                     \
    -        } while ( false )
    -/******************************************************************************
    -* Function: main
    -*
    -* Description:
    -*    Set up a time-of-day server and handle network requests.  This server
    -*    handles both TCP and UDP requests.
    -*
    -* Parameters:
    -*    The usual argc and argv parameters to a main() function.
    -*
    -* Return Value:
    -*    This is a daemon program and never returns.  However, in the degenerate
    -*    case where no sockets are created, the function returns zero.
    -******************************************************************************/
    -int main( int   argc,
    -          char *argv[ ] )
    -{
    -   int         opt;
    -   const char *service   = DFLT_SERVICE;
    -   int         tSckt[ MAXTCPSCKTS ];     /* Array of TCP socket descriptors. */
    -   size_t      tScktSize = MAXTCPSCKTS;  /* Size of uSckt (# of elements).   */
    -   int         uSckt[ MAXUDPSCKTS ];     /* Array of UDP socket descriptors. */
    -   size_t      uScktSize = MAXUDPSCKTS;  /* Size of uSckt (# of elements).   */
    -   /*
    -   ** Set the program name (w/o directory prefix).
    -   */
    -   pgmName = strrchr( argv[ 0 ], '/' );
    -   pgmName = pgmName == NULL  ?  argv[ 0 ]  :  pgmName + 1;
    -   /*
    -   ** Process command options.
    -   */
    -   opterr = 0;   /* Turns off "invalid option" error messages. */
    -   while ( ( opt = getopt( argc, argv, VALIDOPTS ) ) >= 0 )
    -   {
    -      switch ( opt )
    -      {
    -         case 'v':   /* Verbose mode. */
    -         {
    -            verbose = true;
    -            break;
    -         }
    -         default:
    -         {
    -            USAGE;
    -         }
    -      }  /* End SWITCH on command option. */
    -   }  /* End WHILE processing options. */
    -   /*
    -   ** Process command line arguments.
    -   */
    -   switch ( argc - optind )
    -   {
    -      case 0:  break;
    -      case 1:  service = argv[ optind ]; break;
    -      default: USAGE;
    -   }  /* End SWITCH on number of command line arguments. */
    -   /*
    -   ** Open both a TCP and UDP socket, for both IPv4 & IPv6, on which to receive
    -   ** service requests.
    -   */
    -   if ( ( openSckt( service, "tcp", tSckt, &tScktSize ) < 0 ) ||
    -        ( openSckt( service, "udp", uSckt, &uScktSize ) < 0 ) )
    -   {
    -      exit( 1 );
    -   }
    -   /*
    -   ** Run the time-of-day server.
    -   */
    -   if ( ( tScktSize > 0 ) || ( uScktSize > 0 ) )
    -   {
    -      tod( tSckt,         /* tod() never returns. */
    -           tScktSize,
    -           uSckt,
    -           uScktSize );
    -   }
    -   /*
    -   ** Since tod() never returns, execution only gets here if no sockets were
    -   ** created.
    -   */
    -   if ( verbose )
    -   {
    -      fprintf( stderr,
    -               "%s: No sockets opened... terminating.\n",
    -               pgmName );
    -   }
    -   return 0;
    -}  /* End main() */
    -/******************************************************************************
    -* Function: openSckt
    -*
    -* Description:
    -*    Open passive (server) sockets for the indicated inet service & protocol.
    -*    Notice in the last sentence that "sockets" is plural.  During the interim
    -*    transition period while everyone is switching over to IPv6, the server
    -*    application has to open two sockets on which to listen for connections...
    -*    one for IPv4 traffic and one for IPv6 traffic.
    -*
    -* Parameters:
    -*    service  - Pointer to a character string representing the well-known port
    -*               on which to listen (can be a service name or a decimal number).
    -*    protocol - Pointer to a character string representing the transport layer
    -*               protocol (only "tcp" or "udp" are valid).
    -*    desc     - Pointer to an array into which the socket descriptors are
    -*               placed when opened.
    -*    descSize - This is a value-result parameter.  On input, it contains the
    -*               max number of descriptors that can be put into 'desc' (i.e. the
    -*               number of elements in the array).  Upon return, it will contain
    -*               the number of descriptors actually opened.  Any unused slots in
    -*               'desc' are set to INVALID_DESC.
    -*
    -* Return Value:
    -*    0 on success, -1 on error.
    -******************************************************************************/
    -static int openSckt( const char *service,
    -                     const char *protocol,
    -                     int         desc[ ],
    -                     size_t     *descSize )
    -{
    -   struct addrinfo *ai;
    -   int              aiErr;
    -   struct addrinfo *aiHead;
    -   struct addrinfo  hints    = { .ai_flags  = AI_PASSIVE,    /* Server mode. 
    -¬ */
    -                                 .ai_family = PF_UNSPEC };   /* IPv4 or IPv6.
    -¬ */
    -   size_t           maxDescs = *descSize;
    -   /*
    -   ** Initialize output parameters.  When the loop completes, *descSize is 0.
    -   */
    -   while ( *descSize > 0 )
    -   {
    -      desc[ --( *descSize ) ] = INVALID_DESC;
    -   }
    -   /*
    -   ** Check which protocol is selected (only TCP and UDP are valid).
    -   */
    -   if ( strcmp( protocol, "tcp" ) == 0 )        /* TCP protocol.     */
    -   {
    -      hints.ai_socktype = SOCK_STREAM;
    -      hints.ai_protocol = IPPROTO_TCP;
    -   }
    -   else if ( strcmp( protocol, "udp" ) == 0 )   /* UDP protocol.     */
    -   {
    -      hints.ai_socktype = SOCK_DGRAM;
    -      hints.ai_protocol = IPPROTO_UDP;
    -   }
    -   else                                         /* Invalid protocol. */
    -   {
    -      fprintf( stderr,
    -               "%s (line %d): ERROR - Unknown transport "
    -               "layer protocol \"%s\".\n",
    -               pgmName,
    -               __LINE__,
    -               protocol );
    -      return -1;
    -   }
    -   /*
    -   ** Look up the service's well-known port number.  Notice that NULL is being
    -   ** passed for the 'node' parameter, and that the AI_PASSIVE flag is set in
    -   ** 'hints'.  Thus, the program is requesting passive address information.
    -   ** The network address is initialized to :: (all zeros) for IPv6 records, or
    -   ** 0.0.0.0 for IPv4 records.
    -   */
    -   if ( ( aiErr = getaddrinfo( NULL,
    -                               service,
    -                               &hints,
    -                               &aiHead ) ) != 0 )
    -   {
    -      fprintf( stderr,
    -               "%s (line %d): ERROR - %s.\n",
    -               pgmName,
    -               __LINE__,
    -               gai_strerror( aiErr ) );
    -      return -1;
    -   }
    -   /*
    -   ** For each of the address records returned, attempt to set up a passive
    -   ** socket.
    -   */
    -   for ( ai = aiHead;
    -         ( ai != NULL ) && ( *descSize < maxDescs );
    -         ai = ai->ai_next )
    -   {
    -      if ( verbose )
    -      {
    -         /*
    -         ** Display the current address info.   Start with the protocol-
    -         ** independent fields first.
    -         */
    -         fprintf( stderr,
    -                  "Setting up a passive socket based on the "
    -                  "following address info:\n"
    -                  "   ai_flags     = 0x%02X\n"
    -                  "   ai_family    = %d (PF_INET = %d, PF_INET6 = %d)\n"
    -                  "   ai_socktype  = %d (SOCK_STREAM = %d, SOCK_DGRAM = %d)\n"
    -                  "   ai_protocol  = %d (IPPROTO_TCP = %d, IPPROTO_UDP = %d)\n"
    -                  "   ai_addrlen   = %d (sockaddr_in = %d, "
    -                  "sockaddr_in6 = %d)\n",
    -                  ai->ai_flags,
    -                  ai->ai_family,
    -                  PF_INET,
    -                  PF_INET6,
    -                  ai->ai_socktype,
    -                  SOCK_STREAM,
    -                  SOCK_DGRAM,
    -                  ai->ai_protocol,
    -                  IPPROTO_TCP,
    -                  IPPROTO_UDP,
    -                  ai->ai_addrlen,
    -                  sizeof( struct sockaddr_in ),
    -                  sizeof( struct sockaddr_in6 ) );
    -         /*
    -         ** Now display the protocol-specific formatted socket address.  Note
    -         ** that the program is requesting that getnameinfo(3) convert the
    -         ** host & service into numeric strings.
    -         */
    -         getnameinfo( ai->ai_addr,
    -                      ai->ai_addrlen,
    -                      hostBfr,
    -                      sizeof( hostBfr ),
    -                      servBfr,
    -                      sizeof( servBfr ),
    -                      NI_NUMERICHOST | NI_NUMERICSERV );
    -         switch ( ai->ai_family )
    -         {
    -            case PF_INET:   /* IPv4 address record. */
    -            {
    -               struct sockaddr_in *p = (struct sockaddr_in*) ai->ai_addr;
    -               fprintf( stderr,
    -                        "   ai_addr      = sin_family:   %d (AF_INET = %d, "
    -                        "AF_INET6 = %d)\n"
    -                        "                  sin_addr:     %s\n"
    -                        "                  sin_port:     %s\n",
    -                        p->sin_family,
    -                        AF_INET,
    -                        AF_INET6,
    -                        hostBfr,
    -                        servBfr );
    -               break;
    -            }  /* End CASE of IPv4. */
    -            case PF_INET6:   /* IPv6 address record. */
    -            {
    -               struct sockaddr_in6 *p = (struct sockaddr_in6*) ai->ai_addr;
    -               fprintf( stderr,
    -                        "   ai_addr      = sin6_family:   %d (AF_INET = %d, "
    -                        "AF_INET6 = %d)\n"
    -                        "                  sin6_addr:     %s\n"
    -                        "                  sin6_port:     %s\n"
    -                        "                  sin6_flowinfo: %d\n"
    -                        "                  sin6_scope_id: %d\n",
    -                        p->sin6_family,
    -                        AF_INET,
    -                        AF_INET6,
    -                        hostBfr,
    -                        servBfr,
    -                        p->sin6_flowinfo,
    -                        p->sin6_scope_id );
    -               break;
    -            }  /* End CASE of IPv6. */
    -            default:   /* Can never get here, but just for completeness. */
    -            {
    -               fprintf( stderr,
    -                        "%s (line %d): ERROR - Unknown protocol family (%d).\n",
    -                        pgmName,
    -                        __LINE__,
    -                        ai->ai_family );
    -               freeaddrinfo( aiHead );
    -               return -1;
    -            }  /* End DEFAULT case (unknown protocol family). */
    -         }  /* End SWITCH on protocol family. */
    -      }  /* End IF verbose mode. */
    -      /*
    -      ** Create a socket using the info in the addrinfo structure.
    -      */
    -      CHK( desc[ *descSize ] = socket( ai->ai_family,
    -                                       ai->ai_socktype,
    -                                       ai->ai_protocol ) );
    -      /*
    -      ** Here is the code that prevents "IPv4 mapped addresses", as discussed
    -      ** in Section 22.1.3.1.  If an IPv6 socket was just created, then set the
    -      ** IPV6_V6ONLY socket option.
    -      */
    -      if ( ai->ai_family == PF_INET6 )
    -      {
    -#if defined( IPV6_V6ONLY )
    -         /*
    -         ** Disable IPv4 mapped addresses.
    -         */
    -         int v6Only = 1;
    -         CHK( setsockopt( desc[ *descSize ],
    -                          IPPROTO_IPV6,
    -                          IPV6_V6ONLY,
    -                          &v6Only,
    -                          sizeof( v6Only ) ) );
    -#else
    -         /*
    -         ** IPV6_V6ONLY is not defined, so the socket option can't be set and
    -         ** thus IPv4 mapped addresses can't be disabled.  Print a warning
    -         ** message and close the socket.  Design note: If the
    -         ** #if...#else...#endif construct were removed, then this program
    -         ** would not compile (because IPV6_V6ONLY isn't defined).  That's an
    -         ** acceptable approach; IPv4 mapped addresses are certainly disabled
    -         ** if the program can't build!  However, since this program is also
    -         ** designed to work for IPv4 sockets as well as IPv6, I decided to
    -         ** allow the program to compile when IPV6_V6ONLY is not defined, and
    -         ** turn it into a run-time warning rather than a compile-time error.
    -         ** IPv4 mapped addresses are still disabled because _all_ IPv6 traffic
    -         ** is disabled (all IPv6 sockets are closed here), but at least this
    -         ** way the server can still service IPv4 network traffic.
    -         */
    -         fprintf( stderr,
    -                  "%s (line %d): WARNING - Cannot set IPV6_V6ONLY socket "
    -                  "option.  Closing IPv6 %s socket.\n",
    -                  pgmName,
    -                  __LINE__,
    -                  ai->ai_protocol == IPPROTO_TCP  ?  "TCP"  :  "UDP" );
    -         CHK( close( desc[ *descSize ] ) );
    -         continue;   /* Go to top of FOR loop w/o updating *descSize! */
    -#endif /* IPV6_V6ONLY */
    -      }  /* End IF this is an IPv6 socket. */
    -      /*
    -      ** Bind the socket.  Again, the info from the addrinfo structure is used.
    -      */
    -      CHK( bind( desc[ *descSize ],
    -                 ai->ai_addr,
    -                 ai->ai_addrlen ) );
    -      /*
    -      ** If this is a TCP socket, put the socket into passive listening mode
    -      ** (listen is only valid on connection-oriented sockets).
    -      */
    -      if ( ai->ai_socktype == SOCK_STREAM )
    -      {
    -         CHK( listen( desc[ *descSize ],
    -                      MAXCONNQLEN ) );
    -      }
    -      /*
    -      ** Socket set up okay.  Bump index to next descriptor array element.
    -      */
    -      *descSize += 1;
    -   }  /* End FOR each address info structure returned. */
    -   /*
    -   ** Dummy check for unused address records.
    -   */
    -   if ( verbose && ( ai != NULL ) )
    -   {
    -      fprintf( stderr,
    -               "%s (line %d): WARNING - Some address records were "
    -               "not processed due to insufficient array space.\n",
    -               pgmName,
    -               __LINE__ );
    -   }  /* End IF verbose and some address records remain unprocessed. */
    -   /*
    -   ** Clean up.
    -   */
    -   freeaddrinfo( aiHead );
    -   return 0;
    -}  /* End openSckt() */
    -/******************************************************************************
    -* Function: tod
    -*
    -* Description:
    -*    Listen on a set of sockets and send the current time-of-day to any
    -*    clients.  This function never returns.
    -*
    -* Parameters:
    -*    tSckt     - Array of TCP socket descriptors on which to listen.
    -*    tScktSize - Size of the tSckt array (nbr of elements).
    -*    uSckt     - Array of UDP socket descriptors on which to listen.
    -*    uScktSize - Size of the uSckt array (nbr of elements).
    -*
    -* Return Value: None.
    -******************************************************************************/
    -static void tod( int    tSckt[ ],
    -                 size_t tScktSize,
    -                 int    uSckt[ ],
    -                 size_t uScktSize )
    -{
    -   char                     bfr[ 256 ];
    -   ssize_t                  count;
    -   struct pollfd           *desc;
    -   size_t                   descSize = tScktSize + uScktSize;
    -   int                      idx;
    -   int                      newSckt;
    -   struct sockaddr         *sadr;
    -   socklen_t                sadrLen;
    -   struct sockaddr_storage  sockStor;
    -   int                      status;
    -   size_t                   timeLen;
    -   char                    *timeStr;
    -   time_t                   timeVal;
    -   ssize_t                  wBytes;
    -   /*
    -   ** Allocate memory for the poll(2) array.
    -   */
    -   desc = malloc( descSize * sizeof( struct pollfd ) );
    -   if ( desc == NULL )
    -   {
    -      fprintf( stderr,
    -               "%s (line %d): ERROR - %s.\n",
    -               pgmName,
    -               __LINE__,
    -               strerror( ENOMEM ) );
    -      exit( 1 );
    -   }
    -   /*
    -   ** Initialize the poll(2) array.
    -   */
    -   for ( idx = 0;     idx < descSize;     idx++ )
    -   {
    -      desc[ idx ].fd      = idx < tScktSize  ?  tSckt[ idx ]
    -                                             :  uSckt[ idx - tScktSize ];
    -      desc[ idx ].events  = POLLIN;
    -      desc[ idx ].revents = 0;
    -   }
    -   /*
    -   ** Main time-of-day server loop.  Handles both TCP & UDP requests.  This is
    -   ** an interative server, and all requests are handled directly within the
    -   ** main loop.
    -   */
    -   while ( true )   /* Do forever. */
    -   {
    -      /*
    -      ** Wait for activity on one of the sockets.  The DO..WHILE construct is
    -      ** used to restart the system call in the event the process is
    -      ** interrupted by a signal.
    -      */
    -      do
    -      {
    -         status = poll( desc,
    -                        descSize,
    -                        -1 /* Wait indefinitely for input. */ );
    -      } while ( ( status < 0 ) && ( errno == EINTR ) );
    -      CHK( status );   /* Check for a bona fide system call error. */
    -      /*
    -      ** Get the current time.
    -      */
    -      timeVal = time( NULL );
    -      timeStr = ctime( &timeVal );
    -      timeLen = strlen( timeStr );
    -      /*
    -      ** Indicate that there is new network activity.
    -      */
    -      if ( verbose )
    -      {
    -         char *s = malloc( timeLen+1 );
    -         strcpy( s, timeStr );
    -         s[ timeLen-1 ] = '\0';   /* Overwrite '\n' in date string. */
    -         fprintf( stderr,
    -                  "%s: New network activity on %s.\n",
    -                  pgmName,
    -                  s );
    -         free( s );
    -      }  /* End IF verbose. */
    -      /*
    -      ** Process sockets with input available.
    -      */
    -      for ( idx = 0;     idx < descSize;     idx++ )
    -      {
    -         switch ( desc[ idx ].revents )
    -         {
    -            case 0:        /* No activity on this socket; try the next. */
    -               continue;
    -            case POLLIN:   /* Network activity.  Go process it.         */
    -               break;
    -            default:       /* Invalid poll events.                      */
    -            {
    -               fprintf( stderr,
    -                        "%s (line %d): ERROR - Invalid poll event (0x%02X).\n",
    -                        pgmName,
    -                        __LINE__,
    -                        desc[ idx ].revents );
    -               exit( 1 );
    -            }
    -         }  /* End SWITCH on returned poll events. */
    -         /*
    -         ** Determine if this is a TCP request or UDP request.
    -         */
    -         if ( idx < tScktSize )
    -         {
    -            /*
    -            ** TCP connection requested.  Accept it.  Notice the use of
    -            ** the sockaddr_storage data type.
    -            */
    -            sadrLen = sizeof( sockStor );
    -            sadr    = (struct sockaddr*) &sockStor;
    -            CHK( newSckt = accept( desc[ idx ].fd,
    -                                   sadr,
    -                                   &sadrLen ) );
    -            CHK( shutdown( newSckt,       /* Server never recv's anything. */
    -                           SHUT_RD ) );
    -            if ( verbose )
    -            {
    -               /*
    -               ** Display the socket address of the remote client.  Begin with
    -               ** the address-independent fields.
    -               */
    -               fprintf( stderr,
    -                        "Sockaddr info for new TCP client:\n"
    -                        "   sa_family = %d (AF_INET = %d, AF_INET6 = %d)\n"
    -                        "   addr len  = %d (sockaddr_in = %d, "
    -                        "sockaddr_in6 = %d)\n",
    -                        sadr->sa_family,
    -                        AF_INET,
    -                        AF_INET6,
    -                        sadrLen,
    -                        sizeof( struct sockaddr_in ),
    -                        sizeof( struct sockaddr_in6 ) );
    -               /*
    -               ** Display the address-specific fields.
    -               */
    -               getnameinfo( sadr,
    -                            sadrLen,
    -                            hostBfr,
    -                            sizeof( hostBfr ),
    -                            servBfr,
    -                            sizeof( servBfr ),
    -                            NI_NUMERICHOST | NI_NUMERICSERV );
    -               /*
    -               ** Notice that we're switching on an address family now, not a
    -               ** protocol family.
    -               */
    -               switch ( sadr->sa_family )
    -               {
    -                  case AF_INET:   /* IPv4 address. */
    -                  {
    -                     struct sockaddr_in *p = (struct sockaddr_in*) sadr;
    -                     fprintf( stderr,
    -                              "   sin_addr  = sin_family: %d\n"
    -                              "               sin_addr:   %s\n"
    -                              "               sin_port:   %s\n",
    -                              p->sin_family,
    -                              hostBfr,
    -                              servBfr );
    -                     break;
    -                  }  /* End CASE of IPv4. */
    -                  case AF_INET6:   /* IPv6 address. */
    -                  {
    -                     struct sockaddr_in6 *p = (struct sockaddr_in6*) sadr;
    -                     fprintf( stderr,
    -                              "   sin6_addr = sin6_family:   %d\n"
    -                              "               sin6_addr:     %s\n"
    -                              "               sin6_port:     %s\n"
    -                              "               sin6_flowinfo: %d\n"
    -                              "               sin6_scope_id: %d\n",
    -                              p->sin6_family,
    -                              hostBfr,
    -                              servBfr,
    -                              p->sin6_flowinfo,
    -                              p->sin6_scope_id );
    -                     break;
    -                  }  /* End CASE of IPv6. */
    -                  default:   /* Can never get here, but for completeness. */
    -                  {
    -                     fprintf( stderr,
    -                              "%s (line %d): ERROR - Unknown address "
    -                              "family (%d).\n",
    -                              pgmName,
    -                              __LINE__,
    -                              sadr->sa_family );
    -                     break;
    -                  }  /* End DEFAULT case (unknown address family). */
    -               }  /* End SWITCH on address family. */
    -            }  /* End IF verbose mode. */
    -            /*
    -            ** Send the TOD to the client.
    -            */
    -            wBytes = timeLen;
    -            while ( wBytes > 0 )
    -            {
    -               do
    -               {
    -                  count = write( newSckt,
    -                                 timeStr,
    -                                 wBytes );
    -               } while ( ( count < 0 ) && ( errno == EINTR ) );
    -               CHK( count );   /* Check for a bona fide error. */
    -               wBytes -= count;
    -            }  /* End WHILE there is data to send. */
    -            CHK( close( newSckt ) );
    -         }  /* End IF this was a TCP connection request. */
    -         else
    -         {
    -            /*
    -            ** This is a UDP socket, and a datagram is available.  The funny
    -            ** thing about UDP requests is that this server doesn't require any
    -            ** client input; but it can't send the TOD unless it knows a client
    -            ** wants the data, and the only way that can occur with UDP is if
    -            ** the server receives a datagram from the client.  Thus, the
    -            ** server must receive _something_, but the content of the datagram
    -            ** is irrelevant.  Read in the datagram.  Again note the use of
    -            ** sockaddr_storage to receive the address.
    -            */
    -            sadrLen = sizeof( sockStor );
    -            sadr    = (struct sockaddr*) &sockStor;
    -            CHK( count = recvfrom( desc[ idx ].fd,
    -                                   bfr,
    -                                   sizeof( bfr ),
    -                                   0,
    -                                   sadr,
    -                                   &sadrLen ) );
    -            /*
    -            ** Display whatever was received on stdout.
    -            */
    -            if ( verbose )
    -            {
    -               ssize_t rBytes = count;
    -               fprintf( stderr,
    -                        "%s: UDP datagram received (%d bytes).\n",
    -                        pgmName,
    -                        count );
    -               while ( count > 0 )
    -               {
    -                  fputc( bfr[ rBytes - count-- ],
    -                         stdout );
    -               }
    -               if ( bfr[ rBytes-1 ] != '\n' )
    -                  fputc( '\n', stdout );   /* Newline also flushes stdout. */
    -               /*
    -               ** Display the socket address of the remote client.  Address-
    -               ** independent fields first.
    -               */
    -               fprintf( stderr,
    -                        "Remote client's sockaddr info:\n"
    -                        "   sa_family = %d (AF_INET = %d, AF_INET6 = %d)\n"
    -                        "   addr len  = %d (sockaddr_in = %d, "
    -                        "sockaddr_in6 = %d)\n",
    -                        sadr->sa_family,
    -                        AF_INET,
    -                        AF_INET6,
    -                        sadrLen,
    -                        sizeof( struct sockaddr_in ),
    -                        sizeof( struct sockaddr_in6 ) );
    -               /*
    -               ** Display the address-specific information.
    -               */
    -               getnameinfo( sadr,
    -                            sadrLen,
    -                            hostBfr,
    -                            sizeof( hostBfr ),
    -                            servBfr,
    -                            sizeof( servBfr ),
    -                            NI_NUMERICHOST | NI_NUMERICSERV );
    -               switch ( sadr->sa_family )
    -               {
    -                  case AF_INET:   /* IPv4 address. */
    -                  {
    -                     struct sockaddr_in *p = (struct sockaddr_in*) sadr;
    -                     fprintf( stderr,
    -                              "   sin_addr  = sin_family: %d\n"
    -                              "               sin_addr:   %s\n"
    -                              "               sin_port:   %s\n",
    -                              p->sin_family,
    -                              hostBfr,
    -                              servBfr );
    -                     break;
    -                  }  /* End CASE of IPv4 address. */
    -                  case AF_INET6:   /* IPv6 address. */
    -                  {
    -                     struct sockaddr_in6 *p = (struct sockaddr_in6*) sadr;
    -                     fprintf( stderr,
    -                              "   sin6_addr = sin6_family:   %d\n"
    -                              "               sin6_addr:     %s\n"
    -                              "               sin6_port:     %s\n"
    -                              "               sin6_flowinfo: %d\n"
    -                              "               sin6_scope_id: %d\n",
    -                              p->sin6_family,
    -                              hostBfr,
    -                              servBfr,
    -                              p->sin6_flowinfo,
    -                              p->sin6_scope_id );
    -                     break;
    -                  }  /* End CASE of IPv6 address. */
    -                  default:   /* Can never get here, but for completeness. */
    -                  {
    -                     fprintf( stderr,
    -                              "%s (line %d): ERROR - Unknown address "
    -                              "family (%d).\n",
    -                              pgmName,
    -                              __LINE__,
    -                              sadr->sa_family );
    -                     break;
    -                  }  /* End DEFAULT case (unknown address family). */
    -               }  /* End SWITCH on address family. */
    -            }  /* End IF verbose mode. */
    -            /*
    -            ** Send the time-of-day to the client.
    -            */
    -            wBytes = timeLen;
    -            while ( wBytes > 0 )
    -            {
    -               do
    -               {
    -                  count = sendto( desc[ idx ].fd,
    -                                  timeStr,
    -                                  wBytes,
    -                                  0,
    -                                  sadr,        /* Address & address length   */
    -                                  sadrLen );   /*    received in recvfrom(). */
    -               } while ( ( count < 0 ) && ( errno == EINTR ) );
    -               CHK( count );   /* Check for a bona fide error. */
    -               wBytes -= count;
    -            }  /* End WHILE there is data to send. */
    -         }  /* End ELSE a UDP datagram is available. */
    -         desc[ idx ].revents = 0;   /* Clear the returned poll events. */
    -      }  /* End FOR each socket descriptor. */
    -   }  /* End WHILE forever. */
    -}  /* End tod() */

    23.1.4.2. 'Daytime' TCP Client Code

    The TCP client code is found in file tod6tc.c (time-of-day IPv6 TCP client). Once built, the TCP client may be started using the following command syntax (assuming tod6tc is the executable file):

    tod6tc [-v] [-s scope_id] [host [service]]

    ARGUMENTS:

    host

    The hostname or IP address (dotted decimal or colon-hex) of the remote host providing the service. Default is "localhost".

    service

    The TCP service (or well-known port number) to which a connection attempt is made. Default is "daytime".

    OPTIONS:

    -s

    This option is only meaningful for IPv6 addresses, and is used to set the scope identifier (i.e. the network interface on which to establish the connection). Default is "eth0". If host is a scoped address, this option is ignored.

    -v

    Turn on verbose mode.

    The TCP client source code contained in tod6tc.c follows:

    /******************************************************************************
    -* File: tod6tc.c
    -* Description: Contains source code for an IPv6-capable 'daytime' TCP client.
    -* Author: John Wenker, Sr. Software Engineer
    -*         Performance Technologies, San Diego, USA
    -******************************************************************************/
    -/*
    -** System header files.
    -*/
    -#include <errno.h>        /* errno declaration and error codes.             */
    -#include <net/if.h>       /* if_nametoindex(3).                             */
    -#include <netdb.h>        /* getaddrinfo(3) and associated definitions.     */
    -#include <netinet/in.h>   /* sockaddr_in and sockaddr_in6 definitions.      */
    -#include <stdio.h>        /* printf(3) et al.                               */
    -#include <stdlib.h>       /* exit(2).                                       */
    -#include <string.h>       /* String manipulation and memory functions.      */
    -#include <sys/socket.h>   /* Socket functions (socket(2), connect(2), etc). */
    -#include <unistd.h>       /* getopt(3), read(2), etc.                       */
    -/*
    -** Constants & macros.
    -*/
    -#define DFLT_HOST      "localhost"   /* Default server name.              */
    -#define DFLT_SCOPE_ID  "eth0"        /* Default scope identifier.         */
    -#define DFLT_SERVICE   "daytime"     /* Default service name.             */
    -#define INVALID_DESC   -1            /* Invalid file (socket) descriptor. */
    -#define MAXBFRSIZE     256           /* Max bfr sz to read remote TOD.    */
    -#define VALIDOPTS      "s:v"         /* Valid command options.            */
    -/*
    -** Type definitions (for convenience).
    -*/
    -typedef enum { false = 0, true } boolean;
    -typedef struct sockaddr_in       sockaddr_in_t;
    -typedef struct sockaddr_in6      sockaddr_in6_t;
    -/*
    -** Prototypes for internal helper functions.
    -*/
    -static int  openSckt( const char   *host,
    -                      const char   *service,
    -                      unsigned int  scopeId );
    -static void tod( int sckt );
    -/*
    -** Global (within this file only) data objects.
    -*/
    -static const char *pgmName;           /* Program name (w/o directory). */
    -static boolean     verbose = false;   /* Verbose mode.                 */
    -/*
    -** Usage macro.
    -*/
    -#define USAGE                                                            \
    -        {                                                                \
    -           fprintf( stderr,                                              \
    -                    "Usage: %s [-v] [-s scope_id] [host [service]]\n",   \
    -                    pgmName );                                           \
    -           exit( 127 );                                                  \
    -        }  /* End USAGE macro. */
    -/*
    -** This "macro" (even though it's really a function) is loosely based on the
    -** CHK() macro by Dr. V. Vinge (see server code).  The status parameter is
    -** a boolean expression indicating the return code from one of the usual system
    -** calls that returns -1 on error.  If a system call error occurred, an alert
    -** is written to stderr.  It returns a boolean value indicating success/failure
    -** of the system call.
    -**
    -** Example: if ( !SYSCALL( "write",
    -**                         count = write( fd, bfr, size ) ) )
    -**          {
    -**             // Error processing... but SYSCALL() will have already taken
    -**             // care of dumping an error alert to stderr.
    -**          }
    -*/
    -static __inline boolean SYSCALL( const char *syscallName,
    -                                 int         lineNbr,
    -                                 int         status )
    -{
    -   if ( ( status == -1 ) && verbose )
    -   {
    -      fprintf( stderr,
    -               "%s (line %d): System call failed ('%s') - %s.\n",
    -               pgmName,
    -               lineNbr,
    -               syscallName,
    -               strerror( errno ) );
    -   }
    -   return status != -1;   /* True if the system call was successful. */
    -}  /* End SYSCALL() */
    -/******************************************************************************
    -* Function: main
    -*
    -* Description:
    -*    Connect to a remote time-of-day service and write the remote host's TOD to
    -*    stdout.
    -*
    -* Parameters:
    -*    The usual argc & argv parameters to a main() program.
    -*
    -* Return Value:
    -*    This function always returns zero.
    -******************************************************************************/
    -int main( int   argc,
    -          char *argv[ ] )
    -{
    -   const char   *host     = DFLT_HOST;
    -   int           opt;
    -   int           sckt;
    -   unsigned int  scopeId  = if_nametoindex( DFLT_SCOPE_ID );
    -   const char   *service  = DFLT_SERVICE;
    -   /*
    -   ** Determine the program name (w/o directory prefix).
    -   */
    -   pgmName = (const char*) strrchr( argv[ 0 ], '/' );
    -   pgmName = pgmName == NULL  ?  argv[ 0 ]  :  pgmName+1;
    -   /*
    -   ** Process command line options.
    -   */
    -   opterr = 0;   /* Turns off "invalid option" error messages. */
    -   while ( ( opt = getopt( argc, argv, VALIDOPTS ) ) != -1 )
    -   {
    -      switch ( opt )
    -      {
    -         case 's':   /* Scope identifier (IPv6 kluge). */
    -         {
    -            scopeId = if_nametoindex( optarg );
    -            if ( scopeId == 0 )
    -            {
    -               fprintf( stderr,
    -                        "%s: Unknown network interface (%s).\n",
    -                        pgmName,
    -                        optarg );
    -               USAGE;
    -            }
    -            break;
    -         }
    -         case 'v':   /* Verbose mode. */
    -         {
    -            verbose = true;
    -            break;
    -         }
    -         default:
    -         {
    -            USAGE;
    -         }
    -      }  /* End SWITCH on command option. */
    -   } /* End WHILE processing command options. */
    -   /*
    -   ** Process command arguments.  At the end of the above loop, optind is the
    -   ** index of the first NON-option argv element.
    -   */
    -   switch ( argc - optind )
    -   {
    -      case 2:   /* Both host & service are specified on the command line. */
    -      {
    -          service = argv[ optind + 1 ];
    -          /***** Fall through *****/
    -      }
    -      case 1:   /* Host is specified on the command line. */
    -      {
    -          host = argv[ optind ];
    -          /***** Fall through *****/
    -      }
    -      case 0:   /* Use default host & service. */
    -      {
    -          break;
    -      }
    -      default:
    -      {
    -         USAGE;
    -      }
    -   }  /* End SWITCH on number of command arguments. */
    -   /*
    -   ** Open a connection to the indicated host/service.
    -   **
    -   ** Note that if all three of the following conditions are met, then the
    -   ** scope identifier remains unresolved at this point.
    -   **    1) The default network interface is unknown for some reason.
    -   **    2) The -s option was not used on the command line.
    -   **    3) An IPv6 "scoped address" was not specified for the hostname on the
    -   **       command line.
    -   ** If the above three conditions are met, then only an IPv4 socket can be
    -   ** opened (connect(2) fails without the scope ID properly set for IPv6
    -   ** sockets).
    -   */
    -   if ( ( sckt = openSckt( host,
    -                           service,
    -                           scopeId ) ) == INVALID_DESC )
    -   {
    -      fprintf( stderr,
    -               "%s: Sorry... a connection could not be established.\n",
    -               pgmName );
    -      exit( 1 );
    -   }
    -   /*
    -   ** Get the remote time-of-day.
    -   */
    -   tod( sckt );
    -   /*
    -   ** Close the connection and terminate.
    -   */
    -   (void) SYSCALL( "close",
    -                   __LINE__,
    -                   close( sckt ) );
    -   return 0;
    -}  /* End main() */
    -/******************************************************************************
    -* Function: openSckt
    -*
    -* Description:
    -*    Sets up a TCP connection to a remote server.  Getaddrinfo(3) is used to
    -*    perform lookup functions and can return multiple address records (i.e. a
    -*    list of 'struct addrinfo' records).  This function traverses the list and
    -*    tries to establish a connection to the remote server.  The function ends
    -*    when either a connection has been established or all records in the list
    -*    have been processed.
    -*
    -* Parameters:
    -*    host    - A pointer to a character string representing the hostname or IP
    -*              address (IPv4 or IPv6) of the remote server.
    -*    service - A pointer to a character string representing the service name or
    -*              well-known port number.
    -*    scopeId - For IPv6 sockets only.  This is the index corresponding to the
    -*              network interface on which to set up the connection.  This
    -*              parameter is ignored for IPv4 sockets or when an IPv6 "scoped
    -*              address" is specified in 'host' (i.e. where the colon-hex
    -*              network address is augmented with the scope ID).
    -*
    -* Return Value:
    -*    Returns the socket descriptor for the connection, or INVALID_DESC if all
    -*    address records have been processed and a connection could not be
    -*    established.
    -******************************************************************************/
    -static int openSckt( const char   *host,
    -                     const char   *service,
    -                     unsigned int  scopeId )
    -{
    -   struct addrinfo *ai;
    -   int              aiErr;
    -   struct addrinfo *aiHead;
    -   struct addrinfo  hints;
    -   sockaddr_in6_t  *pSadrIn6;
    -   int              sckt;
    -   /*
    -   ** Initialize the 'hints' structure for getaddrinfo(3).
    -   **
    -   ** Notice that the 'ai_family' field is set to PF_UNSPEC, indicating to
    -   ** return both IPv4 and IPv6 address records for the host/service.  Most of
    -   ** the time, the user isn't going to care whether an IPv4 connection or an
    -   ** IPv6 connection is established; the user simply wants to exchange data
    -   ** with the remote host and doesn't care how it's done.  Sometimes, however,
    -   ** the user might want to explicitly specify the type of underlying socket.
    -   ** It is left as an exercise for the motivated reader to add a command line
    -   ** option allowing the user to specify the IP protocol, and then process the
    -   ** list of addresses accordingly (it's not that difficult).
    -   */
    -   memset( &hints, 0, sizeof( hints ) );
    -   hints.ai_family   = PF_UNSPEC;     /* IPv4 or IPv6 records (don't care). */
    -   hints.ai_socktype = SOCK_STREAM;   /* Connection-oriented byte stream.   */
    -   hints.ai_protocol = IPPROTO_TCP;   /* TCP transport layer protocol only. */
    -   /*
    -   ** Look up the host/service information.
    -   */
    -   if ( ( aiErr = getaddrinfo( host,
    -                               service,
    -                               &hints,
    -                               &aiHead ) ) != 0 )
    -   {
    -      fprintf( stderr,
    -               "%s (line %d): ERROR - %s.\n",
    -               pgmName,
    -               __LINE__,
    -               gai_strerror( aiErr ) );
    -      return INVALID_DESC;
    -   }
    -   /*
    -   ** Go through the list and try to open a connection.  Continue until either
    -   ** a connection is established or the entire list is exhausted.
    -   */
    -   for ( ai = aiHead,   sckt = INVALID_DESC;
    -         ( ai != NULL ) && ( sckt == INVALID_DESC );
    -         ai = ai->ai_next )
    -   {
    -      /*
    -      ** IPv6 kluge.  Make sure the scope ID is set.
    -      */
    -      if ( ai->ai_family == PF_INET6 )
    -      {
    -         pSadrIn6 = (sockaddr_in6_t*) ai->ai_addr;
    -         if ( pSadrIn6->sin6_scope_id == 0 )
    -         {
    -            pSadrIn6->sin6_scope_id = scopeId;
    -         }  /* End IF the scope ID wasn't set. */
    -      }  /* End IPv6 kluge. */
    -      /*
    -      ** Display the address info for the remote host.
    -      */
    -      if ( verbose )
    -      {
    -         /*
    -         ** Temporary character string buffers for host & service.
    -         */
    -         char hostBfr[ NI_MAXHOST ];
    -         char servBfr[ NI_MAXSERV ];
    -         /*
    -         ** Display the address information just fetched.  Start with the
    -         ** common (protocol-independent) stuff first.
    -         */
    -         fprintf( stderr,
    -                  "Address info:\n"
    -                  "   ai_flags     = 0x%02X\n"
    -                  "   ai_family    = %d (PF_INET = %d, PF_INET6 = %d)\n"
    -                  "   ai_socktype  = %d (SOCK_STREAM = %d, SOCK_DGRAM = %d)\n"
    -                  "   ai_protocol  = %d (IPPROTO_TCP = %d, IPPROTO_UDP = %d)\n"
    -                  "   ai_addrlen   = %d (sockaddr_in = %d, "
    -                  "sockaddr_in6 = %d)\n",
    -                  ai->ai_flags,
    -                  ai->ai_family,
    -                  PF_INET,
    -                  PF_INET6,
    -                  ai->ai_socktype,
    -                  SOCK_STREAM,
    -                  SOCK_DGRAM,
    -                  ai->ai_protocol,
    -                  IPPROTO_TCP,
    -                  IPPROTO_UDP,
    -                  ai->ai_addrlen,
    -                  sizeof( struct sockaddr_in ),
    -                  sizeof( struct sockaddr_in6 ) );
    -         /*
    -         ** Display the protocol-specific formatted address.
    -         */
    -         getnameinfo( ai->ai_addr,
    -                      ai->ai_addrlen,
    -                      hostBfr,
    -                      sizeof( hostBfr ),
    -                      servBfr,
    -                      sizeof( servBfr ),
    -                      NI_NUMERICHOST | NI_NUMERICSERV );
    -         switch ( ai->ai_family )
    -         {
    -            case PF_INET:   /* IPv4 address record. */
    -            {
    -               sockaddr_in_t *pSadrIn = (sockaddr_in_t*) ai->ai_addr;
    -               fprintf( stderr,
    -                        "   ai_addr      = sin_family: %d (AF_INET = %d, "
    -                        "AF_INET6 = %d)\n"
    -                        "                  sin_addr:   %s\n"
    -                        "                  sin_port:   %s\n",
    -                        pSadrIn->sin_family,
    -                        AF_INET,
    -                        AF_INET6,
    -                        hostBfr,
    -                        servBfr );
    -               break;
    -            }  /* End CASE of IPv4 record. */
    -            case PF_INET6:   /* IPv6 address record. */
    -            {
    -               pSadrIn6 = (sockaddr_in6_t*) ai->ai_addr;
    -               fprintf( stderr,
    -                        "   ai_addr      = sin6_family:   %d (AF_INET = %d, "
    -                        "AF_INET6 = %d)\n"
    -                        "                  sin6_addr:     %s\n"
    -                        "                  sin6_port:     %s\n"
    -                        "                  sin6_flowinfo: %d\n"
    -                        "                  sin6_scope_id: %d\n",
    -                        pSadrIn6->sin6_family,
    -                        AF_INET,
    -                        AF_INET6,
    -                        hostBfr,
    -                        servBfr,
    -                        pSadrIn6->sin6_flowinfo,
    -                        pSadrIn6->sin6_scope_id );
    -               break;
    -            }  /* End CASE of IPv6 record. */
    -            default:   /* Can never get here, but just for completeness. */
    -            {
    -               fprintf( stderr,
    -                        "%s (line %d): ERROR - Unknown protocol family (%d).\n",
    -                        pgmName,
    -                        __LINE__,
    -                        ai->ai_family );
    -               break;
    -            }  /* End DEFAULT case (unknown protocol family). */
    -         }  /* End SWITCH on protocol family. */
    -      }  /* End IF verbose mode. */
    -      /*
    -      ** Create a socket.
    -      */
    -      if ( !SYSCALL( "socket",
    -                     __LINE__,
    -                     sckt = socket( ai->ai_family,
    -                                    ai->ai_socktype,
    -                                    ai->ai_protocol ) ) )
    -      {
    -         sckt = INVALID_DESC;
    -         continue;   /* Try the next address record in the list. */
    -      }
    -      /*
    -      ** Connect to the remote host.
    -      */
    -      if ( !SYSCALL( "connect",
    -                     __LINE__,
    -                     connect( sckt,
    -                              ai->ai_addr,
    -                              ai->ai_addrlen ) ) )
    -      {
    -         (void) close( sckt );   /* Could use SYSCALL() again here, but why? */
    -         sckt = INVALID_DESC;
    -         continue;   /* Try the next address record in the list. */
    -      }
    -   }  /* End FOR each address record returned by getaddrinfo(3). */
    -   /*
    -   ** Clean up & return.
    -   */
    -   freeaddrinfo( aiHead );
    -   return sckt;
    -}  /* End openSckt() */
    -/******************************************************************************
    -* Function: tod
    -*
    -* Description:
    -*    Receive the time-of-day from the remote server and write it to stdout.
    -*
    -* Parameters:
    -*    sckt - The socket descriptor for the connection.
    -*
    -* Return Value: None.
    -******************************************************************************/
    -static void tod( int sckt )
    -{
    -   char bfr[ MAXBFRSIZE+1 ];
    -   int  inBytes;
    -   /*
    -   ** The client never sends anything, so shut down the write side of the
    -   ** connection.
    -   */
    -   if ( !SYSCALL( "shutdown",
    -                  __LINE__,
    -                  shutdown( sckt, SHUT_WR ) ) )
    -   {
    -      return;
    -   }
    -   /*
    -   ** Read the time-of-day from the remote host.
    -   */
    -   do
    -   {
    -      if ( !SYSCALL( "read",
    -                     __LINE__,
    -                     inBytes = read( sckt,
    -                                     bfr,
    -                                     MAXBFRSIZE ) ) )
    -      {
    -         return;
    -      }
    -      bfr[ inBytes ] = '\0';   /* Null-terminate the received string. */
    -      fputs( bfr, stdout );    /* Null string if EOF (inBytes == 0).  */
    -   } while ( inBytes > 0 );
    -   fflush( stdout );
    -}  /* End tod() */

    23.1.4.3. 'Daytime' UDP Client Code

    The UDP client code is found in file tod6uc.c (time-of-day IPv6 UDP client). It is almost an exact duplicate of the TCP client (and in fact was derived from it), but is included in this HowTo for completeness. Once built, the UDP client may be started using the following command syntax (assuming tod6uc is the executable file):

    tod6uc [-v] [-s scope_id] [host [service]]

    ARGUMENTS:

    host

    The hostname or IP address (dotted decimal or colon-hex) of the remote host providing the service. Default is "localhost".

    service

    The UDP service (or well-known port number) to which datagrams are sent. Default is "daytime".

    OPTIONS:

    -s

    This option is only meaningful for IPv6 addresses, and is used to set the scope identifier (i.e. the network interface on which to exchange datagrams). Default is "eth0". If host is a scoped address, this option is ignored.

    -v

    Turn on verbose mode.

    The UDP client source code contained in tod6uc.c follows:

    /******************************************************************************
    -* File: tod6uc.c
    -* Description: Contains source code for an IPv6-capable 'daytime' UDP client.
    -* Author: John Wenker, Sr. Software Engineer
    -*         Performance Technologies, San Diego, USA
    -******************************************************************************/
    -/*
    -** System header files.
    -*/
    -#include <errno.h>        /* errno declaration and error codes.             */
    -#include <net/if.h>       /* if_nametoindex(3).                             */
    -#include <netdb.h>        /* getaddrinfo(3) and associated definitions.     */
    -#include <netinet/in.h>   /* sockaddr_in and sockaddr_in6 definitions.      */
    -#include <stdio.h>        /* printf(3) et al.                               */
    -#include <stdlib.h>       /* exit(2).                                       */
    -#include <string.h>       /* String manipulation and memory functions.      */
    -#include <sys/socket.h>   /* Socket functions (socket(2), connect(2), etc). */
    -#include <unistd.h>       /* getopt(3), recvfrom(2), sendto(2), etc.        */
    -/*
    -** Constants & macros.
    -*/
    -#define DFLT_HOST      "localhost"   /* Default server name.              */
    -#define DFLT_SCOPE_ID  "eth0"        /* Default scope identifier.         */
    -#define DFLT_SERVICE   "daytime"     /* Default service name.             */
    -#define INVALID_DESC   -1            /* Invalid file (socket) descriptor. */
    -#define MAXBFRSIZE     256           /* Max bfr sz to read remote TOD.    */
    -#define VALIDOPTS      "s:v"         /* Valid command options.            */
    -/*
    -** Type definitions (for convenience).
    -*/
    -typedef enum { false = 0, true } boolean;
    -typedef struct sockaddr_in       sockaddr_in_t;
    -typedef struct sockaddr_in6      sockaddr_in6_t;
    -/*
    -** Prototypes for internal helper functions.
    -*/
    -static int  openSckt( const char   *host,
    -                      const char   *service,
    -                      unsigned int  scopeId );
    -static void tod( int sckt );
    -/*
    -** Global (within this file only) data objects.
    -*/
    -static const char *pgmName;           /* Program name (w/o directory). */
    -static boolean     verbose = false;   /* Verbose mode.                 */
    -/*
    -** Usage macro.
    -*/
    -#define USAGE                                                            \
    -        {                                                                \
    -           fprintf( stderr,                                              \
    -                    "Usage: %s [-v] [-s scope_id] [host [service]]\n",   \
    -                    pgmName );                                           \
    -           exit( 127 );                                                  \
    -        }  /* End USAGE macro. */
    -/*
    -** This "macro" (even though it's really a function) is loosely based on the
    -** CHK() macro by Dr. V. Vinge (see server code).  The status parameter is
    -** a boolean expression indicating the return code from one of the usual system
    -** calls that returns -1 on error.  If a system call error occurred, an alert
    -** is written to stderr.  It returns a boolean value indicating success/failure
    -** of the system call.
    -**
    -** Example: if ( !SYSCALL( "write",
    -**                         count = write( fd, bfr, size ) ) )
    -**          {
    -**             // Error processing... but SYSCALL() will have already taken
    -**             // care of dumping an error alert to stderr.
    -**          }
    -*/
    -static __inline boolean SYSCALL( const char *syscallName,
    -                                 int         lineNbr,
    -                                 int         status )
    -{
    -   if ( ( status == -1 ) && verbose )
    -   {
    -      fprintf( stderr,
    -               "%s (line %d): System call failed ('%s') - %s.\n",
    -               pgmName,
    -               lineNbr,
    -               syscallName,
    -               strerror( errno ) );
    -   }
    -   return status != -1;   /* True if the system call was successful. */
    -}  /* End SYSCALL() */
    -/******************************************************************************
    -* Function: main
    -*
    -* Description:
    -*    Connect to a remote time-of-day service and write the remote host's TOD to
    -*    stdout.
    -*
    -* Parameters:
    -*    The usual argc & argv parameters to a main() program.
    -*
    -* Return Value:
    -*    This function always returns zero.
    -******************************************************************************/
    -int main( int   argc,
    -          char *argv[ ] )
    -{
    -   const char   *host     = DFLT_HOST;
    -   int           opt;
    -   int           sckt;
    -   unsigned int  scopeId  = if_nametoindex( DFLT_SCOPE_ID );
    -   const char   *service  = DFLT_SERVICE;
    -   /*
    -   ** Determine the program name (w/o directory prefix).
    -   */
    -   pgmName = (const char*) strrchr( argv[ 0 ], '/' );
    -   pgmName = pgmName == NULL  ?  argv[ 0 ]  :  pgmName+1;
    -   /*
    -   ** Process command line options.
    -   */
    -   opterr = 0;   /* Turns off "invalid option" error messages. */
    -   while ( ( opt = getopt( argc, argv, VALIDOPTS ) ) != -1 )
    -   {
    -      switch ( opt )
    -      {
    -         case 's':   /* Scope identifier (IPv6 kluge). */
    -         {
    -            scopeId = if_nametoindex( optarg );
    -            if ( scopeId == 0 )
    -            {
    -               fprintf( stderr,
    -                        "%s: Unknown network interface (%s).\n",
    -                        pgmName,
    -                        optarg );
    -               USAGE;
    -            }
    -            break;
    -         }
    -         case 'v':   /* Verbose mode. */
    -         {
    -            verbose = true;
    -            break;
    -         }
    -         default:
    -         {
    -            USAGE;
    -         }
    -      }  /* End SWITCH on command option. */
    -   } /* End WHILE processing command options. */
    -   /*
    -   ** Process command arguments.  At the end of the above loop, optind is the
    -   ** index of the first NON-option argv element.
    -   */
    -   switch ( argc - optind )
    -   {
    -      case 2:   /* Both host & service are specified on the command line. */
    -      {
    -          service = argv[ optind + 1 ];
    -          /***** Fall through *****/
    -      }
    -      case 1:   /* Host is specified on the command line. */
    -      {
    -          host = argv[ optind ];
    -          /***** Fall through *****/
    -      }
    -      case 0:   /* Use default host & service. */
    -      {
    -          break;
    -      }
    -      default:
    -      {
    -         USAGE;
    -      }
    -   }  /* End SWITCH on number of command arguments. */
    -   /*
    -   ** Open a connection to the indicated host/service.
    -   **
    -   ** Note that if all three of the following conditions are met, then the
    -   ** scope identifier remains unresolved at this point.
    -   **    1) The default network interface is unknown for some reason.
    -   **    2) The -s option was not used on the command line.
    -   **    3) An IPv6 "scoped address" was not specified for the hostname on the
    -   **       command line.
    -   ** If the above three conditions are met, then only an IPv4 socket can be
    -   ** opened (connect(2) fails without the scope ID properly set for IPv6
    -   ** sockets).
    -   */
    -   if ( ( sckt = openSckt( host,
    -                           service,
    -                           scopeId ) ) == INVALID_DESC )
    -   {
    -      fprintf( stderr,
    -               "%s: Sorry... a connectionless socket could "
    -               "not be set up.\n",
    -               pgmName );
    -      exit( 1 );
    -   }
    -   /*
    -   ** Get the remote time-of-day.
    -   */
    -   tod( sckt );
    -   /*
    -   ** Close the connection and terminate.
    -   */
    -   (void) SYSCALL( "close",
    -                   __LINE__,
    -                   close( sckt ) );
    -   return 0;
    -}  /* End main() */
    -/******************************************************************************
    -* Function: openSckt
    -*
    -* Description:
    -*    Sets up a UDP socket to a remote server.  Getaddrinfo(3) is used to
    -*    perform lookup functions and can return multiple address records (i.e. a
    -*    list of 'struct addrinfo' records).  This function traverses the list and
    -*    tries to establish a connection to the remote server.  The function ends
    -*    when either a connection has been established or all records in the list
    -*    have been processed.
    -*
    -* Parameters:
    -*    host    - A pointer to a character string representing the hostname or IP
    -*              address (IPv4 or IPv6) of the remote server.
    -*    service - A pointer to a character string representing the service name or
    -*              well-known port number.
    -*    scopeId - For IPv6 sockets only.  This is the index corresponding to the
    -*              network interface on which to exchange datagrams.  This
    -*              parameter is ignored for IPv4 sockets or when an IPv6 "scoped
    -*              address" is specified in 'host' (i.e. where the colon-hex
    -*              network address is augmented with the scope ID).
    -*
    -* Return Value:
    -*    Returns the socket descriptor for the connection, or INVALID_DESC if all
    -*    address records have been processed and a socket could not be initialized.
    -******************************************************************************/
    -static int openSckt( const char   *host,
    -                     const char   *service,
    -                     unsigned int  scopeId )
    -{
    -   struct addrinfo *ai;
    -   int              aiErr;
    -   struct addrinfo *aiHead;
    -   struct addrinfo  hints;
    -   sockaddr_in6_t  *pSadrIn6;
    -   int              sckt;
    -   /*
    -   ** Initialize the 'hints' structure for getaddrinfo(3).
    -   **
    -   ** Notice that the 'ai_family' field is set to PF_UNSPEC, indicating to
    -   ** return both IPv4 and IPv6 address records for the host/service.  Most of
    -   ** the time, the user isn't going to care whether an IPv4 connection or an
    -   ** IPv6 connection is established; the user simply wants to exchange data
    -   ** with the remote host and doesn't care how it's done.  Sometimes, however,
    -   ** the user might want to explicitly specify the type of underlying socket.
    -   ** It is left as an exercise for the motivated reader to add a command line
    -   ** option allowing the user to specify the IP protocol, and then process the
    -   ** list of addresses accordingly (it's not that difficult).
    -   */
    -   memset( &hints, 0, sizeof( hints ) );
    -   hints.ai_family   = PF_UNSPEC;     /* IPv4 or IPv6 records (don't care). */
    -   hints.ai_socktype = SOCK_DGRAM;    /* Connectionless communication.      */
    -   hints.ai_protocol = IPPROTO_UDP;   /* UDP transport layer protocol only. */
    -   /*
    -   ** Look up the host/service information.
    -   */
    -   if ( ( aiErr = getaddrinfo( host,
    -                               service,
    -                               &hints,
    -                               &aiHead ) ) != 0 )
    -   {
    -      fprintf( stderr,
    -               "%s (line %d): ERROR - %s.\n",
    -               pgmName,
    -               __LINE__,
    -               gai_strerror( aiErr ) );
    -      return INVALID_DESC;
    -   }
    -   /*
    -   ** Go through the list and try to open a connection.  Continue until either
    -   ** a connection is established or the entire list is exhausted.
    -   */
    -   for ( ai = aiHead,   sckt = INVALID_DESC;
    -         ( ai != NULL ) && ( sckt == INVALID_DESC );
    -         ai = ai->ai_next )
    -   {
    -      /*
    -      ** IPv6 kluge.  Make sure the scope ID is set.
    -      */
    -      if ( ai->ai_family == PF_INET6 )
    -      {
    -         pSadrIn6 = (sockaddr_in6_t*) ai->ai_addr;
    -         if ( pSadrIn6->sin6_scope_id == 0 )
    -         {
    -            pSadrIn6->sin6_scope_id = scopeId;
    -         }  /* End IF the scope ID wasn't set. */
    -      }  /* End IPv6 kluge. */
    -      /*
    -      ** Display the address info for the remote host.
    -      */
    -      if ( verbose )
    -      {
    -         /*
    -         ** Temporary character string buffers for host & service.
    -         */
    -         char hostBfr[ NI_MAXHOST ];
    -         char servBfr[ NI_MAXSERV ];
    -         /*
    -         ** Display the address information just fetched.  Start with the
    -         ** common (protocol-independent) stuff first.
    -         */
    -         fprintf( stderr,
    -                  "Address info:\n"
    -                  "   ai_flags     = 0x%02X\n"
    -                  "   ai_family    = %d (PF_INET = %d, PF_INET6 = %d)\n"
    -                  "   ai_socktype  = %d (SOCK_STREAM = %d, SOCK_DGRAM = %d)\n"
    -                  "   ai_protocol  = %d (IPPROTO_TCP = %d, IPPROTO_UDP = %d)\n"
    -                  "   ai_addrlen   = %d (sockaddr_in = %d, "
    -                  "sockaddr_in6 = %d)\n",
    -                  ai->ai_flags,
    -                  ai->ai_family,
    -                  PF_INET,
    -                  PF_INET6,
    -                  ai->ai_socktype,
    -                  SOCK_STREAM,
    -                  SOCK_DGRAM,
    -                  ai->ai_protocol,
    -                  IPPROTO_TCP,
    -                  IPPROTO_UDP,
    -                  ai->ai_addrlen,
    -                  sizeof( struct sockaddr_in ),
    -                  sizeof( struct sockaddr_in6 ) );
    -         /*
    -         ** Display the protocol-specific formatted address.
    -         */
    -         getnameinfo( ai->ai_addr,
    -                      ai->ai_addrlen,
    -                      hostBfr,
    -                      sizeof( hostBfr ),
    -                      servBfr,
    -                      sizeof( servBfr ),
    -                      NI_NUMERICHOST | NI_NUMERICSERV );
    -         switch ( ai->ai_family )
    -         {
    -            case PF_INET:   /* IPv4 address record. */
    -            {
    -               sockaddr_in_t *pSadrIn = (sockaddr_in_t*) ai->ai_addr;
    -               fprintf( stderr,
    -                        "   ai_addr      = sin_family: %d (AF_INET = %d, "
    -                        "AF_INET6 = %d)\n"
    -                        "                  sin_addr:   %s\n"
    -                        "                  sin_port:   %s\n",
    -                        pSadrIn->sin_family,
    -                        AF_INET,
    -                        AF_INET6,
    -                        hostBfr,
    -                        servBfr );
    -               break;
    -            }  /* End CASE of IPv4 record. */
    -            case PF_INET6:   /* IPv6 address record. */
    -            {
    -               pSadrIn6 = (sockaddr_in6_t*) ai->ai_addr;
    -               fprintf( stderr,
    -                        "   ai_addr      = sin6_family:   %d (AF_INET = %d, "
    -                        "AF_INET6 = %d)\n"
    -                        "                  sin6_addr:     %s\n"
    -                        "                  sin6_port:     %s\n"
    -                        "                  sin6_flowinfo: %d\n"
    -                        "                  sin6_scope_id: %d\n",
    -                        pSadrIn6->sin6_family,
    -                        AF_INET,
    -                        AF_INET6,
    -                        hostBfr,
    -                        servBfr,
    -                        pSadrIn6->sin6_flowinfo,
    -                        pSadrIn6->sin6_scope_id );
    -               break;
    -            }  /* End CASE of IPv6 record. */
    -            default:   /* Can never get here, but just for completeness. */
    -            {
    -               fprintf( stderr,
    -                        "%s (line %d): ERROR - Unknown protocol family (%d).\n",
    -                        pgmName,
    -                        __LINE__,
    -                        ai->ai_family );
    -               break;
    -            }  /* End DEFAULT case (unknown protocol family). */
    -         }  /* End SWITCH on protocol family. */
    -      }  /* End IF verbose mode. */
    -      /*
    -      ** Create a socket.
    -      */
    -      if ( !SYSCALL( "socket",
    -                     __LINE__,
    -                     sckt = socket( ai->ai_family,
    -                                    ai->ai_socktype,
    -                                    ai->ai_protocol ) ) )
    -      {
    -         sckt = INVALID_DESC;
    -         continue;   /* Try the next address record in the list. */
    -      }
    -      /*
    -      ** Set the target destination for the remote host on this socket.  That
    -      ** is, this socket only communicates with the specified host.
    -      */
    -      if ( !SYSCALL( "connect",
    -                     __LINE__,
    -                     connect( sckt,
    -                              ai->ai_addr,
    -                              ai->ai_addrlen ) ) )
    -      {
    -         (void) close( sckt );   /* Could use SYSCALL() again here, but why? */
    -         sckt = INVALID_DESC;
    -         continue;   /* Try the next address record in the list. */
    -      }
    -   }  /* End FOR each address record returned by getaddrinfo(3). */
    -   /*
    -   ** Clean up & return.
    -   */
    -   freeaddrinfo( aiHead );
    -   return sckt;
    -}  /* End openSckt() */
    -/******************************************************************************
    -* Function: tod
    -*
    -* Description:
    -*    Receive the time-of-day from the remote server and write it to stdout.
    -*
    -* Parameters:
    -*    sckt - The socket descriptor for the connection.
    -*
    -* Return Value: None.
    -******************************************************************************/
    -static void tod( int sckt )
    -{
    -   char bfr[ MAXBFRSIZE+1 ];
    -   int  inBytes;
    -   /*
    -   ** Send a datagram to the server to wake it up.  The content isn't
    -   ** important, but something must be sent to let it know we want the TOD.
    -   */
    -   if ( !SYSCALL( "write",
    -                  __LINE__,
    -                  write( sckt, "Are you there?", 14 ) ) )
    -   {
    -      return;
    -   }
    -   /*
    -   ** Read the time-of-day from the remote host.
    -   */
    -   if ( !SYSCALL( "read",
    -                  __LINE__,
    -                  inBytes = read( sckt,
    -                                  bfr,
    -                                  MAXBFRSIZE ) ) )
    -   {
    -      return;
    -   }
    -   bfr[ inBytes ] = '\0';   /* Null-terminate the received string. */
    -   fputs( bfr, stdout );    /* Null string if EOF (inBytes == 0).  */
    -   fflush( stdout );
    -}  /* End tod() */

    23.2. Other programming languages

    23.2.1. JAVA

    Sun Java versions since 1.4 are IPv6 enabled, see e.g. Inet6Address (1.5/5.0) class. Hints are available in the Networking IPv6 User Guide for JDK/JRE 1.4 and 1.5 (5.0).


    23.2.2. Perl

    As of May 2007 it's not known that the Perl core itself already supports IPv6. It can be added by using following modules:

    Anyway, some other modules exist for/with IPv6 support (e.g. Net::IP), search for “IPv6” on http://search.cpan.org/.


    Chapter 24. Interoperability

    The TAHI Project checks the interoperability of different operating systems regarding the implementation of IPv6 features. Linux kernel already got the IPv6 Ready Logo Phase 1.


    Chapter 25. Further information and URLs

    25.1. Paper printed books, articles, online reviews (mixed)

    25.1.1. Printed Books (English)

    25.1.1.1. Cisco

    • Cisco Self-Study: Implementing IPv6 Networks (IPV6) by Regis Desmeules. Cisco Press; ISBN 1587050862; 500 pages; 1st edition (April 11, 2003). -Note: This item will be published on April 11, 2003.

    • Configuring IPv6 with Cisco IOS by Sam Brown, Sam Browne, Neal Chen, Robbie Harrell, Edgar, Jr. Parenti (Editor), Eric Knipp (Editor), Paul Fong (Editor)362 pages; Syngress Media Inc; ISBN 1928994849; (July 12, 2002).


    25.1.1.2. General

    • IPv6 in Practice: A Unixer's Guide to the Next Generation Internet von Benedikt Stockebrand, November 2006; ISBN 3-540-24524-3

    • IPv6 Essentials by Silvia Hagen, 2nd Edition, May 2006; ISBN 0-5961-0058-2 -ToC, Index, Sample Chapter etc.; O'Reilly Pressrelease

    • IPv6: The New Internet Protocol. By Christian Huitema; Published by Prentice-Hall; ISBN 0138505055. -Description: This book, written by Christian Huitema - a member of the InternetArchitecture Board, gives an excellent description of IPv6, how it differs from IPv4, and the hows and whys of it's development. -Source: http://www.cs.uu.nl/wais/html/na-dir/internet/tcp-ip/resource-list.html

    • IPv6 Networks by Niles, Kitty; (ISBN 0070248079); 550 pages; Date Published 05/01/1998.

    • Implementing IPV6. Supporting the Next Generation Internet Protocols by P. E. Miller, Mark A. Miller; Publisher: John Wiley & Sons; ISBN 0764545892; 2nd edition (March 15, 2000); 402 pages.

    • Big Book of Ipv6 Addressing Rfcs by Peter H. Salus (Compiler), Morgan Kaufmann Publishers, April 2000, 450 pages ISBN 0126167702.

    • Understanding IPV6 by Davies, Joseph; ISBN 0735612455; Date Published 05/01/2001; Number of Pages: 350.

    • Migrating to IPv6 - IPv6 in Practice by Marc Blanchet Publisher: John Wiley & Sons; ISBN 0471498920; 1st edition (November 2002); 368 pages.

    • Ipv6 Network Programming by Jun-ichiro Hagino; ISBN 1555583180

    • Wireless boosting IPv6 by Carolyn Duffy Marsan, 10/23/2000.

    • O'reilly Network search for keyword IPv6 results in 29 hits (28. January 2002)


    25.1.2. Articles, eBooks, Online Reviews (mixed)


    25.1.3. Science Publications (abstracts, bibliographies, online resources)

    See also: liinwww.ira.uka.de/ipv6 or Google / Scholar / IPv6


    25.2. Conferences, Meetings, Summits

    Something missing? Suggestions are welcome!


    25.2.1. 2004

    • 1st Global IPv6 Summit in Sao Paul, Brazil


    25.3. Online information

    25.3.1. Join the IPv6 backbone

    More to be filled later...suggestions are welcome!


    25.3.1.1. Global registries

    See regional registries.


    25.3.1.3. Tunnel brokers

    Note: A list of available Tunnel broker can be found in the section Tunnel broker below.


    25.3.2. Latest news and URLs to other documents

    • Lot of URLs to others documents by Anil Edathara

    • go6 - The IPv6 Portal: an IPv6 online portal with a wiki-based IPv6 knowledge center, an IPv6 discussion forum, an up-to-date collection of IPv6 Events and News, free IPv6 access and services, IPv6 software applications, and much more


    25.3.3. Protocol references

    25.3.3.1. IPv6-related Request For Comments (RFCs)

    Publishing the list of IPv6-related RFCs is beyond the scope of this document, but given URLs will lead you to such lists:


    25.3.3.3. Others


    25.3.4. More information

    DeepSpace6 / more interesting links


    25.3.4.3. General

    Something missing? Suggestions are welcome!


    25.3.4.4. Market Research

    • A Tale of Two Wireless Technology Trends: Processor Development Outsourcing and IPv6Yankee Group - 4/1/2002 - 12 Pages - ID: YANL768881

    • The World Atlas of the Internet: Americas; IDATE - 2/1/2002 - 242 PAges - ID: IDT803907. Countries covered: Central America, North America, South America; List: Price: $ 3,500.00; excerpt: Panorama of Internet access markets across the globe. Market assessment and forecasts up to 2006 for 34 countries: market structure: main ISPs and market shares; number of subscribers, of ISPs.

    • Early Interest Rising for IPv6 by IDC (Author); List Price: $1,500.00; Edition: e-book (Acrobat Reader); Publisher: IDC; ISBN B000065T8E; (March 1, 2002)


    25.3.5. By countries

    25.3.5.1. Europe

    • www.ist-ipv6.org: IST IPv6 Cluster, European IPv6 Research and Development Projects

    • Euro6IX: European IPv6 Internet Exchanges Backbone


    25.3.5.2. Austria


    25.3.5.4. Belgium

    Suggestions are welcome!


    25.3.5.6. China

    Suggestions are welcome!


    25.3.5.7. Czech

    Suggestions are welcome!


    25.3.5.10. Italy


    25.3.5.11. Japan


    25.3.5.12. Korea

    • ETRI: Electronics and Telecommunications Research Institut

    • IPv6 Forum Korea: Korean IPv6 Deployment Project


    25.3.5.13. Mexico

    • IPv6 Mexico (spain & english version): IPv6 Project Hompeage of The National Autonomous University of Mexico (UNAM)


    25.3.5.14. Netherland

    • SURFnet: SURFnet IPv6 Backbone

    • STACK, STACK (IPv6): Students' computer association of the Eindhoven University of Technology, Netherland

    • IPng.nl: collaboration between WiseGuys and Intouch


    25.3.5.15. Portugal

    Suggestions are welcome!


    25.3.5.16. Russia


    25.3.5.17. Switzerland

    Suggestions are welcome!


    25.3.5.18. United Kingdom


    25.3.6. By operating systems


    25.3.6.2. Cisco IOS


    25.3.6.4. IBM


    25.3.7. IPv6 Security


    25.3.8. Application lists


    25.3.8.1. Analyzer tools

    • Wireshark (former known as Ethereal) is a free network protocol analyzer for Unix and Windows

    • Radcom RC100-WL - Download Radcom RC100-WL protocol analyzer version 3.20


    25.3.8.2. IPv6 Products


    25.4. IPv6 Infrastructure


    25.4.2. Internet Exchanges

    Another list of IPv6 Internet Exchanges can be found here: IPv6 status of IXPs in Europe


    25.4.2.1. Estonia

    • TIX (tallinn interneti exchange with ipv6 support)


    25.4.2.2. Europe

    • Euro6IX, European IPv6 Internet Exchange Backbone


    25.4.2.3. France


    25.4.2.4. Germany

    • INXS: (Cable & Wireless) Munich and Hamburg


    25.4.2.5. Japan


    25.4.2.7. Netherlands

    • AMS-IX: Amsterdam Internet Exchange


    25.4.2.9. USA

    • 6TAP: Chicago. Supports peerings around the globe.

    • PAIX: Palo Alto


    25.4.3. Tunnel broker

    See also: http://www.deepspace6.net/docs/tunnelbrokers.html


    25.4.3.1. Belgium

    Something missing? Suggestions are welcome!


    25.4.3.3. China

    Something missing? Suggestions are welcome!


    25.4.3.6. Italy


    25.4.3.7. Japan

    Something missing? Suggestions are welcome!


    25.4.3.8. Malaysia

    Something missing? Suggestions are welcome!


    25.4.3.9. Netherlands

    • IPng Netherland - Intouch, SurfNet, AMS-IX, UUNet, Cistron, RIPE NCC and AT&T are connected at the AMS-IX. It is possible (there are requirements...) to get an static tunnel.

    • SURFnet Customers


    25.4.3.10. Norway


    25.4.3.12. Switzerland

    Something missing? Suggestions are welcome!


    25.4.3.13. UK

    • NTT, United Kingdom - IPv6 Trial. IPv4 Tunnel and native IPv6 leased Line connections. POPs are located in London, UK Dusseldorf, Germany New Jersey, USA (East Coast) Cupertino, USA (West Coast) Tokyo, Japan


    25.4.3.14. USA


    25.4.3.15. Singapore

    Something missing? Suggestions are welcome!


    25.4.4. Native IPv6 Services

    Note: These services are mostly only available with a valid IPv6 connection!


    25.4.4.1. Net News (NNTP)

    Something missing? Suggestions are welcome!


    25.4.4.3. IRC Server

    Something missing? Suggestions are welcome!


    25.4.4.4. Radio Stations, Music Streams

    Something missing? Suggestions are welcome!


    25.4.4.5. Webserver

    Something missing? Suggestions are welcome!


    25.5. Maillists

    Lists of maillists are available at:

    Major Mailinglists are listed in following table:

    FocusRequest e-mail addressWhat to subscribeMaillist e-mail addressLanguageAccess through WWW
    Linux kernel networking including IPv6majordomo (at) vger.kernel.orgnetdevnetdev (at) vger.kernel.orgEnglishInfo, Archive
    Mobile IP(v6) for LinuxWeb-based, see URLmiplmipl (at) mobile-ipv6.orgEnglishInfo, Archive
    Linux IPv6 users using USAGI extensionusagi-users-ctl (at) linux-ipv6.org usagi-users (at) linux-ipv6.orgEnglishInfo / Search, Archive
    IPv6 on Debian Linux  debian-ipv6 (at) lists.debian.orgEnglishInfo/Subscription/Archive
    6bonemajordomo (at) isi.edu6bone6bone (at) isi.eduEnglishInfo, Archive
    IPv6 users in generalmajordomo (at) ipv6.orgusersusers (at) ipv6.orgEnglishInfo, Archive
    Bugtracking of Internet applications (1)bugtraq-subscribe (at) securityfocus.com bugtraq (at) securityfocus.com (2)EnglishInfo, Archive

    (1) very recommended if you provide server applications.

    (2) list is moderated.

    Something missing? Suggestions are welcome!

    Following other maillinglists & newsgroups are available via web:

    • student-ipv6 (India) -Description: This is the group for the Student Awareness group of IPv6 in India

    • sun-ipv6-users -Description: Please report problems/suggestions regarding SUN Microsystems IPng implementation

    • IPv6-BITS -Description: This List will co-ordinate the working of Project Vertebrae.

    • linux-bangalore-ipv6 -Description: The IPv6 deployment list of the Bangalore Linux User Group

    • packet-switching -Description: This mailing list provides a forum for discussion of packet switching theory, technology, implementation and application in any relevant aspect including without limitation LAPB, X.25, SDLC, P802.1d, LLC, IP, IPv6, IPX, DECNET, APPLETALK, FR, PPP, IP Telephony, LAN PBX systems, management protocols like SNMP, e-mail, network transparent window systems, protocol implementation, protocol verification, conformance testing and tools used in maintaining or developing packet switching systems.

    • de.comm.protocols.tcp-ip -Description: Umstellung auf IPv6 -Source: Chartas der Newsgruppen in de.*

    • Google Group: comp.protocols.tcp-ip

    • Google Group: linux.debian.maint.ipv6

    • Google Group: microsoft.public.platformsdk.networking.ipv6

    • Google Group: fa.openbsd.ipv6


    25.7. Trainings, Seminars

    Something missing? Suggestions are welcome!


    25.8. 'The Online Discovery' ...

    IPv6: Addressing The Needs Of the Future by Yankee Group (Author) -List Price: $595.00 -Edition: e-book (Acrobat Reader) -Pages: 3 (three) -Publisher: MarketResearch.com; ISBN B00006334Y; (November 1, 2001)

    ;-) The number of copies would be interesting...


    Chapter 26. Revision history / Credits / The End

    26.1. Revision history

    Versions x.y are published on the Internet.

    Versions x.y.z are work-in-progress and published as LyX and SGML file on CVS. Because Deep Space 6 mirrors these SGML files and generate independend from TLDP public versions, this versions will show up there and also on its mirrors.


    26.1.1. Releases 0.x

    0.65

    2010-04-20/PB: extend QoS section with examples

    0.65

    2009-12-13/PB: minor fixes

    0.64

    2009-06-11/PB: extend DHCP server examples (ISC DHCP, Dibbler)

    0.63

    2009-02-14/PB: Fix FSF address, major update on 4in6 tunnels, add new section for address resolving, add some URLs, remove broken URLs

    0.62

    2008-11-09/PB: Adjust URL to Turkish howto, add some HIP related URLs, remove broken URLs

    0.61.1

    2007-11-11/PB: fix broken description of shortcut BIND

    0.61

    2007-10-06/PB: fix broken URLs to TLDP-CVS, minor URL update.

    0.60.2

    2007-10-03/PB: fix description of sysctl/autoconf (credits to Francois-Xavier Le Bail)

    0.60.1

    2007-06-16/PB: speling fixes (credits to Larry W. Burton)

    0.60

    2007-05-29/PB: import major contribution to Programming using C-API written by John Wenker, minor fixes

    0.52

    2007-05-23/PB: update firewalling chapter, improve document for proper SGML validation, minor bugfixes

    0.51

    2006-11-08/PB: remove broken URLs, add a new book (credits to Bryan Vukich)

    0.50.2

    2006-10-25/PB: fix typo in dhcp6 section (credits to Michele Ferritto)

    0.50.1

    2006-09-23/PB: add some URLs

    0.50

    2006-08-24/PB: check RFC URLs, fix URL to Chinese translation, finalize for publishing

    0.49.5

    2006-08-23/PB: fix/remove broken URLs

    0.49.4

    2006-08-21/PB: some review, update and enhancement of the content, replace old 6bone example addresses with the current defined ones.

    0.49.3

    2006-08-20/PB: fix bug in maillist entries, 'mobility' is now a separate chapter

    0.49.2

    2006-08-20/PB: update and cleanup of maillist entries

    0.49.1

    2006-06-13/PB: major update of mobility section (contributed by Benjamin Thery)

    0.49

    2005-10-03/PB: add configuration hints for DHCPv6, major broken URL cleanup (credits to Necdet Yucel)

    0.48.1

    2005-01-15/PB: minor fixes

    0.48

    2005-01-11/PB: grammar check and minor review of IPv6 IPsec section

    0.47.1

    2005-01-01/PB: add information and examples about IPv6 IPsec, add some URLs

    0.47

    2004-08-30/PB: add some notes about proftpd, vsftpd and other daemons, add some URLs, minor fixes, update status of Spanish translation

    0.46.4

    2004-07-19/PB: minor fixes

    0.46.3

    2004-06-23/PB: add note about started Greek translation, replace Taiwanese with Chinese for related translation

    0.46.2

    2004-05-22/PB: minor fixes

    0.46.1

    2004-04-18/PB: minor fixes

    0.46

    2004-03-04/PB: announce Italian translation, add information about DHCPv6, minor updates

    0.45.1

    2004-01-12/PB: add note about the official example address space

    0.45

    2004-01-11/PB: minor fixes, add/fix some URLs, some extensions

    0.44.2

    2003-10-30/PB: fix some copy&paste text bugs

    0.44.1

    2003-10-19/PB: add note about start of Italian translation

    0.44

    2003-08-15/PB: fix URLs, add hint on tcp_wrappers (about broken notation in some versions) and Apache2

    0.43.4

    2003-07-26/PB: fix URL, add archive URL for maillist users at ipv6.org, add some ds6 URLs

    0.43.3

    2003-06-19/PB: fix typos

    0.43.2

    2003-06-11/PB: fix URL

    0.43.1

    2003-06-07/PB: fix some URLs, fix credits, add some notes at IPsec

    0.43

    2003-06-05/PB: add some notes about configuration in SuSE Linux, add URL of French translation

    0.42

    2003-05-09/PB: minor fixes, announce French translation

    0.41.4

    2003-05-02/PB: Remove a broken URL, update some others.

    0.41.3

    2003-04-23/PB: Minor fixes, remove a broken URL, fix URL to Taiwanese translation

    0.41.2

    2003-04-13/PB: Fix some typos, add a note about a French translation is in progress

    0.41.1

    2003-03-31/PB: Remove a broken URL, fix another

    0.41

    2003-03-22/PB: Add URL of German translation

    0.40.2

    2003-02-27/PB: Fix a misaddressed URL

    0.40.1

    2003-02-12/PB: Add Debian-Linux-Configuration, add a minor note on translations

    0.40

    2003-02-10/PB: Announcing available German version

    0.39.2

    2003-02-10/GK: Minor syntax and spelling fixes

    0.39.1

    2003-01-09/PB: fix an URL (draft adopted to an RFC)

    0.39

    2003-01-13/PB: fix a bug (forgotten 'link” on “ip link set” (credits to Yaniv Kaul)

    0.38.1

    2003-01-09/PB: a minor fix

    0.38

    2003-01-06/PB: minor fixes

    0.37.1

    2003-01-05/PB: minor updates

    0.37

    2002-12-31/GK: 270 new links added (searched in 1232 SearchEngines) in existing and 53 new (sub)sections

    0.36.1

    2002-12-20/PB: Minor fixes

    0.36

    2002-12-16/PB: Check of and fix broken links (credits to Georg Käfer), some spelling fixes

    0.35

    2002-12-11/PB: Some fixes and extensions

    0.34.1

    2002-11-25/PB: Some fixes (e.g. broken linuxdoc URLs)

    0.34

    2002-11-19/PB: Add information about German translation (work in progress), some fixes, create a small shortcut explanation list, extend “used terms” and add two German books

    0.33

    2002-11-18/PB: Fix broken RFC-URLs, add parameter ttl on 6to4 tunnel setup example

    0.32

    2002-11-03/PB: Add information about Taiwanese translation

    0.31.1

    2002-10-06/PB: Add another maillist

    0.31

    2002-09-29/PB: Extend information in proc-filesystem entries

    0.30

    2002-09-27/PB: Add some maillists

    0.29

    2002-09-18/PB: Update statement about nmap (triggered by Fyodor)

    0.28.1

    2002-09-16/PB: Add note about ping6 to multicast addresses, add some labels

    0.28

    2002-08-17/PB: Fix broken LDP/CVS links, add info about Polish translation, add URL of the IPv6 Address Oracle

    0.27

    2002-08-10/PB: Some minor updates

    0.26.2

    2002-07-15/PB: Add information neighbor discovery, split of firewalling (got some updates) and security into extra chapters

    0.26.1

    2002-07-13/PB: Update nmap/IPv6 information

    0.26

    2002-07-13/PB: Fill /proc-filesystem chapter, update DNS information about depricated A6/DNAME, change P-t-P tunnel setup to use of “ip” only

    0.25.2

    2002-07-11/PB: Minor spelling fixes

    0.25.1

    2002-06-23/PB: Minor spelling and other fixes

    0.25

    2002-05-16/PB: Cosmetic fix for 2^128, thanks to José Abílio Oliveira Matos for help with LyX

    0.24

    2002-05-02/PB: Add entries in URL list, minor spelling fixes

    0.23

    2002-03-27/PB: Add entries in URL list and at maillists, add a label and minor information about IPv6 on RHL

    0.22

    2002-03-04/PB: Add info about 6to4 support in kernel series 2.2.x and add an entry in URL list and at maillists

    0.21

    2002-02-26/PB: Migrate next grammar checks submitted by John Ronan

    0.20.4

    2002-02-21/PB: Migrate more grammar checks submitted by John Ronan, add some additional hints at DNS section

    0.20.3

    2002-02-12/PB: Migrate a minor grammar check patch submitted by John Ronan

    0.20.2

    2002-02-05/PB: Add mipl to maillist table

    0.20.1

    2002-01-31/PB: Add a hint how to generate 6to4 addresses

    0.20

    2002-01-30/PB: Add a hint about default route problem, some minor updates

    0.19.2

    2002-01-29/PB: Add many new URLs

    0.19.1

    2002-01-27/PB: Add some forgotten URLs

    0.19

    2002-01-25/PB: Add two German books, fix quote entinities in exported SGML code

    0.18.2

    2002-01-23/PB: Add a FAQ on the program chapter

    0.18.1

    2002-01-23/PB: Move “the end” to the end, add USAGI to maillists

    0.18

    2002-01-22/PB: Fix bugs in explanation of multicast address types

    0.17.2

    2002-01-22/PB: Cosmetic fix double existing text in history (at 0.16), move all credits to the end of the document

    0.17.1

    2002-01-20/PB: Add a reference, fix URL text in online-test-tools

    0.17

    2002-01-19/PB: Add some forgotten information and URLs about global IPv6 addresses

    0.16

    2002-01-19/PB: Minor fixes, remove “bold” and “emphasize” formats on code lines, fix “too long unwrapped code lines” using selfmade utility, extend list of URLs.

    0.15

    2002-01-15/PB: Fix bug in addresstype/anycast, move content related credits to end of document

    0.14

    2002-01-14/PB: Minor review at all, new chapter “debugging”, review “addresses”, spell checking, grammar checking (from beginning to 3.4.1) by Martin Krafft, add tcpdump examples, copy firewalling/netfilter6 from IPv6+Linux-HowTo, minor enhancements

    0.13

    2002-01-05/PB: Add example BIND9/host, move revision history to end of document, minor extensions

    0.12

    2002-01-03/PB: Merge review of David Ranch

    0.11

    2002-01-02/PB: Spell checking and merge review of Pekka Savola

    0.10

    2002-01-02/PB: First public release of chapter 1


    26.2. Credits

    The quickest way to be added to this nice list is to send bug fixes, corrections, and/or updates to me ;-).

    If you want to do a major review, you can use the native LyX file (see original source) and send diffs against it, because diffs against SGML don't help too much.


    26.2.1. Major credits

    • David Ranch <dranch at trinnet dot net>: For encouraging me to write this HOWTO, his editorial comments on the first few revisions, and his contributions to various IPv6 testing results on my IPv6 web site. Also for his major reviews and suggestions.

    • Pekka Savola <pekkas at netcore dot fi>: For major reviews, input and suggestions.

    • Martin F. Krafft <madduck at madduck dot net>: For grammar checks and general reviewing of the document.

    • John Ronan <j0n at tssg dot wit dot ie>: For grammar checks.

    • Georg Käfer <gkaefer at gmx dot at>: For detection of no proper PDF creation (fixed now by LDP maintainer Greg Ferguson), input for German books, big list of URLs, checking all URLs, many more suggestions, corrections and contributions, and the German translation

    • Michel Boucey <mboucey at free dot fr>: Finding typos and some broken URLs, contribute some suggestions and URLs, and the French translation

    • Michele Ferritto <m dot ferritto at virgilio dot it>: Finding bugs and the Italian translation

    • Daniel Roesen <dr at cluenet dot de>: For grammar checks

    • Benjamin Thery <benjamin dot thery at bull dot net>: For contribution of updated mobility section

    • John Wenker <jjw at pt dot com>: major contribution to Programming using C-API

    • Srivats P. <Srivats dot P at conexant dot com>: major contribution for 4in6 tunnels


    26.2.2. Other credits

    26.2.2.1. Document technique related

    Writing a LDP HOWTO as a newbie (in LyX and exporting this to DocBook to conform to SGML) isn't as easy as some people say. There are some strange pitfalls... Nevertheless, thanks to:


    26.2.2.2. Content related credits

    Credits for fixes and hints are listed here, will grow sure in the future

    • S .P. Meenakshi <meena at cs dot iitm dot ernet dot in>: For a hint using a “send mail” shell program on tcp_wrapper/hosts.deny

    • Frank Dinies <FrankDinies at web dot de>: For a bugfix on IPv6 address explanation

    • John Freed <jfreed at linux-mag dot com>: For finding a bug in IPv6 multicast address explanation

    • Craig Rodrigues <crodrigu at bbn dot com>: For suggestion about RHL IPv6 setup

    • Fyodor <fyodor at insecure dot org>: Note me about outdated nmap information

    • Mauro Tortonesi <mauro at deepspace6 dot net>: For some suggestions

    • Tom Goodale <goodale at aei-potsdam dot mpg dot de>: For some suggestions

    • Martin Luemkemann <mluemkem at techfak dot uni-bielefeld dot de>: For a suggestion

    • Jean-Marc V. Liotier <jim at jipo dot com>: Finding a bug

    • Yaniv Kaul <ykaul at checkpoint dot com>: Finding a bug

    • Arnout Engelen <arnouten at bzzt dot net>: For sending note about a draft was adopted to RFC now

    • Stephane Bortzmeyer <bortzmeyer at nic dot fr>: Contributing persistent configuration on Debian

    • lithis von saturnsys <lithis at saturnsys dot com>: Reporting a misaddressed URL

    • Guy Hulbert <gwhulbert at rogers dot com>: Send a note that RFC1924 is probably an April fool's joke

    • Tero Pelander <tpeland at tkukoulu dot fi>: Reporting a broken URL

    • Walter Jontofsohn <wjontof at gmx dot de>: Hints for SuSE Linux 8.0/8.1

    • Benjamin Hofstetter <benjamin dot hofstetter at netlabs dot org>: Reporting a mispointing URL

    • J.P. Larocque <piranha at ely dot ath dot cx>: Reporting archive URL for maillist users at ipv6 dot org

    • Jorrit Kronjee <jorrit at wafel dot org>: Reporting broken URLs

    • Colm MacCarthaigh <colm dot maccarthaigh at heanet dot ie>: Hint for sendfile issue on Apache2

    • Tiago Camilo <tandre at ipg dot pt>: Contribute some URLs about Mobile IPv6

    • Harald Geiger: Reporting a bug in how described the bit counting of the universal/global bit

    • Bjoern Jacke <bjoern at j3e dot de>: Triggered me to fix some outdated information on xinetd

    • Christoph Egger <cegger at chrrr dot com>: Sending note about “ip” has problems with IPv4-compatible addresses on SuSE Linux 9.0 and trigger to add a hint on 6to4-radvd example

    • David Lee Haw Ling <hawling at singnet dot com dot sg>: Sending information about a tunnel broker

    • Michael H. Warfield <mhw at iss dot net>: Sending note about suffix for 6to4 routers

    • Tomasz Mrugalski <thomson at klub dot com dot pl>: Sending updates for DHCPv6 section

    • Jan Minar <jjminar at fastmail dot fm>: Reporting minor bugs

    • Kalin KOZHUHAROV <kalin at tar dot bz>: Fixing a not so well explanation

    • Roel van Dijk <rdvdijk at planet dot nl>: Reporting broken URLs

    • Catalin Muresan <catalin dot muresan at astral dot ro>: Reporting minor bugs

    • Dennis van Dok <dvandok at quicknet dot nl>: Reporting minor bugs

    • Necdet Yucel <nyucel at comu dot edu dot tr>: Reporting broken URLs

    • Bryan Vukich: Reporting a broken URL

    • Daniele Masini: reporting a broken iptables example

    • Yao Zhao: reporting a bug in IPv6 route remove description

    • Aaron Kunde: reporting a broken URL and a content related bug

    • Larry W. Burton: speling fixes

    • Justin Pryzby: reporting broken shortcut description of BIND


    26.3. The End

    Thanks for reading. Hope it helps!

    If you have any questions, subscribe to proper maillist and describe your problem providing as much as information as possible.

    -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - - 0.66wip 2010-04-20 PB -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - - 0.65 2009-12-13 PB - -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - - 0.64 2009-06-11 PB - -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - - 0.60 2007-05-31 PB - -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - - 0.51 2006-11-08 PB - -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Abstract -A meta deste HOWTO de IPv6 em Linux é responder as questões básicas e avançadas - sobre a versão 6 do protocolo IP em um sistema com Linux. - Este HOWTO dará ao leitor informação suficiente para instalar, configurar - e usar aplicações IPv6 em máquinas com o Linux. - Versões intermediárias deste HOWTO estão disponíveis nos endereços -\begin_inset CommandInset href -LatexCommand href -name "mirrors.bieringer.de" -target "http://mirrors.bieringer.de/Linux+IPv6-HOWTO/" - -\end_inset - - ou -\begin_inset CommandInset href -LatexCommand href -name "mirrors.deepspace6.net" -target "http://mirrors.deepspace6.net/Linux+IPv6-HOWTO/" - -\end_inset - -. - Veja também -\begin_inset CommandInset ref -LatexCommand ref -name "revision history" -reference "revision-history" - -\end_inset - - para saber das mudanças. -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-general" - -\end_inset - -Geral -\end_layout - -\begin_layout Standard -As informações sobre as traduções disponíveis estão na seção -\begin_inset CommandInset ref -LatexCommand ref -name "Translations" -reference "general-translations" - -\end_inset - -. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "general-copright" - -\end_inset - -Copyright, licença e outros -\end_layout - -\begin_layout Subsection -Copyright -\end_layout - -\begin_layout Standard -Escrito e com Copyright (C) 2001-2011 por Peter Bieringer -\end_layout - -\begin_layout Subsection -Licença -\end_layout - -\begin_layout Standard - -\series bold -Este Linux IPv6 HOWTO está publicado sob a licença GNU GPL versão 2 -\series default -: -\begin_inset Newline newline -\end_inset - - -\end_layout - -\begin_layout Standard -Linux IPv6 HOWTO, um guia para configurar e usar o IPv6 em sistemas Linux. - -\begin_inset Newline newline -\end_inset - - -\end_layout - -\begin_layout Standard -Copyright -\lang ngerman -© -\lang english - 2001-2011 Peter Bieringer -\begin_inset Newline newline -\end_inset - - -\end_layout - -\begin_layout Standard -Este documento é um software livre; voce pode redistribui-lo e/ou modifica-lo - sob os termos da licença GNU GPL, tal como está publicado pela Free Software - Foundation; seja pela versão 2 da Licença, ou (em sua opinião) qualquer - versão posterior. -\end_layout - -\begin_layout Standard -Este programa é distribuído na esperança de que seja útil, mas SEM QUALQUER - GARANTIA; nem mesmo qualquer garantia de COMERCIALIZAÇÃO ou ADEQUAÇÃO PARA - UM PROPÓSITO PARTICULAR. - Veja a GNU GPL para mais detalhes. -\end_layout - -\begin_layout Standard -Se voce quiser uma cópia da licença GNU GPL, solicite através de carta para - o endereço Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110, USA. -\end_layout - -\begin_layout Subsection -Sobre o autor -\end_layout - -\begin_layout Subsubsection -História do autor com a Internet e IPv6 -\end_layout - -\begin_layout Itemize -1993: Eu entrei em contato com a internet utilizando um cliente de email - e news baseado em console há bastante tempo (procure por "e91abier" no - grupo -\begin_inset CommandInset href -LatexCommand href -name "groups.google.com" -target "http://groups.google.com/" - -\end_inset - -, sou eu). -\end_layout - -\begin_layout Itemize -1996: Foi solicitado que eu produzisse um curso de IPv6, incluindo um workshop - com o Sistema Operacional Linux. -\end_layout - -\begin_layout Itemize -1997: Comecei escrevendo um guia sobre como instalar, configurar e utilizar - o IPv6 em Linux, chamado -\begin_inset CommandInset href -LatexCommand href -name "IPv6 & Linux - HowTo" -target "http://www.bieringer.de/linux/IPv6/" - -\end_inset - - (veja -\begin_inset CommandInset href -LatexCommand href -name "IPv6 & Linux - HowTo/History" -target "http://www.bieringer.de/linux/IPv6/IPv6-HOWTO/IPv6-HOWTO-0.html#history" - -\end_inset - - para mais informações). -\end_layout - -\begin_layout Itemize -2001: Comecei a escrever este novo Linux IPv6 HOWTO. -\end_layout - -\begin_layout Subsubsection -Contato -\end_layout - -\begin_layout Standard -O autor pode ser contactado através do endereço de email e também através de sua -\begin_inset CommandInset href -LatexCommand href -name "homepage" -target "http://www.bieringer.de/pb/" - -\end_inset - -. -\end_layout - -\begin_layout Standard -Atualmente ele mora em Munique [parte nordeste de Schwabing] / Bavaria / - Alemanha (sul) / Europa (centro) / Terra (superfície). -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "general-category" - -\end_inset - -Categoria -\end_layout - -\begin_layout Standard -Este HOWTO deve ser listado na categoria "Networking/Protocols". -\end_layout - -\begin_layout Section -Versão, Histórico e To-Do -\end_layout - -\begin_layout Subsection -Versão -\end_layout - -\begin_layout Standard -A versão atual deste documento é mostrada no começo do documento. -\end_layout - -\begin_layout Standard -Para outras versões ou traduções disponíveis, veja o site -\begin_inset CommandInset href -LatexCommand href -name "http://www.bieringer.de/linux/IPv6/" -target "http://www.bieringer.de/linux/IPv6/" - -\end_inset - -. -\end_layout - -\begin_layout Subsection -Histórico -\end_layout - -\begin_layout Subsubsection -Relevantes -\end_layout - -\begin_layout Standard -2001-11-30: Começo do estilo do novo HOWTO. -\end_layout - -\begin_layout Standard -2002-01-02: Maioria do conteúdo feito, primeira publicação do capítulo 1(versão - 0.10). -\end_layout - -\begin_layout Standard -2002-01-14: Mais conteúdo, algumas revisões, e publicação do documento completo - (version 0.14). -\end_layout - -\begin_layout Standard -2002-08-16: Tradução para o Polones em progresso -\end_layout - -\begin_layout Standard -2002-10-31: Tradução para o Chines disponível (veja -\begin_inset CommandInset ref -LatexCommand ref -name "Translations" -reference "general-translations" - -\end_inset - - para mais informações) -\end_layout - -\begin_layout Standard -2002-11-10: Tradução para o Alemão em progresso -\end_layout - -\begin_layout Standard -2003-02-10: Tradução para o Alemão disponível -\end_layout - -\begin_layout Standard -2003-04-09: Tradução para o Frances em progresso -\end_layout - -\begin_layout Standard -2003-05-09: Tradução para o Frances disponível -\end_layout - -\begin_layout Standard -2003-10-16: Tradução para o Italiano em progresso -\end_layout - -\begin_layout Standard -2004-03-12: Tradução para o Italiano disponível -\end_layout - -\begin_layout Standard -2004-06-18: Tradução para o Grego em progresso -\end_layout - -\begin_layout Standard -2005-07-25: Tradução para o Turco disponível -\end_layout - -\begin_layout Standard -2007-03-28: Tradução para o Portugues-Brazil em progresso -\end_layout - -\begin_layout Standard -2008-07-30: Tradução para o Espanhol disponível (mas ainda em progresso) -\end_layout - -\begin_layout Subsubsection -História completa -\end_layout - -\begin_layout Standard -Veja -\begin_inset CommandInset ref -LatexCommand ref -name "revision history" -reference "revision-history" - -\end_inset - - no final deste documento -\end_layout - -\begin_layout Subsection -To-Do -\end_layout - -\begin_layout Itemize -Completar conteúdo que ainda falta -\end_layout - -\begin_layout Itemize -Finalizar a checagem gramatical -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "general-translations" - -\end_inset - -Traduções -\end_layout - -\begin_layout Standard -As traduções devem sempre conter a URL, número da versão c copyright do - documento original (e o seu também). - Por favor não traduza o changelog original, pois isto não terá muita importanci -a. - Também não traduza a seção sobre traduções disponíveis, pois elas podem - estar desatualizadas. - Ao invés disso, adicione uma URL para a seção em Ingles deste HOWTO. -\end_layout - -\begin_layout Standard -Aparentemente a frequencia de mudança deste documento ocorre menos de uma - vez por mes. - Desde a versão 0.2.7 parece que a maioria do conteúdo que eu fiz foi escrito. - As traduções devem sempre ter a versão em ingles como original.. -\end_layout - -\begin_layout Subsection -Linguagens -\end_layout - -\begin_layout Standard -Nota: uma olhada nesta URL pode ajudar -\begin_inset CommandInset href -LatexCommand href -name "http://www.bieringer.de/linux/IPv6/" -target "http://www.bieringer.de/linux/IPv6/" - -\end_inset - -. -\end_layout - -\begin_layout Subsubsection -Chines -\end_layout - -\begin_layout Standard -A tradução para o Chines, feito por Burma Chen - (informada a mim em 2002-10-31) e pode ser encontrada no TLDP: -\begin_inset CommandInset href -LatexCommand href -name "http://www.ibiblio.org/pub/Linux/docs/HOWTO/translations/zh/Linux-IPv6-HOWTO.txt.gz (g'zipped txt)" -target "http://www.ibiblio.org/pub/Linux/docs/HOWTO/translations/zh/Linux-IPv6-HOWTO.txt.gz" - -\end_inset - -. - É uma foto da tradução, eu não sei se está atualizada. -\end_layout - -\begin_layout Subsubsection -Polones -\end_layout - -\begin_layout Standard -Desde 2002-08-16 a tradução para o Polones foi iniciada e ainda está em - progresso por Lukasz Jokiel . - Versão usada: CVS-version 1.29 do arquivo LyX, a qual foi a origem para - a versão 0.2.7. - O status é de ainda em progresso (2004-08-30). -\end_layout - -\begin_layout Subsubsection -German -\end_layout - -\begin_layout Standard -Em 2002-11-10 a versão Alemã foi iniciada por Georg Käfer iniciou a tradução para o alemão, e a primeira publicação foi feita - em 2003-02-10. - Ela está originalmenmte disponível na Deep Space 6 -\begin_inset CommandInset href -LatexCommand href -name "http://mirrors.deepspace6.net/Linux+IPv6-HOWTO-de/" -target "http://mirrors.deepspace6.net/Linux+IPv6-HOWTO-de/" - -\end_inset - - (e também em -\begin_inset CommandInset href -LatexCommand href -name "http://mirrors.bieringer.de/Linux+IPv6-HOWTO-de/" -target "http://mirrors.bieringer.de/Linux+IPv6-HOWTO-de/" - -\end_inset - -). - Esta versão se manterá atualizada tanto quanto for possível. -\end_layout - -\begin_layout Subsubsection -Frances -\end_layout - -\begin_layout Standard -Em 2003-04-09 foi iniciada a tradução da versão em Frances, por Michel Boucey - e a primeira publicação foi em 2003-05-09. - Ela está originalmente disponível na Deep Space 6 -\begin_inset CommandInset href -LatexCommand href -name "http://mirrors.deepspace6.net/Linux+IPv6-HOWTO-fr/" -target "http://mirrors.deepspace6.net/Linux+IPv6-HOWTO-fr/" - -\end_inset - - (e também em -\begin_inset CommandInset href -LatexCommand href -name "http://mirrors.bieringer.de/Linux+IPv6-HOWTO-fr/" -target "http://mirrors.bieringer.de/Linux+IPv6-HOWTO-fr/" - -\end_inset - -). -\end_layout - -\begin_layout Subsubsection -Espanhol -\end_layout - -\begin_layout Standard -Um membro do projeto MontevideoLibre, localizado no Uruguai (América do - Sul) iniciou a tradução para espanhol no formato wiki: -\begin_inset CommandInset href -LatexCommand href -name "http://www.montevideolibre.org./manuales:libros:ipv6" -target "http://www.montevideolibre.org./manuales:libros:ipv6" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Italiano -\end_layout - -\begin_layout Standard -Em 2003-10-16 a tradução para uma versão em Italiano foi iniciada Michele - Ferritto para o -\begin_inset CommandInset href -LatexCommand href -name "ILDP" -target "http://ildp.pluto.linux.it/" - -\end_inset - - (Italian Linux Documentation Project) e a sua primeira publicação foi em - 2004-03-12. - Ela está originalmente disponível no ILDP em -\begin_inset CommandInset href -LatexCommand href -name "http://it.tldp.org/HOWTO/Linux+IPv6-HOWTO/" -target "http://it.tldp.org/HOWTO/Linux+IPv6-HOWTO/" - -\end_inset - -. -\end_layout - -\begin_layout Subsubsection -Japones -\end_layout - -\begin_layout Standard -Em 2003-05-14 Shino Taketani me enviou uma - nota dizendo que planejava traduzir o HOWTO para o japones. -\end_layout - -\begin_layout Subsubsection -Grego -\end_layout - -\begin_layout Standard -Em 2004-06-18 Nikolaos Tsarmpopoulos me enviou uma - nota dizendo que planejava traduzir o HOWTO para o Grego. -\end_layout - -\begin_layout Subsubsection -Turco -\end_layout - -\begin_layout Standard -Em 2005-07-18 Necdet Yucel me enviou uma - nota dizendo que a tradução em Turco estava disponível. - E uma fotografia da tradução (versão 0.61) pode ser encontrada na URL -\begin_inset CommandInset href -LatexCommand href -name "http://docs.comu.edu.tr/howto/ipv6-howto.html" -target "http://docs.comu.edu.tr/howto/ipv6-howto.html" - -\end_inset - -. -\end_layout - -\begin_layout Subsubsection -Portuguese-Brazil -\end_layout - -\begin_layout Standard -Em 2011-05-06 Gustavo Mendes de Carvalho iniciou - a tradução deste HowTo para Portugues-Brazil. - A primeira tentativa realizada em 2007 por Claudemir da Luz nunca foi finalizada. -\end_layout - -\begin_layout Section -Técnico -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "general-original-source" - -\end_inset - -Fonte original deste HOWTO -\end_layout - -\begin_layout Standard -Este HOWTO foi escrito usando LyX versão 1.6.1 em um sistema Linux Fedora - 10 com o template SGML/XML (DocBook). - Ele está disponível em -\begin_inset CommandInset href -LatexCommand href -name "github / tLDP / LDP / users / Peter-Bieringer" -target "https://github.com/tLDP/LDP/tree/master/LDP/users/Peter-Bieringer/" - -\end_inset - - para contribuições. -\end_layout - -\begin_layout Subsubsection -Divisor de linha de código -\end_layout - -\begin_layout Standard -Eu utilizei um utilitário divisor de linha de código (Code line wrapping - - "lyxcodelinewrapper.pl") feito por mim mesmo, e ele está disponível para - seu próprio uso em -\begin_inset CommandInset href -LatexCommand href -name "TLDP-CVS / users / Peter-Bieringer" -target "http://cvs.tldp.org/go.to/LDP/LDP/users/Peter-Bieringer/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Geração de SGML -\end_layout - -\begin_layout Standard -O SGML/XML é gerado usando a função de exportar do LyX -\end_layout - -\begin_layout Subsection -Referencias On-line para a versão em HTML deste HOWTO -\end_layout - -\begin_layout Subsubsection -Página principal -\end_layout - -\begin_layout Standard -Como boa prática, uma referencia à página principal deste HOWTO é recomendada. -\end_layout - -\begin_layout Subsubsection -Páginas dedicadas -\end_layout - -\begin_layout Standard -Como as páginas em HTML são geradas a partir dos arquivos SGML, os nomes - dos arquivos em HTML podem ser bastante diferentes (randomicos). - Entretanto, algumas páginas são etiquetadas em LyX, resultando em nomes - estáticos. - Estas etiquetas são úteis para referencias e não deveriam ser alteradas - no futuro. - Se voce acredita que eu esqueci qualquer etiqueta, por favor me avise, - e eu colocarei. -\end_layout - -\begin_layout Section -Prefácio -\end_layout - -\begin_layout Standard -Algumas coisas antes: -\end_layout - -\begin_layout Subsection -Quantas versões deste HOWTO existem por aí ? -\end_layout - -\begin_layout Standard -Incluindo esta, existem 3 (tres) documentos HOWTO disponíveis. - Minhas desculpas se forem demais ;-) -\end_layout - -\begin_layout Subsubsection -Linux IPv6 FAQ/HOWTO (desatualizada) -\end_layout - -\begin_layout Standard -O primeiro documento HOWTO relacionado a IPv6 foi escrito pelo Eric Osborne - e era chamado -\begin_inset CommandInset href -LatexCommand href -name "Linux IPv6 FAQ/HOWTO" -target "http://www.linuxhq.com/IPv6/" - -\end_inset - - (por favor use-o somente para fins históricos). - Sua última versão foi a 3.2.1, lançada em 14 de Julho de 1997. -\end_layout - -\begin_layout Standard -Por favor ajude: Se alguém souber a data de nascimento deste HOWTO, por - favor me envie um e-mail (estas informações são necessárias para o "histórico"). -\end_layout - -\begin_layout Subsubsection -IPv6 & Linux - HowTo (mantida) -\end_layout - -\begin_layout Standard -Esta segunda versão existe e se chama -\begin_inset CommandInset href -LatexCommand href -name "IPv6 & Linux - HowTo" -target "http://www.bieringer.de/linux/IPv6/" - -\end_inset - - escrita por mim (Peter Bieringer) em HTML puro. - Ele nasceu em Abril de 1997 e sua primeira versão em ingles foi publicada - em Junho de 1997. - Eu vou continuar a manter esta versão, mas isto deve acontecer devagar - e não será por completo, em favor da atualização da versão do Linux IPv6 - HOWTO que voce está lendo agora. -\end_layout - -\begin_layout Subsubsection -Linux IPv6 HOWTO (este documento) -\end_layout - -\begin_layout Standard -Já que este -\begin_inset CommandInset href -LatexCommand href -name "IPv6 & Linux - HowTo" -target "http://www.bieringer.de/linux/IPv6/" - -\end_inset - - foi escrito em HTML puro, ele não é compatível com o -\begin_inset CommandInset href -LatexCommand href -name "The Linux Documentation Project (TLDP)" -target "http://www.tldp.org/" - -\end_inset - -. - Eu recebi então um pedido no final de Novembro de 2001 para reescrever - este HowTo -\begin_inset CommandInset href -LatexCommand href -name "IPv6 & Linux - HowTo" -target "http://www.bieringer.de/linux/IPv6/" - -\end_inset - - em SGML. - Entretanto, por causa da descontinuidade do HOWTO ( -\begin_inset CommandInset href -LatexCommand href -name "Future of IPv6 & Linux - HowTo" -target "http://www.bieringer.de/linux/IPv6/IPv6-HOWTO/IPv6-HOWTO-0.html#history" - -\end_inset - -), e como o IPv6 estava ficando mais e mais padronizado, eu decidi escrever - um novo documento cobrindo os pontos básicos e um pouco avançados que permanece -ram importantes ao longo destes anos. - Algum conteúdo mais dinamico e avançado ainda pode ser encontrado neste - segundo HOWTO ( -\begin_inset CommandInset href -LatexCommand href -name "IPv6 & Linux - HowTo" -target "http://www.bieringer.de/linux/IPv6/" - -\end_inset - -). -\end_layout - -\begin_layout Section -Termos usados, glossário e atalhos -\end_layout - -\begin_layout Subsection -Rede -\end_layout - -\begin_layout Description -Base -\begin_inset space ~ -\end_inset - -10 Sistema numérico muito bem conhecido e representa qualquer valor com - os dígitos 0 a 9. -\end_layout - -\begin_layout Description -Base -\begin_inset space ~ -\end_inset - -16 Geralmente usado em linguagens de programação, também conhecido como - sistema numérico hexadecimal, representa qualquer valor com os dígitos - 0 a 9 e caracteres A a F (case insensitive). -\end_layout - -\begin_layout Description -Base -\begin_inset space ~ -\end_inset - -85 Representação de um valor com 85 dígitos/caracteres diferentes, ele pode - levar a strings menores, mas nunca vi ser usado em campo. -\end_layout - -\begin_layout Description -Bit A menor unidade de armazenamento, representa on/verdade/1 e off/falso/0. -\end_layout - -\begin_layout Description -Byte Geralmente uma coleção de 8 bits (mas não é necessariamente uma verdade - - veja outros sistemas computacionais) -\end_layout - -\begin_layout Description -Device Aqui, o hardware para a conexão de rede, veja também NIC -\end_layout - -\begin_layout Description -Dual -\begin_inset space ~ -\end_inset - -homed -\begin_inset space ~ -\end_inset - -host Um sistema dual homed é um nó com duas redes (física ou virtual) com - interfaces em dois links diferentes, mas sem encaminhar qualquer pacote - entre eles (não é um router). -\end_layout - -\begin_layout Description -Host Geralmente um sistema single homed com somente uma interface de rede - ativa, exemplo Ethernet ou (não e) PPP. -\end_layout - -\begin_layout Description -Interface Quase sempre o mesmo que "device", veja também NIC -\end_layout - -\begin_layout Description -IP -\begin_inset space ~ -\end_inset - -Header Cabeçalho de um pacote IP (cada pacote de rede tem um cabeçalho e - seu tipo depende do nível de rede) -\end_layout - -\begin_layout Description -Link Um link é o nível 2 de rede, ou meio de transporte de pacotes. - exemplos são Ethernet, Token Ring, PPP, SLIP, ATM, ISDN, Frame Relay,... -\end_layout - -\begin_layout Description -Node Um nó é um host ou um router. -\end_layout - -\begin_layout Description -Octet É uma coleção de 8 bits, hoje bem similar a "byte". -\end_layout - -\begin_layout Description -Port Informação utilizada pelo TCP/UDP dispatcher (camada 4) para transportar - informações para as camadas superiores -\end_layout - -\begin_layout Description -Protocolo Cada camada de rede que contém a maioria dos campos e informações - para tornar a vida mais fácil ao enviar a informação transportada para - as camadas superiores, veja camada 2 (MAC) e 3 (IP) -\end_layout - -\begin_layout Description -Router Um router é um nó com 2 ou mais redes interfaces de rede (física - ou virtual), capaz de encaminhar os pacotes entre as suas interfaces. -\end_layout - -\begin_layout Description -Socket Um socket IP é definido pelo endereço de origem e destino, e suas - portas -\end_layout - -\begin_layout Description -Stack Relacionado às várias camadas de rede -\end_layout - -\begin_layout Description -Subnetmask Redes IP usam bits de máscara para separar redes locais de redes - remotas -\end_layout - -\begin_layout Description -Tunnel Um túnel é tipicamente uma conexão ponto-a-ponto sobre a qual pacotes - são trocados, e que carregam dados de outro protocolo. - Exemplo túnel IPv6-in-IPv4. -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "Glossar" - -\end_inset - -Atalhos -\end_layout - -\begin_layout Description -ACL Access Control List - Lista de controle de acesso -\end_layout - -\begin_layout Description -API Application Programming Interface - Interface de programação de aplicação -\end_layout - -\begin_layout Description -ASIC Application Specified Integrated Circuit -\end_layout - -\begin_layout Description -BSD Berkeley Software Distribution -\end_layout - -\begin_layout Description -CAN-Bus Controller Area Network Bus (physical bus system) -\end_layout - -\begin_layout Description -ISP Internet Service Provider - Provedor de serviços Internet -\end_layout - -\begin_layout Description -KAME Projeto - um esforço conjunto de seis companhias no Japão para fornecer - grátis uma pilha IPv6 e IPsec (para ambos IPv4 e IPv6) para as variantes - BSD existentes no mundo -\begin_inset CommandInset href -LatexCommand href -name "www.kame.net" -target "http://www.kame.net/" - -\end_inset - - -\end_layout - -\begin_layout Description -LIR Local Internet Registry - No Brasil, o registro.br -\end_layout - -\begin_layout Description -NIC Network Interface Card -\end_layout - -\begin_layout Description -RFC Request For Comments - conjunto de notas técnicas organizacionais sobre - a Internet -\end_layout - -\begin_layout Description -USAGI UniverSAl playGround for Ipv6 Project - trabalho para entregar uma - pilha IPv6 de qualidade para os sistemas Linux. -\end_layout - -\begin_layout Subsection -Informações úteis -\end_layout - -\begin_layout Subsubsection -Sinal de divisão de linha longa de código -\end_layout - -\begin_layout Standard -O caractere especial "¬" é usado para sinalizar que esta linha de código - foi dividida para se obter uma melhor visualização em arquivos PFG e PS. -\end_layout - -\begin_layout Subsubsection -Marcadores -\end_layout - -\begin_layout Standard -Nos exemplos genéricos voce encontrará as seguintes marcações: -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Standard -Para o uso real em seu sistema de linha de comando ou em scripts, isto deve - ser substituído pelo conteúdo correto (removendo os sinais < e >). - Desta forma o resultado seria -\end_layout - -\begin_layout Code - -1.2.3.4 -\end_layout - -\begin_layout Subsubsection -Comandos no shell -\end_layout - -\begin_layout Standard -Comandos executados no shell por usuários normais (não root) começam com - $ -\end_layout - -\begin_layout Code - -$ whoami -\end_layout - -\begin_layout Standard -Comandos executados pelo usuário root começam com # -\end_layout - -\begin_layout Code - -# whoami -\end_layout - -\begin_layout Section -Necessidades para usar este HOWTO -\end_layout - -\begin_layout Subsection -Prerequisitos pessoais -\end_layout - -\begin_layout Subsubsection -Experiencia com ferramentas Unix -\end_layout - -\begin_layout Standard -Voce deve estar familiarizado com a maioria das ferramentas Unix, como grep, - awk, find, etc. - , e saber sobre a maioria das opções mais usadas de cada um deles. -\end_layout - -\begin_layout Subsubsection -Experiencia com teoria de rede -\end_layout - -\begin_layout Standard -Voce deve estar famliarizado com camadas, protocolos, endereços, cabos, - conectores, etc. - Se voce é novo nesta área, este é um bom local para voce iniciar seus estudos -\lang ngerman - -\begin_inset CommandInset href -LatexCommand href -name "http://www.rigacci.org/docs/biblio/online/intro_to_networking/book1.htm" -target "http://www.rigacci.org/docs/biblio/online/intro_to_networking/book1.htm" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Experiencia com configuração IPv4 -\end_layout - -\begin_layout Standard -Voce deve definitivamente ter alguma experiencia em configuração de redes - IPv4, caso contrário será difícil para voce entender o que realmente está - acontecendo. -\end_layout - -\begin_layout Subsubsection -Experiencia com Domain Name System (DNS) -\end_layout - -\begin_layout Standard -Permitirá a voce entender o que é um Domain Name System (DNS), que serviço - ele fornece e como usa-lo. -\end_layout - -\begin_layout Subsubsection -Experiencia com estratégias de debug de rede -\end_layout - -\begin_layout Standard -Voce deve pelo menos entender como usar o tcpdump e o que ele pode te mostrar. - Caso contrário a depuração de problemas de rede será muito difícil para - voce. -\end_layout - -\begin_layout Subsection -Hardware compatível com o sistema Linux -\end_layout - -\begin_layout Standard -É claro que voce vai precisar usar algum hardware (pode ser uma maquina - virtual), e não somente ler este HOWTO para dormir. - ;-7) -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-basics" - -\end_inset - -Básico -\end_layout - -\begin_layout Section -O que é IPv6? -\end_layout - -\begin_layout Standard - -\color none -O IPv6 é um novo protocolo de camada 3 que tem a função de substituir o - IPv4 (também conhecido apenas por IP). - O IPv4 foi projetado a muito tempo atrás( -\begin_inset CommandInset href -LatexCommand href -name "RFC 760 / Internet Protocol" -target "http://www.faqs.org/rfcs/rfc760.html" - -\end_inset - - de Janeiro de 1980) e desde o começo tem havido muitos pedidos de atender - mais capacidades e funcionalidades. - A última RFC é -\begin_inset CommandInset href -LatexCommand href -name "RFC 2460 / Internet Protocol Version 6 Specification" -target "http://www.faqs.org/rfcs/rfc2460.html" - -\end_inset - -.As grandes mudanças no IPv6 foram o novo formato do cabeçalho, incluindo - o tamanho da capacidade de endereços, de 32 para 128 bits. - Já que a camada 3 é a responsável por transporte de pacotes fim a fim usando - o roteamento baseado em endereços, ele deveria incluir os endereços IPv6 - de origem e destino tal como o IPv4. -\end_layout - -\begin_layout Standard -Para mais informações sobre a história do IPv6, de uma olhada nas RFC's - mais antigas do IPv6 listadas aqui -\begin_inset CommandInset href -LatexCommand href -name "SWITCH IPv6 Pilot / References" -target "http://www.switch.ch/lan/ipv6/references.html" - -\end_inset - -. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "basic-history-IPv6-Linux" - -\end_inset - -História do IPv6 no Linux -\end_layout - -\begin_layout Standard -Os anos de 1992, 1993 e 1994 do IPv6 no Linux (linhas gerais) são cobertos - pelo seguinte documento: -\begin_inset CommandInset href -LatexCommand href -name "IPv6 or IPng (IP next generation)" -target "http://www.laynetworks.com/IPv6.htm#CH3" - -\end_inset - -. -\end_layout - -\begin_layout Standard -To-do: melhorar a linha do tempo, adicionar conteúdo... -\end_layout - -\begin_layout Subsection -O começo -\end_layout - -\begin_layout Standard -O primeiro trecho de código de rede relacionado com o IPv6 foi adicionado - ao kernel 2.1.8 do Linux em novembro de 1996 por Pedro Roque. - Ele foi baseado na API do BSD: -\end_layout - -\begin_layout Code - -diff -u --recursive --new-file v2.1.7/linux/include/linux/in6.h -\end_layout - -\begin_layout Code - -¬ linux/include/linux/in6.h -\end_layout - -\begin_layout Code - ---- v2.1.7/linux/include/linux/in6.h Thu Jan 1 02:00:00 1970 -\end_layout - -\begin_layout Code - -+++ linux/include/linux/in6.h Sun Nov 3 11:04:42 1996 -\end_layout - -\begin_layout Code - -@@ -0,0 +1,99 @@ -\end_layout - -\begin_layout Code - -+/* -\end_layout - -\begin_layout Code - -+ * Types and definitions for AF_INET6 -\end_layout - -\begin_layout Code - -+ * Linux INET6 implementation -\end_layout - -\begin_layout Code - -+ * + * Authors: -\end_layout - -\begin_layout Code - -+ * Pedro Roque <******> -\end_layout - -\begin_layout Code - -+ * -\end_layout - -\begin_layout Code - -+ * Source: -\end_layout - -\begin_layout Code - -+ * IPv6 Program Interfaces for BSD Systems -\end_layout - -\begin_layout Code - -+ * -\end_layout - -\begin_layout Standard -As linhas mostradas foram copiadas do patch-2.1.8 (o email foi limpo para - evitar spam). -\end_layout - -\begin_layout Subsection -Enquanto isso -\end_layout - -\begin_layout Standard -Por conta do buraco da manpower, a implementação do IPv6 no kernel foi incapaz - de seguir os rascunhos propostos pelos novos RFC's publicados. - Em outubro de 2000, um projeto foi iniciado no Japão, chamado -\begin_inset CommandInset href -LatexCommand href -name "USAGI" -target "http://www.linux-ipv6.org/" - -\end_inset - -, cujo objetivo foi implantar todo o restante, ou desatualizado, suporte - ao IPv6 para o Linux. - Ele utiliza a implementação IPv6 atual para o FreeBSD feita pelo -\begin_inset CommandInset href -LatexCommand href -name "KAME project" -target "http://www.kame.net/" - -\end_inset - -. - De tempos em tempos, eles criavam fotos da versão vanilla do código do - kernel do Linux. -\end_layout - -\begin_layout Standard -Até a implementação do desenvolvimento na série 2.5 do kernel ter sido iniciado, - os patches do -\begin_inset CommandInset href -LatexCommand href -name "USAGI" -target "http://www.linux-ipv6.org/" - -\end_inset - - eram tão grandes, que os mantenedores de rede do Linux eram incapazes de - inclui-lo completamente no código final do kernel do Linux série 2.4.x. -\end_layout - -\begin_layout Standard -Durante o desenvolvimento da serie 2.5, o tentou inserir todas as suas extensões - usadas nesta série. -\end_layout - -\begin_layout Subsection -Atualmente -\end_layout - -\begin_layout Standard -Muito do desenvolvimento feito para o IPv6 e patches do -\begin_inset CommandInset href -LatexCommand href -name "USAGI" -target "http://www.linux-ipv6.org/" - -\end_inset - - e outros estão integrados na série vanilla do kernel 2.6.x. -\end_layout - -\begin_layout Subsection -O futuro -\end_layout - -\begin_layout Standard -O -\begin_inset CommandInset href -LatexCommand href -name "USAGI" -target "http://www.linux-ipv6.org/" - -\end_inset - - e outros ainda mantém o trabalho na implementação de novas características - e funcionalidades, como a mobilidade e outros. - De tempos em tempos, novos patches com extensões são lançados e também - integrados à série vanilla do kernel. -\end_layout - -\begin_layout Section -Como o endereço IPv6 se parece? -\end_layout - -\begin_layout Standard -\align left -Como já mencionado antes, os endereços IPv6 possuem 128 bits de tamanho. - Este número de bits gera um número decimal extremamente grande, com 39 - dígitos de tamanho: -\end_layout - -\begin_layout Code - -2^128-1: 340282366920938463463374607431768211455 -\end_layout - -\begin_layout Standard -\align left -Tais números não são endereços fáceis de serem memorizados. - Os endereços IPv6 também tem um esquema orientado a bits (assim como o - IPv4, mas não tão facilmente reconhecido). - Assim a melhor notação de números tão grandes é em formato hexadecimal. - Em hexadecimal, 4 bits (também conhecidos como "nibble") são representados - por um dígito ou caractere, de 0-9 e A-F. - Desta forma, o tamanho do endereço é reduzido para 32 caracteres. -\end_layout - -\begin_layout Code - -2^128-1: 0xffffffffffffffffffffffffffffffff -\end_layout - -\begin_layout Standard -\align left -Esta representação ainda não é muito conveniente (com a possível mistura - ou perda de um único dígito hexadecimal), então os desenvolvedores do IPv6 - escolheram um formato hexadecimal com um ":" separando cada bloco de 16 - bits. - Com isso, o sinal inicial 0x (um prefixo para valores hexadecimais em linguagen -s de programação) foi removido: -\end_layout - -\begin_layout Code - -2^128-1: ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff -\end_layout - -\begin_layout Standard -\align left -Um endereço utilizável seria: -\end_layout - -\begin_layout Code - -2001:0db8:0100:f101:0210:a4ff:fee3:9566 -\end_layout - -\begin_layout Standard -\align left -Para simplificar, os zeros iniciais de cada bloco de 16 bits pode ser omitido: -\end_layout - -\begin_layout Code - -2001:0db8:0100:f101:0210:a4ff:fee3:9566 -> -\end_layout - -\begin_layout Code - -¬ 2001:db8:100:f101:210:a4ff:fee3:9566 -\end_layout - -\begin_layout Standard -\align left -Um bloco de 16 bits contendo somente zeros também pode ser omitida, sendo - representada por "::", mas não mais de uma única vez no endereço. - Caso contrário poderia haver duplicação de endereços. -\end_layout - -\begin_layout Code - -2001:0db8:100:f101:0:0:0:1 -> 2001:db8:100:f101::1 -\end_layout - -\begin_layout Standard -\align left -A maior redução possível é vista do endereço IPv6 de localhost: -\end_layout - -\begin_layout Code - -0000:0000:0000:0000:0000:0000:0000:0001 -> ::1 -\end_layout - -\begin_layout Standard -\align left -Há também um outro representação em modo compacto (Código base 85) baseado - na -\begin_inset CommandInset href -LatexCommand href -name "RFC 1924 / A Compact Representation of IPv6 Addresses" -target "http://www.faqs.org/rfcs/rfc1924.html" - -\end_inset - -(publicada em 1º Abril 1996), nunca vista em campo. - Provavelmente é uma pegadinha ou mentirinha da data. - Mas aqui está um exemplo: -\end_layout - -\begin_layout Code - -# ipv6calc --addr_to_base85 2001:0db8:0100:f101:0210:a4ff:fee3:9566 -\end_layout - -\begin_layout Code - -9R}vSQZ1W=9A_Q74Lz&R -\end_layout - -\begin_layout Quotation -Info: ipv6calc é uma calculadora de formato de endereços IPv6 que também - faz conversões, e pode ser encontrada aqui: -\lang ngerman - -\begin_inset CommandInset href -LatexCommand href -name "ipv6calc homepage" -target "http://www.deepspace6.net/projects/ipv6calc.html" - -\end_inset - - ( -\begin_inset CommandInset href -LatexCommand href -name "Mirror" -target "http://mirrors.bieringer.de/www.deepspace6.net/projects/ipv6calc.html" - -\end_inset - -) -\end_layout - -\begin_layout Section -FAQ (Básico) -\end_layout - -\begin_layout Subsection -Porque o nome do sucessor do IPv4 é IPv6 e não IPv5 ? -\end_layout - -\begin_layout Standard -\align left -No cabeçalho IP, os primeiros 4 bits são reservados para a versão do protocolo. - Então em teoria qualquer número entre 0 e 15 seria possível. -\end_layout - -\begin_layout Itemize -\align left -4: já em uso pelo IPv4 -\end_layout - -\begin_layout Itemize -\align left -5: está reservado para o Stream Protocol (STP, -\begin_inset CommandInset href -LatexCommand href -name "RFC 1819 / Internet Stream Protocol Version 2" -target "http://www.faqs.org/rfcs/rfc1819.html" - -\end_inset - -) (o qual nunca foi realmente feito para o público) -\end_layout - -\begin_layout Standard -\align left -O próximo número disponível era 6. - Portando, assim nasceu o IPv6! -\end_layout - -\begin_layout Subsection -Endereços IPv6: porque um número tão grande de bits ? -\end_layout - -\begin_layout Standard -\align left -Durante o desenvolvimento do IPv4, as pessoas pensaram que 32 bits seriam - suficientes para o mundo. - Olhando de volta, realmente 32 bits foram suficientes por bastante tempo. - entretanto 32 bits não foram suficientes para prover endereços globais - para todos os dispositivos de rede no futuro (ou será já no presente ?). - Pense em telefones celulares, tablets, computadores virtuais, carros, GPS's, - geladeiras, TV's, etc. -\end_layout - -\begin_layout Standard -\align left -Assim, os desenvolvedores escolheram 128 bits, 4 vezes maior (no campo do - tamanho do endereço) do que o IPv4. -\end_layout - -\begin_layout Standard -Mas o tamanho utilizável é menor do que parece. - Isto se deve por causa do esquema utilizado na definição do endereçamento: - 64 bits são usados para identificar a interface. - Os outros 64 bits são usados para o roteamento. - Assumindo os níveis de agregação (/48, /32, ...), é possível que os endereços - também se esgotem, mas esperamos que não em futuro próximo. -\end_layout - -\begin_layout Standard -Para mais informações veja também -\begin_inset CommandInset href -LatexCommand href -name "RFC 1715 / The H Ratio for Address Assignment Efficiency" -target "http://www.faqs.org/rfcs/rfc1715.html" - -\end_inset - - e -\begin_inset CommandInset href -LatexCommand href -name "RFC 3194 / The Host-Density Ratio for Address Assignment Efficiency" -target "http://www.faqs.org/rfcs/rfc3194.html" - -\end_inset - -. -\end_layout - -\begin_layout Subsection -Endereços IPv6: porque um número tão pequeno de bits em um nova versão ? -\end_layout - -\begin_layout Standard -\align left -Enquanto existam (possivelmente) algumas pessoas (só sei do Jim Fleming...) - na internet que estejam pensando sobre o IPv8 ou IPv16, estes projetos - estão muito longe de serem aceitos e implementados. - Enquanto isso, 128 bits foi a melhor escolha levando em consideração o - overhead do cabeçalho e o transporte de dados. - Considere o MTU mínimo no IPv4 (576 octetos) e no IPv6 (1280 octetos), - o tamanho do cabeçalho em iIPv4 é de 20 octetos (mínimo, e pode aumentar - até 60 octetos com outras opções usadas) e no IPv6 é de 40 octetos (fixo). - Isto representa 3,4% de overhead no IPv4 (com o tamanho mínimo) e 3,1 % - do menor MTU em IPv6. - O overhead é praticamente igual. - Mais bits para endereço necessitariam cabeçalhos maiores e consequentemente - mais overhead. - Além disso, considere o tamanho máximo de uma MTU em links normais (como - em Ethernet hoje): são 1500 octetos (em alguns casos especiais 9.000 octetos - usando jumbo frames). - Assim, não seria um projeto apropriado se 10% a 20% dos dados transportados - para a camada 3 fosse usado para endereçamento e não para dados propriamente - ditos. -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-addresstypes" - -\end_inset - -Tipos de endereço -\end_layout - -\begin_layout Standard -Como no IPv4, os endereços em IPv6 também podem ser divididos em duas partes - - host e rede - com a utilização de máscaras de rede. -\end_layout - -\begin_layout Standard -O IPv4 tem mostrado que algumas vezes é bom, se mais de um endereço IP puder - ser configurado em uma interface, cada um deles com um propósito bem diferente - (aliases, multicast). - Então para continuar extensível, o IPv6 também suporta esta característica - e permite que mais de 1 endereço seja configurado na mesma interface. - Atualmente não existe qualquer limitação definida pela RFC, a não ser na - implementação da pilha IPv6 (para evitar ataques DoS). -\end_layout - -\begin_layout Standard -Ao usar este grande número de bits para endereço, o IPv6 define tipos de - endereços baseado nos bits iniciais, os quais são, espera-se, não sejam - quebrados no futuro, como acontece hoje com o IPv4 e as suas classes A, - B e C. -\end_layout - -\begin_layout Standard -Estes números de bits são separados para endereçar redes (os primeiros 64 - bits) e para endereços de host (os últimos 64 bits), para facilitar a auto-conf -iguração. -\end_layout - -\begin_layout Section -Endereços sem um prefixo especial -\end_layout - -\begin_layout Subsection -Endereço localhost -\end_layout - -\begin_layout Standard -Este é um endereço especial para a interface de loopback, similar ao 127.0.0.1 - no IPv4. - Em IPv6, este endereço de localhost é: -\end_layout - -\begin_layout Code - -0000:0000:0000:0000:0000:0000:0000:0001 -\end_layout - -\begin_layout Standard -ou em sua forma comprimida: -\end_layout - -\begin_layout Code - -::1 -\end_layout - -\begin_layout Standard -\align left -Os pacotes com este endereço como origem ou destino nunca devem sair ou - entrar em um host. -\end_layout - -\begin_layout Subsection -Endereços não especificados -\end_layout - -\begin_layout Standard -Este é um endereço especial, como "any" ou "0.0.0.0". - Em IPv6 é representado assim: -\end_layout - -\begin_layout Code - -0000:0000:0000:0000:0000:0000:0000:0000 -\end_layout - -\begin_layout Standard -ou: -\end_layout - -\begin_layout Code - -:: -\end_layout - -\begin_layout Standard -Este endereço é geralmente usado para especificação de portas (qualquer - IPv6) ou tabelas de roteamento. -\end_layout - -\begin_layout Standard -Nota: este endereço nunca pode ser usado como um endereço de destino. -\end_layout - -\begin_layout Subsection -Endereços IPv6 vinculados a endereços IPv4 -\end_layout - -\begin_layout Standard -Existem dois endereços que contém endereços IPv4. -\end_layout - -\begin_layout Subsubsection -IPv4-mapeado para IPv6 -\end_layout - -\begin_layout Standard -Um endereço IPv4-único para compatibilidade IPv6 é às vezes usado ou mostrado - para sockets criados por um daemon IPv6, mas que só recebe conexões de - endereços IPv4. -\end_layout - -\begin_layout Standard -Estes endereços são definidos dentro de um prefixo especial, com o tamanho - /96 (a.b.c.d é o endereço IPv4): -\end_layout - -\begin_layout Code - -0:0:0:0:0:ffff:a.b.c.d/96 -\end_layout - -\begin_layout Standard -ou em seu formato comprimido -\end_layout - -\begin_layout Code - -::ffff:a.b.c.d/96 -\end_layout - -\begin_layout Standard -por exemplo, o endereço IP 1.2.3.4 seria assim: -\end_layout - -\begin_layout Code - -::ffff:1.2.3.4 -\end_layout - -\begin_layout Subsubsection -por exemplo, o endereço IP 1.2.3.4 seria assim: -\end_layout - -\begin_layout Standard -Usado para tunelamento automático( -\begin_inset CommandInset href -LatexCommand href -name "RFC 2893 / Transition Mechanisms for IPv6 Hosts and Routers" -target "http://www.faqs.org/rfcs/rfc2893.html" - -\end_inset - -), o qual é substituído pelo -\begin_inset CommandInset ref -LatexCommand ref -name "6to4 tunneling" -reference "tunneling-6to4" - -\end_inset - -. -\end_layout - -\begin_layout Code - -0:0:0:0:0:0:a.b.c.d/96 -\end_layout - -\begin_layout Standard -ou em seu formato comprimido -\end_layout - -\begin_layout Code - -::a.b.c.d/96 -\end_layout - -\begin_layout Section -Parte da rede, também conhecido como prefixo -\end_layout - -\begin_layout Standard -Os designers definiram alguns tipos de endereços e deixaram muito disto - para futuras definições quando novas necessidades surgirem. - A -\begin_inset CommandInset href -LatexCommand href -name "RFC 4291 / IP Version 6 Addressing Architecture" -target "http://www.faqs.org/rfcs/rfc4291.html" - -\end_inset - - define o esquema utilizado no endereçamento atual. -\end_layout - -\begin_layout Standard -Vamos agora dar uma olhada nos diferentes tipos de prefixos (e também em - tipos de endereços): -\end_layout - -\begin_layout Subsection -Endereço tipo "link local" -\end_layout - -\begin_layout Standard -\align left -Estes são endereços epeciais que são válidos somente no link de uma interface. - Usando este endereço como destino, os pacotes nunca serão encaminhados - a um router. - Isto é usado para links de comunicação, tais como: -\end_layout - -\begin_layout Itemize -\align left -Há alguém está aqui neste link ? -\end_layout - -\begin_layout Itemize -\align left -Há alguém aqui com endereços especiais (ex. - procurando por um router) ? -\end_layout - -\begin_layout Standard -\align left -Eles começam com (onde "x" é qualquer caractere hexadecimal, normalmente - "0") -\end_layout - -\begin_layout Code - -fe8x: <- atualmente é o único em uso -\end_layout - -\begin_layout Code - -fe9x: -\end_layout - -\begin_layout Code - -feax: -\end_layout - -\begin_layout Code - -febx: -\end_layout - -\begin_layout Standard -Um endereço com este prefixo é encontrado em cada interface com IPv6 habilitado - após a auto-configuração stateless (a qual é normalmente sempre o caso). -\end_layout - -\begin_layout Subsection -Endereço tipo "site local" -\end_layout - -\begin_layout Standard -\align left -Estes endereços são similares aos da -\begin_inset CommandInset href -LatexCommand href -name "RFC 1918 / Address Allocation for Private Internets" -target "http://www.faqs.org/rfcs/rfc1918.html" - -\end_inset - - em uso atualmente em IPv4, com a vantagem adicional de que qualquer pessoa - que usar este tipo de endereço tem a capacidade de usar até 16 bits para - a definição máxima de 65535 subredes. - Comparável com o 10.0.0.0/8 do IPv4. -\end_layout - -\begin_layout Standard -\align left -Outra vantagem: como é possível colocar mais de 1 endereço em uma interface - com IPv6, voce pode configurar um endereço de "site local" junto com um - endereço global. -\end_layout - -\begin_layout Standard -\align left -Ele começa com: -\end_layout - -\begin_layout Code - -fecx: <- mais usado, mais comum -\end_layout - -\begin_layout Code - -fedx: -\end_layout - -\begin_layout Code - -feex: -\end_layout - -\begin_layout Code - -fefx: -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Standard -(onde o "x" é qualquer caractere hexadecimal, geralmente um "0") -\end_layout - -\begin_layout Standard -Este tipo de endereço não deveria mais ser usado, -\begin_inset CommandInset href -LatexCommand href -name "RFC 3879 / Deprecating Site Local Addresses" -target "http://www.faqs.org/rfcs/rfc3879.html" - -\end_inset - -, mas para um teste em laboratório, estes endereços ainda continuam sendo - uma boa escolha (IMHO - em minha humilde opinião). -\end_layout - -\begin_layout Subsection -Endereços locais Unicast IPv6 -\end_layout - -\begin_layout Standard -Por causa da definição original de endereços de site local não serem únicos, - pode haver algum problema se duas redes já configuradas forem se conectar - em um futuro próximo (overlap de subredes). - Este e outros problemas foram os motivos para um novo tipo de endereço - definido na -\begin_inset CommandInset href -LatexCommand href -name "RFC 4193 / Unique Local IPv6 Unicast Addresses" -target "http://www.faqs.org/rfcs/rfc4193.html" - -\end_inset - -. - -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_layout Standard -\align left -Ele começa com: -\end_layout - -\begin_layout Code - -fcxx: -\end_layout - -\begin_layout Code - -fdxx: <- atualmente o único em uso -\end_layout - -\begin_layout Standard -\align left -Uma parte do prefixo (40 bits) é gerada usando um algoritmo pseudo-randomico - e é improvável que dois resultados gerados por este algoritmo sejam iguais. -\end_layout - -\begin_layout Standard -Exemplo de um prefixo gerado por este algoritmo (veja em: -\begin_inset CommandInset href -LatexCommand href -name "Goebel Consult / createLULA" -target "http://www.goebel-consult.de/ipv6/createLULA" - -\end_inset - -): -\end_layout - -\begin_layout Code - -fd0f:8b72:ac90::/48 -\end_layout - -\begin_layout Subsection -Endereço tipo Global "(Aggregatable) global unicast" -\end_layout - -\begin_layout Standard -\align left -Atualmente, existe um tipo de endereço definido globalmente (o primeiro - design, chamado "provider based") que foi jogado fora a alguns anos atrás -\begin_inset CommandInset href -LatexCommand href -name "RFC 1884 / IP Version 6 Addressing Architecture [obsolete]" -target "http://www.faqs.org/rfcs/rfc1884.html" - -\end_inset - -, e voce consegue encontrar em algumas versões do kernel do Linux. -\end_layout - -\begin_layout Standard -\align left -Ele começa com (os caracteres "x" são hexadecimais) -\end_layout - -\begin_layout Code - -2xxx: -\end_layout - -\begin_layout Code - -3xxx: -\end_layout - -\begin_layout Standard -Nota: o prefixo "aggregatable" foi descartado nos atuais drafts. - Há ainda alguns outros subtipos definidos. - Veja abaixo: -\end_layout - -\begin_layout Subsubsection -Endereço de teste 6bone -\end_layout - -\begin_layout Standard -\align left -Estes foram os primeiros endereços globais que foram definidos e usados. - Eles começam com -\end_layout - -\begin_layout Code - -3ffe: -\end_layout - -\begin_layout Standard -Exemplo: -\end_layout - -\begin_layout Code - -3ffe:ffff:100:f102::1 -\end_layout - -\begin_layout Standard -Um endereço de teste especial para o 6bone que nunca seria globalmente único - começa com -\end_layout - -\begin_layout Code - -3ffe:ffff: -\end_layout - -\begin_layout Standard -e a maioria deles é mostrado em exemplos antigos. - A razão para isso é, se endereços reais são mostrados, seria possível alguém - copiar e colar estes endereços de arquivos de configuração antigos, o que - inadvertidamente causaria um erro de duplicação de endereço de um endereço - global único. - Isto poderia causar sérios problemas para o host original (como nunca receber - as respostas de requisições feitas). - -\end_layout - -\begin_layout Standard -Como o IPv6 agora já está em produção, este prefixo não é mais delegado - e ele foi removido do processo de roteamento (veja -\begin_inset CommandInset href -LatexCommand href -name "RFC 3701 / 6bone Phaseout" -target "http://www.faqs.org/rfcs/rfc3701.html" - -\end_inset - - para mais detalhes). -\end_layout - -\begin_layout Subsubsection -Endereços 6to4 -\end_layout - -\begin_layout Standard -\align left -Estes endereços, feitos para um mecanismo de túnel especial [ -\begin_inset CommandInset href -LatexCommand href -name "RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds" -target "http://www.faqs.org/rfcs/rfc3056.html" - -\end_inset - - e -\begin_inset CommandInset href -LatexCommand href -name "RFC 2893 / Transition Mechanisms for IPv6 Hosts and Routers" -target "http://www.faqs.org/rfcs/rfc2893.html" - -\end_inset - -],utilizam um endereço IPv4 já fornecido e a sua possível subnet, e começam - com -\end_layout - -\begin_layout Code - -2002: -\end_layout - -\begin_layout Standard -Por exemplo, este endereço 192.168.1.1/5 ficaria: -\end_layout - -\begin_layout Code - -2002:c0a8:0101:5::1 -\end_layout - -\begin_layout Standard -Um pequeno comando em shell poderia ajudar voce a gerar este endereço, baseado - em um endereço IPv4 fornecido: -\end_layout - -\begin_layout Code - -ipv4="1.2.3.4"; sla="5"; printf "2002:%02x%02x:%02x%02x:%04x::1" `echo $ipv4 -\end_layout - -\begin_layout Code - -¬ | tr "." " "` $sla -\end_layout - -\begin_layout Standard -Veja também -\begin_inset CommandInset ref -LatexCommand ref -name "tunneling using 6to4" -reference "tunneling-6to4" - -\end_inset - - e -\begin_inset CommandInset ref -LatexCommand ref -name "information about 6to4 relay routers" -reference "information-joinipv6-6to4-tunneling" - -\end_inset - -. -\end_layout - -\begin_layout Subsubsection -Designado pelo provedor para roteamento hierárquico -\end_layout - -\begin_layout Standard -Este endereço é delegado pelo ISP e começa com -\end_layout - -\begin_layout Code - -2001: -\end_layout - -\begin_layout Standard -Prefixos de ISP's maiores (ou AS's) são delegados pelos -\begin_inset CommandInset ref -LatexCommand ref -name "local registries" -reference "information-majorregionregistries" - -\end_inset - - e tem atualmente um tamanho de prefixo /32. -\end_layout - -\begin_layout Standard -Qualquer outro ISP/empresa pode solicitar um prefixo de tamanho /48, mas - isto depende da política de distribuição de endereços dos registros locais - de cada país ou região. -\end_layout - -\begin_layout Subsubsection -Endereços reservados para exemplos e documentação -\end_layout - -\begin_layout Standard -Atualmente, dois blocos de endereço estão reservados para exemplos e documentaçã -o. - Veja a -\begin_inset CommandInset href -LatexCommand href -name "RFC 3849 / IPv6 Address Prefix Reserved for Documentation" -target "http://www.faqs.org/rfcs/rfc3849.html" - -\end_inset - -: -\end_layout - -\begin_layout Code - -3fff:ffff::/32 -\end_layout - -\begin_layout Code - -2001:0DB8::/32 EXAMPLENET-WF -\end_layout - -\begin_layout Standard -Estes endereços devem ser filtrados baseados no endereço de origem e NÃO - devem ser roteados em roteadores de borda em direção à internet, se possível. -\end_layout - -\begin_layout Subsection -Endereços Multicast -\end_layout - -\begin_layout Standard -\align left -Endereços Multicast são usados por serviços específicos. -\end_layout - -\begin_layout Standard -Eles sempre começam com (xx é o valor de escopo) -\end_layout - -\begin_layout Code - -ffxy: -\end_layout - -\begin_layout Standard -Existem divisões entre escopo e tipo: -\end_layout - -\begin_layout Subsubsection -Escopo Multicast -\end_layout - -\begin_layout Standard -O escopo Multicast é um parametro usado para especificar a distancia máxima - que um pacote multicast pode "viajar" a partir de sua origem. -\end_layout - -\begin_layout Standard -Atualmente, os seguintes escopos (ou regiões) estão definidos: -\end_layout - -\begin_layout Itemize -ffx1: nó local, os pacotes nunca deixam o nó. -\end_layout - -\begin_layout Itemize -ffx2: link-local, os pacotes nunca são encaminhados pelos routers, assim - eles nunca deixam o link especificado. -\end_layout - -\begin_layout Itemize -ffx5: site-local, os pacotes nunca deixam o site. -\end_layout - -\begin_layout Itemize -ffx8: organization-local, os pacotes nunca deixam a organização (não é tão - fácil de implementar, mas deve ser coberto pelo protocolo de roteamento). -\end_layout - -\begin_layout Itemize -ffxe: escopo global. -\end_layout - -\begin_layout Itemize -outros são reservados -\end_layout - -\begin_layout Subsubsection -Tipos Multicast -\end_layout - -\begin_layout Standard -Já existem muitos tipos definidos/reservados (veja -\begin_inset CommandInset href -LatexCommand href -name "RFC 4291 / IP Version 6 Addressing Architecture" -target "http://www.faqs.org/rfcs/rfc4291.html" - -\end_inset - - para mais detalhes). - Alguns exemplos são: -\end_layout - -\begin_layout Itemize -Endereço All Nodes: ID = 1h, endereça todos os host no nó local (ff01:0:0:0:0:0: -0:1) ou no link conectado (ff02:0:0:0:0:0:0:1). -\end_layout - -\begin_layout Itemize -Endereço All Routers: ID = 2h, endereça tosos os routers no nó local (ff01:0:0:0 -:0:0:0:2), no link conectado (ff02:0:0:0:0:0:0:2), ou no site local (ff05:0:0:0: -0:0:0:2) -\end_layout - -\begin_layout Subsubsection -Endereço multicast solicitado nó link-local -\end_layout - -\begin_layout Standard -Um endereço de multicast especial que é usado como endereço de destino para - a descoberta da vizinhança , uma vez que no IPv6 não há ARP, como existe - no IPv4. -\end_layout - -\begin_layout Standard -Um exemplo deste endereço se parece com -\end_layout - -\begin_layout Code - -ff02::1:ff00:1234 -\end_layout - -\begin_layout Standard -Os prefixos usados mostram que este é um endereço multicast link-local. - O sufixo é gerado a partir do endereço de destino. - Neste exemplo, um pacote deveria ser enviado ao endereço "fe80::1234", - mas a parte de rede não conhece o MAC atual deste destino. - Ele então substitui os 104 bits mais altos com "ff02:0:0:0:0:1:ff00::/104" - e deixa os menores 24 bits intocados. - Este endereço então é agora usado no link para achar o nó correspondente - que tem que enviar uma resposta contendo o endereço MAC usado na camada - 2. -\end_layout - -\begin_layout Subsection -Endereços Anycast -\end_layout - -\begin_layout Standard -Endereços Anycast são endereços especiais e eles são usados para muitas - coisas, como o servidor DNS ou DHCP mais próximo, e outras coisas. - Estes endereços são obtidos do espaço de endereçamento Unicast (aggregatable - global ou site-local). - O mecanismo anycast (do ponto de vista do cliente) será tratado pelos protocolo -s de roteamento dinamico. -\end_layout - -\begin_layout Standard -Nota: Endereços anycast não podem ser usados como endereços de origem, pois - eles se aplicam somente a endereços de destino. -\end_layout - -\begin_layout Subsubsection -Endereços Anycast Subnet-router -\end_layout - -\begin_layout Standard -Um exemplo simples para um endereço unicast é o anycast subnet-router. - Assumindo que um nó tem os seguintes endereços globais IPv6 configurados: -\end_layout - -\begin_layout Code - -2001:db8:100:f101:210:a4ff:fee3:9566/64 <- Node's address -\end_layout - -\begin_layout Standard -O endereço unicast subnet-router será criado removendo o sufixo (os 64 bits - menos significantes) completamente: -\end_layout - -\begin_layout Code - -2001:db8:100:f101::/64 <- subnet-router anycast address -\end_layout - -\begin_layout Section -Tipos de endereço (parte de host) -\end_layout - -\begin_layout Standard -\align left -Para a auto-configuração e questões de mobilidade, foi decidido usar os - 64 bits de menor significado como a parte de host do endereço na maioria - dos tipos de endereços atuais. - Desta forma, cada subnet pode suportar uma grande quantidade de endereços. -\end_layout - -\begin_layout Standard -\align left -A parte de host pode ser verificada de maneira distinta: -\end_layout - -\begin_layout Subsection -Computado automaticamente (também conhecido como stateless) -\end_layout - -\begin_layout Standard -Com a auto-configuração, a parte host do endereço é feita através da conversão - do endereço MAC da interface (se disponível), através do método EUI-64, - para um único endereço IPv6. - Se nenhum MAC estiver disponível para este dispositivo (isto acontece bastante - em dispositivos virtuais), outra coisa (como o endereço IPv4 ou o MAC da - interface física) é usada no lugar. -\end_layout - -\begin_layout Standard -Exemplo: uma placa de rede tem o seguinte endereço MAC (48 bit): -\end_layout - -\begin_layout Code - -00:10:a4:01:23:45 -\end_layout - -\begin_layout Standard -\align left -Isto poderia ser expandido de acordo com o tutorial do IEEE - -\begin_inset CommandInset href -LatexCommand href -name "IEEE-Tutorial EUI-64" -target "http://standards.ieee.org/regauth/oui/tutorials/EUI64.html" - -\end_inset - - resultando no endereço abaixo: -\end_layout - -\begin_layout Code - -0210:a4ff:fe01:2345 -\end_layout - -\begin_layout Standard -\align left -Com um prefixo já fornecido, o resultado é o endereço IPv6 mostrado abaixo: -\end_layout - -\begin_layout Code - -2001:0db8:0100:f101:0210:a4ff:fe01:2345 -\end_layout - -\begin_layout Subsubsection -Problema de privacidade com os endereços automaticamente computados e uma - solução -\end_layout - -\begin_layout Standard -\align left -Por causa da parte host do endereço "automaticamente computado" ser único, - (exceto quando um fabricante de placas de rede usa o mesmo MAC em mais - de um NIC), o rastreamento de um cliente é possível quando não há um proxy - de qualquer tipo. -\end_layout - -\begin_layout Standard -\align left -Este é um problema já conhecido, e a sua solução foi definida através da - extensão de privacidade, definida na -\begin_inset CommandInset href -LatexCommand href -name "RFC 3041 / Privacy Extensions for Stateless Address Autoconfiguration in IPv6" -target "http://www.faqs.org/rfcs/rfc3041.html" - -\end_inset - - (já existe também um novo draft disponível: -\begin_inset CommandInset href -LatexCommand href -name "draft-ietf-ipv6-privacy-addrs-v2-*" -target "http://www.ietf.org/ids.by.wg/ipv6.html" - -\end_inset - -). - Usando um valor estático e um valor randomico, um novo sufixo é gerado - de tempos em tempos. -\end_layout - -\begin_layout Standard -\align left -Nota: isto é somente interessante em conexões finais de clientes, e não - é realmente útil para servidores já conhecidos. -\end_layout - -\begin_layout Subsection -Definido manualmente -\end_layout - -\begin_layout Standard -Para servidores, provavelmente é mais fácil se lembrar de endereços mais - simples, mas isto também pode ser resolvido. - Em IPv6, é possível configurar um endereço adicional para uma interface. - Veja o exemplo: -\end_layout - -\begin_layout Code - -2001:0db8:100:f101::1 -\end_layout - -\begin_layout Standard -Para sufixos manuais como o ::1 mostrado acima, é necessário que o sétimo - bit mais significativo seja definido como 0 (o bit universal/local do identific -ador gerado automaticamente). - Existe também uma outra combinação de bits (não utilizada) que é reservada - para endereços unicast. -\end_layout - -\begin_layout Section -Tamanho de prefixos para roteamento -\end_layout - -\begin_layout Standard -Na fase inicial de projeto e design do IPv6, foi planejada a utilização - hierárquica de roteamento para reduzir o tamanho das tabelas de roteamento - ao menor valor possível. - As razões por trás desta abordagem foram o grande número de rotas nos grandes - roteadores de borda (cerca de 300.000 em janeiro de 2011), reduzindo a necessida -de de memória nos routers e a capacidade de se utilizar chips ASIC (Application - Specified Integrated Circuit) para manipular esta tabela, aumentando a - velocidade (uma tabela menor aumenta a velocidade). -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_layout Standard -\align left -A visão de hoje é que o roteamento será mais hierárquico para redes com - somente 1 ISP. - Em redes com mais de 1 conexão, isto não é possível, e está sujeita a sistemas - multi-homed (informações de multi-homing: -\begin_inset CommandInset href -LatexCommand href -name "drafts-ietf-multi6-*" -target "http://www.ietf.org/ids.by.wg/multi6.html" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Multihoming Solutions" -target "http://arneill-py.sacramento.ca.us/ipv6mh/" - -\end_inset - -). -\end_layout - -\begin_layout Subsection -Tamanho de prefixo (também conhecido como "netmasks") -\end_layout - -\begin_layout Standard -\align left -Semelhante ao IPv4, a rede roteável entra em cena. - Por causa da notação do padrão de máscara de rede (128 bits) não parecer - bom, os designers utilizaram o mesmo método utilizado no IPv4, chamado - Classless Inter Domain Routing (CIDR, -\begin_inset CommandInset href -LatexCommand href -name "RFC 1519 / Classless Inter-Domain Routing" -target "http://www.faqs.org/rfcs/rfc1519.html" - -\end_inset - -)o qual especifica o número de bits do endereço IP que será usado para o - roteamento. - E ele também é chamado notação "slash". -\end_layout - -\begin_layout Standard -\align left -Exemplo: -\end_layout - -\begin_layout Code - -2001:0db8:100:1:2:3:4:5/48 -\end_layout - -\begin_layout Standard -\align left -Esta notação pode ser expandida: -\end_layout - -\begin_layout Itemize -Rede: -\end_layout - -\begin_layout Code - -2001:0db8:0100:0000:0000:0000:0000:0000 -\end_layout - -\begin_layout Itemize -Máscara de rede: -\end_layout - -\begin_layout Code - -ffff:ffff:ffff:0000:0000:0000:0000:0000 -\end_layout - -\begin_layout Subsection -Encontrando uma rota -\end_layout - -\begin_layout Standard -Em circunstancias normais, (sem QoS), a procura em uma tabela de roteamento - resulta na rota mais adequada com o número mais significante de bits do - endereço. - Em outras palavras, a rota com o maior prefixo tem a preferencia. -\end_layout - -\begin_layout Standard -Por exemplo, se uma tabela de rotas mostra as seguintes entradas (a lista - é parcial): -\end_layout - -\begin_layout Code - -2001:0db8:100::/48 :: U 1 0 0 sit1 -\end_layout - -\begin_layout Code - -2000::/3 ::192.88.99.1 UG 1 0 0 tun6to4 -\end_layout - -\begin_layout Standard -Os endereços de destino mostrados dos pacotes IPv6 serão roteados através - das interfaces mostradas -\end_layout - -\begin_layout Code - -2001:0db8:100:1:2:3:4:5/48 -> routed through device sit1 -\end_layout - -\begin_layout Code - -2001:0db8:200:1:2:3:4:5/48 -> routed through device tun6to4 -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-systemcheck" - -\end_inset - -Verificação do sistema para IPv6 -\end_layout - -\begin_layout Standard -\align left -Antes de voce começar a utilizar o IPv6 em uma máquina com Linux, é necessário - testar para saber se seu sistema tem o suporte ao protocolo. - Talvez voce tenha que fazer algum ajuste para prepara-lo antes de começar - a usar. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "systemcheck-kernel" - -\end_inset - -Kernel com IPv6 -\end_layout - -\begin_layout Standard -\align left -As distribuições mais novas de Linux já tem o kernel com suporte ao IPv6, - e este suporte geralmente acontece com a compilação em módulos, mas é possível - que estes módulos sejam carregados no momento do boot. -\end_layout - -\begin_layout Standard - -\series bold -Nota: voce não deve usar o kernel da série 2.2, porque ele já não é mais - atualizado. - A série 2.4 também já não tem todas as atualizações de acordo com as últimas - RFC's, então recomendamos utilizar um kernel da série 2.6. -\end_layout - -\begin_layout Subsection -Verificação do suporte a IPv6 no kernel utilizado -\end_layout - -\begin_layout Standard -\align left -Para verificar se o seu kernel já está com o suporte a IPv6 habilitado, - de uma olhada nos arquivos do diretório /proc. - A seguinte entrada deve existir: -\end_layout - -\begin_layout Code - -/proc/net/if_inet6 -\end_layout - -\begin_layout Standard -\align left -Para quem gosta de scripts, é possível usar estes comandos: -\end_layout - -\begin_layout Code - -# test -f /proc/net/if_inet6 && echo "Running kernel is IPv6 ready" -\end_layout - -\begin_layout Standard -\align left -Se este teste falhar, provavelmente seu sistema não está com os módulos - de IPv6 carregados. -\end_layout - -\begin_layout Subsection -Tentando carregar os módulos para o IPv6 -\end_layout - -\begin_layout Standard -\align left -Voce pode tentar carregar os módulos do IPv6 com o comando -\end_layout - -\begin_layout Code - -# modprobe ipv6 -\end_layout - -\begin_layout Standard -\align left -Se a carga ocorreu sem problemas, verifique o status com estes comandos: -\end_layout - -\begin_layout Code - -# lsmod |grep -w 'ipv6' && echo "IPv6 module successfully loaded" -\end_layout - -\begin_layout Standard -Depois disso, rode os comandos novamente do item 4.1.1 para ter certeza de - que está tudo certo. -\end_layout - -\begin_layout Standard -Note: a remoção do módulo (rmmod) não é suportada, e recomendo não utilizar, - pois pode haver alguma instabilidade no sistema. -\end_layout - -\begin_layout Subsubsection -Carga automática do módulo -\end_layout - -\begin_layout Standard -É possível automatizar a carga do módulo IPv6 conforme seja necessário. - Para isto, basta adicionar a seguinte entrada no arquivo de configuração - (/etc/modules.conf ou /etc/conf.modules): -\end_layout - -\begin_layout Code - -alias net-pf-10 ipv6 # automatically load IPv6 module on demand -\end_layout - -\begin_layout Standard -Também é possível desabilitar a carga do módulo automaticamente usando a - seguinte entrada: -\end_layout - -\begin_layout Code - -alias net-pf-10 off # disable automatically load of IPv6 module on demand -\end_layout - -\begin_layout Standard -Nota: no kernel da série 2.6, o mecanismo carregador de módulos mudou, e - o novo arquivo de configuração é o /etc/modprobe.conf. -\end_layout - -\begin_layout Subsection -Compilando o kernel 2.6 para suportar o IPv6 -\end_layout - -\begin_layout Standard -\align left -Se os dois resultados acima foram negativos, e o seu kernel não tem suporte - para o IPv6, então voce tem algumas coisas a fazer: -\end_layout - -\begin_layout Itemize -\align left -Atualizar a sua distribuição para uma que suporte o IPv6 (recomendado para - os novatos) -\end_layout - -\begin_layout Itemize -\align left -Compilar um novo kernel (fácil, se voce souber quais opções são necessárias) -\end_layout - -\begin_layout Itemize -Recompilar os fontes do kernel dado pela sua distribuição (nem sempre tão - fácil) -\end_layout - -\begin_layout Itemize -\align left -Compilar um kernel com as extensões USAGI -\end_layout - -\begin_layout Standard -\align left -Se voce decidir compilar um kernel, voce precisa ter alguma experiencia - nisso e também ler o -\begin_inset CommandInset href -LatexCommand href -name "Linux Kernel HOWTO" -target "http://www.tldp.org/HOWTO/Kernel-HOWTO.html" - -\end_inset - -. -\end_layout - -\begin_layout Standard -Uma comparação entre o kernel vanilla e as extensões USAGI está disponível - aqui -\begin_inset CommandInset href -LatexCommand href -name "IPv6+Linux-Status-Kernel" -target "http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status-kernel.html" - -\end_inset - -. -\end_layout - -\begin_layout Subsubsection -Compilando um kernel vanilla -\end_layout - -\begin_layout Standard -Mais detalhes e dicas sobre a compilação de um kernel com suporte a IPv6 - pode ser encontrado em -\begin_inset CommandInset href -LatexCommand href -name "IPv6-HOWTO-2#kernel" -target "http://www.bieringer.de/linux/IPv6/IPv6-HOWTO/IPv6-HOWTO-2.html#kernel" - -\end_inset - -. -\end_layout - -\begin_layout Standard -Nota: voce deve usar, sempre que possível, um kernel da séria 2.6, uma vez - que o suporte ao IPv6 na série 2.4 já não teve as últimas atualizações definidas - nas RFC's, e a série 2.2 não tem mais o suporte atualizado ou mesmo mantido - por alguém. -\end_layout - -\begin_layout Subsubsection -Compilando um kernel com as extensões USAGI -\end_layout - -\begin_layout Standard -\align left -Para a família vanilla de kernel, recomendado somente para usuários avançados, - os quais já estão familiarizados com o IPv6 e com compilação de kernel. - Veja também -\begin_inset CommandInset href -LatexCommand href -name "USAGI project / FAQ" -target "http://www.linux-ipv6.org/faq.html" - -\end_inset - - e -\begin_inset CommandInset href -LatexCommand href -name "Obtaining the best IPv6 support with Linux (Article)" -target "http://www.deepspace6.net/docs/best_ipv6_support.html" - -\end_inset - - ( -\begin_inset CommandInset href -LatexCommand href -name "Mirror" -target "http://mirrors.bieringer.de/www.deepspace6.net/docs/best_ipv6_support.html" - -\end_inset - -). -\end_layout - -\begin_layout Subsection -Dispositivos de rede com suporte a IPv6 -\end_layout - -\begin_layout Standard -Nem todos os dispositivos de rede tem suporte (ou terão) para transportar - pacotes IPv6. - Um status atualizado pode ser encontrado em -\begin_inset CommandInset href -LatexCommand href -name "IPv6+Linux-status-kernel.html#transport" -target "http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status-kernel.html#transport" - -\end_inset - -. -\end_layout - -\begin_layout Standard -O maior problema disso é causado na implementação da camada de rede, já - que o pacote IPv6 não é reconhecido pelo cabeçalho IP (6 ao invés de 4). - Ele é reconhecido pelo protocolo da camada 2 (transporte). - Da mesma maneira, qualquer protocolo da camada 2 que não usa numeração - de protocolo não conseguirá encaminhar os pacotes IPv6. -\end_layout - -\begin_layout Standard -Nota: mesmo assim o pacote ainda é transportado pelo link, mas no lado receptor, - o encaminhamento não ocorrerá (voce pode verificar isso com a utilização - do tcpdump). -\end_layout - -\begin_layout Subsubsection -Estes links nunca suportarão IPv6 -\end_layout - -\begin_layout Itemize -Serial Line IP (SLIP, -\begin_inset CommandInset href -LatexCommand href -name "RFC 1055 / SLIP" -target "http://www.faqs.org/rfcs/rfc1055.html" - -\end_inset - -), deveria ser chamado de SLIPv4, nome do dispositivo: slX -\end_layout - -\begin_layout Itemize -Parallel Line IP (PLIP), que nem o SLIP, nome do dispositivo: plipX -\end_layout - -\begin_layout Itemize -ISDN com encapsulamento rawip, nome do dispositivo: isdnX -\end_layout - -\begin_layout Subsubsection -Este link atualmente não suporta IPv6 -\end_layout - -\begin_layout Itemize -ISDN com encapsulamento syncppp, nome do dispositivo: ipppX (problema de - projeto do ipppd, que deveria ter sido resolvido com um PPP mais generalista - na série de kernel 2.5) -\end_layout - -\begin_layout Section -Ferramentas de configuração de rede que suportam IPv6 -\end_layout - -\begin_layout Standard -\align left -Voce não irá muito longe, se voce estiver rodando um kernel com suporte - a IPv6, mas não tiver ferramentas que o ajudem a configurar o IPv6. - Existem vários pacotes para ajudá-lo neste trabalho. -\end_layout - -\begin_layout Subsection -Pacote net-tools -\end_layout - -\begin_layout Standard -\align left -O pacote net-tools inclui algumas ferramentas como ifconfig e route, que - ajudam a configurar uma interface em IPv6. - Veja a saída dos comandos ifconfig -? ou route -?, se eles mostrarem algo - parecido com IPv6 ou inet6, então a ferramenta tem suporte a IPv6. -\end_layout - -\begin_layout Standard -\align left -Novamente, para quem gosta de scripts: -\end_layout - -\begin_layout Code - -# /sbin/ifconfig -? 2>& 1|grep -qw 'inet6' && echo "utility 'ifconfig' is -\end_layout - -\begin_layout Code - -¬ IPv6-ready" -\end_layout - -\begin_layout Standard -\align left -Verificando o route: -\end_layout - -\begin_layout Code - -# /sbin/route -? 2>& 1|grep -qw 'inet6' && echo "utility 'route' is IPv6-ready" -\end_layout - -\begin_layout Subsection -Pacote iproute -\end_layout - -\begin_layout Standard -\align left -Alexey N. - Kuznetsov (atual mantenedor do código de rede no Linux) criou um grupo - de ferramentas que configuram redes através do dispositivo netlink. - O uso destas ferramentas dá mais funcionalidades do que as do pacote net-tools, - mas elas não estão muito bem documentadas e não são para os fracos de coração. -\end_layout - -\begin_layout Code - -# /sbin/ip 2>&1 |grep -qw 'inet6' && echo "utility 'ip' is IPv6-ready" -\end_layout - -\begin_layout Standard -Se o programa /sbin/ip não for encontrado em seu sistema, então eu recomendo - que voce instale o pacote iproute. -\end_layout - -\begin_layout Itemize -Voce pode pega-lo através de sua distribuição (se houver) -\end_layout - -\begin_layout Itemize -Voce pode procurar o pacote RPM em -\begin_inset CommandInset href -LatexCommand href -name "RPMfind/iproute" -target "http://rpmfind.net/linux/rpm2html/search.php?query=iproute" - -\end_inset - - (em alguns casos é recomendada a reconstrução do SRPMS) -\end_layout - -\begin_layout Section -Programas de teste e debug IPv6 -\end_layout - -\begin_layout Standard -\align left -Após a preparação do seu sistema para o IPv6, está na hora de usar este - protocolo para a sua comunicação com outros sistemas. - Primeiro voce deve aprender como analisar os pacotes através de um sniffer. - Isto é altamente recomendável para que qualquer debug ou troubleshooting - seja feito de maneira rápida. -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "program-ping6" - -\end_inset - -Ping IPv6 -\end_layout - -\begin_layout Standard -Este programa está incluído no pacote iputils. - Seu objetivo é enviar e testar o transporte de pacotes ICMPv6 echo-request - packets e aguardar pelos pacotes ICMPv6 echo-reply. -\end_layout - -\begin_layout Standard -Uso -\end_layout - -\begin_layout Code - -# ping6 -\end_layout - -\begin_layout Code - -# ping6 -\end_layout - -\begin_layout Code - -# ping6 [-I ] -\end_layout - -\begin_layout Standard -Exemplo -\end_layout - -\begin_layout Code - -# ping6 -c 1 ::1 -\end_layout - -\begin_layout Code - -PING ::1(::1) from ::1 : 56 data bytes -\end_layout - -\begin_layout Code - -64 bytes from ::1: icmp_seq=0 hops=64 time=292 usec -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - ---- ::1 ping statistics --- -\end_layout - -\begin_layout Code - -1 packets transmitted, 1 packets received, 0% packet loss -\end_layout - -\begin_layout Code - -round-trip min/avg/max/mdev = 0.292/0.292/0.292/0.000 ms -\end_layout - -\begin_layout Standard -Dica: o comando ping6 precisa de acesso direto ao socket e por isso precisa - de permissão de root. - Então se usuários comuns (não-root) tentarem usar o ping6 e não obtiverem - sucesso, podem ser um dos dois problemas: -\end_layout - -\begin_layout Enumerate -ping6 não está na variável PATH deste usuário (provavelmente porque o ping6 - é geralmente localizado em /usr/sbin, e adicionar este diretório ao path - do usuário comum não é muito recomendado) -\end_layout - -\begin_layout Enumerate -ping6 não executa corretamente, geralmente porque faltam permissões de root. - A sugestão neste caso é executar o comando chmod u+s /usr/sbin/ping6 para - permitir o uso do programa. -\end_layout - -\begin_layout Subsubsection -Especificando a interface para o ping em IPv6 -\end_layout - -\begin_layout Standard -Ao usar um endereço link-local para pingar alguém em IPv6 o kernel pode - não reconhecer ou saber através de qual interface (física ou virtual) o - pacote deve ser enviado. - Por causa disso, a seguinte mensagem de erro deve aparecer: -\end_layout - -\begin_layout Code - -# ping6 fe80::212:34ff:fe12:3456 -\end_layout - -\begin_layout Code - -connect: Invalid argument -\end_layout - -\begin_layout Standard -Neste caso, voce precisa especificar qual interface deve ser usada para - enviar o pacote, como mostrado abaixo: -\end_layout - -\begin_layout Code - -# ping6 -I eth0 -c 1 fe80::2e0:18ff:fe90:9205 -\end_layout - -\begin_layout Code - -PING fe80::212:23ff:fe12:3456(fe80::212:23ff:fe12:3456) from -\end_layout - -\begin_layout Code - -¬ fe80::212:34ff:fe12:3478 eth0: 56 data bytes -\end_layout - -\begin_layout Code - -64 bytes from fe80::212:23ff:fe12:3456: icmp_seq=0 hops=64 time=445 usec -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - ---- fe80::2e0:18ff:fe90:9205 ping statistics --- -\end_layout - -\begin_layout Code - -1 packets transmitted, 1 packets received, 0% packet loss round-trip -\end_layout - -\begin_layout Code - -¬ min/avg/max/mdev = 0.445/0.445/0.445/0.000 ms -\end_layout - -\begin_layout Subsubsection -Ping6 para endereços multicast -\end_layout - -\begin_layout Standard -Um mecanismo interessante para detectar hosts com endereço IPv6 é pingar - o endereço all-node multicast: -\end_layout - -\begin_layout Code - -# ping6 -I eth0 ff02::1 -\end_layout - -\begin_layout Code - -PING ff02::1(ff02::1) from fe80:::2ab:cdff:feef:0123 eth0: 56 data bytes -\end_layout - -\begin_layout Code - -64 bytes from ::1: icmp_seq=1 ttl=64 time=0.104 ms -\end_layout - -\begin_layout Code - -64 bytes from fe80::212:34ff:fe12:3450: icmp_seq=1 ttl=64 time=0.549 ms (DUP!) - -\end_layout - -\begin_layout Standard -Diferente do IPv4, onde as respostas ao ping para endereços de broadcast - podem ser desabilitadas, em IPv6 este comportamento não pode ser desabilitado, - exceto pela utilização de um firewall IPv6 local. -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "program-traceroute6" - -\end_inset - -Traceroute6 IPv6 -\end_layout - -\begin_layout Standard -Este programa geralmente está incluso no pacote iputils. - É um programa conhecido, similar ao do IPv4. - Veja o exemplo: -\end_layout - -\begin_layout Code - -# traceroute6 www.6bone.net -\end_layout - -\begin_layout Code - -traceroute to 6bone.net (3ffe:b00:c18:1::10) from 2001:0db8:0000:f101::2, - 30 -\end_layout - -\begin_layout Code - -¬ hops max, 16 byte packets -\end_layout - -\begin_layout Code - - 1 localipv6gateway (2001:0db8:0000:f101::1) 1.354 ms 1.566 ms 0.407 ms -\end_layout - -\begin_layout Code - - 2 swi6T1-T0.ipv6.switch.ch (3ffe:2000:0:400::1) 90.431 ms 91.956 ms 92.377 ms - -\end_layout - -\begin_layout Code - - 3 3ffe:2000:0:1::132 (3ffe:2000:0:1::132) 118.945 ms 107.982 ms 114.557 ms - -\end_layout - -\begin_layout Code - - 4 3ffe:c00:8023:2b::2 (3ffe:c00:8023:2b::2) 968.468 ms 993.392 ms 973.441 - ms -\end_layout - -\begin_layout Code - - 5 3ffe:2e00:e:c::3 (3ffe:2e00:e:c::3) 507.784 ms 505.549 ms 508.928 ms -\end_layout - -\begin_layout Code - - 6 www.6bone.net (3ffe:b00:c18:1::10) 1265.85 ms * 1304.74 ms -\end_layout - -\begin_layout Standard -Nota: diferente das versões mais atuais co traceroute do IPv4, que usa pacotes - ICMPv4 echo-request e pacotes UDP (default), o traceroute do IPv6 só é - capaz de enviar pacotes UDP. - Como voce já deve saber, pacotes ICMP echo-request são mais aceitos pelos - firewalls e listas de acesso (ACL) de routers do que pacotes UDP. -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "program-tracepath6" - -\end_inset - -Tracepath6 IPv6 -\end_layout - -\begin_layout Standard -Este programa costuma estar incluído no pacote iputils. - É um programa similar ao traceroute6 e ele traça o caminho para um endereço - dado, descobrindo o MTU ao longo deste caminho. - Veja o exemplo abaixo: -\end_layout - -\begin_layout Code - -# tracepath6 www.6bone.net -\end_layout - -\begin_layout Code - - 1?: [LOCALHOST] pmtu 1480 -\end_layout - -\begin_layout Code - - 1: 3ffe:401::2c0:33ff:fe02:14 150.705ms -\end_layout - -\begin_layout Code - - 2: 3ffe:b00:c18::5 267.864ms -\end_layout - -\begin_layout Code - - 3: 3ffe:b00:c18::5 asymm 2 266.145ms pmtu 1280 -\end_layout - -\begin_layout Code - - 3: 3ffe:3900:5::2 asymm 4 346.632ms -\end_layout - -\begin_layout Code - - 4: 3ffe:28ff:ffff:4::3 asymm 5 365.965ms -\end_layout - -\begin_layout Code - - 5: 3ffe:1cff:0:ee::2 asymm 4 534.704ms -\end_layout - -\begin_layout Code - - 6: 3ffe:3800::1:1 asymm 4 578.126ms !N -\end_layout - -\begin_layout Code - -Resume: pmtu 1280 -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "program-tcpdump" - -\end_inset - -Tcpdump IPv6 -\end_layout - -\begin_layout Standard -No Linux, o tcpdump é a maior ferramenta para a captura de pacotes. - Abaixo estão alguns exemplos. - O suporte ao IPv6 já está adicionado nas versões 3.6 ou superiores deste - programa. - -\end_layout - -\begin_layout Standard -O tcpdump usa diversas expressões e argumentos para realizar a filtragem - de pacotes para minimizar o volume de informações apresentado: -\end_layout - -\begin_layout Itemize -icmp6: filtra o tráfego ICMPv6 nativo -\end_layout - -\begin_layout Itemize -ip6: filtra o tráfego nativo IPv6 (incluindo ICMPv6) -\end_layout - -\begin_layout Itemize -proto ipv6: filtra o tráfego IPv6 tunelado em IPv4 (IPv6-in-IPv4) -\end_layout - -\begin_layout Itemize -not port ssh: para evitar mostrar os pacotes se voce estiver usando uma - conexão SSH -\end_layout - -\begin_layout Standard -Além disso, algumas opções são muito úteis para obter mais informações de - cada pacote, bem interessantes para pacotes ICMPv6: -\end_layout - -\begin_layout Itemize -"-s 512": aumenta o tamanho do pacote capturado para 512 bytes. - Se for usada a opção "-s 0" o pacote é capturado por inteiro -\end_layout - -\begin_layout Itemize -"-s 512": aumenta o tamanho do pacote capturado para 512 bytes. - Se for usada a opção "-s 0" o pacote é capturado por inteiro -\end_layout - -\begin_layout Itemize -"-n": não resolve os endereços para nomes, muito útil quando o DNS reverso - não está funcionando corretamente -\end_layout - -\begin_layout Subsubsection -Ping IPv6 para 2001:0db8:100:f101::1 nativo sobre um link local -\end_layout - -\begin_layout Code - -# tcpdump -t -n -i eth0 -s 512 -vv ip6 or proto ipv6 -\end_layout - -\begin_layout Code - -tcpdump: listening on eth0 -\end_layout - -\begin_layout Code - -2001:0db8:100:f101:2e0:18ff:fe90:9205 > 2001:0db8:100:f101::1: icmp6: echo -\end_layout - -\begin_layout Code - -¬ request (len 64, hlim 64) -\end_layout - -\begin_layout Code - -2001:0db8:100:f101::1 > 2001:0db8:100:f101:2e0:18ff:fe90:9205: icmp6: echo -\end_layout - -\begin_layout Code - -¬ reply (len 64, hlim 64) -\end_layout - -\begin_layout Subsubsection -Ping IPv6 para 2001:0db8:100::1 roteado através de um túnel IPv6-in-IPv4 -\end_layout - -\begin_layout Standard -Os endereços IPv4 1.2.3.4 e 5.6.7.8 são os tunnel endpoints (todos os endereços - são exemplos) -\end_layout - -\begin_layout Code - -# tcpdump -t -n -i ppp0 -s 512 -vv ip6 or proto ipv6 -\end_layout - -\begin_layout Code - -tcpdump: listening on ppp0 -\end_layout - -\begin_layout Code - -1.2.3.4 > 5.6.7.8: 2002:ffff:f5f8::1 > 2001:0db8:100::1: icmp6: echo request -\end_layout - -\begin_layout Code - -¬ (len 64, hlim 64) (DF) (ttl 64, id 0, len 124) -\end_layout - -\begin_layout Code - -5.6.7.8 > 1.2.3.4: 2001:0db8:100::1 > 2002:ffff:f5f8::1: icmp6: echo reply (len -\end_layout - -\begin_layout Code - -¬ 64, hlim 61) (ttl 23, id 29887, len 124) -\end_layout - -\begin_layout Code - -1.2.3.4 > 5.6.7.8: 2002:ffff:f5f8::1 > 2001:0db8:100::1: icmp6: echo request -\end_layout - -\begin_layout Code - -¬ (len 64, hlim 64) (DF) (ttl 64, id 0, len 124) -\end_layout - -\begin_layout Code - -5.6.7.8 > 1.2.3.4: 2001:0db8:100::1 > 2002:ffff:f5f8::1: icmp6: echo reply (len -\end_layout - -\begin_layout Code - -¬ 64, hlim 61) (ttl 23, id 29919, len 124) -\end_layout - -\begin_layout Section -Programas com suporte a IPv6 -\end_layout - -\begin_layout Standard -As distribuições Linux atuais já contém a maioria dos serviços Cliente e - Servidor em IPv6. - Veja aqui em -\begin_inset CommandInset href -LatexCommand href -name "IPv6+Linux-Status-Distribution" -target "http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status-distributions.html" - -\end_inset - -. - Se ainda não estiver incluído, voce pode verificar em -\begin_inset CommandInset href -LatexCommand href -name "IPv6 & Linux - Current Status - Applications" -target "http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status-apps.html" - -\end_inset - - se o programa já está portado para o IPv6 e pronto para o Linux. - Para os programas mais comuns existem dicas disponíveis em -\begin_inset CommandInset href -LatexCommand href -name "IPv6 & Linux - HowTo - Part 3" -target "http://www.bieringer.de/linux/IPv6/IPv6-HOWTO/IPv6-HOWTO-3.html" - -\end_inset - - e -\begin_inset CommandInset href -LatexCommand href -name "IPv6 & Linux - HowTo - Part 4" -target "http://www.bieringer.de/linux/IPv6/IPv6-HOWTO/IPv6-HOWTO-4.html" - -\end_inset - -. -\end_layout - -\begin_layout Section -Programas cliente com suporte a IPv6 -\end_layout - -\begin_layout Standard -Para executar os testes abaixo, é necessário que seu sistema seja um host - IPv6 e os exemplos mostrados podem ser feitos se voce tiver acesso ao 6bone. -\end_layout - -\begin_layout Subsection -Verificando a resolução DNS para endereços IPv6 -\end_layout - -\begin_layout Standard -Por causa dos updates de segurança aplicados nos últimos anos, o Servidor - DNS que roda a versão mais atual já tem a capacidade de entender os endereços - IPv6 tipo AAAA (o named A6 mais novo ainda não é usado porque só no BIND9 - o suporte aos root domais ARPA IP6 está em uso). - Um teste bem simples para ver o sistema resolver endereços IPv6 é: -\end_layout - -\begin_layout Code - -# host -t AAAA www.join.uni-muenster.de -\end_layout - -\begin_layout Standard -e a resposta deve ser alguma coisa parecida com isso: -\end_layout - -\begin_layout Code - -www.join.uni-muenster.de. - is an alias for tolot.join.uni-muenster.de. - -\end_layout - -\begin_layout Code - -tolot.join.uni-muenster.de. - has AAAA address -\end_layout - -\begin_layout Code - -¬ 2001:638:500:101:2e0:81ff:fe24:37c6 -\end_layout - -\begin_layout Subsection -Cliente de Telnet com suporte a IPv6 -\end_layout - -\begin_layout Standard -Cliente de telnet com suporte a IPv6 estão disponíveis. - Um teste simples pode ser feito com o comando: -\end_layout - -\begin_layout Code - -$ telnet 3ffe:400:100::1 80 -\end_layout - -\begin_layout Code - -Trying 3ffe:400:100::1... - -\end_layout - -\begin_layout Code - -Connected to 3ffe:400:100::1. - -\end_layout - -\begin_layout Code - -Escape character is '^]'. - -\end_layout - -\begin_layout Code - -HEAD / HTTP/1.0 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -HTTP/1.1 200 OK -\end_layout - -\begin_layout Code - -Date: Sun, 16 Dec 2001 16:07:21 -\end_layout - -\begin_layout Code - -GMT Server: Apache/2.0.28 (Unix) -\end_layout - -\begin_layout Code - -Last-Modified: Wed, 01 Aug 2001 21:34:42 GMT -\end_layout - -\begin_layout Code - -ETag: "3f02-a4d-b1b3e080" -\end_layout - -\begin_layout Code - -Accept-Ranges: bytes -\end_layout - -\begin_layout Code - -Content-Length: 2637 -\end_layout - -\begin_layout Code - -Connection: close -\end_layout - -\begin_layout Code - -Content-Type: text/html; charset=ISO-8859-1 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -Connection closed by foreign host. -\end_layout - -\begin_layout Standard -Se o cliente de telnet não entende o IPv6, a mensagem de erro será "cannot - resolve hostname". -\end_layout - -\begin_layout Subsection -SSH com suporte a IPv6 -\end_layout - -\begin_layout Subsubsection -openssh -\end_layout - -\begin_layout Standard -As versões atuais do openssh já suportam IPv6. - Dependendo da configuração utilizada, ele tem dois comportamentos: -\end_layout - -\begin_layout Itemize ---without-ipv4-default: o cliente tenta se conectar primeiro em IPv6, e - ele usa IPv4 se a conexão em IPv6 não for estabelecida -\end_layout - -\begin_layout Itemize ---with-ipv4-default: a conexão é feita primeiro em IPv4 e para usar algum - endereço IPv6, deve-se forçar a sua utilização. - Veja o exemplo -\end_layout - -\begin_layout Code - -$ ssh -6 ::1 -\end_layout - -\begin_layout Code - -user@::1's password: ****** -\end_layout - -\begin_layout Code - -[user@ipv6host user]$ -\end_layout - -\begin_layout Standard -Se seu cliente ssh não entende a opção "-6" então o suporte a IPv6 não está - habilitado, como muitos pacotes de ssh na versão 1. -\end_layout - -\begin_layout Subsubsection -ssh.com -\end_layout - -\begin_layout Standard -O software cliente e servidor SSH da SSH.com já suporta o IPv6 e agora ele - é grátis para todos os Linux e FreeBSD, independente se o seu uso é pessoal - ou comercial. -\end_layout - -\begin_layout Subsection -Browsers com suporte a IPv6 -\end_layout - -\begin_layout Standard -O status atual dos browsers com suporte a IPv6 pode ser encontrado aqui -\begin_inset CommandInset href -LatexCommand href -name "IPv6+Linux-status-apps.html#HTTP" -target "http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status-apps.html#HTTP" - -\end_inset - -. -\end_layout - -\begin_layout Standard -A maioria deles ainda tem problemas pendentes, tais como: -\end_layout - -\begin_layout Enumerate -Se a configuração de proxy usa somente endereços IPv4, os pedidos em IPv6 - também serão enviados a este proxy, emas como o proxy não saberá resolver - o endereço, o pedido não vai funcionar. - A única solução é verificar se o seu software de proxy tem alguma atualização - para resolver este problema. -\end_layout - -\begin_layout Enumerate -Configuração automática de proxy (*.pac) não pode ser utilizada para manipular - pedidos em IPv6 de maneira diferenciada (exemplo: não usar o proxy para - o IPv6) por causa da sua natureza (escritos em Javascript e muito encrustado - no código fonte, como é visto no Mozilla). -\end_layout - -\begin_layout Standard -As versões anteriores de browsers também não entenderiam uma URL com o endereço - IPv6, como no exemplo -\begin_inset CommandInset href -LatexCommand href -name "http://[2001:4dd0:f838:a006::6]/" -target "http://[2001:4dd0:f838:a006::6]/" - -\end_inset - - (isto funciona somente se a URL for usada em um browser que suporte IPv6). -\end_layout - -\begin_layout Standard -Um pequeno teste é tentar este endereço em um browser sem o proxy configurado. -\end_layout - -\begin_layout Subsubsection -URLs para teste -\end_layout - -\begin_layout Standard -Um bom ponto de partida para browsers que usam IPv6 é o site -\begin_inset CommandInset href -LatexCommand href -name "http://www.kame.net/" -target "http://www.kame.net/" - -\end_inset - -.Se a tartaruga da página estiver animada, a sua conexão é em IPv6. - caso contrário, a tartaruga ficará parada. -\end_layout - -\begin_layout Section -Programas servidores com suporte a IPv6 -\end_layout - -\begin_layout Standard -Nesta parte deste HowTo, outros softwares cliente IPv6 são mencionados, - assim como dicas para servidores com suporte a IPv6, como sshd, httpd, - telnetd, etc, assim como outras dicas em -\begin_inset CommandInset ref -LatexCommand ref -name "Hints for IPv6-enabled daemons" -reference "chapter-hints-daemons" - -\end_inset - -. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "faq-ipv6-ready-system-check" - -\end_inset - -FAQ (checagem de sistema com suporte a IPv6) -\end_layout - -\begin_layout Subsection -Usando ferramentas -\end_layout - -\begin_layout Subsubsection -Q: Não consigo pingar (ping6) o endereço link-local -\end_layout - -\begin_layout Standard -Mensagem de erro: "connect: Invalid argument" -\end_layout - -\begin_layout Standard -O kernel não conhece qual interface física ou virtual voce quer utilizar - para enviar o pacote ICMPv6. - Assim, a solução poderia aparecer assim. -\end_layout - -\begin_layout Standard -Solução:: Determine a interface, como: "ping6 -I eth0 fe80::2e0:18ff:fe90:9205", - veja também -\begin_inset CommandInset ref -LatexCommand ref -name "program ping6 usage" -reference "program-ping6" - -\end_inset - -. -\end_layout - -\begin_layout Subsubsection -Q: Não consigo pingar (ping6) ou efetuar traceroute (traceroute6) como usuário - normal -\end_layout - -\begin_layout Standard -Menagem de erro: "icmp socket: Operation not permitted" -\end_layout - -\begin_layout Standard -Estes utilitários criam pacotes especiais ICMPv6 e então os enviam. - Isto é feito usando conexões brutas no kernel. - Mas estas conexões somente podem ser usadas pelo usuário "root". - Desta forma, esta mensagem vai aparecer para os usuários normais. -\end_layout - -\begin_layout Standard -Solução: Se for realmente necessário que todos os usuários utilizem estas - ferramentas, voce pode adicionar o "suid" bit usando o comando "chmod u+s - /caminho/para/o/programa", e veja também este link -\begin_inset CommandInset ref -LatexCommand ref -name "program ping6 usage" -reference "program-ping6" - -\end_inset - -Se nem todos os usuários necessitam usá-lo, voce pode mudar o grupo do programa, - para "wheel" por exemplo, e todos os usuários pertencentes a este grupo - poderão executar estes programas sem problema. - Voce também pode configurar o "sudo" para isto também. -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-configuration-interface" - -\end_inset - -Configurando interfaces -\end_layout - -\begin_layout Section -Dispositivos de rede diferentes -\end_layout - -\begin_layout Standard -Em um nó, podem haver diferentes tipos de interfaces. - Elas podem estar agrupadas em classes -\end_layout - -\begin_layout Itemize -Físicas, como eth0, tr0 -\end_layout - -\begin_layout Itemize -Virtuais, como ppp0, tun0, tap0, sit0, isdn0, ippp0 -\end_layout - -\begin_layout Subsection -Físicas -\end_layout - -\begin_layout Standard -As interfaces físicas, como Ethernet ou Token Ring são exemplos de interfaces - comuns que não precisam de qualquer tipo de tratamento especial. -\end_layout - -\begin_layout Subsection -Virtuais -\end_layout - -\begin_layout Standard -As interfaces virtuais sempre precisam de algum tratamento especial -\end_layout - -\begin_layout Subsubsection -Interfaces Túnel IPv6-in-IPv4 -\end_layout - -\begin_layout Standard -Estas interfaces normalmente recebem o nome -\series bold -sit -\emph on -x -\series default -\emph default -. - O nome sit é uma atalho para -\series bold -S -\series default -imple -\series bold -I -\series default -nternet -\series bold -T -\series default -ransition. - Esta interface tem a capacidade de encapsular os pacotes IPv6 em pacotes - IPv4 e tunelar estes pacotes para um endpoint remoto. -\end_layout - -\begin_layout Standard -A interface -\series bold - sit0 -\series default - tem um papel especial e não pode ser usada para túneis dedicados. -\end_layout - -\begin_layout Subsubsection -Interfaces PPP -\end_layout - -\begin_layout Standard -As interfaces PPP obteem sua capacidade IPv6 do daemon PPP para IPv6. -\end_layout - -\begin_layout Subsubsection -Interfaces ISDN HDLC -\end_layout - -\begin_layout Standard -A capacidade IPv6 para HDLC com encapsulamento IP já está contida no kernel -\end_layout - -\begin_layout Subsubsection -Interfaces ISDN PPP -\end_layout - -\begin_layout Standard -A interface ISDN PPP (ippp) não tem o suporte ao IPv6 no kernel. - E também não há qualquer plano para suportar, porque o kernel da série - 2.5 ele será substituído por uma camada de interface PPP mais genérica. -\end_layout - -\begin_layout Subsubsection -SLIP + PLIP -\end_layout - -\begin_layout Standard -Como mencionado anteriormente neste documento, esta interface não suporta - o IPv6 (no envio até que funciona, mas a recepção não funciona). -\end_layout - -\begin_layout Subsubsection -Dispositivo Ether-tap -\end_layout - -\begin_layout Standard -Dispositivos Ether-tap já possuem o IPv6 habilitado e o stateless configurado. - Para usá-lo, o módulo "ethertap" deve ter sido carregado antes. -\end_layout - -\begin_layout Subsubsection -Dispositivos tun -\end_layout - -\begin_layout Standard -Atualmente não foi testado por mim -\end_layout - -\begin_layout Subsubsection -ATM -\end_layout - -\begin_layout Standard -01/2002: Não são mais suportados pelo kernel vanilla, mas somente pelas - extensões USAGI -\end_layout - -\begin_layout Subsubsection -Outras -\end_layout - -\begin_layout Standard -Eu esqueci de alguma ? -\end_layout - -\begin_layout Section -Colocando as interfaces em up e down -\end_layout - -\begin_layout Standard -Existem dois métodos usados para colocar as interfaces em up ou down.. -\end_layout - -\begin_layout Subsection -Usando "ip" -\end_layout - -\begin_layout Standard -Uso: -\end_layout - -\begin_layout Code - -# ip link set dev up -\end_layout - -\begin_layout Code - -# ip link set dev down -\end_layout - -\begin_layout Standard -Exemplo: -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# ip link set dev eth0 up -\end_layout - -\begin_layout Code - -# ip link set dev eth0 down -\end_layout - -\begin_layout Subsection -Usando "ifconfig" -\end_layout - -\begin_layout Standard -\align left -Uso: -\end_layout - -\begin_layout Code - -# /sbin/ifconfig up -\end_layout - -\begin_layout Code - -# /sbin/ifconfig down -\end_layout - -\begin_layout Standard -Exemplo: -\end_layout - -\begin_layout Code - -# /sbin/ifconfig eth0 up -\end_layout - -\begin_layout Code - -# /sbin/ifconfig eth0 down -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-configuration-address" - -\end_inset - -Configurando endereços IPv6 -\end_layout - -\begin_layout Standard -\align left -Existem várias maneiras de configurar um endereço IPv6 em uma interface. - As mais comuns são "ifconfig" e "ip". -\end_layout - -\begin_layout Section -Mostrando os endereços IPv6 existentes -\end_layout - -\begin_layout Standard -\align left -Antes de mais nada, voce precisa checar se já existe algum endereço IPv6 - configurado e qual é o seu tipo (talvez atribuído durante uma auto-configuração - stateless). -\end_layout - -\begin_layout Subsection -Usando "ip" -\end_layout - -\begin_layout Standard -Uso: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 addr show dev -\end_layout - -\begin_layout Standard -Exemplo para uma configuração de host estático: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 addr show dev eth0 -\end_layout - -\begin_layout Code - -2: eth0: -\end_layout - -\begin_layout Standard -Exemplo (a saída foi filtrada com o grep para mostrar somente os endereços - IPv6). - Aqui voce pode ver diferentes endereços IPv6 com diferentes escopos. -\end_layout - -\begin_layout Code - -# /sbin/ifconfig eth0 |grep "inet6 addr:" -\end_layout - -\begin_layout Code - -inet6 addr: fe80::210:a4ff:fee3:9566/10 Scope:Link -\end_layout - -\begin_layout Code - -inet6 addr: 2001:0db8:0:f101::1/64 Scope:Global -\end_layout - -\begin_layout Code - -inet6 addr: fec0:0:0:f101::1/64 Scope:Site -\end_layout - -\begin_layout Section -Adicionando um endereço IPv6 -\end_layout - -\begin_layout Standard -A adição de um endereço IPv6 é muito similar ao endereço "IP ALIAS" nas - interfaces IPv4 no Linux. -\end_layout - -\begin_layout Subsection -Usando "ip" -\end_layout - -\begin_layout Standard -Uso: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 addr add / dev -\end_layout - -\begin_layout Standard -Exemplo: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 addr add 2001:0db8:0:f101::1/64 dev eth0 -\end_layout - -\begin_layout Subsection -Usando "ifconfig" -\end_layout - -\begin_layout Standard -\align left -Uso: -\end_layout - -\begin_layout Code - -# /sbin/ifconfig inet6 add / -\end_layout - -\begin_layout Standard -Exemplo: -\end_layout - -\begin_layout Code - -# /sbin/ifconfig eth0 inet6 add 2001:0db8:0:f101::1/64 -\end_layout - -\begin_layout Section -Removendo um endereço IPv6 -\end_layout - -\begin_layout Standard -\align left -Como esta ação não é tão necessária, tenha cuidado ao remover endereços - IPv6 que não existem, pois ao realizar esta ação em kernels mais antigos, - voce pode causar um grande estrago no sistema. -\end_layout - -\begin_layout Subsection -Usando "ip" -\end_layout - -\begin_layout Standard -Uso: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 addr del / dev -\end_layout - -\begin_layout Standard -Exemplo: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 addr del 2001:0db8:0:f101::1/64 dev eth0 -\end_layout - -\begin_layout Subsection -Usando "ifconfig" -\end_layout - -\begin_layout Standard -\align left -Uso: -\end_layout - -\begin_layout Code - -# /sbin/ifconfig inet6 del / -\end_layout - -\begin_layout Standard -Exemplo: -\end_layout - -\begin_layout Code - -# /sbin/ifconfig eth0 inet6 del 2001:0db8:0:f101::1/64 -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-configuration-route" - -\end_inset - -Configurando rotas IPv6 -\end_layout - -\begin_layout Standard -\align left -Se voce quer deixar seu link e quer enviar pacotes a todo o mundo que está - só aguardando a sua conexão em IPv6, voce vai precisar de uma rota. - Se já houver um router com IPv6 habilitado (e uma rota para ele), estes - passos abaixo vão te ensinar como adicionar mais rotas em IPv6. -\end_layout - -\begin_layout Section -Mostrando as rotas IPv6 existentes -\end_layout - -\begin_layout Standard -\align left -Antes de mais nada, é interessante verificar quais são as rotas IPv6 já - configuradas (talvez atribuído durante uma auto-configuração). -\end_layout - -\begin_layout Subsection -Usando "ip" -\end_layout - -\begin_layout Standard -Uso: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route show [dev ] -\end_layout - -\begin_layout Standard -\align left -Exemplo: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route show dev eth0 -\end_layout - -\begin_layout Code - -2001:0db8:0:f101::/64 proto kernel metric 256 mtu 1500 advmss 1440 -\end_layout - -\begin_layout Code - -fe80::/10 proto kernel metric 256 mtu 1500 advmss 1440 -\end_layout - -\begin_layout Code - -ff00::/8 proto kernel metric 256 mtu 1500 advmss 1440 -\end_layout - -\begin_layout Code - -default proto kernel metric 256 mtu 1500 advmss 1440 -\end_layout - -\begin_layout Subsection -Usando "route" -\end_layout - -\begin_layout Standard -\align left -Uso: -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 -\end_layout - -\begin_layout Standard -\align left -Exemplo (a saída foi filtrada para a interface eth0). - Aqui voce pode ver rotas IPv6 para diferentes endereços em uma única interface. -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 |grep -w "eth0" -\end_layout - -\begin_layout Code - -2001:0db8:0:f101 ::/64 :: UA 256 0 0 eth0 <- Interface route for global -\end_layout - -\begin_layout Code - -¬ address -\end_layout - -\begin_layout Code - -fe80::/10 :: UA 256 0 0 eth0 <- Interface route for link-local -\end_layout - -\begin_layout Code - -¬ address -\end_layout - -\begin_layout Code - -ff00::/8 :: UA 256 0 0 eth0 <- Interface route for all multicast -\end_layout - -\begin_layout Code - -¬ addresses -\end_layout - -\begin_layout Code - -::/0 :: UDA 256 0 0 eth0 <- Automatic default route -\end_layout - -\begin_layout Section -Adicionando uma rota IPv6 através de um gateway -\end_layout - -\begin_layout Standard -\align left -Bastante necessário quando se quer acessar outras redes com IPv6 usando - um router IPv6-enabled em seu link. -\end_layout - -\begin_layout Subsection -Usando "ip" -\end_layout - -\begin_layout Standard -Uso: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route add / via -\end_layout - -\begin_layout Code - -¬ [dev ] -\end_layout - -\begin_layout Standard -Exemplo: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route add 2000::/3 via 2001:0db8:0:f101::1 -\end_layout - -\begin_layout Subsection -Usando "route" -\end_layout - -\begin_layout Standard -\align left -Uso: -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 add / gw -\end_layout - -\begin_layout Code - -¬ [dev ] -\end_layout - -\begin_layout Standard -\align left -Um dispositivo pode ser necessário se o dispositivo do endereço IPv6 do - gateway for um dispositivo link local. -\end_layout - -\begin_layout Standard -Veja o exemplo abaixo, como adicionar uma rota para todos os endereços globais - (2000::/3) através do gateway -\family typewriter -\lang afrikaans -2001:0db8:0:f101::1 -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 add 2000::/3 gw 2001:0db8:0:f101::1 -\end_layout - -\begin_layout Section -Removendo uma rota IPv6 através de um gateway -\end_layout - -\begin_layout Standard -\align left -Não é geralmente usada no modo manual, pois sugerimos a utilização de scripts - ou shutdown nas interfaces (todas ou por interface) -\end_layout - -\begin_layout Subsection -Usando "ip" -\end_layout - -\begin_layout Standard -\align left -Uso: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route del / via -\end_layout - -\begin_layout Code - -¬ [dev ] -\end_layout - -\begin_layout Standard -Exemplo: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route del 2000::/3 via 2001:0db8:0:f101::1 -\end_layout - -\begin_layout Subsection -Usando "route" -\end_layout - -\begin_layout Standard -\align left -Uso: -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 del / gw [dev -\end_layout - -\begin_layout Code - -¬ ] -\end_layout - -\begin_layout Standard -Exemplo para remover a rota adicionada anteriormente (acima): -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 del 2000::/3 gw 2001:0db8:0:f101::1 -\end_layout - -\begin_layout Section -Adicionando uma rota IPv6 através de uma interface -\end_layout - -\begin_layout Standard -\align left -Nem sempre usado, mas quando usado é em links ponto a ponto. -\end_layout - -\begin_layout Subsection -Usando "ip" -\end_layout - -\begin_layout Standard -\align left -Uso: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route add / dev -\end_layout - -\begin_layout Code - -¬ metric 1 -\end_layout - -\begin_layout Standard -Exemplo: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route add 2000::/3 dev eth0 metric 1 -\end_layout - -\begin_layout Standard -A métrica "1" é usada aqui para se manter compatível com as métricas usadas - pelo comando route, já que a métrica default ao se usar "ip" é "1024". -\end_layout - -\begin_layout Subsection -Usando "route" -\end_layout - -\begin_layout Standard -\align left -Uso: -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 add / dev -\end_layout - -\begin_layout Standard -Exemplo: -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 add 2000::/3 dev eth0 -\end_layout - -\begin_layout Section -Removendo uma rota IPv6 através de uma interface -\end_layout - -\begin_layout Standard -\align left -Nem sempre utilizado manualmente, pois recomenda-se a utilização de scripts. -\end_layout - -\begin_layout Subsection -Usando "ip" -\end_layout - -\begin_layout Standard -Uso: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route del / dev -\end_layout - -\begin_layout Standard -Exemplo: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route del 2000::/3 dev eth0 -\end_layout - -\begin_layout Subsection -Usando "route" -\end_layout - -\begin_layout Standard -\align left -Uso: -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 del / dev -\end_layout - -\begin_layout Standard -\align left -Exemplo: -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 del 2000::/3 dev eth0 -\end_layout - -\begin_layout Section -FAQ para rotas em IPv6 -\end_layout - -\begin_layout Subsection -Suporte de uma rota default IPv6 -\end_layout - -\begin_layout Standard -Uma boa idéia do IPv6 foi o roteamento hierárquico, o que proporcionaria - a necessidade de menos rotas nos roteadores. -\end_layout - -\begin_layout Standard -Aqui estão alguns problemas no kernel atual do Linux: -\end_layout - -\begin_layout Subsubsection -Clientes (não roteando qualquer pacote!) -\end_layout - -\begin_layout Standard -Um cliente pode configurar uma rota default prefixo "::/0", mas eles também - aprendem uma rota no processo de auto configuração, ex.: uso do radvd no - link abaixo mostra: -\end_layout - -\begin_layout Code - -# ip -6 route show | grep ^default -\end_layout - -\begin_layout Code - -default via fe80::212:34ff:fe12:3450 dev eth0 proto kernel metric 1024 expires -\end_layout - -\begin_layout Code - -¬ 29sec mtu 1500 advmss 1440 -\end_layout - -\begin_layout Subsubsection -Roteadores em caso de packet forwarding -\end_layout - -\begin_layout Standard -Os linux mais velhos (pelo menos inferiores ao kernel 2.4.17) não suportam - rotas default. - Voce pode configura-las, mas a pesquisa na tabela vai retornar uma falha - quando deveria ser encaminhado (intenção normal do roteador). - Se voce ainda está usando uma versão antiga de kernel, as "rotas default" - podem ser configuradas usando o prefixo de endereço global "2000::/3". -\end_layout - -\begin_layout Standard -Nota: tome cuidado com as rotas default sem filtragem de endereços em roteadores - de borda, pois o tráfego multicast ou site-local pode sair para o mundo. -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-Neighbor-Discovery" - -\end_inset - -Descoberta de vizinhos -\end_layout - -\begin_layout Standard -A descoberta de vizinhos funciona como um sucessor do ARP (Address Resolution - Protocol) em IPv4, no mundo IPv6. - Voce pode obter estas informações sobre os vizinhos atuais, e adicionalmente - voce pode configurar e excluir entradas. - O kernel mantém o rastreamento das descobertas bem sucedidas (como no ARP - em IPv4). - Voce pode pesquisar as entradas nesta tabela usando o comando "ip". -\end_layout - -\begin_layout Section -Mostrando os vizinhos usando "ip" -\end_layout - -\begin_layout Standard -Com o comando abaixo voce pode verificar a tabela de vizinhos aprendida - ou configurada -\end_layout - -\begin_layout Code - -# ip -6 neigh show [dev ] -\end_layout - -\begin_layout Standard -O exemplo a seguir mostra um vizinho, o qual é um router acessível -\end_layout - -\begin_layout Code - -# ip -6 neigh show -\end_layout - -\begin_layout Code - -fe80::201:23ff:fe45:6789 dev eth0 lladdr 00:01:23:45:67:89 router nud reachable -\end_layout - -\begin_layout Section -Manipulando a tabela de vizinhos usando "ip" -\end_layout - -\begin_layout Subsection -Adicionando uma entrada manualmente -\end_layout - -\begin_layout Standard -Com o comando abaixo, voce consegue adicionar uma entrada manualmente -\end_layout - -\begin_layout Code - -# ip -6 neigh add lladdr dev -\end_layout - -\begin_layout Standard -Exemplo: -\end_layout - -\begin_layout Code - -# ip -6 neigh add fec0::1 lladdr 02:01:02:03:04:05 dev eth0 -\end_layout - -\begin_layout Subsection -Excluindo uma entrada manualmente -\end_layout - -\begin_layout Standard -Similar à adição de uma entrada, uma entrada pode ser excluída -\end_layout - -\begin_layout Code - -# ip -6 neigh del lladdr dev -\end_layout - -\begin_layout Standard -Exemplo: -\end_layout - -\begin_layout Code - -# ip -6 neigh del fec0::1 lladdr 02:01:02:03:04:05 dev eth0 -\end_layout - -\begin_layout Subsection -Opções mais avançadas -\end_layout - -\begin_layout Standard -A ferramenta "ip" não é tão documentada, mas é bem útil e forte. - Veja o seu help online para mais informações: -\end_layout - -\begin_layout Code - -# ip -6 neigh help -\end_layout - -\begin_layout Code - -Usage: ip neigh { add | del | change | replace } { ADDR [ lladdr LLADDR - ] -\end_layout - -\begin_layout Code - - [ nud { permanent | noarp | stale | reachable } ] -\end_layout - -\begin_layout Code - - | proxy ADDR } [ dev DEV ] -\end_layout - -\begin_layout Code - - ip neigh {show|flush} [ to PREFIX ] [ dev DEV ] [ nud STATE ] -\end_layout - -\begin_layout Standard -Aparentemente algumas opções são somente para o IPv4... - e se voce quiser contribuir com mais informações sobre outras opções da - ferramenta e usos avançados, por favor, me envie. -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-configuring-ipv6-in-ipv4-tunnels" - -\end_inset - -Configurando um túnel IPv6-in-IPv4 -\end_layout - -\begin_layout Standard -\align left -Se voce quer deixar seu link e ter uma rede IPv6 à sua volta, voce vai precisar - de um túnel IPv6-in-IPv4 para acessar a web em modo IPv6. -\end_layout - -\begin_layout Standard -\align left -Existem alguns tipos de mecanismo e também algumas possibilidades da configuraçã -o deste túnel. -\end_layout - -\begin_layout Section -Tipos de túneis -\end_layout - -\begin_layout Standard -Existe mais de uma possibilidade de transportar pacotes IPvb6 em links IPv4. -\end_layout - -\begin_layout Subsection -Túnel estático ponto a ponto: 6bone -\end_layout - -\begin_layout Standard -\align left -Um túnel ponto a ponto é um túnel dedicado em direção a um ponto final., - o qual sabe informações sobre uma rede IPv6A (para rotas de volta) e os - endereços IPv4 deste túnel estão definidos na -\begin_inset CommandInset href -LatexCommand href -name "RFC 2893 / Transition Mechanisms for IPv6 Hosts and Routers" -target "http://www.faqs.org/rfcs/rfc2893.html" - -\end_inset - -. - Necessidades: -\end_layout - -\begin_layout Itemize -\align left -O endereço IPv4 local do túnel precisa ser estático, global, único e acessível - a partir da outra ponta -\end_layout - -\begin_layout Itemize -\align left -Um prefixo global IPv6 deve ser designado a voce (veja o registro 6bone) -\end_layout - -\begin_layout Itemize -\align left -Um ponto final remoto do túnel deve ser capaz de rotear seu prefixo IPv6para - seu ponto final local (uma configuração manual pode ser necessária) -\end_layout - -\begin_layout Subsection -Túnel automático -\end_layout - -\begin_layout Standard -Um túnel automático acontece quando um nó diretamente conectado a outro - nó obtém um IPv4 do outro nó anterior. -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "tunneling-6to4" - -\end_inset - -6to4-Tunneling -\end_layout - -\begin_layout Standard -O túnel 6to4 ( -\begin_inset CommandInset href -LatexCommand href -name "RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds" -target "http://www.faqs.org/rfcs/rfc3056.html" - -\end_inset - -) utiliza um mecanismo simples para criar túneis automáticos. - Cada nó com um endereço global único é capaz de ser uma ponta final de - um túnel 6to4 (se nenhum firewall no meio do caminho bloquear este tipo - de tráfego). - Túneis 6to4 não costumam ser túneis um a um. - Este tipo de túnel pode ser dividido em Upstream e Downstream. - Além disso, um endereço especial IPv6 indica que este nó vai usar o tunelamento - 6to4 para se conectar a redes IPv6 mundiais. -\end_layout - -\begin_layout Subsubsection -Geração de prefixo 6to4 -\end_layout - -\begin_layout Standard -O endereço 6to4 está definido abaixo (o esquema foi pego da -\begin_inset CommandInset href -LatexCommand href -name "RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds" -target "http://www.faqs.org/rfcs/rfc3056.html" - -\end_inset - -): -\end_layout - -\begin_layout Code - -| 3+13 | 32 | 16 | 64 bits | -\end_layout - -\begin_layout Code - -+---+------+-----------+--------+--------------------------------+ -\end_layout - -\begin_layout Code - -| FP+TLA | V4ADDR | SLA ID | Interface ID | -\end_layout - -\begin_layout Code - -| 0x2002 | | | | -\end_layout - -\begin_layout Code - -+---+------+-----------+--------+--------------------------------+ -\end_layout - -\begin_layout Standard -FP e TLA juntos (16 bits) tem o valor 0x2002. - V4ADDR é o endereço único IPv4 (em notação hexadecimal). - SLA é o identificador de rede (65536 redes locais possíveis) e são usados - para representar a sua estrutura de rede local. -\end_layout - -\begin_layout Standard -Para os gateways, tal prefixo é gerado normalmente usando o SLA -\begin_inset Quotes sld -\end_inset - -0000 -\begin_inset Quotes srd -\end_inset - - e o sufixo "::1" (não é uma exigencia, pode ser arbitrário com um escopo - local) e então assinalado a uma interface de túnel 6to4. - Veja que a Microsoft também utiliza V4ADDR para o sufixo. -\end_layout - -\begin_layout Subsubsection -Tunelamento Upstream 6to4 -\end_layout - -\begin_layout Standard -O nó tem que saber para qual ponta remota de túnel os pacotes IPv4 com pacotes - IPv6 devem ser encaminhados. - No início dos tempos de tunelamento 6to4, upstreams dedicados aceitavam - que os routers fizessem isso. - Veja -\begin_inset CommandInset href -LatexCommand href -name "NSayer's 6to4 information" -target "http://www.kfu.com/~nsayer/6to4/" - -\end_inset - - para uma lista de routers. -\end_layout - -\begin_layout Standard -Hoje em dia, os routers upstream 6to4 podem ser encontrados automaticamente, - usando o endereço de unicast 192.88.99.1. - Os protocolos de roteamento se incumbem desta função, veja -\begin_inset CommandInset href -LatexCommand href -name "RFC 3068 / An Anycast Prefix for 6to4 Relay Routers" -target "http://www.faqs.org/rfcs/rfc3068.html" - -\end_inset - - para mais detalhes. - -\end_layout - -\begin_layout Subsubsection -Tunelamento Downstream 6to4 -\end_layout - -\begin_layout Standard -O downstream (6bone -> seu nó com 6to4 habilitado) não é realmente correto - e pode variar de um host remoto estranho que originou os pacotes que foram - enviados a voce. - Existem duas possibilidades: -\end_layout - -\begin_layout Itemize -Estes hosts remotos usam endereços 6to4 e enviam os pacotes de volta diretamente - a seu nó (veja abaixo) -\end_layout - -\begin_layout Itemize -Estes hosts remotos enviam os pacotes de volta à rede IPv6 e dependendo - do roteamento, um router no meio do caminho cria um túnel automaticamente - em direção ao seu nó. -\end_layout - -\begin_layout Subsubsection -Tráfego 6to4 possível -\end_layout - -\begin_layout Itemize -6to4 para 6to4: normalmente é um túnel direto entre as duas pontas, ambos - habilitados em 6to4 -\end_layout - -\begin_layout Itemize -6to4 para não-6to4: é enviado via um túnel upstream -\end_layout - -\begin_layout Itemize -não-6to4 para 6to4: é enviado via um túnel downstream -\end_layout - -\begin_layout Section -Mostrando os túneis existentes -\end_layout - -\begin_layout Subsection -Usando "ip" -\end_layout - -\begin_layout Standard -Uso: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 tunnel show [] -\end_layout - -\begin_layout Standard -Exemplo: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 tunnel show -\end_layout - -\begin_layout Code - -sit0: ipv6/ip remote any local any ttl 64 nopmtudisc -\end_layout - -\begin_layout Code - -sit1: ipv6/ip remote 195.226.187.50 local any ttl 64 -\end_layout - -\begin_layout Subsection -Usando "route" -\end_layout - -\begin_layout Standard -Uso: -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 -\end_layout - -\begin_layout Standard -Exemplo (a saída está filtrada para mostrar somente os túneis através da - interface virtual sit0): -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 | grep " -\backslash -Wsit0 -\backslash -W*$" -\end_layout - -\begin_layout Code - -::/96 :: U 256 2 0 sit0 -\end_layout - -\begin_layout Code - -2002::/16 :: UA 256 0 0 sit0 -\end_layout - -\begin_layout Code - -2000::/3 ::193.113.58.75 UG 1 0 0 sit0 -\end_layout - -\begin_layout Code - -fe80::/10 :: UA 256 0 0 sit0 -\end_layout - -\begin_layout Code - -ff00::/8 :: UA 256 0 0 sit0 -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "conf-ipv6-in-ipv4-point-to-point-tunnels" - -\end_inset - -Configuração de um túnel ponto a ponto -\end_layout - -\begin_layout Standard -\align left -Existem possibilidades para adicionar ou remover um túnel ponto a ponto. -\end_layout - -\begin_layout Standard -Uma boa informação adicional sobre a configuração de túneis fornecida através - do comando -\begin_inset Quotes sld -\end_inset - -ip -\begin_inset Quotes srd -\end_inset - - está aqui -\begin_inset CommandInset href -LatexCommand href -name "Configuring tunnels with iproute2 (article)" -target "http://www.deepspace6.net/docs/iproute2tunnel-en.html" - -\end_inset - - ( -\begin_inset CommandInset href -LatexCommand href -name "Mirror" -target "http://mirrors.bieringer.de/www.deepspace6.net/docs/iproute2tunnel-en.html" - -\end_inset - -). -\end_layout - -\begin_layout Subsection -Adicionando túneis ponto a ponto -\end_layout - -\begin_layout Subsubsection -Usando "ip" -\end_layout - -\begin_layout Standard -\align left -Um método comum para a criação de uma quantidade pequena de túneis. -\end_layout - -\begin_layout Standard -Use-o para criar um dispositivo túnel (mas não depois, o TTL também deve - ser especificado, porque seu valor default é 0). -\end_layout - -\begin_layout Code - -# /sbin/ip tunnel add mode sit ttl remote -\end_layout - -\begin_layout Code - -¬ local -\end_layout - -\begin_layout Standard -Uso (exemplo genérico para 3 túneis): -\end_layout - -\begin_layout Code - -# /sbin/ip tunnel add sit1 mode sit ttl remote -\end_layout - -\begin_layout Code - -¬ local -\end_layout - -\begin_layout Code - -# /sbin/ip link set dev sit1 up -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route add dev sit1 metric 1 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/ip tunnel add sit2 mode sit ttl -\end_layout - -\begin_layout Code - -¬ local -\end_layout - -\begin_layout Code - -# /sbin/ip link set dev sit2 up -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route add dev sit2 metric 1 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/ip tunnel add sit3 mode sit ttl -\end_layout - -\begin_layout Code - -¬ local -\end_layout - -\begin_layout Code - -# /sbin/ip link set dev sit3 up -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route add dev sit3 metric 1 -\end_layout - -\begin_layout Subsubsection -Usando "ifconfig" e "route" (obsoleto) -\end_layout - -\begin_layout Standard -\align left -Esta não é uma maneira muito recomendada de se criar um túnel porque ele - é um pouco estranho. - Não há qualquer problema se voce adicionar somente um, mas se voce for - configurar mais de um, voce não poderá desfazer os primeiros túneis criados - e deixar os últimos em funcionamento. -\end_layout - -\begin_layout Standard -Uso (exemplo genérico para 3 túneis): -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit0 up -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit0 tunnel -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit1 up -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 add dev sit1 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit0 tunnel -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit2 up -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 add dev sit2 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit0 tunnel -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit3 up -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 add dev sit3 -\end_layout - -\begin_layout Standard -Importante: NÃO USE ISSO, porque esta configuração habilita implicitamente - um -\begin_inset Quotes sld -\end_inset - -tunelamento automático -\begin_inset Quotes srd -\end_inset - - de qualquer lugar na internet, e isto é um risco, então não o utilize. -\end_layout - -\begin_layout Subsubsection -Usando somente "route" -\end_layout - -\begin_layout Standard -\align left -Também é possível configurar túneis no modo Non Broadcast Multiple Access - (NBMA), pois é uma maneira fácil de adicionar muitos túneis de uma vez. - Mas nenhum dos túneis pode ser numerado (o que não é uma característica). -\end_layout - -\begin_layout Standard -Uso (exemplo genérico para 3 túneis): -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit0 up -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 add gw -\end_layout - -\begin_layout Code - -¬ :: dev sit0 -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 add gw -\end_layout - -\begin_layout Code - -¬ :: dev sit0 -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 add gw -\end_layout - -\begin_layout Code - -¬ :: dev sit0 -\end_layout - -\begin_layout Standard -Importante: NÃO USE ISSO, porque esta configuração habilita implicitamente - um -\begin_inset Quotes sld -\end_inset - -tunelamento automático -\begin_inset Quotes srd -\end_inset - - de qualquer lugar na internet, e isto é um risco, então não o utilize. -\end_layout - -\begin_layout Subsection -Removendo os túneis ponto a ponto -\end_layout - -\begin_layout Standard -\align left -Nem sempre é necessário fazer isso manualmente, mas pode ser usado em scripts - para uma limpeza ou restart de uma configuração IPv6. -\end_layout - -\begin_layout Subsubsection -Usando "ip" -\end_layout - -\begin_layout Standard -Uso para remover um dispositivo túnel: -\end_layout - -\begin_layout Code - -# /sbin/ip tunnel del -\end_layout - -\begin_layout Standard -Uso (exemplo genérico para 3 túneis): -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route del dev sit1 -\end_layout - -\begin_layout Code - -# /sbin/ip link set sit1 down -\end_layout - -\begin_layout Code - -# /sbin/ip tunnel del sit1 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route del dev sit2 -\end_layout - -\begin_layout Code - -# /sbin/ip link set sit2 down -\end_layout - -\begin_layout Code - -# /sbin/ip tunnel del sit2 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route del dev sit3 -\end_layout - -\begin_layout Code - -# /sbin/ip link set sit3 down -\end_layout - -\begin_layout Code - -# /sbin/ip tunnel del sit3 -\end_layout - -\begin_layout Subsubsection -Usando "ifconfig" e "route" (não é mais usado por ser estranho) -\end_layout - -\begin_layout Standard -\align left -Não somente a criação é estranha, como também o shutdown... - voce tem que remover os tuneis na ordem inversa em que eles foram criados. -\end_layout - -\begin_layout Standard -Uso (exemplo genérico para 3 túneis): -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 del dev sit3 -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit3 down -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 del dev sit2 -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit2 down -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 add dev sit1 -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit1 down -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit0 down -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Subsubsection -Usando "route" -\end_layout - -\begin_layout Standard -Isto é como remover rotas normais em IPv6. -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_layout Standard -\align left -Uso (exemplo genérico para 3 túneis): -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 del gw -\end_layout - -\begin_layout Code - -¬ :: dev sit0 -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 del gw -\end_layout - -\begin_layout Code - -¬ :: dev sit0 -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 del gw -\end_layout - -\begin_layout Code - -¬ :: dev sit0 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit0 down -\end_layout - -\begin_layout Subsection -Tuneis ponto a ponto numerados -\end_layout - -\begin_layout Standard -Às vezes é necessário configurar túneis ponto a ponto com endereços IPv6 - como em IPv4. - Isto somente é possível utilizando o primeiro (ifconfig+route - obsoleto) - e o terceiro (ip+route) modo de configuração. - Em tais casos, voce pode adicionar os endereços IPv6 na interface de túnel - conforme é mostrado na configuração de uma interface. - -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "configuring-ipv6to4-tunnels" - -\end_inset - -Configuração de túneis 6to4 -\end_layout - -\begin_layout Standard -Preste atenção pois o suporte aos túneis 6to4 atualmente não está implementado - completamente no kernel vanilla da série 2.2.x (veja -\begin_inset CommandInset ref -LatexCommand ref -name "systemcheck/kernel" -reference "systemcheck-kernel" - -\end_inset - - para mais detalhes). - Veja também que o tamanho do prefixo para um endereço 6to4 é 16, uma vez - que do ponto de vista da rede, todos os outros hosts habilitados para 6to4 - estão na mesma camada 2. -\end_layout - -\begin_layout Subsection -Adição de um túnel 6to4 -\end_layout - -\begin_layout Standard -Antes de tudo, voce precisa calcular o seu prefixo 6to4 usando o seu endereço - público IPv4 (se seu host não tem este endereço, é possível utilizar um - NAT no router de borda em alguns casos especiais): -\end_layout - -\begin_layout Standard -Assumindo que o seu endereço IPv4 seja este -\end_layout - -\begin_layout Code - -1.2.3.4 -\end_layout - -\begin_layout Standard -o prefixo 6to4 gerado será este -\end_layout - -\begin_layout Code - -2002:0102:0304:: -\end_layout - -\begin_layout Standard -Gateways locais 6to4 deveriam (mas não é uma regra fixa, pois voce pode - escolher um sufixo arbitrário, se voce preferir) sempre assinalar o sufixo - "::1", desta forma seu endereço local 6to4 será este -\end_layout - -\begin_layout Code - -2002:0102:0304::1 -\end_layout - -\begin_layout Standard -Por exemplo, use a seguinte automação: -\end_layout - -\begin_layout Code - -ipv4="1.2.3.4"; printf "2002:%02x%02x:%02x%02x::1" `echo $ipv4 | tr "." " "` -\end_layout - -\begin_layout Standard -Atualmente existem duas maneiras possíveis de configurar um túnel 6to4. -\end_layout - -\begin_layout Subsubsection -Usando "ip" e um dispositivo de túnel dedicado -\end_layout - -\begin_layout Standard -Esta é a maneira recomendada (um TTL deve ser especificado, pois o valor - default é 0). -\end_layout - -\begin_layout Standard -Criando um dispositivo de túnel -\end_layout - -\begin_layout Code - -# /sbin/ip tunnel add tun6to4 mode sit ttl remote any local -\end_layout - -\begin_layout Code - -¬ -\end_layout - -\begin_layout Standard -Ativando a interface -\end_layout - -\begin_layout Code - -# /sbin/ip link set dev tun6to4 up -\end_layout - -\begin_layout Standard -Adicionando o endereço local 6to4 na interface (nota: o tamanho do prefixo - - /16 - é importante!) -\end_layout - -\begin_layout Code - -# /sbin/ip -6 addr add /16 dev tun6to4 -\end_layout - -\begin_layout Standard -Adicionando uma rota default para a rede global IPv6 usando o endereço anycast - IPv4 todos-6to4-router -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route add 2000::/3 via ::192.88.99.1 dev tun6to4 metric 1 -\end_layout - -\begin_layout Standard -É sabido que algumas versões do comando "ip" (exemplo SuSE Linux 9.0) não - suportam endereços IPv6 no formato compatível IPv4 para seus gateways, - e neste caso o endereço IPv6 relativo a ele deve ser usado: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route add 2000::/3 via 2002:c058:6301::1 dev tun6to4 metric - 1 -\end_layout - -\begin_layout Subsubsection -Usando "ifconfig" e "route" e um dispositivo de túnel genérico "sit0" (obsoleto) -\end_layout - -\begin_layout Standard -Este método está obsoleto porque o uso de um túnel genérico sit0 não permite - especificar filtros pelo dispositivo. -\end_layout - -\begin_layout Standard -Ativando a interface genérica sit0 -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit0 up -\end_layout - -\begin_layout Standard -Adicionando um endereço 6to4 na interface -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit0 add /16 -\end_layout - -\begin_layout Standard -Adicionando uma rota default para a rede global IPv6 usando o endereço anycast - IPv4 todos-6to4-router -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 add 2000::/3 gw ::192.88.99.1 dev sit0 -\end_layout - -\begin_layout Subsection -Removendo um túnel 6to4 -\end_layout - -\begin_layout Subsubsection -Usando "ip" e um dispositivo de túnel dedicado -\end_layout - -\begin_layout Standard -Remova todas as rotas que utilizam este dispositivo -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route flush dev tun6to4 -\end_layout - -\begin_layout Standard -Desligue a interface -\end_layout - -\begin_layout Code - -# /sbin/ip link set dev tun6to4 down -\end_layout - -\begin_layout Standard -Remova o dispositivo criado -\end_layout - -\begin_layout Code - -# /sbin/ip tunnel del tun6to4 -\end_layout - -\begin_layout Subsubsection -Usando "ifconfig" e "route" e o dispositivo genérico de túnel "sit0" (obsoleto) -\end_layout - -\begin_layout Standard -Remova as rotas default que usam esta interface -\end_layout - -\begin_layout Code - -# /sbin/route -A inet6 del 2000::/3 gw ::192.88.99.1 dev sit0 -\end_layout - -\begin_layout Standard -Remova o endereço local 6to4 desta interface -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit0 del /16 -\end_layout - -\begin_layout Standard -Desligue o dispositivo genérico de túnel (cuidado com isto, pois ela ainda - pode estar em uso...) -\end_layout - -\begin_layout Code - -# /sbin/ifconfig sit0 down -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-configuring-ipv4-in-ipv6-tunnels" - -\end_inset - -Configurando túneis IPv4-in-IPv6 -\end_layout - -\begin_layout Standard -A -\begin_inset CommandInset href -LatexCommand href -name "RFC 2473 / Generic Packet Tunneling in IPv6 Specification" -target "http://www.faqs.org/rfcs/rfc2473.html" - -\end_inset - - especifica o mecanismo para tunelar diferentes tipos de pacotes em IPv6 - incluindo IPv4. -\end_layout - -\begin_layout Standard -NOTAE: O suporte para túneis IPv4-in-IPv6 está disponível somente a partir - da versão de kernel 2.6.22. -\end_layout - -\begin_layout Section -Mostrando os túneis existentes -\end_layout - -\begin_layout Standard -Uso: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 tunnel show [] -\end_layout - -\begin_layout Standard -Exemplo: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 tunnel show mode any -\end_layout - -\begin_layout Code - -ip6tnl0: ipv6/ipv6 remote :: local :: encaplimit 0 hoplimit 0 tclass 0x00 -\end_layout - -\begin_layout Code - -¬ flowlabel 0x00000 (flowinfo 0x00000000) -\end_layout - -\begin_layout Code - -ip6tnl1: ip/ipv6 remote fd00:0:0:2::a local fd00:0:0:2::1 dev eth1 encaplimit - 4 -\end_layout - -\begin_layout Code - -¬ hoplimit 64 tclass 0x00 flowlabel 0x00000 (flowinfo 0x00000000) -\end_layout - -\begin_layout Standard -NOTA: Se voce não incluir "mode any", somente os túneis IPv6-in-IPv6 serão - mostrados. -\end_layout - -\begin_layout Section -Configuração de túnel ponto a ponto -\end_layout - -\begin_layout Standard -Uso para criar um dispositivo de túnel 4over6 -\end_layout - -\begin_layout Code - -# /sbin/ip tunnel add mode ip4ip6 remote -\end_layout - -\begin_layout Code - -¬ local -\end_layout - -\begin_layout Standard -Uso (exemplo genérico para 3 túneis): -\end_layout - -\begin_layout Code - -# /sbin/ip -6 tunnel add ip6tnl1 mode ip4ip6 remote -\end_layout - -\begin_layout Code - -¬ local -\end_layout - -\begin_layout Code - -# /sbin/ip link set dev ip6tnl1 up -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route add dev ip6tnl1 metric 1 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/ip -6 tunnel add ip6tnl2 mode ip4ip6 remote -\end_layout - -\begin_layout Code - -¬ local -\end_layout - -\begin_layout Code - -# /sbin/ip link set dev ip6tnl2 up -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route add dev ip6tnl2 metric 1 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/ip -6 tunnel add ip6tnl3 mode ip4ip6 remote -\end_layout - -\begin_layout Code - -¬ local -\end_layout - -\begin_layout Code - -# /sbin/ip link set dev ip6tnl3 up -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route add dev ip6tnl3 metric 1 -\end_layout - -\begin_layout Section -Removendo túneis ponto a ponto -\end_layout - -\begin_layout Standard -Uso ara remover um dispositivo de túnel: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 tunnel del -\end_layout - -\begin_layout Standard -Uso (exemplo genérico para 3 túneis): -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route del dev ip6tnl1 -\end_layout - -\begin_layout Code - -# /sbin/ip link set ip6tnl1 down -\end_layout - -\begin_layout Code - -# /sbin/ip -6 tunnel del ip6tnl1 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route del dev ip6tnl2 -\end_layout - -\begin_layout Code - -# /sbin/ip link set ip6tnl2 down -\end_layout - -\begin_layout Code - -# /sbin/ip -6 tunnel del ip6tnl2 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route del dev ip6tnl3 -\end_layout - -\begin_layout Code - -# /sbin/ip link set ip6tnl3 down -\end_layout - -\begin_layout Code - -# /sbin/ip -6 tunnel del ip6tnl3 -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-kernel-settings" - -\end_inset - -Configuraçoes de Kernel nos arquivos do /proc -\end_layout - -\begin_layout Standard -\begin_inset CommandInset label -LatexCommand label -name "proc-filesystem" - -\end_inset - -Nota: a fonte desta seção é em sua maioria o arquivo "ip-sysctl.txt", o qual - está incluído no diretório "Documentation/networking" do código fonte do - kernel usado. - Crédito para Pekka Savola pela manutençao da parte IPv6 neste arquivo. - Além disso, muito do que está escrito abaixo é um Copy & Paste deste arquivo - mencionado. -\end_layout - -\begin_layout Section -Como acessar os arquivos do /proc -\end_layout - -\begin_layout Subsection -Usando "cat" e "echo" -\end_layout - -\begin_layout Standard -Usar os comandos "cat" e "echo" é a maneira mais simples de acessar os arquivos - deste diretório, mas alguns pontos devem ser observados: -\end_layout - -\begin_layout Itemize -O sistema de arquivos /proc deve estar habilitado no kernel , ou seja, a - seguinte chave deve estar configurada -\end_layout - -\begin_layout Code - -CONFIG_PROC_FS=y -\end_layout - -\begin_layout Itemize -O sistema de arquivos já deve estar montado, o que pode ser testado como - comando -\end_layout - -\begin_layout Code - -# mount | grep "type proc" -\end_layout - -\begin_layout Code - -none on /proc type proc (rw) -\end_layout - -\begin_layout Itemize -Voce pode ler e também escrever (geralmente como root) nos arquivos contidos - aqui (/proc) -\end_layout - -\begin_layout Standard -Normalmente, somente as entradas localizadas em /proc/sys/* podem ser alteradas, - as demais são somentepara leitura e para obtenção de informações. -\end_layout - -\begin_layout Subsubsection -Obtendo um valor -\end_layout - -\begin_layout Standard -O valor de uma entrada pode ser obtido com o comando "cat": -\end_layout - -\begin_layout Code - -# cat /proc/sys/net/ipv6/conf/all/forwarding -\end_layout - -\begin_layout Code - -0 -\end_layout - -\begin_layout Subsubsection -Definindo um valor -\end_layout - -\begin_layout Standard -Um novo valor pode ser definido (se a entrada aceitar a escrita) através - do comando "echo": -\end_layout - -\begin_layout Code - -# echo "1" >/proc/sys/net/ipv6/conf/all/forwarding -\end_layout - -\begin_layout Subsection -Usando "sysctl" -\end_layout - -\begin_layout Standard -O uso do programa "syysctl" para acessar as chaves do kernel é uma maneira - moderna utilizada hoje em dia. - Voce também pode usar se o sistema de arquivos /proc não estiver montado. - Mas voce só terá acesso às entradas /proc/sys/*! -\end_layout - -\begin_layout Standard -O programa "sysctl" está incluído no pacote "procps" (em sistemas Red Hat - Linux). -\end_layout - -\begin_layout Itemize -A interface do sysctl deve estar habilitada no kernel, então a seguinte - chave deve estar habilitada -\end_layout - -\begin_layout Code - -CONFIG_SYSCTL=y -\end_layout - -\begin_layout Subsubsection -Obtendo um valor -\end_layout - -\begin_layout Standard -O valor de uma entrada pode ser obtida da seguinte maneira: -\end_layout - -\begin_layout Code - -# sysctl net.ipv6.conf.all.forwarding -\end_layout - -\begin_layout Code - -net.ipv6.conf.all.forwarding = 0 -\end_layout - -\begin_layout Subsubsection -Definindo um valor -\end_layout - -\begin_layout Standard -Um novo valor pode ser definido (se a entrada aceitar a escrita): -\end_layout - -\begin_layout Code - -# sysctl -w net.ipv6.conf.all.forwarding=1 -\end_layout - -\begin_layout Code - -net.ipv6.conf.all.forwarding = 1 -\end_layout - -\begin_layout Standard -Nota: Não use espaços entre o sinal = para definir os valores. - Se forem possíveis diversos valores, coloque-os entre aspas -\end_layout - -\begin_layout Code - -# sysctl -w net.ipv4.ip_local_port_range="32768 61000" -\end_layout - -\begin_layout Code - -net.ipv4.ip_local_port_range = 32768 61000 -\end_layout - -\begin_layout Subsubsection -Adicionais -\end_layout - -\begin_layout Standard -Nota: Existem versões em campo que mostram "/" ao invés de "." -\end_layout - -\begin_layout Standard -Para mais detalhes, de uma olhada na manpage do sysctl. -\end_layout - -\begin_layout Standard -Dica: para achar mais rapidamente as definiçoes, use a opçao "-a" (mostra - todas as entradas) junto com o comando "grep". -\end_layout - -\begin_layout Subsection -Valores encontrados nas entradas /proc -\end_layout - -\begin_layout Standard -Existem vários formatos vistos no sistema de arquivos /proc: -\end_layout - -\begin_layout Itemize -BOOLEANO: simplesmente um "0" (falso) ou um "1" (verdadeiro) -\end_layout - -\begin_layout Itemize -INTEIRO: um valor inteiro, também pode ser sem sinal -\end_layout - -\begin_layout Itemize -linhas mais sofisticadas com muitos valores: às vezes uma linha de cabeçalho - também é mostrada, senão, uma olhada no código fonte do kernel pode ser - necessário para entender o significado dos valores apresentados... -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "proc-sys-net-ipv6" - -\end_inset - -Entradas em /proc/sys/net/ipv6/ -\end_layout - -\begin_layout Subsection -conf/default/* -\end_layout - -\begin_layout Standard -Muda as configurações específicas da interface. -\end_layout - -\begin_layout Subsection -conf/all/* -\end_layout - -\begin_layout Standard -Muda todas as configurações esoecíficas da interface. -\end_layout - -\begin_layout Standard -Exceção: "conf/all/forwarding" tem um significado diferente aqui -\end_layout - -\begin_layout Subsubsection -conf/all/forwarding -\end_layout - -\begin_layout Itemize -Tipo: BOOLEANO -\end_layout - -\begin_layout Standard -Isto habilita o encaminhamento de pacotes IPv6 entre todas as interfaces. -\end_layout - -\begin_layout Standard -Em IPv6 voce não pode controlar o envio de pacotes por dispositivo. - este encaminhamento deve ser feito através de regras do IPv6-netfilter - (controlado com ip6tables) e especificando os dispositivos de entrada e - saída (veja -\begin_inset CommandInset ref -LatexCommand ref -name "Firewalling/Netfilter6" -reference "firewalling-netfilter6" - -\end_inset - - para mais detalhes). - Isto é diferente no IPv4, onde é possível controlar o encaminhamento por - dispositivo (a decisão é feita na interface onde o pacote entra). -\end_layout - -\begin_layout Standard -Isto também define todas as interfaces do host e/ou router para o valor - especificado. - Veja os detalhes abaixo. - Esta definição refere-se ao encaminhamento global. -\end_layout - -\begin_layout Standard -Se este valor é 0, nenhum pacote IPv6 é encaminhado, os pacotes nunca deixarão - outra interface, seja ela física ou lógica, como os túneis. -\end_layout - -\begin_layout Subsection -conf/interface/* -\end_layout - -\begin_layout Standard -Muda configurações especiais por interface. -\end_layout - -\begin_layout Standard -O comportamento funcional de certos ajustes é diferente, dependendo se o - encaminhamento local está habilitado ou não. -\end_layout - -\begin_layout Subsubsection -accept_ra -\end_layout - -\begin_layout Itemize -Tipo: BOOLEAN -\end_layout - -\begin_layout Itemize -Ajuste default: habilitado se o encaminhamento local está desabilitado, - e desabilitado se o encaminhamento local está habilitado. -\end_layout - -\begin_layout Standard -Aceita Router Advertisements, e configura automaticamente esta interface - com os dados recebidos. -\end_layout - -\begin_layout Subsubsection -accept_redirects -\end_layout - -\begin_layout Itemize -Tipi: BOOLEAN -\end_layout - -\begin_layout Itemize -Ajuste default: habilitado se o encaminhamento local está desabilitado, - e desabilitado se o encaminhamento local está habilitado. -\end_layout - -\begin_layout Standard -Aceita os Redirects enviados por um router IPv6. -\end_layout - -\begin_layout Subsubsection -autoconf -\end_layout - -\begin_layout Itemize -Tipo: BOOLEAN -\end_layout - -\begin_layout Itemize -Ajuste default: habilitado se o accept_ra_pinfo está babilitado, e desabilitado - se o accept_ra_pinfo estiver desabilitado. -\end_layout - -\begin_layout Standard -Os endereços e prefixos usados na configuração automática proveem de anúncios - dos routers. -\end_layout - -\begin_layout Subsubsection -dad_transmits -\end_layout - -\begin_layout Itemize -Tipo: INTEGER -\end_layout - -\begin_layout Itemize -Default: 1 -\end_layout - -\begin_layout Standard -Quantidade de probes de detecção de endereços duplicados enviados. -\end_layout - -\begin_layout Subsubsection -forwarding -\end_layout - -\begin_layout Itemize -Tipo: BOOLEAN -\end_layout - -\begin_layout Itemize -Default: FALSE se o encaminhamento global estiver desabilitado (default), - caso contrário TRUE -\end_layout - -\begin_layout Standard -Comportamento Host/Router específico. -\end_layout - -\begin_layout Standard -Nota: É recomendado ter a mesma configuração em todas as interfaces; cenários - diferentes são bem incomuns. -\end_layout - -\begin_layout Itemize -Valor FALSE: Por default, o comportamento do Host é assumido. - Isto significa: -\end_layout - -\begin_layout Enumerate -O flag IsRouter não está definido em aúncios de vizinhança. -\end_layout - -\begin_layout Enumerate -Solicitaçoes Router são enviados quando necessário. -\end_layout - -\begin_layout Enumerate -Se accept_ra é TRUE (default), aceita anúncios router (e fazem auti configuração -). -\end_layout - -\begin_layout Enumerate -Se accept_redirects é TRUE (default), aceita Redirects. -\end_layout - -\begin_layout Itemize -Valor TRUE: se o encaminhamento local está habilitado, o comportamento Router - é assumido. - Isto significa que o contrário da lista acima pode acontecer: -\end_layout - -\begin_layout Enumerate -O flag IsRouter é definido nos anúncios de vizinhança. -\end_layout - -\begin_layout Enumerate -Solicitaçoes Router não são enviadas. -\end_layout - -\begin_layout Enumerate -Anúncios Router são ignorados. -\end_layout - -\begin_layout Enumerate -Redirects são ignorados. -\end_layout - -\begin_layout Subsubsection -hop_limit -\end_layout - -\begin_layout Itemize -Tipo: INTEGER -\end_layout - -\begin_layout Itemize -Default: 64 -\end_layout - -\begin_layout Standard -Hop Limit default para definir. -\end_layout - -\begin_layout Subsubsection -mtu -\end_layout - -\begin_layout Itemize -Tipo: INTEGER -\end_layout - -\begin_layout Itemize -Default: 1280 (mínimo necessário no IPv6) -\end_layout - -\begin_layout Standard -Default Maximum Transfer Unit -\end_layout - -\begin_layout Subsubsection -router_solicitation_delay -\end_layout - -\begin_layout Itemize -Tipo: INTEGER -\end_layout - -\begin_layout Itemize -Default: 1 -\end_layout - -\begin_layout Standard -Número de segundos a esperar após a interface ser ativada antes de enviar - solicitaçoes Router. -\end_layout - -\begin_layout Subsubsection -router_solicitation_interval -\end_layout - -\begin_layout Itemize -Tipo: INTEGER -\end_layout - -\begin_layout Itemize -Default: 4 -\end_layout - -\begin_layout Standard -Número de segundos a esperar entre solicitaçoes Router. - -\end_layout - -\begin_layout Subsubsection -router_solicitations -\end_layout - -\begin_layout Itemize -Tipo: INTEGER -\end_layout - -\begin_layout Itemize -Default: 3 -\end_layout - -\begin_layout Standard -Número de solicitaçoes Router a enviar até assumir que não há um router - presente. -\end_layout - -\begin_layout Subsection -neigh/default/* -\end_layout - -\begin_layout Standard -Muda as definiçoes default para detecçao de vizinhos e alguns valores globais - e de limites: -\end_layout - -\begin_layout Subsubsection -gc_thresh1 -\end_layout - -\begin_layout Itemize -Tipo: INTEGER -\end_layout - -\begin_layout Itemize -Default: 128 -\end_layout - -\begin_layout Standard -Precisa ser preenchido. -\end_layout - -\begin_layout Subsubsection -gc_thresh2 -\end_layout - -\begin_layout Itemize -Tipo: INTEGER -\end_layout - -\begin_layout Itemize -Default: 512 -\end_layout - -\begin_layout Standard -Precisa ser preenchido. -\end_layout - -\begin_layout Subsubsection -gc_thresh3 -\end_layout - -\begin_layout Itemize -Tipo: INTEGER -\end_layout - -\begin_layout Itemize -Default: 1024 -\end_layout - -\begin_layout Standard -Parametro para o tamanho da tabela de vizinhança. -\end_layout - -\begin_layout Standard -Aumente este valor se voce tem muitas interfaces e os routers começam a - apresentar problemas misteriosos de funcionamento e falhas. - Ou se uma mensagem dessas aparecer -\begin_inset CommandInset href -LatexCommand href -name "Zebra (routing daemon)" -target "http://www.zebra.org/" - -\end_inset - -: -\end_layout - -\begin_layout Code - -ZEBRA: netlink-listen error: No buffer space available, type=RTM_NEWROUTE(24), -\end_layout - -\begin_layout Code - -¬ seq=426, pid=0 -\end_layout - -\begin_layout Subsubsection -gc_interval -\end_layout - -\begin_layout Itemize -Tipo: INTEGER -\end_layout - -\begin_layout Itemize -Default: 30 -\end_layout - -\begin_layout Standard -Precisa ser preenchido. -\end_layout - -\begin_layout Subsection -neigh/interface/* -\end_layout - -\begin_layout Standard -Muda ajustes especiais por interface para detecção de vizinhos. -\end_layout - -\begin_layout Subsubsection -anycast_delay -\end_layout - -\begin_layout Itemize -Tipo: INTEGER -\end_layout - -\begin_layout Itemize -Default: 100 -\end_layout - -\begin_layout Standard -Precisa ser preenchido. -\end_layout - -\begin_layout Subsubsection -gc_stale_time -\end_layout - -\begin_layout Itemize -Tipo: INTEGER -\end_layout - -\begin_layout Itemize -Default: 60 -\end_layout - -\begin_layout Standard -Precisa ser preenchido. -\end_layout - -\begin_layout Subsubsection -proxy_qlen -\end_layout - -\begin_layout Itemize -Tipo: INTEGER -\end_layout - -\begin_layout Itemize -Default: 64 -\end_layout - -\begin_layout Standard -Precisa ser preenchido. -\end_layout - -\begin_layout Subsubsection -unres_qlen -\end_layout - -\begin_layout Itemize -Tipo: INTEGER -\end_layout - -\begin_layout Itemize -Default: 3 -\end_layout - -\begin_layout Standard -Precisa ser preenchido. -\end_layout - -\begin_layout Subsubsection -app_solicit -\end_layout - -\begin_layout Itemize -Tipo: INTEGER -\end_layout - -\begin_layout Itemize -Default: 0 -\end_layout - -\begin_layout Standard -Precisa ser preenchido. -\end_layout - -\begin_layout Subsubsection -locktime -\end_layout - -\begin_layout Itemize -Tipo: INTEGER -\end_layout - -\begin_layout Itemize -Default: 0 -\end_layout - -\begin_layout Standard -Precisa ser preenchido. -\end_layout - -\begin_layout Subsubsection -retrans_time -\end_layout - -\begin_layout Itemize -Tipo: INTEGER -\end_layout - -\begin_layout Itemize -Default: 100 -\end_layout - -\begin_layout Standard -Precisa ser preenchido. -\end_layout - -\begin_layout Subsubsection -base_reachable_time -\end_layout - -\begin_layout Itemize -Tipo: INTEGER -\end_layout - -\begin_layout Itemize -Default: 30 -\end_layout - -\begin_layout Standard -Precisa ser preenchido. -\end_layout - -\begin_layout Subsubsection -mcast_solicit -\end_layout - -\begin_layout Itemize -Tipo: INTEGER -\end_layout - -\begin_layout Itemize -Default: 3 -\end_layout - -\begin_layout Standard -Precisa ser preenchido. -\end_layout - -\begin_layout Subsubsection -ucast_solicit -\end_layout - -\begin_layout Itemize -Tipo: INTEGER -\end_layout - -\begin_layout Itemize -Default: 3 -\end_layout - -\begin_layout Standard -Precisa ser preenchido -\end_layout - -\begin_layout Subsubsection -delay_first_probe_time -\end_layout - -\begin_layout Itemize -Tipo: INTEGER -\end_layout - -\begin_layout Itemize -Default: 5 -\end_layout - -\begin_layout Standard -Precisa ser preenchido. -\end_layout - -\begin_layout Subsubsection -proxy_delay -\end_layout - -\begin_layout Itemize -Tipo: INTEGER -\end_layout - -\begin_layout Itemize -Default: 80 -\end_layout - -\begin_layout Standard -Precisa ser preenchido. -\end_layout - -\begin_layout Subsection -route/* -\end_layout - -\begin_layout Standard -Ajustes globais para roteamento. -\end_layout - -\begin_layout Subsubsection -flush -\end_layout - -\begin_layout Standard -Removido nas novas versões de kernel - Precisa ser preenchido. -\end_layout - -\begin_layout Subsubsection -gc_interval -\end_layout - -\begin_layout Itemize -Tipo: INTEGER -\end_layout - -\begin_layout Itemize -Default: 30 -\end_layout - -\begin_layout Standard -Precisa ser preenchido. -\end_layout - -\begin_layout Subsubsection -gc_thresh -\end_layout - -\begin_layout Itemize -Tipo: INTEGER -\end_layout - -\begin_layout Itemize -Default: 1024 -\end_layout - -\begin_layout Standard -Precisa ser preenchido. -\end_layout - -\begin_layout Subsubsection -mtu_expires -\end_layout - -\begin_layout Itemize -Tipo: INTEGER -\end_layout - -\begin_layout Itemize -Default: 600 -\end_layout - -\begin_layout Standard -Precisa ser preenchido. -\end_layout - -\begin_layout Subsubsection -gc_elasticity -\end_layout - -\begin_layout Itemize -Tipo: INTEGER -\end_layout - -\begin_layout Itemize -Default: 0 -\end_layout - -\begin_layout Standard -Precisa ser preenchido. -\end_layout - -\begin_layout Subsubsection -gc_min_interval -\end_layout - -\begin_layout Itemize -Tipo: INTEGER -\end_layout - -\begin_layout Itemize -Default: 5 -\end_layout - -\begin_layout Standard -Precisa ser preenchido. -\end_layout - -\begin_layout Subsubsection -gc_timeout -\end_layout - -\begin_layout Itemize -Tipo: INTEGER -\end_layout - -\begin_layout Itemize -Default: 60 -\end_layout - -\begin_layout Standard -Precisa ser preenchido. -\end_layout - -\begin_layout Subsubsection -min_adv_mss -\end_layout - -\begin_layout Itemize -Tipo: INTEGER -\end_layout - -\begin_layout Itemize -Default: 12 -\end_layout - -\begin_layout Standard -Precisa ser preenchido. -\end_layout - -\begin_layout Subsubsection -max_size -\end_layout - -\begin_layout Itemize -Tipo: INTEGER -\end_layout - -\begin_layout Itemize -Default: 4096 -\end_layout - -\begin_layout Standard -Precisa ser preenchido. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "proc-sys-net-ipv4" - -\end_inset - -Entradas relacionadas a IPv6 em /proc/sys/net/ipv4/ -\end_layout - -\begin_layout Standard -Neste momento (e será até que o IPv6 seja completamente convertido para - um módulo independente do kernel) algumas chaves para IPv6 são usadas aqui. -\end_layout - -\begin_layout Subsection -ip_* -\end_layout - -\begin_layout Subsubsection -ip_local_port_range -\end_layout - -\begin_layout Standard -Esta definição também é usada para o IPv6. -\end_layout - -\begin_layout Subsection -tcp_* -\end_layout - -\begin_layout Standard -Esta definição também é usada para o IPv6. -\end_layout - -\begin_layout Subsection -icmp_* -\end_layout - -\begin_layout Standard -Esta definição não é usada para o IPv6. - Para habilitar o limite ICMPv6 (o que é muito recomendado) regras netfilter-v6 - devem ser usadas. -\end_layout - -\begin_layout Subsection -others -\end_layout - -\begin_layout Standard -Desconhecido, mas provavelmente não usado pelo IPv6. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "proc-net" - -\end_inset - -Entradas em /proc/net relacionadas com IPv6 -\end_layout - -\begin_layout Standard -No /proc/net existem diversas variáveis disponíveis, somente para leitura, - Não é possível obter informaçoes através do "sysctl", então utilize "cat". -\end_layout - -\begin_layout Subsection -if_inet6 -\end_layout - -\begin_layout Itemize -Tipo: Uma linha por endereço contendo vários valores -\end_layout - -\begin_layout Standard -Aqui todos os endereços IPv6 cpnfigurados são mostrados em um formato especial. - O exemplo mostra somente a interface de loopback. - O significado é mostrado abaixo (veja "net/ipv6/addrconf.c" para mais informaçõe -s). -\end_layout - -\begin_layout Code - -# cat /proc/net/if_inet6 -\end_layout - -\begin_layout Code - -00000000000000000000000000000001 01 80 10 80 lo -\end_layout - -\begin_layout Code - -+------------------------------+ ++ ++ ++ ++ ++ -\end_layout - -\begin_layout Code - -| | | | | | -\end_layout - -\begin_layout Code - -1 2 3 4 5 6 -\end_layout - -\begin_layout Enumerate -Endereço IPv6 mostrado em hexadecimal (32 caracteres) sem os dois pontos - ":" como separadores -\end_layout - -\begin_layout Enumerate -Número do dispositivo netlink (índice da interface) em hexadecimal (veja - -\begin_inset Quotes sld -\end_inset - -ip addr -\begin_inset Quotes srd -\end_inset - - , também) -\end_layout - -\begin_layout Enumerate -tamanho do prefixo, em hexadecimal -\end_layout - -\begin_layout Enumerate -Valor do escopo (veja o fonte do kernel " include/net/ipv6.h" e "net/ipv6/addrcon -f.c" para mais informações) -\end_layout - -\begin_layout Enumerate -Flags da interface (veja "include/linux/rtnetlink.h" e"net/ipv6/addrconf.c" - para mais informações) -\end_layout - -\begin_layout Enumerate -Nome do disppositivo -\end_layout - -\begin_layout Subsection -ipv6_route -\end_layout - -\begin_layout Itemize -Tipo: Uma linha por rota contém várias valores -\end_layout - -\begin_layout Standard -Aqui toda a configuração de rotas em IPv6 é mostrada em um formato especialt. - O exemplo mostra informações somente para a interface de loopback O significado - é mostrado abaixo (veja "net/ipv6/route.c" para mais informações). -\end_layout - -\begin_layout Code - -# cat /proc/net/ipv6_route -\end_layout - -\begin_layout Code - -00000000000000000000000000000000 00 00000000000000000000000000000000 00 -\end_layout - -\begin_layout Code - -+------------------------------+ ++ +------------------------------+ ++ -\end_layout - -\begin_layout Code - -| | | | -\end_layout - -\begin_layout Code - -1 2 3 4 -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -¬ 00000000000000000000000000000000 ffffffff 00000001 00000001 00200200 lo -\end_layout - -\begin_layout Code - -¬ +------------------------------+ +------+ +------+ +------+ +------+ ++ -\end_layout - -\begin_layout Code - -¬ | | | | | | -\end_layout - -\begin_layout Code - -¬ 5 6 7 8 9 10 -\end_layout - -\begin_layout Enumerate -Rede de destino IPv6 mostrada em hexadecimal (32 caracteres) som dois pontos - ":" como separador -\end_layout - -\begin_layout Enumerate -Tamanho do prefixo de destino, em hexadecimal -\end_layout - -\begin_layout Enumerate -Rede de origem IPv6 mostrada em hexadecimal (32 caracteres) som dois pontos - ":" como separador -\end_layout - -\begin_layout Enumerate -Tamanho do prefixo de origem, em hexadecimal -\end_layout - -\begin_layout Enumerate -Próximo salto IPv6 mostrado em hexadecimal (32 caracteres) som dois pontos - ":" como separador -\end_layout - -\begin_layout Enumerate -Métrica em hexadecimal -\end_layout - -\begin_layout Enumerate -Contador de referencia -\end_layout - -\begin_layout Enumerate -Contadoer de uso -\end_layout - -\begin_layout Enumerate -Flags -\end_layout - -\begin_layout Enumerate -Nome do dispositivo -\end_layout - -\begin_layout Subsection -sockstat6 -\end_layout - -\begin_layout Itemize -Tipo: Uma linha por protocolo, com descrição e valor -\end_layout - -\begin_layout Standard -Estatísticas sobre o uso de sockets IPv6. - Exemplo: -\end_layout - -\begin_layout Code - -# cat /proc/net/sockstat6 -\end_layout - -\begin_layout Code - -TCP6: inuse 7 -\end_layout - -\begin_layout Code - -UDP6: inuse 2 -\end_layout - -\begin_layout Code - -RAW6: inuse 1 -\end_layout - -\begin_layout Code - -FRAG6: inuse 0 memory 0 -\end_layout - -\begin_layout Subsection -tcp6 -\end_layout - -\begin_layout Standard -Precisa ser preenchido. -\end_layout - -\begin_layout Subsection -udp6 -\end_layout - -\begin_layout Standard -Precisa ser preenchido. -\end_layout - -\begin_layout Subsection -igmp6 -\end_layout - -\begin_layout Standard -Precisa ser preenchido. -\end_layout - -\begin_layout Subsection -raw6 -\end_layout - -\begin_layout Standard -Precisa ser preenchido. -\end_layout - -\begin_layout Subsection -ip6_flowlabel -\end_layout - -\begin_layout Standard -Precisa ser preenchido. -\end_layout - -\begin_layout Subsection -rt6_stats -\end_layout - -\begin_layout Standard -Precisa ser preenchido. -\end_layout - -\begin_layout Subsection -snmp6 -\end_layout - -\begin_layout Itemize -Tipo: Uma linha por descrição SNMP e valor -\end_layout - -\begin_layout Standard -Estatísticas SNMP podem ser obtidas via um servidor SNMP e suas MIB's relacionad -as, através um software de gerencia de rede. -\end_layout - -\begin_layout Subsection -ip6_tables_names -\end_layout - -\begin_layout Standard -Tabelas netfilter6 disponíveis -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "netlink" - -\end_inset - -Netlink-Interface to kernel -\end_layout - -\begin_layout Standard -To be filled...I have no experience with that... -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "resolver" - -\end_inset - -Address Resolver -\end_layout - -\begin_layout Standard -Name to IPv4 or IPv6 address resolving is usually done using a libc resolver - library. - There are some issues known using the function -\emph on -getaddrinfo -\emph default -. -\end_layout - -\begin_layout Standard -More info can be found at -\begin_inset CommandInset href -LatexCommand href -name "Linux & IPv6: getaddrinfo and search domains - Research" -target "http://www.bieringer.de/linux/IPv6/getaddrinfo/" - -\end_inset - - and -\begin_inset CommandInset href -LatexCommand href -name "RFC 3484 on Linux" -target "http://people.redhat.com/drepper/linux-rfc3484.html" - -\end_inset - -. -\end_layout - -\begin_layout Standard -\begin_inset VSpace defskip -\end_inset - -More to be filled later... -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "network-debugging" - -\end_inset - -Network debugging -\end_layout - -\begin_layout Section -Server socket binding -\end_layout - -\begin_layout Subsection -Using -\begin_inset Quotes sld -\end_inset - -netstat -\begin_inset Quotes srd -\end_inset - - for server socket binding check -\end_layout - -\begin_layout Standard -It's always interesting which server sockets are currently active on a node. - Using -\begin_inset Quotes sld -\end_inset - -netstat -\begin_inset Quotes srd -\end_inset - - is a short way to get such information: -\end_layout - -\begin_layout Standard -Used options: -nlptu -\end_layout - -\begin_layout Standard -Example: -\end_layout - -\begin_layout Code - -# netstat -nlptu -\end_layout - -\begin_layout Code - -Active Internet connections (only servers) -\end_layout - -\begin_layout Code - -Proto Recv-Q Send-Q Local Address Foreign Address State - -\end_layout - -\begin_layout Code - -¬ PID/Program name -\end_layout - -\begin_layout Code - -tcp 0 0 0.0.0.0:32768 0.0.0.0:* LISTEN - -\end_layout - -\begin_layout Code - -¬ 1258/rpc.statd -\end_layout - -\begin_layout Code - -tcp 0 0 0.0.0.0:32769 0.0.0.0:* LISTEN - -\end_layout - -\begin_layout Code - -¬ 1502/rpc.mountd -\end_layout - -\begin_layout Code - -tcp 0 0 0.0.0.0:515 0.0.0.0:* LISTEN - -\end_layout - -\begin_layout Code - -¬ 22433/lpd Waiting -\end_layout - -\begin_layout Code - -tcp 0 0 1.2.3.1:139 0.0.0.0:* LISTEN - -\end_layout - -\begin_layout Code - -¬ 1746/smbd -\end_layout - -\begin_layout Code - -tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN - -\end_layout - -\begin_layout Code - -¬ 1230/portmap -\end_layout - -\begin_layout Code - -tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN - -\end_layout - -\begin_layout Code - -¬ 3551/X -\end_layout - -\begin_layout Code - -tcp 0 0 1.2.3.1:8081 0.0.0.0:* LISTEN - -\end_layout - -\begin_layout Code - -¬ 18735/junkbuster -\end_layout - -\begin_layout Code - -tcp 0 0 1.2.3.1:3128 0.0.0.0:* LISTEN - -\end_layout - -\begin_layout Code - -¬ 18822/(squid) -\end_layout - -\begin_layout Code - -tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN - -\end_layout - -\begin_layout Code - -¬ 30734/named -\end_layout - -\begin_layout Code - -tcp 0 0 ::ffff:1.2.3.1:993 :::* LISTEN - -\end_layout - -\begin_layout Code - -¬ 6742/xinetd-ipv6 -\end_layout - -\begin_layout Code - -tcp 0 0 :::13 :::* LISTEN - -\end_layout - -\begin_layout Code - -¬ 6742/xinetd-ipv6 -\end_layout - -\begin_layout Code - -tcp 0 0 ::ffff:1.2.3.1:143 :::* LISTEN - -\end_layout - -\begin_layout Code - -¬ 6742/xinetd-ipv6 -\end_layout - -\begin_layout Code - -tcp 0 0 :::53 :::* LISTEN - -\end_layout - -\begin_layout Code - -¬ 30734/named -\end_layout - -\begin_layout Code - -tcp 0 0 :::22 :::* LISTEN - -\end_layout - -\begin_layout Code - -¬ 1410/sshd -\end_layout - -\begin_layout Code - -tcp 0 0 :::6010 :::* LISTEN - -\end_layout - -\begin_layout Code - -¬ 13237/sshd -\end_layout - -\begin_layout Code - -udp 0 0 0.0.0.0:32768 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 1258/rpc.statd -\end_layout - -\begin_layout Code - -udp 0 0 0.0.0.0:2049 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ - -\end_layout - -\begin_layout Code - -udp 0 0 0.0.0.0:32770 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 1502/rpc.mountd -\end_layout - -\begin_layout Code - -udp 0 0 0.0.0.0:32771 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ - -\end_layout - -\begin_layout Code - -udp 0 0 1.2.3.1:137 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 1751/nmbd -\end_layout - -\begin_layout Code - -udp 0 0 0.0.0.0:137 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 1751/nmbd -\end_layout - -\begin_layout Code - -udp 0 0 1.2.3.1:138 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 1751/nmbd -\end_layout - -\begin_layout Code - -udp 0 0 0.0.0.0:138 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 1751/nmbd -\end_layout - -\begin_layout Code - -udp 0 0 0.0.0.0:33044 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 30734/named -\end_layout - -\begin_layout Code - -udp 0 0 1.2.3.1:53 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 30734/named -\end_layout - -\begin_layout Code - -udp 0 0 127.0.0.1:53 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 30734/named -\end_layout - -\begin_layout Code - -udp 0 0 0.0.0.0:67 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 1530/dhcpd -\end_layout - -\begin_layout Code - -udp 0 0 0.0.0.0:67 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 1530/dhcpd -\end_layout - -\begin_layout Code - -udp 0 0 0.0.0.0:32858 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 18822/(squid) -\end_layout - -\begin_layout Code - -udp 0 0 0.0.0.0:4827 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 18822/(squid) -\end_layout - -\begin_layout Code - -udp 0 0 0.0.0.0:111 0.0.0.0:* - -\end_layout - -\begin_layout Code - -¬ 1230/portmap -\end_layout - -\begin_layout Code - -udp 0 0 :::53 :::* - -\end_layout - -\begin_layout Code - -¬ 30734/named -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "examples-tcpdump" - -\end_inset - -Examples for tcpdump packet dumps -\end_layout - -\begin_layout Standard -Here some examples of captured packets are shown, perhaps useful for your - own debugging... -\end_layout - -\begin_layout Standard -...more coming next... -\end_layout - -\begin_layout Subsection -Router discovery -\end_layout - -\begin_layout Subsubsection -Router advertisement -\end_layout - -\begin_layout Code - -15:43:49.484751 fe80::212:34ff:fe12:3450 > ff02::1: icmp6: router -\end_layout - -\begin_layout Code - -¬ advertisement(chlim=64, router_ltime=30, reachable_time=0, -\end_layout - -\begin_layout Code - -¬ retrans_time=0)(prefix info: AR valid_ltime=30, preffered_ltime=20, -\end_layout - -\begin_layout Code - -¬ prefix=2002:0102:0304:1::/64)(prefix info: LAR valid_ltime=2592000, -\end_layout - -\begin_layout Code - -¬ preffered_ltime=604800, prefix=2001:0db8:0:1::/64)(src lladdr: -\end_layout - -\begin_layout Code - -¬ 0:12:34:12:34:50) (len 88, hlim 255) -\end_layout - -\begin_layout Standard -Router with link-local address -\begin_inset Quotes sld -\end_inset - -fe80::212:34ff:fe12:3450 -\begin_inset Quotes srd -\end_inset - - send an advertisement to the all-node-on-link multicast address -\begin_inset Quotes sld -\end_inset - -ff02::1 -\begin_inset Quotes srd -\end_inset - - containing two prefixes -\begin_inset Quotes sld -\end_inset - -2002:0102:0304:1::/64 -\begin_inset Quotes srd -\end_inset - - (lifetime 30 s) and -\begin_inset Quotes sld -\end_inset - -2001:0db8:0:1::/64 -\begin_inset Quotes srd -\end_inset - - (lifetime 2592000 s) including its own layer 2 MAC address -\begin_inset Quotes sld -\end_inset - -0:12:34:12:34:50 -\begin_inset Quotes srd -\end_inset - -. -\end_layout - -\begin_layout Subsubsection -Router solicitation -\end_layout - -\begin_layout Code - -15:44:21.152646 fe80::212:34ff:fe12:3456 > ff02::2: icmp6: router solicitation -\end_layout - -\begin_layout Code - -¬ (src lladdr: 0:12:34:12:34:56) (len 16, hlim 255) -\end_layout - -\begin_layout Standard -Node with link-local address -\begin_inset Quotes sld -\end_inset - -fe80::212:34ff:fe12:3456 -\begin_inset Quotes srd -\end_inset - - and layer 2 MAC address -\begin_inset Quotes sld -\end_inset - -0:12:34:12:34:56 -\begin_inset Quotes srd -\end_inset - - is looking for a router on-link, therefore sending this solicitation to - the all-router-on-link multicast address -\begin_inset Quotes sld -\end_inset - -ff02::2 -\begin_inset Quotes srd -\end_inset - -. -\end_layout - -\begin_layout Subsection -Neighbor discovery -\end_layout - -\begin_layout Subsubsection -Neighbor discovery solicitation for duplicate address detection -\end_layout - -\begin_layout Standard -Following packets are sent by a node with layer 2 MAC address -\begin_inset Quotes sld -\end_inset - -0:12:34:12:34:56 -\begin_inset Quotes srd -\end_inset - - during autoconfiguration to check whether a potential address is already - used by another node on the link sending this to the solicited-node link-local - multicast address. -\end_layout - -\begin_layout Itemize -Node wants to configure its link-local address -\begin_inset Quotes sld -\end_inset - -fe80::212:34ff:fe12:3456 -\begin_inset Quotes srd -\end_inset - -, checks for duplicate now -\end_layout - -\begin_layout Code - -15:44:17.712338 :: > ff02::1:ff12:3456: icmp6: neighbor sol: who has -\end_layout - -\begin_layout Code - -¬ fe80::212:34ff:fe12:3456(src lladdr: 0:12:34:12:34:56) (len 32, hlim 255) -\end_layout - -\begin_layout Itemize -Node wants to configure its global address -\begin_inset Quotes sld -\end_inset - -2002:0102:0304:1:212:34ff:fe12:3456 -\begin_inset Quotes srd -\end_inset - - (after receiving advertisement shown above), checks for duplicate now -\end_layout - -\begin_layout Code - -15:44:21.905596 :: > ff02::1:ff12:3456: icmp6: neighbor sol: who has -\end_layout - -\begin_layout Code - -¬ 2002:0102:0304:1:212:34ff:fe12:3456(src lladdr: 0:12:34:12:34:56) (len - 32, -\end_layout - -\begin_layout Code - -¬ hlim 255) -\end_layout - -\begin_layout Itemize -Node wants to configure its global address -\begin_inset Quotes sld -\end_inset - -2001:0db8:0:1:212:34ff:fe12:3456 -\begin_inset Quotes srd -\end_inset - - (after receiving advertisement shown above), checks for duplicate now -\end_layout - -\begin_layout Code - -15:44:22.304028 :: > ff02::1:ff12:3456: icmp6: neighbor sol: who has -\end_layout - -\begin_layout Code - -¬ 2001:0db8:0:1:212:34ff:fe12:3456(src lladdr: 0:12:34:12:34:56) (len 32, - hlim -\end_layout - -\begin_layout Code - -¬ 255) -\end_layout - -\begin_layout Subsubsection -Neighbor discovery solicitation for looking for host or gateway -\end_layout - -\begin_layout Itemize -Node wants to send packages to -\begin_inset Quotes sld -\end_inset - -2001:0db8:0:1::10 -\begin_inset Quotes srd -\end_inset - - but has no layer 2 MAC address to send packet, so send solicitation now -\end_layout - -\begin_layout Code - -13:07:47.664538 2002:0102:0304:1:2e0:18ff:fe90:9205 > ff02::1:ff00:10: icmp6: -\end_layout - -\begin_layout Code - -¬ neighbor sol: who has 2001:0db8:0:1::10(src lladdr: 0:e0:18:90:92:5) (len - 32, -\end_layout - -\begin_layout Code - -¬ hlim 255) -\end_layout - -\begin_layout Itemize -Node looks for -\begin_inset Quotes sld -\end_inset - -fe80::10 -\begin_inset Quotes srd -\end_inset - - now -\end_layout - -\begin_layout Code - -13:11:20.870070 fe80::2e0:18ff:fe90:9205 > ff02::1:ff00:10: icmp6: neighbor -\end_layout - -\begin_layout Code - -¬ sol: who has fe80::10(src lladdr: 0:e0:18:90:92:5) (len 32, hlim 255) -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-support-persistent-configuration" - -\end_inset - -Support for persistent IPv6 configuration in Linux distributions -\end_layout - -\begin_layout Standard -Some Linux distribution contain already support of a persistent IPv6 configurati -on using existing or new configuration and script files and some hook in - the IPv4 script files. -\end_layout - -\begin_layout Section -Red Hat Linux and -\begin_inset Quotes sld -\end_inset - -clones -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -Since starting writing the -\begin_inset CommandInset href -LatexCommand href -name "IPv6 & Linux - HowTo" -target "http://www.bieringer.de/linux/IPv6/" - -\end_inset - - it was my intention to enable a persistent IPv6 configuration which catch - most of the wished cases like host-only, router-only, dual-homed-host, - router with second stub network, normal tunnels, 6to4 tunnels, and so on. - Nowadays there exists a set of configuration and script files which do - the job very well (never heard about real problems, but I don't know how - many use the set). - Because this configuration and script files are extended from time to time, - they got their own homepage: -\begin_inset CommandInset href -LatexCommand href -name "initscripts-ipv6 homepage" -target "http://www.deepspace6.net/projects/initscripts-ipv6.html" - -\end_inset - - ( -\begin_inset CommandInset href -LatexCommand href -name "Mirror" -target "http://mirrors.bieringer.de/www.deepspace6.net/projects/initscripts-ipv6.html" - -\end_inset - -). - Because I began my IPv6 experience using a Red Hat Linux 5.0 clone, my IPv6 - development systems are mostly Red Hat Linux based now, it's kind a logic - that the scripts are developed for this kind of distribution (so called - -\emph on -historic issue -\emph default -). - Also it was very easy to extend some configuration files, create new ones - and create some simple hook for calling IPv6 setup during IPv4 setup. -\end_layout - -\begin_layout Standard -Fortunately, in Red Hat Linux since 7.1 a snapshot of my IPv6 scripts is - included, this was and is still further on assisted by Pekka Savola. -\end_layout - -\begin_layout Standard -Mandrake since version 8.0 also includes an IPv6-enabled initscript package, - but a minor bug still prevents usage ( -\begin_inset Quotes sld -\end_inset - -ifconfig -\begin_inset Quotes srd -\end_inset - - misses -\begin_inset Quotes sld -\end_inset - -inet6 -\begin_inset Quotes srd -\end_inset - - before -\begin_inset Quotes sld -\end_inset - -add -\begin_inset Quotes srd -\end_inset - -). -\end_layout - -\begin_layout Subsection -Test for IPv6 support of network configuration scripts -\end_layout - -\begin_layout Standard -You can test, whether your Linux distribution contain support for persistent - IPv6 configuration using my set. - Following script library should exist: -\end_layout - -\begin_layout Code - -/etc/sysconfig/network-scripts/network-functions-ipv6 -\end_layout - -\begin_layout Standard -Auto-magically test: -\end_layout - -\begin_layout Code - -# test -f /etc/sysconfig/network-scripts/network-functions-ipv6 && echo - "Main -\end_layout - -\begin_layout Code - -¬ IPv6 script library exists" -\end_layout - -\begin_layout Standard -The version of the library is important if you miss some features. - You can get it executing following (or easier look at the top of the file): -\end_layout - -\begin_layout Code - -# source /etc/sysconfig/network-scripts/network-functions-ipv6 && -\end_layout - -\begin_layout Code - -¬ getversion_ipv6_functions -\end_layout - -\begin_layout Code - -20011124 -\end_layout - -\begin_layout Standard -In shown example, the used version is -\series bold -20011124 -\series default -. - Check this against latest information on -\begin_inset CommandInset href -LatexCommand href -name "initscripts-ipv6 homepage" -target "http://www.deepspace6.net/projects/initscripts-ipv6.html" - -\end_inset - - ( -\begin_inset CommandInset href -LatexCommand href -name "Mirror" -target "http://mirrors.bieringer.de/www.deepspace6.net/projects/initscripts-ipv6.html" - -\end_inset - -) to see what has been changed. - You will find there also a change-log. -\end_layout - -\begin_layout Subsection -Short hint for enabling IPv6 on current RHL 7.1, 7.2, 7.3, ... -\end_layout - -\begin_layout Itemize -Check whether running system has already IPv6 module loaded -\end_layout - -\begin_layout Code - -# modprobe -c | grep net-pf-10 -\end_layout - -\begin_layout Code - -alias net-pf-10 off -\end_layout - -\begin_layout Itemize -If result is -\begin_inset Quotes sld -\end_inset - -off -\begin_inset Quotes srd -\end_inset - -, then enable IPv6 networking by editing /etc/sysconfig/network, add following - new line -\end_layout - -\begin_layout Code - -NETWORKING_IPV6=yes -\end_layout - -\begin_layout Itemize -Reboot or restart networking using -\end_layout - -\begin_layout Code - -# service network restart -\end_layout - -\begin_layout Itemize -Now IPv6 module should be loaded -\end_layout - -\begin_layout Code - -# modprobe -c | grep ipv6 -\end_layout - -\begin_layout Code - -alias net-pf-10 ipv6 -\end_layout - -\begin_layout Standard -If your system is on a link which provides router advertisement, autoconfigurati -on will be done automatically. - For more information which settings are supported see /usr/share/doc/initscript -s-$version/sysconfig.txt. -\end_layout - -\begin_layout Section -SuSE Linux -\end_layout - -\begin_layout Standard -In newer 7.x versions there is a really rudimentary support available, see - /etc/rc.config for details. -\end_layout - -\begin_layout Standard -Because of the really different configuration and script file structure - it is hard (or impossible) to use the set for Red Hat Linux and clones - with this distribution. -\begin_inset Newline newline -\end_inset - -In versions 8.x they completly change their configuration setup. - -\end_layout - -\begin_layout Subsection -SuSE Linux 7.3 -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "How to setup 6to4 IPv6 with SuSE 7.3" -target "http://www.feyrer.de/IPv6/SuSE73-IPv6+6to4-setup.html" - -\end_inset - - -\end_layout - -\begin_layout Subsection -SuSE Linux 8.0 -\end_layout - -\begin_layout Subsubsection -IPv6 address configuration -\end_layout - -\begin_layout Standard -Edit file /etc/sysconfig/network/ifcfg- and setup following - value -\end_layout - -\begin_layout Code - -IP6ADDR="/" -\end_layout - -\begin_layout Subsubsection -Additional information -\end_layout - -\begin_layout Standard -See file /usr/share/doc/packages/sysconfig/README -\end_layout - -\begin_layout Subsection -SuSE Linux 8.1 -\end_layout - -\begin_layout Subsubsection -IPv6 address configuration -\end_layout - -\begin_layout Standard -Edit file /etc/sysconfig/network/ifcfg- and setup following - value -\end_layout - -\begin_layout Code - -IPADDR="/" -\end_layout - -\begin_layout Subsubsection -Additional information -\end_layout - -\begin_layout Standard -See file /usr/share/doc/packages/sysconfig/Network -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "Configuration-Debian-Linux" - -\end_inset - -Debian Linux -\end_layout - -\begin_layout Standard -Following information was contributed by Stephane Bortzmeyer -\end_layout - -\begin_layout Enumerate -Be sure that IPv6 is loaded, either because it is compiled into the kernel - or because the module is loaded. - For the latest, three solutions, adding it to /etc/modules, using the pre-up - trick shown later or using kmod (not detailed here). -\end_layout - -\begin_layout Enumerate -Configure your interface. - Here we assume eth0 and address (2001:0db8:1234:5::1:1). - Edit /etc/network/interfaces: -\end_layout - -\begin_layout Code - -iface eth0 inet6 static -\end_layout - -\begin_layout Code - - pre-up modprobe ipv6 -\end_layout - -\begin_layout Code - - address 2001:0db8:1234:5::1:1 -\end_layout - -\begin_layout Code - - # To suppress completely autoconfiguration: -\end_layout - -\begin_layout Code - - # up echo 0 > /proc/sys/net/ipv6/conf/all/autoconf -\end_layout - -\begin_layout Code - - netmask 64 -\end_layout - -\begin_layout Code - - # The router is autoconfigured and has no fixed address. -\end_layout - -\begin_layout Code - - # It is magically -\end_layout - -\begin_layout Code - - # found. - (/proc/sys/net/ipv6/conf/all/accept_ra). - Otherwise: -\end_layout - -\begin_layout Code - - #gateway 2001:0db8:1234:5::1 -\end_layout - -\begin_layout Standard -And you reboot or you just -\end_layout - -\begin_layout Code - -# ifup --force eth0 -\end_layout - -\begin_layout Standard -and you have your static address. - -\end_layout - -\begin_layout Subsection -Further information -\end_layout - -\begin_layout Itemize - -\lang ngerman -\begin_inset CommandInset href -LatexCommand href -name "IPv6 with Debian Linux" -target "http://ipv6.debian.net/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Jean-Marc V. - Liotier's -\begin_inset CommandInset href -LatexCommand href -name "HOWTO for Freenet6 & Debian Users" -target "http://www.ruwenzori.net/ipv6/Jims_LAN_IPv6_global_connectivity_howto.html" - -\end_inset - - (announced 24.12.2002 on -\begin_inset CommandInset ref -LatexCommand ref -name "mailinglist" -reference "information-maillists" - -\end_inset - - users@ipv6.org ) -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-autoconfiguration" - -\end_inset - -Auto-configuration -\end_layout - -\begin_layout Section -Stateless auto-configuration -\end_layout - -\begin_layout Standard -Is supported and seen on the assigned link-local address after an IPv6-enabled - interface is up. -\end_layout - -\begin_layout Standard -Example: -\end_layout - -\begin_layout Code - -# ip -6 addr show dev eth0 scope link -\end_layout - -\begin_layout Code - -2: eth0: mtu 1500 qlen1000 -\end_layout - -\begin_layout Code - - inet6 fe80::211:d8ff:fe6b:f0f5/64 scope link -\end_layout - -\begin_layout Code - - valid_lft forever preferred_lft forever -\end_layout - -\begin_layout Section -Stateful auto-configuration using Router Advertisement Daemon (radvd) -\end_layout - -\begin_layout Standard -to be filled. - See -\begin_inset CommandInset ref -LatexCommand ref -name "radvd daemon autoconfiguration" -reference "hints-daemons-radvd" - -\end_inset - - below. -\end_layout - -\begin_layout Section -Dynamic Host Configuration Protocol v6 (DHCPv6) -\end_layout - -\begin_layout Standard -After a long time discussing issues, finally -\begin_inset CommandInset href -LatexCommand href -name "RFC 3315 / Dynamic Host Configuration Protocol for IPv6 (DHCPv6)" -target "http://www.faqs.org/rfcs/rfc3315.html" - -\end_inset - - was finished. - At time updating this part (10/2005) currently two implementations are - available: -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Dibbler" -target "http://klub.com.pl/dhcpv6/" - -\end_inset - - by Tomasz Mrugalski ( -\begin_inset CommandInset ref -LatexCommand ref -name "Hints for configuration" -reference "hints-daemons-dibbler" - -\end_inset - -) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "DHCPv6 on Sourceforge" -target "http://dhcpv6.sourceforge.net/" - -\end_inset - - ( -\begin_inset CommandInset ref -LatexCommand ref -name "Hints for configuration" -reference "hints-daemons-dhcpv6" - -\end_inset - -) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "ISC DHCP" -target "http://www.isc.org/software/dhcp" - -\end_inset - - ( -\begin_inset CommandInset ref -LatexCommand ref -name "Hints for configuration" -reference "hints-daemons-isc-dhcp" - -\end_inset - -) -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-mobility" - -\end_inset - -Mobility -\end_layout - -\begin_layout Section -Common information -\end_layout - -\begin_layout Subsection -Node Mobility -\end_layout - -\begin_layout Standard -Support for IPv6 mobility can be enabled in Linux by installing the MIPL2 - implementation found at: -\begin_inset CommandInset href -LatexCommand href -name "http://www.mobile-ipv6.org/" -target "http://www.mobile-ipv6.org/" - -\end_inset - - -\end_layout - -\begin_layout Standard -This implementation is compliant with RFC 3775. - It is composed of a kernel patch and a mobility daemon called mip6d. - Version 2.0.1 applies on Linux kernel 2.6.15. -\end_layout - -\begin_layout Standard -Installation and setup are described in the -\begin_inset CommandInset href -LatexCommand href -name "Linux Mobile IPv6 HOWTO" -target "http://tldp.org/HOWTO/Mobile-IPv6-HOWTO/" - -\end_inset - -. -\end_layout - -\begin_layout Subsection -Network Mobility -\end_layout - -\begin_layout Standard -There also exists an implementation of network mobility for Linux, it is - called NEPL and is based on MIPL. - It can also be downloaded from: -\begin_inset CommandInset href -LatexCommand href -name "http://www.mobile-ipv6.org/" -target "http://www.mobile-ipv6.org/" - -\end_inset - -. -\end_layout - -\begin_layout Standard -The HOWTO document describing setup and configuration is available at: -\begin_inset CommandInset href -LatexCommand href -name "http://www.nautilus6.org/doc/nepl-howto/" -target "http://www.nautilus6.org/doc/nepl-howto/" - -\end_inset - -. -\end_layout - -\begin_layout Subsection -Links -\end_layout - -\begin_layout Itemize -Mobile IPv6 for Linux (MIPL) project: -\begin_inset CommandInset href -LatexCommand href -name "http://www.mobile-ipv6.org/" -target "http://www.mobile-ipv6.org/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Nautilus6 working group: -\begin_inset CommandInset href -LatexCommand href -name "http://nautilus6.org/" -target "http://nautilus6.org/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Fast Handovers for Mobile IPv6 for Linux project: -\begin_inset CommandInset href -LatexCommand href -name "http://www.fmipv6.org/" -target "http://www.fmipv6.org/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -USAGI-patched Mobile IPv6 for Linux (UMIP): -\begin_inset CommandInset href -LatexCommand href -name "http://umip.linux-ipv6.org/" -target "http://umip.linux-ipv6.org/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Deploying IPsec/IKE-protected MIPv6 under Linux: -\begin_inset CommandInset href -LatexCommand href -name "http://natisbad.org/MIPv6/" -target "http://natisbad.org/MIPv6/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "RFC 3775 / Mobility Support in IPv6" -target "http://www.faqs.org/rfcs/rfc3775.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "RFC 3776 / Using IPsec to Protect Mobile IPv6 Signaling Between Mobile Nodes and Home Agents" -target "http://www.faqs.org/rfcs/rfc3776.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "RFC 3963 / Network Mobility (NEMO)" -target "http://www.faqs.org/rfcs/rfc3963.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "RFC 4068 / Fast Handovers for Mobile IPv6" -target "http://www.faqs.org/rfcs/rfc4068.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "RFC 4423 / Host Identity Protocol (HIP) Architecture" -target "http://www.faqs.org/rfcs/rfc4423.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "RFC 5201 / Host Identity Protocol" -target "http://www.faqs.org/rfcs/rfc5201.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -HIP implementations: -\begin_inset CommandInset href -LatexCommand href -name "http://infrahip.hiit.fi/" -target "http://infrahip.hiit.fi/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "http://hip4inter.net/" -target "http://hip4inter.net/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "http://www.openhip.org/" -target "http://www.openhip.org/" - -\end_inset - - -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-firewalling-security" - -\end_inset - -Firewalling -\end_layout - -\begin_layout Standard -IPv6 firewalling is important, especially if using IPv6 on internal networks - with global IPv6 addresses. - Because unlike at IPv4 networks where in common internal hosts are protected - automatically using private IPv4 addresses like -\begin_inset CommandInset href -LatexCommand href -name "RFC 1918 / Address Allocation for Private Internets" -target "http://www.faqs.org/rfcs/rfc1918.html" - -\end_inset - - or Automatic Private IP Addressing (APIPA) -\begin_inset CommandInset href -LatexCommand href -name "Google search for Microsoft + APIPA" -target "http://www.google.com/search?q=apipa+microsoft" - -\end_inset - -, in IPv6 normally global addresses are used and someone with IPv6 connectivity - can reach all internal IPv6 enabled nodes. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "firewalling-netfilter6" - -\end_inset - -Firewalling using netfilter6 -\end_layout - -\begin_layout Standard -Native IPv6 firewalling is only supported in kernel versions 2.4+. - In older 2.2- you can only filter IPv6-in-IPv4 by protocol 41. - -\end_layout - -\begin_layout Standard -Attention: no warranty that described rules or examples can really protect - your system! -\end_layout - -\begin_layout Standard -Audit your ruleset after installation, see -\begin_inset CommandInset ref -LatexCommand ref -reference "IPv6-security-auditing" - -\end_inset - - for more. -\end_layout - -\begin_layout Standard -Since kernel version 2.6.20 IPv6 connection tracking is fully working (and - does not break IPv4 NAT anymore like versions before) -\end_layout - -\begin_layout Subsection -More information -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Netfilter project" -target "http://www.netfilter.org/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "maillist archive of netfilter users" -target "https://lists.netfilter.org/mailman/listinfo/netfilter" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "maillist archive of netfilter developers" -target "https://lists.netfilter.org/mailman/listinfo/netfilter-devel" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Unofficial status informations" -target "http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status-kernel.html#netfilter6 " - -\end_inset - - -\end_layout - -\begin_layout Section -Preparation -\end_layout - -\begin_layout Standard -This step is only needed if distributed kernel and netfilter doesn't fit - your requirements and new features are available but still not built-in. -\end_layout - -\begin_layout Subsection -Get sources -\end_layout - -\begin_layout Standard -Get the latest kernel source: -\begin_inset CommandInset href -LatexCommand href -name "http://www.kernel.org/" -target "http://www.kernel.org/" - -\end_inset - - -\end_layout - -\begin_layout Standard -Get the latest iptables package: -\end_layout - -\begin_layout Itemize -Source tarball (for kernel patches): -\begin_inset CommandInset href -LatexCommand href -name "http://www.netfilter.org/" -target "http://www.netfilter.org/" - -\end_inset - - -\end_layout - -\begin_layout Subsection -Extract sources -\end_layout - -\begin_layout Standard -Change to source directory: -\end_layout - -\begin_layout Code - -# cd /path/to/src -\end_layout - -\begin_layout Standard -Unpack and rename kernel sources -\end_layout - -\begin_layout Code - -# tar z|jxf kernel-version.tar.gz|bz2 -\end_layout - -\begin_layout Code - -# mv linux linux-version-iptables-version+IPv6 -\end_layout - -\begin_layout Standard -Unpack iptables sources -\end_layout - -\begin_layout Code - -# tar z|jxf iptables-version.tar.gz|bz2 -\end_layout - -\begin_layout Subsection -Apply latest iptables/IPv6-related patches to kernel source -\end_layout - -\begin_layout Standard -Change to iptables directory -\end_layout - -\begin_layout Code - -# cd iptables-version -\end_layout - -\begin_layout Standard -Apply pending patches -\end_layout - -\begin_layout Code - -# make pending-patches KERNEL_DIR=/path/to/src/linux-version-iptables-version/ - -\end_layout - -\begin_layout Standard -Apply additional IPv6 related patches (still not in the vanilla kernel included) - -\end_layout - -\begin_layout Code - -# make patch-o-matic KERNEL_DIR=/path/to/src/linux-version-iptables-version/ - -\end_layout - -\begin_layout Standard -Say yes at following options (iptables-1.2.2) -\end_layout - -\begin_layout Itemize -ah-esp.patch -\end_layout - -\begin_layout Itemize -masq-dynaddr.patch (only needed for systems with dynamic IP assigned WAN - connections like PPP or PPPoE) -\end_layout - -\begin_layout Itemize -ipv6-agr.patch.ipv6 -\end_layout - -\begin_layout Itemize -ipv6-ports.patch.ipv6 -\end_layout - -\begin_layout Itemize -LOG.patch.ipv6 -\end_layout - -\begin_layout Itemize -REJECT.patch.ipv6 -\end_layout - -\begin_layout Standard -Check IPv6 extensions -\end_layout - -\begin_layout Code - -# make print-extensions -\end_layout - -\begin_layout Code - -Extensions found: IPv6:owner IPv6:limit IPv6:mac IPv6:multiport -\end_layout - -\begin_layout Subsection -Configure, build and install new kernel -\end_layout - -\begin_layout Standard -Change to kernel sources -\end_layout - -\begin_layout Code - -# cd /path/to/src/linux-version-iptables-version/ -\end_layout - -\begin_layout Standard -Edit Makefile -\end_layout - -\begin_layout Code - -- EXTRAVERSION = -\end_layout - -\begin_layout Code - -+ EXTRAVERSION = -iptables-version+IPv6-try -\end_layout - -\begin_layout Standard -Run configure, enable IPv6 related -\end_layout - -\begin_layout Code - - Code maturity level options -\end_layout - -\begin_layout Code - - Prompt for development and/or incomplete code/drivers - : yes -\end_layout - -\begin_layout Code - - Networking options -\end_layout - -\begin_layout Code - - Network packet filtering: yes -\end_layout - -\begin_layout Code - - The IPv6 protocol: module -\end_layout - -\begin_layout Code - - IPv6: Netfilter Configuration -\end_layout - -\begin_layout Code - - IP6 tables support: module -\end_layout - -\begin_layout Code - - All new options like following: -\end_layout - -\begin_layout Code - - limit match support: module -\end_layout - -\begin_layout Code - - MAC address match support: module -\end_layout - -\begin_layout Code - - Multiple port match support: module -\end_layout - -\begin_layout Code - - Owner match support: module -\end_layout - -\begin_layout Code - - netfilter MARK match support: module - -\end_layout - -\begin_layout Code - - Aggregated address check: module -\end_layout - -\begin_layout Code - - Packet filtering: module -\end_layout - -\begin_layout Code - - REJECT target support: module -\end_layout - -\begin_layout Code - - LOG target support: module -\end_layout - -\begin_layout Code - - Packet mangling: module -\end_layout - -\begin_layout Code - - MARK target support: module -\end_layout - -\begin_layout Standard -Configure other related to your system, too -\end_layout - -\begin_layout Standard -Compilation and installing: see the kernel section here and other HOWTOs - -\end_layout - -\begin_layout Subsection -Rebuild and install binaries of iptables -\end_layout - -\begin_layout Standard -Make sure, that upper kernel source tree is also available at /usr/src/linux/ - -\end_layout - -\begin_layout Standard -Rename older directory -\end_layout - -\begin_layout Code - -# mv /usr/src/linux /usr/src/linux.old -\end_layout - -\begin_layout Standard -Create a new softlink -\end_layout - -\begin_layout Code - -# ln -s /path/to/src/linux-version-iptables-version /usr/src/linux -\end_layout - -\begin_layout Standard -Rebuild SRPMS -\end_layout - -\begin_layout Code - -# rpm --rebuild /path/to/SRPMS/iptables-version-release.src.rpm -\end_layout - -\begin_layout Standard -Install new iptables packages (iptables + iptables-ipv6) -\end_layout - -\begin_layout Itemize -On RH 7.1 systems, normally, already an older version is installed, therefore - use "freshen" -\end_layout - -\begin_layout Code - -# rpm -Fhv /path/to/RPMS/cpu/iptables*-version-release.cpu.rpm -\end_layout - -\begin_layout Itemize -If not already installed, use "install" -\end_layout - -\begin_layout Code - -# rpm -ihv /path/to/RPMS/cpu/iptables*-version-release.cpu.rpm -\end_layout - -\begin_layout Itemize -On RH 6.2 systems, normally, no kernel 2.4.x is installed, therefore the requiremen -ts don't fit. - Use "--nodeps" to install it -\end_layout - -\begin_layout Code - -# rpm -ihv --nodeps /path/to/RPMS/cpu/iptables*-version-release.cpu.rpm -\end_layout - -\begin_layout Standard -Perhaps it's necessary to create a softlink for iptables libraries where - iptables looks for them -\end_layout - -\begin_layout Code - -# ln -s /lib/iptables/ /usr/lib/iptables -\end_layout - -\begin_layout Section -Usage -\end_layout - -\begin_layout Subsection -Check for support -\end_layout - -\begin_layout Standard -Load module, if so compiled -\end_layout - -\begin_layout Code - -# modprobe ip6_tables -\end_layout - -\begin_layout Standard -Check for capability -\end_layout - -\begin_layout Code - -# [ ! -f /proc/net/ip6_tables_names ] && echo "Current kernel doesn't support -\end_layout - -\begin_layout Code - -¬ 'ip6tables' firewalling (IPv6)!" -\end_layout - -\begin_layout Subsection -Learn how to use ip6tables -\end_layout - -\begin_layout Subsubsection -List all IPv6 netfilter entries -\end_layout - -\begin_layout Itemize -Short -\end_layout - -\begin_layout Code - -# ip6tables -L -\end_layout - -\begin_layout Itemize -Extended -\end_layout - -\begin_layout Code - -# ip6tables -n -v --line-numbers -L -\end_layout - -\begin_layout Subsubsection -List specified filter -\end_layout - -\begin_layout Code - -# ip6tables -n -v --line-numbers -L INPUT -\end_layout - -\begin_layout Subsubsection -Insert a log rule at the input filter with options -\end_layout - -\begin_layout Code - -# ip6tables --table filter --append INPUT -j LOG --log-prefix "INPUT:" -\end_layout - -\begin_layout Code - -¬ --log-level 7 -\end_layout - -\begin_layout Subsubsection -Insert a drop rule at the input filter -\end_layout - -\begin_layout Code - -# ip6tables --table filter --append INPUT -j DROP -\end_layout - -\begin_layout Subsubsection -Delete a rule by number -\end_layout - -\begin_layout Code - -# ip6tables --table filter --delete INPUT 1 -\end_layout - -\begin_layout Subsubsection -Enable connection tracking -\end_layout - -\begin_layout Standard -Since kernel version 2.6.20 IPv6 connection tracking is well supported and - should be used instead of using stateless filter rules. -\end_layout - -\begin_layout Code - -# ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -\end_layout - -\begin_layout Subsubsection -Allow ICMPv6 -\end_layout - -\begin_layout Standard -Using older kernels (unpatched kernel 2.4.5 and iptables-1.2.2) no type can - be specified -\end_layout - -\begin_layout Itemize -Accept incoming ICMPv6 through tunnels -\end_layout - -\begin_layout Code - -# ip6tables -A INPUT -i sit+ -p icmpv6 -j ACCEPT -\end_layout - -\begin_layout Itemize -Allow outgoing ICMPv6 through tunnels -\end_layout - -\begin_layout Code - -# ip6tables -A OUTPUT -o sit+ -p icmpv6 -j ACCEPT -\end_layout - -\begin_layout Standard -Newer kernels allow specifying of ICMPv6 types: -\end_layout - -\begin_layout Code - -# ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j ACCEPT -\end_layout - -\begin_layout Subsubsection -Rate-limiting -\end_layout - -\begin_layout Standard -Because it can happen (author already saw it to times) that an ICMPv6 storm - will raise up, you should use available rate limiting for at least ICMPv6 - ruleset. - In addition logging rules should also get rate limiting to prevent DoS - attacks against syslog and storage of log file partition. - An example for a rate limited ICMPv6 looks like: -\end_layout - -\begin_layout Code - -# ip6tables -A INPUT --protocol icmpv6 --icmpv6-type echo-request -\end_layout - -\begin_layout Code - -¬ -j ACCEPT --match limit --limit 30/minute -\end_layout - -\begin_layout Subsubsection -Allow incoming SSH -\end_layout - -\begin_layout Standard -Here an example is shown for a ruleset which allows incoming SSH connection - from a specified IPv6 address -\end_layout - -\begin_layout Itemize -Allow incoming SSH from 2001:0db8:100::1/128 -\end_layout - -\begin_layout Code - -# ip6tables -A INPUT -i sit+ -p tcp -s 2001:0db8:100::1/128 --sport 512:65535 -\end_layout - -\begin_layout Code - -¬ --dport 22 -j ACCEPT -\end_layout - -\begin_layout Itemize -Allow response packets ( -\series bold -no longer needed if connection tracking is used! -\series default -) -\end_layout - -\begin_layout Code - -# ip6tables -A OUTPUT -o sit+ -p tcp -d 2001:0db8:100::1/128 --dport 512:65535 -\end_layout - -\begin_layout Code - -¬ --sport 22 ! --syn -j ACCEPT -\end_layout - -\begin_layout Subsubsection -Enable tunneled IPv6-in-IPv4 -\end_layout - -\begin_layout Standard -To accept tunneled IPv6-in-IPv4 packets, you have to insert rules in your - -\series bold -IPv4 firewall setup -\series default - relating to such packets, for example -\end_layout - -\begin_layout Itemize -Accept incoming IPv6-in-IPv4 on interface ppp0 -\end_layout - -\begin_layout Code - -# iptables -A INPUT -i ppp0 -p ipv6 -j ACCEPT -\end_layout - -\begin_layout Itemize -Allow outgoing IPv6-in-IPv4 to interface ppp0 -\end_layout - -\begin_layout Code - -# iptables -A OUTPUT -o ppp0 -p ipv6 -j ACCEPT -\end_layout - -\begin_layout Standard -If you have only a static tunnel, you can specify the IPv4 addresses, too, - like -\end_layout - -\begin_layout Itemize -Accept incoming IPv6-in-IPv4 on interface ppp0 from tunnel endpoint 192.0.2.2 -\end_layout - -\begin_layout Code - -# iptables -A INPUT -i ppp0 -p ipv6 -s 192.0.2.2 -j ACCEPT -\end_layout - -\begin_layout Itemize -Allow outgoing IPv6-in-IPv4 to interface ppp0 to tunnel endpoint 1.2.3.4 -\end_layout - -\begin_layout Code - -# iptables -A OUTPUT -o ppp0 -p ipv6 -d 192.0.2.2 -j ACCEPT -\end_layout - -\begin_layout Subsubsection -Protection against incoming TCP connection requests -\end_layout - -\begin_layout Standard - -\series bold -VERY RECOMMENDED! -\series default - For security issues you should really insert a rule which blocks incoming - TCP connection requests. - Adapt "-i" option, if other interface names are in use! -\end_layout - -\begin_layout Itemize -Block incoming TCP connection requests to this host -\end_layout - -\begin_layout Code - -# ip6tables -I INPUT -i sit+ -p tcp --syn -j DROP -\end_layout - -\begin_layout Itemize -Block incoming TCP connection requests to hosts behind this router -\end_layout - -\begin_layout Code - -# ip6tables -I FORWARD -i sit+ -p tcp --syn -j DROP -\end_layout - -\begin_layout Standard -Perhaps the rules have to be placed below others, but that is work you have - to think about it. - Best way is to create a script and execute rules in a specified way. - -\end_layout - -\begin_layout Subsubsection -Protection against incoming UDP connection requests -\end_layout - -\begin_layout Standard - -\series bold -ALSO RECOMMENDED! -\series default - Like mentioned on my firewall information it's possible to control the - ports on outgoing UDP/TCP sessions. - So if all of your local IPv6 systems are using local ports e.g. - from 32768 to 60999 you are able to filter UDP connections also (until - connection tracking works) like: -\end_layout - -\begin_layout Itemize -Block incoming UDP packets which cannot be responses of outgoing requests - of this host -\end_layout - -\begin_layout Code - -# ip6tables -I INPUT -i sit+ -p udp ! --dport 32768:60999 -j DROP -\end_layout - -\begin_layout Itemize -Block incoming UDP packets which cannot be responses of forwarded requests - of hosts behind this router -\end_layout - -\begin_layout Code - -# ip6tables -I FORWARD -i sit+ -p udp ! --dport 32768:60999 -j DROP -\end_layout - -\begin_layout Subsection -Examples -\end_layout - -\begin_layout Subsubsection -Simple example for Fedora -\end_layout - -\begin_layout Standard -Following lines show a simple firewall configuration for Fedora 6 (since - kernel version 2.6.20). - It was modfied from the default one (generated by -\shape italic -system-config-firewall -\shape default -) for supporting connection -\series bold -tracking -\series default - and return the proper ICMPv6 code for rejects. - Incoming SSH (port 22) connections are allowed. -\end_layout - -\begin_layout Code - -File: /etc/sysconfig/ip6tables -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -*filter :INPUT ACCEPT [0:0] -\end_layout - -\begin_layout Code - -:FORWARD ACCEPT [0:0] -\end_layout - -\begin_layout Code - -:OUTPUT ACCEPT [0:0] -\end_layout - -\begin_layout Code - -:RH-Firewall-1-INPUT - [0:0] -\end_layout - -\begin_layout Code - --A INPUT -j RH-Firewall-1-INPUT -\end_layout - -\begin_layout Code - --A FORWARD -j RH-Firewall-1-INPUT -\end_layout - -\begin_layout Code - --A RH-Firewall-1-INPUT -i lo -j ACCEPT -\end_layout - -\begin_layout Code - --A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT -\end_layout - -\begin_layout Code - --A RH-Firewall-1-INPUT -p 50 -j ACCEPT -\end_layout - -\begin_layout Code - --A RH-Firewall-1-INPUT -p 51 -j ACCEPT -\end_layout - -\begin_layout Code - --A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT -\end_layout - -\begin_layout Code - --A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT -\end_layout - -\begin_layout Code - --A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT -\end_layout - -\begin_layout Code - --A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -\end_layout - -\begin_layout Code - --A RH-Firewall-1-INPUT -m state --state NEW -p tcp --dport 22 -j ACCEPT -\end_layout - -\begin_layout Code - --A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited -\end_layout - -\begin_layout Code - -COMMIT -\end_layout - -\begin_layout Standard -For completeness also the IPv4 configuration is shown here: -\end_layout - -\begin_layout Code - -File: /etc/sysconfig/iptables -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -*filter :INPUT ACCEPT [0:0] -\end_layout - -\begin_layout Code - -:FORWARD ACCEPT [0:0] -\end_layout - -\begin_layout Code - -:OUTPUT ACCEPT [0:0] -\end_layout - -\begin_layout Code - -:RH-Firewall-1-INPUT - [0:0] -\end_layout - -\begin_layout Code - --A INPUT -j RH-Firewall-1-INPUT -\end_layout - -\begin_layout Code - --A FORWARD -j RH-Firewall-1-INPUT -\end_layout - -\begin_layout Code - --A RH-Firewall-1-INPUT -i lo -j ACCEPT -\end_layout - -\begin_layout Code - --A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT -\end_layout - -\begin_layout Code - --A RH-Firewall-1-INPUT -p 50 -j ACCEPT -\end_layout - -\begin_layout Code - --A RH-Firewall-1-INPUT -p 51 -j ACCEPT -\end_layout - -\begin_layout Code - --A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT -\end_layout - -\begin_layout Code - --A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT -\end_layout - -\begin_layout Code - --A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT -\end_layout - -\begin_layout Code - --A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -\end_layout - -\begin_layout Code - --A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j - ACCEPT -\end_layout - -\begin_layout Code - --A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited -\end_layout - -\begin_layout Code - -COMMIT -\end_layout - -\begin_layout Standard -Usage: -\end_layout - -\begin_layout Itemize -Create/modify the configuration files -\end_layout - -\begin_layout Itemize -Activate IPv4 & IPv6 firewalling -\end_layout - -\begin_layout Code - -# service iptables start -\end_layout - -\begin_layout Code - -# service ip6tables start -\end_layout - -\begin_layout Itemize -Enable automatic start after reboot -\end_layout - -\begin_layout Code - -# chkconfig iptables on -\end_layout - -\begin_layout Code - -# chkconfig ip6tables on -\end_layout - -\begin_layout Subsubsection -Sophisticated example -\end_layout - -\begin_layout Standard -Following lines show a more sophisticated -\series bold -but still stateless filter -\series default - setup as an example. - Happy netfilter6 ruleset creation.... - -\end_layout - -\begin_layout Code - -# ip6tables -n -v -L -\end_layout - -\begin_layout Code - -Chain INPUT (policy DROP 0 packets, 0 bytes) -\end_layout - -\begin_layout Code - - pkts bytes target prot opt in out source destination -\end_layout - -\begin_layout Code - - 0 0 extIN all sit+ * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 4 384 intIN all eth0 * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 ACCEPT all * * ::1/128 ::1/128 - -\end_layout - -\begin_layout Code - - 0 0 ACCEPT all lo * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 LOG all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ LOG flags 0 level 7 prefix `INPUT-default:' -\end_layout - -\begin_layout Code - - 0 0 DROP all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Code - -Chain FORWARD (policy DROP 0 packets, 0 bytes) -\end_layout - -\begin_layout Code - - pkts bytes target prot opt in out source destination -\end_layout - -\begin_layout Code - -¬ -\end_layout - -\begin_layout Code - - 0 0 int2ext all eth0 sit+ ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 ext2int all sit+ eth0 ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 LOG all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ LOG flags 0 level 7 prefix `FORWARD-default:' -\end_layout - -\begin_layout Code - - 0 0 DROP all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Code - -Chain OUTPUT (policy DROP 0 packets, 0 bytes) -\end_layout - -\begin_layout Code - - pkts bytes target prot opt in out source destination -\end_layout - -\begin_layout Code - -¬ -\end_layout - -\begin_layout Code - - 0 0 extOUT all * sit+ ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 4 384 intOUT all * eth0 ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 ACCEPT all * * ::1/128 ::1/128 - -\end_layout - -\begin_layout Code - - 0 0 ACCEPT all * lo ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 LOG all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ LOG flags 0 level 7 prefix `OUTPUT-default:' -\end_layout - -\begin_layout Code - - 0 0 DROP all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Code - -Chain ext2int (1 references) -\end_layout - -\begin_layout Code - - pkts bytes target prot opt in out source destination -\end_layout - -\begin_layout Code - -¬ -\end_layout - -\begin_layout Code - - 0 0 ACCEPT icmpv6 * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 ACCEPT tcp * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ tcp spts:1:65535 dpts:1024:65535 flags:!0x16/0x02 -\end_layout - -\begin_layout Code - - 0 0 LOG all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ LOG flags 0 level 7 prefix `ext2int-default:' -\end_layout - -\begin_layout Code - - 0 0 DROP tcp * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 DROP udp * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 DROP all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Code - -Chain extIN (1 references) -\end_layout - -\begin_layout Code - - pkts bytes target prot opt in out source destination -\end_layout - -\begin_layout Code - -¬ -\end_layout - -\begin_layout Code - - 0 0 ACCEPT tcp * * 3ffe:400:100::1/128 ::/0 - -\end_layout - -\begin_layout Code - -¬ tcp spts:512:65535 dpt:22 -\end_layout - -\begin_layout Code - - 0 0 ACCEPT tcp * * 3ffe:400:100::2/128 ::/0 - -\end_layout - -\begin_layout Code - -¬ tcp spts:512:65535 dpt:22 -\end_layout - -\begin_layout Code - - 0 0 ACCEPT icmpv6 * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 ACCEPT tcp * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ tcp spts:1:65535 dpts:1024:65535 flags:!0x16/0x02 -\end_layout - -\begin_layout Code - - 0 0 ACCEPT udp * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ udp spts:1:65535 dpts:1024:65535 -\end_layout - -\begin_layout Code - - 0 0 LOG all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ limit: avg 5/min burst 5 LOG flags 0 level 7 prefix `extIN-default:' - -\end_layout - -\begin_layout Code - - 0 0 DROP all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Code - -Chain extOUT (1 references) -\end_layout - -\begin_layout Code - - pkts bytes target prot opt in out source destination -\end_layout - -\begin_layout Code - -¬ -\end_layout - -\begin_layout Code - - 0 0 ACCEPT tcp * * ::/0 -\end_layout - -\begin_layout Code - -¬ 2001:0db8:100::1/128tcp spt:22 dpts:512:65535 flags:!0x16/0x02 -\end_layout - -\begin_layout Code - - 0 0 ACCEPT tcp * * ::/0 -\end_layout - -\begin_layout Code - -¬ 2001:0db8:100::2/128tcp spt:22 dpts:512:65535 flags:!0x16/0x02 -\end_layout - -\begin_layout Code - - 0 0 ACCEPT icmpv6 * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 ACCEPT tcp * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ tcp spts:1024:65535 dpts:1:65535 -\end_layout - -\begin_layout Code - - 0 0 ACCEPT udp * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ udp spts:1024:65535 dpts:1:65535 -\end_layout - -\begin_layout Code - - 0 0 LOG all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ LOG flags 0 level 7 prefix `extOUT-default:' -\end_layout - -\begin_layout Code - - 0 0 DROP all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Code - -Chain int2ext (1 references) -\end_layout - -\begin_layout Code - - pkts bytes target prot opt in out source destination -\end_layout - -\begin_layout Code - -¬ -\end_layout - -\begin_layout Code - - 0 0 ACCEPT icmpv6 * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 ACCEPT tcp * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ tcp spts:1024:65535 dpts:1:65535 -\end_layout - -\begin_layout Code - - 0 0 LOG all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ LOG flags 0 level 7 prefix `int2ext:' -\end_layout - -\begin_layout Code - - 0 0 DROP all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 LOG all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ LOG flags 0 level 7 prefix `int2ext-default:' -\end_layout - -\begin_layout Code - - 0 0 DROP tcp * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 DROP udp * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - 0 0 DROP all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Code - -Chain intIN (1 references) -\end_layout - -\begin_layout Code - - pkts bytes target prot opt in out source destination -\end_layout - -\begin_layout Code - -¬ -\end_layout - -\begin_layout Code - - 0 0 ACCEPT all * * ::/0 -\end_layout - -\begin_layout Code - -¬ fe80::/ffc0:: -\end_layout - -\begin_layout Code - - 4 384 ACCEPT all * * ::/0 ff02::/16 - -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Code - -Chain intOUT (1 references) -\end_layout - -\begin_layout Code - - pkts bytes target prot opt in out source destination -\end_layout - -\begin_layout Code - -¬ -\end_layout - -\begin_layout Code - - 0 0 ACCEPT all * * ::/0 -\end_layout - -\begin_layout Code - -¬ fe80::/ffc0:: -\end_layout - -\begin_layout Code - - 4 384 ACCEPT all * * ::/0 ff02::/16 - -\end_layout - -\begin_layout Code - - 0 0 LOG all * * ::/0 ::/0 - -\end_layout - -\begin_layout Code - -¬ LOG flags 0 level 7 prefix `intOUT-default:' -\end_layout - -\begin_layout Code - - 0 0 DROP all * * ::/0 ::/0 - -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-security" - -\end_inset - -Security -\end_layout - -\begin_layout Section -Node security -\end_layout - -\begin_layout Standard -It's very recommended to apply all available patches and disable all not - necessary services. - Also bind services to the needed IPv4/IPv6 addresses only and install local - firewalling. -\end_layout - -\begin_layout Standard -More to be filled... -\end_layout - -\begin_layout Section -Access limitations -\end_layout - -\begin_layout Standard -Many services uses the tcp_wrapper library for access control. - Below is described the -\begin_inset CommandInset ref -LatexCommand ref -name "use of tcp_wrapper" -reference "hints-daemons-tcpwrapper" - -\end_inset - -. -\end_layout - -\begin_layout Standard -More to be filled... -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "IPv6-security-auditing" - -\end_inset - -IPv6 security auditing -\end_layout - -\begin_layout Standard -Currently there are no comfortable tools out which are able to check a system - over network for IPv6 security issues. - Neither -\begin_inset CommandInset href -LatexCommand href -name "Nessus" -target "http://www.nessus.org/" - -\end_inset - - nor any commercial security scanner is as far as I know able to scan IPv6 - addresses. -\end_layout - -\begin_layout Subsection -Legal issues -\end_layout - -\begin_layout Standard -ATTENTION: always take care that you only scan your own systems or after - receiving a written order, otherwise legal issues are able to come up to - you. -\begin_inset Newline newline -\end_inset - -CHECK destination IPv6 addresses TWICE before starting a scan. -\end_layout - -\begin_layout Subsection -Security auditing using IPv6-enabled netcat -\end_layout - -\begin_layout Standard -With the IPv6-enabled netcat (see -\begin_inset CommandInset href -LatexCommand href -name "IPv6+Linux-status-apps/security-auditing" -target "http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status-apps.html#security-auditing" - -\end_inset - - for more) you can run a portscan by wrapping a script around which run - through a port range, grab banners and so on. - Usage example: -\end_layout - -\begin_layout Code - -# nc6 ::1 daytime -\end_layout - -\begin_layout Code - -13 JUL 2002 11:22:22 CEST -\end_layout - -\begin_layout Subsection -Security auditing using IPv6-enabled nmap -\end_layout - -\begin_layout Standard -\begin_inset CommandInset href -LatexCommand href -name "NMap" -target "http://www.insecure.org/nmap/" - -\end_inset - -, one of the best portscaner around the world, supports IPv6 since version - 3.10ALPHA1. - Usage example: -\end_layout - -\begin_layout Code - -# nmap -6 -sT ::1 -\end_layout - -\begin_layout Code - -Starting nmap V. - 3.10ALPHA3 ( www.insecure.org/nmap/ ) -\end_layout - -\begin_layout Code - -Interesting ports on localhost6 (::1): -\end_layout - -\begin_layout Code - -(The 1600 ports scanned but not shown below are in state: closed) -\end_layout - -\begin_layout Code - -Port State Service -\end_layout - -\begin_layout Code - -22/tcp open ssh -\end_layout - -\begin_layout Code - -53/tcp open domain -\end_layout - -\begin_layout Code - -515/tcp open printer -\end_layout - -\begin_layout Code - -2401/tcp open cvspserver -\end_layout - -\begin_layout Code - -Nmap run completed -- 1 IP address (1 host up) scanned in 0.525 seconds -\end_layout - -\begin_layout Subsection -Security auditing using IPv6-enabled strobe -\end_layout - -\begin_layout Standard -Strobe is a (compared to NMap) more a low budget portscanner, but there - is an IPv6-enabling patch available (see -\begin_inset CommandInset href -LatexCommand href -name "IPv6+Linux-status-apps/security-auditing" -target "http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status-apps.html#security-auditing" - -\end_inset - - for more). - Usage example: -\end_layout - -\begin_layout Code - -# ./strobe ::1 strobe 1.05 (c) 1995-1999 Julian Assange . -\end_layout - -\begin_layout Code - -::1 2401 unassigned unknown -\end_layout - -\begin_layout Code - -::1 22 ssh Secure Shell - RSA encrypted rsh -\end_layout - -\begin_layout Code - -::1 515 printer spooler (lpd) -\end_layout - -\begin_layout Code - -::1 6010 unassigned unknown -\end_layout - -\begin_layout Code - -::1 53 domain Domain Name Server -\end_layout - -\begin_layout Standard -Note: strobe isn't really developed further on, the shown version number - isn't the right one. -\end_layout - -\begin_layout Subsection -Audit results -\end_layout - -\begin_layout Standard -If the result of an audit mismatch your IPv6 security policy, use IPv6 firewalli -ng to close the holes, e.g. - using netfilter6 (see -\begin_inset CommandInset ref -LatexCommand ref -name "Firewalling/Netfilter6" -reference "firewalling-netfilter6" - -\end_inset - - for more). -\end_layout - -\begin_layout Standard -Info: More detailed information concerning IPv6 Security can be found here: - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IETF drafts - IPv6 Operations (v6ops)" -target "http://www.ietf.org/ids.by.wg/v6ops.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "RFC 3964 / Security Considerations for 6to4" -target "http://www.faqs.org/rfcs/rfc3964.html" - -\end_inset - - -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-encryption-authentication" - -\end_inset - -Encryption and Authentication -\end_layout - -\begin_layout Standard -Unlike in IPv4, encryption and authentication is a mandatory feature of - IPv6. - Those features are normally implemented using IPsec (which can be also - used by IPv4). -\end_layout - -\begin_layout Section -Modes of using encryption and authentication -\end_layout - -\begin_layout Standard -Two modes of encryption and authentication of a connection are possible: -\end_layout - -\begin_layout Subsection -Transport mode -\end_layout - -\begin_layout Standard -Transport mode is a real end-to-end connection mode. - Here, only the payload (usually ICMP, TCP or UDP) is encrypted with their - particular header, while the IP header is not encrypted (but usually included - in authentication). -\end_layout - -\begin_layout Standard -Using AES-128 for encryption and SHA1 for authentication, this mode decreases - the MTU by 42 octets. -\end_layout - -\begin_layout Subsection -Tunnel mode -\end_layout - -\begin_layout Standard -Tunnel mode can be used either for end-to-end or for gateway-to-gateway - connection modes. - Here, the complete IP packet is being encrypted and gets a new IP header - prepended, all together constituing a new IP packet (this mechanism is - also known as "encapsulation") -\end_layout - -\begin_layout Standard -This mode usually decreases the MTU by 40 octets from the MTU of transport - mode. - I.e. - using AES-128 for encryption and SHA1 for authentication 82 octets less - than the normal MTU. -\end_layout - -\begin_layout Section -Support in kernel (ESP and AH) -\end_layout - -\begin_layout Subsection -Support in vanilla Linux kernel 2.4.x -\end_layout - -\begin_layout Standard -At the time of writing missing in vanilla up to 2.4.28. - There was an issue about keeping the Linux kernel source free of export/import- -control-laws regarding encryption code. - This is also one case why -\begin_inset CommandInset href -LatexCommand href -name "FreeS/WAN project" -target "http://www.freeswan.org/" - -\end_inset - - wasn't included in vanilla source. - Perhaps a backport from 2.6.x will be done in the future. -\end_layout - -\begin_layout Subsection -Support in vanilla Linux kernel 2.6.x -\end_layout - -\begin_layout Standard -Current versions (as time of writing 2.6.9 and upper) support native IPsec - for IPv4 and IPv6. -\end_layout - -\begin_layout Standard -Implementation was helped by the USAGI project. -\end_layout - -\begin_layout Section -Automatic key exchange (IKE) -\end_layout - -\begin_layout Standard -IPsec requires a key exchange of a secret. - This is mostly done automatically by so called IKE daemons. - They also handle the authentication of the peers, either by a common known - secret (so called -\begin_inset Quotes sld -\end_inset - -pre-shared secret -\begin_inset Quotes srd -\end_inset - -) or by RSA keys (which can also be used from X.509 certificates). -\end_layout - -\begin_layout Standard -Currently, two different IKE daemons are available for Linux, which totally - differ in configuration and usage. -\end_layout - -\begin_layout Standard -I prefer -\begin_inset Quotes sld -\end_inset - -pluto -\begin_inset Quotes srd -\end_inset - - from the *S/WAN implementation because of the easier and one-config-only - setup. -\end_layout - -\begin_layout Subsection -IKE daemon -\begin_inset Quotes sld -\end_inset - -racoon -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -The IKE daemon -\begin_inset Quotes sld -\end_inset - -racoon -\begin_inset Quotes srd -\end_inset - - is taken from the KAME project and ported to Linux. - Modern Linux distributions contain this daemon in the package -\begin_inset Quotes sld -\end_inset - -ipsec-tools -\begin_inset Quotes srd -\end_inset - -. - Two executables are required for a proper IPsec setup. - Take a look on -\begin_inset CommandInset href -LatexCommand href -name "Linux Advanced Routing & Traffic Control HOWTO / IPSEC" -target "http://lartc.org/howto/lartc.ipsec.html" - -\end_inset - -, too. -\end_layout - -\begin_layout Subsubsection -Manipulation of the IPsec SA/SP database with the tool -\begin_inset Quotes sld -\end_inset - -setkey -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset Quotes sld -\end_inset - -setkey -\begin_inset Quotes srd -\end_inset - - is important to define the security policy (SP) for the kernel. -\end_layout - -\begin_layout Standard -File: /etc/racoon/setkey.sh -\end_layout - -\begin_layout Itemize -Example for an end-to-end encrypted connection in transport mode -\end_layout - -\begin_layout Code - -#!/sbin/setkey -f -\end_layout - -\begin_layout Code - -flush; -\end_layout - -\begin_layout Code - -spdflush; -\end_layout - -\begin_layout Code - -spdadd 2001:db8:1:1::1 2001:db8:2:2::2 any -P out ipsec esp/transport//require; -\end_layout - -\begin_layout Code - -spdadd 2001:db8:2:2::2 2001:db8:1:1::1 any -P in ipsec esp/transport//require; -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Itemize -Example for a end-to-end encrypted connection in tunnel mode -\end_layout - -\begin_layout Code - -#!/sbin/setkey -f -\end_layout - -\begin_layout Code - -flush; -\end_layout - -\begin_layout Code - -spdflush; -\end_layout - -\begin_layout Code - -spdadd 2001:db8:1:1::1 2001:db8:2:2::2 any -P out ipsec -\end_layout - -\begin_layout Code - -¬ esp/tunnel/2001:db8:1:1::1-2001:db8:2:2::2/require; -\end_layout - -\begin_layout Code - -spdadd 2001:db8:2:2::2 2001:db8:1:1::1 any -P in ipsec -\end_layout - -\begin_layout Code - -¬ esp/tunnel/2001:db8:2:2::2-2001:db8:1:1::1/require; -\end_layout - -\begin_layout Standard -For the other peer, you have to replace -\begin_inset Quotes sld -\end_inset - -in -\begin_inset Quotes srd -\end_inset - - with -\begin_inset Quotes sld -\end_inset - -out -\begin_inset Quotes srd -\end_inset - -. -\end_layout - -\begin_layout Subsubsection -Configuration of the IKE daemon -\begin_inset Quotes sld -\end_inset - -racoon -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset Quotes sld -\end_inset - -racoon -\begin_inset Quotes srd -\end_inset - - requires a configuration file for proper execution. - It includes the related settings to the security policy, which should be - set up previously using -\begin_inset Quotes sld -\end_inset - -setkey -\begin_inset Quotes srd -\end_inset - -. -\end_layout - -\begin_layout Standard -File: /etc/racoon/racoon.conf -\end_layout - -\begin_layout Code - -# Racoon IKE daemon configuration file. -\end_layout - -\begin_layout Code - -# See 'man racoon.conf' for a description of the format and entries. -\end_layout - -\begin_layout Code - -path include "/etc/racoon"; -\end_layout - -\begin_layout Code - -path pre_shared_key "/etc/racoon/psk.txt"; -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -listen -\end_layout - -\begin_layout Code - -{ -\end_layout - -\begin_layout Code - - isakmp 2001:db8:1:1::1; -\end_layout - -\begin_layout Code - -} -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -remote 2001:db8:2:2::2 -\end_layout - -\begin_layout Code - -{ -\end_layout - -\begin_layout Code - - exchange_mode main; -\end_layout - -\begin_layout Code - - lifetime time 24 hour; -\end_layout - -\begin_layout Code - - proposal -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - encryption_algorithm 3des; -\end_layout - -\begin_layout Code - - hash_algorithm md5; -\end_layout - -\begin_layout Code - - authentication_method pre_shared_key; -\end_layout - -\begin_layout Code - - dh_group 2; -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - -} -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# gateway-to-gateway -\end_layout - -\begin_layout Code - -sainfo address 2001:db8:1:1::1 any address 2001:db8:2:2::2 any -\end_layout - -\begin_layout Code - -{ -\end_layout - -\begin_layout Code - - lifetime time 1 hour; -\end_layout - -\begin_layout Code - - encryption_algorithm 3des; -\end_layout - -\begin_layout Code - - authentication_algorithm hmac_md5; -\end_layout - -\begin_layout Code - - compression_algorithm deflate; -\end_layout - -\begin_layout Code - -} -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -sainfo address 2001:db8:2:2::2 any address 2001:db8:1:1::1 any -\end_layout - -\begin_layout Code - -{ -\end_layout - -\begin_layout Code - - lifetime time 1 hour; -\end_layout - -\begin_layout Code - - encryption_algorithm 3des; -\end_layout - -\begin_layout Code - - authentication_algorithm hmac_md5; -\end_layout - -\begin_layout Code - - compression_algorithm deflate; -\end_layout - -\begin_layout Code - -} -\end_layout - -\begin_layout Standard -Also set up the pre-shared secret: -\end_layout - -\begin_layout Standard -File: /etc/racoon/psk.txt -\end_layout - -\begin_layout Code - -# file for pre-shared keys used for IKE authentication -\end_layout - -\begin_layout Code - -# format is: 'identifier' 'key' -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -2001:db8:2:2::2 verysecret -\end_layout - -\begin_layout Subsubsection -Running IPsec with IKE daemon -\begin_inset Quotes sld -\end_inset - -racoon -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -At least the daemon needs to be started. - For the first time, use debug and foreground mode. - The following example shows a successful IKE phase 1 (ISAKMP-SA) and 2 - (IPsec-SA) negotiation: -\end_layout - -\begin_layout Code - -# racoon -F -v -f /etc/racoon/racoon.conf -\end_layout - -\begin_layout Code - -Foreground mode. - -\end_layout - -\begin_layout Code - -2005-01-01 20:30:15: INFO: @(#)ipsec-tools 0.3.3 -\end_layout - -\begin_layout Code - -¬ (http://ipsec-tools.sourceforge.net) -\end_layout - -\begin_layout Code - -2005-01-01 20:30:15: INFO: @(#)This product linked -\end_layout - -\begin_layout Code - -¬ OpenSSL 0.9.7a Feb 19 2003 (http://www.openssl.org/) -\end_layout - -\begin_layout Code - -2005-01-01 20:30:15: INFO: 2001:db8:1:1::1[500] used as isakmp port (fd=7) -\end_layout - -\begin_layout Code - -2005-01-01 20:31:06: INFO: IPsec-SA request for 2001:db8:2:2::2 -\end_layout - -\begin_layout Code - -¬ queued due to no phase1 found. -\end_layout - -\begin_layout Code - -2005-01-01 20:31:06: INFO: initiate new phase 1 negotiation: -\end_layout - -\begin_layout Code - -¬ 2001:db8:1:1::1[500]<=>2001:db8:2:2::2[500] -\end_layout - -\begin_layout Code - -2005-01-01 20:31:06: INFO: begin Identity Protection mode. -\end_layout - -\begin_layout Code - -2005-01-01 20:31:09: INFO: ISAKMP-SA established -\end_layout - -\begin_layout Code - -¬ 2001:db8:1:1::1[500]-2001:db8:2:2::2[500] spi:da3d3693289c9698:ac039a402b2db40 -1 -\end_layout - -\begin_layout Code - -2005-01-01 20:31:09: INFO: initiate new phase 2 negotiation: -\end_layout - -\begin_layout Code - -¬ 2001:6f8:900:94::2[0]<=>2001:db8:2:2::2[0] -\end_layout - -\begin_layout Code - -2005-01-01 20:31:10: INFO: IPsec-SA established: -\end_layout - -\begin_layout Code - -¬ ESP/Tunnel 2001:db8:2:2::2->2001:db8:1:1::1 spi=253935531(0xf22bfab) -\end_layout - -\begin_layout Code - -2005-01-01 20:31:10: INFO: IPsec-SA established: -\end_layout - -\begin_layout Code - -¬ ESP/Tunnel 2001:db8:1:1::1->2001:db8:2:2::2 spi=175002564(0xa6e53c4) -\end_layout - -\begin_layout Standard -Each direction got its own IPsec-SA (like defined in the IPsec standard). - With -\begin_inset Quotes sld -\end_inset - -tcpdump -\begin_inset Quotes srd -\end_inset - - on the related interface, you will see as result of an IPv6 ping: -\end_layout - -\begin_layout Code - -20:35:55.305707 2001:db8:1:1::1 > 2001:db8:2:2::2: ESP(spi=0x0a6e53c4,seq=0x3) -\end_layout - -\begin_layout Code - -20:35:55.537522 2001:db8:2:2::2 > 2001:db8:1:1::1: ESP(spi=0x0f22bfab,seq=0x3) -\end_layout - -\begin_layout Standard -As expected, the negotiated SPIs are being used here. -\end_layout - -\begin_layout Standard -And using -\begin_inset Quotes sld -\end_inset - -setkey -\begin_inset Quotes srd -\end_inset - -, current active parameters are shown: -\end_layout - -\begin_layout Code - -# setkey -D -\end_layout - -\begin_layout Code - -2001:db8:1:1::1 2001:db8:2:2::2 -\end_layout - -\begin_layout Code - - esp mode=tunnel spi=175002564(0x0a6e53c4) reqid=0(0x00000000) -\end_layout - -\begin_layout Code - - E: 3des-cbc bd26bc45 aea0d249 ef9c6b89 7056080f 5d9fa49c 924e2edd -\end_layout - -\begin_layout Code - - A: hmac-md5 60c2c505 517dd8b7 c9609128 a5efc2db -\end_layout - -\begin_layout Code - - seq=0x00000000 replay=4 flags=0x00000000 state=mature -\end_layout - -\begin_layout Code - - created: Jan 1 20:31:10 2005 current: Jan 1 20:40:47 2005 -\end_layout - -\begin_layout Code - - diff: 577(s) hard: 3600(s) soft: 2880(s) -\end_layout - -\begin_layout Code - - last: Jan 1 20:35:05 2005 hard: 0(s) soft: 0(s) -\end_layout - -\begin_layout Code - - current: 540(bytes) hard: 0(bytes) soft: 0(bytes) -\end_layout - -\begin_layout Code - - allocated: 3 hard: 0 soft: 0 -\end_layout - -\begin_layout Code - - sadb_seq=1 pid=22358 refcnt=0 -\end_layout - -\begin_layout Code - -2001:db8:2:2::2 2001:db8:1:1::1 -\end_layout - -\begin_layout Code - - esp mode=tunnel spi=253935531(0x0f22bfab) reqid=0(0x00000000) -\end_layout - -\begin_layout Code - - E: 3des-cbc c1ddba65 83debd62 3f6683c1 20e747ac 933d203f 4777a7ce -\end_layout - -\begin_layout Code - - A: hmac-md5 3f957db9 9adddc8c 44e5739d 3f53ca0e -\end_layout - -\begin_layout Code - - seq=0x00000000 replay=4 flags=0x00000000 state=mature -\end_layout - -\begin_layout Code - - created: Jan 1 20:31:10 2005 current: Jan 1 20:40:47 2005 -\end_layout - -\begin_layout Code - - diff: 577(s) hard: 3600(s) soft: 2880(s) -\end_layout - -\begin_layout Code - - last: Jan 1 20:35:05 2005 hard: 0(s) soft: 0(s) -\end_layout - -\begin_layout Code - - current: 312(bytes) hard: 0(bytes) soft: 0(bytes) -\end_layout - -\begin_layout Code - - allocated: 3 hard: 0 soft: 0 -\end_layout - -\begin_layout Code - - sadb_seq=0 pid=22358 refcnt=0 -\end_layout - -\begin_layout Subsection -IKE daemon -\begin_inset Quotes sld -\end_inset - -pluto -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -The IKE daemon -\begin_inset Quotes sld -\end_inset - -pluto -\begin_inset Quotes srd -\end_inset - - is included in distributions of the *S/WAN projects. - *S/WAN project starts at the beginning as -\begin_inset CommandInset href -LatexCommand href -name "FreeS/WAN" -target "http://www.freeswan.org/" - -\end_inset - -. - Unfortunately, the FreeS/WAN project stopped further development in 2004. - Because of the slow pace of development in the past, two spin-offs started: - -\begin_inset CommandInset href -LatexCommand href -name "strongSwan" -target "http://www.strongswan.org/" - -\end_inset - - and -\begin_inset CommandInset href -LatexCommand href -name "Openswan" -target "http://www.openswan.org/" - -\end_inset - -. - Today, readily installable packages are available for at least Openswan - (included in Fedora Core 3). -\end_layout - -\begin_layout Standard -A major difference to -\begin_inset Quotes sld -\end_inset - -racoon -\begin_inset Quotes srd -\end_inset - -, only one configuration file is required. - Also, an initscript exists for automatic setup after booting. -\end_layout - -\begin_layout Subsubsection -Configuration of the IKE daemon -\begin_inset Quotes sld -\end_inset - -pluto -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -The configuration is very similar to the IPv4 one, only one important option - is necessary. -\end_layout - -\begin_layout Standard -File: /etc/ipsec.conf -\end_layout - -\begin_layout Code - -# /etc/ipsec.conf - Openswan IPsec configuration file -\end_layout - -\begin_layout Code - -# -\end_layout - -\begin_layout Code - -# Manual: ipsec.conf.5 -\end_layout - -\begin_layout Code - -version 2.0 # conforms to second version of ipsec.conf specification -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# basic configuration -\end_layout - -\begin_layout Code - -config setup -\end_layout - -\begin_layout Code - - # Debug-logging controls: "none" for (almost) none, "all" for lots. -\end_layout - -\begin_layout Code - - # klipsdebug=none -\end_layout - -\begin_layout Code - - # plutodebug="control parsing" -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -#Disable Opportunistic Encryption -\end_layout - -\begin_layout Code - -include /etc/ipsec.d/examples/no_oe.conf -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -conn ipv6-p1-p2 -\end_layout - -\begin_layout Code - - connaddrfamily=ipv6 # Important for IPv6! -\end_layout - -\begin_layout Code - - left=2001:db8:1:1::1 -\end_layout - -\begin_layout Code - - right=2001:db8:2:2::2 -\end_layout - -\begin_layout Code - - authby=secret -\end_layout - -\begin_layout Code - - esp=aes128-sha1 -\end_layout - -\begin_layout Code - - ike=aes128-sha-modp1024 -\end_layout - -\begin_layout Code - - type=transport -\end_layout - -\begin_layout Code - - #type=tunnel -\end_layout - -\begin_layout Code - - compress=no -\end_layout - -\begin_layout Code - - #compress=yes -\end_layout - -\begin_layout Code - - auto=add -\end_layout - -\begin_layout Code - - #auto=start -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Standard -Don't forget to define the pre-shared secret here also. -\end_layout - -\begin_layout Standard -File: /etc/ipsec.secrets -\end_layout - -\begin_layout Code - -2001:db8:1:1::1 2001:db8:2:2::2 : PSK "verysecret" -\end_layout - -\begin_layout Subsubsection -Running IPsec with IKE daemon -\begin_inset Quotes sld -\end_inset - -pluto -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -If installation of Openswan was successfully, an initscript should exist - for starting IPsec, simply run (on each peer): -\end_layout - -\begin_layout Code - -# /etc/rc.d/init.d/ipsec start -\end_layout - -\begin_layout Standard -Afterwards, start this connection on one peer. - If you saw the line -\begin_inset Quotes sld -\end_inset - -IPsec SA established -\begin_inset Quotes srd -\end_inset - -, all worked fine. -\end_layout - -\begin_layout Code - -# ipsec auto --up ipv6-peer1-peer2 -\end_layout - -\begin_layout Code - -104 "ipv6-p1-p2" #1: STATE_MAIN_I1: initiate -\end_layout - -\begin_layout Code - -106 "ipv6-p1-p2" #1: STATE_MAIN_I2: sent MI2, expecting MR2 -\end_layout - -\begin_layout Code - -108 "ipv6-p1-p2" #1: STATE_MAIN_I3: sent MI3, expecting MR3 -\end_layout - -\begin_layout Code - -004 "ipv6-p1-p2" #1: STATE_MAIN_I4: ISAKMP SA established -\end_layout - -\begin_layout Code - -112 "ipv6-p1-p2" #2: STATE_QUICK_I1: initiate -\end_layout - -\begin_layout Code - -004 "ipv6-p1-p2" #2: STATE_QUICK_I2: sent QI2, -\end_layout - -\begin_layout Code - -¬ IPsec SA established {ESP=>0xa98b7710 <0xa51e1f22} -\end_layout - -\begin_layout Standard -Because *S/WAN and setkey/racoon do use the same IPsec implementation in - Linux 2.6.x kernel, -\begin_inset Quotes sld -\end_inset - -setkey -\begin_inset Quotes srd -\end_inset - - can be used here too to show current active parameters: -\end_layout - -\begin_layout Code - -# setkey -D -\end_layout - -\begin_layout Code - -2001:db8:1:1::1 2001:db8:2:2::2 -\end_layout - -\begin_layout Code - - esp mode=transport spi=2844489488(0xa98b7710) reqid=16385(0x00004001) -\end_layout - -\begin_layout Code - - E: aes-cbc 082ee274 2744bae5 7451da37 1162b483 -\end_layout - -\begin_layout Code - - A: hmac-sha1 b7803753 757417da 477b1c1a 64070455 ab79082c -\end_layout - -\begin_layout Code - - seq=0x00000000 replay=64 flags=0x00000000 state=mature -\end_layout - -\begin_layout Code - - created: Jan 1 21:16:32 2005 current: Jan 1 21:22:20 2005 -\end_layout - -\begin_layout Code - - diff: 348(s) hard: 0(s) soft: 0(s) -\end_layout - -\begin_layout Code - - last: hard: 0(s) soft: 0(s) -\end_layout - -\begin_layout Code - - current: 0(bytes) hard: 0(bytes) soft: 0(bytes) -\end_layout - -\begin_layout Code - - allocated: 0 hard: 0 soft: 0 -\end_layout - -\begin_layout Code - - sadb_seq=1 pid=23825 refcnt=0 -\end_layout - -\begin_layout Code - -2001:db8:2:2::2 2001:db8:1:1::1 -\end_layout - -\begin_layout Code - - esp mode=transport spi=2770214690(0xa51e1f22) reqid=16385(0x00004001) -\end_layout - -\begin_layout Code - - E: aes-cbc 6f59cc30 8d856056 65e07b76 552cac18 -\end_layout - -\begin_layout Code - - A: hmac-sha1 c7c7d82b abfca8b1 5440021f e0c3b335 975b508b -\end_layout - -\begin_layout Code - - seq=0x00000000 replay=64 flags=0x00000000 state=mature -\end_layout - -\begin_layout Code - - created: Jan 1 21:16:31 2005 current: Jan 1 21:22:20 2005 -\end_layout - -\begin_layout Code - - diff: 349(s) hard: 0(s) soft: 0(s) -\end_layout - -\begin_layout Code - - last: hard: 0(s) soft: 0(s) -\end_layout - -\begin_layout Code - - current: 0(bytes) hard: 0(bytes) soft: 0(bytes) -\end_layout - -\begin_layout Code - - allocated: 0 hard: 0 soft: 0 -\end_layout - -\begin_layout Code - - sadb_seq=0 pid=23825 refcnt=0 -\end_layout - -\begin_layout Section -Additional informations: -\end_layout - -\begin_layout Standard -On Linux Kernel 2.6.x you can get the policy and status of IPsec also using - -\begin_inset Quotes sld -\end_inset - -ip -\begin_inset Quotes srd -\end_inset - -: -\end_layout - -\begin_layout Code - -# ip xfrm policy -\end_layout - -\begin_layout Code - -... -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -# ip xfrm state -\end_layout - -\begin_layout Code - -... -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-qos" - -\end_inset - -Quality of Service (QoS) -\end_layout - -\begin_layout Standard -IPv6 supports QoS with use of Flow Labels and Traffic Classes. -\end_layout - -\begin_layout Standard -Additional infos: -\end_layout - -\begin_layout Itemize - -\lang ngerman -\begin_inset CommandInset href -LatexCommand href -name "RFC 3697 / IPv6 Flow Label Specification" -target "http://www.faqs.org/rfcs/rfc3697.html" - -\end_inset - - -\end_layout - -\begin_layout Section -General -\end_layout - -\begin_layout Standard -Proper working QoS is only possible on the outgoing interface of a router - or host, where the bottleneck begins. - Everything else is a hickup and not subject to work as expected or has - a successful result. -\end_layout - -\begin_layout Code - --------------->------- -\end_layout - -\begin_layout Code - - Queue 1 -\backslash - -\end_layout - -\begin_layout Code - - --->--- ---->--------->--------->--------------- -\end_layout - -\begin_layout Code - -Big pipe Queue 2 Queue 1 / Queue 2 / Queue 3 Thin Pipe -\end_layout - -\begin_layout Code - - --->---- ---->--------->--------->--------------- -\end_layout - -\begin_layout Code - - Queue 3 / -\end_layout - -\begin_layout Code - --------------->------- -\end_layout - -\begin_layout Section -Linux QoS using -\begin_inset Quotes sld -\end_inset - -tc -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -Linux is using -\begin_inset Quotes sld -\end_inset - -tc -\begin_inset Quotes srd -\end_inset - - from the -\begin_inset Quotes sld -\end_inset - -iproute2 -\begin_inset Quotes srd -\end_inset - - package to configure traffic shaping, generally described in the -\begin_inset CommandInset href -LatexCommand href -name "Linux Advanced Routing & Traffic Control HOWTO" -target "http://lartc.org/" - -\end_inset - -. -\end_layout - -\begin_layout Subsection -Example for a constant bitrate queuing -\end_layout - -\begin_layout Standard -With the -\begin_inset Quotes sld -\end_inset - -cbq -\begin_inset Quotes srd -\end_inset - - scheduler, pipes with constant bit rates can be defined. -\end_layout - -\begin_layout Subsubsection -Root qdisc definition -\end_layout - -\begin_layout Standard -Define root qdisc with a bandwidth of 1000 MBit/s on eth1 -\end_layout - -\begin_layout Code - -# tc qdisc add dev eth1 root handle 1: cbq avpkt 1000 bandwidth 1000Mbit -\end_layout - -\begin_layout Subsubsection -QoS class definition -\end_layout - -\begin_layout Standard -Define a class 1:1 with 1 MBit/s -\end_layout - -\begin_layout Code - -# tc class add dev eth1 parent 1: classid 1:1 cbq rate 1Mbit allot 1500 - bounded -\end_layout - -\begin_layout Standard -Define a class 1:2 with 50 MBit/s -\end_layout - -\begin_layout Code - -# tc class add dev eth1 parent 1: classid 1:2 cbq rate 50Mbit allot 1500 - bounded -\end_layout - -\begin_layout Standard -Define a class 1:3 with 10 MBit/s -\end_layout - -\begin_layout Code - -# tc class add dev eth1 parent 1: classid 1:3 cbq rate 10Mbit allot 1500 - bounded -\end_layout - -\begin_layout Standard -Define a class 1:4 with 200 kBit/s -\end_layout - -\begin_layout Code - -# tc class add dev eth1 parent 1: classid 1:4 cbq rate 200kbit allot 1500 - bounded -\end_layout - -\begin_layout Subsubsection -QoS filter definition -\end_layout - -\begin_layout Standard -Define a filter for IPv4 ( -\emph on -protocol ip -\emph default -), TCP ( -\emph on -match ip protocol 6 0xff -\emph default -) destination port 5001 ( -\emph on -match ip dport 5001 0xffff -\emph default -) using class 1:2 from above -\end_layout - -\begin_layout Code - -# tc filter add dev eth1 parent 1: protocol ip u32 match ip protocol - 6 0xff match ip dport 5001 0xffff flowid 1:1 -\end_layout - -\begin_layout Standard -Define a filter for IPv6 ( -\emph on -protocol ip -\emph default -), TCP ( -\emph on -match ip6 protocol 6 0xff -\emph default -) destination port 5001 using class 1:2 from above -\end_layout - -\begin_layout Code - -# tc filter add dev eth1 parent 1: protocol ipv6 u32 match ip6 protocol - 6 0xff match ip6 dport 5001 0xffff flowid 1:2 -\end_layout - -\begin_layout Standard -Define a filter for IPv6 for packets having flow label 12345 ( -\emph on -match ip6 flowlabel 12345 0x3ffff -\emph default -) using class 1:3 from above -\end_layout - -\begin_layout Code - -# tc filter add dev eth1 parent 1: protocol ipv6 u32 match ip6 flowlabel - 12345 0x3ffff flowid 1:3 -\end_layout - -\begin_layout Standard -Define a filter for IPv6 for packets having Linux iptables mark 32 ( -\emph on -handle 32 fw -\emph default -) specified using class 1:4 from above -\end_layout - -\begin_layout Code - -# tc filter add dev eth1 parent 1: protocol ipv6 handle 32 fw flowid 1:4 -\end_layout - -\begin_layout Standard -The last filter definition requires an entry in the ip6tables to mark a - packet -\end_layout - -\begin_layout Code - -# ip6tables -A POSTROUTING -t mangle -p tcp --dport 5003 -j MARK --set-mark - 32 -\end_layout - -\begin_layout Subsubsection -Testing filter definitions using iperf -\end_layout - -\begin_layout Standard -Start on server side each one one separate console: -\end_layout - -\begin_layout Code - -# iperf -V -s -p 5001 -\end_layout - -\begin_layout Code - -# iperf -V -s -p 5002 -\end_layout - -\begin_layout Code - -# iperf -V -s -p 5003 -\end_layout - -\begin_layout Standard -Start on client side and compare results: -\end_layout - -\begin_layout Code - -# iperf -V -c SERVER-IPv4 -p 5001 (expected: 1 MBit/s) -\end_layout - -\begin_layout Code - -# iperf -V -c SERVER-IPv6 -p 5001 (expected: 50 MBit/s) -\end_layout - -\begin_layout Code - -# iperf -V -c SERVER-IPv4 -p 5002 (expected: >> 50 MBit/s && <= 1000 - MBit/s) -\end_layout - -\begin_layout Code - -# iperf -V -c SERVER-IPv6 -p 5002 (expected: >> 50 MBit/s && <= 1000 - MBit/s) -\end_layout - -\begin_layout Code - -# iperf -V -c SERVER-IPv4 -p 5003 (expected: >> 50 MBit/s && <= 1000 - MBit/s) -\end_layout - -\begin_layout Code - -# iperf -V -c SERVER-IPv6 -p 5003 (expected: 200 kBit/s) -\end_layout - -\begin_layout Standard -The rate result should be as defined in the classes (see above), the results - on port 5002 should be very similar independend from used IP version. -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-hints-daemons" - -\end_inset - -Hints for IPv6-enabled daemons -\end_layout - -\begin_layout Standard -Here some hints are shown for IPv6-enabled daemons. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-bind" - -\end_inset - -Berkeley Internet Name Domain (BIND) daemon -\begin_inset Quotes sld -\end_inset - -named -\begin_inset Quotes srd -\end_inset - - -\end_layout - -\begin_layout Standard -IPv6 is supported since version 9. - Always use newest available version. - At least version 9.1.3 must be used, older versions can contain remote exploitabl -e security holes. -\end_layout - -\begin_layout Subsection -Listening on IPv6 addresses -\end_layout - -\begin_layout Standard -Note: unlike in IPv4 current versions doesn't allow to bind a server socket - to dedicated IPv6 addresses, so only -\emph on -any -\emph default - or -\emph on -none -\emph default - are valid. - Because this can be a security issue, check the Access Control List (ACL) - section below, too! -\end_layout - -\begin_layout Subsubsection -Enable BIND named for listening on IPv6 address -\end_layout - -\begin_layout Standard -To enable IPv6 for listening, following options are requested to change -\end_layout - -\begin_layout Code - -options { -\end_layout - -\begin_layout Code - - # sure other options here, too -\end_layout - -\begin_layout Code - - listen-on-v6 { any; }; -\end_layout - -\begin_layout Code - -}; -\end_layout - -\begin_layout Standard -This should result after restart in e.g. -\end_layout - -\begin_layout Code - -# netstat -lnptu |grep "named -\backslash -W*$" -\end_layout - -\begin_layout Code - -tcp 0 0 :::53 :::* LISTEN 1234/named -\end_layout - -\begin_layout Code - -¬ # incoming TCP requests -\end_layout - -\begin_layout Code - -udp 0 0 1.2.3.4:53 0.0.0.0:* 1234/named -\end_layout - -\begin_layout Code - -¬ # incoming UDP requests to IPv4 1.2.3.4 -\end_layout - -\begin_layout Code - -udp 0 0 127.0.0.1:53 0.0.0.0:* 1234/named -\end_layout - -\begin_layout Code - -¬ # incoming UDP requests to IPv4 localhost -\end_layout - -\begin_layout Code - -udp 0 0 0.0.0.0:32868 0.0.0.0:* 1234/named -\end_layout - -\begin_layout Code - -¬ # dynamic chosen port for outgoing queries -\end_layout - -\begin_layout Code - -udp 0 0 :::53 :::* 1234/named -\end_layout - -\begin_layout Code - -¬ # incoming UDP request to any IPv6 -\end_layout - -\begin_layout Standard -And a simple test looks like -\end_layout - -\begin_layout Code - -# dig localhost @::1 -\end_layout - -\begin_layout Standard -and should show you a result. -\end_layout - -\begin_layout Subsubsection -Disable BIND named for listening on IPv6 address -\end_layout - -\begin_layout Standard -To disable IPv6 for listening, following options are requested to change -\end_layout - -\begin_layout Code - -options { -\end_layout - -\begin_layout Code - - # sure other options here, too -\end_layout - -\begin_layout Code - - listen-on-v6 { none; }; -\end_layout - -\begin_layout Code - -}; -\end_layout - -\begin_layout Subsection -IPv6 enabled Access Control Lists (ACL) -\end_layout - -\begin_layout Standard -IPv6 enabled ACLs are possible and should be used whenever it's possible. - An example looks like following: -\end_layout - -\begin_layout Code - -acl internal-net { -\end_layout - -\begin_layout Code - - 127.0.0.1; -\end_layout - -\begin_layout Code - - 1.2.3.0/24; -\end_layout - -\begin_layout Code - - 2001:0db8:100::/56; -\end_layout - -\begin_layout Code - - ::1/128; -\end_layout - -\begin_layout Code - - ::ffff:1.2.3.4/128; -\end_layout - -\begin_layout Code - -}; -\end_layout - -\begin_layout Code - -acl ns-internal-net { -\end_layout - -\begin_layout Code - - 1.2.3.4; -\end_layout - -\begin_layout Code - - 1.2.3.5; -\end_layout - -\begin_layout Code - - 2001:0db8:100::4/128; -\end_layout - -\begin_layout Code - - 2001:0db8:100::5/128; -\end_layout - -\begin_layout Code - -}; -\end_layout - -\begin_layout Standard -This ACLs can be used e.g. - for queries of clients and transfer zones to secondary name-servers. - This prevents also your caching name-server to be used from outside using - IPv6. -\end_layout - -\begin_layout Code - -options { -\end_layout - -\begin_layout Code - - # sure other options here, too -\end_layout - -\begin_layout Code - - listen-on-v6 { none; }; -\end_layout - -\begin_layout Code - - allow-query { internal-net; }; -\end_layout - -\begin_layout Code - - allow-transfer { ns-internal-net; }; -\end_layout - -\begin_layout Code - -}; -\end_layout - -\begin_layout Standard -It's also possible to set the -\emph on -allow-query -\emph default -and -\emph on -allow-transfer -\emph default - option for most of single zone definitions, too. -\end_layout - -\begin_layout Subsection -Sending queries with dedicated IPv6 address -\end_layout - -\begin_layout Standard -This option is not required, but perhaps needed: -\end_layout - -\begin_layout Code - -query-source-v6 address port ; -\end_layout - -\begin_layout Subsection -Per zone defined dedicated IPv6 addresses -\end_layout - -\begin_layout Standard -It's also possible to define per zone some IPv6 addresses. -\end_layout - -\begin_layout Subsubsection -Transfer source address -\end_layout - -\begin_layout Standard -Transfer source address is used for outgoing zone transfers: -\end_layout - -\begin_layout Code - -transfer-source-v6 [port port]; -\end_layout - -\begin_layout Subsubsection -Notify source address -\end_layout - -\begin_layout Standard -Notify source address is used for outgoing notify messages: -\end_layout - -\begin_layout Code - -notify-source-v6 [port port]; -\end_layout - -\begin_layout Subsection -IPv6 DNS zone files examples -\end_layout - -\begin_layout Standard -Some information can be also found at -\begin_inset CommandInset href -LatexCommand href -name "IPv6 DNS Setup Information (article)" -target "http://www.isi.edu/~bmanning/v6DNS.html" - -\end_inset - -. - Perhaps also helpful is the -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Reverse DNS zone builder for BIND 8/9 (webtool)" -target "http://tools.fpsn.net/ipv6-inaddr/" - -\end_inset - -. -\end_layout - -\begin_layout Subsection -Serving IPv6 related DNS data -\end_layout - -\begin_layout Standard -For IPv6 new types and root zones for reverse lookups are defined: -\end_layout - -\begin_layout Itemize -AAAA and reverse IP6.INT: specified in -\begin_inset CommandInset href -LatexCommand href -name "RFC 1886 / DNS Extensions to support IP version 6" -target "http://www.faqs.org/rfcs/rfc1886.html" - -\end_inset - -, usable since BIND version 4.9.6 -\end_layout - -\begin_layout Itemize -A6, DNAME (DEPRECATED NOW!) and reverse IP6.ARPA: specified in -\begin_inset CommandInset href -LatexCommand href -name "RFC 2874 / DNS Extensions to Support IPv6 Address Aggregation and Renumbering" -target "http://www.faqs.org/rfcs/rfc2874.html" - -\end_inset - -, usable since BIND 9, but see also an information about the current state - at -\begin_inset CommandInset href -LatexCommand href -name "Domain Name System Extension (dnsext)" -target "http://www.ietf.org/ids.by.wg/dnsext.html" - -\end_inset - - -\end_layout - -\begin_layout Standard -Perhaps filled later more content, for the meantime take a look at given - RFCs and -\end_layout - -\begin_layout Itemize -AAAA and reverse IP6.INT: -\begin_inset CommandInset href -LatexCommand href -name "IPv6 DNS Setup Information" -target "http://www.isi.edu/~bmanning/v6DNS.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -A6, DNAME (DEPRECATED NOW!) and reverse IP6.ARPA: take a look into chapter - 4 and 6 of the BIND 9 Administrator Reference Manual (ARM) distributed - with the bind-package or get this here: -\begin_inset CommandInset href -LatexCommand href -name "BIND manual version 9.3" -target "http://www.isc.org/sw/bind/arm93/" - -\end_inset - - -\end_layout - -\begin_layout Standard -Because IP6.INT is deprecated (but still in use), a DNS server which will - support IPv6 information has to serve both reverse zones. -\end_layout - -\begin_layout Subsubsection -Current best practice -\end_layout - -\begin_layout Standard -Because there are some troubles around using the new formats, current best - practice is: -\end_layout - -\begin_layout Standard -Forward lookup support: -\end_layout - -\begin_layout Itemize -AAAA -\end_layout - -\begin_layout Standard -Reverse lookup support: -\end_layout - -\begin_layout Itemize -Reverse nibble format for zone ip6.int (FOR BACKWARD COMPATIBILITY) -\end_layout - -\begin_layout Itemize -Reverse nibble format for zone ip6.arpa (RECOMMENDED) -\end_layout - -\begin_layout Subsection -Checking IPv6-enabled connect -\end_layout - -\begin_layout Standard -To check, whether BIND named is listening on an IPv6 socket and serving - data see following examples. -\end_layout - -\begin_layout Subsubsection -IPv6 connect, but denied by ACL -\end_layout - -\begin_layout Standard -Specifying a dedicated server for the query, an IPv6 connect can be forced: -\end_layout - -\begin_layout Code - -$ host -t aaaa www.6bone.net 2001:0db8:200:f101::1 -\end_layout - -\begin_layout Code - -Using domain server: -\end_layout - -\begin_layout Code - -Name: 2001:0db8:200:f101::1 -\end_layout - -\begin_layout Code - -Address: 2001:0db8:200:f101::1#53 -\end_layout - -\begin_layout Code - -Aliases: -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -Host www.6bone.net. - not found: 5(REFUSED) -\end_layout - -\begin_layout Standard -Related log entry looks like following: -\end_layout - -\begin_layout Code - -Jan 3 12:43:32 gate named[12347]: client -\end_layout - -\begin_layout Code - -¬ 2001:0db8:200:f101:212:34ff:fe12:3456#32770: -\end_layout - -\begin_layout Code - - query denied -\end_layout - -\begin_layout Standard -If you see such entries in the log, check whether requests from this client - should be allowed and perhaps review your ACL configuration. -\end_layout - -\begin_layout Subsubsection -Successful IPv6 connect -\end_layout - -\begin_layout Standard -A successful IPv6 connect looks like following: -\end_layout - -\begin_layout Code - -$ host -t aaaa www.6bone.net 2001:0db8:200:f101::1 -\end_layout - -\begin_layout Code - -Using domain server: -\end_layout - -\begin_layout Code - -Name: 2001:0db8:200:f101::1 -\end_layout - -\begin_layout Code - -Address: 2001:0db8:200:f101::1#53 -\end_layout - -\begin_layout Code - -Aliases: -\end_layout - -\begin_layout Code - -\end_layout - -\begin_layout Code - -www.6bone.net. - is an alias for 6bone.net. - -\end_layout - -\begin_layout Code - -6bone.net. - has AAAA address 3ffe:b00:c18:1::10 -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-xinetd" - -\end_inset - -Internet super daemon (xinetd) -\end_layout - -\begin_layout Standard -IPv6 is supported since -\begin_inset CommandInset href -LatexCommand href -name "xinetd" -target "http://www.xinetd.org/" - -\end_inset - - version around 1.8.9. - Always use newest available version. - At least version 2.3.3 must be used, older versions can contain remote exploitabl -e security holes. -\end_layout - -\begin_layout Standard -Some Linux distribution contain an extra package for the IPv6 enabled xinetd, - some others start the IPv6-enabled xinetd if following variable is set: - NETWORKING_IPV6="yes", mostly done by /etc/sysconfig/network (only valid - for Red Hat like distributions). - In newer releases, one binary supports IPv4 and IPv6. -\end_layout - -\begin_layout Standard -If you enable a built-in service like e.g. - daytime by modifying the configuration file in /etc/xinetd.d/daytime like -\end_layout - -\begin_layout Code - -# diff -u /etc/xinetd.d/daytime.orig /etc/xinetd.d/daytime -\end_layout - -\begin_layout Code - ---- /etc/xinetd.d/daytime.orig Sun Dec 16 19:00:14 2001 -\end_layout - -\begin_layout Code - -+++ /etc/xinetd.d/daytime Sun Dec 16 19:00:22 2001 -\end_layout - -\begin_layout Code - -@@ -10,5 +10,5 @@ -\end_layout - -\begin_layout Code - - protocol = tcp -\end_layout - -\begin_layout Code - - user = root -\end_layout - -\begin_layout Code - - wait = no -\end_layout - -\begin_layout Code - -- disable = yes -\end_layout - -\begin_layout Code - -+ disable = no -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Standard -After restarting the xinetd you should get a positive result like: -\end_layout - -\begin_layout Code - -# netstat -lnptu -A inet6 |grep "xinetd*" -\end_layout - -\begin_layout Code - -tcp 0 0 ::ffff:192.168.1.1:993 :::* LISTEN 12345/xinetd-ipv6 -\end_layout - -\begin_layout Code - -tcp 0 0 :::13 :::* LISTEN 12345/xinetd-ipv6 <- service -\end_layout - -\begin_layout Code - -¬ daytime/tcp -\end_layout - -\begin_layout Code - -tcp 0 0 ::ffff:192.168.1.1:143 :::* LISTEN 12345/xinetd-ipv6 -\end_layout - -\begin_layout Standard -Shown example also displays an IMAP and IMAP-SSL IPv4-only listening xinetd. -\end_layout - -\begin_layout Standard -Note: earlier versions had a problem that an IPv4-only xinetd won't start - on an IPv6-enabled node and also the IPv6-enabled xinetd won't start on - an IPv4-only node. - This is known to be fixed in later versions, at least version 2.3.11. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-apache2" - -\end_inset - -Webserver Apache2 (httpd2) -\end_layout - -\begin_layout Standard -Apache web server supports IPv6 native by maintainers since 2.0.14. - Available patches for the older 1.3.x series are not current and shouldn't - be used in public environment, but available at -\begin_inset CommandInset href -LatexCommand href -name "KAME / Misc" -target "ftp://ftp.kame.net/pub/kame/misc/" - -\end_inset - -. -\end_layout - -\begin_layout Subsection -Listening on IPv6 addresses -\end_layout - -\begin_layout Standard -Note: virtual hosts on IPv6 addresses are broken in versions until 2.0.28 - (a patch is available for 2.0.28). - But always try latest available version first because earlier versions - had some security issues. -\end_layout - -\begin_layout Subsubsection -Virtual host listen on an IPv6 address only -\end_layout - -\begin_layout Code - -Listen [2001:0db8:100::1]:80 -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Code - - ServerName ipv6only.yourdomain.yourtopleveldomain -\end_layout - -\begin_layout Code - - # ...sure more config lines -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Subsubsection -Virtual host listen on an IPv6 and on an IPv4 address -\end_layout - -\begin_layout Code - -Listen [2001:0db8:100::2]:80 -\end_layout - -\begin_layout Code - -Listen 1.2.3.4:80 -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Code - - ServerName ipv6andipv4.yourdomain.yourtopleveldomain -\end_layout - -\begin_layout Code - - # ...sure more config lines -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Standard -This should result after restart in e.g. -\end_layout - -\begin_layout Code - -# netstat -lnptu |grep "httpd2 -\backslash -W*$" -\end_layout - -\begin_layout Code - -tcp 0 0 1.2.3.4:80 0.0.0.0:* LISTEN 12345/httpd2 -\end_layout - -\begin_layout Code - -tcp 0 0 2001:0db8:100::1:80 :::* LISTEN 12345/httpd2 -\end_layout - -\begin_layout Code - -tcp 0 0 2001:0db8:100::2:80 :::* LISTEN 12345/httpd2 -\end_layout - -\begin_layout Standard -For simple tests use the telnet example already shown. -\end_layout - -\begin_layout Subsubsection -Additional notes -\end_layout - -\begin_layout Itemize -Apache2 supports a method called -\begin_inset Quotes sld -\end_inset - -sendfile -\begin_inset Quotes srd -\end_inset - - to speedup serving data. - Some NIC drivers also support offline checksumming. - In some cases, this can lead to connection problems and invalid TCP checksums. - In this cases, disable -\begin_inset Quotes sld -\end_inset - -sendfile -\begin_inset Quotes srd -\end_inset - - either by recompiling using configure option -\begin_inset Quotes sld -\end_inset - ---without-sendfile -\begin_inset Quotes srd -\end_inset - - or by using the "EnableSendfile off" directive in configuration file. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-radvd" - -\end_inset - -Router Advertisement Daemon (radvd) -\end_layout - -\begin_layout Standard -The router advertisement daemon is very useful on a LAN, if clients should - be auto-configured. - The daemon itself should run on the Linux default IPv6 gateway router (it's - not required that this is also the default IPv4 gateway, so pay attention - who on your LAN is sending router advertisements). - -\end_layout - -\begin_layout Standard -You can specify some information and flags which should be contained in - the advertisement. - Common used are -\end_layout - -\begin_layout Itemize -Prefix (needed) -\end_layout - -\begin_layout Itemize -Lifetime of the prefix -\end_layout - -\begin_layout Itemize -Frequency of sending advertisements (optional) -\end_layout - -\begin_layout Standard -After a proper configuration, the daemon sends advertisements through specified - interfaces and clients are hopefully receive them and auto-magically configure - addresses with received prefix and the default route. -\end_layout - -\begin_layout Subsection -Configuring radvd -\end_layout - -\begin_layout Subsubsection -Simple configuration -\end_layout - -\begin_layout Standard -Radvd's config file is normally /etc/radvd.conf. - An simple example looks like following: -\end_layout - -\begin_layout Code - -interface eth0 { -\end_layout - -\begin_layout Code - - AdvSendAdvert on; -\end_layout - -\begin_layout Code - - MinRtrAdvInterval 3; -\end_layout - -\begin_layout Code - - MaxRtrAdvInterval 10; -\end_layout - -\begin_layout Code - - prefix 2001:0db8:0100:f101::/64 { -\end_layout - -\begin_layout Code - - AdvOnLink on; -\end_layout - -\begin_layout Code - - AdvAutonomous on; -\end_layout - -\begin_layout Code - - AdvRouterAddr on; -\end_layout - -\begin_layout Code - - }; -\end_layout - -\begin_layout Code - -}; -\end_layout - -\begin_layout Standard -This results on client side in -\end_layout - -\begin_layout Code - -# ip -6 addr show eth0 -\end_layout - -\begin_layout Code - -3: eth0: mtu 1500 qdisc pfifo_fast qlen 100 -\end_layout - -\begin_layout Code - - inet6 2001:0db8:100:f101:2e0:12ff:fe34:1234/64 scope global dynamic - -\end_layout - -\begin_layout Code - - valid_lft 2591992sec preferred_lft 604792sec -\end_layout - -\begin_layout Code - - inet6 fe80::2e0:12ff:fe34:1234/10 scope link -\end_layout - -\begin_layout Standard -Because no lifetime was defined, a very high value was used. -\end_layout - -\begin_layout Subsubsection -Special 6to4 configuration -\end_layout - -\begin_layout Standard -Version since 0.6.2pl3 support the automatic (re)-generation of the prefix - depending on an IPv4 address of a specified interface. - This can be used to distribute advertisements in a LAN after the 6to4 tunneling - has changed. - Mostly used behind a dynamic dial-on-demand Linux router. - Because of the sure shorter lifetime of such prefix (after each dial-up, - another prefix is valid), the lifetime configured to minimal values: -\end_layout - -\begin_layout Code - -interface eth0 { -\end_layout - -\begin_layout Code - - AdvSendAdvert on; -\end_layout - -\begin_layout Code - - MinRtrAdvInterval 3; -\end_layout - -\begin_layout Code - - MaxRtrAdvInterval 10; -\end_layout - -\begin_layout Code - - prefix 0:0:0:f101::/64 { -\end_layout - -\begin_layout Code - - AdvOnLink off; -\end_layout - -\begin_layout Code - - AdvAutonomous on; -\end_layout - -\begin_layout Code - - AdvRouterAddr on; -\end_layout - -\begin_layout Code - - Base6to4Interface ppp0; -\end_layout - -\begin_layout Code - - AdvPreferredLifetime 20; -\end_layout - -\begin_layout Code - - AdvValidLifetime 30; -\end_layout - -\begin_layout Code - - }; -\end_layout - -\begin_layout Code - -}; -\end_layout - -\begin_layout Standard -This results on client side in (assuming, ppp0 has currently 1.2.3.4 as local - IPv4 address): -\end_layout - -\begin_layout Code - -# /sbin/ip -6 addr show eth0 -\end_layout - -\begin_layout Code - -3: eth0: mtu 1500 qdisc pfifo_fast qlen 100 -\end_layout - -\begin_layout Code - - inet6 2002:0102:0304:f101:2e0:12ff:fe34:1234/64 scope global dynamic - -\end_layout - -\begin_layout Code - - valid_lft 22sec preferred_lft 12sec -\end_layout - -\begin_layout Code - - inet6 fe80::2e0:12ff:fe34:1234/10 scope link -\end_layout - -\begin_layout Standard -Because a small lifetime was defined, such prefix will be thrown away quickly, - if no related advertisement was received. -\end_layout - -\begin_layout Standard -Additional note: if you do not used special 6to4 support in initscripts, - you have to setup a special route on the internal interface on the router, - otherwise you will get some backrouting problems. - for the example showh here: -\end_layout - -\begin_layout Code - -# /sbin/ip -6 route add 2002:0102:0304:f101::/64 dev eth0 metric 1 -\end_layout - -\begin_layout Standard -This route needs to be replaced every time the prefix changes, which is - the case after a new IPv4 address was assigned to the dial-up interface. -\end_layout - -\begin_layout Subsection -Debugging -\end_layout - -\begin_layout Standard -A program called -\begin_inset Quotes sld -\end_inset - -radvdump -\begin_inset Quotes srd -\end_inset - - can help you looking into sent or received advertisements. - Simple to use: -\end_layout - -\begin_layout Code - -# radvdump -\end_layout - -\begin_layout Code - -Router advertisement from fe80::280:c8ff:feb9:cef9 (hoplimit 255) -\end_layout - -\begin_layout Code - - AdvCurHopLimit: 64 -\end_layout - -\begin_layout Code - - AdvManagedFlag: off -\end_layout - -\begin_layout Code - - AdvOtherConfigFlag: off -\end_layout - -\begin_layout Code - - AdvHomeAgentFlag: off -\end_layout - -\begin_layout Code - - AdvReachableTime: 0 -\end_layout - -\begin_layout Code - - AdvRetransTimer: 0 -\end_layout - -\begin_layout Code - - Prefix 2002:0102:0304:f101::/64 -\end_layout - -\begin_layout Code - - AdvValidLifetime: 30 -\end_layout - -\begin_layout Code - - AdvPreferredLifetime: 20 -\end_layout - -\begin_layout Code - - AdvOnLink: off -\end_layout - -\begin_layout Code - - AdvAutonomous: on -\end_layout - -\begin_layout Code - - AdvRouterAddr: on -\end_layout - -\begin_layout Code - - Prefix 2001:0db8:100:f101::/64 -\end_layout - -\begin_layout Code - - AdvValidLifetime: 2592000 -\end_layout - -\begin_layout Code - - AdvPreferredLifetime: 604800 -\end_layout - -\begin_layout Code - - AdvOnLink: on -\end_layout - -\begin_layout Code - - AdvAutonomous: on -\end_layout - -\begin_layout Code - - AdvRouterAddr: on -\end_layout - -\begin_layout Code - - AdvSourceLLAddress: 00 80 12 34 56 78 -\end_layout - -\begin_layout Standard -Output shows you each advertisement package in readable format. - You should see your configured values here again, if not, perhaps it's - not your radvd which sends the advertisement...look for another router on - the link (and take the LLAddress, which is the MAC address for tracing). -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-dhcpv6" - -\end_inset - -Dynamic Host Configuration v6 Server (dhcp6s) -\end_layout - -\begin_layout Standard -DHCPv6 can be used for stateful configurations. - The daemon itself need not necessary run on the Linux default IPv6 gateway - router. - -\end_layout - -\begin_layout Standard -You can specify more information than by using radvd. - The are most similar to IPv4 DHCP server. -\end_layout - -\begin_layout Standard -After a proper configuration, the daemon reacts on received ICMPv6 multicast - packets sent by a client to address ff02::1:2 -\end_layout - -\begin_layout Subsection -Configuration of the DHCPv6 server (dhcp6s) -\end_layout - -\begin_layout Subsubsection -Simple configuration -\end_layout - -\begin_layout Standard -dhcp6s's config file is normally /etc/dhcp6s.conf. - An simple example looks like following: -\end_layout - -\begin_layout Code - -interface eth0 { -\end_layout - -\begin_layout Code - - server-preference 255; -\end_layout - -\begin_layout Code - - renew-time 60; -\end_layout - -\begin_layout Code - - rebind-time 90; -\end_layout - -\begin_layout Code - - prefer-life-time 130; -\end_layout - -\begin_layout Code - - valid-life-time 200; -\end_layout - -\begin_layout Code - - allow rapid-commit; -\end_layout - -\begin_layout Code - - option dns_servers 2001:db8:0:f101::1 sub.domain.example; -\end_layout - -\begin_layout Code - - link AAA { -\end_layout - -\begin_layout Code - - range 2001:db8:0:f101::1000 to 2001:db8:0:f101::ffff/64; -\end_layout - -\begin_layout Code - - prefix 2001:db8:0:f101::/64; -\end_layout - -\begin_layout Code - - }; -\end_layout - -\begin_layout Code - -}; -\end_layout - -\begin_layout Subsection -Configuration of the DHCPv6 client (dhcp6c) -\end_layout - -\begin_layout Subsubsection -Simple configuration -\end_layout - -\begin_layout Standard -dhcp6c's config file is normally /etc/dhcp6c.conf. - An simple example looks like following: -\end_layout - -\begin_layout Code - -interface eth0 { -\end_layout - -\begin_layout Code - - send rapid-commit; -\end_layout - -\begin_layout Code - - request domain-name-servers; -\end_layout - -\begin_layout Code - -}; -\end_layout - -\begin_layout Subsection -Usage -\end_layout - -\begin_layout Subsubsection -dhcpv6_server -\end_layout - -\begin_layout Standard -Start server, e.g. -\end_layout - -\begin_layout Code - -# service dhcp6s start -\end_layout - -\begin_layout Subsubsection -dhcpv6_client -\end_layout - -\begin_layout Standard -Start client in foreground, e.g. -\end_layout - -\begin_layout Code - -# dhcp6c -f eth0 -\end_layout - -\begin_layout Subsection -Debugging -\end_layout - -\begin_layout Subsubsection -dhcpv6_server -\end_layout - -\begin_layout Standard -The server has one foreground and two debug toggles (both should be used - for debugging), here is an example: -\end_layout - -\begin_layout Code - -# dhcp6s -d -D -f eth0 -\end_layout - -\begin_layout Subsubsection -dhcpv6_client -\end_layout - -\begin_layout Standard -As general debugging for test whether the IPv6 DHCP server is reable on - the link use an IPv6 ping to the DHCP multicast address: -\end_layout - -\begin_layout Code - -# ping6 -I eth0 ff02::1:2 -\end_layout - -\begin_layout Standard -The client has one foreground and two debug toggles, here is an example: -\end_layout - -\begin_layout Code - -# dhcp6c -d -f eth0 -\end_layout - -\begin_layout Code - -Oct/03/2005 17:18:16 dhcpv6 doesn't support hardware type 776 -\end_layout - -\begin_layout Code - -Oct/03/2005 17:18:16 doesn't support sit0 address family 0 -\end_layout - -\begin_layout Code - -Oct/03/2005 17:18:16 netlink_recv_rtgenmsg error -\end_layout - -\begin_layout Code - -Oct/03/2005 17:18:16 netlink_recv_rtgenmsg error -\end_layout - -\begin_layout Code - -Oct/03/2005 17:18:17 status code for this address is: success -\end_layout - -\begin_layout Code - -Oct/03/2005 17:18:17 status code: success -\end_layout - -\begin_layout Code - -Oct/03/2005 17:18:17 netlink_recv_rtgenmsg error -\end_layout - -\begin_layout Code - -Oct/03/2005 17:18:17 netlink_recv_rtgenmsg error -\end_layout - -\begin_layout Code - -Oct/03/2005 17:18:17 assigned address 2001:db8:0:f101::1002 prefix len is - not -\end_layout - -\begin_layout Code - -¬ in any RAs prefix length using 64 bit instead -\end_layout - -\begin_layout Code - -Oct/03/2005 17:18:17 renew time 60, rebind time 9 -\end_layout - -\begin_layout Standard -Note that the netlink error messages have no impact. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-isc-dhcp" - -\end_inset - -ISC Dynamic Host Configuration Server (dhcpd) -\end_layout - -\begin_layout Standard -ISC DHCP supports IPv6 since version 4.x. -\end_layout - -\begin_layout Subsection -Configuration of the ISC DHCP server for IPv6 (dhcpd) -\end_layout - -\begin_layout Standard -Note that currently, the ISC DHCP server can only serve IPv4 or IPv6, means - you have to start the daemon twice (for IPv6 with option -\begin_inset Quotes sld -\end_inset - --6 -\begin_inset Quotes srd -\end_inset - -) to support both protocols. -\end_layout - -\begin_layout Subsubsection -Simple configuration -\end_layout - -\begin_layout Standard -Create a dedicated configuration file /etc/dhcp/dhcpd6.conf for the IPv6 - part of the dhcpd. - Note, that the router requires to have a interface configured with an IPv6 - address out of the defined subnet. -\end_layout - -\begin_layout Code - -default-lease-time 600; -\end_layout - -\begin_layout Code - -max-lease-time 7200; -\end_layout - -\begin_layout Code - -log-facility local7; -\end_layout - -\begin_layout Code - -subnet6 2001:db8:0:1::/64 { -\end_layout - -\begin_layout Code - - # Range for clients -\end_layout - -\begin_layout Code - - range6 2001:db8:0:1::129 2001:db8:0:1::254; -\end_layout - -\begin_layout Code - - # Additional options -\end_layout - -\begin_layout Code - - option dhcp6.name-servers fec0:0:0:1::1; -\end_layout - -\begin_layout Code - - option dhcp6.domain-search "domain.example"; -\end_layout - -\begin_layout Code - - # Prefix range for delegation to sub-routers -\end_layout - -\begin_layout Code - - prefix6 2001:db8:0:100:: 2001:db8:0:f00:: /56; -\end_layout - -\begin_layout Code - - # Example for a fixed host address -\end_layout - -\begin_layout Code - - host specialclient { -\end_layout - -\begin_layout Code - - host-identifier option dhcp6.client-id 00:01:00:01:4a:1f:ba:e3:60:b9:1f:01: -23:45; -\end_layout - -\begin_layout Code - - fixed-address6 2001:db8:0:1::127; -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - -} -\end_layout - -\begin_layout Standard -Note that the -\begin_inset Quotes sld -\end_inset - -dhcp.client-id -\begin_inset Quotes srd -\end_inset - - no longer belongs to a MAC address, an unique ID is used instead! -\begin_inset Quotes sld -\end_inset - -dhcp6c -\begin_inset Quotes srd -\end_inset - - (see above) uses the file /var/lib/dhcpv6/dhcp6c_duid (would be created - during first start, if not existing) as unique identity. - It's a 14 byte long identifier, starting with a 2 byte length information - (usually -\begin_inset Quotes sld -\end_inset - -0x000e -\begin_inset Quotes srd -\end_inset - -): -\end_layout - -\begin_layout Code - -# hexdump -e '"%07.7_ax " 1/2 "%04x" " " 14/1 "%02x:" " -\backslash -n"' /var/lib/dhcpv6/dhcp6c_duid 0000000 000e 00:01:00:01:4a:1f:ba:e3:60:b9:1f:01 -:23:45: -\end_layout - -\begin_layout Subsection -Usage -\end_layout - -\begin_layout Subsubsection -dhcpd -\end_layout - -\begin_layout Standard -Start server in foreground: -\end_layout - -\begin_layout Code - -# /usr/sbin/dhcpd -6 -f -cf /etc/dhcp/dhcpd.conf eth1 -\end_layout - -\begin_layout Code - -Internet Systems Consortium DHCP Server 4.1.0 -\end_layout - -\begin_layout Code - -Copyright 2004-2008 Internet Systems Consortium. - -\end_layout - -\begin_layout Code - -All rights reserved. - -\end_layout - -\begin_layout Code - -For info, please visit http://www.isc.org/sw/dhcp/ -\end_layout - -\begin_layout Code - -Not searching LDAP since ldap-server, ldap-port and ldap-base-dn were not - specified in the config file -\end_layout - -\begin_layout Code - -Wrote 0 leases to leases file. - -\end_layout - -\begin_layout Code - -Bound to *:547 -\end_layout - -\begin_layout Code - -Listening on Socket/5/eth1/2001:db8:0:1::/64 -\end_layout - -\begin_layout Code - -Sending on Socket/5/eth1/2001:db8:0:1::/64 -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-dibbler" - -\end_inset - -DHCP Server Dibbler -\end_layout - -\begin_layout Standard -Dibbler is also a DHCP server -\end_layout - -\begin_layout Subsection -Configuration of the Dibbler DHCP server for IPv6 -\end_layout - -\begin_layout Subsubsection -Simple configuration -\end_layout - -\begin_layout Standard -Create a dedicated configuration file /etc/dibbler/server.conf . - Note, that the router requires to have a interface configured with an IPv6 - address out of the defined subnet. -\end_layout - -\begin_layout Code - -log-level 8 -\end_layout - -\begin_layout Code - -log-mode short -\end_layout - -\begin_layout Code - -preference 0 -\end_layout - -\begin_layout Code - -iface "eth1" { -\end_layout - -\begin_layout Code - - // also ranges can be defines, instead of exact values t1 1800-2000 t2 - 2700-3000 -\end_layout - -\begin_layout Code - - prefered-lifetime 3600 -\end_layout - -\begin_layout Code - - valid-lifetime 7200 -\end_layout - -\begin_layout Code - - class { -\end_layout - -\begin_layout Code - - pool 2001:6f8:12d8:1::/64 -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - option dns-server fec0:0:0:1::1 -\end_layout - -\begin_layout Code - - option domain domain.example -\end_layout - -\begin_layout Code - -} -\end_layout - -\begin_layout Subsection -Usage -\end_layout - -\begin_layout Subsubsection -dibbler-server -\end_layout - -\begin_layout Standard -Start server in foreground: -\end_layout - -\begin_layout Code - -# dibbler-server run -\end_layout - -\begin_layout Code - -| Dibbler - a portable DHCPv6, version 0.7.3 (SERVER, Linux port) -\end_layout - -\begin_layout Code - -| Authors : Tomasz Mrugalski,Marek Senderski -\end_layout - -\begin_layout Code - -| Licence : GNU GPL v2 only. - Developed at Gdansk University of Technology. - -\end_layout - -\begin_layout Code - -| Homepage: http://klub.com.pl/dhcpv6/ -\end_layout - -\begin_layout Code - -2009.05.28 10:18:48 Server Notice My pid (1789) is stored in /var/lib/dibbler/s -erver.pid -\end_layout - -\begin_layout Code - -2009.05.28 10:18:48 Server Notice Detected iface eth0/3, MAC=54:52:00:01:23:45. - -\end_layout - -\begin_layout Code - -2009.05.28 10:18:48 Server Notice Detected iface eth1/2, MAC=54:52:00:67:89:ab. - -\end_layout - -\begin_layout Code - -2009.05.28 10:18:48 Server Notice Detected iface lo/1, MAC=00:00:00:00:00:00. - -\end_layout - -\begin_layout Code - -2009.05.28 10:18:48 Server Debug Skipping database loading. - -\end_layout - -\begin_layout Code - -2009.05.28 10:18:48 Server Debug Cache:server-cache.xml file: parsing started, - expecting 0 entries. - -\end_layout - -\begin_layout Code - -2009.05.28 10:18:48 Server Notice Parsing /etc/dibbler/server.conf config - file... - -\end_layout - -\begin_layout Code - -18:48 Server Debug Setting 0 generic option(s). - -\end_layout - -\begin_layout Code - -18:48 Server Debug 0 per-client configurations (exceptions) added. - -\end_layout - -\begin_layout Code - -18:48 Server Debug Parsing /etc/dibbler/server.conf done. - -\end_layout - -\begin_layout Code - -18:48 Server Info 0 client class(es) defined. - -\end_layout - -\begin_layout Code - -18:48 Server Debug 1 interface(s) specified in /etc/dibbler/server.conf - -\end_layout - -\begin_layout Code - -18:48 Server Info Mapping allow, deny list to class 0:0 allow/deny - entries in total. - -\end_layout - -\begin_layout Code - -18:48 Server Info Interface eth1/2 configuration has been loaded. - -\end_layout - -\begin_layout Code - -18:48 Server Notice Running in stateful mode. - -\end_layout - -\begin_layout Code - -18:48 Server Info My DUID is 00:01:00:01:11:aa:6d:a7:54:52:00:67:89:ab. - -\end_layout - -\begin_layout Code - -18:48 Server Notice Creating multicast (ff02::1:2) socket on eth1/2 (eth1/2) - interface. - -\end_layout - -\begin_layout Code - -18:48 Server Debug Cache: size set to 1048576 bytes, 1 cache entry size - is 87 bytes, so maximum 12052 address-client pair(s) may be cached. - -\end_layout - -\begin_layout Code - -18:48 Server Notice Accepting connections. - Next event in 4294967295 second(s). -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-tcpwrapper" - -\end_inset - -tcp_wrapper -\end_layout - -\begin_layout Standard -tcp_wrapper is a library which can help you to protect service against misuse. -\end_layout - -\begin_layout Subsection -Filtering capabilities -\end_layout - -\begin_layout Standard -You can use tcp_wrapper for -\end_layout - -\begin_layout Itemize -Filtering against source addresses (IPv4 or IPv6) -\end_layout - -\begin_layout Itemize -Filtering against users (requires a running ident daemon on the client) -\end_layout - -\begin_layout Subsection -Which program uses tcp_wrapper -\end_layout - -\begin_layout Standard -Following are known: -\end_layout - -\begin_layout Itemize -Each service which is called by xinetd (if xinetd is compiled using tcp_wrapper - library) -\end_layout - -\begin_layout Itemize -sshd (if compiled using tcp_wrapper) -\end_layout - -\begin_layout Subsection -Usage -\end_layout - -\begin_layout Standard -tcp_wrapper is controlled by two files name /etc/hosts.allow and /etc/hosts.deny. - For more information see -\end_layout - -\begin_layout Code - -$ man hosts.allow -\end_layout - -\begin_layout Subsubsection -Example for /etc/hosts.allow -\end_layout - -\begin_layout Standard -In this file, each service which should be positive filtered (means connects - are accepted) need a line. -\end_layout - -\begin_layout Code - -sshd: 1.2.3. - [2001:0db8:100:200::]/64 -\end_layout - -\begin_layout Code - -daytime-stream: 1.2.3. - [2001:0db8:100:200::]/64 -\end_layout - -\begin_layout Standard -Note: there are broken implementations around, which uses following broken - IPv6 network description: [2001:0db8:100:200::/64]. - Hopefully, such versions will be fixed soon. -\end_layout - -\begin_layout Subsubsection -Example for /etc/hosts.deny -\end_layout - -\begin_layout Standard -This file contains all negative filter entries and should normally deny - the rest using -\end_layout - -\begin_layout Code - -ALL: ALL -\end_layout - -\begin_layout Standard -If this node is a more sensible one you can replace the standard line above - with this one, but this can cause a DoS attack (load of mailer and spool - directory), if too many connects were made in short time. - Perhaps a logwatch is better for such issues. -\end_layout - -\begin_layout Code - -ALL: ALL: spawn (echo "Attempt from %h %a to %d at `date`" -\end_layout - -\begin_layout Code - - | tee -a /var/log/tcp.deny.log | mail root@localhost) -\end_layout - -\begin_layout Subsection -Logging -\end_layout - -\begin_layout Standard -Depending on the entry in the syslog daemon configuration file /etc/syslog.conf - the tcp_wrapper logs normally into /var/log/secure. -\end_layout - -\begin_layout Subsubsection -Refused connection -\end_layout - -\begin_layout Standard -A refused connection via IPv4 to an xinetd covered daytime service produces - a line like following example -\end_layout - -\begin_layout Code - -Jan 2 20:40:44 gate xinetd-ipv6[12346]: FAIL: daytime-stream libwrap -\end_layout - -\begin_layout Code - -¬ from=::ffff:1.2.3.4 -\end_layout - -\begin_layout Code - -Jan 2 20:32:06 gate xinetd-ipv6[12346]: FAIL: daytime-stream libwrap -\end_layout - -\begin_layout Code - - from=2001:0db8:100:200::212:34ff:fe12:3456 -\end_layout - -\begin_layout Standard -A refused connection via IPv4 to an dual-listen sshd produces a line like - following example -\end_layout - -\begin_layout Code - -Jan 2 20:24:17 gate sshd[12345]: refused connect from ::ffff:1.2.3.4 -\end_layout - -\begin_layout Code - -¬ (::ffff:1.2.3.4) -\end_layout - -\begin_layout Code - -Jan 2 20:39:33 gate sshd[12345]: refused connect -\end_layout - -\begin_layout Code - - from 2001:0db8:100:200::212:34ff:fe12:3456 -\end_layout - -\begin_layout Code - -¬ (2001:0db8:100:200::212:34ff:fe12:3456) -\end_layout - -\begin_layout Subsubsection -Permitted connection -\end_layout - -\begin_layout Standard -A permitted connection via IPv4 to an xinetd covered daytime service produces - a line like following example -\end_layout - -\begin_layout Code - -Jan 2 20:37:50 gate xinetd-ipv6[12346]: START: daytime-stream pid=0 -\end_layout - -\begin_layout Code - -¬ from=::ffff:1.2.3.4 -\end_layout - -\begin_layout Code - -Jan 2 20:37:56 gate xinetd-ipv6[12346]: START: daytime-stream pid=0 -\end_layout - -\begin_layout Code - - from=2001:0db8:100:200::212:34ff:fe12:3456 -\end_layout - -\begin_layout Standard -A permitted connection via IPv4 to an dual-listen sshd produces a line like - following example -\end_layout - -\begin_layout Code - -Jan 2 20:43:10 gate sshd[21975]: Accepted password for user from ::ffff:1.2.3.4 -\end_layout - -\begin_layout Code - -¬ port 33381 ssh2 -\end_layout - -\begin_layout Code - -Jan 2 20:42:19 gate sshd[12345]: Accepted password for user -\end_layout - -\begin_layout Code - - from 2001:0db8:100:200::212:34ff:fe12:3456 port 33380 ssh2 -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-vsftpd" - -\end_inset - -vsftpd -\end_layout - -\begin_layout Subsection -Listening on IPv6 addresses -\end_layout - -\begin_layout Standard -Edit the configuration file, ususally /etc/vsftpd/vsftpd.conf, and adjust - the listen option like -\end_layout - -\begin_layout Code - -listen_ipv6=yes -\end_layout - -\begin_layout Standard -That's all. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-proftpd" - -\end_inset - -proftpd -\end_layout - -\begin_layout Subsection -Listening on IPv6 addresses -\end_layout - -\begin_layout Standard -Edit the configuration file, ususally /etc/proftpd.conf, but take care, not - 100% logical in virtual host setup -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Code - - ... -\end_layout - -\begin_layout Code - - Bind 2001:0DB8::1 -\end_layout - -\begin_layout Code - - ... -\end_layout - -\begin_layout Code - - -\end_layout - -\begin_layout Standard -That's all. -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "hints-daemons-others" - -\end_inset - -Other daemons -\end_layout - -\begin_layout Standard -Nowadays it's mostly simple, look for either a command line option or a - configuration value to enable IPv6 listening. - See manual page of the daemon or check related FAQs. - It can happen that you can bind a daemon only to the IPv6- -\begin_inset Quotes sld -\end_inset - -any -\begin_inset Quotes srd -\end_inset - --address (::) and not to bind to a dedicated IPv6 address, because the lack - of support (depends on that what the programmer has implemented so far...). -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-programming" - -\end_inset - -Programming -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "chapter-section-using-API" - -\end_inset - - -\begin_inset CommandInset label -LatexCommand label -name "chapter-programming-using-API" - -\end_inset - -Programming using C-API -\end_layout - -\begin_layout Standard -Related RFCs: -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "RFC 3493 / Basic Socket Interface Extensions for IPv6" -target "http://www.faqs.org/rfcs/rfc3493.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "RFC 3542 / Advanced Sockets Application Program Interface (API) for IPv6" -target "http://www.faqs.org/rfcs/rfc3542.html" - -\end_inset - - -\end_layout - -\begin_layout Standard -Following contents of this section is contributed by John Wenker, Sr. - Software Engineer Performance Technologies San Diego, CA USA -\begin_inset CommandInset href -LatexCommand href -name "http://www.pt.com/" -target "http://www.pt.com/" - -\end_inset - -. -\end_layout - -\begin_layout Standard -\begin_inset VSpace defskip -\end_inset - - -\end_layout - -\begin_layout Standard -This section describes how to write IPv6 client-server applications under - the Linux operating system. - First thing's first, and credit must be given where it is due. - The information contained in this section is derived from Chapters 2 through - 4 of IPv6 Network Programming by Jun-ichiro itojun Hagino (ISBN 1-55558-318-0). - The reader is encouraged to consult that book for more detailed information. - It describes how to convert IPv4 applications to be IPv6 compatible in - a protocol-independent way, and describes some of the common -\bar under -problems -\bar default - encountered during the conversion along with suggested solutions. - At the time of this writing, this is the only book of which the author - is aware that specifically addresses how to program IPv6 applications [since - writing this section, the author has also become aware of the Porting applicati -ons to IPv6 HowTo by Eva M. - Castro at -\begin_inset CommandInset href -LatexCommand href -name "http://jungla.dit.upm.es/~ecastro/IPv6-web/ipv6.html" -target "http://jungla.dit.upm.es/~ecastro/IPv6-web/ipv6.html" - -\end_inset - -]. - Unfortunately, of the almost 360 pages in the book, maybe 60 are actually - useful (the chapters mentioned). - Nevertheless, without the guidance of that book, the author would have - been unable to perform his job duties or compose this HowTo. - While most (but certainly not all) of the information in the Hagino book - is available via the Linux 'man' pages, application programmers will save - a significant amount of time and frustration by reading the indicated chapters - of the book rather than searching through the 'man' pages and online documentat -ion. -\end_layout - -\begin_layout Standard -Other than the Hagino book, any other information presented in this HowTo - was obtained through trial and error. - Some items or explanations may not be entirely -\begin_inset Quotes sld -\end_inset - -correct -\begin_inset Quotes srd -\end_inset - - in the grand IPv6 scheme, but seem to work in practical application. -\end_layout - -\begin_layout Standard -The discussion that follows assumes the reader is already experienced with - the traditional TCP/IP socket API. - For more information on traditional socket programming, the Internetworking - with TCP/IP series of textbooks by Comer & Stevens is hard to beat, specificall -y Volume III: Client-Server Programming and Applications, Linux/POSIX Sockets - Version (ISBN 0-13-032071-4). - This HowTo also assumes that the reader has had at least a bare basic introduct -ion to IPv6 and in particular the addressing scheme for network addresses - (see Section 2.3). -\end_layout - -\begin_layout Subsection -Address Structures -\end_layout - -\begin_layout Standard -This section provides a brief overview of the structures provided in the - socket API to represent network addresses (or more specifically transport - endpoints) when using the Internet protocols in a client-server application. -\end_layout - -\begin_layout Subsubsection -IPv4 sockaddr_in -\end_layout - -\begin_layout Standard -In IPv4, network addresses are 32 bits long and define a network node. - Addresses are written in dotted decimal notation, such as 192.0.2.1, where - each number represents eight bits of the address. - Such an IPv4 address is represented by the -\family typewriter -struct sockaddr_in -\family default - data type, which is defined in -\family typewriter - -\family default -. -\end_layout - -\begin_layout Code - -struct sockaddr_in -\end_layout - -\begin_layout Code - -{ -\end_layout - -\begin_layout Code - - sa_family_t sin_family; -\end_layout - -\begin_layout Code - - in_port_t sin_port; -\end_layout - -\begin_layout Code - - struct in_addr sin_addr; -\end_layout - -\begin_layout Code - - /* Plus some padding for alignment */ -\end_layout - -\begin_layout Code - -}; -\end_layout - -\begin_layout Standard -The -\family typewriter -sin_family -\family default - component indicates the address family. - For IPv4 addresses, this is always set to -\family typewriter -AF_INET -\family default -. - The -\family typewriter -sin_addr -\family default - field contains the 32-bit network address (in network byte order). - Finally, the -\family typewriter -sin_port -\family default - component represents the transport layer port number (in network byte order). - Readers should already be familiar with this structure, as this is the - standard IPv4 address structure. -\end_layout - -\begin_layout Subsubsection -IPv6 sockaddr_in6 -\end_layout - -\begin_layout Standard -The biggest feature of IPv6 is its increased address space. - Instead of 32-bit network addresses, IPv6 allots 128 bits to an address. - Addresses are written in colon-hex notation of the form fe80::2c0:8cff:fe01:234 -5, where each hex number separated by colons represents 16 bits of the address. - Two consecutive colons indicate a string of consecutive zeros for brevity, - and at most only one double-colon may appear in the address. - IPv6 addresses are represented by the -\family typewriter -struct sockaddr_in6 -\family default - data type, also defined in -\family typewriter - -\family default -. -\end_layout - -\begin_layout Code - -struct sockaddr_in6 -\end_layout - -\begin_layout Code - -{ -\end_layout - -\begin_layout Code - - sa_family_t sin6_family; -\end_layout - -\begin_layout Code - - in_port_t sin6_port; -\end_layout - -\begin_layout Code - - uint32_t sin6_flowinfo; -\end_layout - -\begin_layout Code - - struct in6_addr sin6_addr; -\end_layout - -\begin_layout Code - - uint32_t sin6_scope_id; -\end_layout - -\begin_layout Code - -}; -\end_layout - -\begin_layout Standard -The -\family typewriter -sin6_family -\family default -, -\family typewriter -sin6_port -\family default -, and -\family typewriter -sin6_addr -\family default - components of the structure have the same meaning as the corresponding - fields in the -\family typewriter -sockaddr_in -\family default - structure. - However, the -\family typewriter -sin6_family -\family default - member is set to -\family typewriter -AF_INET6 -\family default - for IPv6 addresses, and the -\family typewriter -sin6_addr -\family default - field holds a 128-bit address instead of only 32 bits. -\end_layout - -\begin_layout Standard -The -\family typewriter -sin6_flowinfo -\family default - field is used for flow control, but is not yet standardized and can be - ignored. -\end_layout - -\begin_layout Standard -The -\family typewriter -sin6_scope_id -\family default - field has an odd use, and it seems (at least to this naïve author) that - the IPv6 designers took a huge step backwards when devising this. - Apparently, 128-bit IPv6 network addresses are not unique. - For example, it is possible to have two hosts, on separate networks, with - the same link-local address (see Figure 1). - In order to pass information to a specific host, more than just the network - address is required; the scope identifier must also be specified. - In Linux, the network interface name is used for the scope identifier (e.g. - -\begin_inset Quotes sld -\end_inset - -eth0 -\begin_inset Quotes srd -\end_inset - -) [be warned that the scope identifier is implementation dependent!]. - Use the -\family typewriter -ifconfig(1M) -\family default - command to display a list of active network interfaces. -\end_layout - -\begin_layout Standard -A colon-hex network address can be augmented with the scope identifier to - produce a "scoped address -\begin_inset Quotes srd -\end_inset - -. - The percent sign ('%') is used to delimit the network address from the - scope identifier. - For example, -\family typewriter -fe80::1%eth0 -\family default - is a scoped IPv6 address where -\family typewriter -fe80::1 -\family default - represents the 128-bit network address and -\family typewriter -eth0 -\family default - is the network interface (i.e. - the scope identifier). - Thus, if a host resides on two networks, such as Host B in example below, - the user now has to know which path to take in order to get to a particular - host. - In Figure 1, Host B addresses Host A using the scoped address -\family typewriter -fe80::1%eth0 -\family default -, while Host C is addressed with -\family typewriter -fe80::1%eth1 -\family default -. -\end_layout - -\begin_layout Code - -Host A (fe80::1) ---- eth0 ---- Host B ---- eth1 ---- Host C (fe80::1) -\end_layout - -\begin_layout Standard -Getting back to the -\family typewriter -sockaddr_in6 -\family default - structure, its -\family typewriter -sin6_scope_id -\family default - field contains the index of the network interface on which a host may be - found. - Server applications will have this field set automatically by the socket - API when they accept a connection or receive a datagram. - For client applications, if a scoped address is passed as the node parameter - to -\family typewriter -getaddrinfo(3) -\family default - (described later in this HowTo), then the -\family typewriter -sin6_scope_id -\family default - field will be filled in correctly by the system upon return from the function; - if a scoped address is not supplied, then the sin6_scope_id field must - be explicitly set by the client software prior to attempting to communicate - with the remote server. - The -\family typewriter -if_nametoindex(3) -\family default - function is used to translate a network interface name into its corresponding - index. - It is declared in -\family typewriter - -\family default -. -\end_layout - -\begin_layout Subsubsection -Generic Addresses -\end_layout - -\begin_layout Standard -As any programmer familiar with the traditional TCP/IP socket API knows, - several socket functions deal with "generic" pointers. - For example, a pointer to a generic -\family typewriter -struct sockaddr -\family default - data type is passed as a parameter to some socket functions (such as -\family typewriter -connect(2) -\family default - or -\family typewriter -bind(2) -\family default -) rather than a pointer to a specific address type. - Be careful\SpecialChar ldots - the -\family typewriter -sockaddr_in6 -\family default - structure is larger than the generic -\family typewriter -sockaddr -\family default - structure! Thus, if your program -\bar under -receives -\bar default - a generic address whose actual type is unknown (e.g. - it could be an IPv4 address structure or an IPv6 address structure), you - must supply sufficient storage to hold the entire address. - The -\family typewriter -struct sockaddr_storage -\family default - data type is defined in -\family typewriter - -\family default - for this purpose [do not #include this file directly within an application; - use -\family typewriter - -\family default - as usual, and -\family typewriter - -\family default - will be implicitly included]. -\end_layout - -\begin_layout Standard -For example, consider the -\family typewriter -recvfrom(2) -\family default - system call, which is used to receive a message from a remote peer. - Its function prototype is: -\end_layout - -\begin_layout Code - -ssize_t recvfrom( int s, -\end_layout - -\begin_layout Code - - void *buf, -\end_layout - -\begin_layout Code - - size_t len, -\end_layout - -\begin_layout Code - - int flags, -\end_layout - -\begin_layout Code - - struct sockaddr *from, -\end_layout - -\begin_layout Code - - socklen_t *fromlen ); -\end_layout - -\begin_layout Standard -The from parameter points to a generic -\family typewriter -sockaddr -\family default - structure. - If data can be received from an IPv6 peer on the socket referenced by -\family typewriter -s -\family default -, then -\family typewriter -from -\family default - should point to a data type of -\family typewriter -struct sockaddr_storage -\family default -, as in the following dummy example: -\end_layout - -\begin_layout Code - -/* -\end_layout - -\begin_layout Code - -** Read a message from a remote peer, and return a buffer pointer to -\end_layout - -\begin_layout Code - -** the caller. -\end_layout - -\begin_layout Code - -** -\end_layout - -\begin_layout Code - -** 's' is the file descriptor for the socket. -\end_layout - -\begin_layout Code - -*/ -\end_layout - -\begin_layout Code - -char *rcvMsg( int s ) -\end_layout - -\begin_layout Code - -{ -\end_layout - -\begin_layout Code - - static char bfr[ 1025 ]; /* Where the msg is stored. - */ -\end_layout - -\begin_layout Code - - ssize_t count; -\end_layout - -\begin_layout Code - - struct sockaddr_storage ss; /* Where the peer adr goes. - */ -\end_layout - -\begin_layout Code - - socklen_t sslen; -\end_layout - -\begin_layout Code - - sslen = sizeof( ss ); -\end_layout - -\begin_layout Code - - count = recvfrom( s, -\end_layout - -\begin_layout Code - - bfr, -\end_layout - -\begin_layout Code - - sizeof( bfr ) - 1, -\end_layout - -\begin_layout Code - - 0, -\end_layout - -\begin_layout Code - - (struct sockaddr*) &ss, -\end_layout - -\begin_layout Code - - &sslen ); -\end_layout - -\begin_layout Code - - bfr[ count ] = ' -\backslash -0'; /* Null-terminates the message. - */ -\end_layout - -\begin_layout Code - - return bfr; -\end_layout - -\begin_layout Code - -} /* End rcvMsg() */ -\end_layout - -\begin_layout Standard -As seen in the above example, -\family typewriter -ss -\family default - (a -\family typewriter -struct sockaddr_storage -\family default - data object) is used to receive the peer address information, but it's - address is typecast to a generic -\family typewriter -struct sockaddr* -\family default - pointer in the call to -\family typewriter -recvfrom(2) -\family default -. - -\end_layout - -\begin_layout Subsection -Lookup Functions -\end_layout - -\begin_layout Standard -Traditionally, hostname and service name resolution were performed by functions - such as -\family typewriter -gethostbyname(3) -\family default - and -\family typewriter -getservbyname(3) -\family default -. - These traditional lookup functions are still available, but they are not - forward compatible to IPv6. - Instead, the IPv6 socket API provides new lookup functions that consolidate - the functionality of several traditional functions. - These new lookup functions are also backward compatible with IPv4, so a - programmer can use the same translation algorithm in an application for - both the IPv4 and IPv6 protocols. - This is an important feature, because obviously a global IPv6 infrastructure - isn't going to be put in place overnight. - Thus, during the transition period from IPv4 to IPv6, client-server application -s should be designed with the flexibility to handle both protocols simultaneousl -y. - The example programs at the end of this chapter do just that. -\end_layout - -\begin_layout Standard -The primary lookup function in the new socket API is -\family typewriter -getaddrinfo(3) -\family default -. - Its prototype is as follows. - -\end_layout - -\begin_layout Code - -int getaddrinfo( const char *node, -\end_layout - -\begin_layout Code - - const char *service, -\end_layout - -\begin_layout Code - - const struct addrinfo *hints, -\end_layout - -\begin_layout Code - - struct addrinfo **res ); -\end_layout - -\begin_layout Standard -The node parameter is a pointer to the hostname or IP address being translated. - The referenced string can be a hostname, IPv4 dotted decimal address, or - IPv6 colon-hex address (possibly scoped). - The -\family typewriter -service -\family default - parameter is a pointer to the transport layer's service name or port number. - It can be specified as a name found in -\family typewriter -/etc/services -\family default - or a decimal number. - -\family typewriter -getaddrinfo(3) -\family default - resolves the host/service combination and returns a -\bar under -list -\bar default - of address records; a pointer to the list is placed in the location pointed - at by -\family typewriter -res -\family default -. - For example, suppose a host can be identified by both an IPv4 and IPv6 - address, and that the indicated service has both a TCP entry and UDP entry - in -\family typewriter -/etc/services -\family default -. - In such a scenario, it is not inconceivable that four address records are - returned; one for TCP/IPv6, one for UDP/IPv6, one for TCP/IPv4, and one - for UDP/IPv4. -\end_layout - -\begin_layout Standard -The definition for -\family typewriter -struct addrinfo -\family default - is found in -\family typewriter - -\family default - (as is the declaration for getaddrinfo(3) and the other functions described - in this section). - The structure has the following format: -\end_layout - -\begin_layout Code - -struct addrinfo -\end_layout - -\begin_layout Code - -{ -\end_layout - -\begin_layout Code - - int ai_flags; -\end_layout - -\begin_layout Code - - int ai_family; -\end_layout - -\begin_layout Code - - int ai_socktype; -\end_layout - -\begin_layout Code - - int ai_protocol; -\end_layout - -\begin_layout Code - - socklen_t ai_addrlen; -\end_layout - -\begin_layout Code - - struct sockaddr *ai_addr; -\end_layout - -\begin_layout Code - - char *ai_canonname; -\end_layout - -\begin_layout Code - - struct addrinfo *ai_next; -\end_layout - -\begin_layout Code - -}; -\end_layout - -\begin_layout Standard -Consult the 'man' page for -\family typewriter -getaddrinfo(3) -\family default - for detailed information about the various fields; this HowTo only describes - a subset of them, and only to the extent necessary for normal IPv6 programming. -\end_layout - -\begin_layout Standard -The -\family typewriter -ai_family -\family default -, -\family typewriter -ai_socktype -\family default -, and -\family typewriter -ai_protocol -\family default - fields have the exact same meaning as the parameters to the -\family typewriter -socket(2) -\family default - system call. - The -\family typewriter -ai_family -\family default - field indicates the -\bar under -protocol -\bar default - family (not the address family) associated with the record, and will be - -\family typewriter -PF_INET6 -\family default - for IPv6 or -\family typewriter -PF_INET -\family default - for IPv4. - The -\family typewriter -ai_socktype -\family default - parameter indicates the type of socket to which the record corresponds; - -\family typewriter -SOCK_STREAM -\family default - for a reliable connection-oriented byte-stream or -\family typewriter -SOCK_DGRAM -\family default - for connectionless communication. - The -\family typewriter -ai_protocol -\family default - field specifies the underlying transport protocol for the record. -\end_layout - -\begin_layout Standard -The -\family typewriter -ai_addr -\family default - field points to a generic -\family typewriter -struct sockaddr -\family default - object. - Depending on the value in the -\family typewriter -ai_family -\family default - field, it will point to either a -\family typewriter -struct sockaddr_in -\family default - ( -\family typewriter -PF_INET -\family default -) or a -\family typewriter -struct sockaddr_in6 -\family default - ( -\family typewriter -PF_INET6 -\family default -). - The -\family typewriter -ai_addrlen -\family default - field contains the size of the object pointed at by the -\family typewriter -ai_addr -\family default - field. -\end_layout - -\begin_layout Standard -As mentioned, -\family typewriter -getaddrinfo(3) -\family default - returns a list of address records. - The -\family typewriter -ai_next -\family default - field points to the next record in the list. -\end_layout - -\begin_layout Standard -The -\family typewriter -hints -\family default - parameter to -\family typewriter -getaddrinfo(3) -\family default - is also of type -\family typewriter -struct addrinfo -\family default - and acts as a filter for the address records returned in -\family typewriter -res -\family default -. - If -\family typewriter -hints -\family default - is -\family typewriter -NULL -\family default -, all matching records are returned; but if -\family typewriter -hints -\family default - is non- -\family typewriter -NULL -\family default -, the referenced structure gives "hints" to -\family typewriter -getaddrinfo(3) -\family default - about which records to return. - Only the -\family typewriter -ai_flags -\family default -, -\family typewriter -ai_family -\family default -, -\family typewriter -ai_socktype -\family default -, and -\family typewriter -ai_protocol -\family default - fields are significant in the -\family typewriter -hints -\family default - structure, and all other fields should be set to zero. -\end_layout - -\begin_layout Standard -Programs can use -\family typewriter -hints->ai_family -\family default - to specify the protocol family. - For example, if it is set to -\family typewriter -PF_INET6 -\family default -, then only IPv6 address records are returned. - Likewise, setting -\family typewriter -hints->ai_family -\family default - to -\family typewriter -PF_INET -\family default - results in only IPv4 address records being returned. - If an application wants both IPv4 and IPv6 records, the field should be - set to -\family typewriter -PF_UNSPEC -\family default -. -\end_layout - -\begin_layout Standard -The -\family typewriter -hints->socktype -\family default - field can be set to -\family typewriter -SOCK_STREAM -\family default - to return only records that correspond to connection-oriented byte streams, - -\family typewriter -SOCK_DGRAM -\family default - to return only records corresponding to connectionless communication, or - -\family typewriter -0 -\family default - to return both. -\end_layout - -\begin_layout Standard -For the Internet protocols, there is only one protocol associated with connectio -n-oriented sockets (TCP) and one protocol associated with connectionless - sockets (UDP), so setting -\family typewriter -hints->ai_socktype -\family default - to -\family typewriter -SOCK_STREAM -\family default - or -\family typewriter -SOCK_DGRAM -\family default - is the same as saying, "Give me only TCP records," or "Give me only UDP - records," respectively. - With that in mind, the -\family typewriter -hints->ai_protocol -\family default - field isn't really that important with the Internet protocols, and pretty - much mirrors the -\family typewriter -hints->ai_socktype -\family default - field. - Nevertheless, -\family typewriter -hints->ai_protocol -\family default - can be set to -\family typewriter -IPPROTO_TCP -\family default - to return only TCP records, -\family typewriter -IPPROTO_UDP -\family default - to return only UDP records, or -\family typewriter -0 -\family default - for both. -\end_layout - -\begin_layout Standard -The -\family typewriter -node -\family default - or -\family typewriter -service -\family default - parameter to -\family typewriter -gethostbyname(3) -\family default - can be -\family typewriter -NULL -\family default -, but not both. - If -\family typewriter -node -\family default - is -\family typewriter -NULL -\family default -, then the -\family typewriter -ai_flags field -\family default - of the -\family typewriter -hints -\family default - parameter specifies how the network address in a returned record is set - (i.e. - the -\family typewriter -sin_addr -\family default - or -\family typewriter -sin6_addr -\family default - field of the object pointed at by the -\family typewriter -ai_addr -\family default - component in a returned record). - If the -\family typewriter -AI_PASSIVE -\family default - flag is set in -\family typewriter -hints -\family default -, then the returned network addresses are left unresolved (all zeros). - This is how server applications would use -\family typewriter -getaddrinfo(3) -\family default -. - If the flag is not set, then the address is set to the local loopback address - (::1 for IPv6 or 127.0.0.1 for IPv4). - This is one way a client application can specify that the target server - is running on the same machine as the client. - If the -\family typewriter -service -\family default - parameter is -\family typewriter -NULL -\family default -, the port number in the returned address records remains unresolved. -\end_layout - -\begin_layout Standard -The -\family typewriter -getaddrinfo(3) -\family default - function returns zero on success, or an error code. - In the case of an error, the -\family typewriter -gai_strerror(3) -\family default - function is used to obtain a character pointer to an error message correspondin -g to the error code, just like -\family typewriter -strerror(3) -\family default - does in the standard 'C' library. -\end_layout - -\begin_layout Standard -Once the address list is no longer needed, it must be freed by the application. - This is done with the -\family typewriter -freeaddrinfo(3) -\family default - function. -\end_layout - -\begin_layout Standard -The last function that will be mentioned in this section is -\family typewriter -getnameinfo(3) -\family default -. - This function is the inverse of -\family typewriter -getaddrinfo(3) -\family default -; it is used to create a string representation of the hostname and service - from a generic -\family typewriter -struct sockaddr -\family default - data object. - It has the following prototype. - -\end_layout - -\begin_layout Code - -int getnameinfo( const struct sockaddr *sa, -\end_layout - -\begin_layout Code - - socklen_t salen, -\end_layout - -\begin_layout Code - - char *host, -\end_layout - -\begin_layout Code - - size_t hostlen, -\end_layout - -\begin_layout Code - - char *serv, -\end_layout - -\begin_layout Code - - size_t servlen, -\end_layout - -\begin_layout Code - - int flags ); -\end_layout - -\begin_layout Standard -The -\family typewriter -sa -\family default - parameter points to the address structure in question, and -\family typewriter -salen -\family default - contains its size. - The -\family typewriter -host -\family default - parameter points to a buffer where the null-terminated hostname string - is placed, and the hostlen parameter is the size of that buffer. - If there is no hostname that corresponds to the address, then the network - address (dotted decimal or colon-hex) is placed in -\family typewriter -host -\family default -. - Likewise, the -\family typewriter -serv -\family default - parameter points to a buffer where the null-terminated service name string - (or port number) is placed, and the -\family typewriter -servlen -\family default - parameter is the size of that buffer. - The -\family typewriter -flags -\family default - parameter modifies the function's behavior; in particular, the -\family typewriter -NI_NUMERICHOST -\family default - flag indicates that the converted hostname should always be formatted in - numeric form (i.e. - dotted decimal or colon-hex), and the -\family typewriter -NI_NUMERICSERV -\family default - flag indicates that the converted service should always be in numeric form - (i.e. - the port number). -\end_layout - -\begin_layout Standard -The symbols -\family typewriter -NI_MAXHOST -\family default - and -\family typewriter -NI_MAXSERV -\family default - are available to applications and represent the maximum size of any converted - hostname or service name, respectively. - Use these when declaring output buffers for -\family typewriter -getnameinfo(3) -\family default -. -\end_layout - -\begin_layout Subsection -Quirks Encountered -\end_layout - -\begin_layout Standard -Before jumping into the programming examples, there are several quirks in - IPv6 of which the reader should be aware. - The more significant ones (in addition to the non-uniqueness of IPv6 network - addresses already discussed) are described in the paragraphs below. - -\end_layout - -\begin_layout Subsubsection -IPv4 Mapped Addresses -\end_layout - -\begin_layout Standard -For security reasons that this author won't pretend to understand, "IPv4 - mapped addresses" should not be allowed in IPv6-capable server applications. - To put it in terms that everyone can understand, this simply means that - a server should not accept IPv4 traffic on an IPv6 socket (an otherwise - legal operation). - An IPv4 mapped address is a mixed-format address of the form: -\end_layout - -\begin_layout Code - -::ffff:192.0.2.1 -\end_layout - -\begin_layout Standard -where the first portion is in IPv6 colon-hex format and the last portion - is in IPv4 dotted decimal notation. - The dotted decimal IPv4 address is the actual network address, but it is - being mapped into an IPv6 compatible format. -\end_layout - -\begin_layout Standard -To prevent IPv4 mapped addresses from being accepted on an IPv6 socket, - server applications must explicitly set the -\family typewriter -IPV6_V6ONLY -\family default - socket option on all IPv6 sockets created [the Hagino book implies that - this is only a concern with server applications. - However, it has been observed during testing that if a client application - uses an IPv4 mapped address to specify the target server, and the target - server has IPv4 mapped addresses disabled, the connection still completes - regardless. - On the server side, the connection endpoint is an IPv4 socket as desired; - but on the client side, the connection endpoint is an IPv6 socket. - Setting the IPV6_V6ONLY socket option on the client side as well as the - server side prevents any connection from being established at all.]. - There's only one problem. - Apparently, -\family typewriter -IPV6_V6ONLY -\family default - isn't defined on all systems [or at least it wasn't in 2005 when the Hagino - book was written]. - The server example at the end of this chapter provides a method for handling - this problem. -\end_layout - -\begin_layout Standard -If IPv4 traffic cannot be handled on IPv6 sockets, then that implies that - server applications must open both an IPv4 and IPv6 socket for a particular - network service if it wants to handle requests from either protocol. - This goes back to the flexibility issue mentioned earlier. - If -\family typewriter -getaddrinfo(3) -\family default - returns multiple address records, then server applications should traverse - the list and open a passive socket for each address provided. - -\end_layout - -\begin_layout Subsubsection -Cannot Specify the Scope Identifier in /etc/hosts -\end_layout - -\begin_layout Standard -It is possible to assign a hostname to an IPv6 network address in -\family typewriter -/etc/hosts -\family default -. - For example, the following is an excerpt from the -\family typewriter -/etc/hosts -\family default - file on the author's development system. - -\end_layout - -\begin_layout Code - - ::1 localhost -\end_layout - -\begin_layout Code - - 127.0.0.1 localhost -\end_layout - -\begin_layout Code - - fe80::2c0:8cff:fe01:2345 pt141 -\end_layout - -\begin_layout Code - - 192.0.2.1 pt141 -\end_layout - -\begin_layout Standard -The "localhost" and "pt141" hostnames can be translated to either an IPv4 - or IPv6 network address. - So, for example, if "pt141" is passed as the node parameter to -\family typewriter -getaddrinfo(3) -\family default -, the function returns both an IPv4 and IPv6 address record for the host - (assuming the behavior hasn't been modified by the hints parameter). - Unfortunately, a scoped address cannot be used in -\family typewriter -/etc/hosts -\family default -. - Doing so results in -\family typewriter -getaddrinfo(3) -\family default - returning only the IPv4 record. -\end_layout - -\begin_layout Subsubsection -Client & Server Residing on the Same Machine -\end_layout - -\begin_layout Standard -Suppose a machine has the IPv4 address 192.0.2.1. - A client application running on that machine can connect to a server applicatio -n on the same machine by using either the local loopback address (127.0.0.1) - or the network address (192.0.2.1) as the target server. - Much to this author's surprise (and dismay), it turns out that an IPv6 - client application cannot connect to a server application on the same machine - if it uses the network address of that machine as the target; it must use - the local loopback address (::1). - -\end_layout - -\begin_layout Subsection -Putting It All Together (A Client-Server Programming Example) -\end_layout - -\begin_layout Standard -Now it's time to put everything discussed thus far together into a sample - client-server application. - The remainder of this section is devoted to a remote time-of-day application - (the 'daytime' Internet service) [I noticed that Ms. - Castro used a 'daytime' example in her -\emph on -Porting applications to IPv6 HowTo -\emph default -. - For the record, the source code presented here is original, developed from - scratch, and any similarity between it and any other publicly available - 'daytime' example is purely coincidental.]. - The source code presented in this section was developed and tested on a - RedHat Linux release using the 2.6 kernel (2.6.9 to be specific). - Readers may use the source code freely, so long as proper credit is attributed; - but of course the standard disclaimer must be given first: -\end_layout - -\begin_layout Quotation -Although the sample source code is believed to be free of errors, the author - makes no guarantees as to its reliability, especially considering that - some error paths were intentionally omitted for brevity. - Use it at your own risk! -\end_layout - -\begin_layout Standard -When you get right down to it, there really aren't that many differences - between IPv4 and IPv6 applications. - The trick is to code IPv6 applications in a protocol-independent manner, - such that they can handle both IPv4 and IPv6 simultaneously and transparently. - This sample application does just that. - The only protocol-dependent code in the example occurs when printing network - addresses in verbose mode; but only -\bar under -after -\bar default - the -\family typewriter -ai_family field -\family default - in the -\family typewriter -addrinfo -\family default - structure has been checked, so the programs know exactly what type of address - they're handling at the time. -\end_layout - -\begin_layout Subsubsection -'Daytime' Server Code -\end_layout - -\begin_layout Standard -The server code is found in file tod6d.c (time-of-day IPv6 daemon). - Once built, the server may be started using the following command syntax - (assuming tod6d is the executable file): -\end_layout - -\begin_layout Code - -tod6d [-v] [service] -\end_layout - -\begin_layout Standard -ARGUMENTS: -\end_layout - -\begin_layout Description -service The service (or well-known port) on which to listen. - Default is "daytime". -\end_layout - -\begin_layout Standard -OPTIONS: -\end_layout - -\begin_layout Description --v Turn on verbose mode. -\end_layout - -\begin_layout Standard -The server handles both TCP and UDP requests on the network. - The server source code contained in tod6d.c follows: -\end_layout - -\begin_layout Code - -/****************************************************************************** -\end_layout - -\begin_layout Code - -* File: tod6d.c -\end_layout - -\begin_layout Code - -* Description: Contains source code for an IPv6-capable 'daytime' server. -\end_layout - -\begin_layout Code - -* Author: John Wenker, Sr. - Software Engineer, -\end_layout - -\begin_layout Code - -* Performance Technologies, San Diego, USA -\end_layout - -\begin_layout Code - -******************************************************************************/ -\end_layout - -\begin_layout Code - -/* -\end_layout - -\begin_layout Code - -** System header files. -\end_layout - -\begin_layout Code - -*/ -\end_layout - -\begin_layout Code - -#include /* errno declaration & error codes. - */ -\end_layout - -\begin_layout Code - -#include /* getaddrinfo(3) et al. - */ -\end_layout - -\begin_layout Code - -#include /* sockaddr_in & sockaddr_in6 definition. - */ -\end_layout - -\begin_layout Code - -#include /* printf(3) et al. - */ -\end_layout - -\begin_layout Code - -#include /* exit(2). - */ -\end_layout - -\begin_layout Code - -#include /* String manipulation & memory functions. - */ -\end_layout - -\begin_layout Code - -#include /* poll(2) and related definitions. - */ -\end_layout - -\begin_layout Code - -#include /* Socket functions (socket(2), bind(2), etc). - */ -\end_layout - -\begin_layout Code - -#include /* time(2) & ctime(3). - */ -\end_layout - -\begin_layout Code - -#include /* getopt(3), read(2), etc. - */ -\end_layout - -\begin_layout Code - -/* -\end_layout - -\begin_layout Code - -** Constants. -\end_layout - -\begin_layout Code - -*/ -\end_layout - -\begin_layout Code - -#define DFLT_SERVICE "daytime" /* Default service name. - */ -\end_layout - -\begin_layout Code - -#define INVALID_DESC -1 /* Invalid file descriptor. - */ -\end_layout - -\begin_layout Code - -#define MAXCONNQLEN 3 /* Max nbr of connection requests to queue. - */ -\end_layout - -\begin_layout Code - -#define MAXTCPSCKTS 2 /* One TCP socket for IPv4 & one for IPv6. - */ -\end_layout - -\begin_layout Code - -#define MAXUDPSCKTS 2 /* One UDP socket for IPv4 & one for IPv6. - */ -\end_layout - -\begin_layout Code - -#define VALIDOPTS "v" /* Valid command options. - */ -\end_layout - -\begin_layout Code - -/* -\end_layout - -\begin_layout Code - -** Simple boolean type definition. -\end_layout - -\begin_layout Code - -*/ -\end_layout - -\begin_layout Code - -typedef enum { false = 0, true } boolean; -\end_layout - -\begin_layout Code - -/* -\end_layout - -\begin_layout Code - -** Prototypes for internal helper functions. -\end_layout - -\begin_layout Code - -*/ -\end_layout - -\begin_layout Code - -static int openSckt( const char *service, -\end_layout - -\begin_layout Code - - const char *protocol, -\end_layout - -\begin_layout Code - - int desc[ ], -\end_layout - -\begin_layout Code - - size_t *descSize ); -\end_layout - -\begin_layout Code - -static void tod( int tSckt[ ], -\end_layout - -\begin_layout Code - - size_t tScktSize, -\end_layout - -\begin_layout Code - - int uSckt[ ], -\end_layout - -\begin_layout Code - - size_t uScktSize ); -\end_layout - -\begin_layout Code - -/* -\end_layout - -\begin_layout Code - -** Global (within this file only) data objects. -\end_layout - -\begin_layout Code - -*/ -\end_layout - -\begin_layout Code - -static char hostBfr[ NI_MAXHOST ]; /* For use w/getnameinfo(3). - */ -\end_layout - -\begin_layout Code - -static const char *pgmName; /* Program name w/o dir prefix. - */ -\end_layout - -\begin_layout Code - -static char servBfr[ NI_MAXSERV ]; /* For use w/getnameinfo(3). - */ -\end_layout - -\begin_layout Code - -static boolean verbose = false; /* Verbose mode indication. - */ -\end_layout - -\begin_layout Code - -/* -\end_layout - -\begin_layout Code - -** Usage macro for command syntax violations. -\end_layout - -\begin_layout Code - -*/ -\end_layout - -\begin_layout Code - -#define USAGE -\backslash - -\end_layout - -\begin_layout Code - - { -\backslash - -\end_layout - -\begin_layout Code - - fprintf( stderr, -\backslash - -\end_layout - -\begin_layout Code - - "Usage: %s [-v] [service] -\backslash -n", -\backslash - -\end_layout - -\begin_layout Code - - pgmName ); -\backslash - -\end_layout - -\begin_layout Code - - exit( 127 ); -\backslash - -\end_layout - -\begin_layout Code - - } /* End USAGE macro. - */ -\end_layout - -\begin_layout Code - -/* -\end_layout - -\begin_layout Code - -** Macro to terminate the program if a system call error occurs. - The system -\end_layout - -\begin_layout Code - -** call must be one of the usual type that returns -1 on error. - This macro is -\end_layout - -\begin_layout Code - -** a modified version of a macro authored by Dr. - V. - Vinge, SDSU Dept. - of -\end_layout - -\begin_layout Code - -** Computer Science (retired)... - best professor I ever had. - I hear he writes -\end_layout - -\begin_layout Code - -** great science fiction in addition to robust code, too. -\end_layout - -\begin_layout Code - -*/ -\end_layout - -\begin_layout Code - -#define CHK(expr) -\backslash - -\end_layout - -\begin_layout Code - - do -\backslash - -\end_layout - -\begin_layout Code - - { -\backslash - -\end_layout - -\begin_layout Code - - if ( (expr) == -1 ) -\backslash - -\end_layout - -\begin_layout Code - - { -\backslash - -\end_layout - -\begin_layout Code - - fprintf( stderr, -\backslash - -\end_layout - -\begin_layout Code - - "%s (line %d): System call ERROR - %s. -\backslash -n", -\backslash - -\end_layout - -\begin_layout Code - - pgmName, -\backslash - -\end_layout - -\begin_layout Code - - __LINE__, -\backslash - -\end_layout - -\begin_layout Code - - strerror( errno ) ); -\backslash - -\end_layout - -\begin_layout Code - - exit( 1 ); -\backslash - -\end_layout - -\begin_layout Code - - } /* End IF system call failed. - */ -\backslash - -\end_layout - -\begin_layout Code - - } while ( false ) -\end_layout - -\begin_layout Code - -/****************************************************************************** -\end_layout - -\begin_layout Code - -* Function: main -\end_layout - -\begin_layout Code - -* -\end_layout - -\begin_layout Code - -* Description: -\end_layout - -\begin_layout Code - -* Set up a time-of-day server and handle network requests. - This server -\end_layout - -\begin_layout Code - -* handles both TCP and UDP requests. -\end_layout - -\begin_layout Code - -* -\end_layout - -\begin_layout Code - -* Parameters: -\end_layout - -\begin_layout Code - -* The usual argc and argv parameters to a main() function. -\end_layout - -\begin_layout Code - -* -\end_layout - -\begin_layout Code - -* Return Value: -\end_layout - -\begin_layout Code - -* This is a daemon program and never returns. - However, in the degenerate -\end_layout - -\begin_layout Code - -* case where no sockets are created, the function returns zero. -\end_layout - -\begin_layout Code - -******************************************************************************/ -\end_layout - -\begin_layout Code - -int main( int argc, -\end_layout - -\begin_layout Code - - char *argv[ ] ) -\end_layout - -\begin_layout Code - -{ -\end_layout - -\begin_layout Code - - int opt; -\end_layout - -\begin_layout Code - - const char *service = DFLT_SERVICE; -\end_layout - -\begin_layout Code - - int tSckt[ MAXTCPSCKTS ]; /* Array of TCP socket descriptors. - */ -\end_layout - -\begin_layout Code - - size_t tScktSize = MAXTCPSCKTS; /* Size of uSckt (# of elements). - */ -\end_layout - -\begin_layout Code - - int uSckt[ MAXUDPSCKTS ]; /* Array of UDP socket descriptors. - */ -\end_layout - -\begin_layout Code - - size_t uScktSize = MAXUDPSCKTS; /* Size of uSckt (# of elements). - */ -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Set the program name (w/o directory prefix). -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - pgmName = strrchr( argv[ 0 ], '/' ); -\end_layout - -\begin_layout Code - - pgmName = pgmName == NULL ? argv[ 0 ] : pgmName + 1; -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Process command options. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - opterr = 0; /* Turns off "invalid option" error messages. - */ -\end_layout - -\begin_layout Code - - while ( ( opt = getopt( argc, argv, VALIDOPTS ) ) >= 0 ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - switch ( opt ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - case 'v': /* Verbose mode. - */ -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - verbose = true; -\end_layout - -\begin_layout Code - - break; -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - default: -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - USAGE; -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - } /* End SWITCH on command option. - */ -\end_layout - -\begin_layout Code - - } /* End WHILE processing options. - */ -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Process command line arguments. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - switch ( argc - optind ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - case 0: break; -\end_layout - -\begin_layout Code - - case 1: service = argv[ optind ]; break; -\end_layout - -\begin_layout Code - - default: USAGE; -\end_layout - -\begin_layout Code - - } /* End SWITCH on number of command line arguments. - */ -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Open both a TCP and UDP socket, for both IPv4 & IPv6, on which to - receive -\end_layout - -\begin_layout Code - - ** service requests. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - if ( ( openSckt( service, "tcp", tSckt, &tScktSize ) < 0 ) || -\end_layout - -\begin_layout Code - - ( openSckt( service, "udp", uSckt, &uScktSize ) < 0 ) ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - exit( 1 ); -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Run the time-of-day server. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - if ( ( tScktSize > 0 ) || ( uScktSize > 0 ) ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - tod( tSckt, /* tod() never returns. - */ -\end_layout - -\begin_layout Code - - tScktSize, -\end_layout - -\begin_layout Code - - uSckt, -\end_layout - -\begin_layout Code - - uScktSize ); -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Since tod() never returns, execution only gets here if no sockets - were -\end_layout - -\begin_layout Code - - ** created. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - if ( verbose ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - fprintf( stderr, -\end_layout - -\begin_layout Code - - "%s: No sockets opened... - terminating. -\backslash -n", -\end_layout - -\begin_layout Code - - pgmName ); -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - return 0; -\end_layout - -\begin_layout Code - -} /* End main() */ -\end_layout - -\begin_layout Code - -/****************************************************************************** -\end_layout - -\begin_layout Code - -* Function: openSckt -\end_layout - -\begin_layout Code - -* -\end_layout - -\begin_layout Code - -* Description: -\end_layout - -\begin_layout Code - -* Open passive (server) sockets for the indicated inet service & protocol. -\end_layout - -\begin_layout Code - -* Notice in the last sentence that "sockets" is plural. - During the interim -\end_layout - -\begin_layout Code - -* transition period while everyone is switching over to IPv6, the server -\end_layout - -\begin_layout Code - -* application has to open two sockets on which to listen for connections... -\end_layout - -\begin_layout Code - -* one for IPv4 traffic and one for IPv6 traffic. -\end_layout - -\begin_layout Code - -* -\end_layout - -\begin_layout Code - -* Parameters: -\end_layout - -\begin_layout Code - -* service - Pointer to a character string representing the well-known - port -\end_layout - -\begin_layout Code - -* on which to listen (can be a service name or a decimal number). -\end_layout - -\begin_layout Code - -* protocol - Pointer to a character string representing the transport - layer -\end_layout - -\begin_layout Code - -* protocol (only "tcp" or "udp" are valid). -\end_layout - -\begin_layout Code - -* desc - Pointer to an array into which the socket descriptors are -\end_layout - -\begin_layout Code - -* placed when opened. -\end_layout - -\begin_layout Code - -* descSize - This is a value-result parameter. - On input, it contains the -\end_layout - -\begin_layout Code - -* max number of descriptors that can be put into 'desc' (i.e. - the -\end_layout - -\begin_layout Code - -* number of elements in the array). - Upon return, it will contain -\end_layout - -\begin_layout Code - -* the number of descriptors actually opened. - Any unused slots in -\end_layout - -\begin_layout Code - -* 'desc' are set to INVALID_DESC. -\end_layout - -\begin_layout Code - -* -\end_layout - -\begin_layout Code - -* Return Value: -\end_layout - -\begin_layout Code - -* 0 on success, -1 on error. -\end_layout - -\begin_layout Code - -******************************************************************************/ -\end_layout - -\begin_layout Code - -static int openSckt( const char *service, -\end_layout - -\begin_layout Code - - const char *protocol, -\end_layout - -\begin_layout Code - - int desc[ ], -\end_layout - -\begin_layout Code - - size_t *descSize ) -\end_layout - -\begin_layout Code - -{ -\end_layout - -\begin_layout Code - - struct addrinfo *ai; -\end_layout - -\begin_layout Code - - int aiErr; -\end_layout - -\begin_layout Code - - struct addrinfo *aiHead; -\end_layout - -\begin_layout Code - - struct addrinfo hints = { .ai_flags = AI_PASSIVE, /* Server mode. - -\end_layout - -\begin_layout Code - -¬ */ -\end_layout - -\begin_layout Code - - .ai_family = PF_UNSPEC }; /* IPv4 or IPv6. -\end_layout - -\begin_layout Code - -¬ */ -\end_layout - -\begin_layout Code - - size_t maxDescs = *descSize; -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Initialize output parameters. - When the loop completes, *descSize is 0. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - while ( *descSize > 0 ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - desc[ --( *descSize ) ] = INVALID_DESC; -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Check which protocol is selected (only TCP and UDP are valid). -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - if ( strcmp( protocol, "tcp" ) == 0 ) /* TCP protocol. - */ -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - hints.ai_socktype = SOCK_STREAM; -\end_layout - -\begin_layout Code - - hints.ai_protocol = IPPROTO_TCP; -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - else if ( strcmp( protocol, "udp" ) == 0 ) /* UDP protocol. - */ -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - hints.ai_socktype = SOCK_DGRAM; -\end_layout - -\begin_layout Code - - hints.ai_protocol = IPPROTO_UDP; -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - else /* Invalid protocol. - */ -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - fprintf( stderr, -\end_layout - -\begin_layout Code - - "%s (line %d): ERROR - Unknown transport " -\end_layout - -\begin_layout Code - - "layer protocol -\backslash -"%s -\backslash -". -\backslash -n", -\end_layout - -\begin_layout Code - - pgmName, -\end_layout - -\begin_layout Code - - __LINE__, -\end_layout - -\begin_layout Code - - protocol ); -\end_layout - -\begin_layout Code - - return -1; -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Look up the service's well-known port number. - Notice that NULL is being -\end_layout - -\begin_layout Code - - ** passed for the 'node' parameter, and that the AI_PASSIVE flag is set - in -\end_layout - -\begin_layout Code - - ** 'hints'. - Thus, the program is requesting passive address information. -\end_layout - -\begin_layout Code - - ** The network address is initialized to :: (all zeros) for IPv6 records, - or -\end_layout - -\begin_layout Code - - ** 0.0.0.0 for IPv4 records. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - if ( ( aiErr = getaddrinfo( NULL, -\end_layout - -\begin_layout Code - - service, -\end_layout - -\begin_layout Code - - &hints, -\end_layout - -\begin_layout Code - - &aiHead ) ) != 0 ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - fprintf( stderr, -\end_layout - -\begin_layout Code - - "%s (line %d): ERROR - %s. -\backslash -n", -\end_layout - -\begin_layout Code - - pgmName, -\end_layout - -\begin_layout Code - - __LINE__, -\end_layout - -\begin_layout Code - - gai_strerror( aiErr ) ); -\end_layout - -\begin_layout Code - - return -1; -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** For each of the address records returned, attempt to set up a passive -\end_layout - -\begin_layout Code - - ** socket. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - for ( ai = aiHead; -\end_layout - -\begin_layout Code - - ( ai != NULL ) && ( *descSize < maxDescs ); -\end_layout - -\begin_layout Code - - ai = ai->ai_next ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - if ( verbose ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Display the current address info. - Start with the protocol- -\end_layout - -\begin_layout Code - - ** independent fields first. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - fprintf( stderr, -\end_layout - -\begin_layout Code - - "Setting up a passive socket based on the " -\end_layout - -\begin_layout Code - - "following address info: -\backslash -n" -\end_layout - -\begin_layout Code - - " ai_flags = 0x%02X -\backslash -n" -\end_layout - -\begin_layout Code - - " ai_family = %d (PF_INET = %d, PF_INET6 = %d) -\backslash -n" -\end_layout - -\begin_layout Code - - " ai_socktype = %d (SOCK_STREAM = %d, SOCK_DGRAM = - %d) -\backslash -n" -\end_layout - -\begin_layout Code - - " ai_protocol = %d (IPPROTO_TCP = %d, IPPROTO_UDP = - %d) -\backslash -n" -\end_layout - -\begin_layout Code - - " ai_addrlen = %d (sockaddr_in = %d, " -\end_layout - -\begin_layout Code - - "sockaddr_in6 = %d) -\backslash -n", -\end_layout - -\begin_layout Code - - ai->ai_flags, -\end_layout - -\begin_layout Code - - ai->ai_family, -\end_layout - -\begin_layout Code - - PF_INET, -\end_layout - -\begin_layout Code - - PF_INET6, -\end_layout - -\begin_layout Code - - ai->ai_socktype, -\end_layout - -\begin_layout Code - - SOCK_STREAM, -\end_layout - -\begin_layout Code - - SOCK_DGRAM, -\end_layout - -\begin_layout Code - - ai->ai_protocol, -\end_layout - -\begin_layout Code - - IPPROTO_TCP, -\end_layout - -\begin_layout Code - - IPPROTO_UDP, -\end_layout - -\begin_layout Code - - ai->ai_addrlen, -\end_layout - -\begin_layout Code - - sizeof( struct sockaddr_in ), -\end_layout - -\begin_layout Code - - sizeof( struct sockaddr_in6 ) ); -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Now display the protocol-specific formatted socket address. - Note -\end_layout - -\begin_layout Code - - ** that the program is requesting that getnameinfo(3) convert the -\end_layout - -\begin_layout Code - - ** host & service into numeric strings. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - getnameinfo( ai->ai_addr, -\end_layout - -\begin_layout Code - - ai->ai_addrlen, -\end_layout - -\begin_layout Code - - hostBfr, -\end_layout - -\begin_layout Code - - sizeof( hostBfr ), -\end_layout - -\begin_layout Code - - servBfr, -\end_layout - -\begin_layout Code - - sizeof( servBfr ), -\end_layout - -\begin_layout Code - - NI_NUMERICHOST | NI_NUMERICSERV ); -\end_layout - -\begin_layout Code - - switch ( ai->ai_family ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - case PF_INET: /* IPv4 address record. - */ -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - struct sockaddr_in *p = (struct sockaddr_in*) ai->ai_addr; -\end_layout - -\begin_layout Code - - fprintf( stderr, -\end_layout - -\begin_layout Code - - " ai_addr = sin_family: %d (AF_INET = %d, - " -\end_layout - -\begin_layout Code - - "AF_INET6 = %d) -\backslash -n" -\end_layout - -\begin_layout Code - - " sin_addr: %s -\backslash -n" -\end_layout - -\begin_layout Code - - " sin_port: %s -\backslash -n", -\end_layout - -\begin_layout Code - - p->sin_family, -\end_layout - -\begin_layout Code - - AF_INET, -\end_layout - -\begin_layout Code - - AF_INET6, -\end_layout - -\begin_layout Code - - hostBfr, -\end_layout - -\begin_layout Code - - servBfr ); -\end_layout - -\begin_layout Code - - break; -\end_layout - -\begin_layout Code - - } /* End CASE of IPv4. - */ -\end_layout - -\begin_layout Code - - case PF_INET6: /* IPv6 address record. - */ -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - struct sockaddr_in6 *p = (struct sockaddr_in6*) ai->ai_addr; -\end_layout - -\begin_layout Code - - fprintf( stderr, -\end_layout - -\begin_layout Code - - " ai_addr = sin6_family: %d (AF_INET = - %d, " -\end_layout - -\begin_layout Code - - "AF_INET6 = %d) -\backslash -n" -\end_layout - -\begin_layout Code - - " sin6_addr: %s -\backslash -n" -\end_layout - -\begin_layout Code - - " sin6_port: %s -\backslash -n" -\end_layout - -\begin_layout Code - - " sin6_flowinfo: %d -\backslash -n" -\end_layout - -\begin_layout Code - - " sin6_scope_id: %d -\backslash -n", -\end_layout - -\begin_layout Code - - p->sin6_family, -\end_layout - -\begin_layout Code - - AF_INET, -\end_layout - -\begin_layout Code - - AF_INET6, -\end_layout - -\begin_layout Code - - hostBfr, -\end_layout - -\begin_layout Code - - servBfr, -\end_layout - -\begin_layout Code - - p->sin6_flowinfo, -\end_layout - -\begin_layout Code - - p->sin6_scope_id ); -\end_layout - -\begin_layout Code - - break; -\end_layout - -\begin_layout Code - - } /* End CASE of IPv6. - */ -\end_layout - -\begin_layout Code - - default: /* Can never get here, but just for completeness. - */ -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - fprintf( stderr, -\end_layout - -\begin_layout Code - - "%s (line %d): ERROR - Unknown protocol family (%d). -\backslash -n", -\end_layout - -\begin_layout Code - - pgmName, -\end_layout - -\begin_layout Code - - __LINE__, -\end_layout - -\begin_layout Code - - ai->ai_family ); -\end_layout - -\begin_layout Code - - freeaddrinfo( aiHead ); -\end_layout - -\begin_layout Code - - return -1; -\end_layout - -\begin_layout Code - - } /* End DEFAULT case (unknown protocol family). - */ -\end_layout - -\begin_layout Code - - } /* End SWITCH on protocol family. - */ -\end_layout - -\begin_layout Code - - } /* End IF verbose mode. - */ -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Create a socket using the info in the addrinfo structure. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - CHK( desc[ *descSize ] = socket( ai->ai_family, -\end_layout - -\begin_layout Code - - ai->ai_socktype, -\end_layout - -\begin_layout Code - - ai->ai_protocol ) ); -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Here is the code that prevents "IPv4 mapped addresses", as discussed -\end_layout - -\begin_layout Code - - ** in Section 22.1.3.1. - If an IPv6 socket was just created, then set the -\end_layout - -\begin_layout Code - - ** IPV6_V6ONLY socket option. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - if ( ai->ai_family == PF_INET6 ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - -#if defined( IPV6_V6ONLY ) -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Disable IPv4 mapped addresses. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - int v6Only = 1; -\end_layout - -\begin_layout Code - - CHK( setsockopt( desc[ *descSize ], -\end_layout - -\begin_layout Code - - IPPROTO_IPV6, -\end_layout - -\begin_layout Code - - IPV6_V6ONLY, -\end_layout - -\begin_layout Code - - &v6Only, -\end_layout - -\begin_layout Code - - sizeof( v6Only ) ) ); -\end_layout - -\begin_layout Code - -#else -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** IPV6_V6ONLY is not defined, so the socket option can't be set - and -\end_layout - -\begin_layout Code - - ** thus IPv4 mapped addresses can't be disabled. - Print a warning -\end_layout - -\begin_layout Code - - ** message and close the socket. - Design note: If the -\end_layout - -\begin_layout Code - - ** #if...#else...#endif construct were removed, then this program -\end_layout - -\begin_layout Code - - ** would not compile (because IPV6_V6ONLY isn't defined). - That's an -\end_layout - -\begin_layout Code - - ** acceptable approach; IPv4 mapped addresses are certainly disabled -\end_layout - -\begin_layout Code - - ** if the program can't build! However, since this program is - also -\end_layout - -\begin_layout Code - - ** designed to work for IPv4 sockets as well as IPv6, I decided - to -\end_layout - -\begin_layout Code - - ** allow the program to compile when IPV6_V6ONLY is not defined, - and -\end_layout - -\begin_layout Code - - ** turn it into a run-time warning rather than a compile-time error. -\end_layout - -\begin_layout Code - - ** IPv4 mapped addresses are still disabled because _all_ IPv6 - traffic -\end_layout - -\begin_layout Code - - ** is disabled (all IPv6 sockets are closed here), but at least - this -\end_layout - -\begin_layout Code - - ** way the server can still service IPv4 network traffic. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - fprintf( stderr, -\end_layout - -\begin_layout Code - - "%s (line %d): WARNING - Cannot set IPV6_V6ONLY socket - " -\end_layout - -\begin_layout Code - - "option. - Closing IPv6 %s socket. -\backslash -n", -\end_layout - -\begin_layout Code - - pgmName, -\end_layout - -\begin_layout Code - - __LINE__, -\end_layout - -\begin_layout Code - - ai->ai_protocol == IPPROTO_TCP ? "TCP" : "UDP" ); -\end_layout - -\begin_layout Code - - CHK( close( desc[ *descSize ] ) ); -\end_layout - -\begin_layout Code - - continue; /* Go to top of FOR loop w/o updating *descSize! */ -\end_layout - -\begin_layout Code - -#endif /* IPV6_V6ONLY */ -\end_layout - -\begin_layout Code - - } /* End IF this is an IPv6 socket. - */ -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Bind the socket. - Again, the info from the addrinfo structure is used. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - CHK( bind( desc[ *descSize ], -\end_layout - -\begin_layout Code - - ai->ai_addr, -\end_layout - -\begin_layout Code - - ai->ai_addrlen ) ); -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** If this is a TCP socket, put the socket into passive listening - mode -\end_layout - -\begin_layout Code - - ** (listen is only valid on connection-oriented sockets). -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - if ( ai->ai_socktype == SOCK_STREAM ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - CHK( listen( desc[ *descSize ], -\end_layout - -\begin_layout Code - - MAXCONNQLEN ) ); -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Socket set up okay. - Bump index to next descriptor array element. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - *descSize += 1; -\end_layout - -\begin_layout Code - - } /* End FOR each address info structure returned. - */ -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Dummy check for unused address records. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - if ( verbose && ( ai != NULL ) ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - fprintf( stderr, -\end_layout - -\begin_layout Code - - "%s (line %d): WARNING - Some address records were " -\end_layout - -\begin_layout Code - - "not processed due to insufficient array space. -\backslash -n", -\end_layout - -\begin_layout Code - - pgmName, -\end_layout - -\begin_layout Code - - __LINE__ ); -\end_layout - -\begin_layout Code - - } /* End IF verbose and some address records remain unprocessed. - */ -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Clean up. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - freeaddrinfo( aiHead ); -\end_layout - -\begin_layout Code - - return 0; -\end_layout - -\begin_layout Code - -} /* End openSckt() */ -\end_layout - -\begin_layout Code - -/****************************************************************************** -\end_layout - -\begin_layout Code - -* Function: tod -\end_layout - -\begin_layout Code - -* -\end_layout - -\begin_layout Code - -* Description: -\end_layout - -\begin_layout Code - -* Listen on a set of sockets and send the current time-of-day to any -\end_layout - -\begin_layout Code - -* clients. - This function never returns. -\end_layout - -\begin_layout Code - -* -\end_layout - -\begin_layout Code - -* Parameters: -\end_layout - -\begin_layout Code - -* tSckt - Array of TCP socket descriptors on which to listen. -\end_layout - -\begin_layout Code - -* tScktSize - Size of the tSckt array (nbr of elements). -\end_layout - -\begin_layout Code - -* uSckt - Array of UDP socket descriptors on which to listen. -\end_layout - -\begin_layout Code - -* uScktSize - Size of the uSckt array (nbr of elements). -\end_layout - -\begin_layout Code - -* -\end_layout - -\begin_layout Code - -* Return Value: None. -\end_layout - -\begin_layout Code - -******************************************************************************/ -\end_layout - -\begin_layout Code - -static void tod( int tSckt[ ], -\end_layout - -\begin_layout Code - - size_t tScktSize, -\end_layout - -\begin_layout Code - - int uSckt[ ], -\end_layout - -\begin_layout Code - - size_t uScktSize ) -\end_layout - -\begin_layout Code - -{ -\end_layout - -\begin_layout Code - - char bfr[ 256 ]; -\end_layout - -\begin_layout Code - - ssize_t count; -\end_layout - -\begin_layout Code - - struct pollfd *desc; -\end_layout - -\begin_layout Code - - size_t descSize = tScktSize + uScktSize; -\end_layout - -\begin_layout Code - - int idx; -\end_layout - -\begin_layout Code - - int newSckt; -\end_layout - -\begin_layout Code - - struct sockaddr *sadr; -\end_layout - -\begin_layout Code - - socklen_t sadrLen; -\end_layout - -\begin_layout Code - - struct sockaddr_storage sockStor; -\end_layout - -\begin_layout Code - - int status; -\end_layout - -\begin_layout Code - - size_t timeLen; -\end_layout - -\begin_layout Code - - char *timeStr; -\end_layout - -\begin_layout Code - - time_t timeVal; -\end_layout - -\begin_layout Code - - ssize_t wBytes; -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Allocate memory for the poll(2) array. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - desc = malloc( descSize * sizeof( struct pollfd ) ); -\end_layout - -\begin_layout Code - - if ( desc == NULL ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - fprintf( stderr, -\end_layout - -\begin_layout Code - - "%s (line %d): ERROR - %s. -\backslash -n", -\end_layout - -\begin_layout Code - - pgmName, -\end_layout - -\begin_layout Code - - __LINE__, -\end_layout - -\begin_layout Code - - strerror( ENOMEM ) ); -\end_layout - -\begin_layout Code - - exit( 1 ); -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Initialize the poll(2) array. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - for ( idx = 0; idx < descSize; idx++ ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - desc[ idx ].fd = idx < tScktSize ? tSckt[ idx ] -\end_layout - -\begin_layout Code - - : uSckt[ idx - tScktSize ]; -\end_layout - -\begin_layout Code - - desc[ idx ].events = POLLIN; -\end_layout - -\begin_layout Code - - desc[ idx ].revents = 0; -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Main time-of-day server loop. - Handles both TCP & UDP requests. - This is -\end_layout - -\begin_layout Code - - ** an interative server, and all requests are handled directly within - the -\end_layout - -\begin_layout Code - - ** main loop. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - while ( true ) /* Do forever. - */ -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Wait for activity on one of the sockets. - The DO..WHILE construct is -\end_layout - -\begin_layout Code - - ** used to restart the system call in the event the process is -\end_layout - -\begin_layout Code - - ** interrupted by a signal. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - do -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - status = poll( desc, -\end_layout - -\begin_layout Code - - descSize, -\end_layout - -\begin_layout Code - - -1 /* Wait indefinitely for input. - */ ); -\end_layout - -\begin_layout Code - - } while ( ( status < 0 ) && ( errno == EINTR ) ); -\end_layout - -\begin_layout Code - - CHK( status ); /* Check for a bona fide system call error. - */ -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Get the current time. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - timeVal = time( NULL ); -\end_layout - -\begin_layout Code - - timeStr = ctime( &timeVal ); -\end_layout - -\begin_layout Code - - timeLen = strlen( timeStr ); -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Indicate that there is new network activity. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - if ( verbose ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - char *s = malloc( timeLen+1 ); -\end_layout - -\begin_layout Code - - strcpy( s, timeStr ); -\end_layout - -\begin_layout Code - - s[ timeLen-1 ] = ' -\backslash -0'; /* Overwrite ' -\backslash -n' in date string. - */ -\end_layout - -\begin_layout Code - - fprintf( stderr, -\end_layout - -\begin_layout Code - - "%s: New network activity on %s. -\backslash -n", -\end_layout - -\begin_layout Code - - pgmName, -\end_layout - -\begin_layout Code - - s ); -\end_layout - -\begin_layout Code - - free( s ); -\end_layout - -\begin_layout Code - - } /* End IF verbose. - */ -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Process sockets with input available. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - for ( idx = 0; idx < descSize; idx++ ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - switch ( desc[ idx ].revents ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - case 0: /* No activity on this socket; try the next. - */ -\end_layout - -\begin_layout Code - - continue; -\end_layout - -\begin_layout Code - - case POLLIN: /* Network activity. - Go process it. - */ -\end_layout - -\begin_layout Code - - break; -\end_layout - -\begin_layout Code - - default: /* Invalid poll events. - */ -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - fprintf( stderr, -\end_layout - -\begin_layout Code - - "%s (line %d): ERROR - Invalid poll event (0x%02X). -\backslash -n", -\end_layout - -\begin_layout Code - - pgmName, -\end_layout - -\begin_layout Code - - __LINE__, -\end_layout - -\begin_layout Code - - desc[ idx ].revents ); -\end_layout - -\begin_layout Code - - exit( 1 ); -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - } /* End SWITCH on returned poll events. - */ -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Determine if this is a TCP request or UDP request. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - if ( idx < tScktSize ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** TCP connection requested. - Accept it. - Notice the use of -\end_layout - -\begin_layout Code - - ** the sockaddr_storage data type. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - sadrLen = sizeof( sockStor ); -\end_layout - -\begin_layout Code - - sadr = (struct sockaddr*) &sockStor; -\end_layout - -\begin_layout Code - - CHK( newSckt = accept( desc[ idx ].fd, -\end_layout - -\begin_layout Code - - sadr, -\end_layout - -\begin_layout Code - - &sadrLen ) ); -\end_layout - -\begin_layout Code - - CHK( shutdown( newSckt, /* Server never recv's anything. - */ -\end_layout - -\begin_layout Code - - SHUT_RD ) ); -\end_layout - -\begin_layout Code - - if ( verbose ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Display the socket address of the remote client. - Begin with -\end_layout - -\begin_layout Code - - ** the address-independent fields. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - fprintf( stderr, -\end_layout - -\begin_layout Code - - "Sockaddr info for new TCP client: -\backslash -n" -\end_layout - -\begin_layout Code - - " sa_family = %d (AF_INET = %d, AF_INET6 = %d) -\backslash -n" -\end_layout - -\begin_layout Code - - " addr len = %d (sockaddr_in = %d, " -\end_layout - -\begin_layout Code - - "sockaddr_in6 = %d) -\backslash -n", -\end_layout - -\begin_layout Code - - sadr->sa_family, -\end_layout - -\begin_layout Code - - AF_INET, -\end_layout - -\begin_layout Code - - AF_INET6, -\end_layout - -\begin_layout Code - - sadrLen, -\end_layout - -\begin_layout Code - - sizeof( struct sockaddr_in ), -\end_layout - -\begin_layout Code - - sizeof( struct sockaddr_in6 ) ); -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Display the address-specific fields. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - getnameinfo( sadr, -\end_layout - -\begin_layout Code - - sadrLen, -\end_layout - -\begin_layout Code - - hostBfr, -\end_layout - -\begin_layout Code - - sizeof( hostBfr ), -\end_layout - -\begin_layout Code - - servBfr, -\end_layout - -\begin_layout Code - - sizeof( servBfr ), -\end_layout - -\begin_layout Code - - NI_NUMERICHOST | NI_NUMERICSERV ); -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Notice that we're switching on an address family now, - not a -\end_layout - -\begin_layout Code - - ** protocol family. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - switch ( sadr->sa_family ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - case AF_INET: /* IPv4 address. - */ -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - struct sockaddr_in *p = (struct sockaddr_in*) sadr; -\end_layout - -\begin_layout Code - - fprintf( stderr, -\end_layout - -\begin_layout Code - - " sin_addr = sin_family: %d -\backslash -n" -\end_layout - -\begin_layout Code - - " sin_addr: %s -\backslash -n" -\end_layout - -\begin_layout Code - - " sin_port: %s -\backslash -n", -\end_layout - -\begin_layout Code - - p->sin_family, -\end_layout - -\begin_layout Code - - hostBfr, -\end_layout - -\begin_layout Code - - servBfr ); -\end_layout - -\begin_layout Code - - break; -\end_layout - -\begin_layout Code - - } /* End CASE of IPv4. - */ -\end_layout - -\begin_layout Code - - case AF_INET6: /* IPv6 address. - */ -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - struct sockaddr_in6 *p = (struct sockaddr_in6*) sadr; -\end_layout - -\begin_layout Code - - fprintf( stderr, -\end_layout - -\begin_layout Code - - " sin6_addr = sin6_family: %d -\backslash -n" -\end_layout - -\begin_layout Code - - " sin6_addr: %s -\backslash -n" -\end_layout - -\begin_layout Code - - " sin6_port: %s -\backslash -n" -\end_layout - -\begin_layout Code - - " sin6_flowinfo: %d -\backslash -n" -\end_layout - -\begin_layout Code - - " sin6_scope_id: %d -\backslash -n", -\end_layout - -\begin_layout Code - - p->sin6_family, -\end_layout - -\begin_layout Code - - hostBfr, -\end_layout - -\begin_layout Code - - servBfr, -\end_layout - -\begin_layout Code - - p->sin6_flowinfo, -\end_layout - -\begin_layout Code - - p->sin6_scope_id ); -\end_layout - -\begin_layout Code - - break; -\end_layout - -\begin_layout Code - - } /* End CASE of IPv6. - */ -\end_layout - -\begin_layout Code - - default: /* Can never get here, but for completeness. - */ -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - fprintf( stderr, -\end_layout - -\begin_layout Code - - "%s (line %d): ERROR - Unknown address " -\end_layout - -\begin_layout Code - - "family (%d). -\backslash -n", -\end_layout - -\begin_layout Code - - pgmName, -\end_layout - -\begin_layout Code - - __LINE__, -\end_layout - -\begin_layout Code - - sadr->sa_family ); -\end_layout - -\begin_layout Code - - break; -\end_layout - -\begin_layout Code - - } /* End DEFAULT case (unknown address family). - */ -\end_layout - -\begin_layout Code - - } /* End SWITCH on address family. - */ -\end_layout - -\begin_layout Code - - } /* End IF verbose mode. - */ -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Send the TOD to the client. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - wBytes = timeLen; -\end_layout - -\begin_layout Code - - while ( wBytes > 0 ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - do -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - count = write( newSckt, -\end_layout - -\begin_layout Code - - timeStr, -\end_layout - -\begin_layout Code - - wBytes ); -\end_layout - -\begin_layout Code - - } while ( ( count < 0 ) && ( errno == EINTR ) ); -\end_layout - -\begin_layout Code - - CHK( count ); /* Check for a bona fide error. - */ -\end_layout - -\begin_layout Code - - wBytes -= count; -\end_layout - -\begin_layout Code - - } /* End WHILE there is data to send. - */ -\end_layout - -\begin_layout Code - - CHK( close( newSckt ) ); -\end_layout - -\begin_layout Code - - } /* End IF this was a TCP connection request. - */ -\end_layout - -\begin_layout Code - - else -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** This is a UDP socket, and a datagram is available. - The funny -\end_layout - -\begin_layout Code - - ** thing about UDP requests is that this server doesn't require - any -\end_layout - -\begin_layout Code - - ** client input; but it can't send the TOD unless it knows a - client -\end_layout - -\begin_layout Code - - ** wants the data, and the only way that can occur with UDP - is if -\end_layout - -\begin_layout Code - - ** the server receives a datagram from the client. - Thus, the -\end_layout - -\begin_layout Code - - ** server must receive _something_, but the content of the datagram -\end_layout - -\begin_layout Code - - ** is irrelevant. - Read in the datagram. - Again note the use of -\end_layout - -\begin_layout Code - - ** sockaddr_storage to receive the address. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - sadrLen = sizeof( sockStor ); -\end_layout - -\begin_layout Code - - sadr = (struct sockaddr*) &sockStor; -\end_layout - -\begin_layout Code - - CHK( count = recvfrom( desc[ idx ].fd, -\end_layout - -\begin_layout Code - - bfr, -\end_layout - -\begin_layout Code - - sizeof( bfr ), -\end_layout - -\begin_layout Code - - 0, -\end_layout - -\begin_layout Code - - sadr, -\end_layout - -\begin_layout Code - - &sadrLen ) ); -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Display whatever was received on stdout. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - if ( verbose ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - ssize_t rBytes = count; -\end_layout - -\begin_layout Code - - fprintf( stderr, -\end_layout - -\begin_layout Code - - "%s: UDP datagram received (%d bytes). -\backslash -n", -\end_layout - -\begin_layout Code - - pgmName, -\end_layout - -\begin_layout Code - - count ); -\end_layout - -\begin_layout Code - - while ( count > 0 ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - fputc( bfr[ rBytes - count-- ], -\end_layout - -\begin_layout Code - - stdout ); -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - if ( bfr[ rBytes-1 ] != ' -\backslash -n' ) -\end_layout - -\begin_layout Code - - fputc( ' -\backslash -n', stdout ); /* Newline also flushes stdout. - */ -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Display the socket address of the remote client. - Address- -\end_layout - -\begin_layout Code - - ** independent fields first. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - fprintf( stderr, -\end_layout - -\begin_layout Code - - "Remote client's sockaddr info: -\backslash -n" -\end_layout - -\begin_layout Code - - " sa_family = %d (AF_INET = %d, AF_INET6 = %d) -\backslash -n" -\end_layout - -\begin_layout Code - - " addr len = %d (sockaddr_in = %d, " -\end_layout - -\begin_layout Code - - "sockaddr_in6 = %d) -\backslash -n", -\end_layout - -\begin_layout Code - - sadr->sa_family, -\end_layout - -\begin_layout Code - - AF_INET, -\end_layout - -\begin_layout Code - - AF_INET6, -\end_layout - -\begin_layout Code - - sadrLen, -\end_layout - -\begin_layout Code - - sizeof( struct sockaddr_in ), -\end_layout - -\begin_layout Code - - sizeof( struct sockaddr_in6 ) ); -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Display the address-specific information. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - getnameinfo( sadr, -\end_layout - -\begin_layout Code - - sadrLen, -\end_layout - -\begin_layout Code - - hostBfr, -\end_layout - -\begin_layout Code - - sizeof( hostBfr ), -\end_layout - -\begin_layout Code - - servBfr, -\end_layout - -\begin_layout Code - - sizeof( servBfr ), -\end_layout - -\begin_layout Code - - NI_NUMERICHOST | NI_NUMERICSERV ); -\end_layout - -\begin_layout Code - - switch ( sadr->sa_family ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - case AF_INET: /* IPv4 address. - */ -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - struct sockaddr_in *p = (struct sockaddr_in*) sadr; -\end_layout - -\begin_layout Code - - fprintf( stderr, -\end_layout - -\begin_layout Code - - " sin_addr = sin_family: %d -\backslash -n" -\end_layout - -\begin_layout Code - - " sin_addr: %s -\backslash -n" -\end_layout - -\begin_layout Code - - " sin_port: %s -\backslash -n", -\end_layout - -\begin_layout Code - - p->sin_family, -\end_layout - -\begin_layout Code - - hostBfr, -\end_layout - -\begin_layout Code - - servBfr ); -\end_layout - -\begin_layout Code - - break; -\end_layout - -\begin_layout Code - - } /* End CASE of IPv4 address. - */ -\end_layout - -\begin_layout Code - - case AF_INET6: /* IPv6 address. - */ -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - struct sockaddr_in6 *p = (struct sockaddr_in6*) sadr; -\end_layout - -\begin_layout Code - - fprintf( stderr, -\end_layout - -\begin_layout Code - - " sin6_addr = sin6_family: %d -\backslash -n" -\end_layout - -\begin_layout Code - - " sin6_addr: %s -\backslash -n" -\end_layout - -\begin_layout Code - - " sin6_port: %s -\backslash -n" -\end_layout - -\begin_layout Code - - " sin6_flowinfo: %d -\backslash -n" -\end_layout - -\begin_layout Code - - " sin6_scope_id: %d -\backslash -n", -\end_layout - -\begin_layout Code - - p->sin6_family, -\end_layout - -\begin_layout Code - - hostBfr, -\end_layout - -\begin_layout Code - - servBfr, -\end_layout - -\begin_layout Code - - p->sin6_flowinfo, -\end_layout - -\begin_layout Code - - p->sin6_scope_id ); -\end_layout - -\begin_layout Code - - break; -\end_layout - -\begin_layout Code - - } /* End CASE of IPv6 address. - */ -\end_layout - -\begin_layout Code - - default: /* Can never get here, but for completeness. - */ -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - fprintf( stderr, -\end_layout - -\begin_layout Code - - "%s (line %d): ERROR - Unknown address " -\end_layout - -\begin_layout Code - - "family (%d). -\backslash -n", -\end_layout - -\begin_layout Code - - pgmName, -\end_layout - -\begin_layout Code - - __LINE__, -\end_layout - -\begin_layout Code - - sadr->sa_family ); -\end_layout - -\begin_layout Code - - break; -\end_layout - -\begin_layout Code - - } /* End DEFAULT case (unknown address family). - */ -\end_layout - -\begin_layout Code - - } /* End SWITCH on address family. - */ -\end_layout - -\begin_layout Code - - } /* End IF verbose mode. - */ -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Send the time-of-day to the client. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - wBytes = timeLen; -\end_layout - -\begin_layout Code - - while ( wBytes > 0 ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - do -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - count = sendto( desc[ idx ].fd, -\end_layout - -\begin_layout Code - - timeStr, -\end_layout - -\begin_layout Code - - wBytes, -\end_layout - -\begin_layout Code - - 0, -\end_layout - -\begin_layout Code - - sadr, /* Address & address length - */ -\end_layout - -\begin_layout Code - - sadrLen ); /* received in recvfrom(). - */ -\end_layout - -\begin_layout Code - - } while ( ( count < 0 ) && ( errno == EINTR ) ); -\end_layout - -\begin_layout Code - - CHK( count ); /* Check for a bona fide error. - */ -\end_layout - -\begin_layout Code - - wBytes -= count; -\end_layout - -\begin_layout Code - - } /* End WHILE there is data to send. - */ -\end_layout - -\begin_layout Code - - } /* End ELSE a UDP datagram is available. - */ -\end_layout - -\begin_layout Code - - desc[ idx ].revents = 0; /* Clear the returned poll events. - */ -\end_layout - -\begin_layout Code - - } /* End FOR each socket descriptor. - */ -\end_layout - -\begin_layout Code - - } /* End WHILE forever. - */ -\end_layout - -\begin_layout Code - -} /* End tod() */ -\end_layout - -\begin_layout Subsubsection -'Daytime' TCP Client Code -\end_layout - -\begin_layout Standard -The TCP client code is found in file tod6tc.c (time-of-day IPv6 TCP client). - Once built, the TCP client may be started using the following command syntax - (assuming tod6tc is the executable file): -\end_layout - -\begin_layout Code - -tod6tc [-v] [-s scope_id] [host [service]] -\end_layout - -\begin_layout Standard -ARGUMENTS: -\end_layout - -\begin_layout Description -host The hostname or IP address (dotted decimal or colon-hex) of the remote - host providing the service. - Default is "localhost". -\end_layout - -\begin_layout Description -service The TCP service (or well-known port number) to which a connection - attempt is made. - Default is "daytime". -\end_layout - -\begin_layout Standard -OPTIONS: -\end_layout - -\begin_layout Description --s This option is only meaningful for IPv6 addresses, and is used to set - the scope identifier (i.e. - the network interface on which to establish the connection). - Default is "eth0". - If host is a scoped address, this option is ignored. -\end_layout - -\begin_layout Description --v Turn on verbose mode. -\end_layout - -\begin_layout Standard -The TCP client source code contained in tod6tc.c follows: -\end_layout - -\begin_layout Code - -/****************************************************************************** -\end_layout - -\begin_layout Code - -* File: tod6tc.c -\end_layout - -\begin_layout Code - -* Description: Contains source code for an IPv6-capable 'daytime' TCP client. -\end_layout - -\begin_layout Code - -* Author: John Wenker, Sr. - Software Engineer -\end_layout - -\begin_layout Code - -* Performance Technologies, San Diego, USA -\end_layout - -\begin_layout Code - -******************************************************************************/ -\end_layout - -\begin_layout Code - -/* -\end_layout - -\begin_layout Code - -** System header files. -\end_layout - -\begin_layout Code - -*/ -\end_layout - -\begin_layout Code - -#include /* errno declaration and error codes. - */ -\end_layout - -\begin_layout Code - -#include /* if_nametoindex(3). - */ -\end_layout - -\begin_layout Code - -#include /* getaddrinfo(3) and associated definitions. - */ -\end_layout - -\begin_layout Code - -#include /* sockaddr_in and sockaddr_in6 definitions. - */ -\end_layout - -\begin_layout Code - -#include /* printf(3) et al. - */ -\end_layout - -\begin_layout Code - -#include /* exit(2). - */ -\end_layout - -\begin_layout Code - -#include /* String manipulation and memory functions. - */ -\end_layout - -\begin_layout Code - -#include /* Socket functions (socket(2), connect(2), etc). - */ -\end_layout - -\begin_layout Code - -#include /* getopt(3), read(2), etc. - */ -\end_layout - -\begin_layout Code - -/* -\end_layout - -\begin_layout Code - -** Constants & macros. -\end_layout - -\begin_layout Code - -*/ -\end_layout - -\begin_layout Code - -#define DFLT_HOST "localhost" /* Default server name. - */ -\end_layout - -\begin_layout Code - -#define DFLT_SCOPE_ID "eth0" /* Default scope identifier. - */ -\end_layout - -\begin_layout Code - -#define DFLT_SERVICE "daytime" /* Default service name. - */ -\end_layout - -\begin_layout Code - -#define INVALID_DESC -1 /* Invalid file (socket) descriptor. - */ -\end_layout - -\begin_layout Code - -#define MAXBFRSIZE 256 /* Max bfr sz to read remote TOD. - */ -\end_layout - -\begin_layout Code - -#define VALIDOPTS "s:v" /* Valid command options. - */ -\end_layout - -\begin_layout Code - -/* -\end_layout - -\begin_layout Code - -** Type definitions (for convenience). -\end_layout - -\begin_layout Code - -*/ -\end_layout - -\begin_layout Code - -typedef enum { false = 0, true } boolean; -\end_layout - -\begin_layout Code - -typedef struct sockaddr_in sockaddr_in_t; -\end_layout - -\begin_layout Code - -typedef struct sockaddr_in6 sockaddr_in6_t; -\end_layout - -\begin_layout Code - -/* -\end_layout - -\begin_layout Code - -** Prototypes for internal helper functions. -\end_layout - -\begin_layout Code - -*/ -\end_layout - -\begin_layout Code - -static int openSckt( const char *host, -\end_layout - -\begin_layout Code - - const char *service, -\end_layout - -\begin_layout Code - - unsigned int scopeId ); -\end_layout - -\begin_layout Code - -static void tod( int sckt ); -\end_layout - -\begin_layout Code - -/* -\end_layout - -\begin_layout Code - -** Global (within this file only) data objects. -\end_layout - -\begin_layout Code - -*/ -\end_layout - -\begin_layout Code - -static const char *pgmName; /* Program name (w/o directory). - */ -\end_layout - -\begin_layout Code - -static boolean verbose = false; /* Verbose mode. - */ -\end_layout - -\begin_layout Code - -/* -\end_layout - -\begin_layout Code - -** Usage macro. -\end_layout - -\begin_layout Code - -*/ -\end_layout - -\begin_layout Code - -#define USAGE - -\backslash - -\end_layout - -\begin_layout Code - - { - -\backslash - -\end_layout - -\begin_layout Code - - fprintf( stderr, - -\backslash - -\end_layout - -\begin_layout Code - - "Usage: %s [-v] [-s scope_id] [host [service]] -\backslash -n", -\backslash - -\end_layout - -\begin_layout Code - - pgmName ); - -\backslash - -\end_layout - -\begin_layout Code - - exit( 127 ); - -\backslash - -\end_layout - -\begin_layout Code - - } /* End USAGE macro. - */ -\end_layout - -\begin_layout Code - -/* -\end_layout - -\begin_layout Code - -** This "macro" (even though it's really a function) is loosely based on - the -\end_layout - -\begin_layout Code - -** CHK() macro by Dr. - V. - Vinge (see server code). - The status parameter is -\end_layout - -\begin_layout Code - -** a boolean expression indicating the return code from one of the usual - system -\end_layout - -\begin_layout Code - -** calls that returns -1 on error. - If a system call error occurred, an alert -\end_layout - -\begin_layout Code - -** is written to stderr. - It returns a boolean value indicating success/failure -\end_layout - -\begin_layout Code - -** of the system call. -\end_layout - -\begin_layout Code - -** -\end_layout - -\begin_layout Code - -** Example: if ( !SYSCALL( "write", -\end_layout - -\begin_layout Code - -** count = write( fd, bfr, size ) ) ) -\end_layout - -\begin_layout Code - -** { -\end_layout - -\begin_layout Code - -** // Error processing... - but SYSCALL() will have already taken -\end_layout - -\begin_layout Code - -** // care of dumping an error alert to stderr. -\end_layout - -\begin_layout Code - -** } -\end_layout - -\begin_layout Code - -*/ -\end_layout - -\begin_layout Code - -static __inline boolean SYSCALL( const char *syscallName, -\end_layout - -\begin_layout Code - - int lineNbr, -\end_layout - -\begin_layout Code - - int status ) -\end_layout - -\begin_layout Code - -{ -\end_layout - -\begin_layout Code - - if ( ( status == -1 ) && verbose ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - fprintf( stderr, -\end_layout - -\begin_layout Code - - "%s (line %d): System call failed ('%s') - %s. -\backslash -n", -\end_layout - -\begin_layout Code - - pgmName, -\end_layout - -\begin_layout Code - - lineNbr, -\end_layout - -\begin_layout Code - - syscallName, -\end_layout - -\begin_layout Code - - strerror( errno ) ); -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - return status != -1; /* True if the system call was successful. - */ -\end_layout - -\begin_layout Code - -} /* End SYSCALL() */ -\end_layout - -\begin_layout Code - -/****************************************************************************** -\end_layout - -\begin_layout Code - -* Function: main -\end_layout - -\begin_layout Code - -* -\end_layout - -\begin_layout Code - -* Description: -\end_layout - -\begin_layout Code - -* Connect to a remote time-of-day service and write the remote host's - TOD to -\end_layout - -\begin_layout Code - -* stdout. -\end_layout - -\begin_layout Code - -* -\end_layout - -\begin_layout Code - -* Parameters: -\end_layout - -\begin_layout Code - -* The usual argc & argv parameters to a main() program. -\end_layout - -\begin_layout Code - -* -\end_layout - -\begin_layout Code - -* Return Value: -\end_layout - -\begin_layout Code - -* This function always returns zero. -\end_layout - -\begin_layout Code - -******************************************************************************/ -\end_layout - -\begin_layout Code - -int main( int argc, -\end_layout - -\begin_layout Code - - char *argv[ ] ) -\end_layout - -\begin_layout Code - -{ -\end_layout - -\begin_layout Code - - const char *host = DFLT_HOST; -\end_layout - -\begin_layout Code - - int opt; -\end_layout - -\begin_layout Code - - int sckt; -\end_layout - -\begin_layout Code - - unsigned int scopeId = if_nametoindex( DFLT_SCOPE_ID ); -\end_layout - -\begin_layout Code - - const char *service = DFLT_SERVICE; -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Determine the program name (w/o directory prefix). -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - pgmName = (const char*) strrchr( argv[ 0 ], '/' ); -\end_layout - -\begin_layout Code - - pgmName = pgmName == NULL ? argv[ 0 ] : pgmName+1; -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Process command line options. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - opterr = 0; /* Turns off "invalid option" error messages. - */ -\end_layout - -\begin_layout Code - - while ( ( opt = getopt( argc, argv, VALIDOPTS ) ) != -1 ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - switch ( opt ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - case 's': /* Scope identifier (IPv6 kluge). - */ -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - scopeId = if_nametoindex( optarg ); -\end_layout - -\begin_layout Code - - if ( scopeId == 0 ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - fprintf( stderr, -\end_layout - -\begin_layout Code - - "%s: Unknown network interface (%s). -\backslash -n", -\end_layout - -\begin_layout Code - - pgmName, -\end_layout - -\begin_layout Code - - optarg ); -\end_layout - -\begin_layout Code - - USAGE; -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - break; -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - case 'v': /* Verbose mode. - */ -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - verbose = true; -\end_layout - -\begin_layout Code - - break; -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - default: -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - USAGE; -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - } /* End SWITCH on command option. - */ -\end_layout - -\begin_layout Code - - } /* End WHILE processing command options. - */ -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Process command arguments. - At the end of the above loop, optind is the -\end_layout - -\begin_layout Code - - ** index of the first NON-option argv element. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - switch ( argc - optind ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - case 2: /* Both host & service are specified on the command line. - */ -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - service = argv[ optind + 1 ]; -\end_layout - -\begin_layout Code - - /***** Fall through *****/ -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - case 1: /* Host is specified on the command line. - */ -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - host = argv[ optind ]; -\end_layout - -\begin_layout Code - - /***** Fall through *****/ -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - case 0: /* Use default host & service. - */ -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - break; -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - default: -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - USAGE; -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - } /* End SWITCH on number of command arguments. - */ -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Open a connection to the indicated host/service. -\end_layout - -\begin_layout Code - - ** -\end_layout - -\begin_layout Code - - ** Note that if all three of the following conditions are met, then the -\end_layout - -\begin_layout Code - - ** scope identifier remains unresolved at this point. -\end_layout - -\begin_layout Code - - ** 1) The default network interface is unknown for some reason. -\end_layout - -\begin_layout Code - - ** 2) The -s option was not used on the command line. -\end_layout - -\begin_layout Code - - ** 3) An IPv6 "scoped address" was not specified for the hostname - on the -\end_layout - -\begin_layout Code - - ** command line. -\end_layout - -\begin_layout Code - - ** If the above three conditions are met, then only an IPv4 socket can - be -\end_layout - -\begin_layout Code - - ** opened (connect(2) fails without the scope ID properly set for IPv6 -\end_layout - -\begin_layout Code - - ** sockets). -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - if ( ( sckt = openSckt( host, -\end_layout - -\begin_layout Code - - service, -\end_layout - -\begin_layout Code - - scopeId ) ) == INVALID_DESC ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - fprintf( stderr, -\end_layout - -\begin_layout Code - - "%s: Sorry... - a connection could not be established. -\backslash -n", -\end_layout - -\begin_layout Code - - pgmName ); -\end_layout - -\begin_layout Code - - exit( 1 ); -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Get the remote time-of-day. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - tod( sckt ); -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Close the connection and terminate. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - (void) SYSCALL( "close", -\end_layout - -\begin_layout Code - - __LINE__, -\end_layout - -\begin_layout Code - - close( sckt ) ); -\end_layout - -\begin_layout Code - - return 0; -\end_layout - -\begin_layout Code - -} /* End main() */ -\end_layout - -\begin_layout Code - -/****************************************************************************** -\end_layout - -\begin_layout Code - -* Function: openSckt -\end_layout - -\begin_layout Code - -* -\end_layout - -\begin_layout Code - -* Description: -\end_layout - -\begin_layout Code - -* Sets up a TCP connection to a remote server. - Getaddrinfo(3) is used to -\end_layout - -\begin_layout Code - -* perform lookup functions and can return multiple address records (i.e. - a -\end_layout - -\begin_layout Code - -* list of 'struct addrinfo' records). - This function traverses the list and -\end_layout - -\begin_layout Code - -* tries to establish a connection to the remote server. - The function ends -\end_layout - -\begin_layout Code - -* when either a connection has been established or all records in the - list -\end_layout - -\begin_layout Code - -* have been processed. -\end_layout - -\begin_layout Code - -* -\end_layout - -\begin_layout Code - -* Parameters: -\end_layout - -\begin_layout Code - -* host - A pointer to a character string representing the hostname - or IP -\end_layout - -\begin_layout Code - -* address (IPv4 or IPv6) of the remote server. -\end_layout - -\begin_layout Code - -* service - A pointer to a character string representing the service - name or -\end_layout - -\begin_layout Code - -* well-known port number. -\end_layout - -\begin_layout Code - -* scopeId - For IPv6 sockets only. - This is the index corresponding to the -\end_layout - -\begin_layout Code - -* network interface on which to set up the connection. - This -\end_layout - -\begin_layout Code - -* parameter is ignored for IPv4 sockets or when an IPv6 "scoped -\end_layout - -\begin_layout Code - -* address" is specified in 'host' (i.e. - where the colon-hex -\end_layout - -\begin_layout Code - -* network address is augmented with the scope ID). -\end_layout - -\begin_layout Code - -* -\end_layout - -\begin_layout Code - -* Return Value: -\end_layout - -\begin_layout Code - -* Returns the socket descriptor for the connection, or INVALID_DESC if - all -\end_layout - -\begin_layout Code - -* address records have been processed and a connection could not be -\end_layout - -\begin_layout Code - -* established. -\end_layout - -\begin_layout Code - -******************************************************************************/ -\end_layout - -\begin_layout Code - -static int openSckt( const char *host, -\end_layout - -\begin_layout Code - - const char *service, -\end_layout - -\begin_layout Code - - unsigned int scopeId ) -\end_layout - -\begin_layout Code - -{ -\end_layout - -\begin_layout Code - - struct addrinfo *ai; -\end_layout - -\begin_layout Code - - int aiErr; -\end_layout - -\begin_layout Code - - struct addrinfo *aiHead; -\end_layout - -\begin_layout Code - - struct addrinfo hints; -\end_layout - -\begin_layout Code - - sockaddr_in6_t *pSadrIn6; -\end_layout - -\begin_layout Code - - int sckt; -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Initialize the 'hints' structure for getaddrinfo(3). -\end_layout - -\begin_layout Code - - ** -\end_layout - -\begin_layout Code - - ** Notice that the 'ai_family' field is set to PF_UNSPEC, indicating - to -\end_layout - -\begin_layout Code - - ** return both IPv4 and IPv6 address records for the host/service. - Most of -\end_layout - -\begin_layout Code - - ** the time, the user isn't going to care whether an IPv4 connection - or an -\end_layout - -\begin_layout Code - - ** IPv6 connection is established; the user simply wants to exchange - data -\end_layout - -\begin_layout Code - - ** with the remote host and doesn't care how it's done. - Sometimes, however, -\end_layout - -\begin_layout Code - - ** the user might want to explicitly specify the type of underlying socket. -\end_layout - -\begin_layout Code - - ** It is left as an exercise for the motivated reader to add a command - line -\end_layout - -\begin_layout Code - - ** option allowing the user to specify the IP protocol, and then process - the -\end_layout - -\begin_layout Code - - ** list of addresses accordingly (it's not that difficult). -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - memset( &hints, 0, sizeof( hints ) ); -\end_layout - -\begin_layout Code - - hints.ai_family = PF_UNSPEC; /* IPv4 or IPv6 records (don't care). - */ -\end_layout - -\begin_layout Code - - hints.ai_socktype = SOCK_STREAM; /* Connection-oriented byte stream. - */ -\end_layout - -\begin_layout Code - - hints.ai_protocol = IPPROTO_TCP; /* TCP transport layer protocol only. - */ -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Look up the host/service information. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - if ( ( aiErr = getaddrinfo( host, -\end_layout - -\begin_layout Code - - service, -\end_layout - -\begin_layout Code - - &hints, -\end_layout - -\begin_layout Code - - &aiHead ) ) != 0 ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - fprintf( stderr, -\end_layout - -\begin_layout Code - - "%s (line %d): ERROR - %s. -\backslash -n", -\end_layout - -\begin_layout Code - - pgmName, -\end_layout - -\begin_layout Code - - __LINE__, -\end_layout - -\begin_layout Code - - gai_strerror( aiErr ) ); -\end_layout - -\begin_layout Code - - return INVALID_DESC; -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Go through the list and try to open a connection. - Continue until either -\end_layout - -\begin_layout Code - - ** a connection is established or the entire list is exhausted. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - for ( ai = aiHead, sckt = INVALID_DESC; -\end_layout - -\begin_layout Code - - ( ai != NULL ) && ( sckt == INVALID_DESC ); -\end_layout - -\begin_layout Code - - ai = ai->ai_next ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** IPv6 kluge. - Make sure the scope ID is set. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - if ( ai->ai_family == PF_INET6 ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - pSadrIn6 = (sockaddr_in6_t*) ai->ai_addr; -\end_layout - -\begin_layout Code - - if ( pSadrIn6->sin6_scope_id == 0 ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - pSadrIn6->sin6_scope_id = scopeId; -\end_layout - -\begin_layout Code - - } /* End IF the scope ID wasn't set. - */ -\end_layout - -\begin_layout Code - - } /* End IPv6 kluge. - */ -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Display the address info for the remote host. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - if ( verbose ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Temporary character string buffers for host & service. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - char hostBfr[ NI_MAXHOST ]; -\end_layout - -\begin_layout Code - - char servBfr[ NI_MAXSERV ]; -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Display the address information just fetched. - Start with the -\end_layout - -\begin_layout Code - - ** common (protocol-independent) stuff first. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - fprintf( stderr, -\end_layout - -\begin_layout Code - - "Address info: -\backslash -n" -\end_layout - -\begin_layout Code - - " ai_flags = 0x%02X -\backslash -n" -\end_layout - -\begin_layout Code - - " ai_family = %d (PF_INET = %d, PF_INET6 = %d) -\backslash -n" -\end_layout - -\begin_layout Code - - " ai_socktype = %d (SOCK_STREAM = %d, SOCK_DGRAM = - %d) -\backslash -n" -\end_layout - -\begin_layout Code - - " ai_protocol = %d (IPPROTO_TCP = %d, IPPROTO_UDP = - %d) -\backslash -n" -\end_layout - -\begin_layout Code - - " ai_addrlen = %d (sockaddr_in = %d, " -\end_layout - -\begin_layout Code - - "sockaddr_in6 = %d) -\backslash -n", -\end_layout - -\begin_layout Code - - ai->ai_flags, -\end_layout - -\begin_layout Code - - ai->ai_family, -\end_layout - -\begin_layout Code - - PF_INET, -\end_layout - -\begin_layout Code - - PF_INET6, -\end_layout - -\begin_layout Code - - ai->ai_socktype, -\end_layout - -\begin_layout Code - - SOCK_STREAM, -\end_layout - -\begin_layout Code - - SOCK_DGRAM, -\end_layout - -\begin_layout Code - - ai->ai_protocol, -\end_layout - -\begin_layout Code - - IPPROTO_TCP, -\end_layout - -\begin_layout Code - - IPPROTO_UDP, -\end_layout - -\begin_layout Code - - ai->ai_addrlen, -\end_layout - -\begin_layout Code - - sizeof( struct sockaddr_in ), -\end_layout - -\begin_layout Code - - sizeof( struct sockaddr_in6 ) ); -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Display the protocol-specific formatted address. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - getnameinfo( ai->ai_addr, -\end_layout - -\begin_layout Code - - ai->ai_addrlen, -\end_layout - -\begin_layout Code - - hostBfr, -\end_layout - -\begin_layout Code - - sizeof( hostBfr ), -\end_layout - -\begin_layout Code - - servBfr, -\end_layout - -\begin_layout Code - - sizeof( servBfr ), -\end_layout - -\begin_layout Code - - NI_NUMERICHOST | NI_NUMERICSERV ); -\end_layout - -\begin_layout Code - - switch ( ai->ai_family ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - case PF_INET: /* IPv4 address record. - */ -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - sockaddr_in_t *pSadrIn = (sockaddr_in_t*) ai->ai_addr; -\end_layout - -\begin_layout Code - - fprintf( stderr, -\end_layout - -\begin_layout Code - - " ai_addr = sin_family: %d (AF_INET = %d, - " -\end_layout - -\begin_layout Code - - "AF_INET6 = %d) -\backslash -n" -\end_layout - -\begin_layout Code - - " sin_addr: %s -\backslash -n" -\end_layout - -\begin_layout Code - - " sin_port: %s -\backslash -n", -\end_layout - -\begin_layout Code - - pSadrIn->sin_family, -\end_layout - -\begin_layout Code - - AF_INET, -\end_layout - -\begin_layout Code - - AF_INET6, -\end_layout - -\begin_layout Code - - hostBfr, -\end_layout - -\begin_layout Code - - servBfr ); -\end_layout - -\begin_layout Code - - break; -\end_layout - -\begin_layout Code - - } /* End CASE of IPv4 record. - */ -\end_layout - -\begin_layout Code - - case PF_INET6: /* IPv6 address record. - */ -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - pSadrIn6 = (sockaddr_in6_t*) ai->ai_addr; -\end_layout - -\begin_layout Code - - fprintf( stderr, -\end_layout - -\begin_layout Code - - " ai_addr = sin6_family: %d (AF_INET = - %d, " -\end_layout - -\begin_layout Code - - "AF_INET6 = %d) -\backslash -n" -\end_layout - -\begin_layout Code - - " sin6_addr: %s -\backslash -n" -\end_layout - -\begin_layout Code - - " sin6_port: %s -\backslash -n" -\end_layout - -\begin_layout Code - - " sin6_flowinfo: %d -\backslash -n" -\end_layout - -\begin_layout Code - - " sin6_scope_id: %d -\backslash -n", -\end_layout - -\begin_layout Code - - pSadrIn6->sin6_family, -\end_layout - -\begin_layout Code - - AF_INET, -\end_layout - -\begin_layout Code - - AF_INET6, -\end_layout - -\begin_layout Code - - hostBfr, -\end_layout - -\begin_layout Code - - servBfr, -\end_layout - -\begin_layout Code - - pSadrIn6->sin6_flowinfo, -\end_layout - -\begin_layout Code - - pSadrIn6->sin6_scope_id ); -\end_layout - -\begin_layout Code - - break; -\end_layout - -\begin_layout Code - - } /* End CASE of IPv6 record. - */ -\end_layout - -\begin_layout Code - - default: /* Can never get here, but just for completeness. - */ -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - fprintf( stderr, -\end_layout - -\begin_layout Code - - "%s (line %d): ERROR - Unknown protocol family (%d). -\backslash -n", -\end_layout - -\begin_layout Code - - pgmName, -\end_layout - -\begin_layout Code - - __LINE__, -\end_layout - -\begin_layout Code - - ai->ai_family ); -\end_layout - -\begin_layout Code - - break; -\end_layout - -\begin_layout Code - - } /* End DEFAULT case (unknown protocol family). - */ -\end_layout - -\begin_layout Code - - } /* End SWITCH on protocol family. - */ -\end_layout - -\begin_layout Code - - } /* End IF verbose mode. - */ -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Create a socket. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - if ( !SYSCALL( "socket", -\end_layout - -\begin_layout Code - - __LINE__, -\end_layout - -\begin_layout Code - - sckt = socket( ai->ai_family, -\end_layout - -\begin_layout Code - - ai->ai_socktype, -\end_layout - -\begin_layout Code - - ai->ai_protocol ) ) ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - sckt = INVALID_DESC; -\end_layout - -\begin_layout Code - - continue; /* Try the next address record in the list. - */ -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Connect to the remote host. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - if ( !SYSCALL( "connect", -\end_layout - -\begin_layout Code - - __LINE__, -\end_layout - -\begin_layout Code - - connect( sckt, -\end_layout - -\begin_layout Code - - ai->ai_addr, -\end_layout - -\begin_layout Code - - ai->ai_addrlen ) ) ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - (void) close( sckt ); /* Could use SYSCALL() again here, but - why? */ -\end_layout - -\begin_layout Code - - sckt = INVALID_DESC; -\end_layout - -\begin_layout Code - - continue; /* Try the next address record in the list. - */ -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - } /* End FOR each address record returned by getaddrinfo(3). - */ -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Clean up & return. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - freeaddrinfo( aiHead ); -\end_layout - -\begin_layout Code - - return sckt; -\end_layout - -\begin_layout Code - -} /* End openSckt() */ -\end_layout - -\begin_layout Code - -/****************************************************************************** -\end_layout - -\begin_layout Code - -* Function: tod -\end_layout - -\begin_layout Code - -* -\end_layout - -\begin_layout Code - -* Description: -\end_layout - -\begin_layout Code - -* Receive the time-of-day from the remote server and write it to stdout. -\end_layout - -\begin_layout Code - -* -\end_layout - -\begin_layout Code - -* Parameters: -\end_layout - -\begin_layout Code - -* sckt - The socket descriptor for the connection. -\end_layout - -\begin_layout Code - -* -\end_layout - -\begin_layout Code - -* Return Value: None. -\end_layout - -\begin_layout Code - -******************************************************************************/ -\end_layout - -\begin_layout Code - -static void tod( int sckt ) -\end_layout - -\begin_layout Code - -{ -\end_layout - -\begin_layout Code - - char bfr[ MAXBFRSIZE+1 ]; -\end_layout - -\begin_layout Code - - int inBytes; -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** The client never sends anything, so shut down the write side of the -\end_layout - -\begin_layout Code - - ** connection. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - if ( !SYSCALL( "shutdown", -\end_layout - -\begin_layout Code - - __LINE__, -\end_layout - -\begin_layout Code - - shutdown( sckt, SHUT_WR ) ) ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - return; -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Read the time-of-day from the remote host. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - do -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - if ( !SYSCALL( "read", -\end_layout - -\begin_layout Code - - __LINE__, -\end_layout - -\begin_layout Code - - inBytes = read( sckt, -\end_layout - -\begin_layout Code - - bfr, -\end_layout - -\begin_layout Code - - MAXBFRSIZE ) ) ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - return; -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - bfr[ inBytes ] = ' -\backslash -0'; /* Null-terminate the received string. - */ -\end_layout - -\begin_layout Code - - fputs( bfr, stdout ); /* Null string if EOF (inBytes == 0). - */ -\end_layout - -\begin_layout Code - - } while ( inBytes > 0 ); -\end_layout - -\begin_layout Code - - fflush( stdout ); -\end_layout - -\begin_layout Code - -} /* End tod() */ -\end_layout - -\begin_layout Subsubsection -'Daytime' UDP Client Code -\end_layout - -\begin_layout Standard -The UDP client code is found in file tod6uc.c (time-of-day IPv6 UDP client). - It is almost an exact duplicate of the TCP client (and in fact was derived - from it), but is included in this HowTo for completeness. - Once built, the UDP client may be started using the following command syntax - (assuming tod6uc is the executable file): -\end_layout - -\begin_layout Code - -tod6uc [-v] [-s scope_id] [host [service]] -\end_layout - -\begin_layout Standard -ARGUMENTS: -\end_layout - -\begin_layout Description -host The hostname or IP address (dotted decimal or colon-hex) of the remote - host providing the service. - Default is "localhost". -\end_layout - -\begin_layout Description -service The UDP service (or well-known port number) to which datagrams are - sent. - Default is "daytime". -\end_layout - -\begin_layout Standard -OPTIONS: -\end_layout - -\begin_layout Description --s This option is only meaningful for IPv6 addresses, and is used to set - the scope identifier (i.e. - the network interface on which to exchange datagrams). - Default is "eth0". - If host is a scoped address, this option is ignored. -\end_layout - -\begin_layout Description --v Turn on verbose mode. -\end_layout - -\begin_layout Standard -The UDP client source code contained in tod6uc.c follows: -\end_layout - -\begin_layout Code - -/****************************************************************************** -\end_layout - -\begin_layout Code - -* File: tod6uc.c -\end_layout - -\begin_layout Code - -* Description: Contains source code for an IPv6-capable 'daytime' UDP client. -\end_layout - -\begin_layout Code - -* Author: John Wenker, Sr. - Software Engineer -\end_layout - -\begin_layout Code - -* Performance Technologies, San Diego, USA -\end_layout - -\begin_layout Code - -******************************************************************************/ -\end_layout - -\begin_layout Code - -/* -\end_layout - -\begin_layout Code - -** System header files. -\end_layout - -\begin_layout Code - -*/ -\end_layout - -\begin_layout Code - -#include /* errno declaration and error codes. - */ -\end_layout - -\begin_layout Code - -#include /* if_nametoindex(3). - */ -\end_layout - -\begin_layout Code - -#include /* getaddrinfo(3) and associated definitions. - */ -\end_layout - -\begin_layout Code - -#include /* sockaddr_in and sockaddr_in6 definitions. - */ -\end_layout - -\begin_layout Code - -#include /* printf(3) et al. - */ -\end_layout - -\begin_layout Code - -#include /* exit(2). - */ -\end_layout - -\begin_layout Code - -#include /* String manipulation and memory functions. - */ -\end_layout - -\begin_layout Code - -#include /* Socket functions (socket(2), connect(2), etc). - */ -\end_layout - -\begin_layout Code - -#include /* getopt(3), recvfrom(2), sendto(2), etc. - */ -\end_layout - -\begin_layout Code - -/* -\end_layout - -\begin_layout Code - -** Constants & macros. -\end_layout - -\begin_layout Code - -*/ -\end_layout - -\begin_layout Code - -#define DFLT_HOST "localhost" /* Default server name. - */ -\end_layout - -\begin_layout Code - -#define DFLT_SCOPE_ID "eth0" /* Default scope identifier. - */ -\end_layout - -\begin_layout Code - -#define DFLT_SERVICE "daytime" /* Default service name. - */ -\end_layout - -\begin_layout Code - -#define INVALID_DESC -1 /* Invalid file (socket) descriptor. - */ -\end_layout - -\begin_layout Code - -#define MAXBFRSIZE 256 /* Max bfr sz to read remote TOD. - */ -\end_layout - -\begin_layout Code - -#define VALIDOPTS "s:v" /* Valid command options. - */ -\end_layout - -\begin_layout Code - -/* -\end_layout - -\begin_layout Code - -** Type definitions (for convenience). -\end_layout - -\begin_layout Code - -*/ -\end_layout - -\begin_layout Code - -typedef enum { false = 0, true } boolean; -\end_layout - -\begin_layout Code - -typedef struct sockaddr_in sockaddr_in_t; -\end_layout - -\begin_layout Code - -typedef struct sockaddr_in6 sockaddr_in6_t; -\end_layout - -\begin_layout Code - -/* -\end_layout - -\begin_layout Code - -** Prototypes for internal helper functions. -\end_layout - -\begin_layout Code - -*/ -\end_layout - -\begin_layout Code - -static int openSckt( const char *host, -\end_layout - -\begin_layout Code - - const char *service, -\end_layout - -\begin_layout Code - - unsigned int scopeId ); -\end_layout - -\begin_layout Code - -static void tod( int sckt ); -\end_layout - -\begin_layout Code - -/* -\end_layout - -\begin_layout Code - -** Global (within this file only) data objects. -\end_layout - -\begin_layout Code - -*/ -\end_layout - -\begin_layout Code - -static const char *pgmName; /* Program name (w/o directory). - */ -\end_layout - -\begin_layout Code - -static boolean verbose = false; /* Verbose mode. - */ -\end_layout - -\begin_layout Code - -/* -\end_layout - -\begin_layout Code - -** Usage macro. -\end_layout - -\begin_layout Code - -*/ -\end_layout - -\begin_layout Code - -#define USAGE - -\backslash - -\end_layout - -\begin_layout Code - - { - -\backslash - -\end_layout - -\begin_layout Code - - fprintf( stderr, - -\backslash - -\end_layout - -\begin_layout Code - - "Usage: %s [-v] [-s scope_id] [host [service]] -\backslash -n", -\backslash - -\end_layout - -\begin_layout Code - - pgmName ); - -\backslash - -\end_layout - -\begin_layout Code - - exit( 127 ); - -\backslash - -\end_layout - -\begin_layout Code - - } /* End USAGE macro. - */ -\end_layout - -\begin_layout Code - -/* -\end_layout - -\begin_layout Code - -** This "macro" (even though it's really a function) is loosely based on - the -\end_layout - -\begin_layout Code - -** CHK() macro by Dr. - V. - Vinge (see server code). - The status parameter is -\end_layout - -\begin_layout Code - -** a boolean expression indicating the return code from one of the usual - system -\end_layout - -\begin_layout Code - -** calls that returns -1 on error. - If a system call error occurred, an alert -\end_layout - -\begin_layout Code - -** is written to stderr. - It returns a boolean value indicating success/failure -\end_layout - -\begin_layout Code - -** of the system call. -\end_layout - -\begin_layout Code - -** -\end_layout - -\begin_layout Code - -** Example: if ( !SYSCALL( "write", -\end_layout - -\begin_layout Code - -** count = write( fd, bfr, size ) ) ) -\end_layout - -\begin_layout Code - -** { -\end_layout - -\begin_layout Code - -** // Error processing... - but SYSCALL() will have already taken -\end_layout - -\begin_layout Code - -** // care of dumping an error alert to stderr. -\end_layout - -\begin_layout Code - -** } -\end_layout - -\begin_layout Code - -*/ -\end_layout - -\begin_layout Code - -static __inline boolean SYSCALL( const char *syscallName, -\end_layout - -\begin_layout Code - - int lineNbr, -\end_layout - -\begin_layout Code - - int status ) -\end_layout - -\begin_layout Code - -{ -\end_layout - -\begin_layout Code - - if ( ( status == -1 ) && verbose ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - fprintf( stderr, -\end_layout - -\begin_layout Code - - "%s (line %d): System call failed ('%s') - %s. -\backslash -n", -\end_layout - -\begin_layout Code - - pgmName, -\end_layout - -\begin_layout Code - - lineNbr, -\end_layout - -\begin_layout Code - - syscallName, -\end_layout - -\begin_layout Code - - strerror( errno ) ); -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - return status != -1; /* True if the system call was successful. - */ -\end_layout - -\begin_layout Code - -} /* End SYSCALL() */ -\end_layout - -\begin_layout Code - -/****************************************************************************** -\end_layout - -\begin_layout Code - -* Function: main -\end_layout - -\begin_layout Code - -* -\end_layout - -\begin_layout Code - -* Description: -\end_layout - -\begin_layout Code - -* Connect to a remote time-of-day service and write the remote host's - TOD to -\end_layout - -\begin_layout Code - -* stdout. -\end_layout - -\begin_layout Code - -* -\end_layout - -\begin_layout Code - -* Parameters: -\end_layout - -\begin_layout Code - -* The usual argc & argv parameters to a main() program. -\end_layout - -\begin_layout Code - -* -\end_layout - -\begin_layout Code - -* Return Value: -\end_layout - -\begin_layout Code - -* This function always returns zero. -\end_layout - -\begin_layout Code - -******************************************************************************/ -\end_layout - -\begin_layout Code - -int main( int argc, -\end_layout - -\begin_layout Code - - char *argv[ ] ) -\end_layout - -\begin_layout Code - -{ -\end_layout - -\begin_layout Code - - const char *host = DFLT_HOST; -\end_layout - -\begin_layout Code - - int opt; -\end_layout - -\begin_layout Code - - int sckt; -\end_layout - -\begin_layout Code - - unsigned int scopeId = if_nametoindex( DFLT_SCOPE_ID ); -\end_layout - -\begin_layout Code - - const char *service = DFLT_SERVICE; -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Determine the program name (w/o directory prefix). -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - pgmName = (const char*) strrchr( argv[ 0 ], '/' ); -\end_layout - -\begin_layout Code - - pgmName = pgmName == NULL ? argv[ 0 ] : pgmName+1; -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Process command line options. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - opterr = 0; /* Turns off "invalid option" error messages. - */ -\end_layout - -\begin_layout Code - - while ( ( opt = getopt( argc, argv, VALIDOPTS ) ) != -1 ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - switch ( opt ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - case 's': /* Scope identifier (IPv6 kluge). - */ -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - scopeId = if_nametoindex( optarg ); -\end_layout - -\begin_layout Code - - if ( scopeId == 0 ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - fprintf( stderr, -\end_layout - -\begin_layout Code - - "%s: Unknown network interface (%s). -\backslash -n", -\end_layout - -\begin_layout Code - - pgmName, -\end_layout - -\begin_layout Code - - optarg ); -\end_layout - -\begin_layout Code - - USAGE; -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - break; -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - case 'v': /* Verbose mode. - */ -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - verbose = true; -\end_layout - -\begin_layout Code - - break; -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - default: -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - USAGE; -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - } /* End SWITCH on command option. - */ -\end_layout - -\begin_layout Code - - } /* End WHILE processing command options. - */ -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Process command arguments. - At the end of the above loop, optind is the -\end_layout - -\begin_layout Code - - ** index of the first NON-option argv element. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - switch ( argc - optind ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - case 2: /* Both host & service are specified on the command line. - */ -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - service = argv[ optind + 1 ]; -\end_layout - -\begin_layout Code - - /***** Fall through *****/ -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - case 1: /* Host is specified on the command line. - */ -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - host = argv[ optind ]; -\end_layout - -\begin_layout Code - - /***** Fall through *****/ -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - case 0: /* Use default host & service. - */ -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - break; -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - default: -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - USAGE; -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - } /* End SWITCH on number of command arguments. - */ -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Open a connection to the indicated host/service. -\end_layout - -\begin_layout Code - - ** -\end_layout - -\begin_layout Code - - ** Note that if all three of the following conditions are met, then the -\end_layout - -\begin_layout Code - - ** scope identifier remains unresolved at this point. -\end_layout - -\begin_layout Code - - ** 1) The default network interface is unknown for some reason. -\end_layout - -\begin_layout Code - - ** 2) The -s option was not used on the command line. -\end_layout - -\begin_layout Code - - ** 3) An IPv6 "scoped address" was not specified for the hostname - on the -\end_layout - -\begin_layout Code - - ** command line. -\end_layout - -\begin_layout Code - - ** If the above three conditions are met, then only an IPv4 socket can - be -\end_layout - -\begin_layout Code - - ** opened (connect(2) fails without the scope ID properly set for IPv6 -\end_layout - -\begin_layout Code - - ** sockets). -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - if ( ( sckt = openSckt( host, -\end_layout - -\begin_layout Code - - service, -\end_layout - -\begin_layout Code - - scopeId ) ) == INVALID_DESC ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - fprintf( stderr, -\end_layout - -\begin_layout Code - - "%s: Sorry... - a connectionless socket could " -\end_layout - -\begin_layout Code - - "not be set up. -\backslash -n", -\end_layout - -\begin_layout Code - - pgmName ); -\end_layout - -\begin_layout Code - - exit( 1 ); -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Get the remote time-of-day. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - tod( sckt ); -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Close the connection and terminate. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - (void) SYSCALL( "close", -\end_layout - -\begin_layout Code - - __LINE__, -\end_layout - -\begin_layout Code - - close( sckt ) ); -\end_layout - -\begin_layout Code - - return 0; -\end_layout - -\begin_layout Code - -} /* End main() */ -\end_layout - -\begin_layout Code - -/****************************************************************************** -\end_layout - -\begin_layout Code - -* Function: openSckt -\end_layout - -\begin_layout Code - -* -\end_layout - -\begin_layout Code - -* Description: -\end_layout - -\begin_layout Code - -* Sets up a UDP socket to a remote server. - Getaddrinfo(3) is used to -\end_layout - -\begin_layout Code - -* perform lookup functions and can return multiple address records (i.e. - a -\end_layout - -\begin_layout Code - -* list of 'struct addrinfo' records). - This function traverses the list and -\end_layout - -\begin_layout Code - -* tries to establish a connection to the remote server. - The function ends -\end_layout - -\begin_layout Code - -* when either a connection has been established or all records in the - list -\end_layout - -\begin_layout Code - -* have been processed. -\end_layout - -\begin_layout Code - -* -\end_layout - -\begin_layout Code - -* Parameters: -\end_layout - -\begin_layout Code - -* host - A pointer to a character string representing the hostname - or IP -\end_layout - -\begin_layout Code - -* address (IPv4 or IPv6) of the remote server. -\end_layout - -\begin_layout Code - -* service - A pointer to a character string representing the service - name or -\end_layout - -\begin_layout Code - -* well-known port number. -\end_layout - -\begin_layout Code - -* scopeId - For IPv6 sockets only. - This is the index corresponding to the -\end_layout - -\begin_layout Code - -* network interface on which to exchange datagrams. - This -\end_layout - -\begin_layout Code - -* parameter is ignored for IPv4 sockets or when an IPv6 "scoped -\end_layout - -\begin_layout Code - -* address" is specified in 'host' (i.e. - where the colon-hex -\end_layout - -\begin_layout Code - -* network address is augmented with the scope ID). -\end_layout - -\begin_layout Code - -* -\end_layout - -\begin_layout Code - -* Return Value: -\end_layout - -\begin_layout Code - -* Returns the socket descriptor for the connection, or INVALID_DESC if - all -\end_layout - -\begin_layout Code - -* address records have been processed and a socket could not be initialized. -\end_layout - -\begin_layout Code - -******************************************************************************/ -\end_layout - -\begin_layout Code - -static int openSckt( const char *host, -\end_layout - -\begin_layout Code - - const char *service, -\end_layout - -\begin_layout Code - - unsigned int scopeId ) -\end_layout - -\begin_layout Code - -{ -\end_layout - -\begin_layout Code - - struct addrinfo *ai; -\end_layout - -\begin_layout Code - - int aiErr; -\end_layout - -\begin_layout Code - - struct addrinfo *aiHead; -\end_layout - -\begin_layout Code - - struct addrinfo hints; -\end_layout - -\begin_layout Code - - sockaddr_in6_t *pSadrIn6; -\end_layout - -\begin_layout Code - - int sckt; -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Initialize the 'hints' structure for getaddrinfo(3). -\end_layout - -\begin_layout Code - - ** -\end_layout - -\begin_layout Code - - ** Notice that the 'ai_family' field is set to PF_UNSPEC, indicating - to -\end_layout - -\begin_layout Code - - ** return both IPv4 and IPv6 address records for the host/service. - Most of -\end_layout - -\begin_layout Code - - ** the time, the user isn't going to care whether an IPv4 connection - or an -\end_layout - -\begin_layout Code - - ** IPv6 connection is established; the user simply wants to exchange - data -\end_layout - -\begin_layout Code - - ** with the remote host and doesn't care how it's done. - Sometimes, however, -\end_layout - -\begin_layout Code - - ** the user might want to explicitly specify the type of underlying socket. -\end_layout - -\begin_layout Code - - ** It is left as an exercise for the motivated reader to add a command - line -\end_layout - -\begin_layout Code - - ** option allowing the user to specify the IP protocol, and then process - the -\end_layout - -\begin_layout Code - - ** list of addresses accordingly (it's not that difficult). -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - memset( &hints, 0, sizeof( hints ) ); -\end_layout - -\begin_layout Code - - hints.ai_family = PF_UNSPEC; /* IPv4 or IPv6 records (don't care). - */ -\end_layout - -\begin_layout Code - - hints.ai_socktype = SOCK_DGRAM; /* Connectionless communication. - */ -\end_layout - -\begin_layout Code - - hints.ai_protocol = IPPROTO_UDP; /* UDP transport layer protocol only. - */ -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Look up the host/service information. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - if ( ( aiErr = getaddrinfo( host, -\end_layout - -\begin_layout Code - - service, -\end_layout - -\begin_layout Code - - &hints, -\end_layout - -\begin_layout Code - - &aiHead ) ) != 0 ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - fprintf( stderr, -\end_layout - -\begin_layout Code - - "%s (line %d): ERROR - %s. -\backslash -n", -\end_layout - -\begin_layout Code - - pgmName, -\end_layout - -\begin_layout Code - - __LINE__, -\end_layout - -\begin_layout Code - - gai_strerror( aiErr ) ); -\end_layout - -\begin_layout Code - - return INVALID_DESC; -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Go through the list and try to open a connection. - Continue until either -\end_layout - -\begin_layout Code - - ** a connection is established or the entire list is exhausted. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - for ( ai = aiHead, sckt = INVALID_DESC; -\end_layout - -\begin_layout Code - - ( ai != NULL ) && ( sckt == INVALID_DESC ); -\end_layout - -\begin_layout Code - - ai = ai->ai_next ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** IPv6 kluge. - Make sure the scope ID is set. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - if ( ai->ai_family == PF_INET6 ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - pSadrIn6 = (sockaddr_in6_t*) ai->ai_addr; -\end_layout - -\begin_layout Code - - if ( pSadrIn6->sin6_scope_id == 0 ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - pSadrIn6->sin6_scope_id = scopeId; -\end_layout - -\begin_layout Code - - } /* End IF the scope ID wasn't set. - */ -\end_layout - -\begin_layout Code - - } /* End IPv6 kluge. - */ -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Display the address info for the remote host. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - if ( verbose ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Temporary character string buffers for host & service. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - char hostBfr[ NI_MAXHOST ]; -\end_layout - -\begin_layout Code - - char servBfr[ NI_MAXSERV ]; -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Display the address information just fetched. - Start with the -\end_layout - -\begin_layout Code - - ** common (protocol-independent) stuff first. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - fprintf( stderr, -\end_layout - -\begin_layout Code - - "Address info: -\backslash -n" -\end_layout - -\begin_layout Code - - " ai_flags = 0x%02X -\backslash -n" -\end_layout - -\begin_layout Code - - " ai_family = %d (PF_INET = %d, PF_INET6 = %d) -\backslash -n" -\end_layout - -\begin_layout Code - - " ai_socktype = %d (SOCK_STREAM = %d, SOCK_DGRAM = - %d) -\backslash -n" -\end_layout - -\begin_layout Code - - " ai_protocol = %d (IPPROTO_TCP = %d, IPPROTO_UDP = - %d) -\backslash -n" -\end_layout - -\begin_layout Code - - " ai_addrlen = %d (sockaddr_in = %d, " -\end_layout - -\begin_layout Code - - "sockaddr_in6 = %d) -\backslash -n", -\end_layout - -\begin_layout Code - - ai->ai_flags, -\end_layout - -\begin_layout Code - - ai->ai_family, -\end_layout - -\begin_layout Code - - PF_INET, -\end_layout - -\begin_layout Code - - PF_INET6, -\end_layout - -\begin_layout Code - - ai->ai_socktype, -\end_layout - -\begin_layout Code - - SOCK_STREAM, -\end_layout - -\begin_layout Code - - SOCK_DGRAM, -\end_layout - -\begin_layout Code - - ai->ai_protocol, -\end_layout - -\begin_layout Code - - IPPROTO_TCP, -\end_layout - -\begin_layout Code - - IPPROTO_UDP, -\end_layout - -\begin_layout Code - - ai->ai_addrlen, -\end_layout - -\begin_layout Code - - sizeof( struct sockaddr_in ), -\end_layout - -\begin_layout Code - - sizeof( struct sockaddr_in6 ) ); -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Display the protocol-specific formatted address. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - getnameinfo( ai->ai_addr, -\end_layout - -\begin_layout Code - - ai->ai_addrlen, -\end_layout - -\begin_layout Code - - hostBfr, -\end_layout - -\begin_layout Code - - sizeof( hostBfr ), -\end_layout - -\begin_layout Code - - servBfr, -\end_layout - -\begin_layout Code - - sizeof( servBfr ), -\end_layout - -\begin_layout Code - - NI_NUMERICHOST | NI_NUMERICSERV ); -\end_layout - -\begin_layout Code - - switch ( ai->ai_family ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - case PF_INET: /* IPv4 address record. - */ -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - sockaddr_in_t *pSadrIn = (sockaddr_in_t*) ai->ai_addr; -\end_layout - -\begin_layout Code - - fprintf( stderr, -\end_layout - -\begin_layout Code - - " ai_addr = sin_family: %d (AF_INET = %d, - " -\end_layout - -\begin_layout Code - - "AF_INET6 = %d) -\backslash -n" -\end_layout - -\begin_layout Code - - " sin_addr: %s -\backslash -n" -\end_layout - -\begin_layout Code - - " sin_port: %s -\backslash -n", -\end_layout - -\begin_layout Code - - pSadrIn->sin_family, -\end_layout - -\begin_layout Code - - AF_INET, -\end_layout - -\begin_layout Code - - AF_INET6, -\end_layout - -\begin_layout Code - - hostBfr, -\end_layout - -\begin_layout Code - - servBfr ); -\end_layout - -\begin_layout Code - - break; -\end_layout - -\begin_layout Code - - } /* End CASE of IPv4 record. - */ -\end_layout - -\begin_layout Code - - case PF_INET6: /* IPv6 address record. - */ -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - pSadrIn6 = (sockaddr_in6_t*) ai->ai_addr; -\end_layout - -\begin_layout Code - - fprintf( stderr, -\end_layout - -\begin_layout Code - - " ai_addr = sin6_family: %d (AF_INET = - %d, " -\end_layout - -\begin_layout Code - - "AF_INET6 = %d) -\backslash -n" -\end_layout - -\begin_layout Code - - " sin6_addr: %s -\backslash -n" -\end_layout - -\begin_layout Code - - " sin6_port: %s -\backslash -n" -\end_layout - -\begin_layout Code - - " sin6_flowinfo: %d -\backslash -n" -\end_layout - -\begin_layout Code - - " sin6_scope_id: %d -\backslash -n", -\end_layout - -\begin_layout Code - - pSadrIn6->sin6_family, -\end_layout - -\begin_layout Code - - AF_INET, -\end_layout - -\begin_layout Code - - AF_INET6, -\end_layout - -\begin_layout Code - - hostBfr, -\end_layout - -\begin_layout Code - - servBfr, -\end_layout - -\begin_layout Code - - pSadrIn6->sin6_flowinfo, -\end_layout - -\begin_layout Code - - pSadrIn6->sin6_scope_id ); -\end_layout - -\begin_layout Code - - break; -\end_layout - -\begin_layout Code - - } /* End CASE of IPv6 record. - */ -\end_layout - -\begin_layout Code - - default: /* Can never get here, but just for completeness. - */ -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - fprintf( stderr, -\end_layout - -\begin_layout Code - - "%s (line %d): ERROR - Unknown protocol family (%d). -\backslash -n", -\end_layout - -\begin_layout Code - - pgmName, -\end_layout - -\begin_layout Code - - __LINE__, -\end_layout - -\begin_layout Code - - ai->ai_family ); -\end_layout - -\begin_layout Code - - break; -\end_layout - -\begin_layout Code - - } /* End DEFAULT case (unknown protocol family). - */ -\end_layout - -\begin_layout Code - - } /* End SWITCH on protocol family. - */ -\end_layout - -\begin_layout Code - - } /* End IF verbose mode. - */ -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Create a socket. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - if ( !SYSCALL( "socket", -\end_layout - -\begin_layout Code - - __LINE__, -\end_layout - -\begin_layout Code - - sckt = socket( ai->ai_family, -\end_layout - -\begin_layout Code - - ai->ai_socktype, -\end_layout - -\begin_layout Code - - ai->ai_protocol ) ) ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - sckt = INVALID_DESC; -\end_layout - -\begin_layout Code - - continue; /* Try the next address record in the list. - */ -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Set the target destination for the remote host on this socket. - That -\end_layout - -\begin_layout Code - - ** is, this socket only communicates with the specified host. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - if ( !SYSCALL( "connect", -\end_layout - -\begin_layout Code - - __LINE__, -\end_layout - -\begin_layout Code - - connect( sckt, -\end_layout - -\begin_layout Code - - ai->ai_addr, -\end_layout - -\begin_layout Code - - ai->ai_addrlen ) ) ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - (void) close( sckt ); /* Could use SYSCALL() again here, but - why? */ -\end_layout - -\begin_layout Code - - sckt = INVALID_DESC; -\end_layout - -\begin_layout Code - - continue; /* Try the next address record in the list. - */ -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - } /* End FOR each address record returned by getaddrinfo(3). - */ -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Clean up & return. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - freeaddrinfo( aiHead ); -\end_layout - -\begin_layout Code - - return sckt; -\end_layout - -\begin_layout Code - -} /* End openSckt() */ -\end_layout - -\begin_layout Code - -/****************************************************************************** -\end_layout - -\begin_layout Code - -* Function: tod -\end_layout - -\begin_layout Code - -* -\end_layout - -\begin_layout Code - -* Description: -\end_layout - -\begin_layout Code - -* Receive the time-of-day from the remote server and write it to stdout. -\end_layout - -\begin_layout Code - -* -\end_layout - -\begin_layout Code - -* Parameters: -\end_layout - -\begin_layout Code - -* sckt - The socket descriptor for the connection. -\end_layout - -\begin_layout Code - -* -\end_layout - -\begin_layout Code - -* Return Value: None. -\end_layout - -\begin_layout Code - -******************************************************************************/ -\end_layout - -\begin_layout Code - -static void tod( int sckt ) -\end_layout - -\begin_layout Code - -{ -\end_layout - -\begin_layout Code - - char bfr[ MAXBFRSIZE+1 ]; -\end_layout - -\begin_layout Code - - int inBytes; -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Send a datagram to the server to wake it up. - The content isn't -\end_layout - -\begin_layout Code - - ** important, but something must be sent to let it know we want the TOD. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - if ( !SYSCALL( "write", -\end_layout - -\begin_layout Code - - __LINE__, -\end_layout - -\begin_layout Code - - write( sckt, "Are you there?", 14 ) ) ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - return; -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - /* -\end_layout - -\begin_layout Code - - ** Read the time-of-day from the remote host. -\end_layout - -\begin_layout Code - - */ -\end_layout - -\begin_layout Code - - if ( !SYSCALL( "read", -\end_layout - -\begin_layout Code - - __LINE__, -\end_layout - -\begin_layout Code - - inBytes = read( sckt, -\end_layout - -\begin_layout Code - - bfr, -\end_layout - -\begin_layout Code - - MAXBFRSIZE ) ) ) -\end_layout - -\begin_layout Code - - { -\end_layout - -\begin_layout Code - - return; -\end_layout - -\begin_layout Code - - } -\end_layout - -\begin_layout Code - - bfr[ inBytes ] = ' -\backslash -0'; /* Null-terminate the received string. - */ -\end_layout - -\begin_layout Code - - fputs( bfr, stdout ); /* Null string if EOF (inBytes == 0). - */ -\end_layout - -\begin_layout Code - - fflush( stdout ); -\end_layout - -\begin_layout Code - -} /* End tod() */ -\end_layout - -\begin_layout Section -Other programming languages -\end_layout - -\begin_layout Subsection -JAVA -\end_layout - -\begin_layout Standard -Sun Java versions since 1.4 are IPv6 enabled, see e.g. - -\begin_inset CommandInset href -LatexCommand href -name "Inet6Address (1.5/5.0)" -target "http://java.sun.com/j2se/1.5.0/docs/api/java/net/Inet6Address.html" - -\end_inset - - class. - Hints are available in the -\emph on -Networking IPv6 User Guide for JDK/JRE -\emph default - -\begin_inset CommandInset href -LatexCommand href -name "1.4" -target "http://java.sun.com/j2se/1.4.2/docs/guide/net/ipv6_guide/index.html" - -\end_inset - - and -\begin_inset CommandInset href -LatexCommand href -name "1.5 (5.0)" -target "http://java.sun.com/j2se/1.5.0/docs/guide/net/ipv6_guide/index.html" - -\end_inset - -. -\end_layout - -\begin_layout Subsection -Perl -\end_layout - -\begin_layout Standard -As of May 2007 it's not known that the Perl core itself already supports - IPv6. - It can be added by using following modules: -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Socket6" -target "http://search.cpan.org/~umemoto/Socket6/" - -\end_inset - - -\end_layout - -\begin_layout Standard -Anyway, some other modules exist for/with IPv6 support (e.g. - Net::IP), search for -\begin_inset Quotes sld -\end_inset - -IPv6 -\begin_inset Quotes srd -\end_inset - - on -\begin_inset CommandInset href -LatexCommand href -name "http://search.cpan.org/" -target "http://search.cpan.org/" - -\end_inset - -. -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-interoperability" - -\end_inset - -Interoperability -\end_layout - -\begin_layout Standard -The -\begin_inset CommandInset href -LatexCommand href -name "TAHI Project" -target "http://www.tahi.org/" - -\end_inset - - checks the interoperability of different operating systems regarding the - implementation of IPv6 features. - Linux kernel already got the -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Ready Logo Phase 1" -target "http://www.linux-ipv6.org/v6ready/" - -\end_inset - -. - -\end_layout - -\begin_layout Chapter -\begin_inset CommandInset label -LatexCommand label -name "chapter-information" - -\end_inset - -Further information and URLs -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "information-books" - -\end_inset - -Paper printed books, articles, online reviews (mixed) -\end_layout - -\begin_layout Subsection -Printed Books (English) -\end_layout - -\begin_layout Subsubsection -Cisco -\end_layout - -\begin_layout Itemize -Cisco Self-Study: Implementing IPv6 Networks (IPV6) by Regis Desmeules. - Cisco Press; ISBN 1587050862; 500 pages; 1st edition (April 11, 2003). -\begin_inset Newline newline -\end_inset - -Note: This item will be published on April 11, 2003. -\end_layout - -\begin_layout Itemize -Configuring IPv6 with Cisco IOS by Sam Brown, Sam Browne, Neal Chen, Robbie - Harrell, Edgar, Jr. - Parenti (Editor), Eric Knipp (Editor), Paul Fong (Editor)362 pages; Syngress - Media Inc; ISBN 1928994849; (July 12, 2002). -\end_layout - -\begin_layout Subsubsection -General -\end_layout - -\begin_layout Itemize - -\lang ngerman -\begin_inset CommandInset href -LatexCommand href -name "IPv6 in Practice: A Unixer's Guide to the Next Generation Internet" -target "http://www.benedikt-stockebrand.de/books_e.html#ipv6-in-practice" - -\end_inset - - von Benedikt Stockebrand, November 2006; ISBN 3-540-24524-3 -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Essentials" -target "http://www.sunny.ch/publications/f_ipv6.htm" - -\end_inset - - by Silvia Hagen, -\lang ngerman -2nd Edition, May 2006; ISBN 0-5961-0058-2 -\lang english - -\begin_inset Newline newline -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name "ToC, Index, Sample Chapter etc." -target "http://www.oreilly.com/catalog/ipv6ess/" - -\end_inset - -; -\begin_inset CommandInset href -LatexCommand href -name "O'Reilly Pressrelease" -target "http://press.oreilly.com/ipv6ess.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -IPv6: The New Internet Protocol. - By Christian Huitema; Published by Prentice-Hall; ISBN 0138505055. - -\begin_inset Newline newline -\end_inset - -Description: This book, written by Christian Huitema - a member of the InternetA -rchitecture Board, gives an excellent description of IPv6, how it differs - from IPv4, and the hows and whys of it's development. - -\begin_inset Newline newline -\end_inset - -Source: -\begin_inset CommandInset href -LatexCommand href -name "http://www.cs.uu.nl/wais/html/na-dir/internet/tcp-ip/resource-list.html" -target "http://www.cs.uu.nl/wais/html/na-dir/internet/tcp-ip/resource-list.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Networks" -target "http://www.epinions.com/book_mu-3402412/display_~full_specs" - -\end_inset - - by Niles, Kitty; (ISBN 0070248079); 550 pages; Date Published 05/01/1998. -\end_layout - -\begin_layout Itemize -Implementing IPV6. - Supporting the Next Generation Internet Protocols by P. - E. - Miller, Mark A. - Miller; Publisher: John Wiley & Sons; ISBN 0764545892; 2nd edition (March - 15, 2000); 402 pages. -\end_layout - -\begin_layout Itemize -Big Book of Ipv6 Addressing Rfcs by Peter H. - Salus (Compiler), Morgan Kaufmann Publishers, April 2000, 450 pages ISBN - 0126167702. - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Understanding IPV6" -target "http://www.epinions.com/book_mu-3922588/display_~full_specs" - -\end_inset - - by Davies, Joseph; ISBN 0735612455; Date Published 05/01/2001; Number of - Pages: 350. -\end_layout - -\begin_layout Itemize -Migrating to IPv6 - IPv6 in Practice by Marc Blanchet Publisher: John Wiley - & Sons; ISBN 0471498920; 1st edition (November 2002); 368 pages. -\end_layout - -\begin_layout Itemize -Ipv6 Network Programming by Jun-ichiro Hagino; ISBN 1555583180 -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Wireless boosting IPv6" -target "http://www.nwfusion.com/news/2000/1023ipv6.html" - -\end_inset - - by Carolyn Duffy Marsan, 10/23/2000. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "O'reilly Network search for keyword IPv6" -target "http://www.oreillynet.com/search/index.ncsp?sp-q=IPv6" - -\end_inset - - results in 29 hits (28. - January 2002) -\end_layout - -\begin_layout Subsection -Articles, eBooks, Online Reviews (mixed) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Getting Connected with 6to4" -target "http://www.onlamp.com/pub/a/onlamp/2001/06/01/ipv6_tutorial.html" - -\end_inset - - by Huber Feyrer, 06/01/2001 -\end_layout - -\begin_layout Itemize -Transient Addressing for Related Processes: Improved Firewalling by Using - IPv6 and Multiple Addresses per Host; written by Peter M. - Gleiz, Steven M. - Bellovin ( -\begin_inset CommandInset href -LatexCommand href -name "PC-PDF-Version" -target "http://www.securiteinfo.com/ebooks/pdf/tarp.pdf" - -\end_inset - -; -\begin_inset CommandInset href -LatexCommand href -name "Palm-PDF-Version" -target "http://www.securiteinfo.com/ebooks/palm/tarp.pdf" - -\end_inset - -; -\begin_inset CommandInset href -LatexCommand href -name "PDB-Version" -target "http://www.securiteinfo.com/ebooks/pdb/tarp.pdb" - -\end_inset - -) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Internetworking IPv6 with Cisco Routers" -target "http://www.ip6.com/index.html" - -\end_inset - - by Silvano Gai, McGrawHill Italia, 1997. - The 13 chapters and appendix A-D are downloadable as PDF-documents. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Migration and Co-existence of IPv4 and IPv6 in Residential Networks" -target "http://www.csc.fi/~psavola/residential.html" - -\end_inset - - by Pekka Savola, CSC/FUNET, 2002 -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "information-sciencepublication" - -\end_inset - -Science Publications (abstracts, bibliographies, online resources) -\end_layout - -\begin_layout Standard -See also: -\begin_inset CommandInset href -LatexCommand href -name "liinwww.ira.uka.de/ipv6" -target "http://liinwww.ira.uka.de/mpsbib?query=ipv6&maxnum=200" - -\end_inset - - or -\begin_inset CommandInset href -LatexCommand href -name "Google / Scholar / IPv6" -target "http://www.google.com/scholar?q=ipv6" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "GEANT IPv6 Workplan" -target "http://www.ipv6.ac.uk/gtpv6/workplan.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Trials on UK Academic Networks: Bermuda Project Aug.2002" -target "http://www.ipv6.ac.uk/bermuda2/" - -\end_inset - -: Participants - Getting connected - Project deliverables - Network topology - - Address assignments - Wireless IPv6 access - IPv6 migration - Project - presentations - Internet 2 - Other IPv6 projects - IPv6 fora and standards - Bermuda 2... -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "http://www.ipv6.ac.uk/" -target "http://www.ipv6.ac.uk/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 at the University of Southampton" -target "http://www.ipv6.ecs.soton.ac.uk/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Microsoft Research IPv6 Implementation (MSRIPv6): -\begin_inset CommandInset href -LatexCommand href -name "MSRIPv6 Configuring 6to4 - Connectivity with MSR IPv6 - Our 6Bone Node... " -target "http://www.research.microsoft.com/msripv6/" - -\end_inset - - -\end_layout - -\begin_layout Subsection -Others -\end_layout - -\begin_layout Standard -See following URL for more: -\begin_inset CommandInset href -LatexCommand href -name "SWITCH IPv6 Pilot / References" -target "http://www.switch.ch/lan/ipv6/references.html" - -\end_inset - - -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "information-conferences" - -\end_inset - -Conferences, Meetings, Summits -\end_layout - -\begin_layout Standard -Something missing? Suggestions are welcome! -\end_layout - -\begin_layout Subsection -2004 -\end_layout - -\begin_layout Itemize -1st Global IPv6 Summit in Sao Paul, Brazil -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "information-onlineinformation" - -\end_inset - -Online information -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "information-joinipv6" - -\end_inset - -Join the IPv6 backbone -\end_layout - -\begin_layout Standard -More to be filled later...suggestions are welcome! -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-globalregistries" - -\end_inset - -Global registries -\end_layout - -\begin_layout Standard -See regional registries. -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-majorregionregistries" - -\end_inset - -Major regional registries -\end_layout - -\begin_layout Itemize -America: -\begin_inset CommandInset href -LatexCommand href -name "ARIN" -target "http://www.arin.net/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "ARIN / registration page" -target "http://www.arin.net/registration/ipv6/index.html" - -\end_inset - -, -\lang ngerman - -\begin_inset CommandInset href -LatexCommand href -name "ARIN / IPv6 guidelines" -target "http://www.arin.net/registration/ipv6/index.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -EMEA: -\begin_inset CommandInset href -LatexCommand href -name "Ripe NCC" -target "http://www.ripe.net/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "Ripe NCC / registration page" -target "http://www.ripe.net/ripencc/mem-services/registration/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "Ripe NCC / IPv6 registration" -target "http://www.ripe.net/ripencc/mem-services/registration/ipv6/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Asia/Pacific: -\begin_inset CommandInset href -LatexCommand href -name "APNIC" -target "http://www.apnic.net/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "APNIC / IPv6 ressource guide" -target "http://www.apnic.net/services/ipv6_guide.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Latin America and Caribbea: -\begin_inset CommandInset href -LatexCommand href -name "LACNIC" -target "http://lacnic.org/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Registration Services" -target "http://lacnic.net/en/bt-IPv6.html" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Allocation Policy" -target "http://lacnic.net/en/chapter-4-en.pdf" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Africa: -\begin_inset CommandInset href -LatexCommand href -name "AfriNIC" -target "http://www.afrinic.org/" - -\end_inset - - -\end_layout - -\begin_layout Standard -Also a list of major (prefix length 32) allocations per local registry is - available here: -\begin_inset CommandInset href -LatexCommand href -name "Ripe NCC / IPv6 allocations" -target "http://www.ripe.net/ripencc/mem-services/registration/ipv6/ipv6allocs.html" - -\end_inset - -. -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-joinipv6-tunnelbrokers" - -\end_inset - -Tunnel brokers -\end_layout - -\begin_layout Standard -Note: A list of available Tunnel broker can be found in the section -\begin_inset CommandInset ref -LatexCommand ref -name "Tunnel broker" -reference "information-Tunnelbroker" - -\end_inset - - below. - -\end_layout - -\begin_layout Itemize -Former IPng. - Tunnelbroker and IPv6 resources, now migrated to the -\begin_inset CommandInset href -LatexCommand href -name "SixXs System" -target "http://www.sixxs.net/main/" - -\end_inset - -. -\end_layout - -\begin_layout Itemize -Eckes' -\begin_inset CommandInset href -LatexCommand href -name "IPv6-with-Linux" -target "http://sites.inka.de/lina/linux/ipv6.html" - -\end_inset - - Page. -\end_layout - -\begin_layout Itemize -tunnelc - a perl based tunnel client script: -\begin_inset Newline newline -\end_inset - -freshmeat.net: -\begin_inset CommandInset href -LatexCommand href -name "Project details for tunnel client" -target "http://freshmeat.net/projects/tunnelc" - -\end_inset - - -\begin_inset Newline newline -\end_inset - -SourceForge: -\begin_inset CommandInset href -LatexCommand href -name "Project Info - tunnelc" -target "http://sourceforge.net/projects/tunnelc" - -\end_inset - - (also -\begin_inset CommandInset href -LatexCommand href -name "here" -target "http://tunnelc.sourceforge.net/" - -\end_inset - -) -\end_layout - -\begin_layout Itemize -Linux Advanced Routing & Traffic Control HOWTO, -\begin_inset CommandInset href -LatexCommand href -name "Chapter 6: IPv6 tunneling with Cisco and/or 6bone" -target "http://howtos.linuxbroker.com/howtoreader.shtml?file=Adv-Routing-HOWTO.html#LARTC.TUNNEL-IPV6.ADDRESSING" - -\end_inset - -. -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-joinipv6-6to4-tunneling" - -\end_inset - -6to4 -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "NSayer's 6to4 information" -target "http://www.kfu.com/~nsayer/6to4/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "RFC 3068 / An Anycast Prefix for 6to4 Relay Routers" -target "http://www.faqs.org/rfcs/rfc3068.html" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-joinipv6-isatap-tunneling" - -\end_inset - -ISATAP -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "ISATAP (Intra-Site Automatic Tunnel Access Protocol) Information" -target "http://www.join.uni-muenster.de/Dokumente/Howtos/Howto_ISATAP.php?lang=en" - -\end_inset - - by -\begin_inset CommandInset href -LatexCommand href -name "JOIN" -target "http://www.join.uni-muenster.de/" - -\end_inset - - -\end_layout - -\begin_layout Subsection -Latest news and URLs to other documents -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Lot of URLs to others documents" -target "http://www.estoile.com/links/ipv6" - -\end_inset - - by Anil Edathara -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "go6 - The IPv6 Portal" -target "http://www.go6.net/" - -\end_inset - -: an IPv6 online portal with a wiki-based IPv6 knowledge center, an IPv6 - discussion forum, an up-to-date collection of IPv6 Events and News, free - IPv6 access and services, IPv6 software applications, and much more -\end_layout - -\begin_layout Subsection -Protocol references -\end_layout - -\begin_layout Subsubsection -IPv6-related Request For Comments (RFCs) -\end_layout - -\begin_layout Standard -Publishing the list of IPv6-related RFCs is beyond the scope of this document, - but given URLs will lead you to such lists: -\end_layout - -\begin_layout Itemize -List sorted by -\begin_inset CommandInset href -LatexCommand href -name "IPng Standardization Status" -target "http://playground.sun.com/pub/ipng/html/specs/standards.html" - -\end_inset - - or -\begin_inset CommandInset href -LatexCommand href -name "IPng Current Specifications" -target "http://playground.sun.com/pub/ipng/html/specs/specifications.html" - -\end_inset - - by Robert Hinden -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Related Specifications" -target "http://www.ipv6.org/specs.html" - -\end_inset - - on IPv6.org -\end_layout - -\begin_layout Subsubsection -Current drafts of working groups -\end_layout - -\begin_layout Standard -Current (also) IPv6-related drafts can be found here: -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IP Version 6 (ipv6)" -target "http://www.ietf.org/ids.by.wg/ipv6.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Next Generation Transition (ngtrans)" -target "http://www.ietf.org/ids.by.wg/ngtrans.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Dynamic Host Configuration (dhc)" -target "http://www.ietf.org/ids.by.wg/dhc.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Domain Name System Extension (dnsext)" -target "http://www.ietf.org/ids.by.wg/dnsext.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Operations (v6ops)" -target "http://www.ietf.org/ids.by.wg/v6ops.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Mobile IP (mobileip)" -target "http://www.ietf.org/ids.by.wg/mobileip.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Get any information about IPv6, from overviews, through RFCs & drafts, to implementations" -target "http://playground.sun.com/pub/ipng/html/ipng-main.html" - -\end_inset - - (including availability of stacks on various platforms & source code for - IPv6 stacks) -\end_layout - -\begin_layout Subsubsection -Others -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "SWITCH IPv6 Pilot / References" -target "http://www.switch.ch/lan/ipv6/references.html" - -\end_inset - -, big list of IPv6 references maintained by Simon Leinen -\end_layout - -\begin_layout Subsection -More information -\end_layout - -\begin_layout Standard - -\lang ngerman -\begin_inset CommandInset href -LatexCommand href -name "DeepSpace6 / more interesting links" -target "http://www.deepspace6.net/sections/links.html" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Linux related -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "DeepSpace6 / (Not only) Linux IPv6 Portal" -target "http://www.deepspace6.net/" - -\end_inset - - - Italy ( -\begin_inset CommandInset href -LatexCommand href -name "Mirror" -target "http://mirrors.bieringer.de/www.deepspace6.net/" - -\end_inset - -) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6-HowTo for Linux by Peter Bieringer" -target "http://www.bieringer.de/linux/IPv6/" - -\end_inset - - - Germany, and his -\begin_inset CommandInset href -LatexCommand href -name "Bieringer / IPv6 - software archive" -target "ftp://ftp.bieringer.de/pub/linux/IPv6/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Linux+IPv6 status by Peter Bieringer" -target "http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status.html" - -\end_inset - - - Germany (going obsolete) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "DeepSpace6 / IPv6 Status Page" -target "http://www.deepspace6.net/docs/ipv6_status_page_apps.html" - -\end_inset - - - Italy ( -\begin_inset CommandInset href -LatexCommand href -name "Mirror" -target "http://mirrors.bieringer.de/www.deepspace6.net/docs/ipv6_status_page_apps.html" - -\end_inset - -) (will superseed upper one) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "USAGI project" -target "http://www.linux-ipv6.org/" - -\end_inset - - - Japan, and their -\begin_inset CommandInset href -LatexCommand href -name "USAGI project - software archive" -target "ftp://ftp.linux-ipv6.org/pub/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Linux Optimized Link State Routing Protocol (OLSR) IPv6 HOWTO" -target "http://www.tldp.org/HOWTO/OLSR-IPv6-HOWTO/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "LinShim6" -target "http://inl.info.ucl.ac.be/LinShim6/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Linux related per distribution -\end_layout - -\begin_layout Description -PLD -\begin_inset CommandInset href -LatexCommand href -name "PLD Linux Distribution" -target "http://www.pld-linux.org/" - -\end_inset - - ( -\begin_inset Quotes sld -\end_inset - -market leader -\begin_inset Quotes srd -\end_inset - - in containing IPv6 enabled packages) -\end_layout - -\begin_layout Description -Red -\begin_inset space ~ -\end_inset - -Hat -\begin_inset CommandInset href -LatexCommand href -name "Red Hat Enterprise Linux" -target "http://www.redhat.com/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name " Pekka Savola's IPv6 packages (Historic)" -target "http://www.netcore.fi/pekkas/linux/ipv6/" - -\end_inset - - -\end_layout - -\begin_layout Description - -\lang ngerman -Fedora -\begin_inset CommandInset href -LatexCommand href -name "Fedora (Project) Linux" -target "https://fedoraproject.org/" - -\end_inset - - -\end_layout - -\begin_layout Description -Debian -\begin_inset CommandInset href -LatexCommand href -name "Debian Linux" -target "http://www.debian.org/" - -\end_inset - -, -\lang ngerman - -\begin_inset CommandInset href -LatexCommand href -name "IPv6 with Debian Linux" -target "http://ipv6.debian.net/" - -\end_inset - - -\end_layout - -\begin_layout Description - -\lang ngerman -SuSE -\begin_inset CommandInset href -LatexCommand href -name "SuSE Linux" -target "https://www.suse.com/" - -\end_inset - - -\end_layout - -\begin_layout Description -Mandriva -\begin_inset CommandInset href -LatexCommand href -name "Mandriva (Historic)" -target "http://wiht.link/mandrivalinux" - -\end_inset - - -\end_layout - -\begin_layout Standard -For more see the -\begin_inset CommandInset href -LatexCommand href -name "IPv6+Linux Status Distributions" -target "http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status-distributions.html" - -\end_inset - - page. -\end_layout - -\begin_layout Subsubsection -General -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6.org" -target "http://www.ipv6.org/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "6bone" -target "http://www.6bone.net/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "WIDE project" -target "http://www.v6.wide.ad.jp/" - -\end_inset - - - Japan -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "SWITCH IPv6 Pilot" -target "http://www.switch.ch/lan/ipv6/" - -\end_inset - - - Switzerland -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Corner of Hubert Feyrer" -target "http://www.feyrer.de/IPv6/" - -\end_inset - - - Germany -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Forum" -target "http://www.ipv6forum.com/" - -\end_inset - - - a world-wide consortium of leading Internet vendors, Research & Education - Networks... -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Playground.sun.com / IPv6 Info Page" -target "http://playground.sun.com/pub/ipng/html/ipng-main.html" - -\end_inset - - - maintained by Robert Hinden, Nokia. - Get any information about IPv6, from overviews, through RFCs & drafts, - to implementations (including availability of stacks on various platforms - & source code for IPv6 stacks). -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "6INIT" -target "http://www.6init.com/" - -\end_inset - - - IPv6 Internet Initiative - an EU Fifth Framework Project under the IST - Programme. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Task Force (European Union)" -target "http://www.ipv6-taskforce.org/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "6init" -target "http://www.6init.org/" - -\end_inset - - - IPv6 INternet IniTiative -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6: The New Version of the Internet Protocol" -target "http://www.usenix.org/publications/library/proceedings/ana97/summaries/deering.html" - -\end_inset - -, by Steve Deering. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6: The Next Generation Internet Protocol" -target "http://www.garykessler.net/library/ipv6_exp.html" - -\end_inset - -, by Gary C. - Kessler. - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6: Next Generation Internet Protocol" -target "http://www.3com.com/nsc/ipv6.html" - -\end_inset - - - 3Com -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "internet || site" -target "http://www.internet2.org/" - -\end_inset - - and -\begin_inset CommandInset href -LatexCommand href -name "internet2 Working Group" -target "http://ipv6.internet2.edu/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -NetworkWorldFusion: Search / Doc Finder: -\begin_inset CommandInset href -LatexCommand href -name "searched for IPv6" -target "http://search.nwfusion.com/query.html?qt=IPv6&qp=&ch=cn&" - -\end_inset - - (102 documents found 22.12.2002) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "The Register" -target "http://www.theregister.co.uk/" - -\end_inset - - (Search for IPv6 will result in 30 documents, 22.12.2002) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "ZDNet Search for IPv6" -target "http://zdnet.search.com/search?cat=279&q=IPv6" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "TechTarget Search for IPv6" -target "http://whatis.techtarget.com/wsearchResults/1,290214,sid9,00.html?query=IPv6" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 & TCP Resources List" -target "http://www.faqs.org/faqs/internet/tcp-ip/resource-list/index.html" - -\end_inset - - -\end_layout - -\begin_layout Standard -Something missing? Suggestions are welcome! -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-marketresearch" - -\end_inset - -Market Research -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "A Tale of Two Wireless Technology Trends: Processor Development Outsourcing and IPv6" -target "http://www.seminarinformation.com/wconnect/wc.dll?sis~details0~307~TSN" - -\end_inset - -Yankee Group - 4/1/2002 - 12 Pages - ID: YANL768881 -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "The World Atlas of the Internet: Americas" -target "http://www.marketresearch.com/product/display.asp?SID=88602378-241489274-186851952&ProductID=803907" - -\end_inset - -; IDATE - 2/1/2002 - 242 PAges - ID: IDT803907. - Countries covered: Central America, North America, South America; List: - Price: $ 3,500.00; excerpt: Panorama of Internet access markets across the - globe. - Market assessment and forecasts up to 2006 for 34 countries: market structure: - main ISPs and market shares; number of subscribers, of ISPs. -\end_layout - -\begin_layout Itemize -Early Interest Rising for IPv6 by IDC (Author); List Price: $1,500.00; - Edition: e-book (Acrobat Reader); Publisher: IDC; ISBN B000065T8E; (March - 1, 2002) -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-patents" - -\end_inset - -Patents -\end_layout - -\begin_layout Itemize -Delphion Research: -\begin_inset CommandInset href -LatexCommand href -name "Patent Search Page" -target "http://www.delphion.com/research/" - -\end_inset - -. - Basic (free) registration needed. - Examples found 21.12.2002 searching for IPv6: -\begin_inset Newline newline -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name "Communicating method between IPv4 terminal and IPv6 terminal and IPv4-IPv6 converting apparatus" -target "http://www.delphion.com/details?pn=US06118784__" - -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name "Translator for IP networks, network system using the translator, and IP network coupling method therefor" -target "http://www.delphion.com/details?pn=US06038233__" - -\end_inset - - -\end_layout - -\begin_layout Subsection -By countries -\end_layout - -\begin_layout Subsubsection -Europe -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "www.ist-ipv6.org" -target "http://www.ist-ipv6.org/" - -\end_inset - -: IST IPv6 Cluster, European IPv6 Research and Development Projects -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Euro6IX" -target "http://www.euro6ix.org/" - -\end_inset - -: European IPv6 Internet Exchanges Backbone -\end_layout - -\begin_layout Subsubsection -Austria -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6@IKNnet and MIPv6 Research Group" -target "http://www.ikn.tuwien.ac.at/~ipv6/" - -\end_inset - -: TU Vienna, Austria (IPv6: project, publications, diploma / doctor thesis, - Conference Proceedings etc.) -\end_layout - -\begin_layout Subsubsection -Australia -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Carl's Australian IPv6 Pages" -target "http://oversteer.bl.echidna.id.au/IPv6/" - -\end_inset - - (old content) -\end_layout - -\begin_layout Subsubsection -Belgium -\end_layout - -\begin_layout Standard -Suggestions are welcome! -\end_layout - -\begin_layout Subsubsection -Brasil -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 do Brasil" -target "http://www.ipv6dobrasil.com.br/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -China -\end_layout - -\begin_layout Standard -Suggestions are welcome! -\end_layout - -\begin_layout Subsubsection -Czech -\end_layout - -\begin_layout Standard -Suggestions are welcome! -\end_layout - -\begin_layout Subsubsection -Germany -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Xing / IPv6" -target "https://www.xing.com/net/ipv6/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -France -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Renater" -target "http://www.renater.fr/Projets/IPv6/index.htm" - -\end_inset - -: Renater IPv6 Project Page -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 - RSVP - ATM at INRIA" -target "http://www.inria.fr/recherche/equipes/ipv6.fr.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "NetBSD IPv6 Documentation" -target "http://www.netbsd.org/fr/Documentation/network/ipv6/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Italy -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Project6" -target "http://project6.ferrara.linux.it/" - -\end_inset - -: IPv6 networking with Linux -\end_layout - -\begin_layout Subsubsection -Japan -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Yamaha IPv6" -target "http://www.rtpro.yamaha.co.jp/RT/ipv6/" - -\end_inset - - (sorry, all in japanese native ...) -\end_layout - -\begin_layout Subsubsection -Korea -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "ETRI" -target "http://www.krv6.net/" - -\end_inset - -: Electronics and Telecommunications Research Institut -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Forum Korea" -target "http://www.ipv6.or.kr/english/index.new.htm" - -\end_inset - -: Korean IPv6 Deployment Project -\end_layout - -\begin_layout Subsubsection -Mexico -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Mexico" -target "http://www.ipv6.unam.mx/" - -\end_inset - - (spain & english version): IPv6 Project Hompeage of The National Autonomous - University of Mexico (UNAM) -\end_layout - -\begin_layout Subsubsection -Netherland -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "SURFnet" -target "http://www.ipv6.surfnet.nl/" - -\end_inset - -: SURFnet IPv6 Backbone -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "STACK" -target "http://www.stack.nl/" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "STACK (IPv6)" -target "http://www.stack.nl/ipv6/" - -\end_inset - -: Students' computer association of the Eindhoven University of Technology, - Netherland -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPng.nl" -target "http://www.ipng.nl/" - -\end_inset - -: collaboration between WiseGuys and Intouch -\end_layout - -\begin_layout Subsubsection -Portugal -\end_layout - -\begin_layout Standard -Suggestions are welcome! -\end_layout - -\begin_layout Subsubsection -Russia -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Forum for Russia" -target "http://www.ipv6.ru/" - -\end_inset - -: Yaroslavl State University Internet Center -\end_layout - -\begin_layout Subsubsection -Switzerland -\end_layout - -\begin_layout Standard -Suggestions are welcome! -\end_layout - -\begin_layout Subsubsection -United Kingdom -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "British Telecom IPv6 Home" -target "http://www.bt.com/ipv6/" - -\end_inset - -: BT's ISP IPv6 Trial, UK's first IPv6 Internet Exchange etc. -\end_layout - -\begin_layout Subsection -By operating systems -\end_layout - -\begin_layout Subsubsection -*BSD -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "KAME project" -target "http://www.kame.net/" - -\end_inset - - (*BSD) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "NetBSD's IPv6 Networking FAQ" -target "http://www.netbsd.org/Documentation/network/ipv6/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "FreeBSD Ports: Ipv6" -target "http://www.freebsd.org/ports/ipv6.html" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Cisco IOS -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Cisco IOS IPv6 Entry Page" -target "http://www.cisco.com/warp/public/732/Tech/ipv6/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 for Cisco IOS Software" -target "http://www.cisco.com/univercd/cc/td/doc/product/software/ios122/122newft/122t/122t2/ipv6/ftipv6c.htm" - -\end_inset - -, File 2 of 3: Aug 2002 -- Table of Contents: IPv6 for Cisco IOS Software; - Configuring Documentation Specifics; Enabling IPv6 Routing and Configuring; - IPv6 Addressing; Enabling IPv6 Processing Globally. -\end_layout - -\begin_layout Itemize -Cisco Internet Networking Handbook, -\begin_inset CommandInset href -LatexCommand href -name "Chapter IPv6" -target "http://www.cisco.com/univercd/cc/td/doc/cisintwk/ito_doc/ipv6.htm" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -HPUX -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "comp.sys.hp.hpux FAQ" -target "http://www.faqs.org/faqs/hp/hpux-faq/index.html" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -IBM -\end_layout - -\begin_layout Itemize -Now that IBM's announced the availability of z/OS V1.4, -\begin_inset CommandInset href -LatexCommand href -name "what's new in this release?" -target "http://search390.techtarget.com/ateQuestionNResponse/0,289625,sid10_cid486367_tax292523,00.html" - -\end_inset - - This question was posed on 15 August 2002 -\end_layout - -\begin_layout Subsubsection -Microsoft -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Microsoft Windows 2000 IPv6" -target "http://www.microsoft.com/windows2000/technologies/communications/ipv6/default.asp" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "MSRIPv6" -target "http://www.research.microsoft.com/msripv6" - -\end_inset - - - Microsoft Research Network - IPv6 Homepage -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Internet Connection Firewall Does Not Block Internet Protocol Version 6 Traffic" -target "http://support.microsoft.com/default.aspx?scid=kb;en-us;306203" - -\end_inset - - (6.11.2001) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Internet Protocol Numbers" -target "http://support.microsoft.com/default.aspx?scid=kb;en-us;289892" - -\end_inset - - (8.10.2002) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Technology Preview Refresh" -target "http://support.microsoft.com/default.aspx?scid=kb;en-us;273826" - -\end_inset - - (16.10.2002) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "HOW TO: Install and Configure IP Version 6 in Windows .NET Enterprise Server" -target "http://support.microsoft.com/default.aspx?scid=kb;en-us;325449" - -\end_inset - - (26.10.2002) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Windows .NET Server 6to4 Router Service Quits When You Advertise a 2002 Address on the Public Interface" -target "http://support.microsoft.com/default.aspx?scid=kb;en-us;329984" - -\end_inset - - (28.10.2002) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "msdn - Microsoft Windows CE .NET - IPv6 commands" -target "http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcetcpip/htm/cmconIPv6exe.asp" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Solaris -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Sun Microsystems Solaris" -target "http://www.sun.com/software/solaris/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Solaris 2 Frequently Asked Questions (FAQ) 1.73" -target "http://www.cs.uu.nl/wais/html/na-dir/Solaris2/FAQ.html" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Sumitoma -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Sumitomo Electric has implemented IPv6 on Suminet 3700 family routers" -target "http://playground.sun.com/pub/ipng/html/ipng-implementations.html#Sumitomo" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -ZebOS -\end_layout - -\begin_layout Itemize -IpInfusion's -\begin_inset CommandInset href -LatexCommand href -name "ZebOS Server Routing Software" -target "http://www.ipinfusion.com/products/server/products_server.html" - -\end_inset - - -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "information-ipv6andsecurity" - -\end_inset - -IPv6 Security -\end_layout - -\begin_layout Itemize -Internet Security Systems: Security Center, -\begin_inset CommandInset href -LatexCommand href -name "X-Force Database Search" -target "http://www.iss.net/security_center/search.php?type=3&type=3&pattern=IPv6" - -\end_inset - - (21.12.2002 - 6 topics found relating to IPv6) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "NIST IPsec Project" -target "http://csrc.nist.gov/ipsec/" - -\end_inset - - ( National Institute of Standards and Technology, NIST) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Information Security" -target "http://www.infosecuritymag.com/index.shtml" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "NewOrder.box.sk (search for IPv6)" -target "http://neworder.box.sk/search.php3?srch=IPv6" - -\end_inset - - (Articles, exploits, files database etc.) -\end_layout - -\begin_layout Subsection -Application lists -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "DeepSpace6 / IPv6 Status Page" -target "http://www.deepspace6.net/docs/ipv6_status_page_apps.html" - -\end_inset - - ( -\begin_inset CommandInset href -LatexCommand href -name "Mirror" -target "http://mirrors.bieringer.de/www.deepspace6.net/docs/ipv6_status_page_apps.html" - -\end_inset - -) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6.org / IPv6 enabled applications" -target "http://www.ipv6.org/v6-apps.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Freshmeat / IPv6 search" -target "http://freshmeat.net/search/?q=IPv6" - -\end_inset - -, currently (14 Dec 2002) 62 projects -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Forum / Web Links" -target "http://www.ipv6forum.com/modules.php?op=modload&name=Web_Links&file=index" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Analyzer tools -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Wireshark" -target "http://www.wireshark.org/" - -\end_inset - - (former known as -\emph on -Ethereal -\emph default -) is a free network protocol analyzer for Unix and Windows -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Radcom RC100-WL" -target "http://www.ip6.com/us/analyzer.htm" - -\end_inset - - - Download Radcom RC100-WL protocol analyzer version 3.20 -\end_layout - -\begin_layout Subsubsection -IPv6 Products -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "6wind" -target "http://www.6wind.com/" - -\end_inset - - - solutions for IPv4/IPv6 Router, QoS, Multicast, Mobility, Security/VPN/Firewa -ll. - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Fefe's patches for IPv6 with djbdns" -target "http://www.fefe.de/dns/" - -\end_inset - -Aug 2002 -- What is djbdns and why does it need IPv6? djbdns is a full blown - DNS server which outperforms BIND in nearly all respects. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "ZebOS Server Routing Suite " -target "http://www.ipinfusion.com/products/server/products_server.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Inframail (Advantage Server Edition)" -target "http://download.cnet.com/Inframail-Advantage-Server-Edition/3000-10248_4-8202652.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "HTTrack Website Copier" -target "http://download.cnet.com/HTTrack-Website-Copier/3000-2377_4-10149393.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "CommView" -target "http://download.cnet.com/CommView/3000-2085_4-10132748.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Posadis" -target "http://download.cnet.com/Posadis/3000-2155_4-10149750.html" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-snmp" - -\end_inset - -SNMP -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "comp.protocpols.snmp SNMP FAQ Part 1 of 2" -target "http://www.cs.uu.nl/wais/html/na-dir/snmp-faq/part1.html" - -\end_inset - - -\end_layout - -\begin_layout Section -IPv6 Infrastructure -\end_layout - -\begin_layout Subsection -Statistics -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 routing table history" -target "http://www.space.net/~gert/RIPE/" - -\end_inset - - created by Gert Döring, -\begin_inset CommandInset href -LatexCommand href -name "Space.Net" -target "http://www.space.net/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Official 6bone Webserver list Statisic" -target "http://6bone.informatik.uni-leipzig.de/ipv6/stats/stats.php3" - -\end_inset - - -\end_layout - -\begin_layout Subsection -Internet Exchanges -\end_layout - -\begin_layout Standard -Another list of IPv6 Internet Exchanges can be found here: -\begin_inset CommandInset href -LatexCommand href -name "IPv6 status of IXPs in Europe" -target "http://www.euro-ix.net/isp/choosing/search/matrix.php" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-ipv6exchanges-estonia" - -\end_inset - -Estonia -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "TIX" -target "http://tix.estpak.ee/" - -\end_inset - - (tallinn interneti exchange with ipv6 support) -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-ipv6exchanges-europe" - -\end_inset - -Europe -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Euro6IX" -target "http://www.euro6ix.net/" - -\end_inset - -, European IPv6 Internet Exchange Backbone -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-ipv6exchanges-france" - -\end_inset - -France -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "French National Internet Exchange IPv6" -target "http://www.fnix6.net/" - -\end_inset - - (since 1.11.2002 active). - -\begin_inset Newline newline -\end_inset - -FNIX6 provides a free and reliable high speed FastEthernet interconnection - between ISP located in TeleCity Paris. -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-ipv6exchanges-germany" - -\end_inset - -Germany -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "INXS" -target "http://www.inxs.de/" - -\end_inset - -: (Cable & Wireless) Munich and Hamburg -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-ipv6exchanges-japan" - -\end_inset - -Japan -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "NSPIXP-6" -target "http://www.wide.ad.jp/nspixp6/" - -\end_inset - -: IPv6-based Internet Exchange in Tokyo -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "JPIX" -target "http://www.jpix.co.jp/" - -\end_inset - -, Tokyo -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-ipv6exchanges-korea" - -\end_inset - -Korea -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "6NGIX" -target "http://www.ngix.ne.kr/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-ipv6exchanges-netherlands" - -\end_inset - -Netherlands -\end_layout - -\begin_layout Itemize - -\lang ngerman -\begin_inset CommandInset href -LatexCommand href -name "AMS-IX" -target "http://www.ams-ix.net/" - -\end_inset - - -\lang english -: Amsterdam Internet Exchange -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-ipv6exchanges-uk" - -\end_inset - -UK -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "UK6X" -target "http://www.uk6x.com/" - -\end_inset - -: London -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "XchangePoint" -target "http://www.xchangepoint.net/" - -\end_inset - -: London -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-ipv6exchanges-usa" - -\end_inset - -USA -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "6TAP" -target "http://www.6tap.net/" - -\end_inset - -: Chicago. - Supports peerings around the globe. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "PAIX" -target "http://www.paix.net/" - -\end_inset - -: Palo Alto -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "information-Tunnelbroker" - -\end_inset - -Tunnel broker -\end_layout - -\begin_layout Standard -See also: -\begin_inset CommandInset href -LatexCommand href -name "http://www.deepspace6.net/docs/tunnelbrokers.html" -target "http://www.deepspace6.net/docs/tunnelbrokers.html" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-belgium" - -\end_inset - -Belgium -\end_layout - -\begin_layout Standard -Something missing? Suggestions are welcome! -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-canada" - -\end_inset - -Canada -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Freenet6" -target "http://www.freenet6.net/" - -\end_inset - - - /48 Delegation, Canada -\begin_inset Newline newline -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name "Getting IPv6 Using Freenet6 on Debian" -target "http://www.linuxjournal.com/article.php?sid=5963&mode=thread&order=0" - -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name "Freenet6 creater" -target "http://www.viagenie.qc.ca/en/index.shtml" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-china" - -\end_inset - -China -\end_layout - -\begin_layout Standard -Something missing? Suggestions are welcome! -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-estonia" - -\end_inset - -Estonia -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Estpak" -target "http://tunnelbroker.ipv6.estpak.ee/?tunnel&PHPSESSID=aa2184190cc2cc6d3a6f6ddd01ae3635" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-germany" - -\end_inset - -Germany -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "6bone Knoten Leipzig" -target "http://6bone.informatik.uni-leipzig.de/" - -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name "Info bez. Hackangriff (2001)" -target "http://www.mail-archive.com/ipv6@uni-muenster.de/msg00056.html" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-italy" - -\end_inset - -Italy -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Comv6" -target "http://www.comv6.com/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Bersafe" -target "http://www.bersafe.it/" - -\end_inset - - (Italian language) -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-japan" - -\end_inset - -Japan -\end_layout - -\begin_layout Standard -Something missing? Suggestions are welcome! -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-malaysia" - -\end_inset - -Malaysia -\end_layout - -\begin_layout Standard -Something missing? Suggestions are welcome! -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-netherlands" - -\end_inset - -Netherlands -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPng Netherland" -target "http://www.ipng.nl/" - -\end_inset - - - Intouch, SurfNet, AMS-IX, UUNet, Cistron, RIPE NCC and AT&T are connected - at the AMS-IX. - It is possible (there are requirements...) to get an static tunnel. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "SURFnet Customers" -target "http://www.ipv6.surfnet.nl/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-norway" - -\end_inset - -Norway -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "UNINETT" -target "http://www.uninett.no/testnett/index.en.html" - -\end_inset - - - Pilot IPv6 Service (for Customers): tunnelbroker & address allocation - -\begin_inset Newline newline -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name "Uninett-Autoupdate-HOWTO" -target "http://www.guruz.de/Uninett-Autoupdate-HOWTO" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-spain" - -\end_inset - -Spain -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Consulintel" -target "http://tb.consulintel.euro6ix.org/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-switzerland" - -\end_inset - -Switzerland -\end_layout - -\begin_layout Standard -Something missing? Suggestions are welcome! -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-uk" - -\end_inset - -UK -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "NTT" -target "http://www.nttv6.net/" - -\end_inset - -, United Kingdom - IPv6 Trial. - IPv4 Tunnel and native IPv6 leased Line connections. - POPs are located in London, UK Dusseldorf, Germany New Jersey, USA (East - Coast) Cupertino, USA (West Coast) Tokyo, Japan -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-usa" - -\end_inset - -USA -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "ESnet" -target "http://www.es.net/hypertext/welcome/pr/ipv6.html" - -\end_inset - -, USA - Energy Sciences Network: Tunnel Registry & Address Delegation for - directly connected ESnet sites and ESnet collaborators. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Hurricane Electric" -target "http://ipv6tb.he.net/" - -\end_inset - -, US backbone; -\begin_inset Newline newline -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name "Hurrican Electric Tunnelbroker" -target "http://tunnelbroker.net/" - -\end_inset - - (also available under -\begin_inset CommandInset href -LatexCommand href -name "http://tunnelbroker.com/" -target "http://tunnelbroker.com/" - -\end_inset - -) -\begin_inset Newline newline -\end_inset - -Press Release: -\begin_inset CommandInset href -LatexCommand href -name "Hurricane Electric Upgrades IPv6 Tunnel Broker" -target "http://www.he.net/releases/release6.html" - -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\begin_inset CommandInset href -LatexCommand href -name "Tunnel Broker Endpoint Autoupdate" -target "http://ipv6.he.net/tunnelbroker-update.php" - -\end_inset - -, Perl Script -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-singapore" - -\end_inset - -Singapore -\end_layout - -\begin_layout Standard -Something missing? Suggestions are welcome! -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-tunnelbroker-more" - -\end_inset - -More Tunnel brokers... -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Public 6to4 relay routers" -target "http://www.kfu.com/~nsayer/6to4/" - -\end_inset - - (MS IIE boycott!) -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "information-infrastructure-nativeipv6service" - -\end_inset - -Native IPv6 Services -\end_layout - -\begin_layout Standard -Note: These services are mostly only available with a valid IPv6 connection! -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-nativeipv6nntp" - -\end_inset - -Net News (NNTP) -\end_layout - -\begin_layout Standard -Something missing? Suggestions are welcome! -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-nativeipv6gameserver" - -\end_inset - -Game Server -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Quake2" -target "http://www.viagenie.qc.ca/en/ipv6/quake2/ipv6-quake2.shtml" - -\end_inset - - over IPv6 -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-nativeipv6ircserver" - -\end_inset - -IRC Server -\end_layout - -\begin_layout Standard -Something missing? Suggestions are welcome! -\end_layout - -\begin_layout Subsubsection -Radio Stations, Music Streams -\end_layout - -\begin_layout Standard -Something missing? Suggestions are welcome! -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "information-nativeipv6webserver" - -\end_inset - -Webserver -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Peter Bieringer's Home of Linux IPv6 HOWTO " -target "http://www.ipv6.bieringer.de/" - -\end_inset - - -\end_layout - -\begin_layout Standard -Something missing? Suggestions are welcome! -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "information-maillists" - -\end_inset - -Maillists -\end_layout - -\begin_layout Standard -Lists of maillists are available at: -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "DeepSpace6 / Mailling Lists" -target "http://www.deepspace6.net/sections/lists.html" - -\end_inset - - -\end_layout - -\begin_layout Standard -Major Mailinglists are listed in following table: -\end_layout - -\begin_layout Standard -\begin_inset Tabular - - - - - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Focus -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Request e-mail address -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -What to subscribe -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Maillist e-mail address -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Language -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Access through WWW -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Linux kernel networking including IPv6 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -majordomo (at) vger.kernel.org -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -netdev -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -netdev (at) vger.kernel.org -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -English -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -\begin_inset CommandInset href -LatexCommand href -name "Info" -target "http://vger.kernel.org/vger-lists.html#netdev" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "Archive" -target "http://www.spinics.net/lists/netdev/" - -\end_inset - - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Mobile IP(v6) for Linux -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Web-based, see URL -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -mipl -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -mipl (at) mobile-ipv6.org -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -English -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -\begin_inset CommandInset href -LatexCommand href -name "Info" -target "http://www.mobile-ipv6.org/cgi-bin/mailman/listinfo" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "Archive" -target "http://www.mobile-ipv6.org/pipermail/mipl/" - -\end_inset - - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Linux IPv6 users using USAGI extension -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -usagi-users-ctl (at) linux-ipv6.org -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -usagi-users (at) linux-ipv6.org -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -English -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -\begin_inset CommandInset href -LatexCommand href -name "Info / Search" -target "http://www.linux-ipv6.org/ml/index.html#usagi-users" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "Archive" -target "http://www.linux-ipv6.org/ml/usagi-users/" - -\end_inset - - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -IPv6 on Debian Linux -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -debian-ipv6 (at) lists.debian.org -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -English -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -\begin_inset CommandInset href -LatexCommand href -name "Info/Subscription/Archive" -target "http://lists.debian.org/debian-ipv6/" - -\end_inset - - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -6bone -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -majordomo (at) isi.edu -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -6bone -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -6bone (at) isi.edu -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -English -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -\begin_inset CommandInset href -LatexCommand href -name "Info" -target "http://www.6bone.net/6bone_email.html" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "Archive" -target "http://mailman.isi.edu/pipermail/6bone/" - -\end_inset - - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -IPv6 users in general -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -majordomo (at) ipv6.org -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -users -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -users (at) ipv6.org -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -English -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -\begin_inset CommandInset href -LatexCommand href -name "Info" -target "http://www.ipv6.org/mailing-lists.html" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "Archive" -target "http://www.mail-archive.com/users@ipv6.org/" - -\end_inset - - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Bugtracking of Internet applications (1) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -bugtraq-subscribe (at) securityfocus.com -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -bugtraq (at) securityfocus.com (2) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -English -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -\begin_inset CommandInset href -LatexCommand href -name "Info" -target "http://online.securityfocus.com/popups/forums/bugtraq/intro.shtml" - -\end_inset - -, -\begin_inset CommandInset href -LatexCommand href -name "Archive" -target "http://online.securityfocus.com/archive/1" - -\end_inset - - -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Standard -(1) very recommended if you provide server applications. -\end_layout - -\begin_layout Standard - -\lang ngerman -(2) list is moderated. -\begin_inset Newline newline -\end_inset - - -\end_layout - -\begin_layout Standard -Something missing? Suggestions are welcome! -\begin_inset Newline newline -\end_inset - - -\end_layout - -\begin_layout Standard -Following other maillinglists & newsgroups are available via web: -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "student-ipv6 (India)" -target "http://groups.yahoo.com/group/student-ipv6" - -\end_inset - - -\begin_inset Newline newline -\end_inset - -Description: This is the group for the Student Awareness group of IPv6 in - India -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "sun-ipv6-users" -target "http://groups.yahoo.com/group/sun-ipv6-users" - -\end_inset - - -\begin_inset Newline newline -\end_inset - -Description: Please report problems/suggestions regarding SUN Microsystems - IPng implementation -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6-BITS" -target "http://groups.yahoo.com/group/IPv6-BITS" - -\end_inset - - -\begin_inset Newline newline -\end_inset - -Description: This List will co-ordinate the working of Project Vertebrae. -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "linux-bangalore-ipv6" -target "http://groups.yahoo.com/group/linux-bangalore-ipv6" - -\end_inset - - -\begin_inset Newline newline -\end_inset - -Description: The IPv6 deployment list of the Bangalore Linux User Group -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "packet-switching" -target "http://groups.yahoo.com/group/packet-switching" - -\end_inset - - -\begin_inset Newline newline -\end_inset - -Description: This mailing list provides a forum for discussion of packet - switching theory, technology, implementation and application in any relevant - aspect including without limitation LAPB, X.25, SDLC, P802.1d, LLC, IP, IPv6, - IPX, DECNET, APPLETALK, FR, PPP, IP Telephony, LAN PBX systems, management - protocols like SNMP, e-mail, network transparent window systems, protocol - implementation, protocol verification, conformance testing and tools used - in maintaining or developing packet switching systems. -\end_layout - -\begin_layout Itemize -de.comm.protocols.tcp-ip -\begin_inset Newline newline -\end_inset - -Description: Umstellung auf IPv6 -\begin_inset Newline newline -\end_inset - -Source: -\begin_inset CommandInset href -LatexCommand href -name "Chartas der Newsgruppen in de.*" -target "http://www.faqs.org/faqs/de-newsgroups/chartas/index.html" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Google Group: -\begin_inset CommandInset href -LatexCommand href -name "comp.protocols.tcp-ip" -target "http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF8&safe=off&group=comp.protocols.tcp-ip" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Google Group: -\begin_inset CommandInset href -LatexCommand href -name "linux.debian.maint.ipv6" -target "http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF8&safe=off&group=linux.debian.maint.ipv6" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Google Group: -\begin_inset CommandInset href -LatexCommand href -name "microsoft.public.platformsdk.networking.ipv6" -target "http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF8&safe=off&group=microsoft.public.platformsdk.networking.ipv6" - -\end_inset - - -\end_layout - -\begin_layout Itemize -Google Group: -\begin_inset CommandInset href -LatexCommand href -name "fa.openbsd.ipv6" -target "http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF8&safe=off&group=fa.openbsd.ipv6" - -\end_inset - - -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "information-onlinetesttools" - -\end_inset - -Online tools -\end_layout - -\begin_layout Subsection -Testing tools -\end_layout - -\begin_layout Itemize -ping, traceroute, tracepath, 6bone registry, DNS: -\begin_inset CommandInset href -LatexCommand href -name "JOIN / Testtools" -target "http://www.join.uni-muenster.de/lab/testtools.html" - -\end_inset - - (German language only, but should be no problem for non German speakers) -\end_layout - -\begin_layout Itemize -traceroute6, whois: -\begin_inset CommandInset href -LatexCommand href -name "IPng.nl" -target "http://www.ipng.nl/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -AAAA Lookup Checker -\begin_inset CommandInset href -LatexCommand href -name "http://www.cnri.dit.ie/cgi-bin/check_aaaa.pl" -target "http://www.cnri.dit.ie/cgi-bin/check_aaaa.pl" - -\end_inset - - -\end_layout - -\begin_layout Subsection -Information retrievement -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "List of worldwide all IPv6-aggregated IP-Blocks" -target "http://www.ripe.net/ripencc/mem-services/registration/ipv6/ipv6allocs.html" - -\end_inset - - -\end_layout - -\begin_layout Subsection -IPv6 Looking Glasses -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "DRENv6 Looking Glass" -target "http://www.v6.dren.net/lg/" - -\end_inset - - -\end_layout - -\begin_layout Subsection -Helper applications -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "IPv6 Prefix Calculator" -target "http://www.tdoi.org/prefcalc.php" - -\end_inset - - by -\begin_inset CommandInset href -LatexCommand href -name "TDOI" -target "http://www.tdoi.org/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "DNS record checker" -target "http://www.maths.tcd.ie/cgi-bin/check_dns.pl" - -\end_inset - - -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "information-trainingsandseminars" - -\end_inset - -Trainings, Seminars -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "CIW Internetworking Professional Training CBT CD" -target "http://www.e-trainonline.com/html/ciw_internetworking_profession.html#IPv6" - -\end_inset - - -\end_layout - -\begin_layout Itemize - -\lang ngerman -\begin_inset CommandInset href -LatexCommand href -name "Training Pages" -target "http://www.trainingpages.com/x/category,kw-1628,.html" - -\end_inset - - -\lang english -, U.K. - - Search for IPv6 (13 Courses, 2006-08-21) -\end_layout - -\begin_layout Itemize -\begin_inset CommandInset href -LatexCommand href -name "Erion IPv6 Training" -target "http://www.erion.co.uk/ipv6.html" - -\end_inset - -, UK -\end_layout - -\begin_layout Standard -Something missing? Suggestions are welcome! -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "information-onlinediscovery" - -\end_inset - -'The Online Discovery' ... -\end_layout - -\begin_layout Standard -IPv6: Addressing The Needs Of the Future by Yankee Group (Author) -\begin_inset Newline newline -\end_inset - -List Price: $595.00 -\begin_inset Newline newline -\end_inset - -Edition: e-book (Acrobat Reader) -\begin_inset Newline newline -\end_inset - -Pages: 3 (three) -\begin_inset Newline newline -\end_inset - -Publisher: MarketResearch.com; ISBN B00006334Y; (November 1, 2001) -\begin_inset Newline newline -\end_inset - - -\end_layout - -\begin_layout Standard -;-) The number of copies would be interesting... -\begin_inset Newline newline -\end_inset - - -\end_layout - -\begin_layout Chapter -Revision history / Credits / The End -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "revision-history" - -\end_inset - -Revision history -\end_layout - -\begin_layout Standard -Versions x.y are published on the Internet. -\end_layout - -\begin_layout Standard -Versions x.y.z are work-in-progress and published as LyX and SGML file on - CVS. - Because Deep Space 6 mirrors these SGML files and generate independend - from TLDP public versions, this versions will show up there and also on - its mirrors. -\end_layout - -\begin_layout Subsection -Releases 0.x -\end_layout - -\begin_layout Description -0.65 2010-04-20/PB: extend QoS section with examples -\end_layout - -\begin_layout Description -0.65 2009-12-13/PB: minor fixes -\end_layout - -\begin_layout Description -0.64 2009-06-11/PB: extend DHCP server examples (ISC DHCP, Dibbler) -\end_layout - -\begin_layout Description -0.63 2009-02-14/PB: Fix FSF address, major update on 4in6 tunnels, add new - section for address resolving, add some URLs, remove broken URLs -\end_layout - -\begin_layout Description -0.62 2008-11-09/PB: Adjust URL to Turkish howto, add some HIP related URLs, - remove broken URLs -\end_layout - -\begin_layout Description -0.61.1 2007-11-11/PB: fix broken description of shortcut BIND -\end_layout - -\begin_layout Description -0.61 2007-10-06/PB: fix broken URLs to TLDP-CVS, minor URL update. -\end_layout - -\begin_layout Description -0.60.2 2007-10-03/PB: fix description of sysctl/autoconf (credits to Francois-Xavi -er Le Bail) -\end_layout - -\begin_layout Description -0.60.1 2007-06-16/PB: speling fixes (credits to Larry W. - Burton) -\end_layout - -\begin_layout Description -0.60 2007-05-29/PB: import major contribution to Programming using C-API - written by John Wenker, minor fixes -\end_layout - -\begin_layout Description -0.52 2007-05-23/PB: update firewalling chapter, improve document for proper - SGML validation, minor bugfixes -\end_layout - -\begin_layout Description -0.51 2006-11-08/PB: remove broken URLs, add a new book (credits to Bryan - Vukich) -\end_layout - -\begin_layout Description -0.50.2 2006-10-25/PB: fix typo in dhcp6 section (credits to Michele Ferritto) -\end_layout - -\begin_layout Description -0.50.1 2006-09-23/PB: add some URLs -\end_layout - -\begin_layout Description -0.50 2006-08-24/PB: check RFC URLs, fix URL to Chinese translation, finalize - for publishing -\end_layout - -\begin_layout Description -0.49.5 2006-08-23/PB: fix/remove broken URLs -\end_layout - -\begin_layout Description -0.49.4 2006-08-21/PB: some review, update and enhancement of the content, - replace old 6bone example addresses with the current defined ones. -\end_layout - -\begin_layout Description -0.49.3 2006-08-20/PB: fix bug in maillist entries, 'mobility' is now a separate - chapter -\end_layout - -\begin_layout Description -0.49.2 2006-08-20/PB: update and cleanup of maillist entries -\end_layout - -\begin_layout Description -0.49.1 2006-06-13/PB: major update of mobility section (contributed by Benjamin - Thery) -\end_layout - -\begin_layout Description -0.49 2005-10-03/PB: add configuration hints for DHCPv6, major broken URL - cleanup (credits to Necdet Yucel) -\end_layout - -\begin_layout Description -0.48.1 2005-01-15/PB: minor fixes -\end_layout - -\begin_layout Description -0.48 2005-01-11/PB: grammar check and minor review of IPv6 IPsec section -\end_layout - -\begin_layout Description -0.47.1 2005-01-01/PB: add information and examples about IPv6 IPsec, add some - URLs -\end_layout - -\begin_layout Description -0.47 2004-08-30/PB: add some notes about proftpd, vsftpd and other daemons, - add some URLs, minor fixes, update status of Spanish translation -\end_layout - -\begin_layout Description -0.46.4 2004-07-19/PB: minor fixes -\end_layout - -\begin_layout Description -0.46.3 2004-06-23/PB: add note about started Greek translation, replace Taiwanese - with Chinese for related translation -\end_layout - -\begin_layout Description -0.46.2 2004-05-22/PB: minor fixes -\end_layout - -\begin_layout Description -0.46.1 2004-04-18/PB: minor fixes -\end_layout - -\begin_layout Description -0.46 2004-03-04/PB: announce Italian translation, add information about DHCPv6, - minor updates -\end_layout - -\begin_layout Description -0.45.1 2004-01-12/PB: add note about the official example address space -\end_layout - -\begin_layout Description -0.45 2004-01-11/PB: minor fixes, add/fix some URLs, some extensions -\end_layout - -\begin_layout Description -0.44.2 2003-10-30/PB: fix some copy&paste text bugs -\end_layout - -\begin_layout Description -0.44.1 2003-10-19/PB: add note about start of Italian translation -\end_layout - -\begin_layout Description -0.44 2003-08-15/PB: fix URLs, add hint on tcp_wrappers (about broken notation - in some versions) and Apache2 -\end_layout - -\begin_layout Description -0.43.4 2003-07-26/PB: fix URL, add archive URL for maillist users at ipv6.org, - add some ds6 URLs -\end_layout - -\begin_layout Description -0.43.3 2003-06-19/PB: fix typos -\end_layout - -\begin_layout Description -0.43.2 2003-06-11/PB: fix URL -\end_layout - -\begin_layout Description -0.43.1 2003-06-07/PB: fix some URLs, fix credits, add some notes at IPsec -\end_layout - -\begin_layout Description -0.43 2003-06-05/PB: add some notes about configuration in SuSE Linux, add - URL of French translation -\end_layout - -\begin_layout Description -0.42 2003-05-09/PB: minor fixes, announce French translation -\end_layout - -\begin_layout Description -0.41.4 2003-05-02/PB: Remove a broken URL, update some others. -\end_layout - -\begin_layout Description -0.41.3 2003-04-23/PB: Minor fixes, remove a broken URL, fix URL to Taiwanese - translation -\end_layout - -\begin_layout Description -0.41.2 2003-04-13/PB: Fix some typos, add a note about a French translation - is in progress -\end_layout - -\begin_layout Description -0.41.1 2003-03-31/PB: Remove a broken URL, fix another -\end_layout - -\begin_layout Description -0.41 2003-03-22/PB: Add URL of German translation -\end_layout - -\begin_layout Description -0.40.2 2003-02-27/PB: Fix a misaddressed URL -\end_layout - -\begin_layout Description -0.40.1 2003-02-12/PB: Add Debian-Linux-Configuration, add a minor note on - translations -\end_layout - -\begin_layout Description -0.40 2003-02-10/PB: Announcing available German version -\end_layout - -\begin_layout Description -0.39.2 2003-02-10/GK: Minor syntax and spelling fixes -\end_layout - -\begin_layout Description -0.39.1 2003-01-09/PB: fix an URL (draft adopted to an RFC) -\end_layout - -\begin_layout Description -0.39 2003-01-13/PB: fix a bug (forgotten 'link -\begin_inset Quotes srd -\end_inset - - on -\begin_inset Quotes sld -\end_inset - -ip link set -\begin_inset Quotes srd -\end_inset - - (credits to Yaniv Kaul) -\end_layout - -\begin_layout Description -0.38.1 2003-01-09/PB: a minor fix -\end_layout - -\begin_layout Description -0.38 2003-01-06/PB: minor fixes -\end_layout - -\begin_layout Description -0.37.1 2003-01-05/PB: minor updates -\end_layout - -\begin_layout Description -0.37 2002-12-31/GK: 270 new links added (searched in 1232 SearchEngines) - in existing and 53 new (sub)sections -\end_layout - -\begin_layout Description -0.36.1 2002-12-20/PB: Minor fixes -\end_layout - -\begin_layout Description -0.36 2002-12-16/PB: Check of and fix broken links (credits to Georg Käfer), - some spelling fixes -\end_layout - -\begin_layout Description -0.35 2002-12-11/PB: Some fixes and extensions -\end_layout - -\begin_layout Description -0.34.1 2002-11-25/PB: Some fixes (e.g. - broken linuxdoc URLs) -\end_layout - -\begin_layout Description -0.34 2002-11-19/PB: Add information about German translation (work in progress), - some fixes, create a small shortcut explanation list, extend -\begin_inset Quotes sld -\end_inset - -used terms -\begin_inset Quotes srd -\end_inset - - and add two German books -\end_layout - -\begin_layout Description -0.33 2002-11-18/PB: Fix broken RFC-URLs, add parameter ttl on 6to4 tunnel - setup example -\end_layout - -\begin_layout Description -0.32 2002-11-03/PB: Add information about Taiwanese translation -\end_layout - -\begin_layout Description -0.31.1 2002-10-06/PB: Add another maillist -\end_layout - -\begin_layout Description -0.31 2002-09-29/PB: Extend information in proc-filesystem entries -\end_layout - -\begin_layout Description -0.30 2002-09-27/PB: Add some maillists -\end_layout - -\begin_layout Description -0.29 2002-09-18/PB: Update statement about nmap (triggered by Fyodor) -\end_layout - -\begin_layout Description -0.28.1 2002-09-16/PB: Add note about ping6 to multicast addresses, add some - labels -\end_layout - -\begin_layout Description -0.28 2002-08-17/PB: Fix broken LDP/CVS links, add info about Polish translation, - add URL of the IPv6 Address Oracle -\end_layout - -\begin_layout Description -0.27 2002-08-10/PB: Some minor updates -\end_layout - -\begin_layout Description -0.26.2 2002-07-15/PB: Add information neighbor discovery, split of firewalling - (got some updates) and security into extra chapters -\end_layout - -\begin_layout Description -0.26.1 2002-07-13/PB: Update nmap/IPv6 information -\end_layout - -\begin_layout Description -0.26 2002-07-13/PB: Fill /proc-filesystem chapter, update DNS information - about depricated A6/DNAME, change P-t-P tunnel setup to use of -\begin_inset Quotes sld -\end_inset - -ip -\begin_inset Quotes srd -\end_inset - - only -\end_layout - -\begin_layout Description -0.25.2 2002-07-11/PB: Minor spelling fixes -\end_layout - -\begin_layout Description -0.25.1 2002-06-23/PB: Minor spelling and other fixes -\end_layout - -\begin_layout Description -0.25 2002-05-16/PB: Cosmetic fix for 2^128, thanks to José Abílio Oliveira - Matos for help with LyX -\end_layout - -\begin_layout Description -0.24 2002-05-02/PB: Add entries in URL list, minor spelling fixes -\end_layout - -\begin_layout Description -0.23 2002-03-27/PB: Add entries in URL list and at maillists, add a label - and minor information about IPv6 on RHL -\end_layout - -\begin_layout Description -0.22 2002-03-04/PB: Add info about 6to4 support in kernel series 2.2.x and - add an entry in URL list and at maillists -\end_layout - -\begin_layout Description -0.21 2002-02-26/PB: Migrate next grammar checks submitted by John Ronan -\end_layout - -\begin_layout Description -0.20.4 2002-02-21/PB: Migrate more grammar checks submitted by John Ronan, - add some additional hints at DNS section -\end_layout - -\begin_layout Description -0.20.3 2002-02-12/PB: Migrate a minor grammar check patch submitted by John - Ronan -\end_layout - -\begin_layout Description -0.20.2 2002-02-05/PB: Add mipl to maillist table -\end_layout - -\begin_layout Description -0.20.1 2002-01-31/PB: Add a hint how to generate 6to4 addresses -\end_layout - -\begin_layout Description -0.20 2002-01-30/PB: Add a hint about default route problem, some minor updates -\end_layout - -\begin_layout Description -0.19.2 2002-01-29/PB: Add many new URLs -\end_layout - -\begin_layout Description -0.19.1 2002-01-27/PB: Add some forgotten URLs -\end_layout - -\begin_layout Description -0.19 2002-01-25/PB: Add two German books, fix quote entinities in exported - SGML code -\end_layout - -\begin_layout Description -0.18.2 2002-01-23/PB: Add a FAQ on the program chapter -\end_layout - -\begin_layout Description -0.18.1 2002-01-23/PB: Move -\begin_inset Quotes sld -\end_inset - -the end -\begin_inset Quotes srd -\end_inset - - to the end, add USAGI to maillists -\end_layout - -\begin_layout Description -0.18 2002-01-22/PB: Fix bugs in explanation of multicast address types -\end_layout - -\begin_layout Description -0.17.2 2002-01-22/PB: Cosmetic fix double existing text in history (at 0.16), - move all credits to the end of the document -\end_layout - -\begin_layout Description -0.17.1 2002-01-20/PB: Add a reference, fix URL text in online-test-tools -\end_layout - -\begin_layout Description -0.17 2002-01-19/PB: Add some forgotten information and URLs about global - IPv6 addresses -\end_layout - -\begin_layout Description -0.16 2002-01-19/PB: Minor fixes, remove -\begin_inset Quotes sld -\end_inset - -bold -\begin_inset Quotes srd -\end_inset - - and -\begin_inset Quotes sld -\end_inset - -emphasize -\begin_inset Quotes srd -\end_inset - - formats on code lines, fix -\begin_inset Quotes sld -\end_inset - -too long unwrapped code lines -\begin_inset Quotes srd -\end_inset - - using selfmade utility, extend list of URLs. -\end_layout - -\begin_layout Description -0.15 2002-01-15/PB: Fix bug in addresstype/anycast, move content related - credits to end of document -\end_layout - -\begin_layout Description -0.14 2002-01-14/PB: Minor review at all, new chapter -\begin_inset Quotes sld -\end_inset - -debugging -\begin_inset Quotes srd -\end_inset - -, review -\begin_inset Quotes sld -\end_inset - -addresses -\begin_inset Quotes srd -\end_inset - -, spell checking, grammar checking (from beginning to 3.4.1) by Martin Krafft, - add tcpdump examples, copy firewalling/netfilter6 from IPv6+Linux-HowTo, - minor enhancements -\end_layout - -\begin_layout Description -0.13 2002-01-05/PB: Add example BIND9/host, move revision history to end - of document, minor extensions -\end_layout - -\begin_layout Description -0.12 2002-01-03/PB: Merge review of David Ranch -\end_layout - -\begin_layout Description -0.11 2002-01-02/PB: Spell checking and merge review of Pekka Savola -\end_layout - -\begin_layout Description -0.10 2002-01-02/PB: First public release of chapter 1 -\end_layout - -\begin_layout Section -\begin_inset CommandInset label -LatexCommand label -name "credits" - -\end_inset - -Credits -\end_layout - -\begin_layout Standard -The quickest way to be added to this nice list is to send bug fixes, corrections -, and/or updates to me ;-). -\end_layout - -\begin_layout Standard -If you want to do a major review, you can use the native LyX file (see -\begin_inset CommandInset ref -LatexCommand ref -name "original source" -reference "general-original-source" - -\end_inset - -) and send diffs against it, because diffs against SGML don't help too much. -\end_layout - -\begin_layout Subsection -\begin_inset CommandInset label -LatexCommand label -name "major-credits" - -\end_inset - -Major credits -\end_layout - -\begin_layout Itemize -David Ranch : For encouraging me to write this - HOWTO, his editorial comments on the first few revisions, and his contributions - to various IPv6 testing results on my IPv6 web site. - Also for his major reviews and suggestions. -\end_layout - -\begin_layout Itemize -Pekka Savola : For major reviews, input and suggestion -s. -\end_layout - -\begin_layout Itemize -Martin F. - Krafft : For grammar checks and general reviewing - of the document. -\end_layout - -\begin_layout Itemize -John Ronan : For grammar checks. -\end_layout - -\begin_layout Itemize -Georg Käfer : For detection of no proper PDF creation - (fixed now by LDP maintainer Greg Ferguson), input for German books, big - list of URLs, checking all URLs, many more suggestions, corrections and - contributions, and the German translation -\end_layout - -\begin_layout Itemize -Michel Boucey : Finding typos and some broken URLs, - contribute some suggestions and URLs, and the French translation -\end_layout - -\begin_layout Itemize -Michele Ferritto : Finding bugs and the - Italian translation -\end_layout - -\begin_layout Itemize -Daniel Roesen : For grammar checks -\end_layout - -\begin_layout Itemize -Benjamin Thery : For contribution of - updated mobility section -\end_layout - -\begin_layout Itemize -John Wenker : major contribution to Programming using - C-API -\end_layout - -\begin_layout Itemize -Srivats P. - : major contribution for 4in6 tunnels -\end_layout - -\begin_layout Subsection -Other credits -\end_layout - -\begin_layout Subsubsection -Document technique related -\end_layout - -\begin_layout Standard -Writing a LDP HOWTO as a newbie (in LyX and exporting this to DocBook to - conform to SGML) isn't as easy as some people say. - There are some strange pitfalls... - Nevertheless, thanks to: -\end_layout - -\begin_layout Itemize -Authors of the -\begin_inset CommandInset href -LatexCommand href -name "LDP Author Guide" -target "http://www.tldp.org/LDP/LDP-Author-Guide/" - -\end_inset - - -\end_layout - -\begin_layout Itemize -B. - Guillon: For his -\begin_inset CommandInset href -LatexCommand href -name "DocBook with LyX HOWTO" -target "http://perso.libertysurf.fr/bgu/doc/db4lyx/" - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -\begin_inset CommandInset label -LatexCommand label -name "content-related-credits" - -\end_inset - -Content related credits -\end_layout - -\begin_layout Standard -Credits for fixes and hints are listed here, will grow sure in the future -\end_layout - -\begin_layout Itemize -S .P. - Meenakshi : For a hint using a -\begin_inset Quotes sld -\end_inset - -send mail -\begin_inset Quotes srd -\end_inset - - shell program on tcp_wrapper/hosts.deny -\end_layout - -\begin_layout Itemize -Frank Dinies : For a bugfix on IPv6 address explanati -on -\end_layout - -\begin_layout Itemize -John Freed : For finding a bug in IPv6 multicast - address explanation -\end_layout - -\begin_layout Itemize -Craig Rodrigues : For suggestion about RHL IPv6 - setup -\end_layout - -\begin_layout Itemize -Fyodor : Note me about outdated nmap information -\end_layout - -\begin_layout Itemize -Mauro Tortonesi : For some suggestions -\end_layout - -\begin_layout Itemize -Tom Goodale : For some suggestions -\end_layout - -\begin_layout Itemize -Martin Luemkemann : For a - suggestion -\end_layout - -\begin_layout Itemize -Jean-Marc V. - Liotier : Finding a bug -\end_layout - -\begin_layout Itemize -Yaniv Kaul : Finding a bug -\end_layout - -\begin_layout Itemize -Arnout Engelen : For sending note about a draft - was adopted to RFC now -\end_layout - -\begin_layout Itemize -Stephane Bortzmeyer : Contributing persistent - configuration on Debian -\end_layout - -\begin_layout Itemize -lithis von saturnsys : Reporting a misaddressed - URL -\end_layout - -\begin_layout Itemize -Guy Hulbert : Send a note that RFC1924 is probably - an April fool's joke -\end_layout - -\begin_layout Itemize -Tero Pelander : Reporting a broken URL -\end_layout - -\begin_layout Itemize -Walter Jontofsohn : Hints for SuSE Linux 8.0/8.1 -\end_layout - -\begin_layout Itemize -Benjamin Hofstetter : Reporting - a mispointing URL -\end_layout - -\begin_layout Itemize -J.P. - Larocque : Reporting archive URL for maillist - users at ipv6 dot org -\end_layout - -\begin_layout Itemize -Jorrit Kronjee : Reporting broken URLs -\end_layout - -\begin_layout Itemize -Colm MacCarthaigh : Hint for sendfile - issue on Apache2 -\end_layout - -\begin_layout Itemize -Tiago Camilo : Contribute some URLs about Mobile IPv6 -\end_layout - -\begin_layout Itemize -Harald Geiger: Reporting a bug in how described the bit counting of the - universal/global bit -\end_layout - -\begin_layout Itemize -Bjoern Jacke : Triggered me to fix some outdated informati -on on xinetd -\end_layout - -\begin_layout Itemize -Christoph Egger : Sending note about -\begin_inset Quotes sld -\end_inset - -ip -\begin_inset Quotes srd -\end_inset - - has problems with IPv4-compatible addresses on SuSE Linux 9.0 and trigger - to add a hint on 6to4-radvd example -\end_layout - -\begin_layout Itemize -David Lee Haw Ling : Sending information - about a tunnel broker -\end_layout - -\begin_layout Itemize -Michael H. - Warfield : Sending note about suffix for 6to4 routers -\end_layout - -\begin_layout Itemize -Tomasz Mrugalski : Sending updates for DHCPv6 - section -\end_layout - -\begin_layout Itemize -Jan Minar : Reporting minor bugs -\end_layout - -\begin_layout Itemize -Kalin KOZHUHAROV : Fixing a not so well explanation -\end_layout - -\begin_layout Itemize -Roel van Dijk : Reporting broken URLs -\end_layout - -\begin_layout Itemize -Catalin Muresan : Reporting minor - bugs -\end_layout - -\begin_layout Itemize -Dennis van Dok : Reporting minor bugs -\end_layout - -\begin_layout Itemize -Necdet Yucel : Reporting broken URLs -\end_layout - -\begin_layout Itemize -Bryan Vukich: Reporting a broken URL -\end_layout - -\begin_layout Itemize -Daniele Masini: reporting a broken iptables example -\end_layout - -\begin_layout Itemize -Yao Zhao: reporting a bug in IPv6 route remove description -\end_layout - -\begin_layout Itemize -Aaron Kunde: reporting a broken URL and a content related bug -\end_layout - -\begin_layout Itemize -Larry W. - Burton: speling fixes -\end_layout - -\begin_layout Itemize -Justin Pryzby: reporting broken shortcut description of BIND -\end_layout - -\begin_layout Section -The End -\end_layout - -\begin_layout Standard -Thanks for reading. - Hope it helps! -\end_layout - -\begin_layout Standard -If you have any questions, subscribe to proper -\begin_inset CommandInset ref -LatexCommand ref -name "maillist" -reference "information-maillists" - -\end_inset - - and describe your problem providing as much as information as possible. -\end_layout - -\end_body -\end_document diff --git a/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.pt_BR.pdf b/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.pt_BR.pdf deleted file mode 100644 index c11bd8ff960300512683061e01048dc4fa2261a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 588712 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
    @3BS->pp)H4*NlhPLQsQ%AY#G#J}B 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

    7xr(*jYztt?d)f8NZcLiI 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

    *`+D~Fb%4@#Hd|57V6O%b|0(su;CE} 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

    (A;(=$D@~S%fzpo@e<=A$K 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 diff --git a/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.pt_BR.sgml b/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.pt_BR.sgml deleted file mode 100644 index 73591a48..00000000 --- a/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.pt_BR.sgml +++ /dev/null @@ -1,5007 +0,0 @@ - - - - - ]> - - - - -Linux IPv6 HOWTO (pt_BR) -PeterBieringer

    pb at bieringer dot de
    - - 0.66wip 2010-04-20 PB - 0.65 2009-12-13 PB - 0.64 2009-06-11 PB - 0.60 2007-05-31 PB - 0.51 2006-11-08 PB - -A meta deste HOWTO de IPv6 em Linux é responder as questões básicas e avançadas sobre a versão 6 do protocolo IP em um sistema com Linux. Este HOWTO dará ao leitor informação suficiente para instalar, configurar e usar aplicações IPv6 em máquinas com o Linux. Versões intermediárias deste HOWTO estão disponíveis nos endereços mirrors.bieringer.de ou mirrors.deepspace6.net. Veja também revision history para saber das mudanças. - -<!-- anchor id="chapter-general" -->Geral -As informações sobre as traduções disponíveis estão na seçãoTranslations. -<!-- anchor id="general-copright" -->Copyright, licença e outros - -Copyright -Escrito e com Copyright (C) 2001-2011 por Peter Bieringer -Licença -Este Linux IPv6 HOWTO está publicado sob a licença GNU GPL versão 2: - -Linux IPv6 HOWTO, um guia para configurar e usar o IPv6 em sistemas Linux. - -Copyright © 2001-2011 Peter Bieringer - -Este documento é um software livre; voce pode redistribui-lo e/ou modifica-lo sob os termos da licença GNU GPL, tal como está publicado pela Free Software Foundation; seja pela versão 2 da Licença, ou (em sua opinião) qualquer versão posterior. -Este programa é distribuído na esperança de que seja útil, mas SEM QUALQUER GARANTIA; nem mesmo qualquer garantia de COMERCIALIZAÇÃO ou ADEQUAÇÃO PARA UM PROPÓSITO PARTICULAR. Veja a GNU GPL para mais detalhes. -Se voce quiser uma cópia da licença GNU GPL, solicite através de carta para o endereço Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA. -Sobre o autor - -História do autor com a Internet e IPv6 - -1993: Eu entrei em contato com a internet utilizando um cliente de email e news baseado em console há bastante tempo (procure por "e91abier" no grupo groups.google.com, sou eu).1996: Foi solicitado que eu produzisse um curso de IPv6, incluindo um workshop com o Sistema Operacional Linux.1997: Comecei escrevendo um guia sobre como instalar, configurar e utilizar o IPv6 em Linux, chamadoIPv6 & Linux - HowTo (veja IPv6 & Linux - HowTo/History para mais informações).2001: Comecei a escrever este novo Linux IPv6 HOWTO. -Contato -O autor pode ser contactado através do endereço de email <pb at bieringer dot de> e também através de suahomepage. -Atualmente ele mora em Munique [parte nordeste de Schwabing] / Bavaria / Alemanha (sul) / Europa (centro) / Terra (superfície). -<!-- anchor id="general-category" -->Categoria -Este HOWTO deve ser listado na categoria "Networking/Protocols". -Versão, Histórico e To-Do - -Versão -A versão atual deste documento é mostrada no começo do documento. -Para outras versões ou traduções disponíveis, veja o sitehttp://www.bieringer.de/linux/IPv6/. -Histórico - -Relevantes -2001-11-30: Começo do estilo do novo HOWTO. -2002-01-02: Maioria do conteúdo feito, primeira publicação do capítulo 1(versão 0.10). -2002-01-14: Mais conteúdo, algumas revisões, e publicação do documento completo (version 0.14). -2002-08-16: Tradução para o Polones em progresso -2002-10-31: Tradução para o Chines disponível (veja Translations para mais informações) -2002-11-10: Tradução para o Alemão em progresso -2003-02-10: Tradução para o Alemão disponível -2003-04-09: Tradução para o Frances em progresso -2003-05-09: Tradução para o Frances disponível -2003-10-16: Tradução para o Italiano em progresso -2004-03-12: Tradução para o Italiano disponível -2004-06-18: Tradução para o Grego em progresso -2005-07-25: Tradução para o Turco disponível -2007-03-28: Tradução para o Portugues-Brazil em progresso -2008-07-30: Tradução para o Espanhol disponível (mas ainda em progresso) -História completa -Veja revision history no final deste documento -To-Do - -Completar conteúdo que ainda faltaFinalizar a checagem gramatical -<!-- anchor id="general-translations" -->Traduções -As traduções devem sempre conter a URL, número da versão c copyright do documento original (e o seu também). Por favor não traduza o changelog original, pois isto não terá muita importancia. Também não traduza a seção sobre traduções disponíveis, pois elas podem estar desatualizadas. Ao invés disso, adicione uma URL para a seção em Ingles deste HOWTO. -Aparentemente a frequencia de mudança deste documento ocorre menos de uma vez por mes. Desde a versão 0.2.7 parece que a maioria do conteúdo que eu fiz foi escrito. As traduções devem sempre ter a versão em ingles como original.. -Linguagens -Nota: uma olhada nesta URL pode ajudarhttp://www.bieringer.de/linux/IPv6/. -Chines -A tradução para o Chines, feito por Burma Chen <expns at yahoo dot com> (informada a mim em 2002-10-31) e pode ser encontrada no TLDP:http://www.ibiblio.org/pub/Linux/docs/HOWTO/translations/zh/Linux-IPv6-HOWTO.txt.gz (g'zipped txt). É uma foto da tradução, eu não sei se está atualizada. -Polones -Desde 2002-08-16 a tradução para o Polones foi iniciada e ainda está em progresso por Lukasz Jokiel <Lukasz dot Jokiel at klonex dot com dot pl>. Versão usada: CVS-version 1.29 do arquivo LyX, a qual foi a origem para a versão 0.2.7. O status é de ainda em progresso (2004-08-30). -German -Em 2002-11-10 a versão Alemã foi iniciada por Georg Käfer <gkaefer at gmx dot at> iniciou a tradução para o alemão, e a primeira publicação foi feita em 2003-02-10. Ela está originalmenmte disponível na Deep Space 6http://mirrors.deepspace6.net/Linux+IPv6-HOWTO-de/ (e também em http://mirrors.bieringer.de/Linux+IPv6-HOWTO-de/). Esta versão se manterá atualizada tanto quanto for possível. -Frances -Em 2003-04-09 foi iniciada a tradução da versão em Frances, por Michel Boucey <mboucey at free dot fr> e a primeira publicação foi em 2003-05-09. Ela está originalmente disponível na Deep Space 6http://mirrors.deepspace6.net/Linux+IPv6-HOWTO-fr/ (e também em http://mirrors.bieringer.de/Linux+IPv6-HOWTO-fr/). -Espanhol -Um membro do projeto MontevideoLibre, localizado no Uruguai (América do Sul) iniciou a tradução para espanhol no formato wiki:http://www.montevideolibre.org./manuales:libros:ipv6 -Italiano -Em 2003-10-16 a tradução para uma versão em Italiano foi iniciada Michele Ferritto <m dot ferritto at virgilio dot it> para oILDP (Italian Linux Documentation Project) e a sua primeira publicação foi em 2004-03-12. Ela está originalmente disponível no ILDP em http://it.tldp.org/HOWTO/Linux+IPv6-HOWTO/. -Japones -Em 2003-05-14 Shino Taketani <shino_1305 at hotmail dot com> me enviou uma nota dizendo que planejava traduzir o HOWTO para o japones. -Grego -Em 2004-06-18 Nikolaos Tsarmpopoulos <ntsarb at uth dot gr> me enviou uma nota dizendo que planejava traduzir o HOWTO para o Grego. -Turco -Em 2005-07-18 Necdet Yucel <nyucel at comu dot edu dot tr> me enviou uma nota dizendo que a tradução em Turco estava disponível. E uma fotografia da tradução (versão 0.61) pode ser encontrada na URLhttp://docs.comu.edu.tr/howto/ipv6-howto.html. -Portuguese-Brazil -Em 2011-05-06 Gustavo Mendes de Carvalho <gmcarvalho at gmail dot com> iniciou a tradução deste HowTo para Portugues-Brazil. A primeira tentativa realizada em 2007 por Claudemir da Luz <claudemir dot daluz at virtuallink dot com dot br> nunca foi finalizada. -Técnico - -<!-- anchor id="general-original-source" -->Fonte original deste HOWTO -Este HOWTO foi escrito usando LyX versão 1.6.1 em um sistema Linux Fedora 10 com o template SGML/XML (DocBook). Ele está disponível em github / tLDP / LDP / users / Peter-Bieringer para contribuições. -Divisor de linha de código -Eu utilizei um utilitário divisor de linha de código (Code line wrapping - "lyxcodelinewrapper.pl") feito por mim mesmo, e ele está disponível para seu próprio uso emTLDP-CVS / users / Peter-Bieringer -Geração de SGML -O SGML/XML é gerado usando a função de exportar do LyX -Referencias On-line para a versão em HTML deste HOWTO - -Página principal -Como boa prática, uma referencia à página principal deste HOWTO é recomendada. -Páginas dedicadas -Como as páginas em HTML são geradas a partir dos arquivos SGML, os nomes dos arquivos em HTML podem ser bastante diferentes (randomicos). Entretanto, algumas páginas são etiquetadas em LyX, resultando em nomes estáticos. Estas etiquetas são úteis para referencias e não deveriam ser alteradas no futuro. Se voce acredita que eu esqueci qualquer etiqueta, por favor me avise, e eu colocarei. -Prefácio -Algumas coisas antes: -Quantas versões deste HOWTO existem por aí ? -Incluindo esta, existem 3 (tres) documentos HOWTO disponíveis. Minhas desculpas se forem demais ;-) -Linux IPv6 FAQ/HOWTO (desatualizada) -O primeiro documento HOWTO relacionado a IPv6 foi escrito pelo Eric Osborne e era chamadoLinux IPv6 FAQ/HOWTO (por favor use-o somente para fins históricos). Sua última versão foi a 3.2.1, lançada em 14 de Julho de 1997. -Por favor ajude: Se alguém souber a data de nascimento deste HOWTO, por favor me envie um e-mail (estas informações são necessárias para o "histórico"). -IPv6 & Linux - HowTo (mantida) -Esta segunda versão existe e se chamaIPv6 & Linux - HowTo escrita por mim (Peter Bieringer) em HTML puro. Ele nasceu em Abril de 1997 e sua primeira versão em ingles foi publicada em Junho de 1997. Eu vou continuar a manter esta versão, mas isto deve acontecer devagar e não será por completo, em favor da atualização da versão do Linux IPv6 HOWTO que voce está lendo agora. -Linux IPv6 HOWTO (este documento) -Já que esteIPv6 & Linux - HowTo foi escrito em HTML puro, ele não é compatível com o The Linux Documentation Project (TLDP). Eu recebi então um pedido no final de Novembro de 2001 para reescrever este HowTo IPv6 & Linux - HowTo em SGML. Entretanto, por causa da descontinuidade do HOWTO (Future of IPv6 & Linux - HowTo), e como o IPv6 estava ficando mais e mais padronizado, eu decidi escrever um novo documento cobrindo os pontos básicos e um pouco avançados que permaneceram importantes ao longo destes anos. Algum conteúdo mais dinamico e avançado ainda pode ser encontrado neste segundo HOWTO (IPv6 & Linux - HowTo). -Termos usados, glossário e atalhos - -Rede - -Base 10Sistema numérico muito bem conhecido e representa qualquer valor com os dígitos 0 a 9.Base 16Geralmente usado em linguagens de programação, também conhecido como sistema numérico hexadecimal, representa qualquer valor com os dígitos 0 a 9 e caracteres A a F (case insensitive).Base 85Representação de um valor com 85 dígitos/caracteres diferentes, ele pode levar a strings menores, mas nunca vi ser usado em campo.BitA menor unidade de armazenamento, representa on/verdade/1 e off/falso/0.ByteGeralmente uma coleção de 8 bits (mas não é necessariamente uma verdade - veja outros sistemas computacionais)DeviceAqui, o hardware para a conexão de rede, veja também NICDual homed hostUm sistema dual homed é um nó com duas redes (física ou virtual) com interfaces em dois links diferentes, mas sem encaminhar qualquer pacote entre eles (não é um router).HostGeralmente um sistema single homed com somente uma interface de rede ativa, exemplo Ethernet ou (não e) PPP.InterfaceQuase sempre o mesmo que "device", veja também NICIP HeaderCabeçalho de um pacote IP (cada pacote de rede tem um cabeçalho e seu tipo depende do nível de rede)LinkUm link é o nível 2 de rede, ou meio de transporte de pacotes. exemplos são Ethernet, Token Ring, PPP, SLIP, ATM, ISDN, Frame Relay,...NodeUm nó é um host ou um router.OctetÉ uma coleção de 8 bits, hoje bem similar a "byte".PortInformação utilizada pelo TCP/UDP dispatcher (camada 4) para transportar informações para as camadas superioresProtocoloCada camada de rede que contém a maioria dos campos e informações para tornar a vida mais fácil ao enviar a informação transportada para as camadas superiores, veja camada 2 (MAC) e 3 (IP)RouterUm router é um nó com 2 ou mais redes interfaces de rede (física ou virtual), capaz de encaminhar os pacotes entre as suas interfaces.SocketUm socket IP é definido pelo endereço de origem e destino, e suas portasStackRelacionado às várias camadas de redeSubnetmaskRedes IP usam bits de máscara para separar redes locais de redes remotasTunnelUm túnel é tipicamente uma conexão ponto-a-ponto sobre a qual pacotes são trocados, e que carregam dados de outro protocolo. Exemplo túnel IPv6-in-IPv4. -<!-- anchor id="Glossar" -->Atalhos - -ACLAccess Control List - Lista de controle de acessoAPIApplication Programming Interface - Interface de programação de aplicaçãoASICApplication Specified Integrated CircuitBSDBerkeley Software DistributionCAN-BusController Area Network Bus (physical bus system)ISPInternet Service Provider - Provedor de serviços InternetKAMEProjeto - um esforço conjunto de seis companhias no Japão para fornecer grátis uma pilha IPv6 e IPsec (para ambos IPv4 e IPv6) para as variantes BSD existentes no mundo www.kame.netLIRLocal Internet Registry - No Brasil, o registro.brNICNetwork Interface CardRFCRequest For Comments - conjunto de notas técnicas organizacionais sobre a InternetUSAGIUniverSAl playGround for Ipv6 Project - trabalho para entregar uma pilha IPv6 de qualidade para os sistemas Linux. -Informações úteis - -Sinal de divisão de linha longa de código -O caractere especial "¬" é usado para sinalizar que esta linha de código foi dividida para se obter uma melhor visualização em arquivos PFG e PS. -Marcadores -Nos exemplos genéricos voce encontrará as seguintes marcações: - -]]>Para o uso real em seu sistema de linha de comando ou em scripts, isto deve ser substituído pelo conteúdo correto (removendo os sinais < e >). Desta forma o resultado seria - -Comandos no shell -Comandos executados no shell por usuários normais (não root) começam com $ -Comandos executados pelo usuário root começam com # - -Necessidades para usar este HOWTO - -Prerequisitos pessoais - -Experiencia com ferramentas Unix -Voce deve estar familiarizado com a maioria das ferramentas Unix, como grep, awk, find, etc. , e saber sobre a maioria das opções mais usadas de cada um deles. -Experiencia com teoria de rede -Voce deve estar famliarizado com camadas, protocolos, endereços, cabos, conectores, etc. Se voce é novo nesta área, este é um bom local para voce iniciar seus estudoshttp://www.rigacci.org/docs/biblio/online/intro_to_networking/book1.htm -Experiencia com configuração IPv4 -Voce deve definitivamente ter alguma experiencia em configuração de redes IPv4, caso contrário será difícil para voce entender o que realmente está acontecendo. -Experiencia com Domain Name System (DNS) -Permitirá a voce entender o que é um Domain Name System (DNS), que serviço ele fornece e como usa-lo. -Experiencia com estratégias de debug de rede -Voce deve pelo menos entender como usar o tcpdump e o que ele pode te mostrar. Caso contrário a depuração de problemas de rede será muito difícil para voce. -Hardware compatível com o sistema Linux -É claro que voce vai precisar usar algum hardware (pode ser uma maquina virtual), e não somente ler este HOWTO para dormir. ;-7) -<!-- anchor id="chapter-basics" -->Básico - -O que é IPv6? -O IPv6 é um novo protocolo de camada 3 que tem a função de substituir o IPv4 (também conhecido apenas por IP). O IPv4 foi projetado a muito tempo atrás(RFC 760 / Internet Protocol de Janeiro de 1980) e desde o começo tem havido muitos pedidos de atender mais capacidades e funcionalidades. A última RFC é RFC 2460 / Internet Protocol Version 6 Specification.As grandes mudanças no IPv6 foram o novo formato do cabeçalho, incluindo o tamanho da capacidade de endereços, de 32 para 128 bits. Já que a camada 3 é a responsável por transporte de pacotes fim a fim usando o roteamento baseado em endereços, ele deveria incluir os endereços IPv6 de origem e destino tal como o IPv4. -Para mais informações sobre a história do IPv6, de uma olhada nas RFC's mais antigas do IPv6 listadas aquiSWITCH IPv6 Pilot / References. -<!-- anchor id="basic-history-IPv6-Linux" -->História do IPv6 no Linux -Os anos de 1992, 1993 e 1994 do IPv6 no Linux (linhas gerais) são cobertos pelo seguinte documento:IPv6 or IPng (IP next generation). -To-do: melhorar a linha do tempo, adicionar conteúdo... -O começo -O primeiro trecho de código de rede relacionado com o IPv6 foi adicionado ao kernel 2.1.8 do Linux em novembro de 1996 por Pedro Roque. Ele foi baseado na API do BSD: - -+ * -+ * Source: -+ * IPv6 Program Interfaces for BSD Systems -+ * -]]>As linhas mostradas foram copiadas do patch-2.1.8 (o email foi limpo para evitar spam). -Enquanto isso -Por conta do buraco da manpower, a implementação do IPv6 no kernel foi incapaz de seguir os rascunhos propostos pelos novos RFC's publicados. Em outubro de 2000, um projeto foi iniciado no Japão, chamadoUSAGI, cujo objetivo foi implantar todo o restante, ou desatualizado, suporte ao IPv6 para o Linux. Ele utiliza a implementação IPv6 atual para o FreeBSD feita pelo KAME project. De tempos em tempos, eles criavam fotos da versão vanilla do código do kernel do Linux. -Até a implementação do desenvolvimento na série 2.5 do kernel ter sido iniciado, os patches doUSAGI eram tão grandes, que os mantenedores de rede do Linux eram incapazes de inclui-lo completamente no código final do kernel do Linux série 2.4.x. -Durante o desenvolvimento da serie 2.5, o tentou inserir todas as suas extensões usadas nesta série. -Atualmente -Muito do desenvolvimento feito para o IPv6 e patches doUSAGI e outros estão integrados na série vanilla do kernel 2.6.x. -O futuro -O USAGI e outros ainda mantém o trabalho na implementação de novas características e funcionalidades, como a mobilidade e outros. De tempos em tempos, novos patches com extensões são lançados e também integrados à série vanilla do kernel. -Como o endereço IPv6 se parece? -Como já mencionado antes, os endereços IPv6 possuem 128 bits de tamanho. Este número de bits gera um número decimal extremamente grande, com 39 dígitos de tamanho: -Tais números não são endereços fáceis de serem memorizados. Os endereços IPv6 também tem um esquema orientado a bits (assim como o IPv4, mas não tão facilmente reconhecido). Assim a melhor notação de números tão grandes é em formato hexadecimal. Em hexadecimal, 4 bits (também conhecidos como "nibble") são representados por um dígito ou caractere, de 0-9 e A-F. Desta forma, o tamanho do endereço é reduzido para 32 caracteres. -Esta representação ainda não é muito conveniente (com a possível mistura ou perda de um único dígito hexadecimal), então os desenvolvedores do IPv6 escolheram um formato hexadecimal com um ":" separando cada bloco de 16 bits. Com isso, o sinal inicial 0x (um prefixo para valores hexadecimais em linguagens de programação) foi removido: -Um endereço utilizável seria: -Para simplificar, os zeros iniciais de cada bloco de 16 bits pode ser omitido: - -¬ 2001:db8:100:f101:210:a4ff:fee3:9566 -]]>Um bloco de 16 bits contendo somente zeros também pode ser omitida, sendo representada por "::", mas não mais de uma única vez no endereço. Caso contrário poderia haver duplicação de endereços. - 2001:db8:100:f101::1 -]]>A maior redução possível é vista do endereço IPv6 de localhost: - ::1 -]]>Há também um outro representação em modo compacto (Código base 85) baseado naRFC 1924 / A Compact Representation of IPv6 Addresses(publicada em 1º Abril 1996), nunca vista em campo. Provavelmente é uma pegadinha ou mentirinha da data. Mas aqui está um exemplo: -
    -Info: ipv6calc é uma calculadora de formato de endereços IPv6 que também faz conversões, e pode ser encontrada aqui: ipv6calc homepage (Mirror) -
    -FAQ (Básico) - -Porque o nome do sucessor do IPv4 é IPv6 e não IPv5 ? -No cabeçalho IP, os primeiros 4 bits são reservados para a versão do protocolo. Então em teoria qualquer número entre 0 e 15 seria possível. -4: já em uso pelo IPv45: está reservado para o Stream Protocol (STP,RFC 1819 / Internet Stream Protocol Version 2) (o qual nunca foi realmente feito para o público)O próximo número disponível era 6. Portando, assim nasceu o IPv6! -Endereços IPv6: porque um número tão grande de bits ? -Durante o desenvolvimento do IPv4, as pessoas pensaram que 32 bits seriam suficientes para o mundo. Olhando de volta, realmente 32 bits foram suficientes por bastante tempo. entretanto 32 bits não foram suficientes para prover endereços globais para todos os dispositivos de rede no futuro (ou será já no presente ?). Pense em telefones celulares, tablets, computadores virtuais, carros, GPS's, geladeiras, TV's, etc. -Assim, os desenvolvedores escolheram 128 bits, 4 vezes maior (no campo do tamanho do endereço) do que o IPv4. -Mas o tamanho utilizável é menor do que parece. Isto se deve por causa do esquema utilizado na definição do endereçamento: 64 bits são usados para identificar a interface. Os outros 64 bits são usados para o roteamento. Assumindo os níveis de agregação (/48, /32, ...), é possível que os endereços também se esgotem, mas esperamos que não em futuro próximo. -Para mais informações veja tambémRFC 1715 / The H Ratio for Address Assignment Efficiency e RFC 3194 / The Host-Density Ratio for Address Assignment Efficiency. -Endereços IPv6: porque um número tão pequeno de bits em um nova versão ? -Enquanto existam (possivelmente) algumas pessoas (só sei do Jim Fleming...) na internet que estejam pensando sobre o IPv8 ou IPv16, estes projetos estão muito longe de serem aceitos e implementados. Enquanto isso, 128 bits foi a melhor escolha levando em consideração o overhead do cabeçalho e o transporte de dados. Considere o MTU mínimo no IPv4 (576 octetos) e no IPv6 (1280 octetos), o tamanho do cabeçalho em iIPv4 é de 20 octetos (mínimo, e pode aumentar até 60 octetos com outras opções usadas) e no IPv6 é de 40 octetos (fixo). Isto representa 3,4% de overhead no IPv4 (com o tamanho mínimo) e 3,1 % do menor MTU em IPv6. O overhead é praticamente igual. Mais bits para endereço necessitariam cabeçalhos maiores e consequentemente mais overhead. Além disso, considere o tamanho máximo de uma MTU em links normais (como em Ethernet hoje): são 1500 octetos (em alguns casos especiais 9.000 octetos usando jumbo frames). Assim, não seria um projeto apropriado se 10% a 20% dos dados transportados para a camada 3 fosse usado para endereçamento e não para dados propriamente ditos.
    -<!-- anchor id="chapter-addresstypes" -->Tipos de endereço -Como no IPv4, os endereços em IPv6 também podem ser divididos em duas partes - host e rede - com a utilização de máscaras de rede. -O IPv4 tem mostrado que algumas vezes é bom, se mais de um endereço IP puder ser configurado em uma interface, cada um deles com um propósito bem diferente (aliases, multicast). Então para continuar extensível, o IPv6 também suporta esta característica e permite que mais de 1 endereço seja configurado na mesma interface. Atualmente não existe qualquer limitação definida pela RFC, a não ser na implementação da pilha IPv6 (para evitar ataques DoS). -Ao usar este grande número de bits para endereço, o IPv6 define tipos de endereços baseado nos bits iniciais, os quais são, espera-se, não sejam quebrados no futuro, como acontece hoje com o IPv4 e as suas classes A, B e C. -Estes números de bits são separados para endereçar redes (os primeiros 64 bits) e para endereços de host (os últimos 64 bits), para facilitar a auto-configuração. -Endereços sem um prefixo especial - -Endereço localhost -Este é um endereço especial para a interface de loopback, similar ao 127.0.0.1 no IPv4. Em IPv6, este endereço de localhost é: -ou em sua forma comprimida: -Os pacotes com este endereço como origem ou destino nunca devem sair ou entrar em um host. -Endereços não especificados -Este é um endereço especial, como "any" ou "0.0.0.0". Em IPv6 é representado assim: -ou: -Este endereço é geralmente usado para especificação de portas (qualquer IPv6) ou tabelas de roteamento. -Nota: este endereço nunca pode ser usado como um endereço de destino. -Endereços IPv6 vinculados a endereços IPv4 -Existem dois endereços que contém endereços IPv4. -IPv4-mapeado para IPv6 -Um endereço IPv4-único para compatibilidade IPv6 é às vezes usado ou mostrado para sockets criados por um daemon IPv6, mas que só recebe conexões de endereços IPv4. -Estes endereços são definidos dentro de um prefixo especial, com o tamanho /96 (a.b.c.d é o endereço IPv4): -ou em seu formato comprimido -por exemplo, o endereço IP 1.2.3.4 seria assim: - -por exemplo, o endereço IP 1.2.3.4 seria assim: -Usado para tunelamento automático(RFC 2893 / Transition Mechanisms for IPv6 Hosts and Routers), o qual é substituído pelo 6to4 tunneling. -ou em seu formato comprimido - -Parte da rede, também conhecido como prefixo -Os designers definiram alguns tipos de endereços e deixaram muito disto para futuras definições quando novas necessidades surgirem. A RFC 4291 / IP Version 6 Addressing Architecture define o esquema utilizado no endereçamento atual. -Vamos agora dar uma olhada nos diferentes tipos de prefixos (e também em tipos de endereços): -Endereço tipo "link local" -Estes são endereços epeciais que são válidos somente no link de uma interface. Usando este endereço como destino, os pacotes nunca serão encaminhados a um router. Isto é usado para links de comunicação, tais como: -Há alguém está aqui neste link ?Há alguém aqui com endereços especiais (ex. procurando por um router) ?Eles começam com (onde "x" é qualquer caractere hexadecimal, normalmente "0") -Um endereço com este prefixo é encontrado em cada interface com IPv6 habilitado após a auto-configuração stateless (a qual é normalmente sempre o caso). -Endereço tipo "site local" -Estes endereços são similares aos daRFC 1918 / Address Allocation for Private Internets em uso atualmente em IPv4, com a vantagem adicional de que qualquer pessoa que usar este tipo de endereço tem a capacidade de usar até 16 bits para a definição máxima de 65535 subredes. Comparável com o 10.0.0.0/8 do IPv4. -Outra vantagem: como é possível colocar mais de 1 endereço em uma interface com IPv6, voce pode configurar um endereço de "site local" junto com um endereço global. -Ele começa com: -(onde o "x" é qualquer caractere hexadecimal, geralmente um "0") -Este tipo de endereço não deveria mais ser usado, RFC 3879 / Deprecating Site Local Addresses, mas para um teste em laboratório, estes endereços ainda continuam sendo uma boa escolha (IMHO - em minha humilde opinião). -Endereços locais Unicast IPv6 -Por causa da definição original de endereços de site local não serem únicos, pode haver algum problema se duas redes já configuradas forem se conectar em um futuro próximo (overlap de subredes). Este e outros problemas foram os motivos para um novo tipo de endereço definido naRFC 4193 / Unique Local IPv6 Unicast Addresses. - -Ele começa com: -Uma parte do prefixo (40 bits) é gerada usando um algoritmo pseudo-randomico e é improvável que dois resultados gerados por este algoritmo sejam iguais. -Exemplo de um prefixo gerado por este algoritmo (veja em: Goebel Consult / createLULA): - -Endereço tipo Global "(Aggregatable) global unicast" -Atualmente, existe um tipo de endereço definido globalmente (o primeiro design, chamado "provider based") que foi jogado fora a alguns anos atrásRFC 1884 / IP Version 6 Addressing Architecture [obsolete], e voce consegue encontrar em algumas versões do kernel do Linux. -Ele começa com (os caracteres "x" são hexadecimais) -Nota: o prefixo "aggregatable" foi descartado nos atuais drafts. Há ainda alguns outros subtipos definidos. Veja abaixo: -Endereço de teste 6bone -Estes foram os primeiros endereços globais que foram definidos e usados. Eles começam com -Exemplo: -Um endereço de teste especial para o 6bone que nunca seria globalmente único começa com -e a maioria deles é mostrado em exemplos antigos. A razão para isso é, se endereços reais são mostrados, seria possível alguém copiar e colar estes endereços de arquivos de configuração antigos, o que inadvertidamente causaria um erro de duplicação de endereço de um endereço global único. Isto poderia causar sérios problemas para o host original (como nunca receber as respostas de requisições feitas). -Como o IPv6 agora já está em produção, este prefixo não é mais delegado e ele foi removido do processo de roteamento (vejaRFC 3701 / 6bone Phaseout para mais detalhes). -Endereços 6to4 -Estes endereços, feitos para um mecanismo de túnel especial [RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds e RFC 2893 / Transition Mechanisms for IPv6 Hosts and Routers],utilizam um endereço IPv4 já fornecido e a sua possível subnet, e começam com -Por exemplo, este endereço 192.168.1.1/5 ficaria: -Um pequeno comando em shell poderia ajudar voce a gerar este endereço, baseado em um endereço IPv4 fornecido: -Veja também tunneling using 6to4 e information about 6to4 relay routers. -Designado pelo provedor para roteamento hierárquico -Este endereço é delegado pelo ISP e começa com -Prefixos de ISP's maiores (ou AS's) são delegados pelos local registries e tem atualmente um tamanho de prefixo /32. -Qualquer outro ISP/empresa pode solicitar um prefixo de tamanho /48, mas isto depende da política de distribuição de endereços dos registros locais de cada país ou região. -Endereços reservados para exemplos e documentação -Atualmente, dois blocos de endereço estão reservados para exemplos e documentação. Veja aRFC 3849 / IPv6 Address Prefix Reserved for Documentation: -Estes endereços devem ser filtrados baseados no endereço de origem e NÃO devem ser roteados em roteadores de borda em direção à internet, se possível. -Endereços Multicast -Endereços Multicast são usados por serviços específicos. -Eles sempre começam com (xx é o valor de escopo) -Existem divisões entre escopo e tipo: -Escopo Multicast -O escopo Multicast é um parametro usado para especificar a distancia máxima que um pacote multicast pode "viajar" a partir de sua origem. -Atualmente, os seguintes escopos (ou regiões) estão definidos: -ffx1: nó local, os pacotes nunca deixam o nó.ffx2: link-local, os pacotes nunca são encaminhados pelos routers, assim eles nunca deixam o link especificado.ffx5: site-local, os pacotes nunca deixam o site.ffx8: organization-local, os pacotes nunca deixam a organização (não é tão fácil de implementar, mas deve ser coberto pelo protocolo de roteamento).ffxe: escopo global.outros são reservados -Tipos Multicast -Já existem muitos tipos definidos/reservados (vejaRFC 4291 / IP Version 6 Addressing Architecture para mais detalhes). Alguns exemplos são: -Endereço All Nodes: ID = 1h, endereça todos os host no nó local (ff01:0:0:0:0:0:0:1) ou no link conectado (ff02:0:0:0:0:0:0:1).Endereço All Routers: ID = 2h, endereça tosos os routers no nó local (ff01:0:0:0:0:0:0:2), no link conectado (ff02:0:0:0:0:0:0:2), ou no site local (ff05:0:0:0:0:0:0:2) -Endereço multicast solicitado nó link-local -Um endereço de multicast especial que é usado como endereço de destino para a descoberta da vizinhança , uma vez que no IPv6 não há ARP, como existe no IPv4. -Um exemplo deste endereço se parece com -Os prefixos usados mostram que este é um endereço multicast link-local. O sufixo é gerado a partir do endereço de destino. Neste exemplo, um pacote deveria ser enviado ao endereço "fe80::1234", mas a parte de rede não conhece o MAC atual deste destino. Ele então substitui os 104 bits mais altos com "ff02:0:0:0:0:1:ff00::/104" e deixa os menores 24 bits intocados. Este endereço então é agora usado no link para achar o nó correspondente que tem que enviar uma resposta contendo o endereço MAC usado na camada 2. -Endereços Anycast -Endereços Anycast são endereços especiais e eles são usados para muitas coisas, como o servidor DNS ou DHCP mais próximo, e outras coisas. Estes endereços são obtidos do espaço de endereçamento Unicast (aggregatable global ou site-local). O mecanismo anycast (do ponto de vista do cliente) será tratado pelos protocolos de roteamento dinamico. -Nota: Endereços anycast não podem ser usados como endereços de origem, pois eles se aplicam somente a endereços de destino. -Endereços Anycast Subnet-router -Um exemplo simples para um endereço unicast é o anycast subnet-router. Assumindo que um nó tem os seguintes endereços globais IPv6 configurados: -O endereço unicast subnet-router será criado removendo o sufixo (os 64 bits menos significantes) completamente: - -Tipos de endereço (parte de host) -Para a auto-configuração e questões de mobilidade, foi decidido usar os 64 bits de menor significado como a parte de host do endereço na maioria dos tipos de endereços atuais. Desta forma, cada subnet pode suportar uma grande quantidade de endereços. -A parte de host pode ser verificada de maneira distinta: -Computado automaticamente (também conhecido como stateless) -Com a auto-configuração, a parte host do endereço é feita através da conversão do endereço MAC da interface (se disponível), através do método EUI-64, para um único endereço IPv6. Se nenhum MAC estiver disponível para este dispositivo (isto acontece bastante em dispositivos virtuais), outra coisa (como o endereço IPv4 ou o MAC da interface física) é usada no lugar. -Exemplo: uma placa de rede tem o seguinte endereço MAC (48 bit): -Isto poderia ser expandido de acordo com o tutorial do IEEE -IEEE-Tutorial EUI-64 resultando no endereço abaixo: -Com um prefixo já fornecido, o resultado é o endereço IPv6 mostrado abaixo: - -Problema de privacidade com os endereços automaticamente computados e uma solução -Por causa da parte host do endereço "automaticamente computado" ser único, (exceto quando um fabricante de placas de rede usa o mesmo MAC em mais de um NIC), o rastreamento de um cliente é possível quando não há um proxy de qualquer tipo. -Este é um problema já conhecido, e a sua solução foi definida através da extensão de privacidade, definida naRFC 3041 / Privacy Extensions for Stateless Address Autoconfiguration in IPv6 (já existe também um novo draft disponível: draft-ietf-ipv6-privacy-addrs-v2-*). Usando um valor estático e um valor randomico, um novo sufixo é gerado de tempos em tempos. -Nota: isto é somente interessante em conexões finais de clientes, e não é realmente útil para servidores já conhecidos. -Definido manualmente -Para servidores, provavelmente é mais fácil se lembrar de endereços mais simples, mas isto também pode ser resolvido. Em IPv6, é possível configurar um endereço adicional para uma interface. Veja o exemplo: -Para sufixos manuais como o ::1 mostrado acima, é necessário que o sétimo bit mais significativo seja definido como 0 (o bit universal/local do identificador gerado automaticamente). Existe também uma outra combinação de bits (não utilizada) que é reservada para endereços unicast. -Tamanho de prefixos para roteamento -Na fase inicial de projeto e design do IPv6, foi planejada a utilização hierárquica de roteamento para reduzir o tamanho das tabelas de roteamento ao menor valor possível. As razões por trás desta abordagem foram o grande número de rotas nos grandes roteadores de borda (cerca de 300.000 em janeiro de 2011), reduzindo a necessidade de memória nos routers e a capacidade de se utilizar chips ASIC (Application Specified Integrated Circuit) para manipular esta tabela, aumentando a velocidade (uma tabela menor aumenta a velocidade). - -A visão de hoje é que o roteamento será mais hierárquico para redes com somente 1 ISP. Em redes com mais de 1 conexão, isto não é possível, e está sujeita a sistemas multi-homed (informações de multi-homing:drafts-ietf-multi6-*,IPv6 Multihoming Solutions). -Tamanho de prefixo (também conhecido como "netmasks") -Semelhante ao IPv4, a rede roteável entra em cena. Por causa da notação do padrão de máscara de rede (128 bits) não parecer bom, os designers utilizaram o mesmo método utilizado no IPv4, chamado Classless Inter Domain Routing (CIDR,RFC 1519 / Classless Inter-Domain Routing)o qual especifica o número de bits do endereço IP que será usado para o roteamento. E ele também é chamado notação "slash". -Exemplo: -Esta notação pode ser expandida: -Rede: - -Máscara de rede: - -Encontrando uma rota -Em circunstancias normais, (sem QoS), a procura em uma tabela de roteamento resulta na rota mais adequada com o número mais significante de bits do endereço. Em outras palavras, a rota com o maior prefixo tem a preferencia. -Por exemplo, se uma tabela de rotas mostra as seguintes entradas (a lista é parcial): -Os endereços de destino mostrados dos pacotes IPv6 serão roteados através das interfaces mostradas - routed through device sit1 -2001:0db8:200:1:2:3:4:5/48 -> routed through device tun6to4 -]]> -<!-- anchor id="chapter-systemcheck" -->Verificação do sistema para IPv6 -Antes de voce começar a utilizar o IPv6 em uma máquina com Linux, é necessário testar para saber se seu sistema tem o suporte ao protocolo. Talvez voce tenha que fazer algum ajuste para prepara-lo antes de começar a usar. -<!-- anchor id="systemcheck-kernel" -->Kernel com IPv6 -As distribuições mais novas de Linux já tem o kernel com suporte ao IPv6, e este suporte geralmente acontece com a compilação em módulos, mas é possível que estes módulos sejam carregados no momento do boot. -Nota: voce não deve usar o kernel da série 2.2, porque ele já não é mais atualizado. A série 2.4 também já não tem todas as atualizações de acordo com as últimas RFC's, então recomendamos utilizar um kernel da série 2.6. -Verificação do suporte a IPv6 no kernel utilizado -Para verificar se o seu kernel já está com o suporte a IPv6 habilitado, de uma olhada nos arquivos do diretório /proc. A seguinte entrada deve existir: -Para quem gosta de scripts, é possível usar estes comandos: -Se este teste falhar, provavelmente seu sistema não está com os módulos de IPv6 carregados. -Tentando carregar os módulos para o IPv6 -Voce pode tentar carregar os módulos do IPv6 com o comando -Se a carga ocorreu sem problemas, verifique o status com estes comandos: -Depois disso, rode os comandos novamente do item 4.1.1 para ter certeza de que está tudo certo. -Note: a remoção do módulo (rmmod) não é suportada, e recomendo não utilizar, pois pode haver alguma instabilidade no sistema. -Carga automática do módulo -É possível automatizar a carga do módulo IPv6 conforme seja necessário. Para isto, basta adicionar a seguinte entrada no arquivo de configuração (/etc/modules.conf ou /etc/conf.modules): -Também é possível desabilitar a carga do módulo automaticamente usando a seguinte entrada: -Nota: no kernel da série 2.6, o mecanismo carregador de módulos mudou, e o novo arquivo de configuração é o /etc/modprobe.conf. -Compilando o kernel 2.6 para suportar o IPv6 -Se os dois resultados acima foram negativos, e o seu kernel não tem suporte para o IPv6, então voce tem algumas coisas a fazer: -Atualizar a sua distribuição para uma que suporte o IPv6 (recomendado para os novatos)Compilar um novo kernel (fácil, se voce souber quais opções são necessárias)Recompilar os fontes do kernel dado pela sua distribuição (nem sempre tão fácil)Compilar um kernel com as extensões USAGISe voce decidir compilar um kernel, voce precisa ter alguma experiencia nisso e também ler oLinux Kernel HOWTO. -Uma comparação entre o kernel vanilla e as extensões USAGI está disponível aquiIPv6+Linux-Status-Kernel. -Compilando um kernel vanilla -Mais detalhes e dicas sobre a compilação de um kernel com suporte a IPv6 pode ser encontrado emIPv6-HOWTO-2#kernel. -Nota: voce deve usar, sempre que possível, um kernel da séria 2.6, uma vez que o suporte ao IPv6 na série 2.4 já não teve as últimas atualizações definidas nas RFC's, e a série 2.2 não tem mais o suporte atualizado ou mesmo mantido por alguém. -Compilando um kernel com as extensões USAGI -Para a família vanilla de kernel, recomendado somente para usuários avançados, os quais já estão familiarizados com o IPv6 e com compilação de kernel. Veja tambémUSAGI project / FAQ e Obtaining the best IPv6 support with Linux (Article) (Mirror). -Dispositivos de rede com suporte a IPv6 -Nem todos os dispositivos de rede tem suporte (ou terão) para transportar pacotes IPv6. Um status atualizado pode ser encontrado emIPv6+Linux-status-kernel.html#transport. -O maior problema disso é causado na implementação da camada de rede, já que o pacote IPv6 não é reconhecido pelo cabeçalho IP (6 ao invés de 4). Ele é reconhecido pelo protocolo da camada 2 (transporte). Da mesma maneira, qualquer protocolo da camada 2 que não usa numeração de protocolo não conseguirá encaminhar os pacotes IPv6. -Nota: mesmo assim o pacote ainda é transportado pelo link, mas no lado receptor, o encaminhamento não ocorrerá (voce pode verificar isso com a utilização do tcpdump). -Estes links nunca suportarão IPv6 - -Serial Line IP (SLIP, RFC 1055 / SLIP), deveria ser chamado de SLIPv4, nome do dispositivo: slXParallel Line IP (PLIP), que nem o SLIP, nome do dispositivo: plipXISDN com encapsulamento rawip, nome do dispositivo: isdnX -Este link atualmente não suporta IPv6 - -ISDN com encapsulamento syncppp, nome do dispositivo: ipppX (problema de projeto do ipppd, que deveria ter sido resolvido com um PPP mais generalista na série de kernel 2.5) -Ferramentas de configuração de rede que suportam IPv6 -Voce não irá muito longe, se voce estiver rodando um kernel com suporte a IPv6, mas não tiver ferramentas que o ajudem a configurar o IPv6. Existem vários pacotes para ajudá-lo neste trabalho. -Pacote net-tools -O pacote net-tools inclui algumas ferramentas como ifconfig e route, que ajudam a configurar uma interface em IPv6. Veja a saída dos comandos ifconfig -? ou route -?, se eles mostrarem algo parecido com IPv6 ou inet6, então a ferramenta tem suporte a IPv6. -Novamente, para quem gosta de scripts: -& 1|grep -qw 'inet6' && echo "utility 'ifconfig' is -¬ IPv6-ready" -]]>Verificando o route: -& 1|grep -qw 'inet6' && echo "utility 'route' is IPv6-ready" -]]> -Pacote iproute -Alexey N. Kuznetsov (atual mantenedor do código de rede no Linux) criou um grupo de ferramentas que configuram redes através do dispositivo netlink. O uso destas ferramentas dá mais funcionalidades do que as do pacote net-tools, mas elas não estão muito bem documentadas e não são para os fracos de coração. -&1 |grep -qw 'inet6' && echo "utility 'ip' is IPv6-ready" -]]>Se o programa /sbin/ip não for encontrado em seu sistema, então eu recomendo que voce instale o pacote iproute. -Voce pode pega-lo através de sua distribuição (se houver)Voce pode procurar o pacote RPM emRPMfind/iproute (em alguns casos é recomendada a reconstrução do SRPMS) -Programas de teste e debug IPv6 -Após a preparação do seu sistema para o IPv6, está na hora de usar este protocolo para a sua comunicação com outros sistemas. Primeiro voce deve aprender como analisar os pacotes através de um sniffer. Isto é altamente recomendável para que qualquer debug ou troubleshooting seja feito de maneira rápida. -<!-- anchor id="program-ping6." -->Ping IPv6 -Este programa está incluído no pacote iputils. Seu objetivo é enviar e testar o transporte de pacotes ICMPv6 echo-request packets e aguardar pelos pacotes ICMPv6 echo-reply. -Uso - -# ping6 -# ping6 [-I ] -]]>Exemplo -Dica: o comando ping6 precisa de acesso direto ao socket e por isso precisa de permissão de root. Então se usuários comuns (não-root) tentarem usar o ping6 e não obtiverem sucesso, podem ser um dos dois problemas: -ping6 não está na variável PATH deste usuário (provavelmente porque o ping6 é geralmente localizado em /usr/sbin, e adicionar este diretório ao path do usuário comum não é muito recomendado)ping6 não executa corretamente, geralmente porque faltam permissões de root. A sugestão neste caso é executar o comando chmod u+s /usr/sbin/ping6 para permitir o uso do programa. -Especificando a interface para o ping em IPv6 -Ao usar um endereço link-local para pingar alguém em IPv6 o kernel pode não reconhecer ou saber através de qual interface (física ou virtual) o pacote deve ser enviado. Por causa disso, a seguinte mensagem de erro deve aparecer: -Neste caso, voce precisa especificar qual interface deve ser usada para enviar o pacote, como mostrado abaixo: - -Ping6 para endereços multicast -Um mecanismo interessante para detectar hosts com endereço IPv6 é pingar o endereço all-node multicast: -Diferente do IPv4, onde as respostas ao ping para endereços de broadcast podem ser desabilitadas, em IPv6 este comportamento não pode ser desabilitado, exceto pela utilização de um firewall IPv6 local. -<!-- anchor id="program-traceroute6." -->Traceroute6 IPv6 -Este programa geralmente está incluso no pacote iputils. É um programa conhecido, similar ao do IPv4. Veja o exemplo: -Nota: diferente das versões mais atuais co traceroute do IPv4, que usa pacotes ICMPv4 echo-request e pacotes UDP (default), o traceroute do IPv6 só é capaz de enviar pacotes UDP. Como voce já deve saber, pacotes ICMP echo-request são mais aceitos pelos firewalls e listas de acesso (ACL) de routers do que pacotes UDP. -<!-- anchor id="program-tracepath6." -->Tracepath6 IPv6 -Este programa costuma estar incluído no pacote iputils. É um programa similar ao traceroute6 e ele traça o caminho para um endereço dado, descobrindo o MTU ao longo deste caminho. Veja o exemplo abaixo: - -<!-- anchor id="program-tcpdump" -->Tcpdump IPv6 -No Linux, o tcpdump é a maior ferramenta para a captura de pacotes. Abaixo estão alguns exemplos. O suporte ao IPv6 já está adicionado nas versões 3.6 ou superiores deste programa. -O tcpdump usa diversas expressões e argumentos para realizar a filtragem de pacotes para minimizar o volume de informações apresentado: -icmp6: filtra o tráfego ICMPv6 nativoip6: filtra o tráfego nativo IPv6 (incluindo ICMPv6)proto ipv6: filtra o tráfego IPv6 tunelado em IPv4 (IPv6-in-IPv4)not port ssh: para evitar mostrar os pacotes se voce estiver usando uma conexão SSHAlém disso, algumas opções são muito úteis para obter mais informações de cada pacote, bem interessantes para pacotes ICMPv6: -"-s 512": aumenta o tamanho do pacote capturado para 512 bytes. Se for usada a opção "-s 0" o pacote é capturado por inteiro"-s 512": aumenta o tamanho do pacote capturado para 512 bytes. Se for usada a opção "-s 0" o pacote é capturado por inteiro"-n": não resolve os endereços para nomes, muito útil quando o DNS reverso não está funcionando corretamente -Ping IPv6 para 2001:0db8:100:f101::1 nativo sobre um link local - - 2001:0db8:100:f101::1: icmp6: echo -¬ request (len 64, hlim 64) -2001:0db8:100:f101::1 > 2001:0db8:100:f101:2e0:18ff:fe90:9205: icmp6: echo -¬ reply (len 64, hlim 64) -]]> -Ping IPv6 para 2001:0db8:100::1 roteado através de um túnel IPv6-in-IPv4 -Os endereços IPv4 1.2.3.4 e 5.6.7.8 são os tunnel endpoints (todos os endereços são exemplos) - 5.6.7.8: 2002:ffff:f5f8::1 > 2001:0db8:100::1: icmp6: echo request -¬ (len 64, hlim 64) (DF) (ttl 64, id 0, len 124) -5.6.7.8 > 1.2.3.4: 2001:0db8: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 > 2001:0db8:100::1: icmp6: echo request -¬ (len 64, hlim 64) (DF) (ttl 64, id 0, len 124) -5.6.7.8 > 1.2.3.4: 2001:0db8:100::1 > 2002:ffff:f5f8::1: icmp6: echo reply (len -¬ 64, hlim 61) (ttl 23, id 29919, len 124) -]]> -Programas com suporte a IPv6 -As distribuições Linux atuais já contém a maioria dos serviços Cliente e Servidor em IPv6. Veja aqui emIPv6+Linux-Status-Distribution. Se ainda não estiver incluído, voce pode verificar em IPv6 & Linux - Current Status - Applications se o programa já está portado para o IPv6 e pronto para o Linux. Para os programas mais comuns existem dicas disponíveis emIPv6 & Linux - HowTo - Part 3 e IPv6 & Linux - HowTo - Part 4. -Programas cliente com suporte a IPv6 -Para executar os testes abaixo, é necessário que seu sistema seja um host IPv6 e os exemplos mostrados podem ser feitos se voce tiver acesso ao 6bone. -Verificando a resolução DNS para endereços IPv6 -Por causa dos updates de segurança aplicados nos últimos anos, o Servidor DNS que roda a versão mais atual já tem a capacidade de entender os endereços IPv6 tipo AAAA (o named A6 mais novo ainda não é usado porque só no BIND9 o suporte aos root domais ARPA IP6 está em uso). Um teste bem simples para ver o sistema resolver endereços IPv6 é: -e a resposta deve ser alguma coisa parecida com isso: - -Cliente de Telnet com suporte a IPv6 -Cliente de telnet com suporte a IPv6 estão disponíveis. Um teste simples pode ser feito com o comando: -Se o cliente de telnet não entende o IPv6, a mensagem de erro será "cannot resolve hostname". -SSH com suporte a IPv6 - -openssh -As versões atuais do openssh já suportam IPv6. Dependendo da configuração utilizada, ele tem dois comportamentos: ---without-ipv4-default: o cliente tenta se conectar primeiro em IPv6, e ele usa IPv4 se a conexão em IPv6 não for estabelecida--with-ipv4-default: a conexão é feita primeiro em IPv4 e para usar algum endereço IPv6, deve-se forçar a sua utilização. Veja o exemplo -Se seu cliente ssh não entende a opção "-6" então o suporte a IPv6 não está habilitado, como muitos pacotes de ssh na versão 1. -ssh.com -O software cliente e servidor SSH da SSH.com já suporta o IPv6 e agora ele é grátis para todos os Linux e FreeBSD, independente se o seu uso é pessoal ou comercial. -Browsers com suporte a IPv6 -O status atual dos browsers com suporte a IPv6 pode ser encontrado aquiIPv6+Linux-status-apps.html#HTTP. -A maioria deles ainda tem problemas pendentes, tais como: -Se a configuração de proxy usa somente endereços IPv4, os pedidos em IPv6 também serão enviados a este proxy, emas como o proxy não saberá resolver o endereço, o pedido não vai funcionar. A única solução é verificar se o seu software de proxy tem alguma atualização para resolver este problema.Configuração automática de proxy (*.pac) não pode ser utilizada para manipular pedidos em IPv6 de maneira diferenciada (exemplo: não usar o proxy para o IPv6) por causa da sua natureza (escritos em Javascript e muito encrustado no código fonte, como é visto no Mozilla).As versões anteriores de browsers também não entenderiam uma URL com o endereço IPv6, como no exemplo http://[2001:4dd0:f838:a006::6]/ (isto funciona somente se a URL for usada em um browser que suporte IPv6). -Um pequeno teste é tentar este endereço em um browser sem o proxy configurado. -URLs para teste -Um bom ponto de partida para browsers que usam IPv6 é o sitehttp://www.kame.net/.Se a tartaruga da página estiver animada, a sua conexão é em IPv6. caso contrário, a tartaruga ficará parada. -Programas servidores com suporte a IPv6 -Nesta parte deste HowTo, outros softwares cliente IPv6 são mencionados, assim como dicas para servidores com suporte a IPv6, como sshd, httpd, telnetd, etc, assim como outras dicas emHints for IPv6-enabled daemons. -<!-- anchor id="faq-ipv6-ready-system-check" -->FAQ (checagem de sistema com suporte a IPv6) - -Usando ferramentas - -Q: Não consigo pingar (ping6) o endereço link-local -Mensagem de erro: "connect: Invalid argument" -O kernel não conhece qual interface física ou virtual voce quer utilizar para enviar o pacote ICMPv6. Assim, a solução poderia aparecer assim. -Solução:: Determine a interface, como: "ping6 -I eth0 fe80::2e0:18ff:fe90:9205", veja tambémprogram ping6 usage. -Q: Não consigo pingar (ping6) ou efetuar traceroute (traceroute6) como usuário normal -Menagem de erro: "icmp socket: Operation not permitted" -Estes utilitários criam pacotes especiais ICMPv6 e então os enviam. Isto é feito usando conexões brutas no kernel. Mas estas conexões somente podem ser usadas pelo usuário "root". Desta forma, esta mensagem vai aparecer para os usuários normais. -Solução: Se for realmente necessário que todos os usuários utilizem estas ferramentas, voce pode adicionar o "suid" bit usando o comando "chmod u+s /caminho/para/o/programa", e veja também este linkprogram ping6 usageSe nem todos os usuários necessitam usá-lo, voce pode mudar o grupo do programa, para "wheel" por exemplo, e todos os usuários pertencentes a este grupo poderão executar estes programas sem problema. Voce também pode configurar o "sudo" para isto também. -<!-- anchor id="chapter-configuration-interface" -->Configurando interfaces - -Dispositivos de rede diferentes -Em um nó, podem haver diferentes tipos de interfaces. Elas podem estar agrupadas em classes -Físicas, como eth0, tr0Virtuais, como ppp0, tun0, tap0, sit0, isdn0, ippp0 -Físicas -As interfaces físicas, como Ethernet ou Token Ring são exemplos de interfaces comuns que não precisam de qualquer tipo de tratamento especial. -Virtuais -As interfaces virtuais sempre precisam de algum tratamento especial -Interfaces Túnel IPv6-in-IPv4 -Estas interfaces normalmente recebem o nome sitx. O nome sit é uma atalho para Simple Internet Transition. Esta interface tem a capacidade de encapsular os pacotes IPv6 em pacotes IPv4 e tunelar estes pacotes para um endpoint remoto. -A interface sit0 tem um papel especial e não pode ser usada para túneis dedicados. -Interfaces PPP -As interfaces PPP obteem sua capacidade IPv6 do daemon PPP para IPv6. -Interfaces ISDN HDLC -A capacidade IPv6 para HDLC com encapsulamento IP já está contida no kernel -Interfaces ISDN PPP -A interface ISDN PPP (ippp) não tem o suporte ao IPv6 no kernel. E também não há qualquer plano para suportar, porque o kernel da série 2.5 ele será substituído por uma camada de interface PPP mais genérica. -SLIP + PLIP -Como mencionado anteriormente neste documento, esta interface não suporta o IPv6 (no envio até que funciona, mas a recepção não funciona). -Dispositivo Ether-tap -Dispositivos Ether-tap já possuem o IPv6 habilitado e o stateless configurado. Para usá-lo, o módulo "ethertap" deve ter sido carregado antes. -Dispositivos tun -Atualmente não foi testado por mim -ATM -01/2002: Não são mais suportados pelo kernel vanilla, mas somente pelas extensões USAGI -Outras -Eu esqueci de alguma ? -Colocando as interfaces em up e down -Existem dois métodos usados para colocar as interfaces em up ou down.. -Usando "ip" -Uso: - up -# ip link set dev down -]]>Exemplo: - -Usando "ifconfig" -Uso: - up -# /sbin/ifconfig down -]]>Exemplo: - -<!-- anchor id="chapter-configuration-address" -->Configurando endereços IPv6 -Existem várias maneiras de configurar um endereço IPv6 em uma interface. As mais comuns são "ifconfig" e "ip". -Mostrando os endereços IPv6 existentes -Antes de mais nada, voce precisa checar se já existe algum endereço IPv6 configurado e qual é o seu tipo (talvez atribuído durante uma auto-configuração stateless). -Usando "ip" -Uso: - -]]>Exemplo para uma configuração de host estático: -Exemplo de um host auto-configurado -Aqui voce pode ver a configuração de IPv6 através do processo auto-magically, além do tempo de vida do endereço. - -Usando "ifconfig" -Uso: - -]]>Exemplo (a saída foi filtrada com o grep para mostrar somente os endereços IPv6). Aqui voce pode ver diferentes endereços IPv6 com diferentes escopos. - -Adicionando um endereço IPv6 -A adição de um endereço IPv6 é muito similar ao endereço "IP ALIAS" nas interfaces IPv4 no Linux. -Usando "ip" -Uso: -/ dev -]]>Exemplo: - -Usando "ifconfig" -Uso: - inet6 add / -]]>Exemplo: - -Removendo um endereço IPv6 -Como esta ação não é tão necessária, tenha cuidado ao remover endereços IPv6 que não existem, pois ao realizar esta ação em kernels mais antigos, voce pode causar um grande estrago no sistema. -Usando "ip" -Uso: -/ dev -]]>Exemplo: - -Usando "ifconfig" -Uso: - inet6 del / -]]>Exemplo: - -<!-- anchor id="chapter-configuration-route" -->Configurando rotas IPv6 -Se voce quer deixar seu link e quer enviar pacotes a todo o mundo que está só aguardando a sua conexão em IPv6, voce vai precisar de uma rota. Se já houver um router com IPv6 habilitado (e uma rota para ele), estes passos abaixo vão te ensinar como adicionar mais rotas em IPv6. -Mostrando as rotas IPv6 existentes -Antes de mais nada, é interessante verificar quais são as rotas IPv6 já configuradas (talvez atribuído durante uma auto-configuração). -Usando "ip" -Uso: -] -]]>Exemplo: - -Usando "route" -Uso: -Exemplo (a saída foi filtrada para a interface eth0). Aqui voce pode ver rotas IPv6 para diferentes endereços em uma única interface. - -Adicionando uma rota IPv6 através de um gateway -Bastante necessário quando se quer acessar outras redes com IPv6 usando um router IPv6-enabled em seu link. -Usando "ip" -Uso: -/ via -¬ [dev ] -]]>Exemplo: - -Usando "route" -Uso: -/ gw -¬ [dev ] -]]>Um dispositivo pode ser necessário se o dispositivo do endereço IPv6 do gateway for um dispositivo link local. -Veja o exemplo abaixo, como adicionar uma rota para todos os endereços globais (2000::/3) através do gateway 2001:0db8:0:f101::1 - -Removendo uma rota IPv6 através de um gateway -Não é geralmente usada no modo manual, pois sugerimos a utilização de scripts ou shutdown nas interfaces (todas ou por interface) -Usando "ip" -Uso: -/ via -¬ [dev ] -]]>Exemplo: - -Usando "route" -Uso: -/ gw [dev -¬ ] -]]>Exemplo para remover a rota adicionada anteriormente (acima): - -Adicionando uma rota IPv6 através de uma interface -Nem sempre usado, mas quando usado é em links ponto a ponto. -Usando "ip" -Uso: -/ dev -¬ metric 1 -]]>Exemplo: -A métrica "1" é usada aqui para se manter compatível com as métricas usadas pelo comando route, já que a métrica default ao se usar "ip" é "1024". -Usando "route" -Uso: -/ dev -]]>Exemplo: - -Removendo uma rota IPv6 através de uma interface -Nem sempre utilizado manualmente, pois recomenda-se a utilização de scripts. -Usando "ip" -Uso: -/ dev -]]>Exemplo: - -Usando "route" -Uso: -/ dev -]]>Exemplo: - -FAQ para rotas em IPv6 - -Suporte de uma rota default IPv6 -Uma boa idéia do IPv6 foi o roteamento hierárquico, o que proporcionaria a necessidade de menos rotas nos roteadores. -Aqui estão alguns problemas no kernel atual do Linux: -Clientes (não roteando qualquer pacote!) -Um cliente pode configurar uma rota default prefixo "::/0", mas eles também aprendem uma rota no processo de auto configuração, ex.: uso do radvd no link abaixo mostra: - -Roteadores em caso de packet forwarding -Os linux mais velhos (pelo menos inferiores ao kernel 2.4.17) não suportam rotas default. Voce pode configura-las, mas a pesquisa na tabela vai retornar uma falha quando deveria ser encaminhado (intenção normal do roteador). Se voce ainda está usando uma versão antiga de kernel, as "rotas default" podem ser configuradas usando o prefixo de endereço global "2000::/3". -Nota: tome cuidado com as rotas default sem filtragem de endereços em roteadores de borda, pois o tráfego multicast ou site-local pode sair para o mundo. -<!-- anchor id="chapter-Neighbor-Discovery" -->Descoberta de vizinhos -A descoberta de vizinhos funciona como um sucessor do ARP (Address Resolution Protocol) em IPv4, no mundo IPv6. Voce pode obter estas informações sobre os vizinhos atuais, e adicionalmente voce pode configurar e excluir entradas. O kernel mantém o rastreamento das descobertas bem sucedidas (como no ARP em IPv4). Voce pode pesquisar as entradas nesta tabela usando o comando "ip". -Mostrando os vizinhos usando "ip" -Com o comando abaixo voce pode verificar a tabela de vizinhos aprendida ou configurada -] -]]>O exemplo a seguir mostra um vizinho, o qual é um router acessível - -Manipulando a tabela de vizinhos usando "ip" - -Adicionando uma entrada manualmente -Com o comando abaixo, voce consegue adicionar uma entrada manualmente - lladdr dev -]]>Exemplo: - -Excluindo uma entrada manualmente -Similar à adição de uma entrada, uma entrada pode ser excluída - lladdr dev -]]>Exemplo: - -Opções mais avançadas -A ferramenta "ip" não é tão documentada, mas é bem útil e forte. Veja o seu help online para mais informações: -Aparentemente algumas opções são somente para o IPv4... e se voce quiser contribuir com mais informações sobre outras opções da ferramenta e usos avançados, por favor, me envie. -<!-- anchor id="chapter-configuring-ipv6-in-ipv4-tunnels" -->Configurando um túnel IPv6-in-IPv4 -Se voce quer deixar seu link e ter uma rede IPv6 à sua volta, voce vai precisar de um túnel IPv6-in-IPv4 para acessar a web em modo IPv6. -Existem alguns tipos de mecanismo e também algumas possibilidades da configuração deste túnel. -Tipos de túneis -Existe mais de uma possibilidade de transportar pacotes IPvb6 em links IPv4. -Túnel estático ponto a ponto: 6bone -Um túnel ponto a ponto é um túnel dedicado em direção a um ponto final., o qual sabe informações sobre uma rede IPv6A (para rotas de volta) e os endereços IPv4 deste túnel estão definidos na RFC 2893 / Transition Mechanisms for IPv6 Hosts and Routers. Necessidades: -O endereço IPv4 local do túnel precisa ser estático, global, único e acessível a partir da outra pontaUm prefixo global IPv6 deve ser designado a voce (veja o registro 6bone)Um ponto final remoto do túnel deve ser capaz de rotear seu prefixo IPv6para seu ponto final local (uma configuração manual pode ser necessária) -Túnel automático -Um túnel automático acontece quando um nó diretamente conectado a outro nó obtém um IPv4 do outro nó anterior. -<!-- anchor id="tunneling-6to4." -->6to4-Tunneling -O túnel 6to4 (RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds) utiliza um mecanismo simples para criar túneis automáticos. Cada nó com um endereço global único é capaz de ser uma ponta final de um túnel 6to4 (se nenhum firewall no meio do caminho bloquear este tipo de tráfego). Túneis 6to4 não costumam ser túneis um a um. Este tipo de túnel pode ser dividido em Upstream e Downstream. Além disso, um endereço especial IPv6 indica que este nó vai usar o tunelamento 6to4 para se conectar a redes IPv6 mundiais. -Geração de prefixo 6to4 -O endereço 6to4 está definido abaixo (o esquema foi pego da RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds): -FP e TLA juntos (16 bits) tem o valor 0x2002. V4ADDR é o endereço único IPv4 (em notação hexadecimal). SLA é o identificador de rede (65536 redes locais possíveis) e são usados para representar a sua estrutura de rede local. -Para os gateways, tal prefixo é gerado normalmente usando o SLA “0000” e o sufixo "::1" (não é uma exigencia, pode ser arbitrário com um escopo local) e então assinalado a uma interface de túnel 6to4. Veja que a Microsoft também utiliza V4ADDR para o sufixo. -Tunelamento Upstream 6to4 -O nó tem que saber para qual ponta remota de túnel os pacotes IPv4 com pacotes IPv6 devem ser encaminhados. No início dos tempos de tunelamento 6to4, upstreams dedicados aceitavam que os routers fizessem isso. Veja NSayer's 6to4 information para uma lista de routers. -Hoje em dia, os routers upstream 6to4 podem ser encontrados automaticamente, usando o endereço de unicast 192.88.99.1. Os protocolos de roteamento se incumbem desta função, veja RFC 3068 / An Anycast Prefix for 6to4 Relay Routers para mais detalhes. -Tunelamento Downstream 6to4 -O downstream (6bone -> seu nó com 6to4 habilitado) não é realmente correto e pode variar de um host remoto estranho que originou os pacotes que foram enviados a voce. Existem duas possibilidades: -Estes hosts remotos usam endereços 6to4 e enviam os pacotes de volta diretamente a seu nó (veja abaixo)Estes hosts remotos enviam os pacotes de volta à rede IPv6 e dependendo do roteamento, um router no meio do caminho cria um túnel automaticamente em direção ao seu nó. -Tráfego 6to4 possível - -6to4 para 6to4: normalmente é um túnel direto entre as duas pontas, ambos habilitados em 6to46to4 para não-6to4: é enviado via um túnel upstreamnão-6to4 para 6to4: é enviado via um túnel downstream -Mostrando os túneis existentes - -Usando "ip" -Uso: -] -]]>Exemplo: - -Usando "route" -Uso: -Exemplo (a saída está filtrada para mostrar somente os túneis através da interface virtual sit0): - -<!-- anchor id="conf-ipv6-in-ipv4-point-to-point-tunnels" -->Configuração de um túnel ponto a ponto -Existem possibilidades para adicionar ou remover um túnel ponto a ponto. -Uma boa informação adicional sobre a configuração de túneis fornecida através do comando “ip” está aqui Configuring tunnels with iproute2 (article) (Mirror). -Adicionando túneis ponto a ponto - -Usando "ip" -Um método comum para a criação de uma quantidade pequena de túneis. -Use-o para criar um dispositivo túnel (mas não depois, o TTL também deve ser especificado, porque seu valor default é 0). - mode sit ttl remote -¬ local -]]>Uso (exemplo genérico para 3 túneis): - 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 -]]> -Usando "ifconfig" e "route" (obsoleto) -Esta não é uma maneira muito recomendada de se criar um túnel porque ele é um pouco estranho. Não há qualquer problema se voce adicionar somente um, mas se voce for configurar mais de um, voce não poderá desfazer os primeiros túneis criados e deixar os últimos em funcionamento. -Uso (exemplo genérico para 3 túneis): - -# /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: NÃO USE ISSO, porque esta configuração habilita implicitamente um “tunelamento automático” de qualquer lugar na internet, e isto é um risco, então não o utilize. -Usando somente "route" -Também é possível configurar túneis no modo Non Broadcast Multiple Access (NBMA), pois é uma maneira fácil de adicionar muitos túneis de uma vez. Mas nenhum dos túneis pode ser numerado (o que não é uma característica). -Uso (exemplo genérico para 3 túneis): - gw -¬ :: dev sit0 -# /sbin/route -A inet6 add gw -¬ :: dev sit0 -# /sbin/route -A inet6 add gw -¬ :: dev sit0 -]]>Importante: NÃO USE ISSO, porque esta configuração habilita implicitamente um “tunelamento automático” de qualquer lugar na internet, e isto é um risco, então não o utilize. -Removendo os túneis ponto a ponto -Nem sempre é necessário fazer isso manualmente, mas pode ser usado em scripts para uma limpeza ou restart de uma configuração IPv6. -Usando "ip" -Uso para remover um dispositivo túnel: - -]]>Uso (exemplo genérico para 3 túneis): - 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 -]]> -Usando "ifconfig" e "route" (não é mais usado por ser estranho) -Não somente a criação é estranha, como também o shutdown... voce tem que remover os tuneis na ordem inversa em que eles foram criados. -Uso (exemplo genérico para 3 túneis): - dev sit3 -# /sbin/ifconfig sit3 down - -# /sbin/route -A inet6 del dev sit2 -# /sbin/ifconfig sit2 down - -# /sbin/route -A inet6 add dev sit1 -# /sbin/ifconfig sit1 down - -# /sbin/ifconfig sit0 down - -]]> -Usando "route" -Isto é como remover rotas normais em IPv6. - -Uso (exemplo genérico para 3 túneis): - gw -¬ :: dev sit0 -# /sbin/route -A inet6 del gw -¬ :: dev sit0 -# /sbin/route -A inet6 del gw -¬ :: dev sit0 - -# /sbin/ifconfig sit0 down -]]> -Tuneis ponto a ponto numerados -Às vezes é necessário configurar túneis ponto a ponto com endereços IPv6 como em IPv4. Isto somente é possível utilizando o primeiro (ifconfig+route - obsoleto) e o terceiro (ip+route) modo de configuração. Em tais casos, voce pode adicionar os endereços IPv6 na interface de túnel conforme é mostrado na configuração de uma interface. -<!-- anchor id="configuring-ipv6to4-tunnels" -->Configuração de túneis 6to4 -Preste atenção pois o suporte aos túneis 6to4 atualmente não está implementado completamente no kernel vanilla da série 2.2.x (veja systemcheck/kernel para mais detalhes). Veja também que o tamanho do prefixo para um endereço 6to4 é 16, uma vez que do ponto de vista da rede, todos os outros hosts habilitados para 6to4 estão na mesma camada 2. -Adição de um túnel 6to4 -Antes de tudo, voce precisa calcular o seu prefixo 6to4 usando o seu endereço público IPv4 (se seu host não tem este endereço, é possível utilizar um NAT no router de borda em alguns casos especiais): -Assumindo que o seu endereço IPv4 seja este -o prefixo 6to4 gerado será este -Gateways locais 6to4 deveriam (mas não é uma regra fixa, pois voce pode escolher um sufixo arbitrário, se voce preferir) sempre assinalar o sufixo "::1", desta forma seu endereço local 6to4 será este -Por exemplo, use a seguinte automação: -Atualmente existem duas maneiras possíveis de configurar um túnel 6to4. -Usando "ip" e um dispositivo de túnel dedicado -Esta é a maneira recomendada (um TTL deve ser especificado, pois o valor default é 0). -Criando um dispositivo de túnel - remote any local -¬ -]]>Ativando a interface -Adicionando o endereço local 6to4 na interface (nota: o tamanho do prefixo - /16 - é importante!) -/16 dev tun6to4 -]]>Adicionando uma rota default para a rede global IPv6 usando o endereço anycast IPv4 todos-6to4-router -É sabido que algumas versões do comando "ip" (exemplo SuSE Linux 9.0) não suportam endereços IPv6 no formato compatível IPv4 para seus gateways, e neste caso o endereço IPv6 relativo a ele deve ser usado: - -Usando "ifconfig" e "route" e um dispositivo de túnel genérico "sit0" (obsoleto) -Este método está obsoleto porque o uso de um túnel genérico sit0 não permite especificar filtros pelo dispositivo. -Ativando a interface genérica sit0 -Adicionando um endereço 6to4 na interface -/16 -]]>Adicionando uma rota default para a rede global IPv6 usando o endereço anycast IPv4 todos-6to4-router - -Removendo um túnel 6to4 - -Usando "ip" e um dispositivo de túnel dedicado -Remova todas as rotas que utilizam este dispositivo -Desligue a interface -Remova o dispositivo criado - -Usando "ifconfig" e "route" e o dispositivo genérico de túnel "sit0" (obsoleto) -Remova as rotas default que usam esta interface -Remova o endereço local 6to4 desta interface -/16 -]]>Desligue o dispositivo genérico de túnel (cuidado com isto, pois ela ainda pode estar em uso...) - -<!-- anchor id="chapter-configuring-ipv4-in-ipv6-tunnels" -->Configurando túneis IPv4-in-IPv6 -A RFC 2473 / Generic Packet Tunneling in IPv6 Specification especifica o mecanismo para tunelar diferentes tipos de pacotes em IPv6 incluindo IPv4. -NOTAE: O suporte para túneis IPv4-in-IPv6 está disponível somente a partir da versão de kernel 2.6.22. -Mostrando os túneis existentes -Uso: -] -]]>Exemplo: -NOTA: Se voce não incluir "mode any", somente os túneis IPv6-in-IPv6 serão mostrados. -Configuração de túnel ponto a ponto -Uso para criar um dispositivo de túnel 4over6 - mode ip4ip6 remote -¬ local -]]>Uso (exemplo genérico para 3 túneis): - local -# /sbin/ip link set dev ip6tnl1 up -# /sbin/ip -6 route add dev ip6tnl1 metric 1 - -# /sbin/ip -6 tunnel add ip6tnl2 mode ip4ip6 remote -¬ local -# /sbin/ip link set dev ip6tnl2 up -# /sbin/ip -6 route add dev ip6tnl2 metric 1 - -# /sbin/ip -6 tunnel add ip6tnl3 mode ip4ip6 remote -¬ local -# /sbin/ip link set dev ip6tnl3 up -# /sbin/ip -6 route add dev ip6tnl3 metric 1 -]]> -Removendo túneis ponto a ponto -Uso ara remover um dispositivo de túnel: - -]]>Uso (exemplo genérico para 3 túneis): - dev ip6tnl1 -# /sbin/ip link set ip6tnl1 down -# /sbin/ip -6 tunnel del ip6tnl1 - -# /sbin/ip -6 route del dev ip6tnl2 -# /sbin/ip link set ip6tnl2 down -# /sbin/ip -6 tunnel del ip6tnl2 - -# /sbin/ip -6 route del dev ip6tnl3 -# /sbin/ip link set ip6tnl3 down -# /sbin/ip -6 tunnel del ip6tnl3 -]]> -<!-- anchor id="chapter-kernel-settings" -->Configuraçoes de Kernel nos arquivos do /proc -Nota: a fonte desta seção é em sua maioria o arquivo "ip-sysctl.txt", o qual está incluído no diretório "Documentation/networking" do código fonte do kernel usado. Crédito para Pekka Savola pela manutençao da parte IPv6 neste arquivo. Além disso, muito do que está escrito abaixo é um Copy & Paste deste arquivo mencionado. -Como acessar os arquivos do /proc - -Usando "cat" e "echo" -Usar os comandos "cat" e "echo" é a maneira mais simples de acessar os arquivos deste diretório, mas alguns pontos devem ser observados: -O sistema de arquivos /proc deve estar habilitado no kernel , ou seja, a seguinte chave deve estar configurada - -O sistema de arquivos já deve estar montado, o que pode ser testado como comando - -Voce pode ler e também escrever (geralmente como root) nos arquivos contidos aqui (/proc)Normalmente, somente as entradas localizadas em /proc/sys/* podem ser alteradas, as demais são somentepara leitura e para obtenção de informações. -Obtendo um valor -O valor de uma entrada pode ser obtido com o comando "cat": - -Definindo um valor -Um novo valor pode ser definido (se a entrada aceitar a escrita) através do comando "echo": -/proc/sys/net/ipv6/conf/all/forwarding -]]> -Usando "sysctl" -O uso do programa "syysctl" para acessar as chaves do kernel é uma maneira moderna utilizada hoje em dia. Voce também pode usar se o sistema de arquivos /proc não estiver montado. Mas voce só terá acesso às entradas /proc/sys/*! -O programa "sysctl" está incluído no pacote "procps" (em sistemas Red Hat Linux). -A interface do sysctl deve estar habilitada no kernel, então a seguinte chave deve estar habilitada - -Obtendo um valor -O valor de uma entrada pode ser obtida da seguinte maneira: - -Definindo um valor -Um novo valor pode ser definido (se a entrada aceitar a escrita): -Nota: Não use espaços entre o sinal = para definir os valores. Se forem possíveis diversos valores, coloque-os entre aspas - -Adicionais -Nota: Existem versões em campo que mostram "/" ao invés de "." -Para mais detalhes, de uma olhada na manpage do sysctl. -Dica: para achar mais rapidamente as definiçoes, use a opçao "-a" (mostra todas as entradas) junto com o comando "grep". -Valores encontrados nas entradas /proc -Existem vários formatos vistos no sistema de arquivos /proc: -BOOLEANO: simplesmente um "0" (falso) ou um "1" (verdadeiro)INTEIRO: um valor inteiro, também pode ser sem sinallinhas mais sofisticadas com muitos valores: às vezes uma linha de cabeçalho também é mostrada, senão, uma olhada no código fonte do kernel pode ser necessário para entender o significado dos valores apresentados... -<!-- anchor id="proc-sys-net-ipv6." -->Entradas em /proc/sys/net/ipv6/ - -conf/default/* -Muda as configurações específicas da interface. -conf/all/* -Muda todas as configurações esoecíficas da interface. -Exceção: "conf/all/forwarding" tem um significado diferente aqui -conf/all/forwarding - -Tipo: BOOLEANOIsto habilita o encaminhamento de pacotes IPv6 entre todas as interfaces. -Em IPv6 voce não pode controlar o envio de pacotes por dispositivo. este encaminhamento deve ser feito através de regras do IPv6-netfilter (controlado com ip6tables) e especificando os dispositivos de entrada e saída (veja Firewalling/Netfilter6 para mais detalhes). Isto é diferente no IPv4, onde é possível controlar o encaminhamento por dispositivo (a decisão é feita na interface onde o pacote entra). -Isto também define todas as interfaces do host e/ou router para o valor especificado. Veja os detalhes abaixo. Esta definição refere-se ao encaminhamento global. -Se este valor é 0, nenhum pacote IPv6 é encaminhado, os pacotes nunca deixarão outra interface, seja ela física ou lógica, como os túneis. -conf/interface/* -Muda configurações especiais por interface. -O comportamento funcional de certos ajustes é diferente, dependendo se o encaminhamento local está habilitado ou não. -accept_ra - -Tipo: BOOLEANAjuste default: habilitado se o encaminhamento local está desabilitado, e desabilitado se o encaminhamento local está habilitado.Aceita Router Advertisements, e configura automaticamente esta interface com os dados recebidos. -accept_redirects - -Tipi: BOOLEANAjuste default: habilitado se o encaminhamento local está desabilitado, e desabilitado se o encaminhamento local está habilitado.Aceita os Redirects enviados por um router IPv6. -autoconf - -Tipo: BOOLEANAjuste default: habilitado se o accept_ra_pinfo está babilitado, e desabilitado se o accept_ra_pinfo estiver desabilitado.Os endereços e prefixos usados na configuração automática proveem de anúncios dos routers. -dad_transmits - -Tipo: INTEGERDefault: 1Quantidade de probes de detecção de endereços duplicados enviados. -forwarding - -Tipo: BOOLEANDefault: FALSE se o encaminhamento global estiver desabilitado (default), caso contrário TRUEComportamento Host/Router específico. -Nota: É recomendado ter a mesma configuração em todas as interfaces; cenários diferentes são bem incomuns. -Valor FALSE: Por default, o comportamento do Host é assumido. Isto significa: -O flag IsRouter não está definido em aúncios de vizinhança.Solicitaçoes Router são enviados quando necessário.Se accept_ra é TRUE (default), aceita anúncios router (e fazem auti configuração).Se accept_redirects é TRUE (default), aceita Redirects. -Valor TRUE: se o encaminhamento local está habilitado, o comportamento Router é assumido. Isto significa que o contrário da lista acima pode acontecer: -O flag IsRouter é definido nos anúncios de vizinhança.Solicitaçoes Router não são enviadas.Anúncios Router são ignorados.Redirects são ignorados. -hop_limit - -Tipo: INTEGERDefault: 64Hop Limit default para definir. -mtu - -Tipo: INTEGERDefault: 1280 (mínimo necessário no IPv6)Default Maximum Transfer Unit -router_solicitation_delay - -Tipo: INTEGERDefault: 1Número de segundos a esperar após a interface ser ativada antes de enviar solicitaçoes Router. -router_solicitation_interval - -Tipo: INTEGERDefault: 4Número de segundos a esperar entre solicitaçoes Router. -router_solicitations - -Tipo: INTEGERDefault: 3Número de solicitaçoes Router a enviar até assumir que não há um router presente. -neigh/default/* -Muda as definiçoes default para detecçao de vizinhos e alguns valores globais e de limites: -gc_thresh1 - -Tipo: INTEGERDefault: 128Precisa ser preenchido. -gc_thresh2 - -Tipo: INTEGERDefault: 512Precisa ser preenchido. -gc_thresh3 - -Tipo: INTEGERDefault: 1024Parametro para o tamanho da tabela de vizinhança. -Aumente este valor se voce tem muitas interfaces e os routers começam a apresentar problemas misteriosos de funcionamento e falhas. Ou se uma mensagem dessas aparecer Zebra (routing daemon): - -gc_interval - -Tipo: INTEGERDefault: 30Precisa ser preenchido. -neigh/interface/* -Muda ajustes especiais por interface para detecção de vizinhos. -anycast_delay - -Tipo: INTEGERDefault: 100Precisa ser preenchido. -gc_stale_time - -Tipo: INTEGERDefault: 60Precisa ser preenchido. -proxy_qlen - -Tipo: INTEGERDefault: 64Precisa ser preenchido. -unres_qlen - -Tipo: INTEGERDefault: 3Precisa ser preenchido. -app_solicit - -Tipo: INTEGERDefault: 0Precisa ser preenchido. -locktime - -Tipo: INTEGERDefault: 0Precisa ser preenchido. -retrans_time - -Tipo: INTEGERDefault: 100Precisa ser preenchido. -base_reachable_time - -Tipo: INTEGERDefault: 30Precisa ser preenchido. -mcast_solicit - -Tipo: INTEGERDefault: 3Precisa ser preenchido. -ucast_solicit - -Tipo: INTEGERDefault: 3Precisa ser preenchido -delay_first_probe_time - -Tipo: INTEGERDefault: 5Precisa ser preenchido. -proxy_delay - -Tipo: INTEGERDefault: 80Precisa ser preenchido. -route/* -Ajustes globais para roteamento. -flush -Removido nas novas versões de kernel - Precisa ser preenchido. -gc_interval - -Tipo: INTEGERDefault: 30Precisa ser preenchido. -gc_thresh - -Tipo: INTEGERDefault: 1024Precisa ser preenchido. -mtu_expires - -Tipo: INTEGERDefault: 600Precisa ser preenchido. -gc_elasticity - -Tipo: INTEGERDefault: 0Precisa ser preenchido. -gc_min_interval - -Tipo: INTEGERDefault: 5Precisa ser preenchido. -gc_timeout - -Tipo: INTEGERDefault: 60Precisa ser preenchido. -min_adv_mss - -Tipo: INTEGERDefault: 12Precisa ser preenchido. -max_size - -Tipo: INTEGERDefault: 4096Precisa ser preenchido. -<!-- anchor id="proc-sys-net-ipv4." -->Entradas relacionadas a IPv6 em /proc/sys/net/ipv4/ -Neste momento (e será até que o IPv6 seja completamente convertido para um módulo independente do kernel) algumas chaves para IPv6 são usadas aqui. -ip_* - -ip_local_port_range -Esta definição também é usada para o IPv6. -tcp_* -Esta definição também é usada para o IPv6. -icmp_* -Esta definição não é usada para o IPv6. Para habilitar o limite ICMPv6 (o que é muito recomendado) regras netfilter-v6 devem ser usadas. -others -Desconhecido, mas provavelmente não usado pelo IPv6. -<!-- anchor id="proc-net" -->Entradas em /proc/net relacionadas com IPv6 -No /proc/net existem diversas variáveis disponíveis, somente para leitura, Não é possível obter informaçoes através do "sysctl", então utilize "cat". -if_inet6 - -Tipo: Uma linha por endereço contendo vários valoresAqui todos os endereços IPv6 cpnfigurados são mostrados em um formato especial. O exemplo mostra somente a interface de loopback. O significado é mostrado abaixo (veja "net/ipv6/addrconf.c" para mais informações). - -Endereço IPv6 mostrado em hexadecimal (32 caracteres) sem os dois pontos ":" como separadoresNúmero do dispositivo netlink (índice da interface) em hexadecimal (veja “ip addr” , também)tamanho do prefixo, em hexadecimalValor do escopo (veja o fonte do kernel " include/net/ipv6.h" e "net/ipv6/addrconf.c" para mais informações)Flags da interface (veja "include/linux/rtnetlink.h" e"net/ipv6/addrconf.c" para mais informações)Nome do disppositivo -ipv6_route - -Tipo: Uma linha por rota contém várias valoresAqui toda a configuração de rotas em IPv6 é mostrada em um formato especialt. O exemplo mostra informações somente para a interface de loopback O significado é mostrado abaixo (veja "net/ipv6/route.c" para mais informações). - -Rede de destino IPv6 mostrada em hexadecimal (32 caracteres) som dois pontos ":" como separadorTamanho do prefixo de destino, em hexadecimalRede de origem IPv6 mostrada em hexadecimal (32 caracteres) som dois pontos ":" como separadorTamanho do prefixo de origem, em hexadecimalPróximo salto IPv6 mostrado em hexadecimal (32 caracteres) som dois pontos ":" como separadorMétrica em hexadecimalContador de referenciaContadoer de usoFlagsNome do dispositivo -sockstat6 - -Tipo: Uma linha por protocolo, com descrição e valorEstatísticas sobre o uso de sockets IPv6. Exemplo: - -tcp6 -Precisa ser preenchido. -udp6 -Precisa ser preenchido. -igmp6 -Precisa ser preenchido. -raw6 -Precisa ser preenchido. -ip6_flowlabel -Precisa ser preenchido. -rt6_stats -Precisa ser preenchido. -snmp6 - -Tipo: Uma linha por descrição SNMP e valorEstatísticas SNMP podem ser obtidas via um servidor SNMP e suas MIB's relacionadas, através um software de gerencia de rede. -ip6_tables_names -Tabelas netfilter6 disponíveis -<!-- anchor id="netlink" -->Netlink-Interface to kernel -To be filled...I have no experience with that... -<!-- anchor id="resolver" -->Address Resolver -Name to IPv4 or IPv6 address resolving is usually done using a libc resolver library. There are some issues known using the function getaddrinfo. -More info can be found at Linux & IPv6: getaddrinfo and search domains - Research and RFC 3484 on Linux. - -More to be filled later... -<!-- anchor id="network-debugging" -->Network debugging - -Server socket binding - -Using “netstat” for server socket binding check -It's always interesting which server sockets are currently active on a node. Using “netstat” is a short way to get such information: -Used options: -nlptu -Example: - -<!-- anchor id="examples-tcpdump" -->Examples for tcpdump packet dumps -Here some examples of captured packets are shown, perhaps useful for your own debugging... -...more coming next... -Router discovery - -Router advertisement - - 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=2001:0db8:0:1::/64)(src lladdr: -¬ 0:12:34:12:34:50) (len 88, hlim 255) -]]>Router with link-local address “fe80::212:34ff:fe12:3450” send an advertisement to the all-node-on-link multicast address “ff02::1” containing two prefixes “2002:0102:0304:1::/64” (lifetime 30 s) and “2001:0db8:0:1::/64” (lifetime 2592000 s) including its own layer 2 MAC address “0:12:34:12:34:50”. -Router solicitation - - ff02::2: icmp6: router solicitation -¬ (src lladdr: 0:12:34:12:34:56) (len 16, hlim 255) -]]>Node with link-local address “fe80::212:34ff:fe12:3456” and layer 2 MAC address “0:12:34:12:34:56” is looking for a router on-link, therefore sending this solicitation to the all-router-on-link multicast address “ff02::2”. -Neighbor discovery - -Neighbor discovery solicitation for duplicate address detection -Following packets are sent by a node with layer 2 MAC address “0:12:34:12:34:56” during autoconfiguration to check whether a potential address is already used by another node on the link sending this to the solicited-node link-local multicast address. -Node wants to configure its link-local address “fe80::212:34ff:fe12:3456”, checks for duplicate now - 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) -]]> -Node wants to configure its global address “2002:0102:0304:1:212:34ff:fe12:3456” (after receiving advertisement shown above), checks for duplicate now - 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) -]]> -Node wants to configure its global address “2001:0db8:0:1:212:34ff:fe12:3456” (after receiving advertisement shown above), checks for duplicate now - ff02::1:ff12:3456: icmp6: neighbor sol: who has -¬ 2001:0db8:0:1:212:34ff:fe12:3456(src lladdr: 0:12:34:12:34:56) (len 32, hlim -¬ 255) -]]> -Neighbor discovery solicitation for looking for host or gateway - -Node wants to send packages to “2001:0db8:0:1::10” but has no layer 2 MAC address to send packet, so send solicitation now - ff02::1:ff00:10: icmp6: -¬ neighbor sol: who has 2001:0db8:0:1::10(src lladdr: 0:e0:18:90:92:5) (len 32, -¬ hlim 255) -]]> -Node looks for “fe80::10” now - ff02::1:ff00:10: icmp6: neighbor -¬ sol: who has fe80::10(src lladdr: 0:e0:18:90:92:5) (len 32, hlim 255) -]]> -<!-- anchor id="chapter-support-persistent-configuration" -->Support for persistent IPv6 configuration in Linux distributions -Some Linux distribution contain already support of a persistent IPv6 configuration using existing or new configuration and script files and some hook in the IPv4 script files. -Red Hat Linux and “clones” -Since starting writing the IPv6 & Linux - HowTo it was my intention to enable a persistent IPv6 configuration which catch most of the wished cases like host-only, router-only, dual-homed-host, router with second stub network, normal tunnels, 6to4 tunnels, and so on. Nowadays there exists a set of configuration and script files which do the job very well (never heard about real problems, but I don't know how many use the set). Because this configuration and script files are extended from time to time, they got their own homepage: initscripts-ipv6 homepage (Mirror). Because I began my IPv6 experience using a Red Hat Linux 5.0 clone, my IPv6 development systems are mostly Red Hat Linux based now, it's kind a logic that the scripts are developed for this kind of distribution (so called historic issue). Also it was very easy to extend some configuration files, create new ones and create some simple hook for calling IPv6 setup during IPv4 setup. -Fortunately, in Red Hat Linux since 7.1 a snapshot of my IPv6 scripts is included, this was and is still further on assisted by Pekka Savola. -Mandrake since version 8.0 also includes an IPv6-enabled initscript package, but a minor bug still prevents usage (“ifconfig” misses “inet6” before “add”). -Test for IPv6 support of network configuration scripts -You can test, whether your Linux distribution contain support for persistent IPv6 configuration using my set. Following script library should exist: -Auto-magically test: -The version of the library is important if you miss some features. You can get it executing following (or easier look at the top of the file): -In shown example, the used version is 20011124. Check this against latest information on initscripts-ipv6 homepage (Mirror) to see what has been changed. You will find there also a change-log. -Short hint for enabling IPv6 on current RHL 7.1, 7.2, 7.3, ... - -Check whether running system has already IPv6 module loaded - -If result is “off”, then enable IPv6 networking by editing /etc/sysconfig/network, add following new line - -Reboot or restart networking using - -Now IPv6 module should be loaded -If your system is on a link which provides router advertisement, autoconfiguration will be done automatically. For more information which settings are supported see /usr/share/doc/initscripts-$version/sysconfig.txt. -SuSE Linux -In newer 7.x versions there is a really rudimentary support available, see /etc/rc.config for details. -Because of the really different configuration and script file structure it is hard (or impossible) to use the set for Red Hat Linux and clones with this distribution. -In versions 8.x they completly change their configuration setup. -SuSE Linux 7.3 - -How to setup 6to4 IPv6 with SuSE 7.3 -SuSE Linux 8.0 - -IPv6 address configuration -Edit file /etc/sysconfig/network/ifcfg-<Interface-Name> and setup following value -/" -]]> -Additional information -See file /usr/share/doc/packages/sysconfig/README -SuSE Linux 8.1 - -IPv6 address configuration -Edit file /etc/sysconfig/network/ifcfg-<Interface-Name> and setup following value -/" -]]> -Additional information -See file /usr/share/doc/packages/sysconfig/Network -<!-- anchor id="Configuration-Debian-Linux" -->Debian Linux -Following information was contributed by Stephane Bortzmeyer <bortzmeyer at nic dot fr> -Be sure that IPv6 is loaded, either because it is compiled into the kernel or because the module is loaded. For the latest, three solutions, adding it to /etc/modules, using the pre-up trick shown later or using kmod (not detailed here).Configure your interface. Here we assume eth0 and address (2001:0db8:1234:5::1:1). Edit /etc/network/interfaces: - /proc/sys/net/ipv6/conf/all/autoconf - netmask 64 - # The router is autoconfigured and has no fixed address. - # It is magically - # found. (/proc/sys/net/ipv6/conf/all/accept_ra). Otherwise: - #gateway 2001:0db8:1234:5::1 -]]>And you reboot or you just -and you have your static address. -Further information - -IPv6 with Debian LinuxJean-Marc V. Liotier's HOWTO for Freenet6 & Debian Users (announced 24.12.2002 on mailinglist users@ipv6.org ) -<!-- anchor id="chapter-autoconfiguration" -->Auto-configuration - -Stateless auto-configuration -Is supported and seen on the assigned link-local address after an IPv6-enabled interface is up. -Example: - mtu 1500 qlen1000 - inet6 fe80::211:d8ff:fe6b:f0f5/64 scope link - valid_lft forever preferred_lft forever -]]> -Stateful auto-configuration using Router Advertisement Daemon (radvd) -to be filled. See radvd daemon autoconfiguration below. -Dynamic Host Configuration Protocol v6 (DHCPv6) -After a long time discussing issues, finally RFC 3315 / Dynamic Host Configuration Protocol for IPv6 (DHCPv6) was finished. At time updating this part (10/2005) currently two implementations are available: -Dibbler by Tomasz Mrugalski <thomson at klub dot com dot pl> (Hints for configuration)DHCPv6 on Sourceforge (Hints for configuration)ISC DHCP (Hints for configuration) -<!-- anchor id="chapter-mobility" -->Mobility - -Common information - -Node Mobility -Support for IPv6 mobility can be enabled in Linux by installing the MIPL2 implementation found at: http://www.mobile-ipv6.org/ -This implementation is compliant with RFC 3775. It is composed of a kernel patch and a mobility daemon called mip6d. Version 2.0.1 applies on Linux kernel 2.6.15. -Installation and setup are described in the Linux Mobile IPv6 HOWTO. -Network Mobility -There also exists an implementation of network mobility for Linux, it is called NEPL and is based on MIPL. It can also be downloaded from: http://www.mobile-ipv6.org/. -The HOWTO document describing setup and configuration is available at: http://www.nautilus6.org/doc/nepl-howto/. -Links - -Mobile IPv6 for Linux (MIPL) project: http://www.mobile-ipv6.org/Nautilus6 working group: http://nautilus6.org/Fast Handovers for Mobile IPv6 for Linux project: http://www.fmipv6.org/USAGI-patched Mobile IPv6 for Linux (UMIP):http://umip.linux-ipv6.org/Deploying IPsec/IKE-protected MIPv6 under Linux:http://natisbad.org/MIPv6/RFC 3775 / Mobility Support in IPv6RFC 3776 / Using IPsec to Protect Mobile IPv6 Signaling Between Mobile Nodes and Home AgentsRFC 3963 / Network Mobility (NEMO)RFC 4068 / Fast Handovers for Mobile IPv6RFC 4423 / Host Identity Protocol (HIP) ArchitectureRFC 5201 / Host Identity ProtocolHIP implementations: http://infrahip.hiit.fi/, http://hip4inter.net/, http://www.openhip.org/ -<!-- anchor id="chapter-firewalling-security" -->Firewalling -IPv6 firewalling is important, especially if using IPv6 on internal networks with global IPv6 addresses. Because unlike at IPv4 networks where in common internal hosts are protected automatically using private IPv4 addresses like RFC 1918 / Address Allocation for Private Internets or Automatic Private IP Addressing (APIPA)Google search for Microsoft + APIPA, in IPv6 normally global addresses are used and someone with IPv6 connectivity can reach all internal IPv6 enabled nodes. -<!-- anchor id="firewalling-netfilter6." -->Firewalling using netfilter6 -Native IPv6 firewalling is only supported in kernel versions 2.4+. In older 2.2- you can only filter IPv6-in-IPv4 by protocol 41. -Attention: no warranty that described rules or examples can really protect your system! -Audit your ruleset after installation, see for more. -Since kernel version 2.6.20 IPv6 connection tracking is fully working (and does not break IPv4 NAT anymore like versions before) -More information - -Netfilter projectmaillist archive of netfilter usersmaillist archive of netfilter developersUnofficial status informations -Preparation -This step is only needed if distributed kernel and netfilter doesn't fit your requirements and new features are available but still not built-in. -Get sources -Get the latest kernel source: http://www.kernel.org/ -Get the latest iptables package: -Source tarball (for kernel patches): http://www.netfilter.org/ -Extract sources -Change to source directory: -Unpack and rename kernel sources -Unpack iptables sources - -Apply latest iptables/IPv6-related patches to kernel source -Change to iptables directory -Apply pending patches -Apply additional IPv6 related patches (still not in the vanilla kernel included) -Say yes at following options (iptables-1.2.2) -ah-esp.patch masq-dynaddr.patch (only needed for systems with dynamic IP assigned WAN connections like PPP or PPPoE) ipv6-agr.patch.ipv6 ipv6-ports.patch.ipv6 LOG.patch.ipv6 REJECT.patch.ipv6 Check IPv6 extensions - -Configure, build and install new kernel -Change to kernel sources -Edit Makefile -Run configure, enable IPv6 related -Configure other related to your system, too -Compilation and installing: see the kernel section here and other HOWTOs -Rebuild and install binaries of iptables -Make sure, that upper kernel source tree is also available at /usr/src/linux/ -Rename older directory -Create a new softlink -Rebuild SRPMS -Install new iptables packages (iptables + iptables-ipv6) -On RH 7.1 systems, normally, already an older version is installed, therefore use "freshen" - -If not already installed, use "install" - -On RH 6.2 systems, normally, no kernel 2.4.x is installed, therefore the requirements don't fit. Use "--nodeps" to install it -Perhaps it's necessary to create a softlink for iptables libraries where iptables looks for them - -Usage - -Check for support -Load module, if so compiled -Check for capability - -Learn how to use ip6tables - -List all IPv6 netfilter entries - -Short - -Extended - -List specified filter - - -Insert a log rule at the input filter with options - - -Insert a drop rule at the input filter - - -Delete a rule by number - - -Enable connection tracking -Since kernel version 2.6.20 IPv6 connection tracking is well supported and should be used instead of using stateless filter rules. - -Allow ICMPv6 -Using older kernels (unpatched kernel 2.4.5 and iptables-1.2.2) no type can be specified -Accept incoming ICMPv6 through tunnels - -Allow outgoing ICMPv6 through tunnels -Newer kernels allow specifying of ICMPv6 types: - -Rate-limiting -Because it can happen (author already saw it to times) that an ICMPv6 storm will raise up, you should use available rate limiting for at least ICMPv6 ruleset. In addition logging rules should also get rate limiting to prevent DoS attacks against syslog and storage of log file partition. An example for a rate limited ICMPv6 looks like: - -Allow incoming SSH -Here an example is shown for a ruleset which allows incoming SSH connection from a specified IPv6 address -Allow incoming SSH from 2001:0db8:100::1/128 - -Allow response packets (no longer needed if connection tracking is used!) - -Enable tunneled IPv6-in-IPv4 -To accept tunneled IPv6-in-IPv4 packets, you have to insert rules in your IPv4 firewall setup relating to such packets, for example -Accept incoming IPv6-in-IPv4 on interface ppp0 - -Allow outgoing IPv6-in-IPv4 to interface ppp0 -If you have only a static tunnel, you can specify the IPv4 addresses, too, like -Accept incoming IPv6-in-IPv4 on interface ppp0 from tunnel endpoint 192.0.2.2 - -Allow outgoing IPv6-in-IPv4 to interface ppp0 to tunnel endpoint 1.2.3.4 - -Protection against incoming TCP connection requests -VERY RECOMMENDED! For security issues you should really insert a rule which blocks incoming TCP connection requests. Adapt "-i" option, if other interface names are in use! -Block incoming TCP connection requests to this host - -Block incoming TCP connection requests to hosts behind this router -Perhaps the rules have to be placed below others, but that is work you have to think about it. Best way is to create a script and execute rules in a specified way. -Protection against incoming UDP connection requests -ALSO RECOMMENDED! Like mentioned on my firewall information it's possible to control the ports on outgoing UDP/TCP sessions. So if all of your local IPv6 systems are using local ports e.g. from 32768 to 60999 you are able to filter UDP connections also (until connection tracking works) like: -Block incoming UDP packets which cannot be responses of outgoing requests of this host - -Block incoming UDP packets which cannot be responses of forwarded requests of hosts behind this router - -Examples - -Simple example for Fedora -Following lines show a simple firewall configuration for Fedora 6 (since kernel version 2.6.20). It was modfied from the default one (generated by system-config-firewall) for supporting connection tracking and return the proper ICMPv6 code for rejects. Incoming SSH (port 22) connections are allowed. -For completeness also the IPv4 configuration is shown here: -Usage: -Create/modify the configuration filesActivate IPv4 & IPv6 firewalling - -Enable automatic start after reboot - -Sophisticated example -Following lines show a more sophisticated but still stateless filter setup as an example. Happy netfilter6 ruleset creation.... - -<!-- anchor id="chapter-security" -->Security - -Node security -It's very recommended to apply all available patches and disable all not necessary services. Also bind services to the needed IPv4/IPv6 addresses only and install local firewalling. -More to be filled... -Access limitations -Many services uses the tcp_wrapper library for access control. Below is described the use of tcp_wrapper. -More to be filled... -<!-- anchor id="IPv6-security-auditing" -->IPv6 security auditing -Currently there are no comfortable tools out which are able to check a system over network for IPv6 security issues. Neither Nessus nor any commercial security scanner is as far as I know able to scan IPv6 addresses. -Legal issues -ATTENTION: always take care that you only scan your own systems or after receiving a written order, otherwise legal issues are able to come up to you. -CHECK destination IPv6 addresses TWICE before starting a scan. -Security auditing using IPv6-enabled netcat -With the IPv6-enabled netcat (see IPv6+Linux-status-apps/security-auditing for more) you can run a portscan by wrapping a script around which run through a port range, grab banners and so on. Usage example: - -Security auditing using IPv6-enabled nmap -NMap, one of the best portscaner around the world, supports IPv6 since version 3.10ALPHA1. Usage example: - -Security auditing using IPv6-enabled strobe -Strobe is a (compared to NMap) more a low budget portscanner, but there is an IPv6-enabling patch available (see IPv6+Linux-status-apps/security-auditing for more). Usage example: -. -::1 2401 unassigned unknown -::1 22 ssh Secure Shell - RSA encrypted rsh -::1 515 printer spooler (lpd) -::1 6010 unassigned unknown -::1 53 domain Domain Name Server -]]>Note: strobe isn't really developed further on, the shown version number isn't the right one. -Audit results -If the result of an audit mismatch your IPv6 security policy, use IPv6 firewalling to close the holes, e.g. using netfilter6 (see Firewalling/Netfilter6 for more). -Info: More detailed information concerning IPv6 Security can be found here: -IETF drafts - IPv6 Operations (v6ops)RFC 3964 / Security Considerations for 6to4 -<!-- anchor id="chapter-encryption-authentication" -->Encryption and Authentication -Unlike in IPv4, encryption and authentication is a mandatory feature of IPv6. Those features are normally implemented using IPsec (which can be also used by IPv4). -Modes of using encryption and authentication -Two modes of encryption and authentication of a connection are possible: -Transport mode -Transport mode is a real end-to-end connection mode. Here, only the payload (usually ICMP, TCP or UDP) is encrypted with their particular header, while the IP header is not encrypted (but usually included in authentication). -Using AES-128 for encryption and SHA1 for authentication, this mode decreases the MTU by 42 octets. -Tunnel mode -Tunnel mode can be used either for end-to-end or for gateway-to-gateway connection modes. Here, the complete IP packet is being encrypted and gets a new IP header prepended, all together constituing a new IP packet (this mechanism is also known as "encapsulation") -This mode usually decreases the MTU by 40 octets from the MTU of transport mode. I.e. using AES-128 for encryption and SHA1 for authentication 82 octets less than the normal MTU. -Support in kernel (ESP and AH) - -Support in vanilla Linux kernel 2.4.x -At the time of writing missing in vanilla up to 2.4.28. There was an issue about keeping the Linux kernel source free of export/import-control-laws regarding encryption code. This is also one case why FreeS/WAN project wasn't included in vanilla source. Perhaps a backport from 2.6.x will be done in the future. -Support in vanilla Linux kernel 2.6.x -Current versions (as time of writing 2.6.9 and upper) support native IPsec for IPv4 and IPv6. -Implementation was helped by the USAGI project. -Automatic key exchange (IKE) -IPsec requires a key exchange of a secret. This is mostly done automatically by so called IKE daemons. They also handle the authentication of the peers, either by a common known secret (so called “pre-shared secret”) or by RSA keys (which can also be used from X.509 certificates). -Currently, two different IKE daemons are available for Linux, which totally differ in configuration and usage. -I prefer “pluto” from the *S/WAN implementation because of the easier and one-config-only setup. -IKE daemon “racoon” -The IKE daemon “racoon” is taken from the KAME project and ported to Linux. Modern Linux distributions contain this daemon in the package “ipsec-tools”. Two executables are required for a proper IPsec setup. Take a look on Linux Advanced Routing & Traffic Control HOWTO / IPSEC, too. -Manipulation of the IPsec SA/SP database with the tool “setkey” -“setkey” is important to define the security policy (SP) for the kernel. -File: /etc/racoon/setkey.sh -Example for an end-to-end encrypted connection in transport mode - -Example for a end-to-end encrypted connection in tunnel mode -For the other peer, you have to replace “in” with “out”. -Configuration of the IKE daemon “racoon” -“racoon” requires a configuration file for proper execution. It includes the related settings to the security policy, which should be set up previously using “setkey”. -File: /etc/racoon/racoon.conf -Also set up the pre-shared secret: -File: /etc/racoon/psk.txt - -Running IPsec with IKE daemon “racoon” -At least the daemon needs to be started. For the first time, use debug and foreground mode. The following example shows a successful IKE phase 1 (ISAKMP-SA) and 2 (IPsec-SA) negotiation: -2001:db8:2:2::2[500] -2005-01-01 20:31:06: INFO: begin Identity Protection mode. -2005-01-01 20:31:09: INFO: ISAKMP-SA established -¬ 2001:db8:1:1::1[500]-2001:db8:2:2::2[500] spi:da3d3693289c9698:ac039a402b2db401 -2005-01-01 20:31:09: INFO: initiate new phase 2 negotiation: -¬ 2001:6f8:900:94::2[0]<=>2001:db8:2:2::2[0] -2005-01-01 20:31:10: INFO: IPsec-SA established: -¬ ESP/Tunnel 2001:db8:2:2::2->2001:db8:1:1::1 spi=253935531(0xf22bfab) -2005-01-01 20:31:10: INFO: IPsec-SA established: -¬ ESP/Tunnel 2001:db8:1:1::1->2001:db8:2:2::2 spi=175002564(0xa6e53c4) -]]>Each direction got its own IPsec-SA (like defined in the IPsec standard). With “tcpdump” on the related interface, you will see as result of an IPv6 ping: - 2001:db8:2:2::2: ESP(spi=0x0a6e53c4,seq=0x3) -20:35:55.537522 2001:db8:2:2::2 > 2001:db8:1:1::1: ESP(spi=0x0f22bfab,seq=0x3) -]]>As expected, the negotiated SPIs are being used here. -And using “setkey”, current active parameters are shown: - -IKE daemon “pluto” -The IKE daemon “pluto” is included in distributions of the *S/WAN projects. *S/WAN project starts at the beginning as FreeS/WAN. Unfortunately, the FreeS/WAN project stopped further development in 2004. Because of the slow pace of development in the past, two spin-offs started: strongSwan and Openswan. Today, readily installable packages are available for at least Openswan (included in Fedora Core 3). -A major difference to “racoon”, only one configuration file is required. Also, an initscript exists for automatic setup after booting. -Configuration of the IKE daemon “pluto” -The configuration is very similar to the IPv4 one, only one important option is necessary. -File: /etc/ipsec.conf -Don't forget to define the pre-shared secret here also. -File: /etc/ipsec.secrets - -Running IPsec with IKE daemon “pluto” -If installation of Openswan was successfully, an initscript should exist for starting IPsec, simply run (on each peer): -Afterwards, start this connection on one peer. If you saw the line “IPsec SA established”, all worked fine. -0xa98b7710 <0xa51e1f22} -]]>Because *S/WAN and setkey/racoon do use the same IPsec implementation in Linux 2.6.x kernel, “setkey” can be used here too to show current active parameters: - -Additional informations: -On Linux Kernel 2.6.x you can get the policy and status of IPsec also using “ip”: - -<!-- anchor id="chapter-qos" -->Quality of Service (QoS) -IPv6 supports QoS with use of Flow Labels and Traffic Classes. -Additional infos: -RFC 3697 / IPv6 Flow Label Specification -General -Proper working QoS is only possible on the outgoing interface of a router or host, where the bottleneck begins. Everything else is a hickup and not subject to work as expected or has a successful result. -------- - Queue 1 \ - --->--- ---->--------->--------->--------------- -Big pipe Queue 2 Queue 1 / Queue 2 / Queue 3 Thin Pipe - --->---- ---->--------->--------->--------------- - Queue 3 / --------------->------- -]]> -Linux QoS using “tc” -Linux is using “tc” from the “iproute2” package to configure traffic shaping, generally described in the Linux Advanced Routing & Traffic Control HOWTO. -Example for a constant bitrate queuing -With the “cbq” scheduler, pipes with constant bit rates can be defined. -Root qdisc definition -Define root qdisc with a bandwidth of 1000 MBit/s on eth1 - -QoS class definition -Define a class 1:1 with 1 MBit/s -Define a class 1:2 with 50 MBit/s -Define a class 1:3 with 10 MBit/s -Define a class 1:4 with 200 kBit/s - -QoS filter definition -Define a filter for IPv4 (protocol ip), TCP (match ip protocol 6 0xff) destination port 5001 (match ip dport 5001 0xffff) using class 1:2 from above -Define a filter for IPv6 (protocol ip), TCP (match ip6 protocol 6 0xff) destination port 5001 using class 1:2 from above -Define a filter for IPv6 for packets having flow label 12345 (match ip6 flowlabel 12345 0x3ffff) using class 1:3 from above -Define a filter for IPv6 for packets having Linux iptables mark 32 (handle 32 fw) specified using class 1:4 from above -The last filter definition requires an entry in the ip6tables to mark a packet - -Testing filter definitions using iperf -Start on server side each one one separate console: -Start on client side and compare results: -> 50 MBit/s && <= 1000 MBit/s) -# iperf -V -c SERVER-IPv6 -p 5002 (expected: >> 50 MBit/s && <= 1000 MBit/s) -# iperf -V -c SERVER-IPv4 -p 5003 (expected: >> 50 MBit/s && <= 1000 MBit/s) -# iperf -V -c SERVER-IPv6 -p 5003 (expected: 200 kBit/s) -]]>The rate result should be as defined in the classes (see above), the results on port 5002 should be very similar independend from used IP version. -<!-- anchor id="chapter-hints-daemons" -->Hints for IPv6-enabled daemons -Here some hints are shown for IPv6-enabled daemons. -<!-- anchor id="hints-daemons-bind" -->Berkeley Internet Name Domain (BIND) daemon “named” -IPv6 is supported since version 9. Always use newest available version. At least version 9.1.3 must be used, older versions can contain remote exploitable security holes. -Listening on IPv6 addresses -Note: unlike in IPv4 current versions doesn't allow to bind a server socket to dedicated IPv6 addresses, so only any or none are valid. Because this can be a security issue, check the Access Control List (ACL) section below, too! -Enable BIND named for listening on IPv6 address -To enable IPv6 for listening, following options are requested to change -This should result after restart in e.g. -And a simple test looks like -and should show you a result. -Disable BIND named for listening on IPv6 address -To disable IPv6 for listening, following options are requested to change - -IPv6 enabled Access Control Lists (ACL) -IPv6 enabled ACLs are possible and should be used whenever it's possible. An example looks like following: -This ACLs can be used e.g. for queries of clients and transfer zones to secondary name-servers. This prevents also your caching name-server to be used from outside using IPv6. -It's also possible to set the allow-query and allow-transfer option for most of single zone definitions, too. -Sending queries with dedicated IPv6 address -This option is not required, but perhaps needed: - port ; -]]> -Per zone defined dedicated IPv6 addresses -It's also possible to define per zone some IPv6 addresses. -Transfer source address -Transfer source address is used for outgoing zone transfers: - [port port]; -]]> -Notify source address -Notify source address is used for outgoing notify messages: - [port port]; -]]> -IPv6 DNS zone files examples -Some information can be also found at IPv6 DNS Setup Information (article). Perhaps also helpful is the IPv6 Reverse DNS zone builder for BIND 8/9 (webtool). -Serving IPv6 related DNS data -For IPv6 new types and root zones for reverse lookups are defined: -AAAA and reverse IP6.INT: specified in RFC 1886 / DNS Extensions to support IP version 6, usable since BIND version 4.9.6A6, DNAME (DEPRECATED NOW!) and reverse IP6.ARPA: specified in RFC 2874 / DNS Extensions to Support IPv6 Address Aggregation and Renumbering, usable since BIND 9, but see also an information about the current state at Domain Name System Extension (dnsext)Perhaps filled later more content, for the meantime take a look at given RFCs and -AAAA and reverse IP6.INT: IPv6 DNS Setup InformationA6, DNAME (DEPRECATED NOW!) and reverse IP6.ARPA: take a look into chapter 4 and 6 of the BIND 9 Administrator Reference Manual (ARM) distributed with the bind-package or get this here: BIND manual version 9.3Because IP6.INT is deprecated (but still in use), a DNS server which will support IPv6 information has to serve both reverse zones. -Current best practice -Because there are some troubles around using the new formats, current best practice is: -Forward lookup support: -AAAAReverse lookup support: -Reverse nibble format for zone ip6.int (FOR BACKWARD COMPATIBILITY)Reverse nibble format for zone ip6.arpa (RECOMMENDED) -Checking IPv6-enabled connect -To check, whether BIND named is listening on an IPv6 socket and serving data see following examples. -IPv6 connect, but denied by ACL -Specifying a dedicated server for the query, an IPv6 connect can be forced: -Related log entry looks like following: -If you see such entries in the log, check whether requests from this client should be allowed and perhaps review your ACL configuration. -Successful IPv6 connect -A successful IPv6 connect looks like following: - -<!-- anchor id="hints-daemons-xinetd" -->Internet super daemon (xinetd) -IPv6 is supported since xinetd version around 1.8.9. Always use newest available version. At least version 2.3.3 must be used, older versions can contain remote exploitable security holes. -Some Linux distribution contain an extra package for the IPv6 enabled xinetd, some others start the IPv6-enabled xinetd if following variable is set: NETWORKING_IPV6="yes", mostly done by /etc/sysconfig/network (only valid for Red Hat like distributions). In newer releases, one binary supports IPv4 and IPv6. -If you enable a built-in service like e.g. daytime by modifying the configuration file in /etc/xinetd.d/daytime like -After restarting the xinetd you should get a positive result like: -Shown example also displays an IMAP and IMAP-SSL IPv4-only listening xinetd. -Note: earlier versions had a problem that an IPv4-only xinetd won't start on an IPv6-enabled node and also the IPv6-enabled xinetd won't start on an IPv4-only node. This is known to be fixed in later versions, at least version 2.3.11. -<!-- anchor id="hints-daemons-apache2." -->Webserver Apache2 (httpd2) -Apache web server supports IPv6 native by maintainers since 2.0.14. Available patches for the older 1.3.x series are not current and shouldn't be used in public environment, but available at KAME / Misc. -Listening on IPv6 addresses -Note: virtual hosts on IPv6 addresses are broken in versions until 2.0.28 (a patch is available for 2.0.28). But always try latest available version first because earlier versions had some security issues. -Virtual host listen on an IPv6 address only - - - ServerName ipv6only.yourdomain.yourtopleveldomain - # ...sure more config lines - -]]> -Virtual host listen on an IPv6 and on an IPv4 address - - - ServerName ipv6andipv4.yourdomain.yourtopleveldomain - # ...sure more config lines - -]]>This should result after restart in e.g. -For simple tests use the telnet example already shown. -Additional notes - -Apache2 supports a method called “sendfile” to speedup serving data. Some NIC drivers also support offline checksumming. In some cases, this can lead to connection problems and invalid TCP checksums. In this cases, disable “sendfile” either by recompiling using configure option “--without-sendfile” or by using the "EnableSendfile off" directive in configuration file. -<!-- anchor id="hints-daemons-radvd" -->Router Advertisement Daemon (radvd) -The router advertisement daemon is very useful on a LAN, if clients should be auto-configured. The daemon itself should run on the Linux default IPv6 gateway router (it's not required that this is also the default IPv4 gateway, so pay attention who on your LAN is sending router advertisements). -You can specify some information and flags which should be contained in the advertisement. Common used are -Prefix (needed)Lifetime of the prefixFrequency of sending advertisements (optional)After a proper configuration, the daemon sends advertisements through specified interfaces and clients are hopefully receive them and auto-magically configure addresses with received prefix and the default route. -Configuring radvd - -Simple configuration -Radvd's config file is normally /etc/radvd.conf. An simple example looks like following: -This results on client side in - mtu 1500 qdisc pfifo_fast qlen 100 - inet6 2001:0db8:100:f101:2e0:12ff:fe34:1234/64 scope global dynamic - valid_lft 2591992sec preferred_lft 604792sec - inet6 fe80::2e0:12ff:fe34:1234/10 scope link -]]>Because no lifetime was defined, a very high value was used. -Special 6to4 configuration -Version since 0.6.2pl3 support the automatic (re)-generation of the prefix depending on an IPv4 address of a specified interface. This can be used to distribute advertisements in a LAN after the 6to4 tunneling has changed. Mostly used behind a dynamic dial-on-demand Linux router. Because of the sure shorter lifetime of such prefix (after each dial-up, another prefix is valid), the lifetime configured to minimal values: -This results on client side in (assuming, ppp0 has currently 1.2.3.4 as local IPv4 address): - mtu 1500 qdisc pfifo_fast qlen 100 - inet6 2002:0102:0304:f101:2e0:12ff:fe34:1234/64 scope global dynamic - valid_lft 22sec preferred_lft 12sec - inet6 fe80::2e0:12ff:fe34:1234/10 scope link -]]>Because a small lifetime was defined, such prefix will be thrown away quickly, if no related advertisement was received. -Additional note: if you do not used special 6to4 support in initscripts, you have to setup a special route on the internal interface on the router, otherwise you will get some backrouting problems. for the example showh here: -This route needs to be replaced every time the prefix changes, which is the case after a new IPv4 address was assigned to the dial-up interface. -Debugging -A program called “radvdump” can help you looking into sent or received advertisements. Simple to use: -Output shows you each advertisement package in readable format. You should see your configured values here again, if not, perhaps it's not your radvd which sends the advertisement...look for another router on the link (and take the LLAddress, which is the MAC address for tracing). -<!-- anchor id="hints-daemons-dhcpv6." -->Dynamic Host Configuration v6 Server (dhcp6s) -DHCPv6 can be used for stateful configurations. The daemon itself need not necessary run on the Linux default IPv6 gateway router. -You can specify more information than by using radvd. The are most similar to IPv4 DHCP server. -After a proper configuration, the daemon reacts on received ICMPv6 multicast packets sent by a client to address ff02::1:2 -Configuration of the DHCPv6 server (dhcp6s) - -Simple configuration -dhcp6s's config file is normally /etc/dhcp6s.conf. An simple example looks like following: - -Configuration of the DHCPv6 client (dhcp6c) - -Simple configuration -dhcp6c's config file is normally /etc/dhcp6c.conf. An simple example looks like following: - -Usage - -dhcpv6_server -Start server, e.g. - -dhcpv6_client -Start client in foreground, e.g. - -Debugging - -dhcpv6_server -The server has one foreground and two debug toggles (both should be used for debugging), here is an example: - -dhcpv6_client -As general debugging for test whether the IPv6 DHCP server is reable on the link use an IPv6 ping to the DHCP multicast address: -The client has one foreground and two debug toggles, here is an example: -Note that the netlink error messages have no impact. -<!-- anchor id="hints-daemons-isc-dhcp" -->ISC Dynamic Host Configuration Server (dhcpd) -ISC DHCP supports IPv6 since version 4.x. -Configuration of the ISC DHCP server for IPv6 (dhcpd) -Note that currently, the ISC DHCP server can only serve IPv4 or IPv6, means you have to start the daemon twice (for IPv6 with option “-6”) to support both protocols. -Simple configuration -Create a dedicated configuration file /etc/dhcp/dhcpd6.conf for the IPv6 part of the dhcpd. Note, that the router requires to have a interface configured with an IPv6 address out of the defined subnet. -Note that the “dhcp.client-id” no longer belongs to a MAC address, an unique ID is used instead! “dhcp6c” (see above) uses the file /var/lib/dhcpv6/dhcp6c_duid (would be created during first start, if not existing) as unique identity. It's a 14 byte long identifier, starting with a 2 byte length information (usually “0x000e”): - -Usage - -dhcpd -Start server in foreground: - -<!-- anchor id="hints-daemons-dibbler" -->DHCP Server Dibbler -Dibbler is also a DHCP server -Configuration of the Dibbler DHCP server for IPv6 - -Simple configuration -Create a dedicated configuration file /etc/dibbler/server.conf . Note, that the router requires to have a interface configured with an IPv6 address out of the defined subnet. - -Usage - -dibbler-server -Start server in foreground: -,Marek Senderski -| Licence : GNU GPL v2 only. Developed at Gdansk University of Technology. -| Homepage: http://klub.com.pl/dhcpv6/ -2009.05.28 10:18:48 Server Notice My pid (1789) is stored in /var/lib/dibbler/server.pid -2009.05.28 10:18:48 Server Notice Detected iface eth0/3, MAC=54:52:00:01:23:45. -2009.05.28 10:18:48 Server Notice Detected iface eth1/2, MAC=54:52:00:67:89:ab. -2009.05.28 10:18:48 Server Notice Detected iface lo/1, MAC=00:00:00:00:00:00. -2009.05.28 10:18:48 Server Debug Skipping database loading. -2009.05.28 10:18:48 Server Debug Cache:server-cache.xml file: parsing started, expecting 0 entries. -2009.05.28 10:18:48 Server Notice Parsing /etc/dibbler/server.conf config file... -18:48 Server Debug Setting 0 generic option(s). -18:48 Server Debug 0 per-client configurations (exceptions) added. -18:48 Server Debug Parsing /etc/dibbler/server.conf done. -18:48 Server Info 0 client class(es) defined. -18:48 Server Debug 1 interface(s) specified in /etc/dibbler/server.conf -18:48 Server Info Mapping allow, deny list to class 0:0 allow/deny entries in total. -18:48 Server Info Interface eth1/2 configuration has been loaded. -18:48 Server Notice Running in stateful mode. -18:48 Server Info My DUID is 00:01:00:01:11:aa:6d:a7:54:52:00:67:89:ab. -18:48 Server Notice Creating multicast (ff02::1:2) socket on eth1/2 (eth1/2) interface. -18:48 Server Debug Cache: size set to 1048576 bytes, 1 cache entry size is 87 bytes, so maximum 12052 address-client pair(s) may be cached. -18:48 Server Notice Accepting connections. Next event in 4294967295 second(s). -]]> -<!-- anchor id="hints-daemons-tcpwrapper" -->tcp_wrapper -tcp_wrapper is a library which can help you to protect service against misuse. -Filtering capabilities -You can use tcp_wrapper for -Filtering against source addresses (IPv4 or IPv6)Filtering against users (requires a running ident daemon on the client) -Which program uses tcp_wrapper -Following are known: -Each service which is called by xinetd (if xinetd is compiled using tcp_wrapper library)sshd (if compiled using tcp_wrapper) -Usage -tcp_wrapper is controlled by two files name /etc/hosts.allow and /etc/hosts.deny. For more information see - -Example for /etc/hosts.allow -In this file, each service which should be positive filtered (means connects are accepted) need a line. -Note: there are broken implementations around, which uses following broken IPv6 network description: [2001:0db8:100:200::/64]. Hopefully, such versions will be fixed soon. -Example for /etc/hosts.deny -This file contains all negative filter entries and should normally deny the rest using -If this node is a more sensible one you can replace the standard line above with this one, but this can cause a DoS attack (load of mailer and spool directory), if too many connects were made in short time. Perhaps a logwatch is better for such issues. - -Logging -Depending on the entry in the syslog daemon configuration file /etc/syslog.conf the tcp_wrapper logs normally into /var/log/secure. -Refused connection -A refused connection via IPv4 to an xinetd covered daytime service produces a line like following example -A refused connection via IPv4 to an dual-listen sshd produces a line like following example - -Permitted connection -A permitted connection via IPv4 to an xinetd covered daytime service produces a line like following example -A permitted connection via IPv4 to an dual-listen sshd produces a line like following example - -<!-- anchor id="hints-daemons-vsftpd" -->vsftpd - -Listening on IPv6 addresses -Edit the configuration file, ususally /etc/vsftpd/vsftpd.conf, and adjust the listen option like -That's all. -<!-- anchor id="hints-daemons-proftpd" -->proftpd - -Listening on IPv6 addresses -Edit the configuration file, ususally /etc/proftpd.conf, but take care, not 100% logical in virtual host setup - - ... - Bind 2001:0DB8::1 - ... - -]]>That's all. -<!-- anchor id="hints-daemons-others" -->Other daemons -Nowadays it's mostly simple, look for either a command line option or a configuration value to enable IPv6 listening. See manual page of the daemon or check related FAQs. It can happen that you can bind a daemon only to the IPv6-“any”-address (::) and not to bind to a dedicated IPv6 address, because the lack of support (depends on that what the programmer has implemented so far...). -<!-- anchor id="chapter-programming" -->Programming - -<!-- anchor id="chapter-section-using-API" --><!-- anchor id="chapter-programming-using-API" -->Programming using C-API -Related RFCs: -RFC 3493 / Basic Socket Interface Extensions for IPv6RFC 3542 / Advanced Sockets Application Program Interface (API) for IPv6Following contents of this section is contributed by John Wenker, Sr. Software Engineer Performance Technologies San Diego, CA USA http://www.pt.com/. - - -This section describes how to write IPv6 client-server applications under the Linux operating system. First thing's first, and credit must be given where it is due. The information contained in this section is derived from Chapters 2 through 4 of IPv6 Network Programming by Jun-ichiro itojun Hagino (ISBN 1-55558-318-0). The reader is encouraged to consult that book for more detailed information. It describes how to convert IPv4 applications to be IPv6 compatible in a protocol-independent way, and describes some of the common problems encountered during the conversion along with suggested solutions. At the time of this writing, this is the only book of which the author is aware that specifically addresses how to program IPv6 applications [since writing this section, the author has also become aware of the Porting applications to IPv6 HowTo by Eva M. Castro at http://jungla.dit.upm.es/~ecastro/IPv6-web/ipv6.html]. Unfortunately, of the almost 360 pages in the book, maybe 60 are actually useful (the chapters mentioned). Nevertheless, without the guidance of that book, the author would have been unable to perform his job duties or compose this HowTo. While most (but certainly not all) of the information in the Hagino book is available via the Linux 'man' pages, application programmers will save a significant amount of time and frustration by reading the indicated chapters of the book rather than searching through the 'man' pages and online documentation. -Other than the Hagino book, any other information presented in this HowTo was obtained through trial and error. Some items or explanations may not be entirely “correct” in the grand IPv6 scheme, but seem to work in practical application. -The discussion that follows assumes the reader is already experienced with the traditional TCP/IP socket API. For more information on traditional socket programming, the Internetworking with TCP/IP series of textbooks by Comer & Stevens is hard to beat, specifically Volume III: Client-Server Programming and Applications, Linux/POSIX Sockets Version (ISBN 0-13-032071-4). This HowTo also assumes that the reader has had at least a bare basic introduction to IPv6 and in particular the addressing scheme for network addresses (see Section 2.3). -Address Structures -This section provides a brief overview of the structures provided in the socket API to represent network addresses (or more specifically transport endpoints) when using the Internet protocols in a client-server application. -IPv4 sockaddr_in -In IPv4, network addresses are 32 bits long and define a network node. Addresses are written in dotted decimal notation, such as 192.0.2.1, where each number represents eight bits of the address. Such an IPv4 address is represented by the struct sockaddr_in data type, which is defined in <netinet/in.h>. -The sin_family component indicates the address family. For IPv4 addresses, this is always set to AF_INET. The sin_addr field contains the 32-bit network address (in network byte order). Finally, the sin_port component represents the transport layer port number (in network byte order). Readers should already be familiar with this structure, as this is the standard IPv4 address structure. -IPv6 sockaddr_in6 -The biggest feature of IPv6 is its increased address space. Instead of 32-bit network addresses, IPv6 allots 128 bits to an address. Addresses are written in colon-hex notation of the form fe80::2c0:8cff:fe01:2345, where each hex number separated by colons represents 16 bits of the address. Two consecutive colons indicate a string of consecutive zeros for brevity, and at most only one double-colon may appear in the address. IPv6 addresses are represented by the struct sockaddr_in6 data type, also defined in <netinet/in.h>. -The sin6_family, sin6_port, and sin6_addr components of the structure have the same meaning as the corresponding fields in the sockaddr_in structure. However, the sin6_family member is set to AF_INET6 for IPv6 addresses, and the sin6_addr field holds a 128-bit address instead of only 32 bits. -The sin6_flowinfo field is used for flow control, but is not yet standardized and can be ignored. -The sin6_scope_id field has an odd use, and it seems (at least to this naïve author) that the IPv6 designers took a huge step backwards when devising this. Apparently, 128-bit IPv6 network addresses are not unique. For example, it is possible to have two hosts, on separate networks, with the same link-local address (see Figure 1). In order to pass information to a specific host, more than just the network address is required; the scope identifier must also be specified. In Linux, the network interface name is used for the scope identifier (e.g. “eth0”) [be warned that the scope identifier is implementation dependent!]. Use the ifconfig(1M) command to display a list of active network interfaces. -A colon-hex network address can be augmented with the scope identifier to produce a "scoped address”. The percent sign ('%') is used to delimit the network address from the scope identifier. For example, fe80::1%eth0 is a scoped IPv6 address where fe80::1 represents the 128-bit network address and eth0 is the network interface (i.e. the scope identifier). Thus, if a host resides on two networks, such as Host B in example below, the user now has to know which path to take in order to get to a particular host. In Figure 1, Host B addresses Host A using the scoped address fe80::1%eth0, while Host C is addressed with fe80::1%eth1. -Getting back to the sockaddr_in6 structure, its sin6_scope_id field contains the index of the network interface on which a host may be found. Server applications will have this field set automatically by the socket API when they accept a connection or receive a datagram. For client applications, if a scoped address is passed as the node parameter to getaddrinfo(3) (described later in this HowTo), then the sin6_scope_id field will be filled in correctly by the system upon return from the function; if a scoped address is not supplied, then the sin6_scope_id field must be explicitly set by the client software prior to attempting to communicate with the remote server. The if_nametoindex(3) function is used to translate a network interface name into its corresponding index. It is declared in <net/if.h>. -Generic Addresses -As any programmer familiar with the traditional TCP/IP socket API knows, several socket functions deal with "generic" pointers. For example, a pointer to a generic struct sockaddr data type is passed as a parameter to some socket functions (such as connect(2) or bind(2)) rather than a pointer to a specific address type. Be careful… the sockaddr_in6 structure is larger than the generic sockaddr structure! Thus, if your program receives a generic address whose actual type is unknown (e.g. it could be an IPv4 address structure or an IPv6 address structure), you must supply sufficient storage to hold the entire address. The struct sockaddr_storage data type is defined in <bits/socket.h> for this purpose [do not #include this file directly within an application; use <sys/socket.h> as usual, and <bits/socket.h> will be implicitly included]. -For example, consider the recvfrom(2) system call, which is used to receive a message from a remote peer. Its function prototype is: -The from parameter points to a generic sockaddr structure. If data can be received from an IPv6 peer on the socket referenced by s, then from should point to a data type of struct sockaddr_storage, as in the following dummy example: -As seen in the above example, ss (a struct sockaddr_storage data object) is used to receive the peer address information, but it's address is typecast to a generic struct sockaddr* pointer in the call to recvfrom(2). -Lookup Functions -Traditionally, hostname and service name resolution were performed by functions such as gethostbyname(3) and getservbyname(3). These traditional lookup functions are still available, but they are not forward compatible to IPv6. Instead, the IPv6 socket API provides new lookup functions that consolidate the functionality of several traditional functions. These new lookup functions are also backward compatible with IPv4, so a programmer can use the same translation algorithm in an application for both the IPv4 and IPv6 protocols. This is an important feature, because obviously a global IPv6 infrastructure isn't going to be put in place overnight. Thus, during the transition period from IPv4 to IPv6, client-server applications should be designed with the flexibility to handle both protocols simultaneously. The example programs at the end of this chapter do just that. -The primary lookup function in the new socket API is getaddrinfo(3). Its prototype is as follows. -The node parameter is a pointer to the hostname or IP address being translated. The referenced string can be a hostname, IPv4 dotted decimal address, or IPv6 colon-hex address (possibly scoped). The service parameter is a pointer to the transport layer's service name or port number. It can be specified as a name found in /etc/services or a decimal number. getaddrinfo(3) resolves the host/service combination and returns a list of address records; a pointer to the list is placed in the location pointed at by res. For example, suppose a host can be identified by both an IPv4 and IPv6 address, and that the indicated service has both a TCP entry and UDP entry in /etc/services. In such a scenario, it is not inconceivable that four address records are returned; one for TCP/IPv6, one for UDP/IPv6, one for TCP/IPv4, and one for UDP/IPv4. -The definition for struct addrinfo is found in <netdb.h> (as is the declaration for getaddrinfo(3) and the other functions described in this section). The structure has the following format: -Consult the 'man' page for getaddrinfo(3) for detailed information about the various fields; this HowTo only describes a subset of them, and only to the extent necessary for normal IPv6 programming. -The ai_family, ai_socktype, and ai_protocol fields have the exact same meaning as the parameters to the socket(2) system call. The ai_family field indicates the protocol family (not the address family) associated with the record, and will be PF_INET6 for IPv6 or PF_INET for IPv4. The ai_socktype parameter indicates the type of socket to which the record corresponds; SOCK_STREAM for a reliable connection-oriented byte-stream or SOCK_DGRAM for connectionless communication. The ai_protocol field specifies the underlying transport protocol for the record. -The ai_addr field points to a generic struct sockaddr object. Depending on the value in the ai_family field, it will point to either a struct sockaddr_in (PF_INET) or a struct sockaddr_in6 (PF_INET6). The ai_addrlen field contains the size of the object pointed at by the ai_addr field. -As mentioned, getaddrinfo(3) returns a list of address records. The ai_next field points to the next record in the list. -The hints parameter to getaddrinfo(3) is also of type struct addrinfo and acts as a filter for the address records returned in res. If hints is NULL, all matching records are returned; but if hints is non-NULL, the referenced structure gives "hints" to getaddrinfo(3) about which records to return. Only the ai_flags, ai_family, ai_socktype, and ai_protocol fields are significant in the hints structure, and all other fields should be set to zero. -Programs can use hints->ai_family to specify the protocol family. For example, if it is set to PF_INET6, then only IPv6 address records are returned. Likewise, setting hints->ai_family to PF_INET results in only IPv4 address records being returned. If an application wants both IPv4 and IPv6 records, the field should be set to PF_UNSPEC. -The hints->socktype field can be set to SOCK_STREAM to return only records that correspond to connection-oriented byte streams, SOCK_DGRAM to return only records corresponding to connectionless communication, or 0 to return both. -For the Internet protocols, there is only one protocol associated with connection-oriented sockets (TCP) and one protocol associated with connectionless sockets (UDP), so setting hints->ai_socktype to SOCK_STREAM or SOCK_DGRAM is the same as saying, "Give me only TCP records," or "Give me only UDP records," respectively. With that in mind, the hints->ai_protocol field isn't really that important with the Internet protocols, and pretty much mirrors the hints->ai_socktype field. Nevertheless, hints->ai_protocol can be set to IPPROTO_TCP to return only TCP records, IPPROTO_UDP to return only UDP records, or 0 for both. -The node or service parameter to gethostbyname(3) can be NULL, but not both. If node is NULL, then the ai_flags field of the hints parameter specifies how the network address in a returned record is set (i.e. the sin_addr or sin6_addr field of the object pointed at by the ai_addr component in a returned record). If the AI_PASSIVE flag is set in hints, then the returned network addresses are left unresolved (all zeros). This is how server applications would use getaddrinfo(3). If the flag is not set, then the address is set to the local loopback address (::1 for IPv6 or 127.0.0.1 for IPv4). This is one way a client application can specify that the target server is running on the same machine as the client. If the service parameter is NULL, the port number in the returned address records remains unresolved. -The getaddrinfo(3) function returns zero on success, or an error code. In the case of an error, the gai_strerror(3) function is used to obtain a character pointer to an error message corresponding to the error code, just like strerror(3) does in the standard 'C' library. -Once the address list is no longer needed, it must be freed by the application. This is done with the freeaddrinfo(3) function. -The last function that will be mentioned in this section is getnameinfo(3). This function is the inverse of getaddrinfo(3); it is used to create a string representation of the hostname and service from a generic struct sockaddr data object. It has the following prototype. -The sa parameter points to the address structure in question, and salen contains its size. The host parameter points to a buffer where the null-terminated hostname string is placed, and the hostlen parameter is the size of that buffer. If there is no hostname that corresponds to the address, then the network address (dotted decimal or colon-hex) is placed in host. Likewise, the serv parameter points to a buffer where the null-terminated service name string (or port number) is placed, and the servlen parameter is the size of that buffer. The flags parameter modifies the function's behavior; in particular, the NI_NUMERICHOST flag indicates that the converted hostname should always be formatted in numeric form (i.e. dotted decimal or colon-hex), and the NI_NUMERICSERV flag indicates that the converted service should always be in numeric form (i.e. the port number). -The symbols NI_MAXHOST and NI_MAXSERV are available to applications and represent the maximum size of any converted hostname or service name, respectively. Use these when declaring output buffers for getnameinfo(3). -Quirks Encountered -Before jumping into the programming examples, there are several quirks in IPv6 of which the reader should be aware. The more significant ones (in addition to the non-uniqueness of IPv6 network addresses already discussed) are described in the paragraphs below. -IPv4 Mapped Addresses -For security reasons that this author won't pretend to understand, "IPv4 mapped addresses" should not be allowed in IPv6-capable server applications. To put it in terms that everyone can understand, this simply means that a server should not accept IPv4 traffic on an IPv6 socket (an otherwise legal operation). An IPv4 mapped address is a mixed-format address of the form: -where the first portion is in IPv6 colon-hex format and the last portion is in IPv4 dotted decimal notation. The dotted decimal IPv4 address is the actual network address, but it is being mapped into an IPv6 compatible format. -To prevent IPv4 mapped addresses from being accepted on an IPv6 socket, server applications must explicitly set the IPV6_V6ONLY socket option on all IPv6 sockets created [the Hagino book implies that this is only a concern with server applications. However, it has been observed during testing that if a client application uses an IPv4 mapped address to specify the target server, and the target server has IPv4 mapped addresses disabled, the connection still completes regardless. On the server side, the connection endpoint is an IPv4 socket as desired; but on the client side, the connection endpoint is an IPv6 socket. Setting the IPV6_V6ONLY socket option on the client side as well as the server side prevents any connection from being established at all.]. There's only one problem. Apparently, IPV6_V6ONLY isn't defined on all systems [or at least it wasn't in 2005 when the Hagino book was written]. The server example at the end of this chapter provides a method for handling this problem. -If IPv4 traffic cannot be handled on IPv6 sockets, then that implies that server applications must open both an IPv4 and IPv6 socket for a particular network service if it wants to handle requests from either protocol. This goes back to the flexibility issue mentioned earlier. If getaddrinfo(3) returns multiple address records, then server applications should traverse the list and open a passive socket for each address provided. -Cannot Specify the Scope Identifier in /etc/hosts -It is possible to assign a hostname to an IPv6 network address in /etc/hosts. For example, the following is an excerpt from the /etc/hosts file on the author's development system. -The "localhost" and "pt141" hostnames can be translated to either an IPv4 or IPv6 network address. So, for example, if "pt141" is passed as the node parameter to getaddrinfo(3), the function returns both an IPv4 and IPv6 address record for the host (assuming the behavior hasn't been modified by the hints parameter). Unfortunately, a scoped address cannot be used in /etc/hosts. Doing so results in getaddrinfo(3) returning only the IPv4 record. -Client & Server Residing on the Same Machine -Suppose a machine has the IPv4 address 192.0.2.1. A client application running on that machine can connect to a server application on the same machine by using either the local loopback address (127.0.0.1) or the network address (192.0.2.1) as the target server. Much to this author's surprise (and dismay), it turns out that an IPv6 client application cannot connect to a server application on the same machine if it uses the network address of that machine as the target; it must use the local loopback address (::1). -Putting It All Together (A Client-Server Programming Example) -Now it's time to put everything discussed thus far together into a sample client-server application. The remainder of this section is devoted to a remote time-of-day application (the 'daytime' Internet service) [I noticed that Ms. Castro used a 'daytime' example in her Porting applications to IPv6 HowTo. For the record, the source code presented here is original, developed from scratch, and any similarity between it and any other publicly available 'daytime' example is purely coincidental.]. The source code presented in this section was developed and tested on a RedHat Linux release using the 2.6 kernel (2.6.9 to be specific). Readers may use the source code freely, so long as proper credit is attributed; but of course the standard disclaimer must be given first:
    -Although the sample source code is believed to be free of errors, the author makes no guarantees as to its reliability, especially considering that some error paths were intentionally omitted for brevity. Use it at your own risk! -
    When you get right down to it, there really aren't that many differences between IPv4 and IPv6 applications. The trick is to code IPv6 applications in a protocol-independent manner, such that they can handle both IPv4 and IPv6 simultaneously and transparently. This sample application does just that. The only protocol-dependent code in the example occurs when printing network addresses in verbose mode; but only after the ai_family field in the addrinfo structure has been checked, so the programs know exactly what type of address they're handling at the time. -'Daytime' Server Code -The server code is found in file tod6d.c (time-of-day IPv6 daemon). Once built, the server may be started using the following command syntax (assuming tod6d is the executable file): -ARGUMENTS: -serviceThe service (or well-known port) on which to listen. Default is "daytime".OPTIONS: --vTurn on verbose mode.The server handles both TCP and UDP requests on the network. The server source code contained in tod6d.c follows: - /* errno declaration & error codes. */ -#include /* getaddrinfo(3) et al. */ -#include /* sockaddr_in & sockaddr_in6 definition. */ -#include /* printf(3) et al. */ -#include /* exit(2). */ -#include /* String manipulation & memory functions. */ -#include /* poll(2) and related definitions. */ -#include /* Socket functions (socket(2), bind(2), etc). */ -#include /* time(2) & ctime(3). */ -#include /* getopt(3), read(2), etc. */ -/* -** Constants. -*/ -#define DFLT_SERVICE "daytime" /* Default service name. */ -#define INVALID_DESC -1 /* Invalid file descriptor. */ -#define MAXCONNQLEN 3 /* Max nbr of connection requests to queue. */ -#define MAXTCPSCKTS 2 /* One TCP socket for IPv4 & one for IPv6. */ -#define MAXUDPSCKTS 2 /* One UDP socket for IPv4 & one for IPv6. */ -#define VALIDOPTS "v" /* Valid command options. */ -/* -** Simple boolean type definition. -*/ -typedef enum { false = 0, true } boolean; -/* -** Prototypes for internal helper functions. -*/ -static int openSckt( const char *service, - const char *protocol, - int desc[ ], - size_t *descSize ); -static void tod( int tSckt[ ], - size_t tScktSize, - int uSckt[ ], - size_t uScktSize ); -/* -** Global (within this file only) data objects. -*/ -static char hostBfr[ NI_MAXHOST ]; /* For use w/getnameinfo(3). */ -static const char *pgmName; /* Program name w/o dir prefix. */ -static char servBfr[ NI_MAXSERV ]; /* For use w/getnameinfo(3). */ -static boolean verbose = false; /* Verbose mode indication. */ -/* -** Usage macro for command syntax violations. -*/ -#define USAGE \ - { \ - fprintf( stderr, \ - "Usage: %s [-v] [service]\n", \ - pgmName ); \ - exit( 127 ); \ - } /* End USAGE macro. */ -/* -** Macro to terminate the program if a system call error occurs. The system -** call must be one of the usual type that returns -1 on error. This macro is -** a modified version of a macro authored by Dr. V. Vinge, SDSU Dept. of -** Computer Science (retired)... best professor I ever had. I hear he writes -** great science fiction in addition to robust code, too. -*/ -#define CHK(expr) \ - do \ - { \ - if ( (expr) == -1 ) \ - { \ - fprintf( stderr, \ - "%s (line %d): System call ERROR - %s.\n", \ - pgmName, \ - __LINE__, \ - strerror( errno ) ); \ - exit( 1 ); \ - } /* End IF system call failed. */ \ - } while ( false ) -/****************************************************************************** -* Function: main -* -* Description: -* Set up a time-of-day server and handle network requests. This server -* handles both TCP and UDP requests. -* -* Parameters: -* The usual argc and argv parameters to a main() function. -* -* Return Value: -* This is a daemon program and never returns. However, in the degenerate -* case where no sockets are created, the function returns zero. -******************************************************************************/ -int main( int argc, - char *argv[ ] ) -{ - int opt; - const char *service = DFLT_SERVICE; - int tSckt[ MAXTCPSCKTS ]; /* Array of TCP socket descriptors. */ - size_t tScktSize = MAXTCPSCKTS; /* Size of uSckt (# of elements). */ - int uSckt[ MAXUDPSCKTS ]; /* Array of UDP socket descriptors. */ - size_t uScktSize = MAXUDPSCKTS; /* Size of uSckt (# of elements). */ - /* - ** Set the program name (w/o directory prefix). - */ - pgmName = strrchr( argv[ 0 ], '/' ); - pgmName = pgmName == NULL ? argv[ 0 ] : pgmName + 1; - /* - ** Process command options. - */ - opterr = 0; /* Turns off "invalid option" error messages. */ - while ( ( opt = getopt( argc, argv, VALIDOPTS ) ) >= 0 ) - { - switch ( opt ) - { - case 'v': /* Verbose mode. */ - { - verbose = true; - break; - } - default: - { - USAGE; - } - } /* End SWITCH on command option. */ - } /* End WHILE processing options. */ - /* - ** Process command line arguments. - */ - switch ( argc - optind ) - { - case 0: break; - case 1: service = argv[ optind ]; break; - default: USAGE; - } /* End SWITCH on number of command line arguments. */ - /* - ** Open both a TCP and UDP socket, for both IPv4 & IPv6, on which to receive - ** service requests. - */ - if ( ( openSckt( service, "tcp", tSckt, &tScktSize ) < 0 ) || - ( openSckt( service, "udp", uSckt, &uScktSize ) < 0 ) ) - { - exit( 1 ); - } - /* - ** Run the time-of-day server. - */ - if ( ( tScktSize > 0 ) || ( uScktSize > 0 ) ) - { - tod( tSckt, /* tod() never returns. */ - tScktSize, - uSckt, - uScktSize ); - } - /* - ** Since tod() never returns, execution only gets here if no sockets were - ** created. - */ - if ( verbose ) - { - fprintf( stderr, - "%s: No sockets opened... terminating.\n", - pgmName ); - } - return 0; -} /* End main() */ -/****************************************************************************** -* Function: openSckt -* -* Description: -* Open passive (server) sockets for the indicated inet service & protocol. -* Notice in the last sentence that "sockets" is plural. During the interim -* transition period while everyone is switching over to IPv6, the server -* application has to open two sockets on which to listen for connections... -* one for IPv4 traffic and one for IPv6 traffic. -* -* Parameters: -* service - Pointer to a character string representing the well-known port -* on which to listen (can be a service name or a decimal number). -* protocol - Pointer to a character string representing the transport layer -* protocol (only "tcp" or "udp" are valid). -* desc - Pointer to an array into which the socket descriptors are -* placed when opened. -* descSize - This is a value-result parameter. On input, it contains the -* max number of descriptors that can be put into 'desc' (i.e. the -* number of elements in the array). Upon return, it will contain -* the number of descriptors actually opened. Any unused slots in -* 'desc' are set to INVALID_DESC. -* -* Return Value: -* 0 on success, -1 on error. -******************************************************************************/ -static int openSckt( const char *service, - const char *protocol, - int desc[ ], - size_t *descSize ) -{ - struct addrinfo *ai; - int aiErr; - struct addrinfo *aiHead; - struct addrinfo hints = { .ai_flags = AI_PASSIVE, /* Server mode. -¬ */ - .ai_family = PF_UNSPEC }; /* IPv4 or IPv6. -¬ */ - size_t maxDescs = *descSize; - /* - ** Initialize output parameters. When the loop completes, *descSize is 0. - */ - while ( *descSize > 0 ) - { - desc[ --( *descSize ) ] = INVALID_DESC; - } - /* - ** Check which protocol is selected (only TCP and UDP are valid). - */ - if ( strcmp( protocol, "tcp" ) == 0 ) /* TCP protocol. */ - { - hints.ai_socktype = SOCK_STREAM; - hints.ai_protocol = IPPROTO_TCP; - } - else if ( strcmp( protocol, "udp" ) == 0 ) /* UDP protocol. */ - { - hints.ai_socktype = SOCK_DGRAM; - hints.ai_protocol = IPPROTO_UDP; - } - else /* Invalid protocol. */ - { - fprintf( stderr, - "%s (line %d): ERROR - Unknown transport " - "layer protocol \"%s\".\n", - pgmName, - __LINE__, - protocol ); - return -1; - } - /* - ** Look up the service's well-known port number. Notice that NULL is being - ** passed for the 'node' parameter, and that the AI_PASSIVE flag is set in - ** 'hints'. Thus, the program is requesting passive address information. - ** The network address is initialized to :: (all zeros) for IPv6 records, or - ** 0.0.0.0 for IPv4 records. - */ - if ( ( aiErr = getaddrinfo( NULL, - service, - &hints, - &aiHead ) ) != 0 ) - { - fprintf( stderr, - "%s (line %d): ERROR - %s.\n", - pgmName, - __LINE__, - gai_strerror( aiErr ) ); - return -1; - } - /* - ** For each of the address records returned, attempt to set up a passive - ** socket. - */ - for ( ai = aiHead; - ( ai != NULL ) && ( *descSize < maxDescs ); - ai = ai->ai_next ) - { - if ( verbose ) - { - /* - ** Display the current address info. Start with the protocol- - ** independent fields first. - */ - fprintf( stderr, - "Setting up a passive socket based on the " - "following address info:\n" - " ai_flags = 0x%02X\n" - " ai_family = %d (PF_INET = %d, PF_INET6 = %d)\n" - " ai_socktype = %d (SOCK_STREAM = %d, SOCK_DGRAM = %d)\n" - " ai_protocol = %d (IPPROTO_TCP = %d, IPPROTO_UDP = %d)\n" - " ai_addrlen = %d (sockaddr_in = %d, " - "sockaddr_in6 = %d)\n", - ai->ai_flags, - ai->ai_family, - PF_INET, - PF_INET6, - ai->ai_socktype, - SOCK_STREAM, - SOCK_DGRAM, - ai->ai_protocol, - IPPROTO_TCP, - IPPROTO_UDP, - ai->ai_addrlen, - sizeof( struct sockaddr_in ), - sizeof( struct sockaddr_in6 ) ); - /* - ** Now display the protocol-specific formatted socket address. Note - ** that the program is requesting that getnameinfo(3) convert the - ** host & service into numeric strings. - */ - getnameinfo( ai->ai_addr, - ai->ai_addrlen, - hostBfr, - sizeof( hostBfr ), - servBfr, - sizeof( servBfr ), - NI_NUMERICHOST | NI_NUMERICSERV ); - switch ( ai->ai_family ) - { - case PF_INET: /* IPv4 address record. */ - { - struct sockaddr_in *p = (struct sockaddr_in*) ai->ai_addr; - fprintf( stderr, - " ai_addr = sin_family: %d (AF_INET = %d, " - "AF_INET6 = %d)\n" - " sin_addr: %s\n" - " sin_port: %s\n", - p->sin_family, - AF_INET, - AF_INET6, - hostBfr, - servBfr ); - break; - } /* End CASE of IPv4. */ - case PF_INET6: /* IPv6 address record. */ - { - struct sockaddr_in6 *p = (struct sockaddr_in6*) ai->ai_addr; - fprintf( stderr, - " ai_addr = sin6_family: %d (AF_INET = %d, " - "AF_INET6 = %d)\n" - " sin6_addr: %s\n" - " sin6_port: %s\n" - " sin6_flowinfo: %d\n" - " sin6_scope_id: %d\n", - p->sin6_family, - AF_INET, - AF_INET6, - hostBfr, - servBfr, - p->sin6_flowinfo, - p->sin6_scope_id ); - break; - } /* End CASE of IPv6. */ - default: /* Can never get here, but just for completeness. */ - { - fprintf( stderr, - "%s (line %d): ERROR - Unknown protocol family (%d).\n", - pgmName, - __LINE__, - ai->ai_family ); - freeaddrinfo( aiHead ); - return -1; - } /* End DEFAULT case (unknown protocol family). */ - } /* End SWITCH on protocol family. */ - } /* End IF verbose mode. */ - /* - ** Create a socket using the info in the addrinfo structure. - */ - CHK( desc[ *descSize ] = socket( ai->ai_family, - ai->ai_socktype, - ai->ai_protocol ) ); - /* - ** Here is the code that prevents "IPv4 mapped addresses", as discussed - ** in Section 22.1.3.1. If an IPv6 socket was just created, then set the - ** IPV6_V6ONLY socket option. - */ - if ( ai->ai_family == PF_INET6 ) - { -#if defined( IPV6_V6ONLY ) - /* - ** Disable IPv4 mapped addresses. - */ - int v6Only = 1; - CHK( setsockopt( desc[ *descSize ], - IPPROTO_IPV6, - IPV6_V6ONLY, - &v6Only, - sizeof( v6Only ) ) ); -#else - /* - ** IPV6_V6ONLY is not defined, so the socket option can't be set and - ** thus IPv4 mapped addresses can't be disabled. Print a warning - ** message and close the socket. Design note: If the - ** #if...#else...#endif construct were removed, then this program - ** would not compile (because IPV6_V6ONLY isn't defined). That's an - ** acceptable approach; IPv4 mapped addresses are certainly disabled - ** if the program can't build! However, since this program is also - ** designed to work for IPv4 sockets as well as IPv6, I decided to - ** allow the program to compile when IPV6_V6ONLY is not defined, and - ** turn it into a run-time warning rather than a compile-time error. - ** IPv4 mapped addresses are still disabled because _all_ IPv6 traffic - ** is disabled (all IPv6 sockets are closed here), but at least this - ** way the server can still service IPv4 network traffic. - */ - fprintf( stderr, - "%s (line %d): WARNING - Cannot set IPV6_V6ONLY socket " - "option. Closing IPv6 %s socket.\n", - pgmName, - __LINE__, - ai->ai_protocol == IPPROTO_TCP ? "TCP" : "UDP" ); - CHK( close( desc[ *descSize ] ) ); - continue; /* Go to top of FOR loop w/o updating *descSize! */ -#endif /* IPV6_V6ONLY */ - } /* End IF this is an IPv6 socket. */ - /* - ** Bind the socket. Again, the info from the addrinfo structure is used. - */ - CHK( bind( desc[ *descSize ], - ai->ai_addr, - ai->ai_addrlen ) ); - /* - ** If this is a TCP socket, put the socket into passive listening mode - ** (listen is only valid on connection-oriented sockets). - */ - if ( ai->ai_socktype == SOCK_STREAM ) - { - CHK( listen( desc[ *descSize ], - MAXCONNQLEN ) ); - } - /* - ** Socket set up okay. Bump index to next descriptor array element. - */ - *descSize += 1; - } /* End FOR each address info structure returned. */ - /* - ** Dummy check for unused address records. - */ - if ( verbose && ( ai != NULL ) ) - { - fprintf( stderr, - "%s (line %d): WARNING - Some address records were " - "not processed due to insufficient array space.\n", - pgmName, - __LINE__ ); - } /* End IF verbose and some address records remain unprocessed. */ - /* - ** Clean up. - */ - freeaddrinfo( aiHead ); - return 0; -} /* End openSckt() */ -/****************************************************************************** -* Function: tod -* -* Description: -* Listen on a set of sockets and send the current time-of-day to any -* clients. This function never returns. -* -* Parameters: -* tSckt - Array of TCP socket descriptors on which to listen. -* tScktSize - Size of the tSckt array (nbr of elements). -* uSckt - Array of UDP socket descriptors on which to listen. -* uScktSize - Size of the uSckt array (nbr of elements). -* -* Return Value: None. -******************************************************************************/ -static void tod( int tSckt[ ], - size_t tScktSize, - int uSckt[ ], - size_t uScktSize ) -{ - char bfr[ 256 ]; - ssize_t count; - struct pollfd *desc; - size_t descSize = tScktSize + uScktSize; - int idx; - int newSckt; - struct sockaddr *sadr; - socklen_t sadrLen; - struct sockaddr_storage sockStor; - int status; - size_t timeLen; - char *timeStr; - time_t timeVal; - ssize_t wBytes; - /* - ** Allocate memory for the poll(2) array. - */ - desc = malloc( descSize * sizeof( struct pollfd ) ); - if ( desc == NULL ) - { - fprintf( stderr, - "%s (line %d): ERROR - %s.\n", - pgmName, - __LINE__, - strerror( ENOMEM ) ); - exit( 1 ); - } - /* - ** Initialize the poll(2) array. - */ - for ( idx = 0; idx < descSize; idx++ ) - { - desc[ idx ].fd = idx < tScktSize ? tSckt[ idx ] - : uSckt[ idx - tScktSize ]; - desc[ idx ].events = POLLIN; - desc[ idx ].revents = 0; - } - /* - ** Main time-of-day server loop. Handles both TCP & UDP requests. This is - ** an interative server, and all requests are handled directly within the - ** main loop. - */ - while ( true ) /* Do forever. */ - { - /* - ** Wait for activity on one of the sockets. The DO..WHILE construct is - ** used to restart the system call in the event the process is - ** interrupted by a signal. - */ - do - { - status = poll( desc, - descSize, - -1 /* Wait indefinitely for input. */ ); - } while ( ( status < 0 ) && ( errno == EINTR ) ); - CHK( status ); /* Check for a bona fide system call error. */ - /* - ** Get the current time. - */ - timeVal = time( NULL ); - timeStr = ctime( &timeVal ); - timeLen = strlen( timeStr ); - /* - ** Indicate that there is new network activity. - */ - if ( verbose ) - { - char *s = malloc( timeLen+1 ); - strcpy( s, timeStr ); - s[ timeLen-1 ] = '\0'; /* Overwrite '\n' in date string. */ - fprintf( stderr, - "%s: New network activity on %s.\n", - pgmName, - s ); - free( s ); - } /* End IF verbose. */ - /* - ** Process sockets with input available. - */ - for ( idx = 0; idx < descSize; idx++ ) - { - switch ( desc[ idx ].revents ) - { - case 0: /* No activity on this socket; try the next. */ - continue; - case POLLIN: /* Network activity. Go process it. */ - break; - default: /* Invalid poll events. */ - { - fprintf( stderr, - "%s (line %d): ERROR - Invalid poll event (0x%02X).\n", - pgmName, - __LINE__, - desc[ idx ].revents ); - exit( 1 ); - } - } /* End SWITCH on returned poll events. */ - /* - ** Determine if this is a TCP request or UDP request. - */ - if ( idx < tScktSize ) - { - /* - ** TCP connection requested. Accept it. Notice the use of - ** the sockaddr_storage data type. - */ - sadrLen = sizeof( sockStor ); - sadr = (struct sockaddr*) &sockStor; - CHK( newSckt = accept( desc[ idx ].fd, - sadr, - &sadrLen ) ); - CHK( shutdown( newSckt, /* Server never recv's anything. */ - SHUT_RD ) ); - if ( verbose ) - { - /* - ** Display the socket address of the remote client. Begin with - ** the address-independent fields. - */ - fprintf( stderr, - "Sockaddr info for new TCP client:\n" - " sa_family = %d (AF_INET = %d, AF_INET6 = %d)\n" - " addr len = %d (sockaddr_in = %d, " - "sockaddr_in6 = %d)\n", - sadr->sa_family, - AF_INET, - AF_INET6, - sadrLen, - sizeof( struct sockaddr_in ), - sizeof( struct sockaddr_in6 ) ); - /* - ** Display the address-specific fields. - */ - getnameinfo( sadr, - sadrLen, - hostBfr, - sizeof( hostBfr ), - servBfr, - sizeof( servBfr ), - NI_NUMERICHOST | NI_NUMERICSERV ); - /* - ** Notice that we're switching on an address family now, not a - ** protocol family. - */ - switch ( sadr->sa_family ) - { - case AF_INET: /* IPv4 address. */ - { - struct sockaddr_in *p = (struct sockaddr_in*) sadr; - fprintf( stderr, - " sin_addr = sin_family: %d\n" - " sin_addr: %s\n" - " sin_port: %s\n", - p->sin_family, - hostBfr, - servBfr ); - break; - } /* End CASE of IPv4. */ - case AF_INET6: /* IPv6 address. */ - { - struct sockaddr_in6 *p = (struct sockaddr_in6*) sadr; - fprintf( stderr, - " sin6_addr = sin6_family: %d\n" - " sin6_addr: %s\n" - " sin6_port: %s\n" - " sin6_flowinfo: %d\n" - " sin6_scope_id: %d\n", - p->sin6_family, - hostBfr, - servBfr, - p->sin6_flowinfo, - p->sin6_scope_id ); - break; - } /* End CASE of IPv6. */ - default: /* Can never get here, but for completeness. */ - { - fprintf( stderr, - "%s (line %d): ERROR - Unknown address " - "family (%d).\n", - pgmName, - __LINE__, - sadr->sa_family ); - break; - } /* End DEFAULT case (unknown address family). */ - } /* End SWITCH on address family. */ - } /* End IF verbose mode. */ - /* - ** Send the TOD to the client. - */ - wBytes = timeLen; - while ( wBytes > 0 ) - { - do - { - count = write( newSckt, - timeStr, - wBytes ); - } while ( ( count < 0 ) && ( errno == EINTR ) ); - CHK( count ); /* Check for a bona fide error. */ - wBytes -= count; - } /* End WHILE there is data to send. */ - CHK( close( newSckt ) ); - } /* End IF this was a TCP connection request. */ - else - { - /* - ** This is a UDP socket, and a datagram is available. The funny - ** thing about UDP requests is that this server doesn't require any - ** client input; but it can't send the TOD unless it knows a client - ** wants the data, and the only way that can occur with UDP is if - ** the server receives a datagram from the client. Thus, the - ** server must receive _something_, but the content of the datagram - ** is irrelevant. Read in the datagram. Again note the use of - ** sockaddr_storage to receive the address. - */ - sadrLen = sizeof( sockStor ); - sadr = (struct sockaddr*) &sockStor; - CHK( count = recvfrom( desc[ idx ].fd, - bfr, - sizeof( bfr ), - 0, - sadr, - &sadrLen ) ); - /* - ** Display whatever was received on stdout. - */ - if ( verbose ) - { - ssize_t rBytes = count; - fprintf( stderr, - "%s: UDP datagram received (%d bytes).\n", - pgmName, - count ); - while ( count > 0 ) - { - fputc( bfr[ rBytes - count-- ], - stdout ); - } - if ( bfr[ rBytes-1 ] != '\n' ) - fputc( '\n', stdout ); /* Newline also flushes stdout. */ - /* - ** Display the socket address of the remote client. Address- - ** independent fields first. - */ - fprintf( stderr, - "Remote client's sockaddr info:\n" - " sa_family = %d (AF_INET = %d, AF_INET6 = %d)\n" - " addr len = %d (sockaddr_in = %d, " - "sockaddr_in6 = %d)\n", - sadr->sa_family, - AF_INET, - AF_INET6, - sadrLen, - sizeof( struct sockaddr_in ), - sizeof( struct sockaddr_in6 ) ); - /* - ** Display the address-specific information. - */ - getnameinfo( sadr, - sadrLen, - hostBfr, - sizeof( hostBfr ), - servBfr, - sizeof( servBfr ), - NI_NUMERICHOST | NI_NUMERICSERV ); - switch ( sadr->sa_family ) - { - case AF_INET: /* IPv4 address. */ - { - struct sockaddr_in *p = (struct sockaddr_in*) sadr; - fprintf( stderr, - " sin_addr = sin_family: %d\n" - " sin_addr: %s\n" - " sin_port: %s\n", - p->sin_family, - hostBfr, - servBfr ); - break; - } /* End CASE of IPv4 address. */ - case AF_INET6: /* IPv6 address. */ - { - struct sockaddr_in6 *p = (struct sockaddr_in6*) sadr; - fprintf( stderr, - " sin6_addr = sin6_family: %d\n" - " sin6_addr: %s\n" - " sin6_port: %s\n" - " sin6_flowinfo: %d\n" - " sin6_scope_id: %d\n", - p->sin6_family, - hostBfr, - servBfr, - p->sin6_flowinfo, - p->sin6_scope_id ); - break; - } /* End CASE of IPv6 address. */ - default: /* Can never get here, but for completeness. */ - { - fprintf( stderr, - "%s (line %d): ERROR - Unknown address " - "family (%d).\n", - pgmName, - __LINE__, - sadr->sa_family ); - break; - } /* End DEFAULT case (unknown address family). */ - } /* End SWITCH on address family. */ - } /* End IF verbose mode. */ - /* - ** Send the time-of-day to the client. - */ - wBytes = timeLen; - while ( wBytes > 0 ) - { - do - { - count = sendto( desc[ idx ].fd, - timeStr, - wBytes, - 0, - sadr, /* Address & address length */ - sadrLen ); /* received in recvfrom(). */ - } while ( ( count < 0 ) && ( errno == EINTR ) ); - CHK( count ); /* Check for a bona fide error. */ - wBytes -= count; - } /* End WHILE there is data to send. */ - } /* End ELSE a UDP datagram is available. */ - desc[ idx ].revents = 0; /* Clear the returned poll events. */ - } /* End FOR each socket descriptor. */ - } /* End WHILE forever. */ -} /* End tod() */ -]]> -'Daytime' TCP Client Code -The TCP client code is found in file tod6tc.c (time-of-day IPv6 TCP client). Once built, the TCP client may be started using the following command syntax (assuming tod6tc is the executable file): -ARGUMENTS: -hostThe hostname or IP address (dotted decimal or colon-hex) of the remote host providing the service. Default is "localhost".serviceThe TCP service (or well-known port number) to which a connection attempt is made. Default is "daytime".OPTIONS: --sThis option is only meaningful for IPv6 addresses, and is used to set the scope identifier (i.e. the network interface on which to establish the connection). Default is "eth0". If host is a scoped address, this option is ignored.-vTurn on verbose mode.The TCP client source code contained in tod6tc.c follows: - /* errno declaration and error codes. */ -#include /* if_nametoindex(3). */ -#include /* getaddrinfo(3) and associated definitions. */ -#include /* sockaddr_in and sockaddr_in6 definitions. */ -#include /* printf(3) et al. */ -#include /* exit(2). */ -#include /* String manipulation and memory functions. */ -#include /* Socket functions (socket(2), connect(2), etc). */ -#include /* getopt(3), read(2), etc. */ -/* -** Constants & macros. -*/ -#define DFLT_HOST "localhost" /* Default server name. */ -#define DFLT_SCOPE_ID "eth0" /* Default scope identifier. */ -#define DFLT_SERVICE "daytime" /* Default service name. */ -#define INVALID_DESC -1 /* Invalid file (socket) descriptor. */ -#define MAXBFRSIZE 256 /* Max bfr sz to read remote TOD. */ -#define VALIDOPTS "s:v" /* Valid command options. */ -/* -** Type definitions (for convenience). -*/ -typedef enum { false = 0, true } boolean; -typedef struct sockaddr_in sockaddr_in_t; -typedef struct sockaddr_in6 sockaddr_in6_t; -/* -** Prototypes for internal helper functions. -*/ -static int openSckt( const char *host, - const char *service, - unsigned int scopeId ); -static void tod( int sckt ); -/* -** Global (within this file only) data objects. -*/ -static const char *pgmName; /* Program name (w/o directory). */ -static boolean verbose = false; /* Verbose mode. */ -/* -** Usage macro. -*/ -#define USAGE \ - { \ - fprintf( stderr, \ - "Usage: %s [-v] [-s scope_id] [host [service]]\n", \ - pgmName ); \ - exit( 127 ); \ - } /* End USAGE macro. */ -/* -** This "macro" (even though it's really a function) is loosely based on the -** CHK() macro by Dr. V. Vinge (see server code). The status parameter is -** a boolean expression indicating the return code from one of the usual system -** calls that returns -1 on error. If a system call error occurred, an alert -** is written to stderr. It returns a boolean value indicating success/failure -** of the system call. -** -** Example: if ( !SYSCALL( "write", -** count = write( fd, bfr, size ) ) ) -** { -** // Error processing... but SYSCALL() will have already taken -** // care of dumping an error alert to stderr. -** } -*/ -static __inline boolean SYSCALL( const char *syscallName, - int lineNbr, - int status ) -{ - if ( ( status == -1 ) && verbose ) - { - fprintf( stderr, - "%s (line %d): System call failed ('%s') - %s.\n", - pgmName, - lineNbr, - syscallName, - strerror( errno ) ); - } - return status != -1; /* True if the system call was successful. */ -} /* End SYSCALL() */ -/****************************************************************************** -* Function: main -* -* Description: -* Connect to a remote time-of-day service and write the remote host's TOD to -* stdout. -* -* Parameters: -* The usual argc & argv parameters to a main() program. -* -* Return Value: -* This function always returns zero. -******************************************************************************/ -int main( int argc, - char *argv[ ] ) -{ - const char *host = DFLT_HOST; - int opt; - int sckt; - unsigned int scopeId = if_nametoindex( DFLT_SCOPE_ID ); - const char *service = DFLT_SERVICE; - /* - ** Determine the program name (w/o directory prefix). - */ - pgmName = (const char*) strrchr( argv[ 0 ], '/' ); - pgmName = pgmName == NULL ? argv[ 0 ] : pgmName+1; - /* - ** Process command line options. - */ - opterr = 0; /* Turns off "invalid option" error messages. */ - while ( ( opt = getopt( argc, argv, VALIDOPTS ) ) != -1 ) - { - switch ( opt ) - { - case 's': /* Scope identifier (IPv6 kluge). */ - { - scopeId = if_nametoindex( optarg ); - if ( scopeId == 0 ) - { - fprintf( stderr, - "%s: Unknown network interface (%s).\n", - pgmName, - optarg ); - USAGE; - } - break; - } - case 'v': /* Verbose mode. */ - { - verbose = true; - break; - } - default: - { - USAGE; - } - } /* End SWITCH on command option. */ - } /* End WHILE processing command options. */ - /* - ** Process command arguments. At the end of the above loop, optind is the - ** index of the first NON-option argv element. - */ - switch ( argc - optind ) - { - case 2: /* Both host & service are specified on the command line. */ - { - service = argv[ optind + 1 ]; - /***** Fall through *****/ - } - case 1: /* Host is specified on the command line. */ - { - host = argv[ optind ]; - /***** Fall through *****/ - } - case 0: /* Use default host & service. */ - { - break; - } - default: - { - USAGE; - } - } /* End SWITCH on number of command arguments. */ - /* - ** Open a connection to the indicated host/service. - ** - ** Note that if all three of the following conditions are met, then the - ** scope identifier remains unresolved at this point. - ** 1) The default network interface is unknown for some reason. - ** 2) The -s option was not used on the command line. - ** 3) An IPv6 "scoped address" was not specified for the hostname on the - ** command line. - ** If the above three conditions are met, then only an IPv4 socket can be - ** opened (connect(2) fails without the scope ID properly set for IPv6 - ** sockets). - */ - if ( ( sckt = openSckt( host, - service, - scopeId ) ) == INVALID_DESC ) - { - fprintf( stderr, - "%s: Sorry... a connection could not be established.\n", - pgmName ); - exit( 1 ); - } - /* - ** Get the remote time-of-day. - */ - tod( sckt ); - /* - ** Close the connection and terminate. - */ - (void) SYSCALL( "close", - __LINE__, - close( sckt ) ); - return 0; -} /* End main() */ -/****************************************************************************** -* Function: openSckt -* -* Description: -* Sets up a TCP connection to a remote server. Getaddrinfo(3) is used to -* perform lookup functions and can return multiple address records (i.e. a -* list of 'struct addrinfo' records). This function traverses the list and -* tries to establish a connection to the remote server. The function ends -* when either a connection has been established or all records in the list -* have been processed. -* -* Parameters: -* host - A pointer to a character string representing the hostname or IP -* address (IPv4 or IPv6) of the remote server. -* service - A pointer to a character string representing the service name or -* well-known port number. -* scopeId - For IPv6 sockets only. This is the index corresponding to the -* network interface on which to set up the connection. This -* parameter is ignored for IPv4 sockets or when an IPv6 "scoped -* address" is specified in 'host' (i.e. where the colon-hex -* network address is augmented with the scope ID). -* -* Return Value: -* Returns the socket descriptor for the connection, or INVALID_DESC if all -* address records have been processed and a connection could not be -* established. -******************************************************************************/ -static int openSckt( const char *host, - const char *service, - unsigned int scopeId ) -{ - struct addrinfo *ai; - int aiErr; - struct addrinfo *aiHead; - struct addrinfo hints; - sockaddr_in6_t *pSadrIn6; - int sckt; - /* - ** Initialize the 'hints' structure for getaddrinfo(3). - ** - ** Notice that the 'ai_family' field is set to PF_UNSPEC, indicating to - ** return both IPv4 and IPv6 address records for the host/service. Most of - ** the time, the user isn't going to care whether an IPv4 connection or an - ** IPv6 connection is established; the user simply wants to exchange data - ** with the remote host and doesn't care how it's done. Sometimes, however, - ** the user might want to explicitly specify the type of underlying socket. - ** It is left as an exercise for the motivated reader to add a command line - ** option allowing the user to specify the IP protocol, and then process the - ** list of addresses accordingly (it's not that difficult). - */ - memset( &hints, 0, sizeof( hints ) ); - hints.ai_family = PF_UNSPEC; /* IPv4 or IPv6 records (don't care). */ - hints.ai_socktype = SOCK_STREAM; /* Connection-oriented byte stream. */ - hints.ai_protocol = IPPROTO_TCP; /* TCP transport layer protocol only. */ - /* - ** Look up the host/service information. - */ - if ( ( aiErr = getaddrinfo( host, - service, - &hints, - &aiHead ) ) != 0 ) - { - fprintf( stderr, - "%s (line %d): ERROR - %s.\n", - pgmName, - __LINE__, - gai_strerror( aiErr ) ); - return INVALID_DESC; - } - /* - ** Go through the list and try to open a connection. Continue until either - ** a connection is established or the entire list is exhausted. - */ - for ( ai = aiHead, sckt = INVALID_DESC; - ( ai != NULL ) && ( sckt == INVALID_DESC ); - ai = ai->ai_next ) - { - /* - ** IPv6 kluge. Make sure the scope ID is set. - */ - if ( ai->ai_family == PF_INET6 ) - { - pSadrIn6 = (sockaddr_in6_t*) ai->ai_addr; - if ( pSadrIn6->sin6_scope_id == 0 ) - { - pSadrIn6->sin6_scope_id = scopeId; - } /* End IF the scope ID wasn't set. */ - } /* End IPv6 kluge. */ - /* - ** Display the address info for the remote host. - */ - if ( verbose ) - { - /* - ** Temporary character string buffers for host & service. - */ - char hostBfr[ NI_MAXHOST ]; - char servBfr[ NI_MAXSERV ]; - /* - ** Display the address information just fetched. Start with the - ** common (protocol-independent) stuff first. - */ - fprintf( stderr, - "Address info:\n" - " ai_flags = 0x%02X\n" - " ai_family = %d (PF_INET = %d, PF_INET6 = %d)\n" - " ai_socktype = %d (SOCK_STREAM = %d, SOCK_DGRAM = %d)\n" - " ai_protocol = %d (IPPROTO_TCP = %d, IPPROTO_UDP = %d)\n" - " ai_addrlen = %d (sockaddr_in = %d, " - "sockaddr_in6 = %d)\n", - ai->ai_flags, - ai->ai_family, - PF_INET, - PF_INET6, - ai->ai_socktype, - SOCK_STREAM, - SOCK_DGRAM, - ai->ai_protocol, - IPPROTO_TCP, - IPPROTO_UDP, - ai->ai_addrlen, - sizeof( struct sockaddr_in ), - sizeof( struct sockaddr_in6 ) ); - /* - ** Display the protocol-specific formatted address. - */ - getnameinfo( ai->ai_addr, - ai->ai_addrlen, - hostBfr, - sizeof( hostBfr ), - servBfr, - sizeof( servBfr ), - NI_NUMERICHOST | NI_NUMERICSERV ); - switch ( ai->ai_family ) - { - case PF_INET: /* IPv4 address record. */ - { - sockaddr_in_t *pSadrIn = (sockaddr_in_t*) ai->ai_addr; - fprintf( stderr, - " ai_addr = sin_family: %d (AF_INET = %d, " - "AF_INET6 = %d)\n" - " sin_addr: %s\n" - " sin_port: %s\n", - pSadrIn->sin_family, - AF_INET, - AF_INET6, - hostBfr, - servBfr ); - break; - } /* End CASE of IPv4 record. */ - case PF_INET6: /* IPv6 address record. */ - { - pSadrIn6 = (sockaddr_in6_t*) ai->ai_addr; - fprintf( stderr, - " ai_addr = sin6_family: %d (AF_INET = %d, " - "AF_INET6 = %d)\n" - " sin6_addr: %s\n" - " sin6_port: %s\n" - " sin6_flowinfo: %d\n" - " sin6_scope_id: %d\n", - pSadrIn6->sin6_family, - AF_INET, - AF_INET6, - hostBfr, - servBfr, - pSadrIn6->sin6_flowinfo, - pSadrIn6->sin6_scope_id ); - break; - } /* End CASE of IPv6 record. */ - default: /* Can never get here, but just for completeness. */ - { - fprintf( stderr, - "%s (line %d): ERROR - Unknown protocol family (%d).\n", - pgmName, - __LINE__, - ai->ai_family ); - break; - } /* End DEFAULT case (unknown protocol family). */ - } /* End SWITCH on protocol family. */ - } /* End IF verbose mode. */ - /* - ** Create a socket. - */ - if ( !SYSCALL( "socket", - __LINE__, - sckt = socket( ai->ai_family, - ai->ai_socktype, - ai->ai_protocol ) ) ) - { - sckt = INVALID_DESC; - continue; /* Try the next address record in the list. */ - } - /* - ** Connect to the remote host. - */ - if ( !SYSCALL( "connect", - __LINE__, - connect( sckt, - ai->ai_addr, - ai->ai_addrlen ) ) ) - { - (void) close( sckt ); /* Could use SYSCALL() again here, but why? */ - sckt = INVALID_DESC; - continue; /* Try the next address record in the list. */ - } - } /* End FOR each address record returned by getaddrinfo(3). */ - /* - ** Clean up & return. - */ - freeaddrinfo( aiHead ); - return sckt; -} /* End openSckt() */ -/****************************************************************************** -* Function: tod -* -* Description: -* Receive the time-of-day from the remote server and write it to stdout. -* -* Parameters: -* sckt - The socket descriptor for the connection. -* -* Return Value: None. -******************************************************************************/ -static void tod( int sckt ) -{ - char bfr[ MAXBFRSIZE+1 ]; - int inBytes; - /* - ** The client never sends anything, so shut down the write side of the - ** connection. - */ - if ( !SYSCALL( "shutdown", - __LINE__, - shutdown( sckt, SHUT_WR ) ) ) - { - return; - } - /* - ** Read the time-of-day from the remote host. - */ - do - { - if ( !SYSCALL( "read", - __LINE__, - inBytes = read( sckt, - bfr, - MAXBFRSIZE ) ) ) - { - return; - } - bfr[ inBytes ] = '\0'; /* Null-terminate the received string. */ - fputs( bfr, stdout ); /* Null string if EOF (inBytes == 0). */ - } while ( inBytes > 0 ); - fflush( stdout ); -} /* End tod() */ -]]> -'Daytime' UDP Client Code -The UDP client code is found in file tod6uc.c (time-of-day IPv6 UDP client). It is almost an exact duplicate of the TCP client (and in fact was derived from it), but is included in this HowTo for completeness. Once built, the UDP client may be started using the following command syntax (assuming tod6uc is the executable file): -ARGUMENTS: -hostThe hostname or IP address (dotted decimal or colon-hex) of the remote host providing the service. Default is "localhost".serviceThe UDP service (or well-known port number) to which datagrams are sent. Default is "daytime".OPTIONS: --sThis option is only meaningful for IPv6 addresses, and is used to set the scope identifier (i.e. the network interface on which to exchange datagrams). Default is "eth0". If host is a scoped address, this option is ignored.-vTurn on verbose mode.The UDP client source code contained in tod6uc.c follows: - /* errno declaration and error codes. */ -#include /* if_nametoindex(3). */ -#include /* getaddrinfo(3) and associated definitions. */ -#include /* sockaddr_in and sockaddr_in6 definitions. */ -#include /* printf(3) et al. */ -#include /* exit(2). */ -#include /* String manipulation and memory functions. */ -#include /* Socket functions (socket(2), connect(2), etc). */ -#include /* getopt(3), recvfrom(2), sendto(2), etc. */ -/* -** Constants & macros. -*/ -#define DFLT_HOST "localhost" /* Default server name. */ -#define DFLT_SCOPE_ID "eth0" /* Default scope identifier. */ -#define DFLT_SERVICE "daytime" /* Default service name. */ -#define INVALID_DESC -1 /* Invalid file (socket) descriptor. */ -#define MAXBFRSIZE 256 /* Max bfr sz to read remote TOD. */ -#define VALIDOPTS "s:v" /* Valid command options. */ -/* -** Type definitions (for convenience). -*/ -typedef enum { false = 0, true } boolean; -typedef struct sockaddr_in sockaddr_in_t; -typedef struct sockaddr_in6 sockaddr_in6_t; -/* -** Prototypes for internal helper functions. -*/ -static int openSckt( const char *host, - const char *service, - unsigned int scopeId ); -static void tod( int sckt ); -/* -** Global (within this file only) data objects. -*/ -static const char *pgmName; /* Program name (w/o directory). */ -static boolean verbose = false; /* Verbose mode. */ -/* -** Usage macro. -*/ -#define USAGE \ - { \ - fprintf( stderr, \ - "Usage: %s [-v] [-s scope_id] [host [service]]\n", \ - pgmName ); \ - exit( 127 ); \ - } /* End USAGE macro. */ -/* -** This "macro" (even though it's really a function) is loosely based on the -** CHK() macro by Dr. V. Vinge (see server code). The status parameter is -** a boolean expression indicating the return code from one of the usual system -** calls that returns -1 on error. If a system call error occurred, an alert -** is written to stderr. It returns a boolean value indicating success/failure -** of the system call. -** -** Example: if ( !SYSCALL( "write", -** count = write( fd, bfr, size ) ) ) -** { -** // Error processing... but SYSCALL() will have already taken -** // care of dumping an error alert to stderr. -** } -*/ -static __inline boolean SYSCALL( const char *syscallName, - int lineNbr, - int status ) -{ - if ( ( status == -1 ) && verbose ) - { - fprintf( stderr, - "%s (line %d): System call failed ('%s') - %s.\n", - pgmName, - lineNbr, - syscallName, - strerror( errno ) ); - } - return status != -1; /* True if the system call was successful. */ -} /* End SYSCALL() */ -/****************************************************************************** -* Function: main -* -* Description: -* Connect to a remote time-of-day service and write the remote host's TOD to -* stdout. -* -* Parameters: -* The usual argc & argv parameters to a main() program. -* -* Return Value: -* This function always returns zero. -******************************************************************************/ -int main( int argc, - char *argv[ ] ) -{ - const char *host = DFLT_HOST; - int opt; - int sckt; - unsigned int scopeId = if_nametoindex( DFLT_SCOPE_ID ); - const char *service = DFLT_SERVICE; - /* - ** Determine the program name (w/o directory prefix). - */ - pgmName = (const char*) strrchr( argv[ 0 ], '/' ); - pgmName = pgmName == NULL ? argv[ 0 ] : pgmName+1; - /* - ** Process command line options. - */ - opterr = 0; /* Turns off "invalid option" error messages. */ - while ( ( opt = getopt( argc, argv, VALIDOPTS ) ) != -1 ) - { - switch ( opt ) - { - case 's': /* Scope identifier (IPv6 kluge). */ - { - scopeId = if_nametoindex( optarg ); - if ( scopeId == 0 ) - { - fprintf( stderr, - "%s: Unknown network interface (%s).\n", - pgmName, - optarg ); - USAGE; - } - break; - } - case 'v': /* Verbose mode. */ - { - verbose = true; - break; - } - default: - { - USAGE; - } - } /* End SWITCH on command option. */ - } /* End WHILE processing command options. */ - /* - ** Process command arguments. At the end of the above loop, optind is the - ** index of the first NON-option argv element. - */ - switch ( argc - optind ) - { - case 2: /* Both host & service are specified on the command line. */ - { - service = argv[ optind + 1 ]; - /***** Fall through *****/ - } - case 1: /* Host is specified on the command line. */ - { - host = argv[ optind ]; - /***** Fall through *****/ - } - case 0: /* Use default host & service. */ - { - break; - } - default: - { - USAGE; - } - } /* End SWITCH on number of command arguments. */ - /* - ** Open a connection to the indicated host/service. - ** - ** Note that if all three of the following conditions are met, then the - ** scope identifier remains unresolved at this point. - ** 1) The default network interface is unknown for some reason. - ** 2) The -s option was not used on the command line. - ** 3) An IPv6 "scoped address" was not specified for the hostname on the - ** command line. - ** If the above three conditions are met, then only an IPv4 socket can be - ** opened (connect(2) fails without the scope ID properly set for IPv6 - ** sockets). - */ - if ( ( sckt = openSckt( host, - service, - scopeId ) ) == INVALID_DESC ) - { - fprintf( stderr, - "%s: Sorry... a connectionless socket could " - "not be set up.\n", - pgmName ); - exit( 1 ); - } - /* - ** Get the remote time-of-day. - */ - tod( sckt ); - /* - ** Close the connection and terminate. - */ - (void) SYSCALL( "close", - __LINE__, - close( sckt ) ); - return 0; -} /* End main() */ -/****************************************************************************** -* Function: openSckt -* -* Description: -* Sets up a UDP socket to a remote server. Getaddrinfo(3) is used to -* perform lookup functions and can return multiple address records (i.e. a -* list of 'struct addrinfo' records). This function traverses the list and -* tries to establish a connection to the remote server. The function ends -* when either a connection has been established or all records in the list -* have been processed. -* -* Parameters: -* host - A pointer to a character string representing the hostname or IP -* address (IPv4 or IPv6) of the remote server. -* service - A pointer to a character string representing the service name or -* well-known port number. -* scopeId - For IPv6 sockets only. This is the index corresponding to the -* network interface on which to exchange datagrams. This -* parameter is ignored for IPv4 sockets or when an IPv6 "scoped -* address" is specified in 'host' (i.e. where the colon-hex -* network address is augmented with the scope ID). -* -* Return Value: -* Returns the socket descriptor for the connection, or INVALID_DESC if all -* address records have been processed and a socket could not be initialized. -******************************************************************************/ -static int openSckt( const char *host, - const char *service, - unsigned int scopeId ) -{ - struct addrinfo *ai; - int aiErr; - struct addrinfo *aiHead; - struct addrinfo hints; - sockaddr_in6_t *pSadrIn6; - int sckt; - /* - ** Initialize the 'hints' structure for getaddrinfo(3). - ** - ** Notice that the 'ai_family' field is set to PF_UNSPEC, indicating to - ** return both IPv4 and IPv6 address records for the host/service. Most of - ** the time, the user isn't going to care whether an IPv4 connection or an - ** IPv6 connection is established; the user simply wants to exchange data - ** with the remote host and doesn't care how it's done. Sometimes, however, - ** the user might want to explicitly specify the type of underlying socket. - ** It is left as an exercise for the motivated reader to add a command line - ** option allowing the user to specify the IP protocol, and then process the - ** list of addresses accordingly (it's not that difficult). - */ - memset( &hints, 0, sizeof( hints ) ); - hints.ai_family = PF_UNSPEC; /* IPv4 or IPv6 records (don't care). */ - hints.ai_socktype = SOCK_DGRAM; /* Connectionless communication. */ - hints.ai_protocol = IPPROTO_UDP; /* UDP transport layer protocol only. */ - /* - ** Look up the host/service information. - */ - if ( ( aiErr = getaddrinfo( host, - service, - &hints, - &aiHead ) ) != 0 ) - { - fprintf( stderr, - "%s (line %d): ERROR - %s.\n", - pgmName, - __LINE__, - gai_strerror( aiErr ) ); - return INVALID_DESC; - } - /* - ** Go through the list and try to open a connection. Continue until either - ** a connection is established or the entire list is exhausted. - */ - for ( ai = aiHead, sckt = INVALID_DESC; - ( ai != NULL ) && ( sckt == INVALID_DESC ); - ai = ai->ai_next ) - { - /* - ** IPv6 kluge. Make sure the scope ID is set. - */ - if ( ai->ai_family == PF_INET6 ) - { - pSadrIn6 = (sockaddr_in6_t*) ai->ai_addr; - if ( pSadrIn6->sin6_scope_id == 0 ) - { - pSadrIn6->sin6_scope_id = scopeId; - } /* End IF the scope ID wasn't set. */ - } /* End IPv6 kluge. */ - /* - ** Display the address info for the remote host. - */ - if ( verbose ) - { - /* - ** Temporary character string buffers for host & service. - */ - char hostBfr[ NI_MAXHOST ]; - char servBfr[ NI_MAXSERV ]; - /* - ** Display the address information just fetched. Start with the - ** common (protocol-independent) stuff first. - */ - fprintf( stderr, - "Address info:\n" - " ai_flags = 0x%02X\n" - " ai_family = %d (PF_INET = %d, PF_INET6 = %d)\n" - " ai_socktype = %d (SOCK_STREAM = %d, SOCK_DGRAM = %d)\n" - " ai_protocol = %d (IPPROTO_TCP = %d, IPPROTO_UDP = %d)\n" - " ai_addrlen = %d (sockaddr_in = %d, " - "sockaddr_in6 = %d)\n", - ai->ai_flags, - ai->ai_family, - PF_INET, - PF_INET6, - ai->ai_socktype, - SOCK_STREAM, - SOCK_DGRAM, - ai->ai_protocol, - IPPROTO_TCP, - IPPROTO_UDP, - ai->ai_addrlen, - sizeof( struct sockaddr_in ), - sizeof( struct sockaddr_in6 ) ); - /* - ** Display the protocol-specific formatted address. - */ - getnameinfo( ai->ai_addr, - ai->ai_addrlen, - hostBfr, - sizeof( hostBfr ), - servBfr, - sizeof( servBfr ), - NI_NUMERICHOST | NI_NUMERICSERV ); - switch ( ai->ai_family ) - { - case PF_INET: /* IPv4 address record. */ - { - sockaddr_in_t *pSadrIn = (sockaddr_in_t*) ai->ai_addr; - fprintf( stderr, - " ai_addr = sin_family: %d (AF_INET = %d, " - "AF_INET6 = %d)\n" - " sin_addr: %s\n" - " sin_port: %s\n", - pSadrIn->sin_family, - AF_INET, - AF_INET6, - hostBfr, - servBfr ); - break; - } /* End CASE of IPv4 record. */ - case PF_INET6: /* IPv6 address record. */ - { - pSadrIn6 = (sockaddr_in6_t*) ai->ai_addr; - fprintf( stderr, - " ai_addr = sin6_family: %d (AF_INET = %d, " - "AF_INET6 = %d)\n" - " sin6_addr: %s\n" - " sin6_port: %s\n" - " sin6_flowinfo: %d\n" - " sin6_scope_id: %d\n", - pSadrIn6->sin6_family, - AF_INET, - AF_INET6, - hostBfr, - servBfr, - pSadrIn6->sin6_flowinfo, - pSadrIn6->sin6_scope_id ); - break; - } /* End CASE of IPv6 record. */ - default: /* Can never get here, but just for completeness. */ - { - fprintf( stderr, - "%s (line %d): ERROR - Unknown protocol family (%d).\n", - pgmName, - __LINE__, - ai->ai_family ); - break; - } /* End DEFAULT case (unknown protocol family). */ - } /* End SWITCH on protocol family. */ - } /* End IF verbose mode. */ - /* - ** Create a socket. - */ - if ( !SYSCALL( "socket", - __LINE__, - sckt = socket( ai->ai_family, - ai->ai_socktype, - ai->ai_protocol ) ) ) - { - sckt = INVALID_DESC; - continue; /* Try the next address record in the list. */ - } - /* - ** Set the target destination for the remote host on this socket. That - ** is, this socket only communicates with the specified host. - */ - if ( !SYSCALL( "connect", - __LINE__, - connect( sckt, - ai->ai_addr, - ai->ai_addrlen ) ) ) - { - (void) close( sckt ); /* Could use SYSCALL() again here, but why? */ - sckt = INVALID_DESC; - continue; /* Try the next address record in the list. */ - } - } /* End FOR each address record returned by getaddrinfo(3). */ - /* - ** Clean up & return. - */ - freeaddrinfo( aiHead ); - return sckt; -} /* End openSckt() */ -/****************************************************************************** -* Function: tod -* -* Description: -* Receive the time-of-day from the remote server and write it to stdout. -* -* Parameters: -* sckt - The socket descriptor for the connection. -* -* Return Value: None. -******************************************************************************/ -static void tod( int sckt ) -{ - char bfr[ MAXBFRSIZE+1 ]; - int inBytes; - /* - ** Send a datagram to the server to wake it up. The content isn't - ** important, but something must be sent to let it know we want the TOD. - */ - if ( !SYSCALL( "write", - __LINE__, - write( sckt, "Are you there?", 14 ) ) ) - { - return; - } - /* - ** Read the time-of-day from the remote host. - */ - if ( !SYSCALL( "read", - __LINE__, - inBytes = read( sckt, - bfr, - MAXBFRSIZE ) ) ) - { - return; - } - bfr[ inBytes ] = '\0'; /* Null-terminate the received string. */ - fputs( bfr, stdout ); /* Null string if EOF (inBytes == 0). */ - fflush( stdout ); -} /* End tod() */ -]]>
    -Other programming languages - -JAVA -Sun Java versions since 1.4 are IPv6 enabled, see e.g. Inet6Address (1.5/5.0) class. Hints are available in the Networking IPv6 User Guide for JDK/JRE 1.4 and 1.5 (5.0). -Perl -As of May 2007 it's not known that the Perl core itself already supports IPv6. It can be added by using following modules: -Socket6Anyway, some other modules exist for/with IPv6 support (e.g. Net::IP), search for “IPv6” on http://search.cpan.org/.
    -<!-- anchor id="chapter-interoperability" -->Interoperability -The TAHI Project checks the interoperability of different operating systems regarding the implementation of IPv6 features. Linux kernel already got the IPv6 Ready Logo Phase 1. -<!-- anchor id="chapter-information" -->Further information and URLs - -<!-- anchor id="information-books" -->Paper printed books, articles, online reviews (mixed) - -Printed Books (English) - -Cisco - -Cisco Self-Study: Implementing IPv6 Networks (IPV6) by Regis Desmeules. Cisco Press; ISBN 1587050862; 500 pages; 1st edition (April 11, 2003). -Note: This item will be published on April 11, 2003.Configuring IPv6 with Cisco IOS by Sam Brown, Sam Browne, Neal Chen, Robbie Harrell, Edgar, Jr. Parenti (Editor), Eric Knipp (Editor), Paul Fong (Editor)362 pages; Syngress Media Inc; ISBN 1928994849; (July 12, 2002). -General - -IPv6 in Practice: A Unixer's Guide to the Next Generation Internet von Benedikt Stockebrand, November 2006; ISBN 3-540-24524-3IPv6 Essentials by Silvia Hagen, 2nd Edition, May 2006; ISBN 0-5961-0058-2 -ToC, Index, Sample Chapter etc.; O'Reilly PressreleaseIPv6: The New Internet Protocol. By Christian Huitema; Published by Prentice-Hall; ISBN 0138505055. -Description: This book, written by Christian Huitema - a member of the InternetArchitecture Board, gives an excellent description of IPv6, how it differs from IPv4, and the hows and whys of it's development. -Source: http://www.cs.uu.nl/wais/html/na-dir/internet/tcp-ip/resource-list.htmlIPv6 Networks by Niles, Kitty; (ISBN 0070248079); 550 pages; Date Published 05/01/1998.Implementing IPV6. Supporting the Next Generation Internet Protocols by P. E. Miller, Mark A. Miller; Publisher: John Wiley & Sons; ISBN 0764545892; 2nd edition (March 15, 2000); 402 pages.Big Book of Ipv6 Addressing Rfcs by Peter H. Salus (Compiler), Morgan Kaufmann Publishers, April 2000, 450 pages ISBN 0126167702. Understanding IPV6 by Davies, Joseph; ISBN 0735612455; Date Published 05/01/2001; Number of Pages: 350.Migrating to IPv6 - IPv6 in Practice by Marc Blanchet Publisher: John Wiley & Sons; ISBN 0471498920; 1st edition (November 2002); 368 pages.Ipv6 Network Programming by Jun-ichiro Hagino; ISBN 1555583180Wireless boosting IPv6 by Carolyn Duffy Marsan, 10/23/2000.O'reilly Network search for keyword IPv6 results in 29 hits (28. January 2002) -Articles, eBooks, Online Reviews (mixed) - -Getting Connected with 6to4 by Huber Feyrer, 06/01/2001Transient Addressing for Related Processes: Improved Firewalling by Using IPv6 and Multiple Addresses per Host; written by Peter M. Gleiz, Steven M. Bellovin (PC-PDF-Version; Palm-PDF-Version; PDB-Version)Internetworking IPv6 with Cisco Routers by Silvano Gai, McGrawHill Italia, 1997. The 13 chapters and appendix A-D are downloadable as PDF-documents.Migration and Co-existence of IPv4 and IPv6 in Residential Networks by Pekka Savola, CSC/FUNET, 2002 -<!-- anchor id="information-sciencepublication" -->Science Publications (abstracts, bibliographies, online resources) -See also: liinwww.ira.uka.de/ipv6 or Google / Scholar / IPv6 -GEANT IPv6 WorkplanIPv6 Trials on UK Academic Networks: Bermuda Project Aug.2002: Participants - Getting connected - Project deliverables - Network topology - Address assignments - Wireless IPv6 access - IPv6 migration - Project presentations - Internet 2 - Other IPv6 projects - IPv6 fora and standards Bermuda 2...http://www.ipv6.ac.uk/IPv6 at the University of SouthamptonMicrosoft Research IPv6 Implementation (MSRIPv6): MSRIPv6 Configuring 6to4 - Connectivity with MSR IPv6 - Our 6Bone Node... -Others -See following URL for more: SWITCH IPv6 Pilot / References -<!-- anchor id="information-conferences" -->Conferences, Meetings, Summits -Something missing? Suggestions are welcome! -2004 - -1st Global IPv6 Summit in Sao Paul, Brazil -<!-- anchor id="information-onlineinformation" -->Online information - -<!-- anchor id="information-joinipv6." -->Join the IPv6 backbone -More to be filled later...suggestions are welcome! -<!-- anchor id="information-globalregistries" -->Global registries -See regional registries. -<!-- anchor id="information-majorregionregistries" -->Major regional registries - -America: ARIN, ARIN / registration page, ARIN / IPv6 guidelinesEMEA: Ripe NCC, Ripe NCC / registration page, Ripe NCC / IPv6 registrationAsia/Pacific: APNIC, APNIC / IPv6 ressource guideLatin America and Caribbea: LACNIC, IPv6 Registration Services, IPv6 Allocation PolicyAfrica: AfriNICAlso a list of major (prefix length 32) allocations per local registry is available here: Ripe NCC / IPv6 allocations. -<!-- anchor id="information-joinipv6-tunnelbrokers" -->Tunnel brokers -Note: A list of available Tunnel broker can be found in the section Tunnel broker below. -Former IPng. Tunnelbroker and IPv6 resources, now migrated to the SixXs System.Eckes' IPv6-with-Linux Page.tunnelc - a perl based tunnel client script: -freshmeat.net: Project details for tunnel client -SourceForge: Project Info - tunnelc (also here)Linux Advanced Routing & Traffic Control HOWTO, Chapter 6: IPv6 tunneling with Cisco and/or 6bone. -<!-- anchor id="information-joinipv6-6to4-tunneling" -->6to4 - -NSayer's 6to4 informationRFC 3068 / An Anycast Prefix for 6to4 Relay Routers -<!-- anchor id="information-joinipv6-isatap-tunneling" -->ISATAP - -ISATAP (Intra-Site Automatic Tunnel Access Protocol) Information by JOIN -Latest news and URLs to other documents - -Lot of URLs to others documents by Anil Edatharago6 - The IPv6 Portal: an IPv6 online portal with a wiki-based IPv6 knowledge center, an IPv6 discussion forum, an up-to-date collection of IPv6 Events and News, free IPv6 access and services, IPv6 software applications, and much more -Protocol references - -IPv6-related Request For Comments (RFCs) -Publishing the list of IPv6-related RFCs is beyond the scope of this document, but given URLs will lead you to such lists: -List sorted by IPng Standardization Status or IPng Current Specifications by Robert HindenIPv6 Related Specifications on IPv6.org -Current drafts of working groups -Current (also) IPv6-related drafts can be found here: -IP Version 6 (ipv6)Next Generation Transition (ngtrans)Dynamic Host Configuration (dhc)Domain Name System Extension (dnsext)IPv6 Operations (v6ops)Mobile IP (mobileip)Get any information about IPv6, from overviews, through RFCs & drafts, to implementations (including availability of stacks on various platforms & source code for IPv6 stacks) -Others - -SWITCH IPv6 Pilot / References, big list of IPv6 references maintained by Simon Leinen -More information -DeepSpace6 / more interesting links -Linux related - -DeepSpace6 / (Not only) Linux IPv6 Portal - Italy (Mirror)IPv6-HowTo for Linux by Peter Bieringer - Germany, and his Bieringer / IPv6 - software archiveLinux+IPv6 status by Peter Bieringer - Germany (going obsolete)DeepSpace6 / IPv6 Status Page - Italy (Mirror) (will superseed upper one)USAGI project - Japan, and their USAGI project - software archiveLinux Optimized Link State Routing Protocol (OLSR) IPv6 HOWTOLinShim6 -Linux related per distribution - -PLDPLD Linux Distribution (“market leader” in containing IPv6 enabled packages)Red HatRed Hat Enterprise Linux, Pekka Savola's IPv6 packages (Historic)FedoraFedora (Project) LinuxDebianDebian Linux, IPv6 with Debian LinuxSuSESuSE LinuxMandrivaMandriva (Historic)For more see the IPv6+Linux Status Distributions page. -General - -IPv6.org6boneWIDE project - JapanSWITCH IPv6 Pilot - SwitzerlandIPv6 Corner of Hubert Feyrer - GermanyIPv6 Forum - a world-wide consortium of leading Internet vendors, Research & Education Networks...Playground.sun.com / IPv6 Info Page - maintained by Robert Hinden, Nokia. Get any information about IPv6, from overviews, through RFCs & drafts, to implementations (including availability of stacks on various platforms & source code for IPv6 stacks).6INIT - IPv6 Internet Initiative - an EU Fifth Framework Project under the IST Programme.IPv6 Task Force (European Union)6init - IPv6 INternet IniTiative IPv6: The New Version of the Internet Protocol, by Steve Deering.IPv6: The Next Generation Internet Protocol, by Gary C. Kessler. IPv6: Next Generation Internet Protocol - 3Cominternet || site and internet2 Working GroupNetworkWorldFusion: Search / Doc Finder: searched for IPv6 (102 documents found 22.12.2002)The Register (Search for IPv6 will result in 30 documents, 22.12.2002)ZDNet Search for IPv6TechTarget Search for IPv6IPv6 & TCP Resources ListSomething missing? Suggestions are welcome! -<!-- anchor id="information-marketresearch" -->Market Research - -A Tale of Two Wireless Technology Trends: Processor Development Outsourcing and IPv6Yankee Group - 4/1/2002 - 12 Pages - ID: YANL768881The World Atlas of the Internet: Americas; IDATE - 2/1/2002 - 242 PAges - ID: IDT803907. Countries covered: Central America, North America, South America; List: Price: $ 3,500.00; excerpt: Panorama of Internet access markets across the globe. Market assessment and forecasts up to 2006 for 34 countries: market structure: main ISPs and market shares; number of subscribers, of ISPs.Early Interest Rising for IPv6 by IDC (Author); List Price: $1,500.00; Edition: e-book (Acrobat Reader); Publisher: IDC; ISBN B000065T8E; (March 1, 2002) -<!-- anchor id="information-patents" -->Patents - -Delphion Research: Patent Search Page. Basic (free) registration needed. Examples found 21.12.2002 searching for IPv6: -Communicating method between IPv4 terminal and IPv6 terminal and IPv4-IPv6 converting apparatus -Translator for IP networks, network system using the translator, and IP network coupling method therefor -By countries - -Europe - -www.ist-ipv6.org: IST IPv6 Cluster, European IPv6 Research and Development ProjectsEuro6IX: European IPv6 Internet Exchanges Backbone -Austria - -IPv6@IKNnet and MIPv6 Research Group: TU Vienna, Austria (IPv6: project, publications, diploma / doctor thesis, Conference Proceedings etc.) -Australia - -Carl's Australian IPv6 Pages (old content) -Belgium -Suggestions are welcome! -Brasil - -IPv6 do Brasil -China -Suggestions are welcome! -Czech -Suggestions are welcome! -Germany - -Xing / IPv6 -France - -Renater: Renater IPv6 Project PageIPv6 - RSVP - ATM at INRIANetBSD IPv6 Documentation -Italy - -Project6: IPv6 networking with Linux -Japan - -Yamaha IPv6 (sorry, all in japanese native ...) -Korea - -ETRI: Electronics and Telecommunications Research InstitutIPv6 Forum Korea: Korean IPv6 Deployment Project -Mexico - -IPv6 Mexico (spain & english version): IPv6 Project Hompeage of The National Autonomous University of Mexico (UNAM) -Netherland - -SURFnet: SURFnet IPv6 BackboneSTACK, STACK (IPv6): Students' computer association of the Eindhoven University of Technology, NetherlandIPng.nl: collaboration between WiseGuys and Intouch -Portugal -Suggestions are welcome! -Russia - -IPv6 Forum for Russia: Yaroslavl State University Internet Center -Switzerland -Suggestions are welcome! -United Kingdom - -British Telecom IPv6 Home: BT's ISP IPv6 Trial, UK's first IPv6 Internet Exchange etc. -By operating systems - -*BSD - -KAME project (*BSD)NetBSD's IPv6 Networking FAQFreeBSD Ports: Ipv6 -Cisco IOS - -Cisco IOS IPv6 Entry PageIPv6 for Cisco IOS Software, File 2 of 3: Aug 2002 -- Table of Contents: IPv6 for Cisco IOS Software; Configuring Documentation Specifics; Enabling IPv6 Routing and Configuring; IPv6 Addressing; Enabling IPv6 Processing Globally.Cisco Internet Networking Handbook, Chapter IPv6 -HPUX - -comp.sys.hp.hpux FAQ -IBM - -Now that IBM's announced the availability of z/OS V1.4, what's new in this release? This question was posed on 15 August 2002 -Microsoft - -Microsoft Windows 2000 IPv6 MSRIPv6 - Microsoft Research Network - IPv6 Homepage Internet Connection Firewall Does Not Block Internet Protocol Version 6 Traffic (6.11.2001)Internet Protocol Numbers (8.10.2002)IPv6 Technology Preview Refresh (16.10.2002)HOW TO: Install and Configure IP Version 6 in Windows .NET Enterprise Server (26.10.2002)Windows .NET Server 6to4 Router Service Quits When You Advertise a 2002 Address on the Public Interface (28.10.2002)msdn - Microsoft Windows CE .NET - IPv6 commands -Solaris - -Sun Microsystems SolarisSolaris 2 Frequently Asked Questions (FAQ) 1.73 -Sumitoma - -Sumitomo Electric has implemented IPv6 on Suminet 3700 family routers -ZebOS - -IpInfusion's ZebOS Server Routing Software -<!-- anchor id="information-ipv6andsecurity" -->IPv6 Security - -Internet Security Systems: Security Center, X-Force Database Search (21.12.2002 - 6 topics found relating to IPv6)NIST IPsec Project ( National Institute of Standards and Technology, NIST)Information SecurityNewOrder.box.sk (search for IPv6) (Articles, exploits, files database etc.) -Application lists - -DeepSpace6 / IPv6 Status Page (Mirror)IPv6.org / IPv6 enabled applicationsFreshmeat / IPv6 search, currently (14 Dec 2002) 62 projectsIPv6 Forum / Web Links -Analyzer tools - -Wireshark (former known as Ethereal) is a free network protocol analyzer for Unix and WindowsRadcom RC100-WL - Download Radcom RC100-WL protocol analyzer version 3.20 -IPv6 Products - -6wind - solutions for IPv4/IPv6 Router, QoS, Multicast, Mobility, Security/VPN/Firewall. Fefe's patches for IPv6 with djbdnsAug 2002 -- What is djbdns and why does it need IPv6? djbdns is a full blown DNS server which outperforms BIND in nearly all respects.ZebOS Server Routing Suite Inframail (Advantage Server Edition)HTTrack Website CopierCommViewPosadis -<!-- anchor id="information-snmp" -->SNMP - -comp.protocpols.snmp SNMP FAQ Part 1 of 2 -IPv6 Infrastructure - -Statistics - -IPv6 routing table history created by Gert Döring, Space.NetOfficial 6bone Webserver list Statisic -Internet Exchanges -Another list of IPv6 Internet Exchanges can be found here: IPv6 status of IXPs in Europe -<!-- anchor id="information-ipv6exchanges-estonia" -->Estonia - -TIX (tallinn interneti exchange with ipv6 support) -<!-- anchor id="information-ipv6exchanges-europe" -->Europe - -Euro6IX, European IPv6 Internet Exchange Backbone -<!-- anchor id="information-ipv6exchanges-france" -->France - -French National Internet Exchange IPv6 (since 1.11.2002 active). -FNIX6 provides a free and reliable high speed FastEthernet interconnection between ISP located in TeleCity Paris. -<!-- anchor id="information-ipv6exchanges-germany" -->Germany - -INXS: (Cable & Wireless) Munich and Hamburg -<!-- anchor id="information-ipv6exchanges-japan" -->Japan - -NSPIXP-6: IPv6-based Internet Exchange in TokyoJPIX, Tokyo -<!-- anchor id="information-ipv6exchanges-korea" -->Korea - -6NGIX -<!-- anchor id="information-ipv6exchanges-netherlands" -->Netherlands - -AMS-IX: Amsterdam Internet Exchange -<!-- anchor id="information-ipv6exchanges-uk" -->UK - -UK6X: LondonXchangePoint: London -<!-- anchor id="information-ipv6exchanges-usa" -->USA - -6TAP: Chicago. Supports peerings around the globe.PAIX: Palo Alto -<!-- anchor id="information-Tunnelbroker" -->Tunnel broker -See also: http://www.deepspace6.net/docs/tunnelbrokers.html -<!-- anchor id="information-tunnelbroker-belgium" -->Belgium -Something missing? Suggestions are welcome! -<!-- anchor id="information-tunnelbroker-canada" -->Canada - -Freenet6 - /48 Delegation, Canada -Getting IPv6 Using Freenet6 on Debian -Freenet6 creater -<!-- anchor id="information-tunnelbroker-china" -->China -Something missing? Suggestions are welcome! -<!-- anchor id="information-tunnelbroker-estonia" -->Estonia - -Estpak -<!-- anchor id="information-tunnelbroker-germany" -->Germany - -6bone Knoten Leipzig -Info bez. Hackangriff (2001) -<!-- anchor id="information-tunnelbroker-italy" -->Italy - -Comv6Bersafe (Italian language) -<!-- anchor id="information-tunnelbroker-japan" -->Japan -Something missing? Suggestions are welcome! -<!-- anchor id="information-tunnelbroker-malaysia" -->Malaysia -Something missing? Suggestions are welcome! -<!-- anchor id="information-tunnelbroker-netherlands" -->Netherlands - -IPng Netherland - Intouch, SurfNet, AMS-IX, UUNet, Cistron, RIPE NCC and AT&T are connected at the AMS-IX. It is possible (there are requirements...) to get an static tunnel.SURFnet Customers -<!-- anchor id="information-tunnelbroker-norway" -->Norway - -UNINETT - Pilot IPv6 Service (for Customers): tunnelbroker & address allocation -Uninett-Autoupdate-HOWTO -<!-- anchor id="information-tunnelbroker-spain" -->Spain - -Consulintel -<!-- anchor id="information-tunnelbroker-switzerland" -->Switzerland -Something missing? Suggestions are welcome! -<!-- anchor id="information-tunnelbroker-uk" -->UK - -NTT, United Kingdom - IPv6 Trial. IPv4 Tunnel and native IPv6 leased Line connections. POPs are located in London, UK Dusseldorf, Germany New Jersey, USA (East Coast) Cupertino, USA (West Coast) Tokyo, Japan -<!-- anchor id="information-tunnelbroker-usa" -->USA - -ESnet, USA - Energy Sciences Network: Tunnel Registry & Address Delegation for directly connected ESnet sites and ESnet collaborators.Hurricane Electric, US backbone; -Hurrican Electric Tunnelbroker (also available under http://tunnelbroker.com/) -Press Release: Hurricane Electric Upgrades IPv6 Tunnel Broker -Tunnel Broker Endpoint Autoupdate, Perl Script -<!-- anchor id="information-tunnelbroker-singapore" -->Singapore -Something missing? Suggestions are welcome! -<!-- anchor id="information-tunnelbroker-more" -->More Tunnel brokers... - -Public 6to4 relay routers (MS IIE boycott!) -<!-- anchor id="information-infrastructure-nativeipv6service" -->Native IPv6 Services -Note: These services are mostly only available with a valid IPv6 connection! -<!-- anchor id="information-nativeipv6nntp" -->Net News (NNTP) -Something missing? Suggestions are welcome! -<!-- anchor id="information-nativeipv6gameserver" -->Game Server - -Quake2 over IPv6 -<!-- anchor id="information-nativeipv6ircserver" -->IRC Server -Something missing? Suggestions are welcome! -Radio Stations, Music Streams -Something missing? Suggestions are welcome! -<!-- anchor id="information-nativeipv6webserver" -->Webserver - -Peter Bieringer's Home of Linux IPv6 HOWTO Something missing? Suggestions are welcome! -<!-- anchor id="information-maillists" -->Maillists -Lists of maillists are available at: -DeepSpace6 / Mailling ListsMajor Mailinglists are listed in following table: - - - - - - - - - -Focus -Request e-mail address -What to subscribe -Maillist e-mail address -Language -Access through WWW - - -Linux kernel networking including IPv6 -majordomo (at) vger.kernel.org -netdev -netdev (at) vger.kernel.org -English -Info, Archive - - -Mobile IP(v6) for Linux -Web-based, see URL -mipl -mipl (at) mobile-ipv6.org -English -Info, Archive - - -Linux IPv6 users using USAGI extension -usagi-users-ctl (at) linux-ipv6.org - -usagi-users (at) linux-ipv6.org -English -Info / Search, Archive - - -IPv6 on Debian Linux - - -debian-ipv6 (at) lists.debian.org -English -Info/Subscription/Archive - - -6bone -majordomo (at) isi.edu -6bone -6bone (at) isi.edu -English -Info, Archive - - -IPv6 users in general -majordomo (at) ipv6.org -users -users (at) ipv6.org -English -Info, Archive - - -Bugtracking of Internet applications (1) -bugtraq-subscribe (at) securityfocus.com - -bugtraq (at) securityfocus.com (2) -English -Info, Archive - - - -(1) very recommended if you provide server applications. -(2) list is moderated. - -Something missing? Suggestions are welcome! - -Following other maillinglists & newsgroups are available via web: -student-ipv6 (India) -Description: This is the group for the Student Awareness group of IPv6 in Indiasun-ipv6-users -Description: Please report problems/suggestions regarding SUN Microsystems IPng implementationIPv6-BITS -Description: This List will co-ordinate the working of Project Vertebrae.linux-bangalore-ipv6 -Description: The IPv6 deployment list of the Bangalore Linux User Grouppacket-switching -Description: This mailing list provides a forum for discussion of packet switching theory, technology, implementation and application in any relevant aspect including without limitation LAPB, X.25, SDLC, P802.1d, LLC, IP, IPv6, IPX, DECNET, APPLETALK, FR, PPP, IP Telephony, LAN PBX systems, management protocols like SNMP, e-mail, network transparent window systems, protocol implementation, protocol verification, conformance testing and tools used in maintaining or developing packet switching systems.de.comm.protocols.tcp-ip -Description: Umstellung auf IPv6 -Source: Chartas der Newsgruppen in de.*Google Group: comp.protocols.tcp-ipGoogle Group: linux.debian.maint.ipv6Google Group: microsoft.public.platformsdk.networking.ipv6Google Group: fa.openbsd.ipv6 -<!-- anchor id="information-onlinetesttools" -->Online tools - -Testing tools - -ping, traceroute, tracepath, 6bone registry, DNS: JOIN / Testtools (German language only, but should be no problem for non German speakers)traceroute6, whois: IPng.nlAAAA Lookup Checker http://www.cnri.dit.ie/cgi-bin/check_aaaa.pl -Information retrievement - -List of worldwide all IPv6-aggregated IP-Blocks -IPv6 Looking Glasses - -DRENv6 Looking Glass -Helper applications - -IPv6 Prefix Calculator by TDOIDNS record checker -<!-- anchor id="information-trainingsandseminars" -->Trainings, Seminars - -CIW Internetworking Professional Training CBT CDTraining Pages, U.K. - Search for IPv6 (13 Courses, 2006-08-21)Erion IPv6 Training, UKSomething missing? Suggestions are welcome! -<!-- anchor id="information-onlinediscovery" -->'The Online Discovery' ... -IPv6: Addressing The Needs Of the Future by Yankee Group (Author) -List Price: $595.00 -Edition: e-book (Acrobat Reader) -Pages: 3 (three) -Publisher: MarketResearch.com; ISBN B00006334Y; (November 1, 2001) - -;-) The number of copies would be interesting... - -Revision history / Credits / The End - -<!-- anchor id="revision-history" -->Revision history -Versions x.y are published on the Internet. -Versions x.y.z are work-in-progress and published as LyX and SGML file on CVS. Because Deep Space 6 mirrors these SGML files and generate independend from TLDP public versions, this versions will show up there and also on its mirrors. -Releases 0.x - -0.652010-04-20/PB: extend QoS section with examples0.652009-12-13/PB: minor fixes0.642009-06-11/PB: extend DHCP server examples (ISC DHCP, Dibbler)0.632009-02-14/PB: Fix FSF address, major update on 4in6 tunnels, add new section for address resolving, add some URLs, remove broken URLs0.622008-11-09/PB: Adjust URL to Turkish howto, add some HIP related URLs, remove broken URLs0.61.12007-11-11/PB: fix broken description of shortcut BIND0.612007-10-06/PB: fix broken URLs to TLDP-CVS, minor URL update.0.60.22007-10-03/PB: fix description of sysctl/autoconf (credits to Francois-Xavier Le Bail)0.60.12007-06-16/PB: speling fixes (credits to Larry W. Burton)0.602007-05-29/PB: import major contribution to Programming using C-API written by John Wenker, minor fixes0.522007-05-23/PB: update firewalling chapter, improve document for proper SGML validation, minor bugfixes0.512006-11-08/PB: remove broken URLs, add a new book (credits to Bryan Vukich)0.50.22006-10-25/PB: fix typo in dhcp6 section (credits to Michele Ferritto)0.50.12006-09-23/PB: add some URLs0.502006-08-24/PB: check RFC URLs, fix URL to Chinese translation, finalize for publishing0.49.52006-08-23/PB: fix/remove broken URLs0.49.42006-08-21/PB: some review, update and enhancement of the content, replace old 6bone example addresses with the current defined ones.0.49.32006-08-20/PB: fix bug in maillist entries, 'mobility' is now a separate chapter0.49.22006-08-20/PB: update and cleanup of maillist entries0.49.12006-06-13/PB: major update of mobility section (contributed by Benjamin Thery)0.492005-10-03/PB: add configuration hints for DHCPv6, major broken URL cleanup (credits to Necdet Yucel)0.48.12005-01-15/PB: minor fixes0.482005-01-11/PB: grammar check and minor review of IPv6 IPsec section0.47.12005-01-01/PB: add information and examples about IPv6 IPsec, add some URLs0.472004-08-30/PB: add some notes about proftpd, vsftpd and other daemons, add some URLs, minor fixes, update status of Spanish translation0.46.42004-07-19/PB: minor fixes0.46.32004-06-23/PB: add note about started Greek translation, replace Taiwanese with Chinese for related translation0.46.22004-05-22/PB: minor fixes0.46.12004-04-18/PB: minor fixes0.462004-03-04/PB: announce Italian translation, add information about DHCPv6, minor updates0.45.12004-01-12/PB: add note about the official example address space0.452004-01-11/PB: minor fixes, add/fix some URLs, some extensions0.44.22003-10-30/PB: fix some copy&paste text bugs0.44.12003-10-19/PB: add note about start of Italian translation0.442003-08-15/PB: fix URLs, add hint on tcp_wrappers (about broken notation in some versions) and Apache20.43.42003-07-26/PB: fix URL, add archive URL for maillist users at ipv6.org, add some ds6 URLs0.43.32003-06-19/PB: fix typos0.43.22003-06-11/PB: fix URL0.43.12003-06-07/PB: fix some URLs, fix credits, add some notes at IPsec0.432003-06-05/PB: add some notes about configuration in SuSE Linux, add URL of French translation0.422003-05-09/PB: minor fixes, announce French translation0.41.42003-05-02/PB: Remove a broken URL, update some others.0.41.32003-04-23/PB: Minor fixes, remove a broken URL, fix URL to Taiwanese translation0.41.22003-04-13/PB: Fix some typos, add a note about a French translation is in progress0.41.12003-03-31/PB: Remove a broken URL, fix another0.412003-03-22/PB: Add URL of German translation0.40.22003-02-27/PB: Fix a misaddressed URL0.40.12003-02-12/PB: Add Debian-Linux-Configuration, add a minor note on translations0.402003-02-10/PB: Announcing available German version0.39.22003-02-10/GK: Minor syntax and spelling fixes0.39.12003-01-09/PB: fix an URL (draft adopted to an RFC)0.392003-01-13/PB: fix a bug (forgotten 'link” on “ip link set” (credits to Yaniv Kaul)0.38.12003-01-09/PB: a minor fix0.382003-01-06/PB: minor fixes0.37.12003-01-05/PB: minor updates0.372002-12-31/GK: 270 new links added (searched in 1232 SearchEngines) in existing and 53 new (sub)sections0.36.12002-12-20/PB: Minor fixes0.362002-12-16/PB: Check of and fix broken links (credits to Georg Käfer), some spelling fixes0.352002-12-11/PB: Some fixes and extensions0.34.12002-11-25/PB: Some fixes (e.g. broken linuxdoc URLs)0.342002-11-19/PB: Add information about German translation (work in progress), some fixes, create a small shortcut explanation list, extend “used terms” and add two German books0.332002-11-18/PB: Fix broken RFC-URLs, add parameter ttl on 6to4 tunnel setup example0.322002-11-03/PB: Add information about Taiwanese translation0.31.12002-10-06/PB: Add another maillist0.312002-09-29/PB: Extend information in proc-filesystem entries0.302002-09-27/PB: Add some maillists0.292002-09-18/PB: Update statement about nmap (triggered by Fyodor)0.28.12002-09-16/PB: Add note about ping6 to multicast addresses, add some labels0.282002-08-17/PB: Fix broken LDP/CVS links, add info about Polish translation, add URL of the IPv6 Address Oracle0.272002-08-10/PB: Some minor updates0.26.22002-07-15/PB: Add information neighbor discovery, split of firewalling (got some updates) and security into extra chapters0.26.12002-07-13/PB: Update nmap/IPv6 information0.262002-07-13/PB: Fill /proc-filesystem chapter, update DNS information about depricated A6/DNAME, change P-t-P tunnel setup to use of “ip” only0.25.22002-07-11/PB: Minor spelling fixes0.25.12002-06-23/PB: Minor spelling and other fixes0.252002-05-16/PB: Cosmetic fix for 2^128, thanks to José Abílio Oliveira Matos for help with LyX0.242002-05-02/PB: Add entries in URL list, minor spelling fixes0.232002-03-27/PB: Add entries in URL list and at maillists, add a label and minor information about IPv6 on RHL0.222002-03-04/PB: Add info about 6to4 support in kernel series 2.2.x and add an entry in URL list and at maillists0.212002-02-26/PB: Migrate next grammar checks submitted by John Ronan 0.20.42002-02-21/PB: Migrate more grammar checks submitted by John Ronan, add some additional hints at DNS section 0.20.32002-02-12/PB: Migrate a minor grammar check patch submitted by John Ronan0.20.22002-02-05/PB: Add mipl to maillist table0.20.12002-01-31/PB: Add a hint how to generate 6to4 addresses0.202002-01-30/PB: Add a hint about default route problem, some minor updates0.19.22002-01-29/PB: Add many new URLs0.19.12002-01-27/PB: Add some forgotten URLs0.192002-01-25/PB: Add two German books, fix quote entinities in exported SGML code0.18.22002-01-23/PB: Add a FAQ on the program chapter0.18.12002-01-23/PB: Move “the end” to the end, add USAGI to maillists0.182002-01-22/PB: Fix bugs in explanation of multicast address types0.17.22002-01-22/PB: Cosmetic fix double existing text in history (at 0.16), move all credits to the end of the document0.17.12002-01-20/PB: Add a reference, fix URL text in online-test-tools0.172002-01-19/PB: Add some forgotten information and URLs about global IPv6 addresses0.162002-01-19/PB: Minor fixes, remove “bold” and “emphasize” formats on code lines, fix “too long unwrapped code lines” using selfmade utility, extend list of URLs.0.152002-01-15/PB: Fix bug in addresstype/anycast, move content related credits to end of document0.142002-01-14/PB: Minor review at all, new chapter “debugging”, review “addresses”, spell checking, grammar checking (from beginning to 3.4.1) by Martin Krafft, add tcpdump examples, copy firewalling/netfilter6 from IPv6+Linux-HowTo, minor enhancements0.132002-01-05/PB: Add example BIND9/host, move revision history to end of document, minor extensions0.122002-01-03/PB: Merge review of David Ranch0.112002-01-02/PB: Spell checking and merge review of Pekka Savola0.102002-01-02/PB: First public release of chapter 1 -<!-- anchor id="credits" -->Credits -The quickest way to be added to this nice list is to send bug fixes, corrections, and/or updates to me ;-). -If you want to do a major review, you can use the native LyX file (see original source) and send diffs against it, because diffs against SGML don't help too much. -<!-- anchor id="major-credits" -->Major credits - -David Ranch <dranch at trinnet dot net>: For encouraging me to write this HOWTO, his editorial comments on the first few revisions, and his contributions to various IPv6 testing results on my IPv6 web site. Also for his major reviews and suggestions.Pekka Savola <pekkas at netcore dot fi>: For major reviews, input and suggestions.Martin F. Krafft <madduck at madduck dot net>: For grammar checks and general reviewing of the document.John Ronan <j0n at tssg dot wit dot ie>: For grammar checks.Georg Käfer <gkaefer at gmx dot at>: For detection of no proper PDF creation (fixed now by LDP maintainer Greg Ferguson), input for German books, big list of URLs, checking all URLs, many more suggestions, corrections and contributions, and the German translationMichel Boucey <mboucey at free dot fr>: Finding typos and some broken URLs, contribute some suggestions and URLs, and the French translationMichele Ferritto <m dot ferritto at virgilio dot it>: Finding bugs and the Italian translationDaniel Roesen <dr at cluenet dot de>: For grammar checksBenjamin Thery <benjamin dot thery at bull dot net>: For contribution of updated mobility sectionJohn Wenker <jjw at pt dot com>: major contribution to Programming using C-APISrivats P. <Srivats dot P at conexant dot com>: major contribution for 4in6 tunnels -Other credits - -Document technique related -Writing a LDP HOWTO as a newbie (in LyX and exporting this to DocBook to conform to SGML) isn't as easy as some people say. There are some strange pitfalls... Nevertheless, thanks to: -Authors of the LDP Author GuideB. Guillon: For his DocBook with LyX HOWTO -<!-- anchor id="content-related-credits" -->Content related credits -Credits for fixes and hints are listed here, will grow sure in the future -S .P. Meenakshi <meena at cs dot iitm dot ernet dot in>: For a hint using a “send mail” shell program on tcp_wrapper/hosts.denyFrank Dinies <FrankDinies at web dot de>: For a bugfix on IPv6 address explanationJohn Freed <jfreed at linux-mag dot com>: For finding a bug in IPv6 multicast address explanationCraig Rodrigues <crodrigu at bbn dot com>: For suggestion about RHL IPv6 setupFyodor <fyodor at insecure dot org>: Note me about outdated nmap informationMauro Tortonesi <mauro at deepspace6 dot net>: For some suggestionsTom Goodale <goodale at aei-potsdam dot mpg dot de>: For some suggestionsMartin Luemkemann <mluemkem at techfak dot uni-bielefeld dot de>: For a suggestionJean-Marc V. Liotier <jim at jipo dot com>: Finding a bugYaniv Kaul <ykaul at checkpoint dot com>: Finding a bugArnout Engelen <arnouten at bzzt dot net>: For sending note about a draft was adopted to RFC nowStephane Bortzmeyer <bortzmeyer at nic dot fr>: Contributing persistent configuration on Debianlithis von saturnsys <lithis at saturnsys dot com>: Reporting a misaddressed URLGuy Hulbert <gwhulbert at rogers dot com>: Send a note that RFC1924 is probably an April fool's jokeTero Pelander <tpeland at tkukoulu dot fi>: Reporting a broken URLWalter Jontofsohn <wjontof at gmx dot de>: Hints for SuSE Linux 8.0/8.1Benjamin Hofstetter <benjamin dot hofstetter at netlabs dot org>: Reporting a mispointing URLJ.P. Larocque <piranha at ely dot ath dot cx>: Reporting archive URL for maillist users at ipv6 dot orgJorrit Kronjee <jorrit at wafel dot org>: Reporting broken URLsColm MacCarthaigh <colm dot maccarthaigh at heanet dot ie>: Hint for sendfile issue on Apache2Tiago Camilo <tandre at ipg dot pt>: Contribute some URLs about Mobile IPv6Harald Geiger: Reporting a bug in how described the bit counting of the universal/global bitBjoern Jacke <bjoern at j3e dot de>: Triggered me to fix some outdated information on xinetdChristoph Egger <cegger at chrrr dot com>: Sending note about “ip” has problems with IPv4-compatible addresses on SuSE Linux 9.0 and trigger to add a hint on 6to4-radvd exampleDavid Lee Haw Ling <hawling at singnet dot com dot sg>: Sending information about a tunnel brokerMichael H. Warfield <mhw at iss dot net>: Sending note about suffix for 6to4 routersTomasz Mrugalski <thomson at klub dot com dot pl>: Sending updates for DHCPv6 sectionJan Minar <jjminar at fastmail dot fm>: Reporting minor bugsKalin KOZHUHAROV <kalin at tar dot bz>: Fixing a not so well explanationRoel van Dijk <rdvdijk at planet dot nl>: Reporting broken URLsCatalin Muresan <catalin dot muresan at astral dot ro>: Reporting minor bugsDennis van Dok <dvandok at quicknet dot nl>: Reporting minor bugsNecdet Yucel <nyucel at comu dot edu dot tr>: Reporting broken URLsBryan Vukich: Reporting a broken URLDaniele Masini: reporting a broken iptables exampleYao Zhao: reporting a bug in IPv6 route remove descriptionAaron Kunde: reporting a broken URL and a content related bugLarry W. Burton: speling fixesJustin Pryzby: reporting broken shortcut description of BIND -The End -Thanks for reading. Hope it helps! -If you have any questions, subscribe to proper maillist and describe your problem providing as much as information as possible. \ No newline at end of file diff --git a/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.sgml b/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.sgml deleted file mode 100644 index a38faf1c..00000000 --- a/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.sgml +++ /dev/null @@ -1,5307 +0,0 @@ - - - - - ]> - - - - -Linux IPv6 HOWTO (en) -PeterBieringer
    pb at bieringer dot de
    - - 0.67wip 2016-12-15 PB - 0.66 2014-05-15 PB - 0.65 2009-12-13 PB - 0.64 2009-06-11 PB - 0.60 2007-05-31 PB - 0.51 2006-11-08 PB - -The goal of the Linux IPv6 HOWTO is to answer both basic and advanced questions about IPv6 on the Linux operating system. This HOWTO will provide the reader with enough information to install, configure, and use IPv6 applications on Linux machines. Intermediate releases of this HOWTO are available at mirrors.bieringer.de or mirrors.deepspace6.net. See also revision history for changes. -
    -<!-- anchor id="chapter-general" -->General -Information about available translations you will find in section Translations. -<!-- anchor id="general-copright" -->Copyright, license and others - -Copyright -Written and Copyright (C) 2001-2014 by Peter Bieringer -License -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 © 2001-2014 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA. -About the author - -Internet/IPv6 history of the author - -1993: I got in contact with the Internet using console based e-mail and news client (e.g. look for “e91abier” on groups.google.com, that's me).1996: I got a request for designing a course on IPv6, including a workshop with the Linux operating system.1997: Started writing a guide on how to install, configure and use IPv6 on Linux systems, called IPv6 & Linux - HowTo (see IPv6 & Linux - HowTo/History for more information).2001: Started writing this new Linux IPv6 HOWTO. -Contact -The author can be contacted via e-mail at <pb at bieringer dot de> and also via his homepage. -He's currently living in Munich / Bavaria / Germany / Europe / Earth. -<!-- anchor id="general-category" -->Category -This HOWTO should be listed in category “Networking/Protocols”. -Version, History and To-Do - -Version -The current version is shown at the beginning of the document. -For other available versions/translations see also http://www.bieringer.de/linux/IPv6/. -History - -Major history -2001-11-30: Starting to design new HOWTO. -2002-01-02: A lot of content completed, first public release of chapter 1 (version 0.10). -2002-01-14: More completed, some reviews, public release of the whole document (version 0.14). -2002-08-16: Polish translation is in progress -2002-10-31: Chinese translation is available (see Translations for more) -2002-11-10: German translation is in progress -2003-02-10: German translation is available -2003-04-09: French translation is in progress -2003-05-09: French translation is available -2003-10-16: Italian translation is in progress -2004-03-12: Italian translation is available -2004-06-18: Greek translation is in progress -2005-07-25: Turkish translation is availble -2007-03-28: Portuguese-Brazil translation is in progress -2008-07-30: Spanish translation is available (but still in progress) -2011-05-09: Portuguese-Brazil translation is again in progress -Full history -See revision history at the end of this document. -To-Do - -Fill in missing contentFinishing grammar checking -<!-- anchor id="general-translations" -->Translations -Translations always have to contain the URL, version number and copyright of the original document (but yours, too). Pls. don't translate the original changelog, this is not very useful - also do not translate the full section about available translations, can be run out-of-date, add an URL to this section here in the English howto. -Looks like the document's change frequency is mostly less than once per month. Since version 0.27 it looks like that most of the content contributed by me has been written. Translations always have to use the English version as source. -To language -Note: an overview with URLs can be found at http://www.bieringer.de/linux/IPv6/. -Chinese -A Chinese translation by Burma Chen <expns at yahoo dot com> (announced to me at 2002-10-31) can be found on the TLDP: http://www.ibiblio.org/pub/Linux/docs/HOWTO/translations/zh/Linux-IPv6-HOWTO.txt.gz (g'zipped txt). It's a snapshot translation, don't know whether kept up-to-date. -Polish -Since 2002-08-16 a Polish translation was started and is still in progress by Lukasz Jokiel <Lukasz dot Jokiel at klonex dot com dot pl>. Taken source: CVS-version 1.29 of LyX file, which was source for howto version 0.27. Status is still work-in-progress (2004-08-30). -German -With 2002-11-10 a German translation was started by Georg Käfer <gkaefer at gmx dot at> and the first public version was published 2003-02-10. It's originally available on Deep Space 6 at http://mirrors.deepspace6.net/Linux+IPv6-HOWTO-de/ (mirrored e.g. on http://mirrors.bieringer.de/Linux+IPv6-HOWTO-de/). This version will stay up-to-date as much as possible. -French -With 2003-04-09 a French translation was started by Michel Boucey <mboucey at free dot fr> and the first public version was published 2003-05-09. It's originally available on Deep Space 6 at http://mirrors.deepspace6.net/Linux+IPv6-HOWTO-fr/ (mirrored e.g. on http://mirrors.bieringer.de/Linux+IPv6-HOWTO-fr/). -Spanish -A member of the MontevideoLibre, a project in Uruguay (South America) started the translation into Spanish in wiki format some time ago, but the URL is no longer available. -Italian -With 2003-10-16 a Italian translation was started by Michele Ferritto <m dot ferritto at virgilio dot it> for the ILDP (Italian Linux Documentation Project) and the first public version was published 2004-03-12. It's originally available on the ILDP at http://it.tldp.org/HOWTO/Linux+IPv6-HOWTO/. -Japanese -On 2003-05-14 Shino Taketani <shino_1305 at hotmail dot com> send me a note that he planned to translate the HowTo into Japanese. -Greek -On 2004-06-18 Nikolaos Tsarmpopoulos <ntsarb at uth dot gr> send me a note that he planned to translate the HowTo into Greek. -Turkish -On 2005-07-18 Necdet Yucel <nyucel at comu dot edu dot tr> send me a note that a Turkish translation is available. It's a snapshot translation (currently of 0.61) and can be found at http://docs.comu.edu.tr/howto/ipv6-howto.html. -Portuguese-Brazil -On 2011-05-06 Gustavo Mendes de Carvalho <gmcarvalho at gmail dot com> start to translate the HowTo in Portuguese-Brazil. The first try in 2007 by Claudemir da Luz <claudemir dot daluz at virtuallink dot com dot br> was never finished. -Technical - -<!-- anchor id="general-original-source" -->Original source of this HOWTO -This HOWTO is currently written with LyX version 1.6.1 on a Fedora 10 Linux system with template SGML/XML (DocBook book). It's available on github / tLDP / LDP / users / Peter-Bieringer for contribution. -Code line wrapping -Code line wrapping is done using selfmade utility “lyxcodelinewrapper.pl”, you can get it from CVS for your own usage: TLDP-CVS / users / Peter-Bieringer -SGML generation -SGML/XML is generated using export function in LyX. -On-line references to the HTML version of this HOWTO (linking/anchors) - -Master index page -Generally, a reference to the master index page is recommended. -Dedicated pages -Because the HTML pages are generated out of the SGML file, the HTML filenames turn out to be quite random. However, some pages are tagged in LyX, resulting in static names. These tags are useful for references and shouldn't be changed in the future. -If you think that I have forgotten a tag, please let me know, and I will add it. -Preface -Some things first: -How many versions of a Linux & IPv6 related HOWTO are floating around? -Including this, there are three (3) HOWTO documents available. Apologies, if that is too many ;-) -Linux IPv6 FAQ/HOWTO (outdated) -The first IPv6 related document was written by Eric Osborne and called Linux IPv6 FAQ/HOWTO (please use it only for historical issues). Latest version was 3.2.1 released July, 14 1997. -Please help: if someone knows the date of birth of this HOWTO, please send me an e-mail (information will be needed in “history”). -IPv6 & Linux - HowTo (maintained) -There exists a second version called IPv6 & Linux - HowTo written by me (Peter Bieringer) in pure HTML. It was born April 1997 and the first English version was published in June 1997. I will continue to maintain it, but it will slowly fade (but not full) in favour of the Linux IPv6 HOWTO you are currently reading. -Linux IPv6 HOWTO (this document) -Because the IPv6 & Linux - HowTo is written in pure HTML it's not really compatible with the The Linux Documentation Project (TLDP). I (Peter Bieringer) got a request in late November 2001 to rewrite the IPv6 & Linux - HowTo in SGML. However, because of the discontinuation of that HOWTO (Future of IPv6 & Linux - HowTo), and as IPv6 is becoming more and more standard, I decided to write a new document covering basic and advanced issues which will remain important over the next few years. More dynamic and some advanced content will be still found further on in the second HOWTO (IPv6 & Linux - HowTo). -Used terms, glossary and shortcuts - -Network related - -Base 10Well known decimal number system, represent any value with digit 0-9.Base 16Usually used in lower and higher programming languages, known also as hexadecimal number system, represent any value with digit 0-9 and char A-F (case insensitive).Base 85Representation of a value with 85 different digits/chars, this can lead to shorter strings but never seen in the wild.BitSmallest storage unit, on/true (1) or off/false (0)ByteMostly a collection of 8 (but not really a must - see older computer systems) bitsDeviceHere, hardware of network connection, see also NICDual homed hostA dual homed host is a node with two network (physical or virtual) interfaces on two different links, but does not forward any packets between the interfaces.HostGenerally a single homed host on a link. Normally it has only one active network interface, e.g. Ethernet or (not and) PPP.InterfaceMostly same as “device”, see also NICIP HeaderHeader of an IP packet (each network packet has a header, kind of is depending on network layer)LinkA link is a layer 2 network packet transport medium, examples are Ethernet, Token Ring, PPP, SLIP, ATM, ISDN, Frame Relay,...NodeA node is a host or a router.OctetA collection of 8 real bits, today also similar to “byte”.PortInformation for the TCP/UDP dispatcher (layer 4) to transport information to upper layersProtocolEach network layer contains mostly a protocol field to make life easier on dispatching transported information to upper layer, seen in layer 2 (MAC) and 3 (IP)RouterA router is a node with two or more network (physical or virtual) interfaces, capable of forwarding packets between the interfaces.SocketAn IP socket is defined by source and destination IP addresses and Ports and (binding) StackNetwork related a collection of layersSubnetmaskIP networks uses bit masks to separate local networks from remote onesTunnelA tunnel is typically a point-to-point connection over which packets are exchanged which carry the data of another protocol, e.g. an IPv6-in-IPv4 tunnel. -<!-- anchor id="Glossar" -->Shortcuts - -ACLAccess Control ListAPIApplication Programming InterfaceASICApplication Specified Integrated CircuitBSDBerkeley Software DistributionCAN-BusController Area Network Bus (physical bus system)ISPInternet Service ProviderKAMEProject - a joint effort of six companies in Japan to provide a free IPv6 and IPsec (for both IPv4 and IPv6) stack for BSD variants to the world www.kame.netLIRLocal Internet RegistryNICNetwork Interface CardRFCRequest For Comments - set of technical and organizational notes about the InternetUSAGIUniverSAl playGround for Ipv6 Project - works to deliver the production quality IPv6 protocol stack for the Linux system. -Document related - -Long code line wrapping signal char -The special character “¬” is used for signaling that this code line is wrapped for better viewing in PDF and PS files. -Placeholders -In generic examples you will sometimes find the following: - -]]>For real use on your system command line or in scripts this has to be replaced with relevant content (removing the < and > of course), the result would be e.g. - -Commands in the shell -Commands executable as non-root user begin with $, e.g. -Commands executable as root user begin with #, e.g. - -Requirements for using this HOWTO - -Personal prerequisites - -Experience with Unix tools -You should be familiar with the major Unix tools e.g. grep, awk, find, ... , and know about their most commonly used command-line options. -Experience with networking theory -You should know about layers, protocols, addresses, cables, plugs, etc. If you are new to this field, here is one good starting point for you: http://www.rigacci.org/docs/biblio/online/intro_to_networking/book1.htm -Experience with IPv4 configuration -You should definitely have some experience in IPv4 configuration, otherwise it will be hard for you to understand what is really going on. -Experience with the Domain Name System (DNS) -Also you should understand what the Domain Name System (DNS) is, what it provides and how to use it. -Experience with network debugging strategies -You should at least understand how to use tcpdump and what it can show you. Otherwise, network debugging will very difficult for you. -Linux operating system compatible hardware -Surely you wish to experiment with real hardware, and not only read this HOWTO to fall asleep here and there. ;-7) -<!-- anchor id="chapter-basics" -->Basics - -What is IPv6? -IPv6 is a new layer 3 protocol which will supersede IPv4 (also known as IP). IPv4 was designed a long time ago (RFC 760 / Internet Protocol from January 1980) and since its inception, there have been many requests for more addresses and enhanced capabilities. Latest RFC is RFC 2460 / Internet Protocol Version 6 Specification. Major changes in IPv6 are the redesign of the header, including the increase of address size from 32 bits to 128 bits. Because layer 3 is responsible for end-to-end packet transport using packet routing based on addresses, it must include the new IPv6 addresses (source and destination), like IPv4. -For more information about the IPv6 history take a look at older IPv6 related RFCs listed e.g. at SWITCH IPv6 Pilot / References. -<!-- anchor id="basic-history-IPv6-Linux" -->History of IPv6 in Linux -The years 1992, 1993 and 1994 of the IPv6 History (in general) are covered by the following document: IPv6 or IPng (IP next generation). -To-do: better time-line, more content... -Beginning -The first IPv6 related network code was added to the Linux kernel 2.1.8 in November 1996 by Pedro Roque. It was based on the BSD API: - -+ * -+ * Source: -+ * IPv6 Program Interfaces for BSD Systems -+ * -]]>The shown lines were copied from patch-2.1.8 (e-mail address was blanked on copy&paste). -In between -Because of lack of manpower, the IPv6 implementation in the kernel was unable to follow the discussed drafts or newly released RFCs. In October 2000, a project was started in Japan, called USAGI, whose aim was to implement all missing, or outdated IPv6 support in Linux. It tracks the current IPv6 implementation in FreeBSD made by the KAME project. From time to time they create snapshots against current vanilla Linux kernel sources. -Until kernel development series 2.5.x was started, the USAGI patch was so big, that Linux networking maintainers were unable to include it completly in the production source of the Linux kernel 2.4.x series. -During kernel development series 2.5.x, USAGI tried to insert all of their current extensions into this. -Current -Many of the long-term developed IPv6 related patches by USAGI and others are integrated into vanilla kernel series 2.6.x. -Future -USAGI and others are still working on implementation of newer features like mobililty and others. From time to time, new extension patches are released and also integration into vanilla kernel series is made. -What do IPv6 addresses look like? -As previously mentioned, IPv6 addresses are 128 bits long. This number of bits generates very high decimal numbers with up to 39 digits: -Such numbers are not really addresses that can be memorized. Also the IPv6 address schema is bitwise oriented (just like IPv4, but that's not often recognized). Therefore a better notation of such big numbers is hexadecimal. In hexadecimal, 4 bits (also known as “nibble”) are represented by a digit or character from 0-9 and a-f (10-15). This format reduces the length of the IPv6 address to 32 characters. -This representation is still not very convenient (possible mix-up or loss of single hexadecimal digits), so the designers of IPv6 chose a hexadecimal format with a colon as separator after each block of 16 bits. In addition, the leading "0x" (a signifier for hexadecimal values used in programming languages) is removed: -A usable address (see address types later) is e.g.: -For simplifications, leading zeros of each 16 bit block can be omitted: - -¬ 2001:db8:100:f101:210:a4ff:fee3:9566 -]]>One sequence of 16 bit blocks containing only zeroes can be replaced with “::“. But not more than one at a time, otherwise it is no longer a unique representation. - 2001:db8:100:f101::1 -]]>The biggest reduction is seen by the IPv6 localhost address: - ::1 -]]>There is also a so-called compact (base85 coded) representation defined in RFC 1924 / A Compact Representation of IPv6 Addresses (published on 1. April 1996), never seen in the wild, probably an April fool's joke, but here is an example: -
    -Info: ipv6calc is an IPv6 address format calculator and converter program and can be found here: ipv6calc homepage (Mirror) -
    -FAQ (Basics) - -Why is the name IPv6 and not IPv5 as successor for IPv4? -On any IP header, the first 4 bits are reserved for protocol version. So theoretically a protocol number between 0 and 15 is possible: -4: is already used for IPv45: is reserved for the Stream Protocol (STP, RFC 1819 / Internet Stream Protocol Version 2) (which never really made it to the public)The next free number was 6. Hence IPv6 was born! -IPv6 addresses: why such a high number of bits? -During the design of IPv4, people thought that 32 bits were enough for the world. Looking back into the past, 32 bits were enough until now and will perhaps be enough for another few years. However, 32 bits are not enough to provide each network device with a global address in the future. Think about mobile phones, cars (including electronic devices on its CAN-bus), toasters, refrigerators, light switches, and so on... -So designers have chosen 128 bits, 4 times more in length than in IPv4 today. -The usable size is smaller than it may appear however. This is because in the currently defined address schema, 64 bits are used for interface identifiers. The other 64 bits are used for routing. Assuming the current strict levels of aggregation (/48, /32, ...), it is still possible to “run out” of space, but hopefully not in the near future. -See also for more information RFC 1715 / The H Ratio for Address Assignment Efficiency and RFC 3194 / The Host-Density Ratio for Address Assignment Efficiency. -IPv6 addresses: why so small a number of bits on a new design? -While, there are (possibly) some people (only know about Jim Fleming...) on the Internet who are thinking about IPv8 and IPv16, their design is far away from acceptance and implementation. In the meantime 128 bits was the best choice regarding header overhead and data transport. Consider the minimum Maximum Transfer Unit (MTU) in IPv4 (576 octets) and in IPv6 (1280 octets), the header length in IPv4 is 20 octets (minimum, can increase to 60 octets with IPv4 options) and in IPv6 is 40 octets (fixed). This is 3.4 % of minimum MTU in IPv4 and 3.1 % of minimum MTU in IPv6. This means the header overhead is almost equal. More bits for addresses would require bigger headers and therefore more overhead. Also, consider the maximum MTU on normal links (like Ethernet today): it's 1500 octets (in special cases: 9k octets using Jumbo frames). Ultimately, it wouldn't be a proper design if 10 % or 20 % of transported data in a Layer-3 packet were used for addresses and not for payload.
    -<!-- anchor id="chapter-addresstypes" -->Address types -Like IPv4, IPv6 addresses can be split into network and host parts using subnet masks. -IPv4 has shown that sometimes it would be nice, if more than one IP address can be assigned to an interface, each for a different purpose (aliases, multi-cast). To remain extensible in the future, IPv6 is going further and allows more than one IPv6 address to be assigned to an interface. There is currently no limit defined by an RFC, only in the implementation of the IPv6 stack (to prevent DoS attacks). -Using this large number of bits for addresses, IPv6 defines address types based on some leading bits, which are hopefully never going to be broken in the future (unlike IPv4 today and the history of class A, B, and C). - -Also the number of bits are separated into a network part (upper 64 bits) and a host part (lower 64 bits), to facilitate auto-configuration. -Addresses without a special prefix - -Localhost address -This is a special address for the loopback interface, similiar to IPv4 with its “127.0.0.1”. With IPv6, the localhost address is: -or compressed: -Packets with this address as source or destination should never leave the sending host. -Unspecified address -This is a special address like “any” or “0.0.0.0” in IPv4 . For IPv6 it's: -or: -These addresses are mostly used/seen in socket binding (to any IPv6 address) or routing tables. -Note: the unspecified address cannot be used as destination address. -IPv6 address with embedded IPv4 address -There are two addresses which contain an IPv4 address. -IPv4-mapped IPv6 address -IPv4-only IPv6-compatible addresses are sometimes used/shown for sockets created by an IPv6-enabled daemon, but only binding to an IPv4 address. -These addresses are defined with a special prefix of length 96 (a.b.c.d is the IPv4 address): -or in compressed format -For example, the IPv4 address 1.2.3.4 looks like this: - -IPv4-compatible IPv6 address -IPv4-compatible IPv6 addresses are used for automatic tunneling (RFC 2893 / Transition Mechanisms for IPv6 Hosts and Routers), which is being replaced by 6to4 tunneling. -or in compressed format - -Network part, also known as prefix -Designers defined some address types and left a lot of scope for future definitions as currently unknown requirements arise. RFC 4291 / IP Version 6 Addressing Architecture defines the current addressing scheme. - -Now lets take a look at the different types of prefixes (and therefore address types): -Link local address type -These are special addresses which will only be valid on a link of an interface. Using this address as destination the packet would never pass through a router. It's used for link communications such as: -anyone else here on this link?anyone here with a special address (e.g. looking for a router)?They begin with ( where “x” is any hex character, normally “0”) -An address with this prefix is found on each IPv6-enabled interface after stateless auto-configuration (which is normally always the case). -Site local address type -These are addresses similar to the RFC 1918 / Address Allocation for Private Internets in IPv4 today, with the added advantage that everyone who use this address type has the capability to use the given 16 bits for a maximum number of 65536 subnets. Comparable with the 10.0.0.0/8 in IPv4 today. -Another advantage: because it's possible to assign more than one address to an interface with IPv6, you can also assign such a site local address in addition to a global one. -It begins with: -(where “x” is any hex character, normally “0”) -This address type is now deprecated RFC 3879 / Deprecating Site Local Addresses, but for a test in a lab, such addresses are still a good choice in my humble opinion. -Unique Local IPv6 Unicast Addresses -Because the original defined site local addresses are not unique, this can lead to major problems, if two former independend networks would be connected later (overlapping of subnets). This and other issues lead to a new address type named RFC 4193 / Unique Local IPv6 Unicast Addresses. - -It begins with: -A part of the prefix (40 bits) are generated using a pseudo-random algorithm and it's improbable, that two generated ones are equal. -Example for a prefix (generated using a web-based tool: Goebel Consult / createLULA): - -Global address type "(Aggregatable) global unicast" -Today, there is one global address type defined (the first design, called "provider based," was thrown away some years ago RFC 1884 / IP Version 6 Addressing Architecture [obsolete], you will find some remains in older Linux kernel sources). -It begins with (x are hex characters) -Note: the prefix “aggregatable” is thrown away in current drafts. -There are some further subtypes defined, see below: -6bone test addresses -These were the first global addresses which were defined and in use. They all start with -Example: -A special 6bone test address which will never be globally unique begins with -and is mostly shown in older examples. The reason for this is, if real addresses are are shown, it's possible for someone to do a copy & paste to their configuration files, thus inadvertently causing duplicates on a globally unique address. This would cause serious problems for the original host (e.g. getting answer packets for request that were never sent). -Because IPv6 is now in production, this prefix is no longer be delegated and is removed from routing after 6.6.2006 (see RFC 3701 / 6bone Phaseout for more). -6to4 addresses -These addresses, designed for a special tunneling mechanism [RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds and RFC 2893 / Transition Mechanisms for IPv6 Hosts and Routers], encode a given IPv4 address and a possible subnet and begin with -For example, representing 192.168.1.1/5: -A small shell command line can help you generating such address out of a given IPv4 one: -See also tunneling using 6to4 and information about 6to4 relay routers. -Assigned by provider for hierarchical routing -These addresses are delegated to Internet service providers (ISP) and begin currently with -Prefixes to major (backbone owning) ISPs (also known as LIRs) are delegated by local registries and currently have a prefix with length 32 assigned. -Any ISP customer can get a prefix with length 48. -Addresses reserved for examples and documentation -Currently, two address ranges are reserved for examples and documentation RFC 3849 / IPv6 Address Prefix Reserved for Documentation: -These address ranges should be filtered based on source addresses and should NOT be routed on border routers to the internet, if possible. -Multicast addresses -Multicast addresses are used for related services. -They alway start with (xx is the scope value) -They are split into scopes and types: -Multicast scopes -Multicast scope is a parameter to specify the maximum distance a multicast packet can travel from the sending entity. -Currently, the following regions (scopes) are defined: -ffx1: node-local, packets never leave the node.ffx2: link-local, packets are never forwarded by routers, so they never leave the specified link.ffx5: site-local, packets never leave the site.ffx8: organization-local, packets never leave the organization (not so easy to implement, must be covered by routing protocol).ffxe: global scope.others are reserved -Multicast types -There are many types already defined/reserved (see RFC 4291 / IP Version 6 Addressing Architecture for details). Some examples are: -All Nodes Address: ID = 1h, addresses all hosts on the local node (ff01:0:0:0:0:0:0:1) or the connected link (ff02:0:0:0:0:0:0:1).All Routers Address: ID = 2h, addresses all routers on the local node (ff01:0:0:0:0:0:0:2), on the connected link (ff02:0:0:0:0:0:0:2), or on the local site (ff05:0:0:0:0:0:0:2) -Solicited node link-local multicast address -Special multicast address used as destination address in neighborhood discovery, because unlike in IPv4, ARP no longer exists in IPv6. -An example of this address looks like -Used prefix shows that this is a link-local multicast address. The suffix is generated from the destination address. In this example, a packet should be sent to address “fe80::1234”, but the network stack doesn't know the current layer 2 MAC address. It replaces the upper 104 bits with “ff02:0:0:0:0:1:ff00::/104” and leaves the lower 24 bits untouched. This address is now used `on-link' to find the corresponding node which has to send a reply containing its layer 2 MAC address. -Anycast addresses -Anycast addresses are special addresses and are used to cover things like nearest DNS server, nearest DHCP server, or similar dynamic groups. Addresses are taken out of the unicast address space (aggregatable global or site-local at the moment). The anycast mechanism (client view) will be handled by dynamic routing protocols. -Note: Anycast addresses cannot be used as source addresses, they are only used as destination addresses. -Subnet-router anycast address -A simple example for an anycast address is the subnet-router anycast address. Assuming that a node has the following global assigned IPv6 address: -The subnet-router anycast address will be created blanking the suffix (least significant 64 bits) completely: - -Address types (host part) -For auto-configuration and mobility issues, it was decided to use the lower 64 bits as the host part of the address in most of the current address types. Therefore each single subnet can hold a large amount of addresses. -This host part can be inspected differently: -Automatically computed (also known as stateless) -With auto-configuration, the host part of the address is computed by converting the MAC address of an interface (if available), with the EUI-64 method, to a unique IPv6 address. If no MAC address is available for this device (happens e.g. on virtual devices), something else (like the IPv4 address or the MAC address of a physical interface) is used instead. -E.g. a NIC has following MAC address (48 bit): -This would be expanded according to theIEEE-Tutorial EUI-64 design for EUI-48 identifiers to the 64 bit interface identifier: -With a given prefix, the result is the IPv6 address shown in example above: - -Privacy problem with automatically computed addresses and a solution -Because the "automatically computed" host part is globally unique (except when a vendor of a NIC uses the same MAC address on more than one NIC), client tracking is possible on the host when not using a proxy of any kind. -This is a known problem, and a solution was defined: privacy extension, defined in RFC 3041 / Privacy Extensions for Stateless Address Autoconfiguration in IPv6 (there is also already a newer draft available: draft-ietf-ipv6-privacy-addrs-v2-*). Using a random and a static value a new suffix is generated from time to time. Note: this is only reasonable for outgoing client connections and isn't really useful for well-known servers. -Manually set -For servers, it's probably easier to remember simpler addresses, this can also be accommodated. It is possible to assign an additional IPv6 address to an interface, e.g. -For manual suffixes like “::1” shown in the above example, it's required that the 7th most significant bit is set to 0 (the universal/local bit of the automatically generated identifier). Also some other (otherwise unchosen ) bit combinations are reserved for anycast addresses, too. -Prefix lengths for routing -In the early design phase it was planned to use a fully hierarchical routing approach to reduce the size of the routing tables maximally. The reasons behind this approach were the number of current IPv4 routing entries in core routers (> 400 thousand in 2013), reducing the need of memory in hardware routers (ASIC “Application Specified Integrated Circuit” driven) to hold the routing table and increase speed (fewer entries hopefully result in faster lookups). - -Todays view is that routing will be mostly hierarchically designed for networks with only one service provider. With more than one ISP connections, this is not possible, and subject to an issue named multi-homing (infos on multi-homing: drafts-ietf-multi6-*,IPv6 Multihoming Solutions). -Prefix lengths (also known as "netmasks") -Similar to IPv4, the routable network path for routing to take place. Because standard netmask notation for 128 bits doesn't look nice, designers employed the IPv4 Classless Inter Domain Routing (CIDR, RFC 1519 / Classless Inter-Domain Routing) scheme, which specifies the number of bits of the IP address to be used for routing. It is also called the "slash" notation. -An example: -This notation will be expanded: -Network: - -Netmask: - -Matching a route -Under normal circumstances (no QoS), a lookup in a routing table results in the route with the most significant number of address bits being selected. In other words, the route with the biggest prefix length matches first. -For example if a routing table shows following entries (list is not complete): -Shown destination addresses of IPv6 packets will be routed through shown device - routed through device sit1 -2001:0db8:200:1:2:3:4:5/48 -> routed through device tun6to4 -]]> -<!-- anchor id="chapter-systemcheck" -->IPv6-ready system check -Before you can start using IPv6 on a Linux host, you have to test, whether your system is IPv6-ready. You may have to do some work to enable it first. -<!-- anchor id="systemcheck-kernel" -->IPv6-ready kernel -Modern Linux distributions already contain IPv6-ready kernels, the IPv6 capability is generally compiled as a module, but it's possible that this module is not loaded automatically on startup. -Note: you shouldn't anymore use kernel series 2.2.x, because it's not IPv6-up-to-date anymore. Also the IPv6 support in series 2.4.x is no longer improved according to definitions in latest RFCs. It's recommend to use series 2.6.x now. -Check for IPv6 support in the current running kernel -To check, whether your current running kernel supports IPv6, take a look into your /proc-file-system. Following entry must exists: -A short automatical test looks like: -If this fails, it is quite likely, that the IPv6 module is not loaded. -Try to load IPv6 module -You can try to load the IPv6 module executing -If this is successful, this module should be listed, testable with following auto-magically line: -And the check shown above should now run successfully. -Note: unloading the module is currently not supported and can result, under some circumstances, in a kernel crash. -Automatically loading of module -Its possible to automatically load the IPv6 module on demand. You only have to add following line in the configuration file of the kernel module loader (normally /etc/modules.conf or /etc/conf.modules): -It's also possible to disable automatically loading of the IPv6 module using following line -Additional note: in kernels series 2.6.x, the module loader mechanism was changed. The new configuration file has to be named /etc/modprobe.conf instead of /etc/modules.conf. -Compile kernel with IPv6 capabilities -If both above shown results were negative and your kernel has no IP6 support, than you have the following options: -Update your distribution to a current one which supports IPv6 out-of-the-box (recommended for newbies)Compile a new vanilla kernel (easy, if you know which options you needed)Recompile kernel sources given by your Linux distribution (sometimes not so easy)Compile a kernel with USAGI extensionsIf you decide to compile a kernel, you should have previous experience in kernel compiling and read the Linux Kernel HOWTO. -A comparison between vanilla and USAGI extended kernels is available on IPv6+Linux-Status-Kernel. -Compiling a vanilla kernel -More detailed hints about compiling an IPv6-enabled kernel can be found e.g. on IPv6-HOWTO-2#kernel. -Note: you should use whenever possible kernel series 2.6.x or above, because the IPv6 support in series 2.4.x only will no longer get backported features from 2.6.x and IPv6 support in series 2.2.x is hopeless outdated. -Compiling a kernel with USAGI extensions -Same as for vanilla kernel, only recommend for advanced users, which are already familiar with IPv6 and kernel compilation. See also USAGI project / FAQ and Obtaining the best IPv6 support with Linux (Article) (Mirror). -IPv6-ready network devices -Not all existing network devices have already (or ever) the capability to transport IPv6 packets. A current status can be found at IPv6+Linux-status-kernel.html#transport. -A major issue is that because of the network layer structure of kernel implementation an IPv6 packet isn't really recognized by it's IP header number (6 instead of 4). It's recognized by the protocol number of the Layer 2 transport protocol. Therefore any transport protocol which doesn't use such protocol number cannot dispatch IPv6 packets. Note: the packet is still transported over the link, but on receivers side, the dispatching won't work (you can see this e.g. using tcpdump). -Currently known never “IPv6 capable links” - -Serial Line IP (SLIP, RFC 1055 / SLIP), should be better called now to SLIPv4, device named: slXParallel Line IP (PLIP), same like SLIP, device names: plipXISDN with encapsulation rawip, device names: isdnX -Currently known “not supported IPv6 capable links” - -ISDN with encapsulation syncppp, device names: ipppX (design issue of the ipppd, will be merged into more general PPP layer in kernel series 2.5.x) -IPv6-ready network configuration tools -You wont get very far, if you are running an IPv6-ready kernel, but have no tools to configure IPv6. There are several packages in existence which can configure IPv6. -net-tools package -The net-tool package includes some tools like ifconfig and route, which helps you to configure IPv6 on an interface. Look at the output of ifconfig -? or route -?, if something is shown like IPv6 or inet6, then the tool is IPv6-ready. -Auto-magically check: -& 1|grep -qw 'inet6' && echo "utility 'ifconfig' is -¬ IPv6-ready" -]]>Same check can be done for route: -& 1|grep -qw 'inet6' && echo "utility 'route' is IPv6-ready" -]]> -iproute package -Alexey N. Kuznetsov (current a maintainer of the Linux networking code) created a tool-set which configures networks through the netlink device. Using this tool-set you have more functionality than net-tools provides, but its not very well documented and isn't for the faint of heart. -&1 |grep -qw 'inet6' && echo "utility 'ip' is IPv6-ready" -]]>If the program /sbin/ip isn't found, then I strongly recommend you install the iproute package. -You can get it from your Linux distribution (if contained)You're able to look for a proper RPM package at RPMfind/iproute (sometimes rebuilding of a SRPMS package is recommended) -IPv6-ready test/debug programs -After you have prepared your system for IPv6, you now want to use IPv6 for network communications. First you should learn how to examine IPv6 packets with a sniffer program. This is strongly recommended because for debugging/troubleshooting issues this can aide in providing a diagnosis very quickly. -<!-- anchor id="program-ping6." -->IPv6 ping -This program is normally included in package iputils. It is designed for simple transport tests sending ICMPv6 echo-request packets and wait for ICMPv6 echo-reply packets. -Usage - -# ping6 -# ping6 [-I ] -]]>Some implementation also support %<device> suffix instead of using -I <device>, e.g. -% -]]>Example -Hint: ping6 needs raw access to socket and therefore root permissions. So if non-root users cannot use ping6 then there are two possible problems: -ping6 is not in users path (probably, because ping6 is generally stored in /usr/sbin -> add path (not really recommended)ping6 doesn't execute properly, generally because of missing root permissions -> chmod u+s /usr/sbin/ping6 -Specifying interface for IPv6 ping -Using link-local addresses for an IPv6 ping, the kernel does not know through which (physically or virtual) device it must send the packet - each device has a link-local address. A try will result in following error message: -In this case you have to specify the interface additionally like shown here: -Example for %<device> notation: - -Ping6 to multicast addresses -An interesting mechanism to detect IPv6-active hosts on a link is to ping6 to the link-local all-node multicast address: -Example for %<device> notation: -Unlike in IPv4, where replies to a ping on the broadcast address can be disabled, in IPv6 currently this behavior cannot be disable except by local IPv6 firewalling. -<!-- anchor id="program-traceroute6." -->IPv6 traceroute6 -This program is normally included in package iputils. It's a program similar to IPv4 traceroute. Below you will see an example: -Note: unlike some modern versions of IPv4 traceroute, which can use ICMPv4 echo-request packets as well as UDP packets (default), current IPv6-traceroute is only able to send UDP packets. As you perhaps already know, ICMP echo-request packets are more accepted by firewalls or ACLs on routers inbetween than UDP packets. -If a dedicated interface must be specified, this can be done by -i <device> or using <address>%<device>. -<!-- anchor id="program-tracepath6." -->IPv6 tracepath6 -This program is normally included in package iputils. It's a program like traceroute6 and traces the path to a given destination discovering the MTU along this path. Below you will see an example: - -<!-- anchor id="program-tcpdump" -->IPv6 tcpdump -On Linux, tcpdump is the major tool for packet capturing. Below you find some examples. IPv6 support is normally built-in in current releases of version 3.6. -tcpdump uses expressions for filtering packets to minimize the noise: -icmp6: filters native ICMPv6 trafficip6: filters native IPv6 traffic (including ICMPv6)proto ipv6: filters tunneled IPv6-in-IPv4 trafficnot port ssh: to suppress displaying SSH packets for running tcpdump in a remote SSH sessionAlso some command line options are very useful to catch and print more information in a packet, mostly interesting for digging into ICMPv6 packets: -“-s 512”: increase the snap length during capturing of a packet to 512 bytes“-vv”: really verbose output“-n”: don't resolve addresses to names, useful if reverse DNS resolving isn't working proper -IPv6 ping to 2001:0db8:100:f101::1 native over a local link - - 2001:0db8:100:f101::1: icmp6: echo -¬ request (len 64, hlim 64) -2001:0db8:100:f101::1 > 2001:0db8:100:f101:2e0:18ff:fe90:9205: icmp6: echo -¬ reply (len 64, hlim 64) -]]> -IPv6 ping to 2001:0db8:100::1 routed through an IPv6-in-IPv4-tunnel -1.2.3.4 and 5.6.7.8 are tunnel endpoints (all addresses are examples) - 5.6.7.8: 2002:ffff:f5f8::1 > 2001:0db8:100::1: icmp6: echo request -¬ (len 64, hlim 64) (DF) (ttl 64, id 0, len 124) -5.6.7.8 > 1.2.3.4: 2001:0db8: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 > 2001:0db8:100::1: icmp6: echo request -¬ (len 64, hlim 64) (DF) (ttl 64, id 0, len 124) -5.6.7.8 > 1.2.3.4: 2001:0db8:100::1 > 2002:ffff:f5f8::1: icmp6: echo reply (len -¬ 64, hlim 61) (ttl 23, id 29919, len 124) -]]> -IPv6-ready programs -Current distributions already contain the most needed IPv6 enabled client and servers. See first on IPv6+Linux-Status-Distribution. If still not included, you can check Current Status of IPv6 Support for Networking Applications whether the program is already ported to IPv6 and usable with Linux. For common used programs there are some hints available here later in this document. -IPv6-ready client programs (selection) -To run the following shown tests, it's required that your system is IPv6 enabled, and some examples show addresses which only can be reached if a connection to the global IPv6 network is available. -Note: if using names instead of dedicated IPv4/IPv6 addresses which resolves to IPv4 and IPv6 addresses, some command line clients support explicitly use of specified protocol. Usually such clients have option “-4” for IPv4 and “-6” for IPv6. -Checking DNS for resolving IPv6 addresses -Because of security updates in the last years every Domain Name System (DNS) server should run newer software which already understands the (intermediate) IPv6 address-type AAAA (the newer one named A6 isn't still common at the moment because only supported using BIND9 and newer and also the non-existent support of root domain IP6.ARPA). A simple test whether the used system can resolve IPv6 addresses is -and should show something like following: - -IPv6-ready telnet clients -IPv6-ready telnet clients are available. A simple test can be done with -If the telnet client don't understand the IPv6 address and says something like “cannot resolve hostname”, then it's not IPv6-enabled. -IPv6-ready ssh clients - -openssh -Current versions of openssh are IPv6-ready. Depending on configuring before compiling it has two behavior. ---without-ipv4-default: the client tries an IPv6 connect first automatically and fall back to IPv4 if not working--with-ipv4-default: default connection is IPv4, IPv6 connection must be force like following example shows -If your ssh client doesn't understand the option “-6” then it's not IPv6-enabled, like most ssh version 1 packages. -ssh.com -SSH.com's SSH client and server is also IPv6 aware now and is free for all Linux and FreeBSD machine regardless if used for personal or commercial use. -IPv6-ready web browsers -A current status of IPv6 enabled web browsers is available at Current Status of IPv6 Support for Networking Applications - HTTP. -Most of them have unresolved problems at the moment -If using an IPv4 only proxy in the settings, IPv6 requests will be sent to the proxy, but the proxy will fail to understand the request and the request fails. Solution: update proxy software (see later).Automatic proxy settings (*.pac) cannot be extended to handle IPv6 requests differently (e.g. don't use proxy) because of their nature (written in Java-script and well hard coded in source like to be seen in Mozilla source code).Also older versions don't understand an URL with IPv6 encoded addresses like http://[2001:4dd0:f838:a006::6]/, IPv6 address of http://www.ipv6.bieringer.de/ (this given URLs only works with an IPv6-enabled browser!). -A short test is to try shown URL with a given browser and using no proxy. -URLs for testing -A good starting point for browsing using IPv6 is http://www.kame.net/. If the turtle on this page is animated, the connection is via IPv6, otherwise the turtle is static. -Other test servers are e.g. -What Is My IPv6ip.bieringer.deIPv6 Testtest-ipv6.comThe ICSI NetalyzrSpeedtest Comcast, IPv6 Speedtest Comcast -IPv6-ready server programs -In this part of this HOWTO, more client specific issues are mentioned. Therefore hints for IPv6-ready servers like sshd, httpd, telnetd, etc. are shown below in Hints for IPv6-enabled daemons. -<!-- anchor id="faq-ipv6-ready-system-check" -->FAQ (IPv6-ready system check) - -Using tools - -Q: Cannot ping6 to link-local addresses -Error message: "connect: Invalid argument" -Kernel doesn't know, which physical or virtual link you want to use to send such ICMPv6 packets. Therefore it displays this error message. -Solution: Specify interface like: “ping6 -I eth0 fe80::2e0:18ff:fe90:9205”, see also program ping6 usage. -Q: Cannot ping6 or traceroute6 as normal user -Error message: “icmp socket: Operation not permitted -These utilities create special ICMPv6 packets and send them out. This is done by using raw sockets in the kernel. But raw sockets can only be used by the “root” user. Therefore normal users get such error message. -Solution: If it's really needed that all users should be able to use these utilities, you can add the “suid” bit using ”chmod u+s /path/to/program”, see also program ping6 usage. If not all users should be able to, you can change the group of the program to e.g. “wheel”, add these power users to this group and remove the execution bit for other users using “chmod o-rwx /path/to/program”. Or configure “sudo” to enable your security policy. -<!-- anchor id="chapter-configuration-interface" -->Configuring interfaces - -Different network devices -On a node, there exist different network devices. They can be collected in classes -Physically bounded, like eth0, tr0Virtually existing, like ppp0, tun0, tap0, sit0, isdn0, ippp0 -Physically bounded -Physically bounded interfaces like Ethernet or Token-Ring are normal ones and need no special treatment. -Virtually bounded -Virtually bounded interfaces always need special support -IPv6-in-IPv4 tunnel interfaces -These interfaces are normally named sitx. The name sit is a shortcut for Simple Internet Transition. This device has the capability to encapsulate IPv6 packets into IPv4 ones and tunnel them to a foreign endpoint. -sit0 has a special meaning and cannot be used for dedicated tunnels. -PPP interfaces -PPP interfaces get their IPv6 capability from an IPv6 enabled PPP daemon. -ISDN HDLC interfaces -IPv6 capability for HDLC with encapsulation ip is already built-in in the kernel -ISDN PPP interfaces -ISDN PPP interfaces (ippp) aren't IPv6 enabled by kernel. Also there are also no plans to do that because in kernel 2.5.+ they will be replaced by a more generic ppp interface layer. -SLIP + PLIP -Like mentioned earlier, this interfaces don't support IPv6 transport (sending is OK, but dispatching on receiving don't work). -Ether-tap device -Ether-tap devices are IPv6-enabled and also stateless configured. For use, the module “ethertap” has to be loaded before. -tun devices -Currently not tested by me. -ATM -01/2002: Aren't currently supported by vanilla kernel, supported by USAGI extension -Others -Did I forget an interface?... -Bringing interfaces up/down -Two methods can be used to bring interfaces up or down. -Using "ip" -Usage: - up -# ip link set dev down -]]>Example: - -Using "ifconfig" -Usage: - up -# /sbin/ifconfig down -]]>Example: - -<!-- anchor id="chapter-configuration-address" -->Configuring IPv6 addresses -There are different ways to configure an IPv6 address on an interface. You can use use "ifconfig" or "ip". -Displaying existing IPv6 addresses -First you should check, whether and which IPv6 addresses are already configured (perhaps auto-magically during stateless auto-configuration). -Just note that addresses beginning with “fec0” are deprecated, but shown here for completness! -Using "ip" -Usage: - -]]>Example for a static configured host: -Example for a host which is auto-configured -Here you see some auto-magically configured IPv6 addresses and their lifetime. - -Using "ifconfig" -Usage: - -]]>Example (output filtered with grep to display only IPv6 addresses). Here you see different IPv6 addresses with different scopes. - -Add an IPv6 address -Adding an IPv6 address is similar to the mechanism of "IP ALIAS" addresses in Linux IPv4 addressed interfaces. -Using "ip" -Usage: -/ dev -]]>Example: - -Using "ifconfig" -Usage: - inet6 add / -]]>Example: - -Removing an IPv6 address -Not so often needed, be carefully with removing non existent IPv6 address, sometimes using older kernels it results in a crash. -Using "ip" -Usage: -/ dev -]]>Example: - -Using "ifconfig" -Usage: - inet6 del / -]]>Example: - -Automatic IPv6 Address Configuration -In case, a Router Advertisement is received by a client, and IPv6 autoconfiguration is enabled (default on non-router), the client configures itself an IPv6 address according to the prefix contained in the advertisement (see also ). -Enable Privacy Extension -Privacy Extension as described in RFC 4941 / Privacy Extensions for Stateless Address Autoconfiguration in IPv6 (obsoleted RFC 3041) is replacing the static interface ID (mostly based on word-wide unique MAC address) used during autoconfiguration by a pseudo-random one and generating from time to time a new one deprecating the old one. -Enable Privacy Extension using sysctl -Temporary activation -Enable privacy extension for e.g. interface “eth0” and prefer the generated address: -Afterwards, restart of the interface is necessary -Once a router advertisement is received, the result should look like following - mtu 1500 qlen 1000 - inet6 2001:db8:0:1:8992:3c03:d6e2:ed72/64 scope global secondary dynamic <- pseudo-random IID - valid_lft 604711sec preferred_lft 86311sec - inet6 2001:db8:0:1::224:21ff:fe01:2345/64 scope global <- IID based on MAC - valid_lft 604711sec preferred_lft 86311sec - ... -]]>Permanent activation -For permanent activation, either a special initscript value per interface will enable privacy or an entry in the /etc/sysctl.conf file like -Note: interface must already exists with proper name when sysctl.conf is applied. If this is not the case (e.g. after reboot) one has to configure privacy for all interfaces by default: -Changed/added values in /etc/sysctl.conf can be activated during runtime, but at least an interface down/up or a reboot is recommended. - -Enable Privacy Extension using NetworkManager -Modern (client) systems are using NetworkManager for configuring interfaces. A command line tool is built-in which can be used to change settings which are not available via GUI. -Examples based on version 0.9.9.1-5.git20140319.fc21 -Check existing interfaces with: -Current amount of IPv6 privacy extension addresses can be checked with -Current IPv6 privacy extension settings can be checked with -Enable IPv6 privacy extension and restart interface -New IPv6 privacy extension settings can be checked with -Now IPv6 privacy extension addresses are configured on the interface - -Test real use of Privacy Extension IPv6 Addresses -Whether the IPv6 address with an Interface ID generated by Privacy Extension is really used for outgoing connections, one can browse to http://ip.bieringer.de/, in case EUI64_SCOPE shows “iid-privacy”, then everything is working fine. -<!-- anchor id="chapter-configuration-route" -->Configuring normal IPv6 routes -If you want to leave your link and want to send packets in the world wide IPv6-Internet, you need routing. If there is already an IPv6 enabled router on your link, it's possible enough to add IPv6 routes. -Just note that addresses beginning with “fec0” are deprecated, but shown here for completness! -Displaying existing IPv6 routes -First you should check, whether and which IPv6 addresses are already configured (perhaps auto-magically during auto-configuration). -Using "ip" -Usage: -] -]]>Example: - -Using "route" -Usage: -Example (output is filtered for interface eth0). Here you see different IPv6 routes for different addresses on a single interface. - -Add an IPv6 route through a gateway -Mostly needed to reach the outside with IPv6 using an IPv6-enabled router on your link. -Using "ip" -Usage: -/ via -¬ [dev ] -]]>Example: - -Using "route" -Usage: -/ gw -¬ [dev ] -]]>A device can be needed, too, if the IPv6 address of the gateway is a link local one. -Following shown example adds a default route through gateway 2001:0db8:0:f101::1 - -Removing an IPv6 route through a gateway -Not so often needed manually, mostly done by network configure scripts on shutdown (full or per interface) -Using "ip" -Usage: -/ via -¬ [dev ] -]]>Example: - -Using "route" -Usage: -/ gw [dev -¬ ] -]]>Example for removing upper added route again: - -Add an IPv6 route through an interface -Not often needed, sometimes in cases of dedicated point-to-point links. -Using "ip" -Usage: -/ dev -¬ metric 1 -]]>Example: -Metric “1” is used here to be compatible with the metric used by route, because the default metric on using “ip” is “1024”. -Using "route" -Usage: -/ dev -]]>Example: - -Removing an IPv6 route through an interface -Not so often needed to use by hand, configuration scripts will use such on shutdown. -Using "ip" -Usage: -/ dev -]]>Example: - -Using "route" -Usage: -/ dev -]]>Example: - -FAQ for IPv6 routes - -Support of an IPv6 default route -One idea of IPv6 was a hierachical routing, therefore only less routing entries are needed in routers. -There are some issues in current Linux kernels: -Clients (not routing any packet!) -Client can setup a default route like prefix “::/0”, they also learn such route on autoconfiguration e.g. using radvd on the link like following example shows: - -Routers in case of packet forwarding -Older Linux kernel (at least <= 2.4.17) don't support default routes. You can set them up, but the route lookup fails when a packet should be forwarded (normal intention of a router). If you're still using such older kernel, “default routing” can be setup using the currently used global address prefix “2000::/3”. -Note: take care about default routing without address filtering on edge routers. Otherwise unwanted multicast or site-local traffic can leave the edge. -<!-- anchor id="chapter-Neighbor-Discovery" -->Neighbor Discovery -Neighbor discovery was the IPv6 successor for the ARP (Address Resolution Protocol) in IPv4. You can retrieve information about the current neighbors, in addition you can set and delete entries. The kernel keeps tracking of successful neighbor detection (like ARP in IPv4). You can dig into the learnt table using “ip”. -Displaying neighbors using “ip” -With following command you can display the learnt or configured IPv6 neighbors -] -]]>The following example shows one neighbor, which is a reachable router - -Manipulating neighbors table using “ip” - -Manually add an entry -With following command you are able to manually add an entry - lladdr dev -]]>Example: - -Manually delete an entry -Like adding also an entry can be deleted: - lladdr dev -]]>Example: - -More advanced settings -The tool “ip” is less documentated, but very strong. See online “help” for more: -Looks like some options are only for IPv4...if you can contribute information about flags and advanced usage, pls. send. -<!-- anchor id="chapter-configuring-ipv6-in-ipv4-tunnels" -->Configuring IPv6-in-IPv4 tunnels -If you want to leave your link and you have no IPv6 capable network around you, you need IPv6-in-IPv4 tunneling to reach the world wide IPv6-Internet. -There are some kind of tunnel mechanism and also some possibilities to setup tunnels. -Types of tunnels -There are more than one possibility to tunnel IPv6 packets over IPv4-only links. -Static point-to-point tunneling -A point-to-point tunnel is a dedicated tunnel to an endpoint, which knows about your IPv6 network (for backward routing) and the IPv4 address of your tunnel endpoint and defined in RFC 4213 / Basic Transition Mechanisms for IPv6 Hosts and Routers. Requirements: -IPv4 address of your local tunnel endpoint must be static, global unique and reachable from the foreign tunnel endpoint - -If no static IPv4 address is available, the tunnel provider must support authentication of the dynamic IPv4 address, like SixXS / AICCU (3740/udp) or gogo6 (3653/udp).A global IPv6 prefix assigned to you - -It is also possible that additional IPv6 networks are routed through this tunnel.A foreign tunnel endpoint which is capable to route your IPv6 prefix to your local tunnel endpoint (mostly remote manual configuration required)Tunnel provider for static point-to-point tunneling: -Hurricane ElectricSixXS -Automatically tunneling -Automatic tunneling occurs, when a node directly connects another node gotten the IPv4 address of the other node before. -<!-- anchor id="tunneling-6to4." -->6to4-Tunneling -6to4 tunneling (RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds) uses a simple mechanism to create automatic tunnels. Each node with a global unique IPv4 address is able to be a 6to4 tunnel endpoint (if no IPv4 firewall prohibits traffic). 6to4 tunneling is mostly not a one-to-one tunnel. This case of tunneling can be divided into upstream and downstream tunneling. Also, a special IPv6 address indicates that this node will use 6to4 tunneling for connecting the world-wide IPv6 network -Generation of 6to4 prefix -The 6to4 address is defined like following (schema is taken from RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds): -FP and TLA together (16 bits) have the value 0x2002. V4ADDR is the node's global unique IPv4 address (in hexadecimal notation). SLA is the subnet identifier (65536 local subnets possible) and are usable to represent your local network structure. -For gateways, such prefix is generated by normally using SLA “0000” and suffix “::1” (not a must, can be an arbitrary one with local-scope) and assigned to the 6to4 tunnel interface. Note that Microsoft Windows uses V4ADDR also for suffix. -6to4 upstream tunneling -The node has to know to which foreign tunnel endpoint its in IPv4 packed IPv6 packets should be send to. In “early” days of 6to4 tunneling, dedicated upstream accepting routers were defined. See NSayer's 6to4 information for a list of routers. -Nowadays, 6to4 upstream routers can be found auto-magically using the anycast address 192.88.99.1. In the background routing protocols handle this, see RFC 3068 / An Anycast Prefix for 6to4 Relay Routers for details. -6to4 downstream tunneling -The downstream (IPv6 backbone -> your 6to4 enabled node) is not really fix and can vary from foreign host which originated packets were send to. There exist two possibilities: -Foreign host uses 6to4 and sends packet direct back to your node (see below)Foreign host sends packets back to the world-wide IPv6 network and depending on the dynamic routing a relay router of an ISP which announces 2002::/16 via BGP will create a automatic tunnel back to your node. -Possible 6to4 traffic - -from 6to4 to 6to4: is normally directly tunneled between the both 6to4 enabled hostsfrom 6to4 to non-6to4: is sent via upstream tunnelingnon-6to4 to 6to4: is sent via downstream tunnelingNote, that because of possible asymmetric routing problems with a broken 6to4 relay can be hard to troubleshoot. -UDP encapsulated IPv6 tunneling -UDP encapsulated IPv6 tunneling is usally used if no global IPv4 address is available on the internal endpoint, but using Network Adress Translation (NAT) it can still reach related endpoints using UDP ports described below. -Teredo Tunnel -RFC 4380 / Teredo: Tunneling IPv6 over UDP through Network Address Translationsdescribes tunneling of IPv6 packets via IPv4 UDP bubbles, see also Wikipedia / Teredo. It uses usually 3544/udp. Linux client is named miredo and usable out-of-the-box. This tunnel method can only connect a single client to the global IPv6 network.. -AYIYA Tunnel -Tunnel provider SixXS has also IPv6-in-UDP-in-IPv4 (5072/udp) capability, for using it, the AYIYA mode must be enabled. -gogo6 Tunnel -Tunnel provider gogo6 has also IPv6-in-UDP-in-IPv4 (3653/udp) capability, for using it, the v6udpv4 mode must be enabled. -Displaying existing tunnels - -Using "ip" -Usage: -] -]]>Example: - -Using "route" -Usage: -Example (output is filtered to display only tunnels through virtual interface sit0): - -<!-- anchor id="conf-ipv6-in-ipv4-point-to-point-tunnels" -->Setup of point-to-point tunnel -There are 3 possibilities to add or remove point-to-point tunnels. -A good additional information about tunnel setup using “ip” is Configuring tunnels with iproute2 (article) (Mirror). -Add point-to-point tunnels - -Using "ip" -Common method at the moment for a small amount of tunnels. -Usage for creating a tunnel device (but it's not up afterward, also a TTL must be specified because the default value is 0). - mode sit ttl remote -¬ local -]]>Usage (generic example for three tunnels): - 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 -]]> -Using "ifconfig" and "route" (deprecated) -This not very recommended way to add a tunnel because it's a little bit strange. No problem if adding only one, but if you setup more than one, you cannot easy shutdown the first ones and leave the others running. -Usage (generic example for three tunnels): - -# /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 -]]>Important: DON'T USE THIS, because this setup implicit enable "automatic tunneling" from anywhere in the Internet, this is a risk, and it should not be advocated. -Using "route" only -It's also possible to setup tunnels in Non Broadcast Multiple Access (NBMA) style, it's a easy way to add many tunnels at once. But none of the tunnel can be numbered (which is a not required feature). -Usage (generic example for three tunnels): - gw -¬ :: dev sit0 -# /sbin/route -A inet6 add gw -¬ :: dev sit0 -# /sbin/route -A inet6 add gw -¬ :: dev sit0 -]]>Important: DON'T USE THIS, because this setup implicit enable "automatic tunneling" from anywhere in the Internet, this is a risk, and it should not be advocated. -Removing point-to-point tunnels -Manually not so often needed, but used by scripts for clean shutdown or restart of IPv6 configuration. -Using "ip" -Usage for removing a tunnel device: - -]]>Usage (generic example for three tunnels): - 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 -]]> -Using "ifconfig" and "route" (deprecated because not very funny) -Not only the creation is strange, the shutdown also...you have to remove the tunnels in backorder, means the latest created must be removed first. -Usage (generic example for three tunnels): - dev sit3 -# /sbin/ifconfig sit3 down - -# /sbin/route -A inet6 del dev sit2 -# /sbin/ifconfig sit2 down - -# /sbin/route -A inet6 add dev sit1 -# /sbin/ifconfig sit1 down - -# /sbin/ifconfig sit0 down - -]]> -Using "route" -This is like removing normal IPv6 routes. - -Usage (generic example for three tunnels): - gw -¬ :: dev sit0 -# /sbin/route -A inet6 del gw -¬ :: dev sit0 -# /sbin/route -A inet6 del gw -¬ :: dev sit0 - -# /sbin/ifconfig sit0 down -]]> -Numbered point-to-point tunnels -Sometimes it's needed to configure a point-to-point tunnel with IPv6 addresses like in IPv4 today. This is only possible with the first (ifconfig+route - deprecated) and third (ip+route) tunnel setup. In such cases, you can add the IPv6 address to the tunnel interface like shown on interface configuration. -<!-- anchor id="configuring-ipv6to4-tunnels" -->Setup of 6to4 tunnels -Pay attention that the support of 6to4 tunnels currently lacks on vanilla kernel series 2.2.x (see systemcheck/kernel for more information). Also note that that the prefix length for a 6to4 address is 16 because of from network point of view, all other 6to4 enabled hosts are on the same layer 2. -Add a 6to4 tunnel -First, you have to calculate your 6to4 prefix using your local assigned global routable IPv4 address (if your host has no global routable IPv4 address, in special cases NAT on border gateways is possible): -Assuming your IPv4 address is -the generated 6to4 prefix will be -Local 6to4 gateways should (but it's not a must, you can choose an arbitrary suffix with local-scope, if you feel better) always assigned the suffix “::1”, therefore your local 6to4 address will be -Use e.g. following for automatic generation: -There are two ways possible to setup 6to4 tunneling now. -Using "ip" and a dedicated tunnel device -This is now the recommended way (a TTL must be specified because the default value is 0). -Create a new tunnel device - remote any local -¬ -]]>Bring interface up -Add local 6to4 address to interface (note: prefix length 16 is important!) -/16 dev tun6to4 -]]>Add (default) route to the global IPv6 network using the all-6to4-routers IPv4 anycast address -It was reported that some versions of “ip” (e.g. SuSE Linux 9.0) don't support IPv4-compatible IPv6 addresses for gateways, in this case the related IPv6 address has to be used: - -Using "ifconfig" and "route" and generic tunnel device “sit0” (deprecated) -This is now deprecated because using the generic tunnel device sit0 doesn't let specify filtering per device. -Bring generic tunnel interface sit0 up -Add local 6to4 address to interface -/16 -]]>Add (default) route to the global IPv6 network using the all-6to4-relays IPv4 anycast address - -Remove a 6to4 tunnel - -Using "ip" and a dedicated tunnel device -Remove all routes through this dedicated tunnel device -Shut down interface -Remove created tunnel device - -Using “ifconfig” and “route” and generic tunnel device “sit0” (deprecated) -Remove (default) route through the 6to4 tunnel interface -Remove local 6to4 address to interface -/16 -]]>Shut down generic tunnel device (take care about this, perhaps it's still in use...) - -<!-- anchor id="chapter-configuring-ipv4-in-ipv6-tunnels" -->Configuring IPv4-in-IPv6 tunnels -RFC 2473 / Generic Packet Tunneling in IPv6 Specification specifies mechanisms to tunnel several different packet types over IPv6 including IPv4. -NOTE: Support for IPv4-in-IPv6 tunnel is available only since kernel version 2.6.22. -Displaying existing tunnels -Usage: -] -]]>Example: -NOTE: If you don't include "mode any", only IPv6-in-IPv6 tunnels are displayed. -Setup of point-to-point tunnel -Usage for creating a 4over6 tunnel device (but it's not up afterward) - mode ip4ip6 remote -¬ local -]]>Usage (generic example for three tunnels): - local -# /sbin/ip link set dev ip6tnl1 up -# /sbin/ip -6 route add dev ip6tnl1 metric 1 - -# /sbin/ip -6 tunnel add ip6tnl2 mode ip4ip6 remote -¬ local -# /sbin/ip link set dev ip6tnl2 up -# /sbin/ip -6 route add dev ip6tnl2 metric 1 - -# /sbin/ip -6 tunnel add ip6tnl3 mode ip4ip6 remote -¬ local -# /sbin/ip link set dev ip6tnl3 up -# /sbin/ip -6 route add dev ip6tnl3 metric 1 -]]> -Removing point-to-point tunnels -Usage for removing a tunnel device: - -]]>Usage (generic example for three tunnels): - dev ip6tnl1 -# /sbin/ip link set ip6tnl1 down -# /sbin/ip -6 tunnel del ip6tnl1 - -# /sbin/ip -6 route del dev ip6tnl2 -# /sbin/ip link set ip6tnl2 down -# /sbin/ip -6 tunnel del ip6tnl2 - -# /sbin/ip -6 route del dev ip6tnl3 -# /sbin/ip link set ip6tnl3 down -# /sbin/ip -6 tunnel del ip6tnl3 -]]> -<!-- anchor id="chapter-kernel-settings" -->Kernel settings in /proc-filesystem -Note: the source of this section is mostly the file “ip-sysctl.txt” which is included in current kernel sources in directory “Documentation/networking”. Credits to Pekka Savola for maintaining the IPv6-related part in this file. Also some text is more or less copied & pasted into this document. -How to access the /proc-filesystem - -Using “cat” and “echo” -Using “cat” and “echo” is the simplest way to access the /proc filesystem, but some requirements are needed for that -The /proc-filesystem had to be enabled in kernel, means on compiling following switch has to be set - -The /proc-filesystem was mounted before, which can be tested using - -You need read and sometimes also write access (normally root only) to the /proc-filesystemNormally, only entries in /proc/sys/* are writable, the others are readonly and for information retrieving only. -Retrieving a value -The value of an entry can be retrieved using “cat”: - -Setting a value -A new value can be set (if entry is writable) using “echo”: -/proc/sys/net/ipv6/conf/all/forwarding -]]> -Using “sysctl” -Using the “sysctl” program to access the kernel switches is a modern method today. You can use it also, if the /proc-filesystem isn't mounted. But you have only access to /proc/sys/*! -The program “sysctl” is included in package “procps” (on Red Hat Linux systems). -The sysctl-interface had to be enabled in kernel, means on compiling following switch has to be set - -Retrieving a value -The value of an entry can be retrieved now: - -Setting a value -A new value can be set (if entry is writable): -Note: Don't use spaces around the “=” on setting values. Also on multiple values per line, quote them like e.g. - -Additionals -Note: There are sysctl versions in the wild which displaying “/” instead of the “.” -For more details take a look into sysctl's manpage. -Hint: for digging fast into the settings, use the option “-a” (display all entries) in conjunction with “grep”. -Values found in /proc-filesystems -There are several formats seen in /proc-filesystem: -BOOLEAN: simple a “0” (false) or a “1” (true)INTEGER: an integer value, can be unsigned, toomore sophisticated lines with several values: sometimes a header line is displayed also, if not, have a look into the kernel source to retrieve information about the meaning of each value... -<!-- anchor id="proc-sys-net-ipv6." -->Entries in /proc/sys/net/ipv6/ - -conf/default/* -Change the interface-specific default settings. -conf/all/* -Change all the interface-specific settings. -Exception: “conf/all/forwarding” has a different meaning here -conf/all/forwarding - -Type: BOOLEANThis enables global IPv6 forwarding between all interfaces. -In IPv6 you can't control forwarding per device, forwarding control has to be done using IPv6-netfilter (controlled with ip6tables) rulesets and specify input and output devices (see Firewalling/Netfilter6 for more). This is different to IPv4, where you are able to control forwarding per device (decision is made on interface where packet came in). -This also sets all interfaces' Host/Router setting 'forwarding' to the specified value. See below for details. This referred to as global forwarding. -If this value is 0, no IPv6 forwarding is enabled, packets never leave another interface, neither physical nor logical like e.g. tunnels. -conf/interface/* -Change special settings per interface. -The functional behaviour for certain settings is different depending on whether local forwarding is enabled or not. -accept_ra - -Type: BOOLEANFunctional default: enabled if local forwarding is disabled. disabled if local forwarding is enabled.Accept Router Advertisements, and autoconfigure this interface with received data. -accept_redirects - -Type: BOOLEANFunctional default: enabled if local forwarding is disabled. disabled if local forwarding is enabled.Accept Redirects sent by an IPv6 router. -autoconf - -Type: BOOLEANFunctional default: enabled if accept_ra_pinfo is enabled. disabled if accept_ra_pinfo is disabled.Autoconfigure addresses using prefix information from router advertisements. -dad_transmits - -Type: INTEGERDefault: 1The amount of Duplicate Address Detection probes to send. -forwarding - -Type: BOOLEANDefault: FALSE if global forwarding is disabled (default), otherwise TRUEConfigure interface-specific Host/Router behaviour. -Note: It is recommended to have the same setting on all interfaces; mixed router/host scenarios are rather uncommon. -Value FALSE: By default, Host behaviour is assumed. This means: -IsRouter flag is not set in Neighbour Advertisements.Router Solicitations are being sent when necessary.If accept_ra is TRUE (default), accept Router Advertisements (and do autoconfiguration).If accept_redirects is TRUE (default), accept Redirects. -Value TRUE: If local forwarding is enabled, Router behaviour is assumed. This means exactly the reverse from the above: -IsRouter flag is set in Neighbour Advertisements.Router Solicitations are not sent.Router Advertisements are ignored.Redirects are ignored. -hop_limit - -Type: INTEGERDefault: 64Default Hop Limit to set. -mtu - -Type: INTEGERDefault: 1280 (IPv6 required minimum)Default Maximum Transfer Unit -router_solicitation_delay - -Type: INTEGERDefault: 1Number of seconds to wait after interface is brought up before sending Router Solicitations. -router_solicitation_interval - -Type: INTEGERDefault: 4Number of seconds to wait between Router Solicitations. -router_solicitations - -Type: INTEGERDefault: 3Number of Router Solicitations to send until assuming no routers are present. -neigh/default/* -Change default settings for neighbor detection and some special global interval and threshold values: -gc_thresh1 - -Type: INTEGERDefault: 128More to be filled. -gc_thresh2 - -Type: INTEGERDefault: 512More to be filled. -gc_thresh3 - -Type: INTEGERDefault: 1024Tuning parameter for neighbour table size. -Increase this value if you have a lot of interfaces and problem with routes start to act mysteriously and fail. Or if a running Zebra (routing daemon) reports: - -gc_interval - -Type: INTEGERDefault: 30More to be filled. -neigh/interface/* -Change special settings per interface for neighbor detection. -anycast_delay - -Type: INTEGERDefault: 100More to be filled. -gc_stale_time - -Type: INTEGERDefault: 60More to be filled. -proxy_qlen - -Type: INTEGERDefault: 64More to be filled. -unres_qlen - -Type: INTEGERDefault: 3More to be filled. -app_solicit - -Type: INTEGERDefault: 0More to be filled. -locktime - -Type: INTEGERDefault: 0More to be filled. -retrans_time - -Type: INTEGERDefault: 100More to be filled. -base_reachable_time - -Type: INTEGERDefault: 30More to be filled. -mcast_solicit - -Type: INTEGERDefault: 3More to be filled. -ucast_solicit - -Type: INTEGERDefault: 3More to be filled -delay_first_probe_time - -Type: INTEGERDefault: 5More to be filled. -proxy_delay - -Type: INTEGERDefault: 80More to be filled. -route/* -Change global settings for routing. -flush -Removed in newer kernel releases - more to be filled. -gc_interval - -Type: INTEGERDefault: 30More to be filled. -gc_thresh - -Type: INTEGERDefault: 1024More to be filled. -mtu_expires - -Type: INTEGERDefault: 600More to be filled. -gc_elasticity - -Type: INTEGERDefault: 0More to be filled. -gc_min_interval - -Type: INTEGERDefault: 5More to be filled. -gc_timeout - -Type: INTEGERDefault: 60More to be filled. -min_adv_mss - -Type: INTEGERDefault: 12More to be filled. -max_size - -Type: INTEGERDefault: 4096More to be filled. -<!-- anchor id="proc-sys-net-ipv4." -->IPv6-related entries in /proc/sys/net/ipv4/ -At the moment (and this will be until IPv4 is completly converted to an independend kernel module) some switches are also used here for IPv6. -ip_* - -ip_local_port_range -This control setting is used by IPv6 also. -tcp_* -This control settings are used by IPv6 also. -icmp_* -This control settings are not used by IPv6. To enable ICMPv6 rate limiting (which is very recommended because of the capability of ICMPv6 storms) netfilter-v6 rules must be used. -others -Unknown, but probably not used by IPv6. -<!-- anchor id="proc-net" -->IPv6-related entries in /proc/net/ -In /proc/net there are several read-only entries available. You cannot retrieve information using “sysctl” here, so use e.g. “cat”. -if_inet6 - -Type: One line per addresss containing multiple valuesHere all configured IPv6 addresses are shown in a special format. The example displays for loopback interface only. The meaning is shown below (see “net/ipv6/addrconf.c” for more). - -IPv6 address displayed in 32 hexadecimal chars without colons as separatorNetlink device number (interface index) in hexadecimal (see “ip addr” , too)Prefix length in hexadecimalScope value (see kernel source “ include/net/ipv6.h” and “net/ipv6/addrconf.c” for more)Interface flags (see “include/linux/rtnetlink.h” and “net/ipv6/addrconf.c” for more)Device name -ipv6_route - -Type: One line per route containing multiple valuesHere all configured IPv6 routes are shown in a special format. The example displays for loopback interface only. The meaning is shown below (see “net/ipv6/route.c” for more). - -IPv6 destination network displayed in 32 hexadecimal chars without colons as separatorIPv6 destination prefix length in hexadecimalIPv6 source network displayed in 32 hexadecimal chars without colons as separatorIPv6 source prefix length in hexadecimalIPv6 next hop displayed in 32 hexadecimal chars without colons as separatorMetric in hexadecimalReference counterUse counterFlagsDevice name -sockstat6 - -Type: One line per protocol with description and valueStatistics about used IPv6 sockets. Example: - -tcp6 -To be filled. -udp6 -To be filled. -igmp6 -To be filled. -raw6 -To be filled. -ip6_flowlabel -To be filled. -rt6_stats -To be filled. -snmp6 - -Type: One line per SNMP description and valueSNMP statistics, can be retrieved via SNMP server and related MIB table by network management software. -ip6_tables_names -Available netfilter6 tables -<!-- anchor id="netlink" -->Netlink-Interface to kernel -To be filled...I have no experience with that... -<!-- anchor id="resolver" -->Address Resolver & Selection -Additional info can be found at -Linux & IPv6: getaddrinfo and search domains - ResearchRFC 3484 on Linux Karl Auer's Blog: Controlling IPv6 source address selection , IPv6 Source Address Selection - what, why, howInto6: /etc/gai.conf - it ain't what you think it isAddress Resolver & Destination Address Selection -Name to IPv4 or IPv6 address resolving is usually done using a libc resolver library. Usually the function getaddrinfo is used for that. In case of more than one IPv6 address is returned, according to RFC 3484 / Default Address Selection for Internet Protocol version 6 a sorting should be applied, which can be optionally configured. -The “magic” is controlled by a file named /etc/gai.conf (it can be that it is empty or missing by default). Default is usually somewhere stored in documentation, see “man gai.conf” or e.g. /usr/share/doc/glibc-common/gai.conf. -For controlling sort order by configuration following are needed for testing: -A host in DNS returning more than one IPv6 address, e.g. - -Lookup via DNS (/etc/hosts won't work)/etc/gai.conf with proper config, e.g. - -For tests use e.g. telnet client - -If precedence is changed in configuration - -The order is changed accordingly -Source Address Selection -Source address selection in Linux is done automatically by kernel and usually only using information from routing tables and try to match the same scope of address. -Source Address Selection with “ip addrlabel” -With extension of internal “ip addrlabel” a source address can be bound to a destination address (e.g. selected via mechanisms above). Binding means here: “same label” (label is a number). -Default of “ip addrlabel” (here on CentOS 6): - -System is multihomed (here on one interface), router provides 2 prefixes via radvd: - -Connect now to server (shown above) - -Related tcpdump with filter “tcp and dst port 23” shows only the use of the upper local source IPv6 address - 2001:4dd0:ff00:834::2.telnet: (src-A -> dst-A) -IP6 2001:6f8:12d8:2:5054:ff:fefb:6582.45754 > 2a01:238:423d:8800:85b3:9e6b:3019:8909.telnet: (src-A -> dst-B) -]]> -Binding now source and destination with “ip addrlabel” - -Resulting “ip addrlabel” - -Connect now to server again - -Related tcpdump with filter “tcp and dst port 23” shows now the use of both local source IPv6 addresses according to the configured pairs A and B - 2001:4dd0:ff00:834::2.telnet: (src-A -> dst-A) -IP6 2001:6f8:900:8cbc:5054:ff:fefb:6582.39632 > 2a01:238:423d:8800:85b3:9e6b:3019:8909.telnet: (src-B -> dst-B) -]]>Setup of persistent “ip addrtable” is probably currently not supported by Linux distributions, so extension of network init scripts or rc.local must be used for that. A script which uses information from /etc/gai.conf and configure “ip addrtable” accordingly can be found here: /etc/gai.conf - it ain't what you think it is -<!-- anchor id="network-debugging" -->Network debugging - -Server socket binding - -Using “netstat” for server socket binding check -It's always interesting which server sockets are currently active on a node. Using “netstat” is a short way to get such information: -Used options: -nlptu -Example: - -<!-- anchor id="examples-tcpdump" -->Examples for tcpdump packet dumps -Here some examples of captured packets are shown, perhaps useful for your own debugging... -...more coming next... -Router discovery - -Router advertisement - - 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=2001:0db8:0:1::/64)(src lladdr: -¬ 0:12:34:12:34:50) (len 88, hlim 255) -]]>Router with link-local address “fe80::212:34ff:fe12:3450” send an advertisement to the all-node-on-link multicast address “ff02::1” containing two prefixes “2002:0102:0304:1::/64” (lifetime 30 s) and “2001:0db8:0:1::/64” (lifetime 2592000 s) including its own layer 2 MAC address “0:12:34:12:34:50”. -Router solicitation - - ff02::2: icmp6: router solicitation -¬ (src lladdr: 0:12:34:12:34:56) (len 16, hlim 255) -]]>Node with link-local address “fe80::212:34ff:fe12:3456” and layer 2 MAC address “0:12:34:12:34:56” is looking for a router on-link, therefore sending this solicitation to the all-router-on-link multicast address “ff02::2”. -Neighbor discovery - -Neighbor discovery solicitation for duplicate address detection -Following packets are sent by a node with layer 2 MAC address “0:12:34:12:34:56” during autoconfiguration to check whether a potential address is already used by another node on the link sending this to the solicited-node link-local multicast address. -Node wants to configure its link-local address “fe80::212:34ff:fe12:3456”, checks for duplicate now - 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) -]]> -Node wants to configure its global address “2002:0102:0304:1:212:34ff:fe12:3456” (after receiving advertisement shown above), checks for duplicate now - 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) -]]> -Node wants to configure its global address “2001:0db8:0:1:212:34ff:fe12:3456” (after receiving advertisement shown above), checks for duplicate now - ff02::1:ff12:3456: icmp6: neighbor sol: who has -¬ 2001:0db8:0:1:212:34ff:fe12:3456(src lladdr: 0:12:34:12:34:56) (len 32, hlim -¬ 255) -]]> -Neighbor discovery solicitation for looking for host or gateway - -Node wants to send packages to “2001:0db8:0:1::10” but has no layer 2 MAC address to send packet, so send solicitation now - ff02::1:ff00:10: icmp6: -¬ neighbor sol: who has 2001:0db8:0:1::10(src lladdr: 0:e0:18:90:92:5) (len 32, -¬ hlim 255) -]]> -Node looks for “fe80::10” now - ff02::1:ff00:10: icmp6: neighbor -¬ sol: who has fe80::10(src lladdr: 0:e0:18:90:92:5) (len 32, hlim 255) -]]> -<!-- anchor id="chapter-support-persistent-configuration" -->Support for persistent IPv6 configuration in Linux distributions -Some Linux distribution contain already support of a persistent IPv6 configuration using existing or new configuration and script files and some hook in the IPv4 script files. -Red Hat Linux and “clones” -Since starting writing the IPv6 & Linux - HowTo it was my intention to enable a persistent IPv6 configuration which catch most of the wished cases like host-only, router-only, dual-homed-host, router with second stub network, normal tunnels, 6to4 tunnels, and so on. Nowadays there exists a set of configuration and script files which do the job very well (never heard about real problems, but I don't know how many use the set). Because this configuration and script files are extended from time to time, they got their own homepage: initscripts-ipv6 homepage (Mirror). Because I began my IPv6 experience using a Red Hat Linux 5.0 clone, my IPv6 development systems are mostly Red Hat Linux based now, it's kind a logic that the scripts are developed for this kind of distribution (so called historic issue). Also it was very easy to extend some configuration files, create new ones and create some simple hook for calling IPv6 setup during IPv4 setup. -Fortunately, in Red Hat Linux since 7.1 a snapshot of my IPv6 scripts is included, this was and is still further on assisted by Pekka Savola. -Mandrake since version 8.0 also includes an IPv6-enabled initscript package, but a minor bug still prevents usage (“ifconfig” misses “inet6” before “add”). -Test for IPv6 support of network configuration scripts -You can test, whether your Linux distribution contain support for persistent IPv6 configuration using my set. Following script library should exist: -Auto-magically test: -The version of the library is important if you miss some features. You can get it executing following (or easier look at the top of the file): -In shown example, the used version is 20011124. Check this against latest information on initscripts-ipv6 homepage (Mirror) to see what has been changed. You will find there also a change-log. -Short hint for enabling IPv6 on current RHL 7.1, 7.2, 7.3, ... - -Check whether running system has already IPv6 module loaded - -If result is “off”, then enable IPv6 networking by editing /etc/sysconfig/network, add following new line - -Reboot or restart networking using - -Now IPv6 module should be loaded -If your system is on a link which provides router advertisement, autoconfiguration will be done automatically. For more information which settings are supported see /usr/share/doc/initscripts-$version/sysconfig.txt. -SuSE Linux -In newer 7.x versions there is a really rudimentary support available, see /etc/rc.config for details. -Because of the really different configuration and script file structure it is hard (or impossible) to use the set for Red Hat Linux and clones with this distribution. -In versions 8.x they completly change their configuration setup. -SuSE Linux 7.3 - -How to setup 6to4 IPv6 with SuSE 7.3 -SuSE Linux 8.0 - -IPv6 address configuration -Edit file /etc/sysconfig/network/ifcfg-<Interface-Name> and setup following value -/" -]]> -Additional information -See file /usr/share/doc/packages/sysconfig/README -SuSE Linux 8.1 - -IPv6 address configuration -Edit file /etc/sysconfig/network/ifcfg-<Interface-Name> and setup following value -/" -]]> -Additional information -See file /usr/share/doc/packages/sysconfig/Network -<!-- anchor id="Configuration-Debian-Linux" -->Debian Linux -Following information was contributed by Stephane Bortzmeyer <bortzmeyer at nic dot fr> -Be sure that IPv6 is loaded, either because it is compiled into the kernel or because the module is loaded. For the latest, three solutions, adding it to /etc/modules, using the pre-up trick shown later or using kmod (not detailed here).Configure your interface. Here we assume eth0 and address (2001:0db8:1234:5::1:1). Edit /etc/network/interfaces: - /proc/sys/net/ipv6/conf/all/autoconf - netmask 64 - # The router is autoconfigured and has no fixed address. - # It is magically - # found. (/proc/sys/net/ipv6/conf/all/accept_ra). Otherwise: - #gateway 2001:0db8:1234:5::1 -]]>And you reboot or you just -and you have your static address. -Further information - -IPv6 with Debian LinuxJean-Marc V. Liotier's HOWTO for Freenet6 & Debian Users (announced 24.12.2002 on mailinglist users@ipv6.org ) -<!-- anchor id="chapter-autoconfiguration" -->Auto-configuration - -Stateless auto-configuration out-of-the-box -Is supported and seen on the assigned link-local address after an IPv6-enabled interface is up. -Example: - mtu 1500 qlen1000 - inet6 fe80::211:d8ff:fe6b:f0f5/64 scope link - valid_lft forever preferred_lft forever -]]> -Stateless auto-configuration using Router Advertisement Daemon (radvd) -to be filled. See radvd daemon autoconfiguration below. -Dynamic Host Configuration Protocol v6 (DHCPv6) -After a long time discussing issues, finally RFC 3315 / Dynamic Host Configuration Protocol for IPv6 (DHCPv6) was finished. At time updating this part (10/2005) currently two implementations are available: -Dibbler by Tomasz Mrugalski <thomson at klub dot com dot pl> (Hints for configuration)dhcpv6 (Hints for configuration)ISC DHCP (Hints for configuration) -<!-- anchor id="chapter-mobility" -->Mobility - -Common information - -Node Mobility -Support for IPv6 mobility can be enabled in Linux by installing the MIPL2 implementation found at: http://www.mobile-ipv6.org/ -This implementation is compliant with RFC 3775. It is composed of a kernel patch and a mobility daemon called mip6d. Version 2.0.1 applies on Linux kernel 2.6.15. -Installation and setup are described in the Linux Mobile IPv6 HOWTO. -Network Mobility -There also exists an implementation of network mobility for Linux, it is called NEPL and is based on MIPL. It can also be downloaded from: http://www.mobile-ipv6.org/. -The HOWTO document describing setup and configuration is available at: http://www.nautilus6.org/doc/nepl-howto/. -Links - -Mobile IPv6 for Linux (MIPL) project: http://www.mobile-ipv6.org/Nautilus6 working group: http://nautilus6.org/Fast Handovers for Mobile IPv6 for Linux project: http://www.fmipv6.org/USAGI-patched Mobile IPv6 for Linux (UMIP):http://umip.linux-ipv6.org/Deploying IPsec/IKE-protected MIPv6 under Linux:http://natisbad.org/MIPv6/RFC 3775 / Mobility Support in IPv6RFC 3776 / Using IPsec to Protect Mobile IPv6 Signaling Between Mobile Nodes and Home AgentsRFC 3963 / Network Mobility (NEMO)RFC 4068 / Fast Handovers for Mobile IPv6RFC 4423 / Host Identity Protocol (HIP) ArchitectureRFC 5201 / Host Identity ProtocolHIP implementations: http://infrahip.hiit.fi/, http://hip4inter.net/, http://www.openhip.org/ -<!-- anchor id="chapter-firewalling-security" -->Firewalling -IPv6 firewalling is important, especially if using IPv6 on internal networks with global IPv6 addresses. Because unlike at IPv4 networks where in common internal hosts are protected automatically using private IPv4 addresses like RFC 1918 / Address Allocation for Private Internets or Automatic Private IP Addressing (APIPA)Google search for Microsoft + APIPA, in IPv6 normally global addresses are used and someone with IPv6 connectivity can reach all internal IPv6 enabled nodes. -<!-- anchor id="firewalling-netfilter6." -->Firewalling using netfilter6 -Native IPv6 firewalling is only supported in kernel versions 2.4+. In older 2.2- you can only filter IPv6-in-IPv4 by protocol 41. -Attention: no warranty that described rules or examples can really protect your system! -Audit your ruleset after installation, see for more. -Since kernel version 2.6.20 (February 2007) IPv6 connection tracking is fully working (and does not break IPv4 NAT anymore like versions before) -Since kernel version 3.9.0 (April 2013) NAT for IPv6 is supported with ip6tables >= 1.4.18 -Since kernel version 3.13 (April 2014) new framework introduced named: nftables -More information - -Netfilter projectmaillist archive of netfilter usersmaillist archive of netfilter developersUnofficial status informations -Preparation -This step is only needed if distributed kernel and netfilter doesn't fit your requirements and new features are available but still not built-in. -Get sources -Get the latest kernel source: http://www.kernel.org/ -Get the latest iptables package: -Source tarball (for kernel patches): http://www.netfilter.org/ -Extract sources -Change to source directory: -Unpack and rename kernel sources -Unpack iptables sources - -Apply latest iptables/IPv6-related patches to kernel source -Change to iptables directory -Apply pending patches -Apply additional IPv6 related patches (still not in the vanilla kernel included) -Say yes at following options (iptables-1.2.2) -ah-esp.patch masq-dynaddr.patch (only needed for systems with dynamic IP assigned WAN connections like PPP or PPPoE) ipv6-agr.patch.ipv6 ipv6-ports.patch.ipv6 LOG.patch.ipv6 REJECT.patch.ipv6 Check IPv6 extensions - -Configure, build and install new kernel -Change to kernel sources -Edit Makefile -Run configure, enable IPv6 related -Configure other related to your system, too -Compilation and installing: see the kernel section here and other HOWTOs -Rebuild and install binaries of iptables -Make sure, that upper kernel source tree is also available at /usr/src/linux/ -Rename older directory -Create a new softlink -Rebuild SRPMS -Install new iptables packages (iptables + iptables-ipv6) -On RH 7.1 systems, normally, already an older version is installed, therefore use "freshen" - -If not already installed, use "install" - -On RH 6.2 systems, normally, no kernel 2.4.x is installed, therefore the requirements don't fit. Use "--nodeps" to install it -Perhaps it's necessary to create a softlink for iptables libraries where iptables looks for them - -Usage of ip6tables - -Check for support -Load module, if so compiled -Check for capability - -Learn how to use ip6tables - -List all IPv6 netfilter entries - -Short - -Extended - -List specified filter - - -Insert a log rule at the input filter with options - - -Insert a drop rule at the input filter - - -Delete a rule by number - - -Enable connection tracking -Since kernel version 2.6.20 IPv6 connection tracking is well supported and should be used instead of using stateless filter rules. - -Allow ICMPv6 -Using older kernels (unpatched kernel 2.4.5 and iptables-1.2.2) no type can be specified -Accept incoming ICMPv6 through tunnels - -Allow outgoing ICMPv6 through tunnels -Newer kernels allow specifying of ICMPv6 types: - -Rate-limiting -Because it can happen (author already saw it to times) that an ICMPv6 storm will raise up, you should use available rate limiting for at least ICMPv6 ruleset. In addition logging rules should also get rate limiting to prevent DoS attacks against syslog and storage of log file partition. An example for a rate limited ICMPv6 looks like: - -Allow incoming SSH -Here an example is shown for a ruleset which allows incoming SSH connection from a specified IPv6 address -Allow incoming SSH from 2001:0db8:100::1/128 - -Allow response packets (no longer needed if connection tracking is used!) - -Enable tunneled IPv6-in-IPv4 -To accept tunneled IPv6-in-IPv4 packets, you have to insert rules in your IPv4 firewall setup relating to such packets, for example -Accept incoming IPv6-in-IPv4 on interface ppp0 - -Allow outgoing IPv6-in-IPv4 to interface ppp0 -If you have only a static tunnel, you can specify the IPv4 addresses, too, like -Accept incoming IPv6-in-IPv4 on interface ppp0 from tunnel endpoint 192.0.2.2 - -Allow outgoing IPv6-in-IPv4 to interface ppp0 to tunnel endpoint 192.0.2.2 - -Protection against incoming TCP connection requests -VERY RECOMMENDED! For security issues you should really insert a rule which blocks incoming TCP connection requests. Adapt "-i" option, if other interface names are in use! -Block incoming TCP connection requests to this host - -Block incoming TCP connection requests to hosts behind this router -Perhaps the rules have to be placed below others, but that is work you have to think about it. Best way is to create a script and execute rules in a specified way. -Protection against incoming UDP connection requests -ALSO RECOMMENDED! Like mentioned on my firewall information it's possible to control the ports on outgoing UDP/TCP sessions. So if all of your local IPv6 systems are using local ports e.g. from 32768 to 60999 you are able to filter UDP connections also (until connection tracking works) like: -Block incoming UDP packets which cannot be responses of outgoing requests of this host - -Block incoming UDP packets which cannot be responses of forwarded requests of hosts behind this router - -Examples - -Simple example for Fedora -Following lines show a simple firewall configuration for Fedora 6 (since kernel version 2.6.20). It was modfied from the default one (generated by system-config-firewall) for supporting connection tracking and return the proper ICMPv6 code for rejects. Incoming SSH (port 22) connections are allowed. -For completeness also the IPv4 configuration is shown here: -Usage: -Create/modify the configuration filesActivate IPv4 & IPv6 firewalling - -Enable automatic start after reboot - -Sophisticated example -Following lines show a more sophisticated but still stateless filter setup as an example. Happy netfilter6 ruleset creation.... - -<!-- anchor id="nat-netfilter6." -->Network Address Translation (NAT) using netfilter6 -Since at least Linux kernel version 3.9.0 and using ip6tables since 1.4.18 also Network Address Translation (NAT) is usable. -IPv6 Masquerading -Like in IPv4 clients behind a router can be hided by using IPv6 masquerading (hide/overlap NAT), e.g. - -IPv6 Destination NAT -A dedicated public IPv6 address can be forwarded to an internal IPv6 address, e.g. - -IPv6 Port Forwarding -A dedicated specified port can be forwarded to an internal system, e.g. - -Firewalling using nftables -nftables adds in addition to protocol specific tables “ip” (IPv4) and “ip6” (IPv6) support for a IPv4/IPv6 aware table named “inet”. Using this table it's possible to add only one rule and match both protocols (in case of UDP and TCP). -Take care if rules are contained in more than one table, because the tables are checked in sequence: - table "ip" --> table "inet" --> further checks -IPv6-Packet --> table "ip6" --> table "inet" --> further checks -]]>If table “ip6” accepts the packet, also table “inet” must accept the packet, otherwise it can be dropped by a later drop rule. -Preparation for nftables usage -Install a Linux distribution which has nftables support already included. At time of writing (May 2014) at least Fedora Rawhide (upcoming version 21) has support in conjunction with nftables version 0.2.0. -Basic nftables configuration -Load kernel modules: -Flush iptables and ip6tables to avoid interferences: -Create filter table: -Create input chain: - -Simple filter policy with nftables using only table “inet” - -Configuration -Allow packets which are related to existing connection tracking entries -Allow IPv4 and IPv6 ICMP echo-request (aka ping) -Allow some important IPv6 ICMP traffic, without counter, but checking hop-limit for security -Allow incoming SSH for IPv4 and IPv6 -Reject/drop others - -Result -Table for IP version aware filter -= 0 tcp dport <= 65535 counter packets 0 bytes 0 reject - udp dport >= 0 udp dport <= 65535 counter packets 0 bytes 0 drop - log prefix counter packets 0 bytes 0 drop - } -} -]]> -Hints for logging -To enable logging, an additonal kernel module must be loaded -BUT TAKE CARE, IT LOOKS LIKE THAT NO LOG LEVEL CAN BE SPEFICIED CURRENTLY IN nftables, resulting that events are logged with kern.emerg - POSSIBILITY OF FLODDING THE CONSOLE WITH LOG ENTRIES! -Fir initial test with logging it can be useful to disable kernel console logging in e.g. /etc/rsyslog.conf by putting a “#” in front of the related entry and restart logging daemon -Rule from above accepting SSH on port 22, but now with logging: - -Filter policy with nftables using tables “ip”, “ip6” and “inet” -As written above, if rules should be stored in related tables, it must be assured that earlier accepts are not discarded in the further table. This can be done using “meta mark set xxxx” on every accept rule and generic rules which accepts packets with “mark xxxx”. A resulting filter set would look like the following: - -<!-- anchor id="chapter-security" -->Security - -Node security -It's very recommended to apply all available patches and disable all not necessary services. Also bind services to the needed IPv4/IPv6 addresses only and install local firewalling. -More to be filled... -Access limitations -Many services uses the tcp_wrapper library for access control. Below is described the use of tcp_wrapper. -More to be filled... -<!-- anchor id="IPv6-security-auditing" -->IPv6 security auditing -Currently there are no comfortable tools out which are able to check a system over network for IPv6 security issues. Neither Nessus nor any commercial security scanner is as far as I know able to scan IPv6 addresses. -Legal issues -ATTENTION: always take care that you only scan your own systems or after receiving a written order, otherwise legal issues are able to come up to you. -CHECK destination IPv6 addresses TWICE before starting a scan. -Security auditing using IPv6-enabled netcat -With the IPv6-enabled netcat (see IPv6+Linux-status-apps/security-auditing for more) you can run a portscan by wrapping a script around which run through a port range, grab banners and so on. Usage example: - -Security auditing using IPv6-enabled nmap -NMap, one of the best portscaner around the world, supports IPv6 since version 3.10ALPHA1. Usage example: - -Security auditing using IPv6-enabled strobe -Strobe is a (compared to NMap) more a low budget portscanner, but there is an IPv6-enabling patch available (see IPv6+Linux-status-apps/security-auditing for more). Usage example: -. -::1 2401 unassigned unknown -::1 22 ssh Secure Shell - RSA encrypted rsh -::1 515 printer spooler (lpd) -::1 6010 unassigned unknown -::1 53 domain Domain Name Server -]]>Note: strobe isn't really developed further on, the shown version number isn't the right one. -Security auditing using online tools -There are some IPv6 enabled online tools available which can support in testing inbound firewall configuration: -Tim's Online IPv6 TCP/UDP Port ScannerSubnetOnline IPv6 Scanner -Audit results -If the result of an audit mismatch your IPv6 security policy, use IPv6 firewalling to close the holes, e.g. using netfilter6 (see Firewalling/Netfilter6 for more). -Info: More detailed information concerning IPv6 Security can be found here: -IETF drafts - IPv6 Operations (v6ops)RFC 3964 / Security Considerations for 6to4 -<!-- anchor id="chapter-encryption-authentication" -->Encryption and Authentication -Unlike in IPv4, encryption and authentication is a mandatory feature of IPv6. Those features are normally implemented using IPsec (which can be also used by IPv4). -Modes of using encryption and authentication -Two modes of encryption and authentication of a connection are possible: -Transport mode -Transport mode is a real end-to-end connection mode. Here, only the payload (usually ICMP, TCP or UDP) is encrypted with their particular header, while the IP header is not encrypted (but usually included in authentication). -Using AES-128 for encryption and SHA1 for authentication, this mode decreases the MTU by 42 octets. -Tunnel mode -Tunnel mode can be used either for end-to-end or for gateway-to-gateway connection modes. Here, the complete IP packet is being encrypted and gets a new IP header prepended, all together constituing a new IP packet (this mechanism is also known as "encapsulation") -This mode usually decreases the MTU by 40 octets from the MTU of transport mode. I.e. using AES-128 for encryption and SHA1 for authentication 82 octets less than the normal MTU. -Support in kernel (ESP and AH) - -Support in vanilla Linux kernel 2.4.x -At the time of writing missing in vanilla up to 2.4.28. There was an issue about keeping the Linux kernel source free of export/import-control-laws regarding encryption code. This is also one case why FreeS/WAN project wasn't included in vanilla source. Perhaps a backport from 2.6.x will be done in the future. -Support in vanilla Linux kernel 2.6.x -Current versions (as time of writing 2.6.9 and upper) support native IPsec for IPv4 and IPv6. -Implementation was helped by the USAGI project. -Automatic key exchange (IKE) -IPsec requires a key exchange of a secret. This is mostly done automatically by so called IKE daemons. They also handle the authentication of the peers, either by a common known secret (so called “pre-shared secret”) or by RSA keys (which can also be used from X.509 certificates). -Currently, two different IKE daemons are available for Linux, which totally differ in configuration and usage. -I prefer “pluto” from the *S/WAN implementation because of the easier and one-config-only setup. -IKE daemon “racoon” -The IKE daemon “racoon” is taken from the KAME project and ported to Linux. Modern Linux distributions contain this daemon in the package “ipsec-tools”. Two executables are required for a proper IPsec setup. Take a look on Linux Advanced Routing & Traffic Control HOWTO / IPSEC, too. -Manipulation of the IPsec SA/SP database with the tool “setkey” -“setkey” is important to define the security policy (SP) for the kernel. -File: /etc/racoon/setkey.sh -Example for an end-to-end encrypted connection in transport mode - -Example for a end-to-end encrypted connection in tunnel mode -For the other peer, you have to replace “in” with “out”. -Configuration of the IKE daemon “racoon” -“racoon” requires a configuration file for proper execution. It includes the related settings to the security policy, which should be set up previously using “setkey”. -File: /etc/racoon/racoon.conf -Also set up the pre-shared secret: -File: /etc/racoon/psk.txt - -Running IPsec with IKE daemon “racoon” -At least the daemon needs to be started. For the first time, use debug and foreground mode. The following example shows a successful IKE phase 1 (ISAKMP-SA) and 2 (IPsec-SA) negotiation: -2001:db8:2:2::2[500] -2005-01-01 20:31:06: INFO: begin Identity Protection mode. -2005-01-01 20:31:09: INFO: ISAKMP-SA established -¬ 2001:db8:1:1::1[500]-2001:db8:2:2::2[500] spi:da3d3693289c9698:ac039a402b2db401 -2005-01-01 20:31:09: INFO: initiate new phase 2 negotiation: -¬ 2001:6f8:900:94::2[0]<=>2001:db8:2:2::2[0] -2005-01-01 20:31:10: INFO: IPsec-SA established: -¬ ESP/Tunnel 2001:db8:2:2::2->2001:db8:1:1::1 spi=253935531(0xf22bfab) -2005-01-01 20:31:10: INFO: IPsec-SA established: -¬ ESP/Tunnel 2001:db8:1:1::1->2001:db8:2:2::2 spi=175002564(0xa6e53c4) -]]>Each direction got its own IPsec-SA (like defined in the IPsec standard). With “tcpdump” on the related interface, you will see as result of an IPv6 ping: - 2001:db8:2:2::2: ESP(spi=0x0a6e53c4,seq=0x3) -20:35:55.537522 2001:db8:2:2::2 > 2001:db8:1:1::1: ESP(spi=0x0f22bfab,seq=0x3) -]]>As expected, the negotiated SPIs are being used here. -And using “setkey”, current active parameters are shown: - -IKE daemon “pluto” -The IKE daemon “pluto” is included in distributions of the *S/WAN projects. *S/WAN project starts at the beginning as FreeS/WAN. Unfortunately, the FreeS/WAN project stopped further development in 2004. Because of the slow pace of development in the past, two spin-offs started: strongSwan and Openswan. Today, readily installable packages are available for at least Openswan (included in Fedora Core 3). -A major difference to “racoon”, only one configuration file is required. Also, an initscript exists for automatic setup after booting. -Configuration of the IKE daemon “pluto” -The configuration is very similar to the IPv4 one, only one important option is necessary. -File: /etc/ipsec.conf -Don't forget to define the pre-shared secret here also. -File: /etc/ipsec.secrets - -Running IPsec with IKE daemon “pluto” -If installation of Openswan was successfully, an initscript should exist for starting IPsec, simply run (on each peer): -Afterwards, start this connection on one peer. If you saw the line “IPsec SA established”, all worked fine. -0xa98b7710 <0xa51e1f22} -]]>Because *S/WAN and setkey/racoon do use the same IPsec implementation in Linux 2.6.x kernel, “setkey” can be used here too to show current active parameters: - -Additional informations: -On Linux Kernel 2.6.x you can get the policy and status of IPsec also using “ip”: - -<!-- anchor id="chapter-qos" -->Quality of Service (QoS) -IPv6 supports QoS with use of Flow Labels and Traffic Classes. -Additional infos: -RFC 3697 / IPv6 Flow Label Specification -General -Proper working QoS is only possible on the outgoing interface of a router or host, where the bottleneck begins. Everything else is a hickup and not subject to work as expected or has a successful result. -------- - Queue 1 \ - --->--- ---->--------->--------->--------------- -Big pipe Queue 2 Queue 1 / Queue 2 / Queue 3 Thin Pipe - --->---- ---->--------->--------->--------------- - Queue 3 / --------------->------- -]]> -Linux QoS using “tc” -Linux is using “tc” from the “iproute2” package to configure traffic shaping, generally described in the Linux Advanced Routing & Traffic Control HOWTO. -Example for a constant bitrate queuing -With the “cbq” scheduler, pipes with constant bit rates can be defined. -Root qdisc definition -Define root qdisc with a bandwidth of 1000 MBit/s on eth1 - -QoS class definition -Define a class 1:1 with 1 MBit/s -Define a class 1:2 with 50 MBit/s -Define a class 1:3 with 10 MBit/s -Define a class 1:4 with 200 kBit/s - -QoS filter definition -Define a filter for IPv4 (protocol ip), TCP (match ip protocol 6 0xff) destination port 5001 (match ip dport 5001 0xffff) using class 1:2 from above -Define a filter for IPv6 (protocol ip), TCP (match ip6 protocol 6 0xff) destination port 5001 using class 1:2 from above -Define a filter for IPv6 for packets having flow label 12345 (match ip6 flowlabel 12345 0x3ffff) using class 1:3 from above -Define a filter for IPv6 for packets having Linux iptables mark 32 (handle 32 fw) specified using class 1:4 from above -The last filter definition requires an entry in the ip6tables to mark a packet - -Testing filter definitions using iperf -Start on server side each one one separate console: -Start on client side and compare results: -> 50 MBit/s && <= 1000 MBit/s) -# iperf -V -c SERVER-IPv6 -p 5002 (expected: >> 50 MBit/s && <= 1000 MBit/s) -# iperf -V -c SERVER-IPv4 -p 5003 (expected: >> 50 MBit/s && <= 1000 MBit/s) -# iperf -V -c SERVER-IPv6 -p 5003 (expected: 200 kBit/s) -]]>The rate result should be as defined in the classes (see above), the results on port 5002 should be very similar independend from used IP version. -<!-- anchor id="chapter-hints-daemons" -->Hints for IPv6-enabled daemons -Here some hints are shown for IPv6-enabled daemons. -<!-- anchor id="hints-daemons-bind" -->Berkeley Internet Name Domain (BIND) daemon “named” -IPv6 is supported since version 9. Always use newest available version. At least version 9.1.3 must be used, older versions can contain remote exploitable security holes. -Listening on IPv6 addresses -Note: unlike in IPv4 current versions doesn't allow to bind a server socket to dedicated IPv6 addresses, so only any or none are valid. Because this can be a security issue, check the Access Control List (ACL) section below, too! -Enable BIND named for listening on IPv6 address -To enable IPv6 for listening, following options are requested to change -This should result after restart in e.g. -And a simple test looks like -and should show you a result. -Disable BIND named for listening on IPv6 address -To disable IPv6 for listening, following options are requested to change - -IPv6 enabled Access Control Lists (ACL) -IPv6 enabled ACLs are possible and should be used whenever it's possible. An example looks like following: -This ACLs can be used e.g. for queries of clients and transfer zones to secondary name-servers. This prevents also your caching name-server to be used from outside using IPv6. -It's also possible to set the allow-query and allow-transfer option for most of single zone definitions, too. -Sending queries with dedicated IPv6 address -This option is not required, but perhaps needed: - port ; -]]> -Per zone defined dedicated IPv6 addresses -It's also possible to define per zone some IPv6 addresses. -Transfer source address -Transfer source address is used for outgoing zone transfers: - [port port]; -]]> -Notify source address -Notify source address is used for outgoing notify messages: - [port port]; -]]> -IPv6 DNS zone files examples -Some information can be also found at IPv6 DNS Setup Information (article). Perhaps also helpful is the IPv6 Reverse DNS zone builder for BIND 8/9 (webtool). -Serving IPv6 related DNS data -For IPv6 new types and root zones for reverse lookups are defined: -AAAA and reverse IP6.INT: specified in RFC 1886 / DNS Extensions to support IP version 6, usable since BIND version 4.9.6A6, DNAME (DEPRECATED NOW!) and reverse IP6.ARPA: specified in RFC 2874 / DNS Extensions to Support IPv6 Address Aggregation and Renumbering, usable since BIND 9, but see also an information about the current state at Domain Name System Extension (dnsext)Perhaps filled later more content, for the meantime take a look at given RFCs and -AAAA and reverse IP6.INT: IPv6 DNS Setup InformationA6, DNAME (DEPRECATED NOW!) and reverse IP6.ARPA: take a look into chapter 4 and 6 of the BIND 9 Administrator Reference Manual (ARM) distributed with the bind-package or get this here: BIND manual version 9.3Because IP6.INT is deprecated (but still in use), a DNS server which will support IPv6 information has to serve both reverse zones. -Current best practice -Because there are some troubles around using the new formats, current best practice is: -Forward lookup support: -AAAAReverse lookup support: -Reverse nibble format for zone ip6.int (FOR BACKWARD COMPATIBILITY)Reverse nibble format for zone ip6.arpa (RECOMMENDED) -Checking IPv6-enabled connect -To check, whether BIND named is listening on an IPv6 socket and serving data see following examples. -IPv6 connect, but denied by ACL -Specifying a dedicated server for the query, an IPv6 connect can be forced: -Related log entry looks like following: -If you see such entries in the log, check whether requests from this client should be allowed and perhaps review your ACL configuration. -Successful IPv6 connect -A successful IPv6 connect looks like following: - -<!-- anchor id="hints-daemons-xinetd" -->Internet super daemon (xinetd) -IPv6 is supported since xinetd version around 1.8.9. Always use newest available version. At least version 2.3.3 must be used, older versions can contain remote exploitable security holes. -Some Linux distribution contain an extra package for the IPv6 enabled xinetd, some others start the IPv6-enabled xinetd if following variable is set: NETWORKING_IPV6="yes", mostly done by /etc/sysconfig/network (only valid for Red Hat like distributions). In newer releases, one binary supports IPv4 and IPv6. -If you enable a built-in service like e.g. daytime by modifying the configuration file in /etc/xinetd.d/daytime like -After restarting the xinetd you should get a positive result like: -Shown example also displays an IMAP and IMAP-SSL IPv4-only listening xinetd. -Note: earlier versions had a problem that an IPv4-only xinetd won't start on an IPv6-enabled node and also the IPv6-enabled xinetd won't start on an IPv4-only node. This is known to be fixed in later versions, at least version 2.3.11. -<!-- anchor id="hints-daemons-apache2." -->Webserver Apache2 (httpd2) -Apache web server supports IPv6 native by maintainers since 2.0.14. Available patches for the older 1.3.x series are not current and shouldn't be used in public environment, but available at KAME / Misc. -Listening on IPv6 addresses -Note: virtual hosts on IPv6 addresses are broken in versions until 2.0.28 (a patch is available for 2.0.28). But always try latest available version first because earlier versions had some security issues. -Virtual host listen on an IPv6 address only - - - ServerName ipv6only.yourdomain.yourtopleveldomain - # ...sure more config lines - -]]> -Virtual host listen on an IPv6 and on an IPv4 address - - - ServerName ipv6andipv4.yourdomain.yourtopleveldomain - # ...sure more config lines - -]]>This should result after restart in e.g. -For simple tests use the telnet example already shown. -Additional notes - -Apache2 supports a method called “sendfile” to speedup serving data. Some NIC drivers also support offline checksumming. In some cases, this can lead to connection problems and invalid TCP checksums. In this cases, disable “sendfile” either by recompiling using configure option “--without-sendfile” or by using the "EnableSendfile off" directive in configuration file. -<!-- anchor id="hints-daemons-radvd" -->Router Advertisement Daemon (radvd) -The router advertisement daemon is very useful on a LAN, if clients should be auto-configured. The daemon itself should run on the Linux default IPv6 gateway router (it's not required that this is also the default IPv4 gateway, so pay attention who on your LAN is sending router advertisements). -You can specify some information and flags which should be contained in the advertisement. Common used are -Prefix (needed)Lifetime of the prefixFrequency of sending advertisements (optional)After a proper configuration, the daemon sends advertisements through specified interfaces and clients are hopefully receive them and auto-magically configure addresses with received prefix and the default route. -Configuring radvd - -Simple configuration -Radvd's config file is normally /etc/radvd.conf. An simple example looks like following: -This results on client side in - mtu 1500 qdisc pfifo_fast qlen 100 - inet6 2001:0db8:100:f101:2e0:12ff:fe34:1234/64 scope global dynamic - valid_lft 2591992sec preferred_lft 604792sec - inet6 fe80::2e0:12ff:fe34:1234/10 scope link -]]>Because no lifetime was defined, a very high value was used. -Special 6to4 configuration -Version since 0.6.2pl3 support the automatic (re)-generation of the prefix depending on an IPv4 address of a specified interface. This can be used to distribute advertisements in a LAN after the 6to4 tunneling has changed. Mostly used behind a dynamic dial-on-demand Linux router. Because of the sure shorter lifetime of such prefix (after each dial-up, another prefix is valid), the lifetime configured to minimal values: -This results on client side in (assuming, ppp0 has currently 1.2.3.4 as local IPv4 address): - mtu 1500 qdisc pfifo_fast qlen 100 - inet6 2002:0102:0304:f101:2e0:12ff:fe34:1234/64 scope global dynamic - valid_lft 22sec preferred_lft 12sec - inet6 fe80::2e0:12ff:fe34:1234/10 scope link -]]>Because a small lifetime was defined, such prefix will be thrown away quickly, if no related advertisement was received. -Additional note: if you do not used special 6to4 support in initscripts, you have to setup a special route on the internal interface on the router, otherwise you will get some backrouting problems. for the example showh here: -This route needs to be replaced every time the prefix changes, which is the case after a new IPv4 address was assigned to the dial-up interface. -Debugging -A program called “radvdump” can help you looking into sent or received advertisements. Simple to use: -Output shows you each advertisement package in readable format. You should see your configured values here again, if not, perhaps it's not your radvd which sends the advertisement...look for another router on the link (and take the LLAddress, which is the MAC address for tracing). -<!-- anchor id="hints-daemons-dhcpv6." -->Dynamic Host Configuration v6 Server (dhcp6s) -DHCPv6 can be used for stateful configurations. The daemon itself need not necessary run on the Linux default IPv6 gateway router. -You can specify more information than by using radvd. The are most similar to IPv4 DHCP server. -After a proper configuration, the daemon reacts on received ICMPv6 multicast packets sent by a client to address ff02::1:2 -Configuration of the DHCPv6 server (dhcp6s) - -Simple configuration -dhcp6s's config file is normally /etc/dhcp6s.conf. An simple example looks like following: - -Configuration of the DHCPv6 client (dhcp6c) - -Simple configuration -dhcp6c's config file is normally /etc/dhcp6c.conf. An simple example looks like following: - -Usage - -dhcpv6_server -Start server, e.g. - -dhcpv6_client -Start client in foreground, e.g. - -Debugging - -dhcpv6_server -The server has one foreground and two debug toggles (both should be used for debugging), here is an example: - -dhcpv6_client -As general debugging for test whether the IPv6 DHCP server is reable on the link use an IPv6 ping to the DHCP multicast address: -The client has one foreground and two debug toggles, here is an example: -Note that the netlink error messages have no impact. -<!-- anchor id="hints-daemons-isc-dhcp" -->ISC Dynamic Host Configuration Server (dhcpd) -ISC DHCP supports IPv6 since version 4.x. -Configuration of the ISC DHCP server for IPv6 (dhcpd) -Note that currently, the ISC DHCP server can only serve IPv4 or IPv6, means you have to start the daemon twice (for IPv6 with option “-6”) to support both protocols. -Simple configuration -Create a dedicated configuration file /etc/dhcp/dhcpd6.conf for the IPv6 part of the dhcpd. Note, that the router requires to have a interface configured with an IPv6 address out of the defined subnet. -Note that the “dhcp.client-id” no longer belongs to a MAC address, an unique ID is used instead! “dhcp6c” (see above) uses the file /var/lib/dhcpv6/dhcp6c_duid (would be created during first start, if not existing) as unique identity. It's a 14 byte long identifier, starting with a 2 byte length information (usually “0x000e”): - -Usage - -dhcpd -Start server in foreground: - -<!-- anchor id="hints-daemons-dibbler" -->DHCP Server Dibbler -Dibbler is also a DHCP server -Configuration of the Dibbler DHCP server for IPv6 - -Simple configuration -Create a dedicated configuration file /etc/dibbler/server.conf . Note, that the router requires to have a interface configured with an IPv6 address out of the defined subnet. - -Usage - -dibbler-server -Start server in foreground: -,Marek Senderski -| Licence : GNU GPL v2 only. Developed at Gdansk University of Technology. -| Homepage: http://klub.com.pl/dhcpv6/ -2009.05.28 10:18:48 Server Notice My pid (1789) is stored in /var/lib/dibbler/server.pid -2009.05.28 10:18:48 Server Notice Detected iface eth0/3, MAC=54:52:00:01:23:45. -2009.05.28 10:18:48 Server Notice Detected iface eth1/2, MAC=54:52:00:67:89:ab. -2009.05.28 10:18:48 Server Notice Detected iface lo/1, MAC=00:00:00:00:00:00. -2009.05.28 10:18:48 Server Debug Skipping database loading. -2009.05.28 10:18:48 Server Debug Cache:server-cache.xml file: parsing started, expecting 0 entries. -2009.05.28 10:18:48 Server Notice Parsing /etc/dibbler/server.conf config file... -18:48 Server Debug Setting 0 generic option(s). -18:48 Server Debug 0 per-client configurations (exceptions) added. -18:48 Server Debug Parsing /etc/dibbler/server.conf done. -18:48 Server Info 0 client class(es) defined. -18:48 Server Debug 1 interface(s) specified in /etc/dibbler/server.conf -18:48 Server Info Mapping allow, deny list to class 0:0 allow/deny entries in total. -18:48 Server Info Interface eth1/2 configuration has been loaded. -18:48 Server Notice Running in stateful mode. -18:48 Server Info My DUID is 00:01:00:01:11:aa:6d:a7:54:52:00:67:89:ab. -18:48 Server Notice Creating multicast (ff02::1:2) socket on eth1/2 (eth1/2) interface. -18:48 Server Debug Cache: size set to 1048576 bytes, 1 cache entry size is 87 bytes, so maximum 12052 address-client pair(s) may be cached. -18:48 Server Notice Accepting connections. Next event in 4294967295 second(s). -]]> -<!-- anchor id="hints-daemons-tcpwrapper" -->tcp_wrapper -tcp_wrapper is a library which can help you to protect service against misuse. -Filtering capabilities -You can use tcp_wrapper for -Filtering against source addresses (IPv4 or IPv6)Filtering against users (requires a running ident daemon on the client) -Which program uses tcp_wrapper -Following are known: -Each service which is called by xinetd (if xinetd is compiled using tcp_wrapper library)sshd (if compiled using tcp_wrapper) -Usage -tcp_wrapper is controlled by two files name /etc/hosts.allow and /etc/hosts.deny. For more information see - -Example for /etc/hosts.allow -In this file, each service which should be positive filtered (means connects are accepted) need a line. -Note: there are broken implementations around, which uses following broken IPv6 network description: [2001:0db8:100:200::/64]. Hopefully, such versions will be fixed soon. -Example for /etc/hosts.deny -This file contains all negative filter entries and should normally deny the rest using -If this node is a more sensible one you can replace the standard line above with this one, but this can cause a DoS attack (load of mailer and spool directory), if too many connects were made in short time. Perhaps a logwatch is better for such issues. - -Logging -Depending on the entry in the syslog daemon configuration file /etc/syslog.conf the tcp_wrapper logs normally into /var/log/secure. -Refused connection -A refused connection via IPv4 to an xinetd covered daytime service produces a line like following example -A refused connection via IPv4 to an dual-listen sshd produces a line like following example - -Permitted connection -A permitted connection via IPv4 to an xinetd covered daytime service produces a line like following example -A permitted connection via IPv4 to an dual-listen sshd produces a line like following example - -<!-- anchor id="hints-daemons-vsftpd" -->vsftpd - -Listening on IPv6 addresses -Edit the configuration file, ususally /etc/vsftpd/vsftpd.conf, and adjust the listen option like -That's all. -<!-- anchor id="hints-daemons-proftpd" -->proftpd - -Listening on IPv6 addresses -Edit the configuration file, ususally /etc/proftpd.conf, but take care, not 100% logical in virtual host setup - - ... - Bind 2001:0DB8::1 - ... - -]]>That's all. -<!-- anchor id="hints-daemons-others" -->Other daemons -Nowadays it's mostly simple, look for either a command line option or a configuration value to enable IPv6 listening. See manual page of the daemon or check related FAQs. It can happen that you can bind a daemon only to the IPv6-“any”-address (::) and not to bind to a dedicated IPv6 address, because the lack of support (depends on that what the programmer has implemented so far...). -<!-- anchor id="chapter-programming" -->Programming - -<!-- anchor id="chapter-section-using-API" --><!-- anchor id="chapter-programming-using-API" -->Programming using C-API -Related RFCs: -RFC 3493 / Basic Socket Interface Extensions for IPv6RFC 3542 / Advanced Sockets Application Program Interface (API) for IPv6Following contents of this section is contributed by John Wenker, Sr. Software Engineer Performance Technologies San Diego, CA USA http://www.pt.com/. - - -This section describes how to write IPv6 client-server applications under the Linux operating system. First thing's first, and credit must be given where it is due. The information contained in this section is derived from Chapters 2 through 4 of IPv6 Network Programming by Jun-ichiro itojun Hagino (ISBN 1-55558-318-0). The reader is encouraged to consult that book for more detailed information. It describes how to convert IPv4 applications to be IPv6 compatible in a protocol-independent way, and describes some of the common problems encountered during the conversion along with suggested solutions. At the time of this writing, this is the only book of which the author is aware that specifically addresses how to program IPv6 applications [since writing this section, the author has also become aware of the Porting applications to IPv6 HowTo by Eva M. Castro at http://jungla.dit.upm.es/~ecastro/IPv6-web/ipv6.html]. Unfortunately, of the almost 360 pages in the book, maybe 60 are actually useful (the chapters mentioned). Nevertheless, without the guidance of that book, the author would have been unable to perform his job duties or compose this HowTo. While most (but certainly not all) of the information in the Hagino book is available via the Linux 'man' pages, application programmers will save a significant amount of time and frustration by reading the indicated chapters of the book rather than searching through the 'man' pages and online documentation. -Other than the Hagino book, any other information presented in this HowTo was obtained through trial and error. Some items or explanations may not be entirely “correct” in the grand IPv6 scheme, but seem to work in practical application. -The discussion that follows assumes the reader is already experienced with the traditional TCP/IP socket API. For more information on traditional socket programming, the Internetworking with TCP/IP series of textbooks by Comer & Stevens is hard to beat, specifically Volume III: Client-Server Programming and Applications, Linux/POSIX Sockets Version (ISBN 0-13-032071-4). This HowTo also assumes that the reader has had at least a bare basic introduction to IPv6 and in particular the addressing scheme for network addresses (see Section 2.3). -Address Structures -This section provides a brief overview of the structures provided in the socket API to represent network addresses (or more specifically transport endpoints) when using the Internet protocols in a client-server application. -IPv4 sockaddr_in -In IPv4, network addresses are 32 bits long and define a network node. Addresses are written in dotted decimal notation, such as 192.0.2.1, where each number represents eight bits of the address. Such an IPv4 address is represented by the struct sockaddr_in data type, which is defined in <netinet/in.h>. -The sin_family component indicates the address family. For IPv4 addresses, this is always set to AF_INET. The sin_addr field contains the 32-bit network address (in network byte order). Finally, the sin_port component represents the transport layer port number (in network byte order). Readers should already be familiar with this structure, as this is the standard IPv4 address structure. -IPv6 sockaddr_in6 -The biggest feature of IPv6 is its increased address space. Instead of 32-bit network addresses, IPv6 allots 128 bits to an address. Addresses are written in colon-hex notation of the form fe80::2c0:8cff:fe01:2345, where each hex number separated by colons represents 16 bits of the address. Two consecutive colons indicate a string of consecutive zeros for brevity, and at most only one double-colon may appear in the address. IPv6 addresses are represented by the struct sockaddr_in6 data type, also defined in <netinet/in.h>. -The sin6_family, sin6_port, and sin6_addr components of the structure have the same meaning as the corresponding fields in the sockaddr_in structure. However, the sin6_family member is set to AF_INET6 for IPv6 addresses, and the sin6_addr field holds a 128-bit address instead of only 32 bits. -The sin6_flowinfo field is used for flow control, but is not yet standardized and can be ignored. -The sin6_scope_id field has an odd use, and it seems (at least to this naïve author) that the IPv6 designers took a huge step backwards when devising this. Apparently, 128-bit IPv6 network addresses are not unique. For example, it is possible to have two hosts, on separate networks, with the same link-local address (see Figure 1). In order to pass information to a specific host, more than just the network address is required; the scope identifier must also be specified. In Linux, the network interface name is used for the scope identifier (e.g. “eth0”) [be warned that the scope identifier is implementation dependent!]. Use the ifconfig(1M) command to display a list of active network interfaces. -A colon-hex network address can be augmented with the scope identifier to produce a "scoped address”. The percent sign ('%') is used to delimit the network address from the scope identifier. For example, fe80::1%eth0 is a scoped IPv6 address where fe80::1 represents the 128-bit network address and eth0 is the network interface (i.e. the scope identifier). Thus, if a host resides on two networks, such as Host B in example below, the user now has to know which path to take in order to get to a particular host. In Figure 1, Host B addresses Host A using the scoped address fe80::1%eth0, while Host C is addressed with fe80::1%eth1. -Getting back to the sockaddr_in6 structure, its sin6_scope_id field contains the index of the network interface on which a host may be found. Server applications will have this field set automatically by the socket API when they accept a connection or receive a datagram. For client applications, if a scoped address is passed as the node parameter to getaddrinfo(3) (described later in this HowTo), then the sin6_scope_id field will be filled in correctly by the system upon return from the function; if a scoped address is not supplied, then the sin6_scope_id field must be explicitly set by the client software prior to attempting to communicate with the remote server. The if_nametoindex(3) function is used to translate a network interface name into its corresponding index. It is declared in <net/if.h>. -Generic Addresses -As any programmer familiar with the traditional TCP/IP socket API knows, several socket functions deal with "generic" pointers. For example, a pointer to a generic struct sockaddr data type is passed as a parameter to some socket functions (such as connect(2) or bind(2)) rather than a pointer to a specific address type. Be careful… the sockaddr_in6 structure is larger than the generic sockaddr structure! Thus, if your program receives a generic address whose actual type is unknown (e.g. it could be an IPv4 address structure or an IPv6 address structure), you must supply sufficient storage to hold the entire address. The struct sockaddr_storage data type is defined in <bits/socket.h> for this purpose [do not #include this file directly within an application; use <sys/socket.h> as usual, and <bits/socket.h> will be implicitly included]. -For example, consider the recvfrom(2) system call, which is used to receive a message from a remote peer. Its function prototype is: -The from parameter points to a generic sockaddr structure. If data can be received from an IPv6 peer on the socket referenced by s, then from should point to a data type of struct sockaddr_storage, as in the following dummy example: -As seen in the above example, ss (a struct sockaddr_storage data object) is used to receive the peer address information, but it's address is typecast to a generic struct sockaddr* pointer in the call to recvfrom(2). -Lookup Functions -Traditionally, hostname and service name resolution were performed by functions such as gethostbyname(3) and getservbyname(3). These traditional lookup functions are still available, but they are not forward compatible to IPv6. Instead, the IPv6 socket API provides new lookup functions that consolidate the functionality of several traditional functions. These new lookup functions are also backward compatible with IPv4, so a programmer can use the same translation algorithm in an application for both the IPv4 and IPv6 protocols. This is an important feature, because obviously a global IPv6 infrastructure isn't going to be put in place overnight. Thus, during the transition period from IPv4 to IPv6, client-server applications should be designed with the flexibility to handle both protocols simultaneously. The example programs at the end of this chapter do just that. -The primary lookup function in the new socket API is getaddrinfo(3). Its prototype is as follows. -The node parameter is a pointer to the hostname or IP address being translated. The referenced string can be a hostname, IPv4 dotted decimal address, or IPv6 colon-hex address (possibly scoped). The service parameter is a pointer to the transport layer's service name or port number. It can be specified as a name found in /etc/services or a decimal number. getaddrinfo(3) resolves the host/service combination and returns a list of address records; a pointer to the list is placed in the location pointed at by res. For example, suppose a host can be identified by both an IPv4 and IPv6 address, and that the indicated service has both a TCP entry and UDP entry in /etc/services. In such a scenario, it is not inconceivable that four address records are returned; one for TCP/IPv6, one for UDP/IPv6, one for TCP/IPv4, and one for UDP/IPv4. -The definition for struct addrinfo is found in <netdb.h> (as is the declaration for getaddrinfo(3) and the other functions described in this section). The structure has the following format: -Consult the 'man' page for getaddrinfo(3) for detailed information about the various fields; this HowTo only describes a subset of them, and only to the extent necessary for normal IPv6 programming. -The ai_family, ai_socktype, and ai_protocol fields have the exact same meaning as the parameters to the socket(2) system call. The ai_family field indicates the protocol family (not the address family) associated with the record, and will be PF_INET6 for IPv6 or PF_INET for IPv4. The ai_socktype parameter indicates the type of socket to which the record corresponds; SOCK_STREAM for a reliable connection-oriented byte-stream or SOCK_DGRAM for connectionless communication. The ai_protocol field specifies the underlying transport protocol for the record. -The ai_addr field points to a generic struct sockaddr object. Depending on the value in the ai_family field, it will point to either a struct sockaddr_in (PF_INET) or a struct sockaddr_in6 (PF_INET6). The ai_addrlen field contains the size of the object pointed at by the ai_addr field. -As mentioned, getaddrinfo(3) returns a list of address records. The ai_next field points to the next record in the list. -The hints parameter to getaddrinfo(3) is also of type struct addrinfo and acts as a filter for the address records returned in res. If hints is NULL, all matching records are returned; but if hints is non-NULL, the referenced structure gives "hints" to getaddrinfo(3) about which records to return. Only the ai_flags, ai_family, ai_socktype, and ai_protocol fields are significant in the hints structure, and all other fields should be set to zero. -Programs can use hints->ai_family to specify the protocol family. For example, if it is set to PF_INET6, then only IPv6 address records are returned. Likewise, setting hints->ai_family to PF_INET results in only IPv4 address records being returned. If an application wants both IPv4 and IPv6 records, the field should be set to PF_UNSPEC. -The hints->socktype field can be set to SOCK_STREAM to return only records that correspond to connection-oriented byte streams, SOCK_DGRAM to return only records corresponding to connectionless communication, or 0 to return both. -For the Internet protocols, there is only one protocol associated with connection-oriented sockets (TCP) and one protocol associated with connectionless sockets (UDP), so setting hints->ai_socktype to SOCK_STREAM or SOCK_DGRAM is the same as saying, "Give me only TCP records," or "Give me only UDP records," respectively. With that in mind, the hints->ai_protocol field isn't really that important with the Internet protocols, and pretty much mirrors the hints->ai_socktype field. Nevertheless, hints->ai_protocol can be set to IPPROTO_TCP to return only TCP records, IPPROTO_UDP to return only UDP records, or 0 for both. -The node or service parameter to gethostbyname(3) can be NULL, but not both. If node is NULL, then the ai_flags field of the hints parameter specifies how the network address in a returned record is set (i.e. the sin_addr or sin6_addr field of the object pointed at by the ai_addr component in a returned record). If the AI_PASSIVE flag is set in hints, then the returned network addresses are left unresolved (all zeros). This is how server applications would use getaddrinfo(3). If the flag is not set, then the address is set to the local loopback address (::1 for IPv6 or 127.0.0.1 for IPv4). This is one way a client application can specify that the target server is running on the same machine as the client. If the service parameter is NULL, the port number in the returned address records remains unresolved. -The getaddrinfo(3) function returns zero on success, or an error code. In the case of an error, the gai_strerror(3) function is used to obtain a character pointer to an error message corresponding to the error code, just like strerror(3) does in the standard 'C' library. -Once the address list is no longer needed, it must be freed by the application. This is done with the freeaddrinfo(3) function. -The last function that will be mentioned in this section is getnameinfo(3). This function is the inverse of getaddrinfo(3); it is used to create a string representation of the hostname and service from a generic struct sockaddr data object. It has the following prototype. -The sa parameter points to the address structure in question, and salen contains its size. The host parameter points to a buffer where the null-terminated hostname string is placed, and the hostlen parameter is the size of that buffer. If there is no hostname that corresponds to the address, then the network address (dotted decimal or colon-hex) is placed in host. Likewise, the serv parameter points to a buffer where the null-terminated service name string (or port number) is placed, and the servlen parameter is the size of that buffer. The flags parameter modifies the function's behavior; in particular, the NI_NUMERICHOST flag indicates that the converted hostname should always be formatted in numeric form (i.e. dotted decimal or colon-hex), and the NI_NUMERICSERV flag indicates that the converted service should always be in numeric form (i.e. the port number). -The symbols NI_MAXHOST and NI_MAXSERV are available to applications and represent the maximum size of any converted hostname or service name, respectively. Use these when declaring output buffers for getnameinfo(3). -Quirks Encountered -Before jumping into the programming examples, there are several quirks in IPv6 of which the reader should be aware. The more significant ones (in addition to the non-uniqueness of IPv6 network addresses already discussed) are described in the paragraphs below. -IPv4 Mapped Addresses -For security reasons that this author won't pretend to understand, "IPv4 mapped addresses" should not be allowed in IPv6-capable server applications. To put it in terms that everyone can understand, this simply means that a server should not accept IPv4 traffic on an IPv6 socket (an otherwise legal operation). An IPv4 mapped address is a mixed-format address of the form: -where the first portion is in IPv6 colon-hex format and the last portion is in IPv4 dotted decimal notation. The dotted decimal IPv4 address is the actual network address, but it is being mapped into an IPv6 compatible format. -To prevent IPv4 mapped addresses from being accepted on an IPv6 socket, server applications must explicitly set the IPV6_V6ONLY socket option on all IPv6 sockets created [the Hagino book implies that this is only a concern with server applications. However, it has been observed during testing that if a client application uses an IPv4 mapped address to specify the target server, and the target server has IPv4 mapped addresses disabled, the connection still completes regardless. On the server side, the connection endpoint is an IPv4 socket as desired; but on the client side, the connection endpoint is an IPv6 socket. Setting the IPV6_V6ONLY socket option on the client side as well as the server side prevents any connection from being established at all.]. There's only one problem. Apparently, IPV6_V6ONLY isn't defined on all systems [or at least it wasn't in 2005 when the Hagino book was written]. The server example at the end of this chapter provides a method for handling this problem. -If IPv4 traffic cannot be handled on IPv6 sockets, then that implies that server applications must open both an IPv4 and IPv6 socket for a particular network service if it wants to handle requests from either protocol. This goes back to the flexibility issue mentioned earlier. If getaddrinfo(3) returns multiple address records, then server applications should traverse the list and open a passive socket for each address provided. -Cannot Specify the Scope Identifier in /etc/hosts -It is possible to assign a hostname to an IPv6 network address in /etc/hosts. For example, the following is an excerpt from the /etc/hosts file on the author's development system. -The "localhost" and "pt141" hostnames can be translated to either an IPv4 or IPv6 network address. So, for example, if "pt141" is passed as the node parameter to getaddrinfo(3), the function returns both an IPv4 and IPv6 address record for the host (assuming the behavior hasn't been modified by the hints parameter). Unfortunately, a scoped address cannot be used in /etc/hosts. Doing so results in getaddrinfo(3) returning only the IPv4 record. -Client & Server Residing on the Same Machine -Suppose a machine has the IPv4 address 192.0.2.1. A client application running on that machine can connect to a server application on the same machine by using either the local loopback address (127.0.0.1) or the network address (192.0.2.1) as the target server. Much to this author's surprise (and dismay), it turns out that an IPv6 client application cannot connect to a server application on the same machine if it uses the network address of that machine as the target; it must use the local loopback address (::1). -Putting It All Together (A Client-Server Programming Example) -Now it's time to put everything discussed thus far together into a sample client-server application. The remainder of this section is devoted to a remote time-of-day application (the 'daytime' Internet service) [I noticed that Ms. Castro used a 'daytime' example in her Porting applications to IPv6 HowTo. For the record, the source code presented here is original, developed from scratch, and any similarity between it and any other publicly available 'daytime' example is purely coincidental.]. The source code presented in this section was developed and tested on a RedHat Linux release using the 2.6 kernel (2.6.9 to be specific). Readers may use the source code freely, so long as proper credit is attributed; but of course the standard disclaimer must be given first:
    -Although the sample source code is believed to be free of errors, the author makes no guarantees as to its reliability, especially considering that some error paths were intentionally omitted for brevity. Use it at your own risk! -
    When you get right down to it, there really aren't that many differences between IPv4 and IPv6 applications. The trick is to code IPv6 applications in a protocol-independent manner, such that they can handle both IPv4 and IPv6 simultaneously and transparently. This sample application does just that. The only protocol-dependent code in the example occurs when printing network addresses in verbose mode; but only after the ai_family field in the addrinfo structure has been checked, so the programs know exactly what type of address they're handling at the time. -'Daytime' Server Code -The server code is found in file tod6d.c (time-of-day IPv6 daemon). Once built, the server may be started using the following command syntax (assuming tod6d is the executable file): -ARGUMENTS: -serviceThe service (or well-known port) on which to listen. Default is "daytime".OPTIONS: --vTurn on verbose mode.The server handles both TCP and UDP requests on the network. The server source code contained in tod6d.c follows: - /* errno declaration & error codes. */ -#include /* getaddrinfo(3) et al. */ -#include /* sockaddr_in & sockaddr_in6 definition. */ -#include /* printf(3) et al. */ -#include /* exit(2). */ -#include /* String manipulation & memory functions. */ -#include /* poll(2) and related definitions. */ -#include /* Socket functions (socket(2), bind(2), etc). */ -#include /* time(2) & ctime(3). */ -#include /* getopt(3), read(2), etc. */ -/* -** Constants. -*/ -#define DFLT_SERVICE "daytime" /* Default service name. */ -#define INVALID_DESC -1 /* Invalid file descriptor. */ -#define MAXCONNQLEN 3 /* Max nbr of connection requests to queue. */ -#define MAXTCPSCKTS 2 /* One TCP socket for IPv4 & one for IPv6. */ -#define MAXUDPSCKTS 2 /* One UDP socket for IPv4 & one for IPv6. */ -#define VALIDOPTS "v" /* Valid command options. */ -/* -** Simple boolean type definition. -*/ -typedef enum { false = 0, true } boolean; -/* -** Prototypes for internal helper functions. -*/ -static int openSckt( const char *service, - const char *protocol, - int desc[ ], - size_t *descSize ); -static void tod( int tSckt[ ], - size_t tScktSize, - int uSckt[ ], - size_t uScktSize ); -/* -** Global (within this file only) data objects. -*/ -static char hostBfr[ NI_MAXHOST ]; /* For use w/getnameinfo(3). */ -static const char *pgmName; /* Program name w/o dir prefix. */ -static char servBfr[ NI_MAXSERV ]; /* For use w/getnameinfo(3). */ -static boolean verbose = false; /* Verbose mode indication. */ -/* -** Usage macro for command syntax violations. -*/ -#define USAGE \ - { \ - fprintf( stderr, \ - "Usage: %s [-v] [service]\n", \ - pgmName ); \ - exit( 127 ); \ - } /* End USAGE macro. */ -/* -** Macro to terminate the program if a system call error occurs. The system -** call must be one of the usual type that returns -1 on error. This macro is -** a modified version of a macro authored by Dr. V. Vinge, SDSU Dept. of -** Computer Science (retired)... best professor I ever had. I hear he writes -** great science fiction in addition to robust code, too. -*/ -#define CHK(expr) \ - do \ - { \ - if ( (expr) == -1 ) \ - { \ - fprintf( stderr, \ - "%s (line %d): System call ERROR - %s.\n", \ - pgmName, \ - __LINE__, \ - strerror( errno ) ); \ - exit( 1 ); \ - } /* End IF system call failed. */ \ - } while ( false ) -/****************************************************************************** -* Function: main -* -* Description: -* Set up a time-of-day server and handle network requests. This server -* handles both TCP and UDP requests. -* -* Parameters: -* The usual argc and argv parameters to a main() function. -* -* Return Value: -* This is a daemon program and never returns. However, in the degenerate -* case where no sockets are created, the function returns zero. -******************************************************************************/ -int main( int argc, - char *argv[ ] ) -{ - int opt; - const char *service = DFLT_SERVICE; - int tSckt[ MAXTCPSCKTS ]; /* Array of TCP socket descriptors. */ - size_t tScktSize = MAXTCPSCKTS; /* Size of uSckt (# of elements). */ - int uSckt[ MAXUDPSCKTS ]; /* Array of UDP socket descriptors. */ - size_t uScktSize = MAXUDPSCKTS; /* Size of uSckt (# of elements). */ - /* - ** Set the program name (w/o directory prefix). - */ - pgmName = strrchr( argv[ 0 ], '/' ); - pgmName = pgmName == NULL ? argv[ 0 ] : pgmName + 1; - /* - ** Process command options. - */ - opterr = 0; /* Turns off "invalid option" error messages. */ - while ( ( opt = getopt( argc, argv, VALIDOPTS ) ) >= 0 ) - { - switch ( opt ) - { - case 'v': /* Verbose mode. */ - { - verbose = true; - break; - } - default: - { - USAGE; - } - } /* End SWITCH on command option. */ - } /* End WHILE processing options. */ - /* - ** Process command line arguments. - */ - switch ( argc - optind ) - { - case 0: break; - case 1: service = argv[ optind ]; break; - default: USAGE; - } /* End SWITCH on number of command line arguments. */ - /* - ** Open both a TCP and UDP socket, for both IPv4 & IPv6, on which to receive - ** service requests. - */ - if ( ( openSckt( service, "tcp", tSckt, &tScktSize ) < 0 ) || - ( openSckt( service, "udp", uSckt, &uScktSize ) < 0 ) ) - { - exit( 1 ); - } - /* - ** Run the time-of-day server. - */ - if ( ( tScktSize > 0 ) || ( uScktSize > 0 ) ) - { - tod( tSckt, /* tod() never returns. */ - tScktSize, - uSckt, - uScktSize ); - } - /* - ** Since tod() never returns, execution only gets here if no sockets were - ** created. - */ - if ( verbose ) - { - fprintf( stderr, - "%s: No sockets opened... terminating.\n", - pgmName ); - } - return 0; -} /* End main() */ -/****************************************************************************** -* Function: openSckt -* -* Description: -* Open passive (server) sockets for the indicated inet service & protocol. -* Notice in the last sentence that "sockets" is plural. During the interim -* transition period while everyone is switching over to IPv6, the server -* application has to open two sockets on which to listen for connections... -* one for IPv4 traffic and one for IPv6 traffic. -* -* Parameters: -* service - Pointer to a character string representing the well-known port -* on which to listen (can be a service name or a decimal number). -* protocol - Pointer to a character string representing the transport layer -* protocol (only "tcp" or "udp" are valid). -* desc - Pointer to an array into which the socket descriptors are -* placed when opened. -* descSize - This is a value-result parameter. On input, it contains the -* max number of descriptors that can be put into 'desc' (i.e. the -* number of elements in the array). Upon return, it will contain -* the number of descriptors actually opened. Any unused slots in -* 'desc' are set to INVALID_DESC. -* -* Return Value: -* 0 on success, -1 on error. -******************************************************************************/ -static int openSckt( const char *service, - const char *protocol, - int desc[ ], - size_t *descSize ) -{ - struct addrinfo *ai; - int aiErr; - struct addrinfo *aiHead; - struct addrinfo hints = { .ai_flags = AI_PASSIVE, /* Server mode. -¬ */ - .ai_family = PF_UNSPEC }; /* IPv4 or IPv6. -¬ */ - size_t maxDescs = *descSize; - /* - ** Initialize output parameters. When the loop completes, *descSize is 0. - */ - while ( *descSize > 0 ) - { - desc[ --( *descSize ) ] = INVALID_DESC; - } - /* - ** Check which protocol is selected (only TCP and UDP are valid). - */ - if ( strcmp( protocol, "tcp" ) == 0 ) /* TCP protocol. */ - { - hints.ai_socktype = SOCK_STREAM; - hints.ai_protocol = IPPROTO_TCP; - } - else if ( strcmp( protocol, "udp" ) == 0 ) /* UDP protocol. */ - { - hints.ai_socktype = SOCK_DGRAM; - hints.ai_protocol = IPPROTO_UDP; - } - else /* Invalid protocol. */ - { - fprintf( stderr, - "%s (line %d): ERROR - Unknown transport " - "layer protocol \"%s\".\n", - pgmName, - __LINE__, - protocol ); - return -1; - } - /* - ** Look up the service's well-known port number. Notice that NULL is being - ** passed for the 'node' parameter, and that the AI_PASSIVE flag is set in - ** 'hints'. Thus, the program is requesting passive address information. - ** The network address is initialized to :: (all zeros) for IPv6 records, or - ** 0.0.0.0 for IPv4 records. - */ - if ( ( aiErr = getaddrinfo( NULL, - service, - &hints, - &aiHead ) ) != 0 ) - { - fprintf( stderr, - "%s (line %d): ERROR - %s.\n", - pgmName, - __LINE__, - gai_strerror( aiErr ) ); - return -1; - } - /* - ** For each of the address records returned, attempt to set up a passive - ** socket. - */ - for ( ai = aiHead; - ( ai != NULL ) && ( *descSize < maxDescs ); - ai = ai->ai_next ) - { - if ( verbose ) - { - /* - ** Display the current address info. Start with the protocol- - ** independent fields first. - */ - fprintf( stderr, - "Setting up a passive socket based on the " - "following address info:\n" - " ai_flags = 0x%02X\n" - " ai_family = %d (PF_INET = %d, PF_INET6 = %d)\n" - " ai_socktype = %d (SOCK_STREAM = %d, SOCK_DGRAM = %d)\n" - " ai_protocol = %d (IPPROTO_TCP = %d, IPPROTO_UDP = %d)\n" - " ai_addrlen = %d (sockaddr_in = %d, " - "sockaddr_in6 = %d)\n", - ai->ai_flags, - ai->ai_family, - PF_INET, - PF_INET6, - ai->ai_socktype, - SOCK_STREAM, - SOCK_DGRAM, - ai->ai_protocol, - IPPROTO_TCP, - IPPROTO_UDP, - ai->ai_addrlen, - sizeof( struct sockaddr_in ), - sizeof( struct sockaddr_in6 ) ); - /* - ** Now display the protocol-specific formatted socket address. Note - ** that the program is requesting that getnameinfo(3) convert the - ** host & service into numeric strings. - */ - getnameinfo( ai->ai_addr, - ai->ai_addrlen, - hostBfr, - sizeof( hostBfr ), - servBfr, - sizeof( servBfr ), - NI_NUMERICHOST | NI_NUMERICSERV ); - switch ( ai->ai_family ) - { - case PF_INET: /* IPv4 address record. */ - { - struct sockaddr_in *p = (struct sockaddr_in*) ai->ai_addr; - fprintf( stderr, - " ai_addr = sin_family: %d (AF_INET = %d, " - "AF_INET6 = %d)\n" - " sin_addr: %s\n" - " sin_port: %s\n", - p->sin_family, - AF_INET, - AF_INET6, - hostBfr, - servBfr ); - break; - } /* End CASE of IPv4. */ - case PF_INET6: /* IPv6 address record. */ - { - struct sockaddr_in6 *p = (struct sockaddr_in6*) ai->ai_addr; - fprintf( stderr, - " ai_addr = sin6_family: %d (AF_INET = %d, " - "AF_INET6 = %d)\n" - " sin6_addr: %s\n" - " sin6_port: %s\n" - " sin6_flowinfo: %d\n" - " sin6_scope_id: %d\n", - p->sin6_family, - AF_INET, - AF_INET6, - hostBfr, - servBfr, - p->sin6_flowinfo, - p->sin6_scope_id ); - break; - } /* End CASE of IPv6. */ - default: /* Can never get here, but just for completeness. */ - { - fprintf( stderr, - "%s (line %d): ERROR - Unknown protocol family (%d).\n", - pgmName, - __LINE__, - ai->ai_family ); - freeaddrinfo( aiHead ); - return -1; - } /* End DEFAULT case (unknown protocol family). */ - } /* End SWITCH on protocol family. */ - } /* End IF verbose mode. */ - /* - ** Create a socket using the info in the addrinfo structure. - */ - CHK( desc[ *descSize ] = socket( ai->ai_family, - ai->ai_socktype, - ai->ai_protocol ) ); - /* - ** Here is the code that prevents "IPv4 mapped addresses", as discussed - ** in Section 22.1.3.1. If an IPv6 socket was just created, then set the - ** IPV6_V6ONLY socket option. - */ - if ( ai->ai_family == PF_INET6 ) - { -#if defined( IPV6_V6ONLY ) - /* - ** Disable IPv4 mapped addresses. - */ - int v6Only = 1; - CHK( setsockopt( desc[ *descSize ], - IPPROTO_IPV6, - IPV6_V6ONLY, - &v6Only, - sizeof( v6Only ) ) ); -#else - /* - ** IPV6_V6ONLY is not defined, so the socket option can't be set and - ** thus IPv4 mapped addresses can't be disabled. Print a warning - ** message and close the socket. Design note: If the - ** #if...#else...#endif construct were removed, then this program - ** would not compile (because IPV6_V6ONLY isn't defined). That's an - ** acceptable approach; IPv4 mapped addresses are certainly disabled - ** if the program can't build! However, since this program is also - ** designed to work for IPv4 sockets as well as IPv6, I decided to - ** allow the program to compile when IPV6_V6ONLY is not defined, and - ** turn it into a run-time warning rather than a compile-time error. - ** IPv4 mapped addresses are still disabled because _all_ IPv6 traffic - ** is disabled (all IPv6 sockets are closed here), but at least this - ** way the server can still service IPv4 network traffic. - */ - fprintf( stderr, - "%s (line %d): WARNING - Cannot set IPV6_V6ONLY socket " - "option. Closing IPv6 %s socket.\n", - pgmName, - __LINE__, - ai->ai_protocol == IPPROTO_TCP ? "TCP" : "UDP" ); - CHK( close( desc[ *descSize ] ) ); - continue; /* Go to top of FOR loop w/o updating *descSize! */ -#endif /* IPV6_V6ONLY */ - } /* End IF this is an IPv6 socket. */ - /* - ** Bind the socket. Again, the info from the addrinfo structure is used. - */ - CHK( bind( desc[ *descSize ], - ai->ai_addr, - ai->ai_addrlen ) ); - /* - ** If this is a TCP socket, put the socket into passive listening mode - ** (listen is only valid on connection-oriented sockets). - */ - if ( ai->ai_socktype == SOCK_STREAM ) - { - CHK( listen( desc[ *descSize ], - MAXCONNQLEN ) ); - } - /* - ** Socket set up okay. Bump index to next descriptor array element. - */ - *descSize += 1; - } /* End FOR each address info structure returned. */ - /* - ** Dummy check for unused address records. - */ - if ( verbose && ( ai != NULL ) ) - { - fprintf( stderr, - "%s (line %d): WARNING - Some address records were " - "not processed due to insufficient array space.\n", - pgmName, - __LINE__ ); - } /* End IF verbose and some address records remain unprocessed. */ - /* - ** Clean up. - */ - freeaddrinfo( aiHead ); - return 0; -} /* End openSckt() */ -/****************************************************************************** -* Function: tod -* -* Description: -* Listen on a set of sockets and send the current time-of-day to any -* clients. This function never returns. -* -* Parameters: -* tSckt - Array of TCP socket descriptors on which to listen. -* tScktSize - Size of the tSckt array (nbr of elements). -* uSckt - Array of UDP socket descriptors on which to listen. -* uScktSize - Size of the uSckt array (nbr of elements). -* -* Return Value: None. -******************************************************************************/ -static void tod( int tSckt[ ], - size_t tScktSize, - int uSckt[ ], - size_t uScktSize ) -{ - char bfr[ 256 ]; - ssize_t count; - struct pollfd *desc; - size_t descSize = tScktSize + uScktSize; - int idx; - int newSckt; - struct sockaddr *sadr; - socklen_t sadrLen; - struct sockaddr_storage sockStor; - int status; - size_t timeLen; - char *timeStr; - time_t timeVal; - ssize_t wBytes; - /* - ** Allocate memory for the poll(2) array. - */ - desc = malloc( descSize * sizeof( struct pollfd ) ); - if ( desc == NULL ) - { - fprintf( stderr, - "%s (line %d): ERROR - %s.\n", - pgmName, - __LINE__, - strerror( ENOMEM ) ); - exit( 1 ); - } - /* - ** Initialize the poll(2) array. - */ - for ( idx = 0; idx < descSize; idx++ ) - { - desc[ idx ].fd = idx < tScktSize ? tSckt[ idx ] - : uSckt[ idx - tScktSize ]; - desc[ idx ].events = POLLIN; - desc[ idx ].revents = 0; - } - /* - ** Main time-of-day server loop. Handles both TCP & UDP requests. This is - ** an interative server, and all requests are handled directly within the - ** main loop. - */ - while ( true ) /* Do forever. */ - { - /* - ** Wait for activity on one of the sockets. The DO..WHILE construct is - ** used to restart the system call in the event the process is - ** interrupted by a signal. - */ - do - { - status = poll( desc, - descSize, - -1 /* Wait indefinitely for input. */ ); - } while ( ( status < 0 ) && ( errno == EINTR ) ); - CHK( status ); /* Check for a bona fide system call error. */ - /* - ** Get the current time. - */ - timeVal = time( NULL ); - timeStr = ctime( &timeVal ); - timeLen = strlen( timeStr ); - /* - ** Indicate that there is new network activity. - */ - if ( verbose ) - { - char *s = malloc( timeLen+1 ); - strcpy( s, timeStr ); - s[ timeLen-1 ] = '\0'; /* Overwrite '\n' in date string. */ - fprintf( stderr, - "%s: New network activity on %s.\n", - pgmName, - s ); - free( s ); - } /* End IF verbose. */ - /* - ** Process sockets with input available. - */ - for ( idx = 0; idx < descSize; idx++ ) - { - switch ( desc[ idx ].revents ) - { - case 0: /* No activity on this socket; try the next. */ - continue; - case POLLIN: /* Network activity. Go process it. */ - break; - default: /* Invalid poll events. */ - { - fprintf( stderr, - "%s (line %d): ERROR - Invalid poll event (0x%02X).\n", - pgmName, - __LINE__, - desc[ idx ].revents ); - exit( 1 ); - } - } /* End SWITCH on returned poll events. */ - /* - ** Determine if this is a TCP request or UDP request. - */ - if ( idx < tScktSize ) - { - /* - ** TCP connection requested. Accept it. Notice the use of - ** the sockaddr_storage data type. - */ - sadrLen = sizeof( sockStor ); - sadr = (struct sockaddr*) &sockStor; - CHK( newSckt = accept( desc[ idx ].fd, - sadr, - &sadrLen ) ); - CHK( shutdown( newSckt, /* Server never recv's anything. */ - SHUT_RD ) ); - if ( verbose ) - { - /* - ** Display the socket address of the remote client. Begin with - ** the address-independent fields. - */ - fprintf( stderr, - "Sockaddr info for new TCP client:\n" - " sa_family = %d (AF_INET = %d, AF_INET6 = %d)\n" - " addr len = %d (sockaddr_in = %d, " - "sockaddr_in6 = %d)\n", - sadr->sa_family, - AF_INET, - AF_INET6, - sadrLen, - sizeof( struct sockaddr_in ), - sizeof( struct sockaddr_in6 ) ); - /* - ** Display the address-specific fields. - */ - getnameinfo( sadr, - sadrLen, - hostBfr, - sizeof( hostBfr ), - servBfr, - sizeof( servBfr ), - NI_NUMERICHOST | NI_NUMERICSERV ); - /* - ** Notice that we're switching on an address family now, not a - ** protocol family. - */ - switch ( sadr->sa_family ) - { - case AF_INET: /* IPv4 address. */ - { - struct sockaddr_in *p = (struct sockaddr_in*) sadr; - fprintf( stderr, - " sin_addr = sin_family: %d\n" - " sin_addr: %s\n" - " sin_port: %s\n", - p->sin_family, - hostBfr, - servBfr ); - break; - } /* End CASE of IPv4. */ - case AF_INET6: /* IPv6 address. */ - { - struct sockaddr_in6 *p = (struct sockaddr_in6*) sadr; - fprintf( stderr, - " sin6_addr = sin6_family: %d\n" - " sin6_addr: %s\n" - " sin6_port: %s\n" - " sin6_flowinfo: %d\n" - " sin6_scope_id: %d\n", - p->sin6_family, - hostBfr, - servBfr, - p->sin6_flowinfo, - p->sin6_scope_id ); - break; - } /* End CASE of IPv6. */ - default: /* Can never get here, but for completeness. */ - { - fprintf( stderr, - "%s (line %d): ERROR - Unknown address " - "family (%d).\n", - pgmName, - __LINE__, - sadr->sa_family ); - break; - } /* End DEFAULT case (unknown address family). */ - } /* End SWITCH on address family. */ - } /* End IF verbose mode. */ - /* - ** Send the TOD to the client. - */ - wBytes = timeLen; - while ( wBytes > 0 ) - { - do - { - count = write( newSckt, - timeStr, - wBytes ); - } while ( ( count < 0 ) && ( errno == EINTR ) ); - CHK( count ); /* Check for a bona fide error. */ - wBytes -= count; - } /* End WHILE there is data to send. */ - CHK( close( newSckt ) ); - } /* End IF this was a TCP connection request. */ - else - { - /* - ** This is a UDP socket, and a datagram is available. The funny - ** thing about UDP requests is that this server doesn't require any - ** client input; but it can't send the TOD unless it knows a client - ** wants the data, and the only way that can occur with UDP is if - ** the server receives a datagram from the client. Thus, the - ** server must receive _something_, but the content of the datagram - ** is irrelevant. Read in the datagram. Again note the use of - ** sockaddr_storage to receive the address. - */ - sadrLen = sizeof( sockStor ); - sadr = (struct sockaddr*) &sockStor; - CHK( count = recvfrom( desc[ idx ].fd, - bfr, - sizeof( bfr ), - 0, - sadr, - &sadrLen ) ); - /* - ** Display whatever was received on stdout. - */ - if ( verbose ) - { - ssize_t rBytes = count; - fprintf( stderr, - "%s: UDP datagram received (%d bytes).\n", - pgmName, - count ); - while ( count > 0 ) - { - fputc( bfr[ rBytes - count-- ], - stdout ); - } - if ( bfr[ rBytes-1 ] != '\n' ) - fputc( '\n', stdout ); /* Newline also flushes stdout. */ - /* - ** Display the socket address of the remote client. Address- - ** independent fields first. - */ - fprintf( stderr, - "Remote client's sockaddr info:\n" - " sa_family = %d (AF_INET = %d, AF_INET6 = %d)\n" - " addr len = %d (sockaddr_in = %d, " - "sockaddr_in6 = %d)\n", - sadr->sa_family, - AF_INET, - AF_INET6, - sadrLen, - sizeof( struct sockaddr_in ), - sizeof( struct sockaddr_in6 ) ); - /* - ** Display the address-specific information. - */ - getnameinfo( sadr, - sadrLen, - hostBfr, - sizeof( hostBfr ), - servBfr, - sizeof( servBfr ), - NI_NUMERICHOST | NI_NUMERICSERV ); - switch ( sadr->sa_family ) - { - case AF_INET: /* IPv4 address. */ - { - struct sockaddr_in *p = (struct sockaddr_in*) sadr; - fprintf( stderr, - " sin_addr = sin_family: %d\n" - " sin_addr: %s\n" - " sin_port: %s\n", - p->sin_family, - hostBfr, - servBfr ); - break; - } /* End CASE of IPv4 address. */ - case AF_INET6: /* IPv6 address. */ - { - struct sockaddr_in6 *p = (struct sockaddr_in6*) sadr; - fprintf( stderr, - " sin6_addr = sin6_family: %d\n" - " sin6_addr: %s\n" - " sin6_port: %s\n" - " sin6_flowinfo: %d\n" - " sin6_scope_id: %d\n", - p->sin6_family, - hostBfr, - servBfr, - p->sin6_flowinfo, - p->sin6_scope_id ); - break; - } /* End CASE of IPv6 address. */ - default: /* Can never get here, but for completeness. */ - { - fprintf( stderr, - "%s (line %d): ERROR - Unknown address " - "family (%d).\n", - pgmName, - __LINE__, - sadr->sa_family ); - break; - } /* End DEFAULT case (unknown address family). */ - } /* End SWITCH on address family. */ - } /* End IF verbose mode. */ - /* - ** Send the time-of-day to the client. - */ - wBytes = timeLen; - while ( wBytes > 0 ) - { - do - { - count = sendto( desc[ idx ].fd, - timeStr, - wBytes, - 0, - sadr, /* Address & address length */ - sadrLen ); /* received in recvfrom(). */ - } while ( ( count < 0 ) && ( errno == EINTR ) ); - CHK( count ); /* Check for a bona fide error. */ - wBytes -= count; - } /* End WHILE there is data to send. */ - } /* End ELSE a UDP datagram is available. */ - desc[ idx ].revents = 0; /* Clear the returned poll events. */ - } /* End FOR each socket descriptor. */ - } /* End WHILE forever. */ -} /* End tod() */ -]]> -'Daytime' TCP Client Code -The TCP client code is found in file tod6tc.c (time-of-day IPv6 TCP client). Once built, the TCP client may be started using the following command syntax (assuming tod6tc is the executable file): -ARGUMENTS: -hostThe hostname or IP address (dotted decimal or colon-hex) of the remote host providing the service. Default is "localhost".serviceThe TCP service (or well-known port number) to which a connection attempt is made. Default is "daytime".OPTIONS: --sThis option is only meaningful for IPv6 addresses, and is used to set the scope identifier (i.e. the network interface on which to establish the connection). Default is "eth0". If host is a scoped address, this option is ignored.-vTurn on verbose mode.The TCP client source code contained in tod6tc.c follows: - /* errno declaration and error codes. */ -#include /* if_nametoindex(3). */ -#include /* getaddrinfo(3) and associated definitions. */ -#include /* sockaddr_in and sockaddr_in6 definitions. */ -#include /* printf(3) et al. */ -#include /* exit(2). */ -#include /* String manipulation and memory functions. */ -#include /* Socket functions (socket(2), connect(2), etc). */ -#include /* getopt(3), read(2), etc. */ -/* -** Constants & macros. -*/ -#define DFLT_HOST "localhost" /* Default server name. */ -#define DFLT_SCOPE_ID "eth0" /* Default scope identifier. */ -#define DFLT_SERVICE "daytime" /* Default service name. */ -#define INVALID_DESC -1 /* Invalid file (socket) descriptor. */ -#define MAXBFRSIZE 256 /* Max bfr sz to read remote TOD. */ -#define VALIDOPTS "s:v" /* Valid command options. */ -/* -** Type definitions (for convenience). -*/ -typedef enum { false = 0, true } boolean; -typedef struct sockaddr_in sockaddr_in_t; -typedef struct sockaddr_in6 sockaddr_in6_t; -/* -** Prototypes for internal helper functions. -*/ -static int openSckt( const char *host, - const char *service, - unsigned int scopeId ); -static void tod( int sckt ); -/* -** Global (within this file only) data objects. -*/ -static const char *pgmName; /* Program name (w/o directory). */ -static boolean verbose = false; /* Verbose mode. */ -/* -** Usage macro. -*/ -#define USAGE \ - { \ - fprintf( stderr, \ - "Usage: %s [-v] [-s scope_id] [host [service]]\n", \ - pgmName ); \ - exit( 127 ); \ - } /* End USAGE macro. */ -/* -** This "macro" (even though it's really a function) is loosely based on the -** CHK() macro by Dr. V. Vinge (see server code). The status parameter is -** a boolean expression indicating the return code from one of the usual system -** calls that returns -1 on error. If a system call error occurred, an alert -** is written to stderr. It returns a boolean value indicating success/failure -** of the system call. -** -** Example: if ( !SYSCALL( "write", -** count = write( fd, bfr, size ) ) ) -** { -** // Error processing... but SYSCALL() will have already taken -** // care of dumping an error alert to stderr. -** } -*/ -static __inline boolean SYSCALL( const char *syscallName, - int lineNbr, - int status ) -{ - if ( ( status == -1 ) && verbose ) - { - fprintf( stderr, - "%s (line %d): System call failed ('%s') - %s.\n", - pgmName, - lineNbr, - syscallName, - strerror( errno ) ); - } - return status != -1; /* True if the system call was successful. */ -} /* End SYSCALL() */ -/****************************************************************************** -* Function: main -* -* Description: -* Connect to a remote time-of-day service and write the remote host's TOD to -* stdout. -* -* Parameters: -* The usual argc & argv parameters to a main() program. -* -* Return Value: -* This function always returns zero. -******************************************************************************/ -int main( int argc, - char *argv[ ] ) -{ - const char *host = DFLT_HOST; - int opt; - int sckt; - unsigned int scopeId = if_nametoindex( DFLT_SCOPE_ID ); - const char *service = DFLT_SERVICE; - /* - ** Determine the program name (w/o directory prefix). - */ - pgmName = (const char*) strrchr( argv[ 0 ], '/' ); - pgmName = pgmName == NULL ? argv[ 0 ] : pgmName+1; - /* - ** Process command line options. - */ - opterr = 0; /* Turns off "invalid option" error messages. */ - while ( ( opt = getopt( argc, argv, VALIDOPTS ) ) != -1 ) - { - switch ( opt ) - { - case 's': /* Scope identifier (IPv6 kluge). */ - { - scopeId = if_nametoindex( optarg ); - if ( scopeId == 0 ) - { - fprintf( stderr, - "%s: Unknown network interface (%s).\n", - pgmName, - optarg ); - USAGE; - } - break; - } - case 'v': /* Verbose mode. */ - { - verbose = true; - break; - } - default: - { - USAGE; - } - } /* End SWITCH on command option. */ - } /* End WHILE processing command options. */ - /* - ** Process command arguments. At the end of the above loop, optind is the - ** index of the first NON-option argv element. - */ - switch ( argc - optind ) - { - case 2: /* Both host & service are specified on the command line. */ - { - service = argv[ optind + 1 ]; - /***** Fall through *****/ - } - case 1: /* Host is specified on the command line. */ - { - host = argv[ optind ]; - /***** Fall through *****/ - } - case 0: /* Use default host & service. */ - { - break; - } - default: - { - USAGE; - } - } /* End SWITCH on number of command arguments. */ - /* - ** Open a connection to the indicated host/service. - ** - ** Note that if all three of the following conditions are met, then the - ** scope identifier remains unresolved at this point. - ** 1) The default network interface is unknown for some reason. - ** 2) The -s option was not used on the command line. - ** 3) An IPv6 "scoped address" was not specified for the hostname on the - ** command line. - ** If the above three conditions are met, then only an IPv4 socket can be - ** opened (connect(2) fails without the scope ID properly set for IPv6 - ** sockets). - */ - if ( ( sckt = openSckt( host, - service, - scopeId ) ) == INVALID_DESC ) - { - fprintf( stderr, - "%s: Sorry... a connection could not be established.\n", - pgmName ); - exit( 1 ); - } - /* - ** Get the remote time-of-day. - */ - tod( sckt ); - /* - ** Close the connection and terminate. - */ - (void) SYSCALL( "close", - __LINE__, - close( sckt ) ); - return 0; -} /* End main() */ -/****************************************************************************** -* Function: openSckt -* -* Description: -* Sets up a TCP connection to a remote server. Getaddrinfo(3) is used to -* perform lookup functions and can return multiple address records (i.e. a -* list of 'struct addrinfo' records). This function traverses the list and -* tries to establish a connection to the remote server. The function ends -* when either a connection has been established or all records in the list -* have been processed. -* -* Parameters: -* host - A pointer to a character string representing the hostname or IP -* address (IPv4 or IPv6) of the remote server. -* service - A pointer to a character string representing the service name or -* well-known port number. -* scopeId - For IPv6 sockets only. This is the index corresponding to the -* network interface on which to set up the connection. This -* parameter is ignored for IPv4 sockets or when an IPv6 "scoped -* address" is specified in 'host' (i.e. where the colon-hex -* network address is augmented with the scope ID). -* -* Return Value: -* Returns the socket descriptor for the connection, or INVALID_DESC if all -* address records have been processed and a connection could not be -* established. -******************************************************************************/ -static int openSckt( const char *host, - const char *service, - unsigned int scopeId ) -{ - struct addrinfo *ai; - int aiErr; - struct addrinfo *aiHead; - struct addrinfo hints; - sockaddr_in6_t *pSadrIn6; - int sckt; - /* - ** Initialize the 'hints' structure for getaddrinfo(3). - ** - ** Notice that the 'ai_family' field is set to PF_UNSPEC, indicating to - ** return both IPv4 and IPv6 address records for the host/service. Most of - ** the time, the user isn't going to care whether an IPv4 connection or an - ** IPv6 connection is established; the user simply wants to exchange data - ** with the remote host and doesn't care how it's done. Sometimes, however, - ** the user might want to explicitly specify the type of underlying socket. - ** It is left as an exercise for the motivated reader to add a command line - ** option allowing the user to specify the IP protocol, and then process the - ** list of addresses accordingly (it's not that difficult). - */ - memset( &hints, 0, sizeof( hints ) ); - hints.ai_family = PF_UNSPEC; /* IPv4 or IPv6 records (don't care). */ - hints.ai_socktype = SOCK_STREAM; /* Connection-oriented byte stream. */ - hints.ai_protocol = IPPROTO_TCP; /* TCP transport layer protocol only. */ - /* - ** Look up the host/service information. - */ - if ( ( aiErr = getaddrinfo( host, - service, - &hints, - &aiHead ) ) != 0 ) - { - fprintf( stderr, - "%s (line %d): ERROR - %s.\n", - pgmName, - __LINE__, - gai_strerror( aiErr ) ); - return INVALID_DESC; - } - /* - ** Go through the list and try to open a connection. Continue until either - ** a connection is established or the entire list is exhausted. - */ - for ( ai = aiHead, sckt = INVALID_DESC; - ( ai != NULL ) && ( sckt == INVALID_DESC ); - ai = ai->ai_next ) - { - /* - ** IPv6 kluge. Make sure the scope ID is set. - */ - if ( ai->ai_family == PF_INET6 ) - { - pSadrIn6 = (sockaddr_in6_t*) ai->ai_addr; - if ( pSadrIn6->sin6_scope_id == 0 ) - { - pSadrIn6->sin6_scope_id = scopeId; - } /* End IF the scope ID wasn't set. */ - } /* End IPv6 kluge. */ - /* - ** Display the address info for the remote host. - */ - if ( verbose ) - { - /* - ** Temporary character string buffers for host & service. - */ - char hostBfr[ NI_MAXHOST ]; - char servBfr[ NI_MAXSERV ]; - /* - ** Display the address information just fetched. Start with the - ** common (protocol-independent) stuff first. - */ - fprintf( stderr, - "Address info:\n" - " ai_flags = 0x%02X\n" - " ai_family = %d (PF_INET = %d, PF_INET6 = %d)\n" - " ai_socktype = %d (SOCK_STREAM = %d, SOCK_DGRAM = %d)\n" - " ai_protocol = %d (IPPROTO_TCP = %d, IPPROTO_UDP = %d)\n" - " ai_addrlen = %d (sockaddr_in = %d, " - "sockaddr_in6 = %d)\n", - ai->ai_flags, - ai->ai_family, - PF_INET, - PF_INET6, - ai->ai_socktype, - SOCK_STREAM, - SOCK_DGRAM, - ai->ai_protocol, - IPPROTO_TCP, - IPPROTO_UDP, - ai->ai_addrlen, - sizeof( struct sockaddr_in ), - sizeof( struct sockaddr_in6 ) ); - /* - ** Display the protocol-specific formatted address. - */ - getnameinfo( ai->ai_addr, - ai->ai_addrlen, - hostBfr, - sizeof( hostBfr ), - servBfr, - sizeof( servBfr ), - NI_NUMERICHOST | NI_NUMERICSERV ); - switch ( ai->ai_family ) - { - case PF_INET: /* IPv4 address record. */ - { - sockaddr_in_t *pSadrIn = (sockaddr_in_t*) ai->ai_addr; - fprintf( stderr, - " ai_addr = sin_family: %d (AF_INET = %d, " - "AF_INET6 = %d)\n" - " sin_addr: %s\n" - " sin_port: %s\n", - pSadrIn->sin_family, - AF_INET, - AF_INET6, - hostBfr, - servBfr ); - break; - } /* End CASE of IPv4 record. */ - case PF_INET6: /* IPv6 address record. */ - { - pSadrIn6 = (sockaddr_in6_t*) ai->ai_addr; - fprintf( stderr, - " ai_addr = sin6_family: %d (AF_INET = %d, " - "AF_INET6 = %d)\n" - " sin6_addr: %s\n" - " sin6_port: %s\n" - " sin6_flowinfo: %d\n" - " sin6_scope_id: %d\n", - pSadrIn6->sin6_family, - AF_INET, - AF_INET6, - hostBfr, - servBfr, - pSadrIn6->sin6_flowinfo, - pSadrIn6->sin6_scope_id ); - break; - } /* End CASE of IPv6 record. */ - default: /* Can never get here, but just for completeness. */ - { - fprintf( stderr, - "%s (line %d): ERROR - Unknown protocol family (%d).\n", - pgmName, - __LINE__, - ai->ai_family ); - break; - } /* End DEFAULT case (unknown protocol family). */ - } /* End SWITCH on protocol family. */ - } /* End IF verbose mode. */ - /* - ** Create a socket. - */ - if ( !SYSCALL( "socket", - __LINE__, - sckt = socket( ai->ai_family, - ai->ai_socktype, - ai->ai_protocol ) ) ) - { - sckt = INVALID_DESC; - continue; /* Try the next address record in the list. */ - } - /* - ** Connect to the remote host. - */ - if ( !SYSCALL( "connect", - __LINE__, - connect( sckt, - ai->ai_addr, - ai->ai_addrlen ) ) ) - { - (void) close( sckt ); /* Could use SYSCALL() again here, but why? */ - sckt = INVALID_DESC; - continue; /* Try the next address record in the list. */ - } - } /* End FOR each address record returned by getaddrinfo(3). */ - /* - ** Clean up & return. - */ - freeaddrinfo( aiHead ); - return sckt; -} /* End openSckt() */ -/****************************************************************************** -* Function: tod -* -* Description: -* Receive the time-of-day from the remote server and write it to stdout. -* -* Parameters: -* sckt - The socket descriptor for the connection. -* -* Return Value: None. -******************************************************************************/ -static void tod( int sckt ) -{ - char bfr[ MAXBFRSIZE+1 ]; - int inBytes; - /* - ** The client never sends anything, so shut down the write side of the - ** connection. - */ - if ( !SYSCALL( "shutdown", - __LINE__, - shutdown( sckt, SHUT_WR ) ) ) - { - return; - } - /* - ** Read the time-of-day from the remote host. - */ - do - { - if ( !SYSCALL( "read", - __LINE__, - inBytes = read( sckt, - bfr, - MAXBFRSIZE ) ) ) - { - return; - } - bfr[ inBytes ] = '\0'; /* Null-terminate the received string. */ - fputs( bfr, stdout ); /* Null string if EOF (inBytes == 0). */ - } while ( inBytes > 0 ); - fflush( stdout ); -} /* End tod() */ -]]> -'Daytime' UDP Client Code -The UDP client code is found in file tod6uc.c (time-of-day IPv6 UDP client). It is almost an exact duplicate of the TCP client (and in fact was derived from it), but is included in this HowTo for completeness. Once built, the UDP client may be started using the following command syntax (assuming tod6uc is the executable file): -ARGUMENTS: -hostThe hostname or IP address (dotted decimal or colon-hex) of the remote host providing the service. Default is "localhost".serviceThe UDP service (or well-known port number) to which datagrams are sent. Default is "daytime".OPTIONS: --sThis option is only meaningful for IPv6 addresses, and is used to set the scope identifier (i.e. the network interface on which to exchange datagrams). Default is "eth0". If host is a scoped address, this option is ignored.-vTurn on verbose mode.The UDP client source code contained in tod6uc.c follows: - /* errno declaration and error codes. */ -#include /* if_nametoindex(3). */ -#include /* getaddrinfo(3) and associated definitions. */ -#include /* sockaddr_in and sockaddr_in6 definitions. */ -#include /* printf(3) et al. */ -#include /* exit(2). */ -#include /* String manipulation and memory functions. */ -#include /* Socket functions (socket(2), connect(2), etc). */ -#include /* getopt(3), recvfrom(2), sendto(2), etc. */ -/* -** Constants & macros. -*/ -#define DFLT_HOST "localhost" /* Default server name. */ -#define DFLT_SCOPE_ID "eth0" /* Default scope identifier. */ -#define DFLT_SERVICE "daytime" /* Default service name. */ -#define INVALID_DESC -1 /* Invalid file (socket) descriptor. */ -#define MAXBFRSIZE 256 /* Max bfr sz to read remote TOD. */ -#define VALIDOPTS "s:v" /* Valid command options. */ -/* -** Type definitions (for convenience). -*/ -typedef enum { false = 0, true } boolean; -typedef struct sockaddr_in sockaddr_in_t; -typedef struct sockaddr_in6 sockaddr_in6_t; -/* -** Prototypes for internal helper functions. -*/ -static int openSckt( const char *host, - const char *service, - unsigned int scopeId ); -static void tod( int sckt ); -/* -** Global (within this file only) data objects. -*/ -static const char *pgmName; /* Program name (w/o directory). */ -static boolean verbose = false; /* Verbose mode. */ -/* -** Usage macro. -*/ -#define USAGE \ - { \ - fprintf( stderr, \ - "Usage: %s [-v] [-s scope_id] [host [service]]\n", \ - pgmName ); \ - exit( 127 ); \ - } /* End USAGE macro. */ -/* -** This "macro" (even though it's really a function) is loosely based on the -** CHK() macro by Dr. V. Vinge (see server code). The status parameter is -** a boolean expression indicating the return code from one of the usual system -** calls that returns -1 on error. If a system call error occurred, an alert -** is written to stderr. It returns a boolean value indicating success/failure -** of the system call. -** -** Example: if ( !SYSCALL( "write", -** count = write( fd, bfr, size ) ) ) -** { -** // Error processing... but SYSCALL() will have already taken -** // care of dumping an error alert to stderr. -** } -*/ -static __inline boolean SYSCALL( const char *syscallName, - int lineNbr, - int status ) -{ - if ( ( status == -1 ) && verbose ) - { - fprintf( stderr, - "%s (line %d): System call failed ('%s') - %s.\n", - pgmName, - lineNbr, - syscallName, - strerror( errno ) ); - } - return status != -1; /* True if the system call was successful. */ -} /* End SYSCALL() */ -/****************************************************************************** -* Function: main -* -* Description: -* Connect to a remote time-of-day service and write the remote host's TOD to -* stdout. -* -* Parameters: -* The usual argc & argv parameters to a main() program. -* -* Return Value: -* This function always returns zero. -******************************************************************************/ -int main( int argc, - char *argv[ ] ) -{ - const char *host = DFLT_HOST; - int opt; - int sckt; - unsigned int scopeId = if_nametoindex( DFLT_SCOPE_ID ); - const char *service = DFLT_SERVICE; - /* - ** Determine the program name (w/o directory prefix). - */ - pgmName = (const char*) strrchr( argv[ 0 ], '/' ); - pgmName = pgmName == NULL ? argv[ 0 ] : pgmName+1; - /* - ** Process command line options. - */ - opterr = 0; /* Turns off "invalid option" error messages. */ - while ( ( opt = getopt( argc, argv, VALIDOPTS ) ) != -1 ) - { - switch ( opt ) - { - case 's': /* Scope identifier (IPv6 kluge). */ - { - scopeId = if_nametoindex( optarg ); - if ( scopeId == 0 ) - { - fprintf( stderr, - "%s: Unknown network interface (%s).\n", - pgmName, - optarg ); - USAGE; - } - break; - } - case 'v': /* Verbose mode. */ - { - verbose = true; - break; - } - default: - { - USAGE; - } - } /* End SWITCH on command option. */ - } /* End WHILE processing command options. */ - /* - ** Process command arguments. At the end of the above loop, optind is the - ** index of the first NON-option argv element. - */ - switch ( argc - optind ) - { - case 2: /* Both host & service are specified on the command line. */ - { - service = argv[ optind + 1 ]; - /***** Fall through *****/ - } - case 1: /* Host is specified on the command line. */ - { - host = argv[ optind ]; - /***** Fall through *****/ - } - case 0: /* Use default host & service. */ - { - break; - } - default: - { - USAGE; - } - } /* End SWITCH on number of command arguments. */ - /* - ** Open a connection to the indicated host/service. - ** - ** Note that if all three of the following conditions are met, then the - ** scope identifier remains unresolved at this point. - ** 1) The default network interface is unknown for some reason. - ** 2) The -s option was not used on the command line. - ** 3) An IPv6 "scoped address" was not specified for the hostname on the - ** command line. - ** If the above three conditions are met, then only an IPv4 socket can be - ** opened (connect(2) fails without the scope ID properly set for IPv6 - ** sockets). - */ - if ( ( sckt = openSckt( host, - service, - scopeId ) ) == INVALID_DESC ) - { - fprintf( stderr, - "%s: Sorry... a connectionless socket could " - "not be set up.\n", - pgmName ); - exit( 1 ); - } - /* - ** Get the remote time-of-day. - */ - tod( sckt ); - /* - ** Close the connection and terminate. - */ - (void) SYSCALL( "close", - __LINE__, - close( sckt ) ); - return 0; -} /* End main() */ -/****************************************************************************** -* Function: openSckt -* -* Description: -* Sets up a UDP socket to a remote server. Getaddrinfo(3) is used to -* perform lookup functions and can return multiple address records (i.e. a -* list of 'struct addrinfo' records). This function traverses the list and -* tries to establish a connection to the remote server. The function ends -* when either a connection has been established or all records in the list -* have been processed. -* -* Parameters: -* host - A pointer to a character string representing the hostname or IP -* address (IPv4 or IPv6) of the remote server. -* service - A pointer to a character string representing the service name or -* well-known port number. -* scopeId - For IPv6 sockets only. This is the index corresponding to the -* network interface on which to exchange datagrams. This -* parameter is ignored for IPv4 sockets or when an IPv6 "scoped -* address" is specified in 'host' (i.e. where the colon-hex -* network address is augmented with the scope ID). -* -* Return Value: -* Returns the socket descriptor for the connection, or INVALID_DESC if all -* address records have been processed and a socket could not be initialized. -******************************************************************************/ -static int openSckt( const char *host, - const char *service, - unsigned int scopeId ) -{ - struct addrinfo *ai; - int aiErr; - struct addrinfo *aiHead; - struct addrinfo hints; - sockaddr_in6_t *pSadrIn6; - int sckt; - /* - ** Initialize the 'hints' structure for getaddrinfo(3). - ** - ** Notice that the 'ai_family' field is set to PF_UNSPEC, indicating to - ** return both IPv4 and IPv6 address records for the host/service. Most of - ** the time, the user isn't going to care whether an IPv4 connection or an - ** IPv6 connection is established; the user simply wants to exchange data - ** with the remote host and doesn't care how it's done. Sometimes, however, - ** the user might want to explicitly specify the type of underlying socket. - ** It is left as an exercise for the motivated reader to add a command line - ** option allowing the user to specify the IP protocol, and then process the - ** list of addresses accordingly (it's not that difficult). - */ - memset( &hints, 0, sizeof( hints ) ); - hints.ai_family = PF_UNSPEC; /* IPv4 or IPv6 records (don't care). */ - hints.ai_socktype = SOCK_DGRAM; /* Connectionless communication. */ - hints.ai_protocol = IPPROTO_UDP; /* UDP transport layer protocol only. */ - /* - ** Look up the host/service information. - */ - if ( ( aiErr = getaddrinfo( host, - service, - &hints, - &aiHead ) ) != 0 ) - { - fprintf( stderr, - "%s (line %d): ERROR - %s.\n", - pgmName, - __LINE__, - gai_strerror( aiErr ) ); - return INVALID_DESC; - } - /* - ** Go through the list and try to open a connection. Continue until either - ** a connection is established or the entire list is exhausted. - */ - for ( ai = aiHead, sckt = INVALID_DESC; - ( ai != NULL ) && ( sckt == INVALID_DESC ); - ai = ai->ai_next ) - { - /* - ** IPv6 kluge. Make sure the scope ID is set. - */ - if ( ai->ai_family == PF_INET6 ) - { - pSadrIn6 = (sockaddr_in6_t*) ai->ai_addr; - if ( pSadrIn6->sin6_scope_id == 0 ) - { - pSadrIn6->sin6_scope_id = scopeId; - } /* End IF the scope ID wasn't set. */ - } /* End IPv6 kluge. */ - /* - ** Display the address info for the remote host. - */ - if ( verbose ) - { - /* - ** Temporary character string buffers for host & service. - */ - char hostBfr[ NI_MAXHOST ]; - char servBfr[ NI_MAXSERV ]; - /* - ** Display the address information just fetched. Start with the - ** common (protocol-independent) stuff first. - */ - fprintf( stderr, - "Address info:\n" - " ai_flags = 0x%02X\n" - " ai_family = %d (PF_INET = %d, PF_INET6 = %d)\n" - " ai_socktype = %d (SOCK_STREAM = %d, SOCK_DGRAM = %d)\n" - " ai_protocol = %d (IPPROTO_TCP = %d, IPPROTO_UDP = %d)\n" - " ai_addrlen = %d (sockaddr_in = %d, " - "sockaddr_in6 = %d)\n", - ai->ai_flags, - ai->ai_family, - PF_INET, - PF_INET6, - ai->ai_socktype, - SOCK_STREAM, - SOCK_DGRAM, - ai->ai_protocol, - IPPROTO_TCP, - IPPROTO_UDP, - ai->ai_addrlen, - sizeof( struct sockaddr_in ), - sizeof( struct sockaddr_in6 ) ); - /* - ** Display the protocol-specific formatted address. - */ - getnameinfo( ai->ai_addr, - ai->ai_addrlen, - hostBfr, - sizeof( hostBfr ), - servBfr, - sizeof( servBfr ), - NI_NUMERICHOST | NI_NUMERICSERV ); - switch ( ai->ai_family ) - { - case PF_INET: /* IPv4 address record. */ - { - sockaddr_in_t *pSadrIn = (sockaddr_in_t*) ai->ai_addr; - fprintf( stderr, - " ai_addr = sin_family: %d (AF_INET = %d, " - "AF_INET6 = %d)\n" - " sin_addr: %s\n" - " sin_port: %s\n", - pSadrIn->sin_family, - AF_INET, - AF_INET6, - hostBfr, - servBfr ); - break; - } /* End CASE of IPv4 record. */ - case PF_INET6: /* IPv6 address record. */ - { - pSadrIn6 = (sockaddr_in6_t*) ai->ai_addr; - fprintf( stderr, - " ai_addr = sin6_family: %d (AF_INET = %d, " - "AF_INET6 = %d)\n" - " sin6_addr: %s\n" - " sin6_port: %s\n" - " sin6_flowinfo: %d\n" - " sin6_scope_id: %d\n", - pSadrIn6->sin6_family, - AF_INET, - AF_INET6, - hostBfr, - servBfr, - pSadrIn6->sin6_flowinfo, - pSadrIn6->sin6_scope_id ); - break; - } /* End CASE of IPv6 record. */ - default: /* Can never get here, but just for completeness. */ - { - fprintf( stderr, - "%s (line %d): ERROR - Unknown protocol family (%d).\n", - pgmName, - __LINE__, - ai->ai_family ); - break; - } /* End DEFAULT case (unknown protocol family). */ - } /* End SWITCH on protocol family. */ - } /* End IF verbose mode. */ - /* - ** Create a socket. - */ - if ( !SYSCALL( "socket", - __LINE__, - sckt = socket( ai->ai_family, - ai->ai_socktype, - ai->ai_protocol ) ) ) - { - sckt = INVALID_DESC; - continue; /* Try the next address record in the list. */ - } - /* - ** Set the target destination for the remote host on this socket. That - ** is, this socket only communicates with the specified host. - */ - if ( !SYSCALL( "connect", - __LINE__, - connect( sckt, - ai->ai_addr, - ai->ai_addrlen ) ) ) - { - (void) close( sckt ); /* Could use SYSCALL() again here, but why? */ - sckt = INVALID_DESC; - continue; /* Try the next address record in the list. */ - } - } /* End FOR each address record returned by getaddrinfo(3). */ - /* - ** Clean up & return. - */ - freeaddrinfo( aiHead ); - return sckt; -} /* End openSckt() */ -/****************************************************************************** -* Function: tod -* -* Description: -* Receive the time-of-day from the remote server and write it to stdout. -* -* Parameters: -* sckt - The socket descriptor for the connection. -* -* Return Value: None. -******************************************************************************/ -static void tod( int sckt ) -{ - char bfr[ MAXBFRSIZE+1 ]; - int inBytes; - /* - ** Send a datagram to the server to wake it up. The content isn't - ** important, but something must be sent to let it know we want the TOD. - */ - if ( !SYSCALL( "write", - __LINE__, - write( sckt, "Are you there?", 14 ) ) ) - { - return; - } - /* - ** Read the time-of-day from the remote host. - */ - if ( !SYSCALL( "read", - __LINE__, - inBytes = read( sckt, - bfr, - MAXBFRSIZE ) ) ) - { - return; - } - bfr[ inBytes ] = '\0'; /* Null-terminate the received string. */ - fputs( bfr, stdout ); /* Null string if EOF (inBytes == 0). */ - fflush( stdout ); -} /* End tod() */ -]]>
    -Other programming languages - -JAVA -Sun Java versions since 1.4 are IPv6 enabled, see e.g. Inet6Address (1.5/5.0) class. Hints are available in the Networking IPv6 User Guide for JDK/JRE 1.4 and 1.5 (5.0). -Perl -As of May 2007 it's not known that the Perl core itself already supports IPv6. It can be added by using following modules: -Socket6Anyway, some other modules exist for/with IPv6 support (e.g. Net::IP), search for “IPv6” on http://search.cpan.org/.
    -<!-- anchor id="chapter-interoperability" -->Interoperability -The TAHI Project checks the interoperability of different operating systems regarding the implementation of IPv6 features. Linux kernel already got the IPv6 Ready Logo Phase 1. -<!-- anchor id="chapter-information" -->Further information and URLs - -<!-- anchor id="information-books" -->Paper printed books, articles, online reviews (mixed) - -Printed Books (English) - -Cisco - -Cisco Self-Study: Implementing IPv6 Networks (IPV6) by Regis Desmeules. Cisco Press; ISBN 1587050862; 500 pages; 1st edition (April 11, 2003). -Note: This item will be published on April 11, 2003.Configuring IPv6 with Cisco IOS by Sam Brown, Sam Browne, Neal Chen, Robbie Harrell, Edgar, Jr. Parenti (Editor), Eric Knipp (Editor), Paul Fong (Editor)362 pages; Syngress Media Inc; ISBN 1928994849; (July 12, 2002). -General - -IPv6 in Practice: A Unixer's Guide to the Next Generation Internet von Benedikt Stockebrand, November 2006; ISBN 3-540-24524-3IPv6 Essentials by Silvia Hagen, 2nd Edition, May 2006; ISBN 0-5961-0058-2 -ToC, Index, Sample Chapter etc.; O'Reilly PressreleaseIPv6: The New Internet Protocol. By Christian Huitema; Published by Prentice-Hall; ISBN 0138505055. -Description: This book, written by Christian Huitema - a member of the InternetArchitecture Board, gives an excellent description of IPv6, how it differs from IPv4, and the hows and whys of it's development. -Source: http://www.cs.uu.nl/wais/html/na-dir/internet/tcp-ip/resource-list.htmlIPv6 Networks by Niles, Kitty; (ISBN 0070248079); 550 pages; Date Published 05/01/1998.Implementing IPV6. Supporting the Next Generation Internet Protocols by P. E. Miller, Mark A. Miller; Publisher: John Wiley & Sons; ISBN 0764545892; 2nd edition (March 15, 2000); 402 pages.Big Book of Ipv6 Addressing Rfcs by Peter H. Salus (Compiler), Morgan Kaufmann Publishers, April 2000, 450 pages ISBN 0126167702. Understanding IPV6 by Davies, Joseph; ISBN 0735612455; Date Published 05/01/2001; Number of Pages: 350.Migrating to IPv6 - IPv6 in Practice by Marc Blanchet Publisher: John Wiley & Sons; ISBN 0471498920; 1st edition (November 2002); 368 pages.Ipv6 Network Programming by Jun-ichiro Hagino; ISBN 1555583180Wireless boosting IPv6 by Carolyn Duffy Marsan, 10/23/2000.O'reilly Network search for keyword IPv6 results in 29 hits (28. January 2002) -Articles, eBooks, Online Reviews (mixed) - -Getting Connected with 6to4 by Huber Feyrer, 06/01/2001Transient Addressing for Related Processes: Improved Firewalling by Using IPv6 and Multiple Addresses per Host; written by Peter M. Gleiz, Steven M. Bellovin (PC-PDF-Version; Palm-PDF-Version; PDB-Version)Internetworking IPv6 with Cisco Routers by Silvano Gai, McGrawHill Italia, 1997. The 13 chapters and appendix A-D are downloadable as PDF-documents.Migration and Co-existence of IPv4 and IPv6 in Residential Networks by Pekka Savola, CSC/FUNET, 2002 -<!-- anchor id="information-sciencepublication" -->Science Publications (abstracts, bibliographies, online resources) -See also: liinwww.ira.uka.de/ipv6 or Google / Scholar / IPv6 -GEANT IPv6 WorkplanIPv6 Trials on UK Academic Networks: Bermuda Project Aug.2002: Participants - Getting connected - Project deliverables - Network topology - Address assignments - Wireless IPv6 access - IPv6 migration - Project presentations - Internet 2 - Other IPv6 projects - IPv6 fora and standards Bermuda 2...http://www.ipv6.ac.uk/IPv6 at the University of SouthamptonMicrosoft Research IPv6 Implementation (MSRIPv6): MSRIPv6 Configuring 6to4 - Connectivity with MSR IPv6 - Our 6Bone Node... -Others -See following URL for more: SWITCH IPv6 Pilot / References -<!-- anchor id="information-conferences" -->Conferences, Meetings, Summits -Something missing? Suggestions are welcome! -2004 - -1st Global IPv6 Summit in Sao Paul, Brazil -<!-- anchor id="information-onlineinformation" -->Online information - -<!-- anchor id="information-joinipv6." -->Join the IPv6 backbone -More to be filled later...suggestions are welcome! -<!-- anchor id="information-globalregistries" -->Global registries -See regional registries. -<!-- anchor id="information-majorregionregistries" -->Major regional registries - -America: ARIN, ARIN / registration page, ARIN / IPv6 guidelinesEMEA: Ripe NCC, Ripe NCC / registration page, Ripe NCC / IPv6 registrationAsia/Pacific: APNIC, APNIC / IPv6 ressource guideLatin America and Caribbea: LACNIC, IPv6 Registration Services, IPv6 Allocation PolicyAfrica: AfriNICAlso a list of major (prefix length 32) allocations per local registry is available here: Ripe NCC / IPv6 allocations. -<!-- anchor id="information-joinipv6-tunnelbrokers" -->Tunnel brokers -Note: A list of available Tunnel broker can be found in the section Tunnel broker below. -Former IPng. Tunnelbroker and IPv6 resources, now migrated to the SixXs System.Eckes' IPv6-with-Linux Page.tunnelc - a perl based tunnel client script: -freshmeat.net: Project details for tunnel client -SourceForge: Project Info - tunnelc (also here)Linux Advanced Routing & Traffic Control HOWTO, Chapter 6: IPv6 tunneling with Cisco and/or 6bone. -<!-- anchor id="information-joinipv6-6to4-tunneling" -->6to4 - -NSayer's 6to4 informationRFC 3068 / An Anycast Prefix for 6to4 Relay Routers -<!-- anchor id="information-joinipv6-isatap-tunneling" -->ISATAP - -ISATAP (Intra-Site Automatic Tunnel Access Protocol) Information by JOIN -Latest news and URLs to other documents - -Lot of URLs to others documents by Anil Edatharago6 - The IPv6 Portal: an IPv6 online portal with a wiki-based IPv6 knowledge center, an IPv6 discussion forum, an up-to-date collection of IPv6 Events and News, free IPv6 access and services, IPv6 software applications, and much more -Protocol references - -IPv6-related Request For Comments (RFCs) -Publishing the list of IPv6-related RFCs is beyond the scope of this document, but given URLs will lead you to such lists: -List sorted by IPng Standardization Status or IPng Current Specifications by Robert HindenIPv6 Related Specifications on IPv6.org -Current drafts of working groups -Current (also) IPv6-related drafts can be found here: -IP Version 6 (ipv6)Next Generation Transition (ngtrans)Dynamic Host Configuration (dhc)Domain Name System Extension (dnsext)IPv6 Operations (v6ops)Mobile IP (mobileip)Get any information about IPv6, from overviews, through RFCs & drafts, to implementations (including availability of stacks on various platforms & source code for IPv6 stacks) -Others - -SWITCH IPv6 Pilot / References, big list of IPv6 references maintained by Simon Leinen -More information -DeepSpace6 / more interesting links -Linux related - -DeepSpace6 / (Not only) Linux IPv6 Portal - Italy (Mirror)IPv6-HowTo for Linux by Peter Bieringer - Germany, and his Bieringer / IPv6 - software archiveLinux+IPv6 status by Peter Bieringer - Germany (going obsolete)DeepSpace6 / IPv6 Status Page - Italy (Mirror) (will superseed upper one)USAGI project - Japan, and their USAGI project - software archiveLinux Optimized Link State Routing Protocol (OLSR) IPv6 HOWTOLinShim6 -Linux related per distribution - -PLDPLD Linux Distribution (“market leader” in containing IPv6 enabled packages)Red HatRed Hat Enterprise Linux, Pekka Savola's IPv6 packages (Historic)FedoraFedora (Project) LinuxDebianDebian Linux, IPv6 with Debian LinuxSuSESuSE LinuxMandrivaMandriva (Historic)For more see the IPv6+Linux Status Distributions page. -General - -IPv6.org6boneWIDE project - JapanSWITCH IPv6 Pilot - SwitzerlandIPv6 Corner of Hubert Feyrer - GermanyIPv6 Forum - a world-wide consortium of leading Internet vendors, Research & Education Networks...Playground.sun.com / IPv6 Info Page - maintained by Robert Hinden, Nokia. Get any information about IPv6, from overviews, through RFCs & drafts, to implementations (including availability of stacks on various platforms & source code for IPv6 stacks).6INIT - IPv6 Internet Initiative - an EU Fifth Framework Project under the IST Programme.IPv6 Task Force (European Union)6init - IPv6 INternet IniTiative IPv6: The New Version of the Internet Protocol, by Steve Deering.IPv6: The Next Generation Internet Protocol, by Gary C. Kessler. IPv6: Next Generation Internet Protocol - 3Cominternet || site and internet2 Working GroupNetworkWorldFusion: Search / Doc Finder: searched for IPv6 (102 documents found 22.12.2002)The Register (Search for IPv6 will result in 30 documents, 22.12.2002)ZDNet Search for IPv6TechTarget Search for IPv6IPv6 & TCP Resources ListSomething missing? Suggestions are welcome! -<!-- anchor id="information-marketresearch" -->Market Research - -statista - The Statistics PortalMarket Research -<!-- anchor id="information-patents" -->Patents - -Delphion Research: Patent Search Page. Basic (free) registration needed. Examples found 21.12.2002 searching for IPv6: -Communicating method between IPv4 terminal and IPv6 terminal and IPv4-IPv6 converting apparatus -Translator for IP networks, network system using the translator, and IP network coupling method therefor -By countries - -Europe - -www.ist-ipv6.org: IST IPv6 Cluster, European IPv6 Research and Development ProjectsEuro6IX: European IPv6 Internet Exchanges Backbone -Austria - -IPv6@IKNnet and MIPv6 Research Group: TU Vienna, Austria (IPv6: project, publications, diploma / doctor thesis, Conference Proceedings etc.) -Australia - -Carl's Australian IPv6 Pages (old content) -Belgium -Suggestions are welcome! -Brasil - -IPv6 do Brasil -China -Suggestions are welcome! -Czech -Suggestions are welcome! -Germany - -Xing / IPv6 -France - -Renater: Renater IPv6 Project PageIPv6 - RSVP - ATM at INRIANetBSD IPv6 Documentation -Italy - -Project6: IPv6 networking with Linux -Japan - -Yamaha IPv6 (sorry, all in japanese native ...) -Korea - -ETRI: Electronics and Telecommunications Research InstitutIPv6 Forum Korea: Korean IPv6 Deployment Project -Mexico - -IPv6 Mexico (spain & english version): IPv6 Project Hompeage of The National Autonomous University of Mexico (UNAM) -Netherland - -SURFnet: SURFnet IPv6 BackboneSTACK, STACK (IPv6): Students' computer association of the Eindhoven University of Technology, NetherlandIPng.nl: collaboration between WiseGuys and Intouch -Portugal -Suggestions are welcome! -Russia - -IPv6 Forum for Russia: Yaroslavl State University Internet Center -Switzerland -Suggestions are welcome! -United Kingdom - -British Telecom IPv6 Home: BT's ISP IPv6 Trial, UK's first IPv6 Internet Exchange etc. -By operating systems - -*BSD - -KAME project (*BSD)NetBSD's IPv6 Networking FAQFreeBSD Ports: Ipv6 -Cisco IOS - -Cisco IOS IPv6 Entry PageIPv6 for Cisco IOS Software, File 2 of 3: Aug 2002 -- Table of Contents: IPv6 for Cisco IOS Software; Configuring Documentation Specifics; Enabling IPv6 Routing and Configuring; IPv6 Addressing; Enabling IPv6 Processing Globally.Cisco Internet Networking Handbook, Chapter IPv6 -HPUX - -comp.sys.hp.hpux FAQ -IBM - -Now that IBM's announced the availability of z/OS V1.4, what's new in this release? This question was posed on 15 August 2002 -Microsoft - -Microsoft Windows 2000 IPv6 MSRIPv6 - Microsoft Research Network - IPv6 Homepage Internet Connection Firewall Does Not Block Internet Protocol Version 6 Traffic (6.11.2001)Internet Protocol Numbers (8.10.2002)IPv6 Technology Preview Refresh (16.10.2002)HOW TO: Install and Configure IP Version 6 in Windows .NET Enterprise Server (26.10.2002)Windows .NET Server 6to4 Router Service Quits When You Advertise a 2002 Address on the Public Interface (28.10.2002)msdn - Microsoft Windows CE .NET - IPv6 commands -Solaris - -Sun Microsystems SolarisSolaris 2 Frequently Asked Questions (FAQ) 1.73 -Sumitoma - -Sumitomo Electric has implemented IPv6 on Suminet 3700 family routers -ZebOS - -IpInfusion's ZebOS Server Routing Software -<!-- anchor id="information-ipv6andsecurity" -->IPv6 Security - -Internet Security Systems: Security Center, X-Force Database Search (21.12.2002 - 6 topics found relating to IPv6)NIST IPsec Project ( National Institute of Standards and Technology, NIST)Information SecurityNewOrder.box.sk (search for IPv6) (Articles, exploits, files database etc.) -Application lists - -DeepSpace6 / IPv6 Status Page (Mirror)IPv6.org / IPv6 enabled applicationsFreshmeat / IPv6 search, currently (14 Dec 2002) 62 projectsIPv6 Forum / Web Links -Analyzer tools - -Wireshark (former known as Ethereal) is a free network protocol analyzer for Unix and WindowsRadcom RC100-WL - Download Radcom RC100-WL protocol analyzer version 3.20 -IPv6 Products - -6wind - solutions for IPv4/IPv6 Router, QoS, Multicast, Mobility, Security/VPN/Firewall. Fefe's patches for IPv6 with djbdnsAug 2002 -- What is djbdns and why does it need IPv6? djbdns is a full blown DNS server which outperforms BIND in nearly all respects.ZebOS Server Routing Suite Inframail (Advantage Server Edition)HTTrack Website CopierCommViewPosadis -<!-- anchor id="information-snmp" -->SNMP - -comp.protocpols.snmp SNMP FAQ Part 1 of 2 -IPv6 Infrastructure - -Statistics - -IPv6 routing table history created by Gert Döring, Space.NetOfficial 6bone Webserver list Statisic -Internet Exchanges -Another list of IPv6 Internet Exchanges can be found here: IPv6 status of IXPs in Europe -<!-- anchor id="information-ipv6exchanges-estonia" -->Estonia - -TIX (tallinn interneti exchange with ipv6 support) -<!-- anchor id="information-ipv6exchanges-europe" -->Europe - -Euro6IX, European IPv6 Internet Exchange Backbone -<!-- anchor id="information-ipv6exchanges-france" -->France - -French National Internet Exchange IPv6 (since 1.11.2002 active). -FNIX6 provides a free and reliable high speed FastEthernet interconnection between ISP located in TeleCity Paris. -<!-- anchor id="information-ipv6exchanges-germany" -->Germany - -INXS: (Cable & Wireless) Munich and Hamburg -<!-- anchor id="information-ipv6exchanges-japan" -->Japan - -NSPIXP-6: IPv6-based Internet Exchange in TokyoJPIX, Tokyo -<!-- anchor id="information-ipv6exchanges-korea" -->Korea - -6NGIX -<!-- anchor id="information-ipv6exchanges-netherlands" -->Netherlands - -AMS-IX: Amsterdam Internet Exchange -<!-- anchor id="information-ipv6exchanges-uk" -->UK - -UK6X: LondonXchangePoint: London -<!-- anchor id="information-ipv6exchanges-usa" -->USA - -6TAP: Chicago. Supports peerings around the globe.PAIX: Palo Alto -<!-- anchor id="information-Tunnelbroker" -->Tunnel broker -See also: http://www.deepspace6.net/docs/tunnelbrokers.html -<!-- anchor id="information-tunnelbroker-belgium" -->Belgium -Something missing? Suggestions are welcome! -<!-- anchor id="information-tunnelbroker-canada" -->Canada - -Freenet6 - /48 Delegation, Canada -Getting IPv6 Using Freenet6 on Debian -Freenet6 creater -<!-- anchor id="information-tunnelbroker-china" -->China -Something missing? Suggestions are welcome! -<!-- anchor id="information-tunnelbroker-estonia" -->Estonia - -Estpak -<!-- anchor id="information-tunnelbroker-germany" -->Germany - -6bone Knoten Leipzig -Info bez. Hackangriff (2001) -<!-- anchor id="information-tunnelbroker-italy" -->Italy - -Comv6Bersafe (Italian language) -<!-- anchor id="information-tunnelbroker-japan" -->Japan -Something missing? Suggestions are welcome! -<!-- anchor id="information-tunnelbroker-malaysia" -->Malaysia -Something missing? Suggestions are welcome! -<!-- anchor id="information-tunnelbroker-netherlands" -->Netherlands - -IPng Netherland - Intouch, SurfNet, AMS-IX, UUNet, Cistron, RIPE NCC and AT&T are connected at the AMS-IX. It is possible (there are requirements...) to get an static tunnel.SURFnet Customers -<!-- anchor id="information-tunnelbroker-norway" -->Norway - -UNINETT - Pilot IPv6 Service (for Customers): tunnelbroker & address allocation -Uninett-Autoupdate-HOWTO -<!-- anchor id="information-tunnelbroker-spain" -->Spain - -Consulintel -<!-- anchor id="information-tunnelbroker-switzerland" -->Switzerland -Something missing? Suggestions are welcome! -<!-- anchor id="information-tunnelbroker-uk" -->UK - -NTT, United Kingdom - IPv6 Trial. IPv4 Tunnel and native IPv6 leased Line connections. POPs are located in London, UK Dusseldorf, Germany New Jersey, USA (East Coast) Cupertino, USA (West Coast) Tokyo, Japan -<!-- anchor id="information-tunnelbroker-usa" -->USA - -ESnet, USA - Energy Sciences Network: Tunnel Registry & Address Delegation for directly connected ESnet sites and ESnet collaborators.Hurricane Electric, US backbone; -Hurrican Electric Tunnelbroker (also available under http://tunnelbroker.com/) -Press Release: Hurricane Electric Upgrades IPv6 Tunnel Broker -Tunnel Broker Endpoint Autoupdate, Perl Script -<!-- anchor id="information-tunnelbroker-singapore" -->Singapore -Something missing? Suggestions are welcome! -<!-- anchor id="information-tunnelbroker-more" -->More Tunnel brokers... - -Public 6to4 relay routers (MS IIE boycott!) -<!-- anchor id="information-infrastructure-nativeipv6service" -->Native IPv6 Services -Note: These services are mostly only available with a valid IPv6 connection! -<!-- anchor id="information-nativeipv6nntp" -->Net News (NNTP) -Something missing? Suggestions are welcome! -<!-- anchor id="information-nativeipv6gameserver" -->Game Server - -Quake2 over IPv6 -<!-- anchor id="information-nativeipv6ircserver" -->IRC Server -Something missing? Suggestions are welcome! -Radio Stations, Music Streams -Something missing? Suggestions are welcome! -<!-- anchor id="information-nativeipv6webserver" -->Webserver - -Peter Bieringer's Home of Linux IPv6 HOWTO Something missing? Suggestions are welcome! -<!-- anchor id="information-maillists" -->Maillists -Lists of maillists are available at: -DeepSpace6 / Mailling ListsMajor Mailinglists are listed in following table: - - - - - - - - - -Focus -Request e-mail address -What to subscribe -Maillist e-mail address -Language -Access through WWW - - -Linux kernel networking including IPv6 -majordomo (at) vger.kernel.org -netdev -netdev (at) vger.kernel.org -English -Info, Archive - - -Mobile IP(v6) for Linux -Web-based, see URL -mipl -mipl (at) mobile-ipv6.org -English -Info, Archive - - -Linux IPv6 users using USAGI extension -usagi-users-ctl (at) linux-ipv6.org - -usagi-users (at) linux-ipv6.org -English -Info / Search, Archive - - -IPv6 on Debian Linux - - -debian-ipv6 (at) lists.debian.org -English -Info/Subscription/Archive - - -6bone -majordomo (at) isi.edu -6bone -6bone (at) isi.edu -English -Info, Archive - - -IPv6 users in general -majordomo (at) ipv6.org -users -users (at) ipv6.org -English -Info, Archive - - -Bugtracking of Internet applications (1) -bugtraq-subscribe (at) securityfocus.com - -bugtraq (at) securityfocus.com (2) -English -Info, Archive - - - -(1) very recommended if you provide server applications. -(2) list is moderated. - -Something missing? Suggestions are welcome! - -Following other maillinglists & newsgroups are available via web: -student-ipv6 (India) -Description: This is the group for the Student Awareness group of IPv6 in Indiasun-ipv6-users -Description: Please report problems/suggestions regarding SUN Microsystems IPng implementationIPv6-BITS -Description: This List will co-ordinate the working of Project Vertebrae.linux-bangalore-ipv6 -Description: The IPv6 deployment list of the Bangalore Linux User Grouppacket-switching -Description: This mailing list provides a forum for discussion of packet switching theory, technology, implementation and application in any relevant aspect including without limitation LAPB, X.25, SDLC, P802.1d, LLC, IP, IPv6, IPX, DECNET, APPLETALK, FR, PPP, IP Telephony, LAN PBX systems, management protocols like SNMP, e-mail, network transparent window systems, protocol implementation, protocol verification, conformance testing and tools used in maintaining or developing packet switching systems.de.comm.protocols.tcp-ip -Description: Umstellung auf IPv6 -Source: Chartas der Newsgruppen in de.*Google Group: comp.protocols.tcp-ipGoogle Group: linux.debian.maint.ipv6Google Group: microsoft.public.platformsdk.networking.ipv6Google Group: fa.openbsd.ipv6 -<!-- anchor id="information-onlinetesttools" -->Online tools - -Testing tools - -ping, traceroute, tracepath, 6bone registry, DNS: JOIN / Testtools (German language only, but should be no problem for non German speakers)traceroute6, whois: IPng.nlAAAA Lookup Checker http://www.cnri.dit.ie/cgi-bin/check_aaaa.pl -Information retrievement - -List of worldwide all IPv6-aggregated IP-Blocks -IPv6 Looking Glasses - -DRENv6 Looking Glass -Helper applications - -IPv6 Prefix Calculator by TDOIDNS record checker -<!-- anchor id="information-trainingsandseminars" -->Trainings, Seminars - -CIW Internetworking Professional Training CBT CDTraining Pages, U.K. - Search for IPv6 (13 Courses, 2006-08-21)Erion IPv6 Training, UKSomething missing? Suggestions are welcome! -<!-- anchor id="information-onlinediscovery" -->'The Online Discovery' ... -IPv6: Addressing The Needs Of the Future by Yankee Group (Author) -List Price: $595.00 -Edition: e-book (Acrobat Reader) -Pages: 3 (three) -Publisher: MarketResearch.com; ISBN B00006334Y; (November 1, 2001) - -;-) The number of copies would be interesting... - -Revision history / Credits / The End - -<!-- anchor id="revision-history" -->Revision history -Versions x.y are published on the Internet. -Versions x.y.z are work-in-progress and published as LyX and SGML file on CVS. Because Deep Space 6 mirrors these SGML files and generate independend from TLDP public versions, this versions will show up there and also on its mirrors. -Releases 0.x - -0.67wip2015-08-18/PB: fix some broken URLs, 20151016/bie: remove broken URL to Spanish transation, 20161215/bie: update some URLs0.662010-04-20/PB: extend QoS section with examples, 20130513/PB: add IPv6 NAT hints, 20130521/PB: review dhcpd, 20131019/bie: general review, 20140502/bie: add hints for nftables, 20140513/bie: extend section regarding address resolution and add source/destination address selection information, 20140515/bie: add hints for activation of privacy extension0.652009-12-13/PB: minor fixes0.642009-06-11/PB: extend DHCP server examples (ISC DHCP, Dibbler)0.632009-02-14/PB: Fix FSF address, major update on 4in6 tunnels, add new section for address resolving, add some URLs, remove broken URLs0.622008-11-09/PB: Adjust URL to Turkish howto, add some HIP related URLs, remove broken URLs0.61.12007-11-11/PB: fix broken description of shortcut BIND0.612007-10-06/PB: fix broken URLs to TLDP-CVS, minor URL update.0.60.22007-10-03/PB: fix description of sysctl/autoconf (credits to Francois-Xavier Le Bail)0.60.12007-06-16/PB: speling fixes (credits to Larry W. Burton)0.602007-05-29/PB: import major contribution to Programming using C-API written by John Wenker, minor fixes0.522007-05-23/PB: update firewalling chapter, improve document for proper SGML validation, minor bugfixes0.512006-11-08/PB: remove broken URLs, add a new book (credits to Bryan Vukich)0.50.22006-10-25/PB: fix typo in dhcp6 section (credits to Michele Ferritto)0.50.12006-09-23/PB: add some URLs0.502006-08-24/PB: check RFC URLs, fix URL to Chinese translation, finalize for publishing0.49.52006-08-23/PB: fix/remove broken URLs0.49.42006-08-21/PB: some review, update and enhancement of the content, replace old 6bone example addresses with the current defined ones.0.49.32006-08-20/PB: fix bug in maillist entries, 'mobility' is now a separate chapter0.49.22006-08-20/PB: update and cleanup of maillist entries0.49.12006-06-13/PB: major update of mobility section (contributed by Benjamin Thery)0.492005-10-03/PB: add configuration hints for DHCPv6, major broken URL cleanup (credits to Necdet Yucel)0.48.12005-01-15/PB: minor fixes0.482005-01-11/PB: grammar check and minor review of IPv6 IPsec section0.47.12005-01-01/PB: add information and examples about IPv6 IPsec, add some URLs0.472004-08-30/PB: add some notes about proftpd, vsftpd and other daemons, add some URLs, minor fixes, update status of Spanish translation0.46.42004-07-19/PB: minor fixes0.46.32004-06-23/PB: add note about started Greek translation, replace Taiwanese with Chinese for related translation0.46.22004-05-22/PB: minor fixes0.46.12004-04-18/PB: minor fixes0.462004-03-04/PB: announce Italian translation, add information about DHCPv6, minor updates0.45.12004-01-12/PB: add note about the official example address space0.452004-01-11/PB: minor fixes, add/fix some URLs, some extensions0.44.22003-10-30/PB: fix some copy&paste text bugs0.44.12003-10-19/PB: add note about start of Italian translation0.442003-08-15/PB: fix URLs, add hint on tcp_wrappers (about broken notation in some versions) and Apache20.43.42003-07-26/PB: fix URL, add archive URL for maillist users at ipv6.org, add some ds6 URLs0.43.32003-06-19/PB: fix typos0.43.22003-06-11/PB: fix URL0.43.12003-06-07/PB: fix some URLs, fix credits, add some notes at IPsec0.432003-06-05/PB: add some notes about configuration in SuSE Linux, add URL of French translation0.422003-05-09/PB: minor fixes, announce French translation0.41.42003-05-02/PB: Remove a broken URL, update some others.0.41.32003-04-23/PB: Minor fixes, remove a broken URL, fix URL to Taiwanese translation0.41.22003-04-13/PB: Fix some typos, add a note about a French translation is in progress0.41.12003-03-31/PB: Remove a broken URL, fix another0.412003-03-22/PB: Add URL of German translation0.40.22003-02-27/PB: Fix a misaddressed URL0.40.12003-02-12/PB: Add Debian-Linux-Configuration, add a minor note on translations0.402003-02-10/PB: Announcing available German version0.39.22003-02-10/GK: Minor syntax and spelling fixes0.39.12003-01-09/PB: fix an URL (draft adopted to an RFC)0.392003-01-13/PB: fix a bug (forgotten 'link” on “ip link set” (credits to Yaniv Kaul)0.38.12003-01-09/PB: a minor fix0.382003-01-06/PB: minor fixes0.37.12003-01-05/PB: minor updates0.372002-12-31/GK: 270 new links added (searched in 1232 SearchEngines) in existing and 53 new (sub)sections0.36.12002-12-20/PB: Minor fixes0.362002-12-16/PB: Check of and fix broken links (credits to Georg Käfer), some spelling fixes0.352002-12-11/PB: Some fixes and extensions0.34.12002-11-25/PB: Some fixes (e.g. broken linuxdoc URLs)0.342002-11-19/PB: Add information about German translation (work in progress), some fixes, create a small shortcut explanation list, extend “used terms” and add two German books0.332002-11-18/PB: Fix broken RFC-URLs, add parameter ttl on 6to4 tunnel setup example0.322002-11-03/PB: Add information about Taiwanese translation0.31.12002-10-06/PB: Add another maillist0.312002-09-29/PB: Extend information in proc-filesystem entries0.302002-09-27/PB: Add some maillists0.292002-09-18/PB: Update statement about nmap (triggered by Fyodor)0.28.12002-09-16/PB: Add note about ping6 to multicast addresses, add some labels0.282002-08-17/PB: Fix broken LDP/CVS links, add info about Polish translation, add URL of the IPv6 Address Oracle0.272002-08-10/PB: Some minor updates0.26.22002-07-15/PB: Add information neighbor discovery, split of firewalling (got some updates) and security into extra chapters0.26.12002-07-13/PB: Update nmap/IPv6 information0.262002-07-13/PB: Fill /proc-filesystem chapter, update DNS information about depricated A6/DNAME, change P-t-P tunnel setup to use of “ip” only0.25.22002-07-11/PB: Minor spelling fixes0.25.12002-06-23/PB: Minor spelling and other fixes0.252002-05-16/PB: Cosmetic fix for 2^128, thanks to José Abílio Oliveira Matos for help with LyX0.242002-05-02/PB: Add entries in URL list, minor spelling fixes0.232002-03-27/PB: Add entries in URL list and at maillists, add a label and minor information about IPv6 on RHL0.222002-03-04/PB: Add info about 6to4 support in kernel series 2.2.x and add an entry in URL list and at maillists0.212002-02-26/PB: Migrate next grammar checks submitted by John Ronan 0.20.42002-02-21/PB: Migrate more grammar checks submitted by John Ronan, add some additional hints at DNS section 0.20.32002-02-12/PB: Migrate a minor grammar check patch submitted by John Ronan0.20.22002-02-05/PB: Add mipl to maillist table0.20.12002-01-31/PB: Add a hint how to generate 6to4 addresses0.202002-01-30/PB: Add a hint about default route problem, some minor updates0.19.22002-01-29/PB: Add many new URLs0.19.12002-01-27/PB: Add some forgotten URLs0.192002-01-25/PB: Add two German books, fix quote entinities in exported SGML code0.18.22002-01-23/PB: Add a FAQ on the program chapter0.18.12002-01-23/PB: Move “the end” to the end, add USAGI to maillists0.182002-01-22/PB: Fix bugs in explanation of multicast address types0.17.22002-01-22/PB: Cosmetic fix double existing text in history (at 0.16), move all credits to the end of the document0.17.12002-01-20/PB: Add a reference, fix URL text in online-test-tools0.172002-01-19/PB: Add some forgotten information and URLs about global IPv6 addresses0.162002-01-19/PB: Minor fixes, remove “bold” and “emphasize” formats on code lines, fix “too long unwrapped code lines” using selfmade utility, extend list of URLs.0.152002-01-15/PB: Fix bug in addresstype/anycast, move content related credits to end of document0.142002-01-14/PB: Minor review at all, new chapter “debugging”, review “addresses”, spell checking, grammar checking (from beginning to 3.4.1) by Martin Krafft, add tcpdump examples, copy firewalling/netfilter6 from IPv6+Linux-HowTo, minor enhancements0.132002-01-05/PB: Add example BIND9/host, move revision history to end of document, minor extensions0.122002-01-03/PB: Merge review of David Ranch0.112002-01-02/PB: Spell checking and merge review of Pekka Savola0.102002-01-02/PB: First public release of chapter 1 -<!-- anchor id="credits" -->Credits -The quickest way to be added to this nice list is to send bug fixes, corrections, and/or updates to me ;-). -If you want to do a major review, you can use the native LyX file (see original source) and send diffs against it, because diffs against SGML don't help too much. -<!-- anchor id="major-credits" -->Major credits - -David Ranch <dranch at trinnet dot net>: For encouraging me to write this HOWTO, his editorial comments on the first few revisions, and his contributions to various IPv6 testing results on my IPv6 web site. Also for his major reviews and suggestions.Pekka Savola <pekkas at netcore dot fi>: For major reviews, input and suggestions.Martin F. Krafft <madduck at madduck dot net>: For grammar checks and general reviewing of the document.John Ronan <j0n at tssg dot wit dot ie>: For grammar checks.Georg Käfer <gkaefer at gmx dot at>: For detection of no proper PDF creation (fixed now by LDP maintainer Greg Ferguson), input for German books, big list of URLs, checking all URLs, many more suggestions, corrections and contributions, and the German translationMichel Boucey <mboucey at free dot fr>: Finding typos and some broken URLs, contribute some suggestions and URLs, and the French translationMichele Ferritto <m dot ferritto at virgilio dot it>: Finding bugs and the Italian translationDaniel Roesen <dr at cluenet dot de>: For grammar checksBenjamin Thery <benjamin dot thery at bull dot net>: For contribution of updated mobility sectionJohn Wenker <jjw at pt dot com>: major contribution to Programming using C-APISrivats P. <Srivats dot P at conexant dot com>: major contribution for 4in6 tunnels -Other credits - -Document technique related -Writing a LDP HOWTO as a newbie (in LyX and exporting this to DocBook to conform to SGML) isn't as easy as some people say. There are some strange pitfalls... Nevertheless, thanks to: -Authors of the LDP Author GuideB. Guillon: For his DocBook with LyX HOWTO -<!-- anchor id="content-related-credits" -->Content related credits -Credits for fixes and hints are listed here, will grow sure in the future -S .P. Meenakshi <meena at cs dot iitm dot ernet dot in>: For a hint using a “send mail” shell program on tcp_wrapper/hosts.denyFrank Dinies <FrankDinies at web dot de>: For a bugfix on IPv6 address explanationJohn Freed <jfreed at linux-mag dot com>: For finding a bug in IPv6 multicast address explanationCraig Rodrigues <crodrigu at bbn dot com>: For suggestion about RHL IPv6 setupFyodor <fyodor at insecure dot org>: Note me about outdated nmap informationMauro Tortonesi <mauro at deepspace6 dot net>: For some suggestionsTom Goodale <goodale at aei-potsdam dot mpg dot de>: For some suggestionsMartin Luemkemann <mluemkem at techfak dot uni-bielefeld dot de>: For a suggestionJean-Marc V. Liotier <jim at jipo dot com>: Finding a bugYaniv Kaul <ykaul at checkpoint dot com>: Finding a bugArnout Engelen <arnouten at bzzt dot net>: For sending note about a draft was adopted to RFC nowStephane Bortzmeyer <bortzmeyer at nic dot fr>: Contributing persistent configuration on Debianlithis von saturnsys <lithis at saturnsys dot com>: Reporting a misaddressed URLGuy Hulbert <gwhulbert at rogers dot com>: Send a note that RFC1924 is probably an April fool's jokeTero Pelander <tpeland at tkukoulu dot fi>: Reporting a broken URLWalter Jontofsohn <wjontof at gmx dot de>: Hints for SuSE Linux 8.0/8.1Benjamin Hofstetter <benjamin dot hofstetter at netlabs dot org>: Reporting a mispointing URLJ.P. Larocque <piranha at ely dot ath dot cx>: Reporting archive URL for maillist users at ipv6 dot orgJorrit Kronjee <jorrit at wafel dot org>: Reporting broken URLsColm MacCarthaigh <colm dot maccarthaigh at heanet dot ie>: Hint for sendfile issue on Apache2Tiago Camilo <tandre at ipg dot pt>: Contribute some URLs about Mobile IPv6Harald Geiger: Reporting a bug in how described the bit counting of the universal/global bitBjoern Jacke <bjoern at j3e dot de>: Triggered me to fix some outdated information on xinetdChristoph Egger <cegger at chrrr dot com>: Sending note about “ip” has problems with IPv4-compatible addresses on SuSE Linux 9.0 and trigger to add a hint on 6to4-radvd exampleDavid Lee Haw Ling <hawling at singnet dot com dot sg>: Sending information about a tunnel brokerMichael H. Warfield <mhw at iss dot net>: Sending note about suffix for 6to4 routersTomasz Mrugalski <thomson at klub dot com dot pl>: Sending updates for DHCPv6 sectionJan Minar <jjminar at fastmail dot fm>: Reporting minor bugsKalin KOZHUHAROV <kalin at tar dot bz>: Fixing a not so well explanationRoel van Dijk <rdvdijk at planet dot nl>: Reporting broken URLsCatalin Muresan <catalin dot muresan at astral dot ro>: Reporting minor bugsDennis van Dok <dvandok at quicknet dot nl>: Reporting minor bugsNecdet Yucel <nyucel at comu dot edu dot tr>: Reporting broken URLsBryan Vukich: Reporting a broken URLDaniele Masini: reporting a broken iptables exampleYao Zhao: reporting a bug in IPv6 route remove descriptionAaron Kunde: reporting a broken URL and a content related bugLarry W. Burton: speling fixesJustin Pryzby: reporting broken shortcut description of BIND -The End -Thanks for reading. Hope it helps! -If you have any questions, subscribe to proper maillist and describe your problem providing as much as information as possible.
    \ No newline at end of file diff --git a/LDP/users/Peter-Bieringer/check_urls.pl b/LDP/users/Peter-Bieringer/check_urls.pl deleted file mode 100755 index 139ea107..00000000 --- a/LDP/users/Peter-Bieringer/check_urls.pl +++ /dev/null @@ -1,397 +0,0 @@ -#!/usr/bin/perl -W - -# (P) & (C) 2006 by Peter Bieringer - -# This program extracts URLs from a Lyx file and checks them - -# 20060822/PB: major improvement, add support for persistent XML database -# 20081109/PB: enhancement to detect URLs in newer lyx file format -# 20090214/PB: detect IPv6 addresses in brackets and remove brackets, otherwise it won't work -# 20131112/PB: support newer Perl - -use strict; -use Net::HTTP; -use Net::FTP; -use Net::NNTP; -use Crypt::SSLeay; -use LWP::UserAgent; -use XML::Dumper; -use Socket qw(NI_NUMERICSERV NI_NUMERICHOST getaddrinfo inet_pton); - -my $debug = 0xffff & ~(0x20); - -my %urls; -my $p_urls = \%urls; - -my %hosts; - -my $time = time; - -my $dbfile; - -my $dbfile_suffix = ".url-database.xml"; - - -sub quote($) { - $_[0] =~ s/\`/#60/g; - $_[0] =~ s/[\200-\377]/\?/g; - - return $_[0]; -}; - -sub extract_urls($) { - - my ($url, $desc); - - print STDERR "DEBUG/extract_urls: open file: $_[0]\n"; - - open FILE, "<" . $_[0] || die "ERROR : can't open file: " . $_[0]; - - my $linecounter = 0; - while () { - $linecounter++; - - chomp $_; - - if ($_ =~ /LatexCommand \\url\[([^]]*)\]{([^}]*)}/) { - - $desc = $1; - $url = $2; - - print STDERR "DEBUG/extract_urls: desc='$desc' URL=$url\n" if ($debug & 0x10); - - if (defined $$p_urls{$url}->{'line'}) { - print STDERR "DEBUG/extract_urls: URL already found earlier - skip\n" if ($debug & 0x10); - - if ($$p_urls{$url}->{'time'} == $time) { - - } else { - # from database, update now - $$p_urls{$url}->{'time'} = $time; - $$p_urls{$url}->{'line'} = $linecounter; - $$p_urls{$url}->{'desc'} = quote($desc); - }; - next; - } else { - $$p_urls{$url}->{'desc'} = quote($desc); - $$p_urls{$url}->{'time'} = $time; - $$p_urls{$url}->{'line'} = $linecounter; - }; - - $url = ""; - $desc = ""; - - } elsif ($_ =~ /name \"([^"]*)\"/) { - # name "IPv6 & Linux - HowTo" - $desc = $1; - - } elsif ($_ =~ /target \"([^"]*)\"/) { - # target "http://www.bieringer.de/linux/IPv6/" - $url = $1; - - print STDERR "DEBUG/extract_urls: desc='$desc' URL=$url\n" if ($debug & 0x10); - - if (defined $$p_urls{$url}->{'line'}) { - print STDERR "DEBUG/extract_urls: URL already found earlier - skip\n" if ($debug & 0x10); - - if ($$p_urls{$url}->{'time'} == $time) { - - } else { - # from database, update now - $$p_urls{$url}->{'time'} = $time; - $$p_urls{$url}->{'line'} = $linecounter; - $$p_urls{$url}->{'desc'} = quote($desc); - }; - next; - } else { - $$p_urls{$url}->{'desc'} = quote($desc); - $$p_urls{$url}->{'time'} = $time; - $$p_urls{$url}->{'line'} = $linecounter; - }; - }; - }; - - close(FILE); -}; - -sub load_urls() { - if (! -f $dbfile) { - print STDERR "DEBUG/load_urls: database file doesn't exist, skip load: $dbfile\n" if ($debug & 0x10); - return 2; - }; - - my $dump = new XML::Dumper; - print STDERR "DEBUG/load_urls: load database file: $dbfile\n" if ($debug & 0x10); - $p_urls = $dump->xml2pl($dbfile); -}; - -sub store_urls() { - my $dump = new XML::Dumper; - $dump->pl2xml($p_urls, $dbfile); -}; - -sub cleanup_old_urls() { - for my $url (keys %$p_urls) { - if ($$p_urls{$url}->{'time'} < $time) { - print STDERR "DEBUG/cleanup_old_urls: remove old URL from database: $url\n" if ($debug & 0x10); - my $p_h = $$p_urls{$url}; - delete $$p_urls{$url}; - }; - }; -}; - -sub check_ipv6only($$) { - print STDERR "DEBUG/check_ipv6only: begin\n" if ($debug & 0x10); - print STDERR "DEBUG/check_ipv6only: check: " . $_[0] . " on port " . $_[1] . "\n" if ($debug & 0x10); - - my ($family, $socktype, $proto, $saddr, $canonname, @res, $err); - my ($host, $port); - - $family = -1; - - if ($_[0] =~ /^\[([0-9a-fA-F:]+)\]$/) { - # Strip [...] - $host = $1; - $port = $_[1]; - - print STDERR "DEBUG/check_ipv6only: host: " . $host . "\n" if ($debug & 0x10); - - socket(Socket_Handle, PF_INET6, SOCK_STREAM, 0) || return 1; - $saddr = pack_sockaddr_in6($port, inet_pton(AF_INET6, $host)); - connect(Socket_Handle, $saddr) && return 0; - close(Socket_Handle); - } else { - my %hints = ( socktype => SOCK_STREAM, family => AF_INET6); - ($err, @res) = getaddrinfo($_[0], "echo", \%hints); - - if (defined $err) { - print STDERR "ERROR/check_ipv6only: getaddrinfo fails: $err\n" if ($debug & 0x10); - return 1; - }; - if (scalar(@res) < 5) { - print STDERR "ERROR/check_ipv6only: getaddrinfo fails\n" if ($debug & 0x10); - return 1; - }; - - $family = -1; - - while (scalar(@res) >= 5) { - ($family, $socktype, $proto, $saddr, $canonname, @res) = @res; - - ($host, $port) = getnameinfo($saddr, NI_NUMERICHOST | NI_NUMERICSERV); - - print STDERR "Trying to connect to $host port $port...\n"; - - socket(Socket_Handle, $family, $socktype, $proto) || next; - connect(Socket_Handle, $saddr) && last; - - close(Socket_Handle); - $family = -1; - }; - - if ($family != -1) { - print STDERR "connected to $host port $port\n"; - close(Socket_Handle); - return 0; - } else { - warn "connect attempt failed\n"; - return 1; - }; - }; -}; - -sub check_urls() { - print STDERR "DEBUG/check_urls: begin\n" if ($debug & 0x10); - - for my $url (sort keys %$p_urls) { - if (defined $$p_urls{$url}->{'checktime'}) { - if ($$p_urls{$url}->{'checktime'} > $time - 60*60*24*7) { - if (defined $$p_urls{$url}->{'checkresult'} && $$p_urls{$url}->{'checkresult'} =~ /^ok/) { - # Checked during last 7 days - skip - print STDERR "DEBUG/check_urls: checked during last 7 days - skip: $url\n" if ($debug & 0x10); - next; - }; - }; - }; - - print STDERR "DEBUG/check_urls: check now: $url\n" if ($debug & 0x10); - - my ($host, $port); - - my $desc = $$p_urls{$url}->{'desc'}; - - my $status = "undef"; - # Extract host - my ($proto, $hostport, $uri) = $url =~ /^([^:]+):\/\/([^\/]+)(.*)$/; - - if ($hostport =~ /^([^:]):([0-9]+)$/) { - $host = $1; - $port = $2; - } else { - $host = $hostport; - if ($proto eq "http") { - $port = 80; - } elsif ($proto eq "ftp") { - $port = 21; - } elsif ($proto eq "nntp") { - $port = 119; - } elsif ($proto eq "https") { - $port = 443; - }; - }; - - # Strip trailing # - $uri =~ s/#.*//; - - if (length($uri) == 0) { - $status = "URI is empty"; - goto ("LABEL_PRINT"); - }; - - my $s; - - if ($proto eq "ftp") { - # Check FTP - print STDERR "DEBUG/check_urls: open FTP connection: $host:$port\n" if ($debug & 0x20); - $s = Net::FTP->new(Host => $host, Port => $port, Timeout => 30, Passive => 1); - - if (! defined $s) { - $status = "Host not found"; - if (! check_ipv6only($host,$port)) { - $status = "ok (IPv6 only)"; - }; - goto ("LABEL_PRINT"); - }; - - if (!$s->login("anonymous",'-anonymous@')) { - $status = "FTP anonymous login failed"; - goto ("LABEL_PRINT"); - }; - - if (!$s->cwd($uri)) { - $status = "FTP can't change to directory $uri"; - goto ("LABEL_PRINT"); - }; - - $status = "ok"; - $s->quit; - - } elsif ($proto eq "nntp") { - my $s = Net::NNTP->new(Host => $host, Timeout => 30); - - if (! defined $s) { - $status = "Host not found"; - if (! check_ipv6only($host,$port)) { - $status = "ok (IPv6 only)"; - }; - goto ("LABEL_PRINT"); - }; - $status = "ok"; - - $s->quit; - - } elsif ($proto eq "https") { - my $ua = new LWP::UserAgent; - my $req = new HTTP::Request('HEAD', $url); - my $res = $ua->request($req); - - my $code = $res->code; - - if ($code !~ /^[23]/) { - $status = "HTTPS reports: $code"; - } else { - $status = "ok"; - }; - } elsif ($proto eq "http") { - # Check HTTP - print STDERR "DEBUG/check_urls: open HTTP connection: $host:$port\n" if ($debug & 0x20); - $s = Net::HTTP->new(Host => $host, PeerPort => $port, Timeout => 30); - if (! defined $s) { - $status = "Host not found"; - if (! check_ipv6only($host,$port)) { - $status = "ok (IPv6 only)"; - }; - goto ("LABEL_PRINT"); - }; - - print STDERR "DEBUG/check_urls: send HEAD request: $uri\n" if ($debug & 0x20); - if ($s->write_request(HEAD => $uri, 'User-Agent' => "Mozilla/5.0") == 0) { - $status = "trouble with uri"; - goto ("LABEL_PRINT"); - }; - - print STDERR "DEBUG/check_urls: wait for response\n" if ($debug & 0x20); - my($code, $mess, %h) = $s->read_response_headers; - - print STDERR "DEBUG/check_urls: check response\n" if ($debug & 0x10); - if ($code !~ /^[23]/) { - $status = "HTTP reports: $code"; - } else { - $status = "ok"; - }; - }; -LABEL_PRINT: - if ($status ne "ok") { - print "desc='$desc' URL=$url proto=$proto host=$host port=$port uri='$uri'"; - print " status=$status\n\n"; - die; - }; -LABEL_END: - $$p_urls{$url}->{'checktime'} = $time; - $$p_urls{$url}->{'checkresult'} = $status; - undef $s; - store_urls(); - }; -}; - - -sub report_urls() { - print STDERR "DEBUG/report_urls: begin\n" if ($debug & 0x10); - - for my $url (sort { $$p_urls{$a}->{'line'} <=> $$p_urls{$b}->{'line'} } ( keys %$p_urls)) { - if ($$p_urls{$url}->{'checkresult'} =~ /^ok/) { - next; - }; - - print "NOTICE: URL has a problem: $url\n"; - print " Description : " . $$p_urls{$url}->{'desc'} . "\n"; - print " Line number : " . $$p_urls{$url}->{'line'} . "\n"; - print " Result : " . $$p_urls{$url}->{'checkresult'} . "\n"; - print "\n"; - }; -}; - - -sub check_rfc_urls() { - print STDERR "DEBUG/check_rfc_urls: begin\n" if ($debug & 0x10); - - for my $url (sort { $$p_urls{$a}->{'line'} <=> $$p_urls{$b}->{'line'} } ( keys %$p_urls)) { - if ($url =~ /rfc[0-9]{1,4}/) { - print "NOTICE: URL points to RFC: $url\n"; - print " Description : " . $$p_urls{$url}->{'desc'} . "\n"; - print " Line number : " . $$p_urls{$url}->{'line'} . "\n"; - print "\n"; - }; - }; -}; - - -##### Main - -if (! defined $ARGV[0] || $ARGV[0] eq "") { - die "Missing file name (arg1)"; -}; - -if (! -f $ARGV[0]) { - die "Argument 1 is not an existing file: " . $ARGV[0]; -}; - -$dbfile = $ARGV[0] . $dbfile_suffix; - -load_urls(); -extract_urls($ARGV[0]); -cleanup_old_urls(); -check_urls(); -store_urls(); -check_rfc_urls(); -report_urls(); diff --git a/LDP/users/Peter-Bieringer/copytohowtodir.sh b/LDP/users/Peter-Bieringer/copytohowtodir.sh deleted file mode 100755 index f02b5a15..00000000 --- a/LDP/users/Peter-Bieringer/copytohowtodir.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/sh -# -# $Id$ -# -# Small helper script to copy SGML file to howto dir -# -# (P) & (C) by Peter Bieringer -# -# 20020119/PB: initial - - -FILE_SGML="Linux+IPv6-HOWTO.sgml" - -DIRSRC="./" -DIRDST="../../howto/docbook/" - -if [ ! -f "${DIRSRC}${FILE_SGML}" ]; then - echo "ERR : Missing SGML file '${DIRSRC}${FILE_SGML}'!" - exit 1 -fi - -if [ -f "${DIRDST}${FILE_SGML}" ]; then - if [ "${DIRDST}${FILE_SGML}" -nt "${DIRSRC}${FILE_SGML}" ]; then - echo "ERR : SGML file at destination is newer than source!" - exit 1 - fi -fi - -if [ -f "${DIRDST}${FILE_SGML}" ]; then - echo "INF : Remove old SGML file '${DIRDST}${FILE_SGML}'" - rm "${DIRDST}${FILE_SGML}" -fi - -echo "INF : Copy new SGML file" -cp "${DIRSRC}${FILE_SGML}" "${DIRDST}${FILE_SGML}" diff --git a/LDP/users/Peter-Bieringer/generate-all.sh b/LDP/users/Peter-Bieringer/generate-all.sh deleted file mode 100755 index b8fd5136..00000000 --- a/LDP/users/Peter-Bieringer/generate-all.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh - -# Generate all available howtos - -list="Linux+IPv6-HOWTO.sgml Linux+IPv6-HOWTO.de.sgml Linux+IPv6-HOWTO.fr.sgml Linux+IPv6-HOWTO.pt_BR.sgml" - -for lyx in $list; do - ./generate.sh $lyx -done - -echo -en "\a" diff --git a/LDP/users/Peter-Bieringer/generate-en-de.sh b/LDP/users/Peter-Bieringer/generate-en-de.sh deleted file mode 100755 index ec4d62e3..00000000 --- a/LDP/users/Peter-Bieringer/generate-en-de.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh - -# Generate all available howtos - -list="Linux+IPv6-HOWTO.sgml Linux+IPv6-HOWTO.de.sgml" - -for lyx in $list; do - ./generate.sh $lyx $* || exit 1 -done - -echo -en "\a" diff --git a/LDP/users/Peter-Bieringer/generate.sh b/LDP/users/Peter-Bieringer/generate.sh deleted file mode 100755 index 51c44434..00000000 --- a/LDP/users/Peter-Bieringer/generate.sh +++ /dev/null @@ -1,345 +0,0 @@ -#!/bin/sh -# -# (P) & (C) 2003-2016 by Dr. Peter Bieringer -# -# Generator script -# -# $Id$ -# -# Requires: htmldoc recode docbook-utils-pdf -# -# Changelog -# -# 20020117/PB: review -# 20020128/PB: change PDF generation to LDP conform one, PS is still not LDP conform -# 20070401/PB: disable sgmlfixer (no longer needed) -# add support for XML file, replace nsgmls by onsgmls -# 20090214/PB: remove tag from SGML, onsgmls don't like it -# 20090523/PB: extend required binary check -# 20091220/PB: catch recode problem -# 20110508/PB: force UTF-8 as input format to fix mixed charset problems in HTML -# renice whole script -# support also ldp.dsl stored in same directory as the script -# 20110509/PB: add charset meta header on each html page to force UTF-8 -# 20161215/PB: remove VGWort URL appender - -loglevel=6 - -# parse options -while getopts "ql:" opt; do - case $opt in - q) - loglevel=4 - ;; - l) - loglevel=$OPTARG - echo "INFO : set loglevel to: $loglevel" - ;; - \?) - echo "Invalid option: -$OPTARG" >&2 - ;; - esac -done - -shift $((OPTIND-1)) - -if [ -z "$1" ]; then - file_input="Linux+IPv6-HOWTO.sgml" - #file_input="Linux+IPv6-HOWTO.xml" -else - file_input="$1" -fi - -if echo "$file_input" | grep -q ".sgml$"; then - # ok, SGML - true -elif echo "$file_input" | grep -q ".xml$"; then - # ok, XML - true -else - echo "ERR: file is not a SGML/XML file: $file_input" - exit 1 -fi - -if head -1 "$file_input" |grep -q DOCTYPE ; then - doctype="SGML" -elif head -1 "$file_input" |grep -q "xml version" ; then - doctype="XML" -else - echo "ERR: file is not a SGML file: $file_input" - exit 1 -fi - -echo "Used SGML file: $file_input" - -file_base="${file_input%.*}" - -ONSGMLS="/usr/bin/onsgmls" -JADE="/usr/bin/jade" -DB2PS="/usr/bin/db2ps" -DB2PDF="/usr/bin/db2pdf" -LDP_PRINT="/usr/local/bin/ldp_print" -PS2ASCII="/usr/bin/ps2ascii" -RECODE="/usr/bin/recode" -HTMLDOC="/usr/bin/htmldoc" - -#LDP_PDFPS="yes" - -checklist_bin="ONSGMLS JADE DB2PS DB2PDF PS2ASCII RECODE HTMLDOC" - -if [ "$LDP_PDFPS" = "yes" ]; then - checklist_bin="$checklist_bin LDP_PRINT" -fi - - -file_ps="$file_base.ps" -file_pdf="$file_base.pdf" -file_txt="$file_base.txt" -file_html="$file_base.html" - -file_ldpdsl="/usr/local/share/sgml/dsssl/ldp.dsl" -if [ ! -f $file_ldpdsl ]; then - # try local stored one - file_ldpdsl="`dirname $0`" - if [ "$file_ldpdsl" = "." ]; then - file_ldpdsl="`pwd`" - fi - file_ldpdsl="$file_ldpdsl/ldp.dsl" -fi - -file_xmldcl="/usr/share/sgml/xml.dcl" -dir_dssslstylesheets="/usr/share/sgml/docbook/dsssl-stylesheets" - -if [ ! -f "$file_ldpdsl" ]; then - echo "ERR: Missing DSL file: $file_ldpdsl" - exit 1 -fi - - -if [ ! -f $file_input ]; then - echo "ERR: Missing SGML file, perhaps export DocBook of LyX won't work" - exit 1 -fi - -# look for required files -for f in $file_ldpdsl $file_xmldcl; do - if [ ! -e $f ]; then - echo "Missing file: $f" - exit 1 - fi -done - -# look for required binaries -for name in $checklist_bin; do - f="${!name}" - - if [ ! -e $f ]; then - echo "Missing file: $f ($name)" - exit 1 - fi - if [ ! -x $f ]; then - echo "Cannot executue: $f ($name)" - exit 1 - fi -done - -# run sgmlfix -#if [ -e ./runsgmlfix.sh ]; then -# ./runsgmlfix.sh "$file_input" -#else -# echo "WARN: cannot execute 'runsgmlfix.sh'" -#fi - -export SP_ENCODING=UTF-8 -export SP_CHARSET_FIXED=yes - -## Functions -validate_sgml() { - # remove tags , - perl -pi -e 's|||g' "$file_input" - - echo "INFO : Validate SGML/XML code '$file_input'" - if [ "$doctype" = "XML" ]; then - local options="$file_xmldcl" - fi - [ $loglevel -ge 7 ] && set -x - - $ONSGMLS -s $options $file_input - local retval=$? - [ $loglevel -ge 7 ] && set +x - if [ $retval -gt 0 ]; then - echo "ERR: Validation results in errors!" - return 1 - else - echo "INFO : Validation was successfully" - fi -} - -create_html_multipage() { - echo "INFO : Create HTML multipages" - if [ ! -d "$file_base" ]; then - mkdir "$file_base" || exit 1 - fi - pushd "$file_base" >/dev/null || exit 1 - rm -f * - [ $loglevel -ge 7 ] && set -x - $JADE -t sgml -i html -D $dir_dssslstylesheets -d "${file_ldpdsl}#html" ../$file_input - local retval=$? - [ $loglevel -ge 7 ] && set +x - - perl -pi -e 's#>/dev/null - return $retval -} - -create_html_singlepage() { - echo "INFO : Create HTML singlepage '$file_html' from '$file_input'" - [ $loglevel -ge 7 ] && set -x - $JADE -t sgml -i html -V nochunks -d "${file_ldpdsl}#html" $file_input >$file_html - local retval=$? - [ $loglevel -ge 7 ] && set +x - - perl -pi -e 's#> $file_txt - local retval=$? - [ $loglevel -ge 7 ] && set +x - else - echo "ERR: Cannot create TXT because of missing PS file" - fi - if [ $retval -eq 0 ]; then - echo "INFO : Create TXT file - done" - else - echo "ERR: Create TXT file - an error occurs!" - fi - return $retval -} - -### Main -validate_sgml -[ $? -ne 0 ] && exit 1 - -create_html_multipage -if [ $? -ne 0 ]; then - echo "ERROR : create_html_multipage was not successful" - exit 1 -fi - -create_html_singlepage -if [ $? -ne 0 ]; then - echo "ERROR : create_html_singlepage was not successful" - exit 1 -fi - -create_pdf -if [ $? -ne 0 ]; then - echo "ERROR : create_pdf was not successful" - exit 1 -fi - -#create_ps -#[ $? -ne 0 ] && exit 1 - -#create_txt -#[ $? -ne 0 ] && exit 1 - -#create_rtf -#[ $? -ne 0 ] && exit 1 - -## Add VGWort URL -#if [ -x ./adjust-html-vgwort.sh ]; then -# case $file_input in -# 'Linux+IPv6-HOWTO.sgml') -# echo "NOTICE: add vgwort URL" -# ./adjust-html-vgwort.sh en -# ;; -# 'Linux+IPv6-HOWTO.de.sgml') -# echo "NOTICE: add vgwort URL" -# ./adjust-html-vgwort.sh de -# ;; -# esac -#else -# echo "NOTICE : can't add vgwort URL (missing adjust-html-vgwort.sh)" -#fi - - -exit 0 diff --git a/LDP/users/Peter-Bieringer/info.txt b/LDP/users/Peter-Bieringer/info.txt deleted file mode 100644 index a0b3dc89..00000000 --- a/LDP/users/Peter-Bieringer/info.txt +++ /dev/null @@ -1,30 +0,0 @@ -# $Id$ - -This is the working directory of - Peter Bieringer - pb (at) bieringer.de - -Content: - Linux+IPv6-HOWTO.lyx (online next) - LyX file of the Linux+IPv6-HOWTO - - lyxcodelinewrapper.pl - Perl program which wraps too long "code" lines in a LyX file - - sgmllyxtabletagfix.pl - Perl program which fixes table tags - - sgmllyxquotefix.pl - Perl program which fixes quote tags - - copytohowtodir.sh - Shell program which copy SGML file to local howto directory - - runsgmlfix.sh - Shell program which runs all the SGML code fix programs - - generate.sh - Shell program which run different generation steps (needed for local review) - requires: sgml-common opensp openjade docbook-utils-pdf recode htmldoc - -2009 Test diff --git a/LDP/users/Peter-Bieringer/ldp.dsl b/LDP/users/Peter-Bieringer/ldp.dsl deleted file mode 100644 index 0e6dff33..00000000 --- a/LDP/users/Peter-Bieringer/ldp.dsl +++ /dev/null @@ -1,351 +0,0 @@ - - - -]]> - - -]]> -]> - - - - - - -;; customize the print stylesheet - -(declare-characteristic preserve-sdata? - ;; this is necessary because right now jadetex does not understand - ;; symbolic entities, whereas things work well with numeric entities. - "UNREGISTERED::James Clark//Characteristic::preserve-sdata?" - #f) - -(define %generate-article-toc% - ;; Should a Table of Contents be produced for Articles? - #t) - -(define (toc-depth nd) - 4) - -(define %generate-article-titlepage-on-separate-page% - ;; Should the article title page be on a separate page? - #t) - -(define %section-autolabel% - ;; Are sections enumerated? - #t) - -(define %footnote-ulinks% - ;; Generate footnotes for ULinks? - #f) - -(define %bop-footnotes% - ;; Make "bottom-of-page" footnotes? - #f) - -(define %body-start-indent% - ;; Default indent of body text - 0pi) - -(define %para-indent-firstpara% - ;; First line start-indent for the first paragraph - 0pt) - -(define %para-indent% - ;; First line start-indent for paragraphs (other than the first) - 0pt) - -(define %block-start-indent% - ;; Extra start-indent for block-elements - 0pt) - -(define formal-object-float - ;; Do formal objects float? - #t) - -(define %hyphenation% - ;; Allow automatic hyphenation? - #t) - -(define %admon-graphics% - ;; Use graphics in admonitions? - #f) - -(define %default-quadding% - ;; Full justification. - 'justify) - -(define (book-titlepage-verso-elements) - ;;added publisher, releaseinfo to the default list - (list (normalize "title") - (normalize "subtitle") - (normalize "corpauthor") - (normalize "authorgroup") - (normalize "author") - (normalize "publisher") - (normalize "releaseinfo") - (normalize "editor") - (normalize "edition") - (normalize "pubdate") - (normalize "copyright") - (normalize "isbn") - (normalize "abstract") - (normalize "legalnotice") - (normalize "revhistory"))) - - - - - - - - - - -(declare-characteristic preserve-sdata? - ;; this is necessary because right now jadetex does not understand - ;; symbolic entities, whereas things work well with numeric entities. - "UNREGISTERED::James Clark//Characteristic::preserve-sdata?" - #f) - -(declare-flow-object-class element - ;; for redhat - "UNREGISTERED::James Clark//Flow Object Class::element") - -(define %html-pubid% - ;; put the public identifier in each HTML file - "-//W3C//DTD HTML 4.0 Transitional//EN") - -(define %generate-legalnotice-link% - ;; put the legal notice in a separate file - #t) - -(define %admon-graphics-path% - ;; use graphics in admonitions, set their - "../images/") - -(define %admon-graphics% - #t) - -(define %funcsynopsis-decoration% - ;; make funcsynopsis look pretty - #t) - -(define %html-ext% - ;; when producing HTML files, use this extension - ".html") - -(define %generate-book-toc% - ;; Should a Table of Contents be produced for books? - #t) - -(define %generate-article-toc% - ;; Should a Table of Contents be produced for articles? - #t) - -(define %generate-part-toc% - ;; Should a Table of Contents be produced for parts? - #t) - -(define %generate-book-titlepage% - ;; produce a title page for books - #t) - -(define %generate-article-titlepage% - ;; produce a title page for articles - #t) - -(define (chunk-skip-first-element-list) - ;; forces the Table of Contents on separate page - '()) - -(define (list-element-list) - ;; fixes bug in Table of Contents generation - '()) - -(define %root-filename% - ;; The filename of the root HTML document (e.g, "index"). - "index") - -(define %shade-verbatim% - ;; verbatim sections will be shaded if t(rue) - #t) - -(define %use-id-as-filename% - ;; Use ID attributes as name for component HTML files? - #t) - -(define %graphic-extensions% - ;; graphic extensions allowed - '("gif" "png" "jpg" "jpeg" "tif" "tiff" "eps" "epsf" )) - -(define %graphic-default-extension% - "gif") - -(define %section-autolabel% - ;; For enumerated sections (1.1, 1.1.1, 1.2, etc.) - #t) - -(define (toc-depth nd) - ;; more depth (2 levels) to toc; instead of flat hierarchy - 2) - -(element emphasis - ;; make role=strong equate to bold for emphasis tag - (if (equal? (attribute-string "role") "strong") - (make element gi: "STRONG" (process-children)) - (make element gi: "EM" (process-children)))) - -(define (book-titlepage-recto-elements) - ;; elements on a book's titlepage - (list (normalize "title") - (normalize "subtitle") - (normalize "graphic") - (normalize "mediaobject") - (normalize "corpauthor") - (normalize "authorgroup") - (normalize "author") - (normalize "othercredit") - (normalize "contrib") - (normalize "edition") - (normalize "releaseinfo") - (normalize "publisher") - (normalize "editor") - (normalize "copyright") - (normalize "pubdate") - (normalize "revhistory") - (normalize "abstract") - (normalize "legalnotice"))) - -(define (article-titlepage-recto-elements) - ;; elements on an article's titlepage - (list (normalize "title") - (normalize "subtitle") - (normalize "authorgroup") - (normalize "author") - (normalize "othercredit") - (normalize "releaseinfo") - (normalize "copyright") - (normalize "pubdate") - (normalize "revhistory") - (normalize "abstract") - (normalize "legalnotice"))) - -(define (process-contrib #!optional (sosofo (process-children))) - ;; print out with othercredit information; for translators, etc. - (make sequence - (make element gi: "SPAN" - attributes: (list (list "CLASS" (gi))) - (process-children)))) - -(define (process-othercredit #!optional (sosofo (process-children))) - ;; print out othercredit information; for translators, etc. - (let ((author-name (author-string)) - (author-contrib (select-elements (children (current-node)) - (normalize "contrib")))) - (make element gi: "P" - attributes: (list (list "CLASS" (gi))) - (make element gi: "B" - (literal author-name) - (literal " - ")) - (process-node-list author-contrib)))) - -(mode article-titlepage-recto-mode - (element contrib (process-contrib)) - (element othercredit (process-othercredit)) -) - -(mode book-titlepage-recto-mode - (element contrib (process-contrib)) - (element othercredit (process-othercredit)) -) - -(define (article-title nd) - (let* ((artchild (children nd)) - (artheader (select-elements artchild (normalize "artheader"))) - (artinfo (select-elements artchild (normalize "articleinfo"))) - (ahdr (if (node-list-empty? artheader) - artinfo - artheader)) - (ahtitles (select-elements (children ahdr) - (normalize "title"))) - (artitles (select-elements artchild (normalize "title"))) - (titles (if (node-list-empty? artitles) - ahtitles - artitles))) - (if (node-list-empty? titles) - "" - (node-list-first titles)))) - -(mode subtitle-mode - ;; do not print subtitle on subsequent pages - (element subtitle (empty-sosofo))) - -;; Redefinition of $verbatim-display$ -;; Origin: dbverb.dsl -;; Different foreground and background colors for verbatim elements -;; Author: Philippe Martin (feloy@free.fr) 2001-04-07 - -(define ($verbatim-display$ indent line-numbers?) - (let ((verbatim-element (gi)) - (content (make element gi: "PRE" - attributes: (list - (list "CLASS" (gi))) - (if (or indent line-numbers?) - ($verbatim-line-by-line$ indent line-numbers?) - (process-children))))) - (if %shade-verbatim% - (make element gi: "TABLE" - attributes: (shade-verbatim-attr-element verbatim-element) - (make element gi: "TR" - (make element gi: "TD" - (make element gi: "FONT" - attributes: (list - (list "COLOR" (car (shade-verbatim-element-colors - verbatim-element)))) - content)))) - content))) - -;; -;; Customize this function -;; to change the foreground and background colors -;; of the different verbatim elements -;; Return (list "foreground color" "background color") -;; -(define (shade-verbatim-element-colors element) - (case element - (("SYNOPSIS") (list "#000000" "#6495ED")) - ;; ... - ;; Add your verbatim elements here - ;; ... - (else (list "#000000" "#E0E0E0")))) - -(define (shade-verbatim-attr-element element) - (list - (list "BORDER" - (cond - ((equal? element (normalize "SCREEN")) "1") - (else "0"))) - (list "BGCOLOR" (car (cdr (shade-verbatim-element-colors element)))) - (list "WIDTH" ($table-width$)))) - -;; End of $verbatim-display$ redefinition - - - - - - - - diff --git a/LDP/users/Peter-Bieringer/lyxcodelinewrapper.pl b/LDP/users/Peter-Bieringer/lyxcodelinewrapper.pl deleted file mode 100755 index ac3481ae..00000000 --- a/LDP/users/Peter-Bieringer/lyxcodelinewrapper.pl +++ /dev/null @@ -1,173 +0,0 @@ -#!/usr/bin/perl -# -# $Id$ -# -# LyX codeline wrapper tool -# -# (P) & (C) 2002-2009 by Peter Bieringer -# -# Published under the GNU GPL licence -# -# Takes LyX code from stdin and pipes a modified to stdout. -# Wraps length of code lines to a given limit. -# Marks second and next lines with a given character. -# -# Attention: no warranty that the new LyX code is very well! -# Use diff to check proper work -# -# Changes: -# 20020118: Initial try -# 20020119: Improve tool, do not touch code lines including LyX tags -# 20090214/PB: adjustments for LyX format 345 -# -# Known bugs: -# * Sure some -# -# Known limitations: -# * Code lines containing LyX tags are currently not supported and skipped - -my $lyx_format_supported = "474"; - -sub print_long_line ($); - -my $TAG_CODE = 0; -my $line_carry = ""; -my $lines_original = ""; -my $line_limit = 79; -#my $linebreakchar = chr(172); -my $linebreakchar = "¬"; # UTF-8 support - -#my $debug = 1; -my $debug = 0; - -while () { - my $line = $_; - chomp $line; - - #print "$line"; - #print "\n"; - # - if ($line =~ /^\\lyxformat ([0-9]+)$/) { - if ($1 ne $lyx_format_supported) { - die "Lyx format not supported: $1"; - }; - } elsif ($line =~ /^\\begin_layout Code$/ && $TAG_CODE != 1) { - print STDERR "INF: Code tag starts\n"; - $TAG_CODE = 1; - $line_carry = ""; - $lines_original = ""; - next; - } elsif ($line =~ /^\\end_layout$/ && $TAG_CODE == 1) { - print STDERR "INF: Code tag ends\n"; - - if ($lines_original =~ /\\/) { - # Ooops, lines contain a LyX tag, currently not supported, so let it be - #print STDERR "WARN: Lines contain LyX code tag, let it like it is\n: '$lines_original'"; - print STDERR "WARN: Lines contain LyX code tag, let it like it is\n"; - if ($debug & 0x01) { print "G"; }; - print "\\begin_layout Code" . "\n" . $lines_original . "\\end_layout" . "\n"; - } elsif ($lines_original =~ /$linebreakchar/) { - # Code line already wrapped - print STDERR "INF: Code line already wrapped, let it like it is\n"; - if ($debug & 0x01) { print "F"; }; - print "\\begin_layout Code" . "\n" . $lines_original . "\\end_layout" . "\n"; - } else { - print_long_line $line_carry; - }; - - $TAG_CODE = 0; - $line_carry = ""; - $lines_original = ""; - next; - } elsif ($line =~ /^\\layout/ && $TAG_CODE == 1) { - die "unsupported"; - print STDERR "INF: Code tag ends\n"; - - if ($lines_original =~ /\\/) { - # Ooops, lines contain a LyX tag, currently not supported, so let it be - #print STDERR "WARN: Lines contain LyX code tag, let it like it is\n: '$lines_original'"; - print STDERR "WARN: Lines contain LyX code tag, let it like it is\n"; - if ($debug & 0x01) { print "A"; }; - print "\\begin_layout Code" . "\n" . $lines_original; - } elsif ($lines_original =~ /$linebreakchar/) { - # Code line already wrapped - print STDERR "INF: Code line already wrapped, let it like it is\n"; - if ($debug & 0x01) { print "B"; }; - print "\\begin_layout Code" . "\n" . $lines_original; - } else { - print_long_line $line_carry; - }; - - $line_carry = ""; - $lines_original = ""; - $TAG_CODE = 0; - print $line . "\n"; - next; - }; - - if ($TAG_CODE != 1) { - print $line . "\n"; - } else { - $lines_original .= $line . "\n"; - - if ($line eq "") { - # empty lines are skipped here - next; - }; - - print STDERR "INF: Found code line: '" . $line . "'\n"; - $line_carry .= $line; - }; -}; - -sub print_long_line ($){ - my $line = shift; - print STDERR "INF: Print code line: '" . $line . "'\n"; - - my $l = 0; - my $c = ""; - - if (length($line) == 0) { - if ($debug & 0x01) { print "C"; }; - my $s = "\\begin_layout Code" . "\n" . "\n" . "\\end_layout" . "\n"; - print $s; - return; - }; - - while ($l < length($line)) { - my $t = 0; - print STDERR "INF: Step: $l\n"; - - if ($l == 0) { - $c = ""; - } else { - $c =$linebreakchar; - } - - if (length($line) - $l <= $line_limit) { - if ($debug & 0x01) { print "D"; }; - my $s = "\\begin_layout Code" . "\n" . $c . substr($line, $l) . "\n" . "\\end_layout" . "\n"; - print STDERR "INF: Step end\n"; - print $s; - print STDERR $s; - last; - }; - - for ($t = $line_limit; $t > 0; $t--) { - if (substr($line, $l + $t, 1) eq " ") { - print STDERR "INF: Found at pos: $t\n"; - last; - }; - }; - - if ($t == 0) { $t = $line_limit }; - print STDERR "INF: Start printing l=$l t=$t\n"; - if ($debug & 0x01) { print "E"; }; - my $s = "\\begin_layout Code" . "\n" . $c . substr($line, $l, $t) . "\n" . "\\end_layout" . "\n\n"; - print $s; - print STDERR $s; - $l = $l + $t; - }; -}; - -print STDERR "\n\nWARNING: check code using utility 'diff' for proper LyX output!\n"; diff --git a/LDP/users/Peter-Bieringer/make.sh b/LDP/users/Peter-Bieringer/make.sh deleted file mode 100755 index a2552f4e..00000000 --- a/LDP/users/Peter-Bieringer/make.sh +++ /dev/null @@ -1,335 +0,0 @@ -#!/bin/bash -# -# (P) & (C) 2011 - 2011 by Dr. Peter Bieringer -# -# Wrapper script for HOWTO generator script -# -# Requires: "generate.sh" -# -# Changelog -# -# -# 20110511/PB: use absolute paths, extend error checking - - -URL_BASE="http://cvs.tldp.org/go.to/LDP/LDP/users/Peter-Bieringer/" - -FILE_EN="Linux+IPv6-HOWTO.sgml" -FILE_DE="Linux+IPv6-HOWTO.de.sgml" -FILE_FR="Linux+IPv6-HOWTO.fr.sgml" -FILE_PT_BR="Linux+IPv6-HOWTO.pt_BR.sgml" - -options_wget="--quiet" - -DIR_BASE="$HOME/howtos" -DIR_DOWNLOAD="$HOME/howtos/download" - -DIR_DEST_BASE="/var/www/html/howtos" - -## logging -log() { - local level="$1" - shift - - printf "%-6s: %s\n" "$level" "$*" -} - -## download file -download() { - local url_base="$1" - local file="$2" - - if [ -z "$url_base" ]; then - log "ERROR" "'url_base' empty" - return 1 - fi - - if [ -z "$file" ]; then - log "ERROR" "'file' empty" - return 1 - fi - - if [ -z "$DIR_DOWNLOAD" ]; then - log "ERROR" "no download directory given" - return 1 - fi - - if [ ! -d "$DIR_DOWNLOAD" ]; then - log "ERROR" "download directory doesn't exist: $DIR_DOWNLOAD" - return 1 - fi - - if [ "$force_download" != "1" ]; then - log "NOTICE" "skip download $url_base/$file (use option -d)" - return 0 - fi - - log "INFO" "start download $url_base/$file to directory $DIR_DOWNLOAD" - wget $options_wget -N -P "$DIR_DOWNLOAD" "$url_base/$file" - local result=$? - if [ $result -eq 0 ]; then - log "INFO" "download successful: $url_base/$file (stored to $DIR_DOWNLOAD)" - else - log "ERROR" "download not successful: $url_base/$file" - fi - - return $result -} - -## check, whether processing should be started -check() { - local file_download="$1" - local file="$2" - local dir_html="$3" - - if [ -z "$file" ]; then - log "ERROR" "'file' empty" - return 1 - fi - - if [ -z "$file_download" ]; then - log "ERROR" "'file_download' empty" - return 1 - fi - - if [ -z "$dir_html" ]; then - log "ERROR" "'dir_html' empty" - return 1 - fi - - log "INFO" "check file: $file" - - if [ ! -f "$file_download" ]; then - log "WARN" "no downloaded file available: $file_download" - return 1 - fi - - if [ ! -f "$file" ]; then - log "NOTICE" "no 'old' file available: $file (copy now)" - cp -p "$file_download" "$file" - if [ $? -ne 0 ]; then - log "ERROR" "can't copy 'new' file to 'old' file: $file_download -> $file" - return 1 - fi - - return 0 - else - if cmp -s "$file_download" "$file"; then - log "INFO" "'old' is identical with 'new' file: $file" - else - log "NOTICE" "'old' is not equal with 'new' file: $file" - cp -p "$file_download" "$file" - if [ $? -ne 0 ]; then - log "ERROR" "can't copy 'new' file to 'old' file: $file_download -> $file" - return 1 - fi - return 0 - fi - # check contents of destination directory - log "INFO" "check directory: $dir" - - if [ ! -d "$dir" ]; then - log "NOTICE" "directory still not exist: $dir" - return 0 - fi - - local num_files="`find "$dir" -mindepth 1 -maxdepth 1 -type f | wc -l`" - if [ $num_files -eq 0 ]; then - # directory is empty - log "NOTICE" "directory is empty: $dir" - return 0 - fi - - local num_files_old="`find "$dir" -mindepth 1 -maxdepth 1 -type f ! -newer "$file" | wc -l`" - if [ $num_files_old -ne 0 ]; then - # force regeneration - log "NOTICE" "directory contains old files: $dir ($num_files_old)" - return 0 - fi - - # 'old' file already exists - if [ "$file" -nt "$file_download" ]; then - log "WARN" "'old' is newer than 'new' file: $file" - return 1 - fi - fi - - if [ "$force_generate" = "1" ]; then - log "NOTICE" "force regeneration of: $file" - return 0 - fi - - # nothing to do - log "DEBUG" "no indication for start processing file found: $file" - return 1 -} - -## process/generate output -process() { - log "INFO" "start processing file: $file" - pushd $DIR_BASE >/dev/null || return 1 - ./generate.sh "$file" - local result=$? - popd >/dev/null - if [ $result -ne 0 ]; then - log "ERROR" "processing of file not successful: $file" - return 1 - fi - - log "INFO" "processing of file successful: $file" -} - - -## copy output -copy() { - local file="$1" - - if [ -z "$DIR_DEST_BASE" ]; then - log "ERROR" "destination directory for output not given 'DIR_DEST_BASE'" - fi - - if [ ! -d "$DIR_DEST_BASE" ]; then - log "ERROR" "destination directory for output doesn't exist: $DIR_DEST_BASE" - return 1 - fi - - log "INFO" "start syncing files of master file: $file" - - local file_pdf="${file/.sgml/.pdf}" - local file_html="${file/.sgml/.html}" - local dir_html="${file/.sgml}" - - local file_base="`basename "${file/.sgml}"`" - - local file_dest_pdf="$DIR_DEST_BASE/${file_base}.pdf" - local file_dest_html="$DIR_DEST_BASE/${file_base}.html" - local dir_dest_html="$DIR_DEST_BASE/$file_base" - - local file_dest_status="$DIR_DEST_BASE/${file_base}.last" - - log "INFO" "copy PDF file: $file_pdf" - cp -p "$file_pdf" "$file_dest_pdf" - if [ $? -ne 0 ]; then - log "ERROR" "can't copy PDF file: $file_pdf" - return 1 - fi - - if [ ! -f "$file_dest_pdf" ]; then - log "ERROR" "destination PDF file is not a file or doesn't exist: $file_dest_pdf" - return 1 - fi - - chmod 644 "$file_dest_pdf" - if [ $? -ne 0 ]; then - log "ERROR" "can't adjust permissions of PDF file: $file_dest_pdf" - return 1 - fi - - log "INFO" "copy HTML file: $file_html" - cp -p "$file_html" "$file_dest_html" - if [ $? -ne 0 ]; then - log "ERROR" "can't copy HTML file: $file_html" - return 1 - fi - - if [ ! -f "$file_dest_html" ]; then - log "ERROR" "destination HTML file is not a file or doesn't exist: $file_dest_html" - return 1 - fi - - chmod 644 "$file_dest_html" - if [ $? -ne 0 ]; then - log "ERROR" "can't adjust permissions of HTML file: $file_dest_html" - return 1 - fi - - if [ ! -d "$dir_html" ]; then - log "ERROR" "source directory for HTML doesn't exist: $dir_html" - return 1 - fi - - if [ ! -d "$dir_dest_html" ]; then - log "ERROR" "destination directory for HTML doesn't exist: $dir_dest_html" - return 1 - fi - - if [ ! -w "$dir_dest_html" ]; then - log "ERROR" "destination directory for HTML isn't writable: $dir_dest_html" - return 1 - fi - log "INFO" "copy HTML directory: $dir_html -> $dir_dest_html" - rsync --delete -r "$dir_html/" "$dir_dest_html/" - if [ $? -ne 0 ]; then - log "ERROR" "can't sync HTML dir: $dir_html" - return 1 - fi - - log "INFO" "update status file: $file_dest_status" - touch "$file_dest_status" - if [ $? -ne 0 ]; then - log "ERROR" "can't update status file: $file_dest_status" - return 1 - fi -} - - - - - -## main -main() { - for file in $*; do - download "$URL_BASE" "$file" - if [ $? -ne 0 ]; then - continue - fi - - dir="$DIR_BASE/${file/.sgml}" - - check "$DIR_DOWNLOAD/$file" "$DIR_BASE/$file" "$dir" - if [ $? -eq 0 ]; then - process "$DIR_BASE/$file" - fi - - copy "$DIR_BASE/$file" - done -} - - -# parse options -while getopts "dg" opt; do - case $opt in - d) - force_download=1 - ;; - g) - force_download=1 - force_generate=1 - ;; - \?) - echo "Invalid option: -$OPTARG" >&2 - ;; - esac -done - -shift $((OPTIND-1)) - -case $1 in - 'de') - files="$FILE_DE" - ;; - 'en') - files="$FILE_EN" - ;; - 'fr') - files="$FILE_FR" - ;; - 'pt') - files="$FILE_PT_BR" - ;; - 'all') - files="$FILE_EN $FILE_DE $FILE_FR $FILE_PT_BR" - ;; -esac - -main $files diff --git a/LDP/users/Peter-Bieringer/runsgmlfix.sh b/LDP/users/Peter-Bieringer/runsgmlfix.sh deleted file mode 100755 index 24795de6..00000000 --- a/LDP/users/Peter-Bieringer/runsgmlfix.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/sh -# -# $Id$ -# -# Small helper script to fix broken SGML code -# -# (P) & (C) by Peter Bieringer -# -# 20020119/PB: initial - -if [ -z "$1" ]; then - FILE_SGML="Linux+IPv6-HOWTO.sgml" -else - FILE_SGML="$1" -fi - -FILE_LYX="`basename $FILE_SGML .sgml`.lyx" -FILE_TMP="tmp.sgml" - -PROG_FIX_TABLETAG="sgmllyxtabletagfix.pl" -PROG_FIX_QUOTE="sgmllyxquotefix.pl" - -if [ "$FILE_LYX" -nt "$FILE_SGML" ]; then - echo "ERR : LyX file '$FILE_LYX' is newer than SGML file '$FILE_SGML' - forgot to export?" - exit 1 -fi - -if [ -f "$FILE_TMP" ]; then - echo "INF : Temporary file exists, remove it!" - rm "$FILE_TMP" -fi - -if [ -f "$FILE_TMP" ]; then - echo "ERR : Ooops, temporary file still exists!" - exit 1 -fi - -echo "INF : Fix SGML now" -cat "$FILE_SGML" | ./$PROG_FIX_TABLETAG | ./$PROG_FIX_QUOTE >$FILE_TMP - -echo "INF : Remove old SGML file '$FILE_SGML'" -rm "$FILE_SGML" - -echo "INF : Rename temporary file to '$FILE_SGML'" -mv "$FILE_TMP" "$FILE_SGML" - - diff --git a/LDP/users/Peter-Bieringer/sgmllyxquotefix.pl b/LDP/users/Peter-Bieringer/sgmllyxquotefix.pl deleted file mode 100755 index 1e9427f7..00000000 --- a/LDP/users/Peter-Bieringer/sgmllyxquotefix.pl +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/bin/perl -# -# $Id$ -# -# SGML LyX qoute entinity fix tool -# -# (P) & (C) 2002 by Peter Bieringer -# -# Published under the GNU GPL licence -# -# Takes SGML output exported by LyX and fix a bug regarding quote entinities -# Don't know the reason what causes this, but it is wrong. -# -# Replaces: -# “ -> " -# ” -> " -# -# Changes: -# 20020125: Initial release -# 20020713: spelling fix -# -# Known bugs: -# Entity must be in one line - -print STDERR "INF : Replacing special quotes entities\n"; - -while () { - my $line = $_; - chomp $line; - - #print "$line"; - #print "\n"; - - if ($line =~ /“/) { - print STDERR "<"; - # Substitute - $line =~ s/“/"/g; - }; - if ($line =~ /”/) { - print STDERR ">"; - # Substitute - $line =~ s/”/"/g; - }; - - - print $line . "\n"; -}; -print STDERR "finished\n"; diff --git a/LDP/users/Peter-Bieringer/sgmllyxtabletagfix.pl b/LDP/users/Peter-Bieringer/sgmllyxtabletagfix.pl deleted file mode 100755 index 52019d23..00000000 --- a/LDP/users/Peter-Bieringer/sgmllyxtabletagfix.pl +++ /dev/null @@ -1,45 +0,0 @@ -#!/usr/bin/perl -# -# $Id$ -# -# SGML LyX table tag fix tool -# -# (P) & (C) 2002 by Peter Bieringer -# -# Published under the GNU GPL licence -# -# Takes SGML output exported by LyX and fix a bug in the table tag. -# Don't know the reason what causes this, but it is wrong. -# -> This bug is fixed in LyX 1.1.6fix4 -# -# Example: -# - -# + -# -# Changes: -# 20020119/PB: Initial release -# 20020125/PB: Minor review -# 20020130/PB: add comment -# - -print STDERR "INF : Fix 'colspec' lines\n"; - -while () { - my $line = $_; - chomp $line; - - #print "$line"; - #print "\n"; - - if ($line =~ /^$/) { - print STDERR "C"; - - # Substitute '/>' with '>' - $line =~ s/\/>$/>/g; - }; - }; - - print $line . "\n"; -}; -print STDERR "\n";