Un réseau local en IPv6 avec un fournisseur d'accès Internet IPv4 avec Debian GNU/linux

IPv6 (Internet Protocol Version 6) est une nouvelle version du protocole Internet (IP) désigné pour succéder à la version actuelle IPv4, le premier protocole IP utilisé depuis 1981. Parmis ses nombreux avantages, on note son espace d'adressge vastement plus grand et une plus grande facilité d'allocation des adresses. En raison des limites d'IPv4, les fournisseurs utilisent souvent des méthodes restrictives pour partager des adresses (NAT), ce qui a, entre autres, pour effet de ralentir le développement de nouvelles technologies puisque l'Internet ne fonctionne plus comme un réseau normal.

De plus, lorsqu'il n'y aura plus d'adresses IPv4 libres (vers l'été 2011), les coûts pour l'hébergement et pour l'accès à Internet continueront d'augmenter encore plus rapidement puisque les fournisseurs créeront un marché basé sur une ressource virtuelle artificiellement limitée. Des pays comme le Japon, la Korée, la Chine et plusieurs pays trans-continentaux sont déjà en IPv6 puisqu'ils seront parmis les plus affectés par cette crise. Le Canada était également un précurseur dans le développement d'IPv6 avec le réseau Canari, mais l'inaction des principaux fournisseurs (Bell, Vidéotron, Rogers) a freiné le momentum.

En attendant d'avoir un fournisseur d'accès à Internet qui supporte l'IPv6 nativement, comme Teksavvy (beta), on peut utiliser un tunnel "ipv6 sur ipv4". Le nombre de sites déjà en IPv6 est surprenant. J'ai fait le test chez moi, voici quelques notes sur l'implémentation. Pour plus de détails sur les concepts derrière le fonctionnement d'IPv6, consulter les références, dont l'article Wikipedia et l'article plus en détail sur debian-administration.

Créer un compte chez Tunnelbroker.net

  • Créer un compte (gratuit) sur http://www.tunnelbroker.net (géré par Hurricane Electric), service qui offre des /64, /48 ou même annoncer ses propres IPs par BGP. Apparemment on peut même y connecter des serveurs (haut débit).
  • Créer un nouveau tunnel (si l'adresse à la maison change souvent, il y a un URL qu'on peut utiliser par un cron pour mettre à jour l'adresse). Le lien pour créer un nouveau tunnel est au bas de la page d'accueil.
  • Consulter les informations du tunnel pour obtenir l'adresse de la plage d'IPs

Tunnel broker tunnel details example.

Configurer IPv6 sur le routeur (à la maison)

Configurer une interface avec le tunnel: vim /etc/network/interfaces

auto he-ipv6
iface he-ipv6 inet6 v4tunnel
    # Remplacer les variables ci-dessous par les vraies adresses
    endpoint $SERVER_IPv4
    address $CLIENT_IPv6
    netmask 64
    local $CLIENT_IPv4
    gateway $SERVER_IPv6
    ttl 64

Activer l'interface:

# ifup he-ipv6

Ajouter un serveur DNS (ex: celui de hurricane electric est 2001:470:20::2) dans /etc/resolv.conf.

Rendu ici, on peut accéder à des sites en IPv6 à partir du routeur:

# ping6 ipv6.google.com

Configurer IPv6 sur le réseau local

Assigner une adresse IPv6 à l'interface réseau interne (dans mon cas, eth1). Dans /etc/network/interfaces, ajouter:

iface eth1 inet6 static
    address $ROUTED64::1
    netmask 64

où $ROUTED64::1 est la première adresse du bloc que Tunnel broker nous a assigné.

Activer l'interface:

# ifup eth1

Si l'interface est déjà active, rouler dans un "screen" et faire "ifdown eth1 && ifup eth1". Si ce n'est pas dans screen, ça risque de couper la connexion réseau et la machine deviendra inaccessible.

Activer le "packet forwarding": éditer le fichier /etc/sysctl.conf et décommenter la ligne :

net.ipv6.conf.all.forwarding=1

Puis appliquer le changement en exécutant la commande:

# sysctl -p

Installer le package radvd: apt-get install radvd, puis éditer son fichier de configuration /etc/radvd.conf :

interface eth1
{
  AdvSendAdvert on;
  MaxRtrAdvInterval 30;

  prefix 2001:XXXX:XXX:XXXX::1/64
  {
  AdvOnLink on;
  AdvAutonomous on;
  AdvRouterAddr off;
  AdvValidLifetime 300;
  AdvPreferredLifetime 120;
  };
};

Attention ici de bien mettre la bonne interface (eth1 dans mon cas) et l'adresse de préfixe est la même que celle que nous avons assigné à eth1.

Puis redémarrer radvd :

# invoke-rc.d radvd restart

Pour se divertir, rouler tcpdump sur le routeur pour observer le traffic:

# tcpdump -i eth1 ip6

Maintenant, à partir d'un poste de travail sur le réseau, redémarrer l'interface réseau:

desktop# ifdown eth0
desktop# ifup eth0

Vous devriez voir sur le tcpdump du routeur un peu de discussion à propos de "router solicitation/advertisement". Puis vérifier sur le desktop qu'une adresse a été assignée à l'interface réseau:

desktop# ifconfig eth0
[...]
adr inet6: 2001:xx:xx:xx:xx:xx:xx:9bcd/64 Scope:Global

Là encore, temporairement, on va ajouter le serveur DNS de Hurricane Electric dans notre /etc/resolv.conf pour faire des tests:

nameserver 2001:470:20::2

Puis tester à partir du poste de travail:

desktop# ping6 ipv6.google.com

Résolution des DNS

On veut éviter de modifier notre /etc/resolv.conf à la main à chaque fois que le client DHCP va chercher une nouvelle adresse. La solution la plus simple est d'installer un serveur de cache DNS sur le routeur (ou ailleurs sur le réseau local):

# apt-get install bind9

Puis éditer le fichier de configuration /etc/bind/named.conf.options

acl mynetworks {
  localhost;
  192.168.0.0/16;           // votre réseau IPv4
  2001:XXXX:XXXX:XXXX::/64; // votre tunnel IPv6 /64
  2001:XXXX:XXXX:XXXX::/64; // votre bloc IPv6 "routé" /64
};

options {
  directory "/var/cache/bind";
  allow-query { mynetworks; };
  forwarders {
      2001:470:20::2; // serveur DNS Hurricane Electric
  };

  auth-nxdomain no;
  listen-on-v6 { any; };
};

Dans l'exemple ci-dessus, on utilise le serveur DNS de Hurricane Electric (2001:470:20::2). Un des avantages de cette approche est que www.google.com est "whitelisté" sur H.E. À cause de certains systèmes qui avaient des problèmes d'IPv6, Google avait décidé d'annoncer leur adresse IPv6 seulement sur ipv6.google.com, mais les fournisseurs d'accès à Internet (tels que H.E.) peuvent faire la demande d'être "whitelisté" pour que www.google.com retourne une adresse IPv6. .. quoique, si vous avez le plugin Firefox HTTPS everywhere, vous serez redirigé vers encrypted.google.com, qui lui supporte IPv6.

Reste juste à modifier la configuration de DHCPd sur le routeur pour qu'il propage le serveur cache DNS, i.e. dans /etc/dhcp3/dhcpd.conf, utiliser 192.168.XX.1, redémarrer dhcpd, renouveller le dhcp sur un poste de travail, puis tester:

$ dig +short google.com AAAA
2001:4860:800b::67
$ dig +short www.v6.facebook.com AAAA
2620:0:1cfe:face:b00c::3
$ dig +short www.debian.org AAAA
2607:f8f0:610:4000:211:25ff:fec4:5b28

Automatiser la reconfiguration du tunnel si l'adresse IPv4 est dynamique

La majorité des fournisseurs d'accès à Internet (résidentiels) fournissent une adresse IPv4 dynamique (qui change de temps en temps). Puisque tunnelbroker doit connaître l'adresse IPv4 de notre côté, il faut les aviser lorsque notre IP change.

Ils ont un service web disponible à l'adresse https://ipv4.tunnelbroker.net/ipv4_end.php

J'ai fait le script suivant, placé dans /usr/local/bin/he_tunnel_update.sh

#!/bin/sh

USERID="(chaîne hexa-décimale de 32 caractères)"
MD5PASS="(... faire echo -n [mot de passe] | md5sum ... )"
GTUNID="... tunnel ID ... "
IPV4ADDR="AUTO"

wget --quiet --no-check-certificate -O - "https://ipv4.tunnelbroker.net/ipv4_end.php?ipv4b=$IPV4ADDR&pass=$MD5PASS&user_id=$USERID&tunnel_id=$GTUNID"

Rendre exécutable:

chmod 0755 /usr/local/bin/he_tunnel_update.sh

Et ajouter un cron dans /etc/cron.d/he_tunnel_update:

15 * * * *  nobody   /usr/local/bin/update_he_tunnel.sh  | grep -v "That IPv4 endpoint is already in use"

Ceci effectuera la mise à jour à toutes les heures et nous enverra un courriel lorsque l'adresse IP change. (TODO: au fait, j'ignore s'il faut faire un down/up de l'interface lorsque l'adresse IP change)

TODO: Bloquer/limiter les accès aux réseau local

En IPv4, la majorité du monde faisaient du NAT pour gérer leur réseau local. Les adresses locales étaient donc des adresses privées non-routables, la gestion du firewall était presque implicite. Mais avec IPv6, justement on veut un Internet "normal", c'est à dire toujours "peer to peer", donc les postes de travail sont tous directement accessibles à partir d'Internet.

... on fait quoi avec ça? TODO Chez moi j'ai uniquement ssh d'ouvert, et j'ai fail2ban pour empêcher les attaques par brute-force. Ce n'est pas quelque chose qui m'inquiète vraiment.

J'ai aussi installé une version récente de arno-iptables-firewall (voir la section suivante).

IPv6 et arno-iptables-firewall

Le logiciel "arno-iptables-firewall" dans Debian est un excellent logiciel pour configurer le pare-feu (iptables) et pour activer le "ip masquerading" (NAT) en IPv4. Cependant, il bloque les tunnels IPv6.

Selon mes tests, il faut:

  • Utiliser la version 2.x du logiciel (dans Debian "testing" ou "unstable")
  • Ajouter l'interface du tunnel (ex: he-ipv6) dans /etc/arno-iptables-firewall/firewall.conf, dans la variable "EXT_IF", activer IPv6 (IPV6_SUPPORT=1)
  • Activer le support "IPv6 over IPv4" dans le plugin: /etc/arno-iptables-firewall/plugins/ipv6-over-ipv4.conf

Contenu de /etc/arno-iptables-firewall/plugins/ipv6-over-ipv4.conf:

ENABLED=1
IPV6_OVER_IPV4_SERVER="0/0"
IPV6_OVER_IPV4_IF="ppp0 he-ipv6"

Puis redémarrer le pare-feu:

# service arno-iptables-firewall restart

Et desfois descendre/remonter l'interface he-ipv6 débloque des choses...

# ifdown he-ipv6
# ifup he-ipv6

Gestion des DNS pour un domaine spécifique (optionnel)

Cette étape est optionnelle, mais he.net offre un service DNS gratuit. Il permet d'avoir des entrées AAAA (pour que votre domaine example.org puisse avoir une adresse IPv4 et IPv6), mais on peut également ajouter une zone pour gérer les «reverse DNS».

Le processus est assez clair sur https://dns.he.net. Ne pas oublier que la gestion de la zone DNS normale est séparée de la zone pour les requêtes inverses.

J'utilisé ça pour assigner une adresse IPv6 à mon domaine principal (www.bidon.ca), mais aussi pour assigner des sous-domaines à mes postes de travail chez moi (truc.maison.bidon.ca).

Petit truc également pour les reverse DNS, quoique pas nécessaire si on utilise l'interface de he.net:

$ ipv6calc 2001:470:XXX:XXX::1 --out revnibbles.arpa
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.X.X.X.X.X.X.X.X.0.7.4.0.1.0.0.2.ip6.arpa.

Hors-sujet

IPv6 réserve des plages spéciales pour des usages spécifiques:

  • Préfixe pour la documentation: 2001:db8::/32
  • Préfixe pour les adresses «link local»: fe80::/10
  • Préfixe pour le multi-cast: ff00::/8

Références

https://secure.wikimedia.org/wikipedia/en/wiki/IPv6 http://www.dslreports.com/forum/r23849317-IPv6-beta http://www.debian-administration.org/article/Running_IPv6_in_practice http://n900-ipv6.garage.maemo.org/ http://techreport.com/forums/viewtopic.php?f=7&t=75560

Tag: