nginx : Séparer la pile IPv4 et IPv6

Par défaut sous les kernel Linux, contrairement au BSD, la pile IPv4 est encapsulé dans la pile IPv6 si votre service écoute en IPv6, ainsi les adresses IPv4 ressemble à ceci : ::ffff:1.1.1.1.

Et bien sûre ça peut poser quelques soucis … mon serveur se faisait flooder par une personne, voulant le bloquer sans utiliser iptables, j’ai décidé de faire un deny dans la conf nginx puis de reload le service, sauf qu’à cause de cette notation IPv4-to-IPv6, ben ça fonctionne pas !

L’astuce consiste donc à changer le flag système net.ipv6.bindv6only à 1 (avec sysctl) pour séparer les couches IPv4 et IPv6 et à faire écouter nginx sur IPv6 et IPv4 comme ceci :

listen [::]:80 ipv6only=on; # listen for IPv6 only traffic on IPv6 sockets

listen 80; # listen also for IPv4 traffic on “regular” IPv4 sockets

Et voilà le tour est joué ! Et vos logs sont un peu plus lisibles au lieu de ce ::ffff àlacon®