Cet article est le complément du précédent. Pour des raisons pratiques et de longueur de texte (sic), j’ai décidé de mettre toute la configuration ipv6 dans un article à part.

De l’ipv6

Mon FAI ne fournit pas encore d’ipv6, et le service de tunnel que j’utilisais auparavant (Sixxs) est en passe de fermer. J’ai donc décidé de me rabattre sur tunnelbroker de HE, qui a l’avantage d’avoir des configurations statiques sur OpenBSD avec une interface virtuelle gif(4), quand Sixxs a lui un système dynamique (il faut lancer un process aiccu pour établir le tunnel. Le tunnel tombe des fois, on sait pas trop pourquoi.).

Au passage, je vous recommande la certification ipv6 de HE. C’est assez facile à faire et à la fin, vous avez un élégant T-shirt proclamant fièrement à la face du monde que vous êtes un geek, un gourou de l’internet.

Oui, je suis un Sage de l’Ipv6.

Je vais donc décrire encore une fois mon installation, et vous pourrez très facilement l’adapter à votre situation, que vous ayez l’intention d’utiliser le tutoriel précédent ou pas.

Explications de base

Il faut globalement recopier la configuration/topologie ipv4 en ipv6.

HE va vous donner automatiquement un /64. Si vous avez lu mon article sur ipv6 alors vous savez que votre réseau est à sa taille minimale : vous ne pouvez pas le subdiviser davantage. Si vous avez plusieurs sous-réseaux en ipv4 (un Ethernet et un Wifi par exemple), il vous faudra autant de sous-réseaux ipv6, ce qui signifie qu’il vous faudra alors un réseau plus large. HE vous donnera un /48 sur requête, si le serveur sur lequel vous déclarez le tunnel a de la place.

Sur le routeur lui-même

Adresse publique : gif0 - le tunnel

Pour que votre tunnel fonctionne, il vous faut une connectivité ipv4 active sur votre routeur.

Une fois connecté sur tunnelbroker, les statistiques des serveurs sont disponibles ici, à comparer avec les serveurs disponibles sur la page de création de tunnel.

Choisissez un serveur proche de chez vous, mais pas trop chargé si vous voulez demander un /48.

Dans le champs Ipv4 Endpoint, mettez votre adresse ipv4 routable. Par exemple dans ma configuration, c’est l’adresse de re0 sur le routeur Alix: 87.63.104.30. Et voila, vous devez avoir un tunnel avec /64.

Si besoin, vous devez alors demandez un /48 maintenant.

Le deuxième onglet de la page tunnel vous proposera une commande pour activer votre connectivité ipv6.

Vous n’avez normalement pas encore d’interface virtuelle gif. Ce sera donc gif0 que vous configurez dans un fichier /etc/hostname.gif0 créé pour l’occasion avec nano (à installer) ou vi (présent en base).

La première ligne du fichier reprend la première ligne de la conf’ de tunnelbroker à partir de tunnel. Les lignes suivantes sont préfixées de !.

Par exemple, tunnelbroker me dit de lancer cette commande:

ifconfig gif0 tunnel 87.63.104.30 216.66.87.14
ifconfig gif0 inet6 alias 2001:470:1f1a:db::2 2001:470:1f1a:db::1 prefixlen 128
route -n add -inet6 default 2001:470:1f1a:db::1

Ce qui donne chez moi, dans hostname.gif0:

tunnel 87.63.104.30 216.66.87.14
!ifconfig gif0 inet6    2001:470:1f1a:db::2 2001:470:1f1a:db::1 prefixlen 128
!route -n add -inet6 default 2001:470:1f1a:db::1

Il n’y a plus qu’à activer :

doas sh /etc/netstart gif0    

Tentez un ping6 :

stephane@alix:/home/stephane ping6 www.google.com
PING6 www.google.com (2a00:1450:400f:804::2004): 24 data bytes
32 bytes from 2a00:1450:400f:804::2004, icmp_seq=0 hlim=50 time=92.946 ms
32 bytes from 2a00:1450:400f:804::2004, icmp_seq=1 hlim=50 time=93.678 ms
^C--- www.google.com ping6 statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/std-dev = 92.946/93.312/93.678/0.366 ms

C’est bon !

Adresses du lan

Vous devez maintenant choisir comment addresser votre lan. Pour ma part, j’ai donné à mes interfaces locales, re2 et athn0 des adresses telles que :

re2     $prefix48:e2::
athn0   $prefix48:a0::

De cette façon, les adresses des appareils connectés indiquent forcement s’ils sont sur Ethernet (eth -> re2 -> adresse ipv6 en e2…) ou en wifi. Ça n’a l’air de rien, mais ça pourrait s’averer utile et ça n’est pas plus compliqué que d’avoir des adresses en $prefix48:1::, $prefix48:2::.

tunnelbroker vous indique quel préfixe à utiliser sur la page du tunnel, à la ligne Routed IPv6 Prefixes.

Il est d’usage de donner au routeur l’adresse prefix::. Mais ce n’est pas obligé (OVH, par exemple, fait parfois l’opposé). C’est, pour ma part, ce que j’ai fait.

hostname.re2

inet            10.0.0.1                255.255.0.0     10.0.255.255
inet6           2001:470:2099:e2::      64
up

Sysctl

Il faut autoriser la redirection des paquets à travers le noyau du routeur. Donc dans /etc/sysctl.conf :

net.inet6.ip6.forwarding=1      # 1=Permit forwarding (routing) of IPv6 packets
net.inet6.ip6.accept_rtadv=0    # 1=Permit IPv6 autoconf, 0=refuse autoconf
net.inet6.ip6.redirect=0
net.inet6.ip6.ifq.maxlen=1024

Filtrage dans PF

Il faut apparement laisser passer explictement les paquets dans pf.conf. Je vais continuer d’explorer la question.

Ici, on laisse passer tous les paquets à destination du serveur web arrivant sur l’interface ipv6 internet (la sortie du tunnel ipv6 donc). La ligne s’adapte à tous les autres services que vous hébergez.

pass in on $intv6       proto tcp       from any to $blackblock_ipv6    port { https,www }

NAT64

Pour pouvoir utiliser NAT64, il vous faut dans le pf.conf du routeur:

# nat64
# trouvé ici : http://firstyear.id.au/entry/19
pass in         quick   inet6 from any to 64:ff9b::/96 af-to inet from (egress:0) keep state rtable 0

Dans les faits, Unbound (conf’ plus bas dans l’article) va fabriquer une ipv6 bidon pour toutes les requêtes qui n’ont pas de AAAA en retour. Votre ordinateur peut alors contacter l’adresse distante en ipv6, sans se douter que c’est un faux. C’est le routeur qui se charge de faire la liaison.

Dnsmasq

Dnsmasq va agir comme serveur dhcpv6, dns local et démon d’avertissement de routes (radvd). Vous trouverez le manuel ici, mais je vais quand même vous décrire la chose la plus importante.

Le gros truc, c’est quand même l’option dhcp-range. J’ai mis ici un segment dhcp de ::100 à ::1000 sur chaque interface (constructor). Dnsmasq va se servir de la configuration réseau de l’interface (adresse en elle-même et masque de sous-réseau), en déduire le préfixe, et prendre une adresse entre les deux bornes choisies.

Ra-names va calculer l’adresse SLAAC, autogénérée, de chaque machine qui lui fera une requete dhcpv4, et la tester par un ping6. Si l’adresse répond, elle est stockée dans le DNS local.

Slaac va dire aux machines d’utiliser les adresses autogénérées et Ra-stateless permet d’activer un service dhcpv6 pour les adresses.

Pour le dire clairement, cette conf’ permet d’avoir un beau mélange et de satisfaire tous les clients possibles et imaginables (je pense). On peut paramétrer la machine (adresses et résolveurs DNS) par dhcpv6 et/ou router-advertissement à la fois.

Les extensions pour protection de la vie privée ne sont pas prises en charge par Dnsmasq. Ceci crée des adresses ipv6 au hasard sans demander son avis à qui que ce soit. Ce n’est pas un problème en soit, sauf que Dnsmasq ne pourra pas vous indiquer la machine en question en cas de bug dans le réseau local.
Bortzmeyer, un autre Stéphane, gage d’excellence, indique bien que ce peut-être une plaie (à noter que ssh est sacrement ralenti par ces adresses). Ces extensions peuvent être utiles et c’est à vous de voir si vous voulez les utiliser.

# If you want dnsmasq to listen for DHCP and DNS requests only on
# specified interfaces (and the loopback) give the name of the
# interface (eg eth0) here.
# Repeat the line for more than one interface.

interface=re2
interface=athn0

server=2001:470:2099:e2::3

# Set this (and domain: see below) if you want to have a domain
# automatically added to simple names in a hosts-file.
expand-hosts

# Set the domain for dnsmasq. this is optional, but if it is set, it
# does the following things.
# 1) Allows DHCP hosts to have fully qualified domain names, as long
#     as the domain part matches this setting.
# 2) Sets the "domain" DHCP option thereby potentially setting the
#    domain of all systems configured by DHCP
# 3) Provides the domain part for "expand-hosts"
domain=22decembre.eu

dhcp-range=::100,::1000,constructor:athn0,ra-names,slaac,ra-stateless
dhcp-range=::100,::1000,constructor:re2,ra-names,slaac,ra-stateless

enable-ra

# Send DHCPv6 option for namservers as the machine running dnsmasq
dhcp-option=option6:dns-server,[::],[2001:470:2099:e2::3]

Sur le serveur principal

Unbound

Il faut ajouter toute la conf’ relative à ipv6. Rien de spécifique en dehors de DNS64. Par contre, ne pas oublier les adresses d’écoute spécifiques, coordonnées avec Dnsmasq.

server:
    verbosity: 0

    interface: ::1
    interface: 2001:470:2099:e2::3
    interface: fe80::be5f:f4ff:fe73:a7e0%re0

    do-ip6: yes
    do-udp: yes
    do-tcp: yes

    access-control: ::0/0 refuse
    access-control: ::1/128 allow
    access-control: fe80::/64 allow
    access-control: 2001:470:2099::/48 allow

    log-queries: no
    val-log-level: 2

    root-hints: "named.cache"

    module-config: "dns64 validator iterator"

    dns64-prefix: 64:FF9B::/96

forward-zone:
    name: "22decembre.eu."
    forward-addr: 2001:470:2099:e2::

forward-zone:
    name: "22december.dk."
    forward-addr: 2001:470:2099:e2::

forward-zone:
    name: "9.9.0.2.0.7.4.0.1.0.0.2.ip6.arpa."
    forward-addr: 2001:470:2099:e2::

On remarquera la forward-zone qui renvoie les requêtes locales, en particulier les requêtes inverses ipv6 sur le routeur (autrement dit vers Dnsmasq).

Le truc aussi à noter, c’est que tout votre réseau local en prefix/48 doit être dans access-control : ça signifie que le réseau local a effectivement le droit de faire des requêtes.

adresse du serveur : re0

Le serveur est bien entendu mis en ip fixe, en ipv4 et ipv6.

J’aurais pû mettre aussi l’ip qui aurait étée générée avec SLAAC. On peut mettre autant d’adresses qu’on veut. Je n’en ai mis qu’une.

/etc/hostname.re0

inet6           2001:470:2099:e2::2      64
inet6           2001:470:2099:e2::3      64
inet            10.0.0.2        255.255.0.0     10.0.255.255
inet            10.0.0.3        255.255.0.0     10.0.255.255
up

Hosts

Les fichiers hosts, sur le routeur et le serveur doivent simplement être complétés avec les différentes adresses ipv6 fixes des machines. En toute logique, ils se ressemblent toujours beaucoup entre les deux.

127.0.0.1       localhost
::1             localhost

2001:470:2099:e2::2             blackblock www.22decembre.eu photos.22decembre.eu
10.0.0.2                        blackblock www.22decembre.eu photos.22decembre.eu

10.0.0.3                        unbound
2001:470:2099:e2::3             unbound

10.0.0.1                        alix
2001:470:2099:e2::              alix

10.1.0.1                        alix
2001:470:2099:a0::              alix

Ce qui manque

Il y a toujours des parties de l’OS qui ne parlent pas ipv6. Je pense en particulier à spamd(8), ce qui m’interdit d’annoncer mon serveur de courrier en ipv6.