% Présentation d'IPv6 (à l'origine pour le Libr'east 2005).

\documentclass[10pt]{beamer}

\usepackage[latin1]{inputenc}
\usepackage[english,francais]{babel}
\usepackage{graphicx}
\usepackage{url}

\usetheme{Berkeley}
\usenavigationsymbolstemplate{}

\let\urlorig\url
\renewcommand{\url}[1]{
   \begin{otherlanguage}{english}{\small \urlorig{#1}}\end{otherlanguage}
}

\newcommand{\vsixaddr}[1]{
    \begin{otherlanguage}{english}{\footnotesize \tt #1}\end{otherlanguage}
}

\title{IPv6}
\author{Richard Braun}

\begin{document}

\begin{frame}
\frametitle{\includegraphics[scale=0.1175]{ipv6.eps}}
\titlepage
\end{frame}

\begin{frame}
\frametitle{Table des matières}
{\footnotesize \tableofcontents}
\end{frame}

\section{Introduction}

\begin{frame}
\frametitle{Présentation}
\begin{itemize}
\item Développé par l'IPv6 Working Group, une équipe de l'IETF
\item Existe depuis 1994 sous l'appellation IPng, officialisé en 1998 par la
      RFC 2460
\item Protocole de la couche réseau du modèle OSI (adressage et acheminement
      des paquets)
\item 6bone : réseau de test de 1996 à juin 2006
\end{itemize}
\end{frame}

\subsection{IPv4}

\begin{frame}
\frametitle{IPv4}
IPv4 (Internet Protocol version 4) est le protocole actuellement utilisé
sur Internet et la majorité des réseaux privés. Le développement d'IPv6
résulte de l'incapacité d'IPv4 à subvenir aux nouveaux besoins dans le
domaine des réseaux.
\end{frame}

\begin{frame}
\frametitle{Adressage}
\begin{itemize}
\item Adresses codées sur 32 bits (environ 4.3 milliards d'adresses au
      total dans l'espace d'adressage)
\item Espace d'adressage en pénurie (environ 65\% des adresses allouées - la
      ``fin du monde IPv4'' est estimée à 2010)
\item Répartition géographique inégale des adresses (environ 74\% des
      adresses allouées en Amérique du Nord, 17\% en Europe, 9\% en Asie
      - chiffres de 2005)
\end{itemize}
\end{frame}

\begin{frame}
\frametitle{Allocation}
\begin{figure}
\centering
\includegraphics[scale=0.5]{ipv4_allocation.eps}
\caption{Allocation des réseaux de classe A - Juillet 2005}
\end{figure}
\end{frame}

\begin{frame}
\frametitle{Routage}
\begin{itemize}
\item environ 180 000 routes IPv4 sont gérées par les routeurs backbone
\item Le routage CIDR (Classless Inter-Domain Routing) ne permet pas une
      aggrégation optimale des routes
\end{itemize}
\end{frame}

\begin{frame}
\frametitle{NAT}
\begin{itemize}
\item Technique de translation d'adresses
\item Permet de mapper un réseau à une adresses IP
\item Entraîne des problèmes d'utilisation avec certains protocoles
      (e.g. FTP, DCC, H.323)
\item Non conforme avec le principe d'adressage unique d'origine du protocole IP
\end{itemize}
\end{frame}

\section{IPv6}

\subsection{Adressage}

\begin{frame}
\frametitle{Adressage}
\begin{itemize}
\item Adresses codées sur 128 bits (340282366920938463463374607431768211456
      adresses au total)
\item Adresses représentées par des champs de 16 bits hexadécimaux séparés par
      le caractère :
\item Si plusieurs champs sont à 0, ils peuvent être représentés par la chaîne
      \vsixaddr{::}
\item Chaque interface réseau d'un hôte peut être associée à plusieurs
      adresses
\item Exemples d'adresses : \vsixaddr{2001:770:118:1:211:d8ff:fe13:4632},
      \vsixaddr{2001:7a8:432d::1}
\end{itemize}
\end{frame}

\begin{frame}
\frametitle{Adresse de loopback}
Chaque hôte possède une interface loopback ayant pour adresse
\vsixaddr{::1/128}.
\end{frame}

\begin{frame}
\frametitle{Adresses de lien local}
\begin{itemize}
\item Les adresses de lien local ({\it link-local}) ont pour préfixe
      \vsixaddr{fe80::/10}
\item Chaque hôte d'un même réseau physique possède une adresse de lien local
\item Ces adresses ne sont pas routables au delà du réseau physique auquel
      elles sont associées
\item Sur les interfaces possédant une adresse physique (également adresse MAC)
      comme les interfaces Ethernet, l'adresse de lien local est créée à partir
      de l'adresse MAC afin d'éviter tout conflit d'adresses sur un même réseau
      physique
\item Elles sont utilisées pour permettre aux hôtes d'un même réseau physique
      de communiquer sans avoir au préalable été configurés
\item Exemple : \vsixaddr{fe80::a00:20ff:fe86:c998}
\end{itemize}
\end{frame}

\begin{frame}
\frametitle{Adresses uniques locales}
\begin{itemize}
\item Les adresses uniques locales ont pour préfixe \vsixaddr{fc00::/7}
\item Elles ne sont routables qu'à l'intérieur d'un ensemble de sites
      coopérants
\item Elles remplacent les adresses {\it site-local}
\item Leur utilisation est optionnelle, la configuration d'un réseau privé
      utilisant ces adresses devant être entièrement effectuée par un
      administrateur
\item Exemple : \vsixaddr{fc00::a00:20ff:fe86:c998}
\end{itemize}
\end{frame}

\begin{frame}
\frametitle{Adresses globales}
\begin{itemize}
\item Aucune restriction de routage n'est imposée
\item Répartition des adresses hiérarchisée
\item Exemple : \vsixaddr{2001:770:118:1:211:d8ff:fe13:4632}
\end{itemize}
\end{frame}

\subsection{Routage}

\begin{frame}
\frametitle{Routage}
\begin{itemize}
\item Format des entètes optimisés à l'intention des routeurs, grâce au champ
      {\it Next Header}
\item Adresses ``découpées'' en 3 parties : le préfixe de routage global,
      l'identifiant de subnet ({\it subnet ID} - local au site), et
      l'identifiant d'interface ({\it interface ID})
\item Structure TLA/NLA/SLA obsolète pour permettre aux règles d'allocation
      d'évoluer selon les besoins des RIRs.
\end{itemize}
\end{frame}

\begin{frame}
\frametitle{Entète}
\begin{figure}
\centering
\includegraphics[scale=0.25]{ipv6_header.eps}
\caption{Entète d'un paquet IPv6}
\end{figure}
\end{frame}

\subsection{Multicast et Anycast}

\begin{frame}
\frametitle{Multicast}
\begin{itemize}
\item Le multicast est désormais intégré à IPv6 et activement utilisé
\item Les adresses multicast ont pour préfixe \vsixaddr{ff00::/8}
\item Le broadcast IPv4 est inclus dans les fonctionnalités du multicast IPv6
      (l'adresse multicast \vsixaddr{ff02::1}\ représente par exemple tous les
      noeuds d'un même réseau physique)
\end{itemize}
\end{frame}

\begin{frame}
\frametitle{Anycast}
\begin{itemize}
\item Une adresse anycast est une adresse allouée à plusieurs hôtes d'un
      réseau (les paquets à destination d'une adresse anycast sont routés vers
      le noeud le plus proche)
\item Les adresses anycast ne sont pas syntaxiquement différentes des adresses
      unicast globales
\item L'utilisation des adresses anycast est encore expérimentale et très
      restreinte
\end{itemize}
\end{frame}

\subsection{Autoconfiguration}

\begin{frame}
\frametitle{Autoconfiguration}
\begin{itemize}
\item L'autoconfiguration IPv6 est dite {\it stateless} (sans état - aucune
      donnée concernant l'état d'un hôte n'est maintenue)
\item Elle est spécifiée pour les hôtes possédant une seule interface dont le
      type n'est pas point-à-point
\item Le routeur d'un réseau physique diffuse des messages
      {\it Router Advertisement} périodiquement, contenant des informations
      comme le préfix et l'adresse de lien local de la passerelle par défaut
\item Un hôte nouvellement branché à un réseau peut demander sa configuration
      en envoyant un message {\it Router Solicitation} (qui, tout comme les
      {\it Router Advertisements}, est un message ICMPv6)
\item Une fois le préfixe obtenu, un hôte calcule son adresse en ajoutant son
      identifiant d'interface (adresse de 64 bits obtenue à partir de l'adresse
      EUI-64, elle-même obtenue à partir de l'adresse physique sur 48 bits) à
      ce préfixe
\end{itemize}
\end{frame}

\subsection{Sécurité et mobilité}

\begin{frame}
\frametitle{Sécurité et mobilité}
\begin{itemize}
\item La spécification IPv6 impose la présence d'une pile IPsec utilisable
      conjointement avec la pile IPv6
\item L'entète des paquets IPv6 permet l'inclusion des entètes IPsec sans
      encapsulation complète (l'entète {\it Next Header} permettant d'ajouter
      des options qui ne sont pas destinées aux routeurs est utilisé pour cela)
\item La mobilité (encore expérimentale) permet de changer de réseau, d'adresse
      globale, et de routes, sans perdre les connexions déjà établies
\item Elle se base essentiellement sur le {\it roaming}, concept utilisé dans
      la téléphonie mobile
\end{itemize}
\end{frame}

\section{Mise en place d'IPv6}

\subsection{Plan de mise en place}

\begin{frame}
\frametitle{Plan de mise en place}
\begin{enumerate}
\item Ajout du support du protocole IPv6 aux hôtes du réseau
\item Obtention d'un lien vers le backbone IPv6 (lien natif ou tunnel)
\item Configuration des routeurs (également des firewalls, de la QoS, etc...)
\item Configuration des serveurs
\item Mise en place de l'autoconfiguration et des hôtes finaux
\end{enumerate}
\end{frame}

\subsection{Logiciels}

\begin{frame}
\frametitle{GNU/Linux}
\begin{itemize}
\item Le noyau Linux gère IPv6 depuis sa version 2.2 (implémentation basée sur
      l'API BSD)
\item Support IPv6 disponible en chargeant le module ipv6 ou en compilant son
      noyau avec CONFIG\_IPV6
\item Gestion du filtrage, du suivi de connection, et de la QoS en IPv6 avec
      {\it netfilter}
\item Gestion du routage avec {\it iproute2}
\item Gestion du filtrage avec {\it ip6tables}
\item Démon d'autoconfiguration nommé {\it radvd}
\end{itemize}
\end{frame}

\begin{frame}
\frametitle{*BSD}
\begin{itemize}
\item Les systèmes *BSD intègrent la pile IPv6/IPsec KAME
\item Support IPv6 disponible en compilant le noyau avec {\it options IPV6}
      (les noyaux GENERIC supportent IPv6 par défaut)
\item Gestion du filtrage, du suivi de connection, et de la QoS en IPv6 avec
      {\it IPfilter}, {\it pf} et {\it ALTQ}
\item Gestion du routage avec la commande traditionnelle {\it route}
\item Démon d'autoconfiguration nommé {\it rtadvd}
\end{itemize}
\end{frame}

\begin{frame}
\frametitle{Windows}
\begin{itemize}
\item Support dans Windows XP/2003, pile expérimentale installable pour
      Windows 2000
\item Support IPv6 disponible en lançant la commande {\bf ipv6 install}
\end{itemize}
\end{frame}

\begin{frame}
\frametitle{Autres}
Parmi les autres systèmes permettant l'utilisation d'IPv6, on notera Solaris,
Mac OS X, Alpha Tru64 UNIX, Alpha OpenVMS, HP-UX, AIX, Netware, Irix, Cisco et
6Wind.
\end{frame}

\begin{frame}
\frametitle{Applications}
\begin{description}
\item[Web] Firefox, Opera, lynx, links, w3m, Apache (1.3+patch \& 2.0), thttpd
\item[FTP] lftp, NcFTP, wget, tnftp, ProFTPD, PureFTPD, tnftpd
\item[Email] Thunderbird, Sylpheed, Kmail, fetchmail, Exim, Postfix, Sendmail
\item[Accès distant] OpenSSH, TightVNC
\item[IRC] irssi, X-Chat, BitchX, KVIrc, Eggdrop
\item[Divers] Quake 1, Quagga, X.Org
\end{description}
\end{frame}

\subsection{Tunnels IPv6}

\begin{frame}
\frametitle{Tunnels IPv6}
\begin{itemize}
\item Encapsulation de paquets IPv6 à l'intérieur de paquets IPv4
\item Permet de relier un hôte n'ayant pas de connexion native IPv6 au 6Bone
\item Utilise une double-pile ({\it dual-stack})
\end{itemize}
\end{frame}

\subsection{NAT-PT}

\begin{frame}
\frametitle{NAT-PT}
\begin{itemize}
\item {\it Network Address Translation - Protocol Translation}
\item Permet à des hôtes IPv4-only et IPv6-only de communiquer sans installer
      de double pile
\item Utilise des ALG (Application Layer Gateway), qui sont des traducteurs
      IPv4-IPv6 dédiés à un protocole (comme DNS ou FTP)
\item Support limité (la technique de tunnelisation est souvent préférable)
\end{itemize}
\end{frame}

\subsection{IPv6 natif en ADSL}

\begin{frame}
\frametitle{IPv6 natif en ADSL}
\begin{itemize}
\item Nerim depuis 2001
\item Wanadoo/Orange (en expérimentation)
\item D'autres pays comme le Japon ou la Suisse comptent déjà plusieurs
      FAIs fournissant IPv6 à leurs clients
\item Nécéssite un logiciel PPP avec support IPv6
\item Pose des problèmes d'utilisation au dessus de PPPoE à cause de
      l'absence de {\it MSS clamping} (on contourne généralement ces problèmes
      en spécifiant le MTU à utiliser dans les paquets {\it Router
      Advertisements} lors de l'autoconfiguration)
\end{itemize}
\end{frame}

\section{Développement}

\subsection{gethostbyname2()}

\begin{frame}[fragile]
\frametitle{gethostbyname2()}
La fonction {\it gethostbyname2()} est une fonction apparue dans BIND 4.9.4
(l'implémentation de référence du protocole DNS), et permet de résoudre des
noms d'hôte en précisant la famille d'adresses souhaitée.

{\footnotesize
\begin{verbatim}
struct hostent
{
  char *h_name;       /* nom officiel */
  char **h_aliases;   /* liste d'alias */
  int  h_addrtype;    /* type d'adresse */
  int  h_length;      /* longueur d'adresse */
  char **h_addr_list; /* liste d'adresses */
};

struct hostent * gethostbyname2(const char *name, int af);
\end{verbatim}
}
\end{frame}

\subsection{getaddrinfo()}

\begin{frame}[fragile]
\frametitle{getaddrinfo()}
La fonction {\it getaddrinfo()} est une fonction qui permet d'utiliser
l'API des sockets sans être limité aux familles d'adresses et aux protocoles
existants. Elle est standard IEEE POSIX 1003.1g.

{\footnotesize
\begin{verbatim}
struct addrinfo
{
  int             ai_flags;      /* Options */
  int             ai_family;     /* AF_INET, AF_INET6 ou AF_UNSPEC */
  int             ai_socktype;   /* SOCK_STREAM, etc... ou 0 */
  int             ai_protocol;   /* 6, 17, etc... ou 0 */
  size_t          ai_addrlen;    /* longueur de l'adresse */
  struct sockaddr *ai_addr;      /* adresse */
  char            *ai_canonname; /* nom officiel */
  struct addrinfo *ai_next;      /* élément suivant de la liste */
};

int getaddrinfo(const char *node,
                const char *service,
                const struct addrinfo *hints,
                struct addrinfo **res);
\end{verbatim}
}
\end{frame}

\begin{frame}[fragile]
\frametitle{getaddrinfo() - Exemple}
Exemple (disponible dans la page de man de getaddrinfo() de NetBSD) :

{\scriptsize
\begin{verbatim}
    struct addrinfo hints, *res, *res0;
    int error;
    int s;
    const char *cause = NULL;

    hints.ai_family = PF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_flags = 0;
    hints.ai_protocol = 0;
    hints.ai_addrlen = 0;
    hints.ai_canonname = NULL;
    hints.ai_addr = NULL;
    hints.ai_next = NULL;
    error = getaddrinfo("www.kame.net", "http", &hints, &res0);
    if (error) {
        errx(1, "%s", gai_strerror(error));
        /*NOTREACHED*/
    }
\end{verbatim}
}
\end{frame}

\begin{frame}[fragile]
\frametitle{getaddrinfo() - Exemple}
{\scriptsize
\begin{verbatim}
    s = -1;
    for (res = res0; res; res = res->ai_next) {
        s = socket(res->ai_family, res->ai_socktype,
            res->ai_protocol);
        if (s < 0) {
            cause = "socket";
            continue;
        }

        if (connect(s, res->ai_addr, res->ai_addrlen) < 0) {
            cause = "connect";
            close(s);
            s = -1;
            continue;
        }

        break;  /* okay we got one */
    }
    if (s < 0) {
        err(1, "%s", cause);
        /*NOTREACHED*/
    }
    freeaddrinfo(res0);
\end{verbatim}
}
\end{frame}

\section{Conclusion}

\subsection{Références}

\begin{frame}
\frametitle{Références}
\begin{description}
\item[\url{http://www.faqs.org/rfcs/rfc2460.html}] \ \\ La spécification IPv6
\item[\url{http://www.ipv6.org/}] \ \\ Le site d'introduction IPv6
\item[\url{http://www.kame.net/}] \ \\ Le projet KAME
\item[\url{http://www.sixxs.net/}] \ \\ Le tunnel broker SixXS
\item[\url{http://www.netbsd.org/fr/Documentation/network/ipv6/}] \ \\
     La documentation IPv6 de NetBSD
\item[\url{http://livre.point6.net/}] \ \\ Le livre du G6
\item[\#ipv6-fr sur irc.freenode.net]
\end{description}
\end{frame}

\end{document}
