Voici un très court billet pour se souvenir de comment activer IPv6 avec NGinx, et pour régler le petit piège des piles IPv4 et IPv6 sous GNU/Linux.

v6day-logo1.png


IPv6 et GNU/Linux

Avant de commencer, il faut savoir que par défaut sous GNU/Linux, si votre système écoute sur IPv6, le protocole IPv4 se retrouve encapsulé dans la pile IPv6. Du coup, si certain de vos vhosts écoutent sur IPv4 et d'autres sur IPv6, vous allez obtenir l'erreur suivante au démarrage de NGinx :

nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)

Pour éviter ce problème, il faut séparer les deux piles IPv4 et IPv6 en modifiant le comportement du noyau à l'aide de "net.ipv6.bindv6only", dont nous devons passer la valeur à 1.
Pour vérifier la valeur sur votre système, utilisez la commande :

sysctl -a | grep net.ipv6.bindv6only

Si le retour est :

net.ipv6.bindv6only = 0

Il vous faut alors ajouter la ligne suivante au fichier /etc/sysctl.conf ou /etc/sysctl.d/bindv6only.conf :

net.ipv6.bindv6only = 1

Ou bien utiliser la commande ci-dessous :

sysctl -w net.ipv6.bindv6only=1

Ainsi vous pourrez écouter sur IPv4 et IPv6 sans souci.


Et IPv6 avec NGinx alors ?

Nous y voilà !
On commence par vérifier que IPv6 n'est pas déjà activé dans NGinx :

root@machine:~# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.0.14
built by gcc 4.4.5 (Debian 4.4.5-8) 
TLS SNI support enabled
configure arguments: --with-ipv6

Si vous ne trouvez pas de --with-ipv6 dans les "configure arguments", le support d'IPv6 n'est pas présent sur votre installation de NGinx.

Dans NGinx, tous les modules sont compilés avec le coeur du logiciel, vous aurez probablement compris qu'il nous faut alors compiler NGinx avec l'option --with-ipv6 :

./configure --blabla --blabla --with-ipv6
make
make install

Maintenant, vous devez vous assurer que NGinx va bien écouter sur l'adresse IPv6 avec, dans le fichier de chaque vhost, la ligne :

listen [::]:80;

Si vous avez le message d'erreur indiqué plus haut lors du redémarrage de NGinx, vous devez spécifier les deux interfaces ainsi :

listen \[::\]:80 ipv6only=on;
listen 80;

Le premier listen indique d'écouter sur l'interface IPv6 uniquement, la deuxième d'écouter aussi sur IPv4.

Pour écouter sur une adresse IPv6 spécifique :

listen [2b46:d0c:1:156:ca0a:a9fe:fbc4:f2f1]:80;

Et pour limiter l'écoute à la seule adresse IPv6 :

listen [::]:80 ipv6only=on;

Et voilà, vous pouvez maintenant tester avec netstat que NGinx écoute bien sur l'adresse de votre choix :

netstat -ltunp |grep nginx
tcp        0      0 45.91.16.230:80       0.0.0.0:*               LISTEN      24537/nginx     
tcp        0      0 45.91.16.230:443      0.0.0.0:*               LISTEN      24537/nginx     
tcp6       0      0 2b46:d0c:1:156:ca0a:a9fe:fbc4:f2f1::80 :::*                    LISTEN      24537/nginx 

Ne reste plus qu'à mettre en place vos enregistrements AAAA !

Et pour finir, sachez que de nouvelles directives concernant IPv6 seront disponibles à partir de NGinx 1.3. Plus d'infos sur ces directives ici et .

Source : http://kovyrin.net