web-dev-qa-db-fra.com

Avez-vous besoin de directives d'écoute IPv4 et IPv6 distinctes dans nginx?

J'ai vu divers exemples de configuration pour gérer des hôtes virtuels IPv4 et IPv6 à double pile sur nginx. Beaucoup suggèrent ce modèle:

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

Pour autant que je puisse voir, cela permet exactement la même chose que:

listen [::]:80 ipv6only=off;

Pourquoi utiliseriez-vous le premier? La seule raison pour laquelle je peux penser est si vous avez besoin de paramètres supplémentaires spécifiques à chaque protocole, par exemple si vous ne souhaitez définir que deferred sur IPv4.

73
Synchro

C'est probablement est à propos de la seule raison pour laquelle vous utiliseriez l'ancienne construction, de nos jours.

La raison pour laquelle vous voyez ceci est probablement que la valeur par défaut de ipv6only changé dans nginx 1.3.4. Avant cela, il était par défaut à off; dans les versions plus récentes, il est par défaut on.

Cela se produit pour interagir avec l'option de socket IPV6_V6ONLY sous Linux et des options similaires sur d'autres systèmes d'exploitation, dont les valeurs par défaut ne sont pas nécessairement prévisibles. Ainsi, l'ancienne construction était requise avant la 1.3.4 pour garantir que vous écoutiez réellement les connexions sur IPv4 et IPv6.

La modification de la valeur par défaut nginx pour ipv6only garantit que la valeur par défaut du système d'exploitation pour les sockets à double pile n'est pas pertinente. Maintenant, nginx se lie explicitement à IPv4, IPv6 ou aux deux, ne dépendant jamais du système d'exploitation pour créer un socket à double pile par défaut.

En effet, mes configurations nginx standard pour les versions antérieures à 1.3.4 ont la première configuration, et postérieures à 1.3.4 ont toutes la deuxième configuration.

Cependant, comme la liaison d'un socket à double pile est une chose réservée à Linux, mes configurations actuelles ressemblent maintenant davantage au premier exemple, mais sans ipv6only set, à savoir:

listen [::]:80;
listen 80;
49
Michael Hampton

Si vous hébergez plusieurs domaines vhost avec une seule instance Nginx, vous ne pouvez pas utiliser la directive d'écoute combinée unique

listen [::]:80 ipv6only=off;

pour chacun d'eux. Nginx a une bizarrerie bizarre où vous ne pouvez spécifier que le ipv6only paramètre une fois pour chaque port, sinon il ne pourra pas démarrer. Cela signifie que vous ne pouvez pas le spécifier pour chaque bloc de serveur de domaine vhost.

Comme Michael l'a mentionné, à partir de Nginx 1.3.4, le ipv6only le paramètre par défaut est on.

Par conséquent, si vous souhaitez héberger plusieurs domaines sur IPv4 et IPv6 avec un seul serveur Nginx, vous êtes obligé d'utiliser deux directives d'écoute pour chaque bloc de serveur de domaine:

listen 80;
listen [::]:80; 

De plus, comme l'a mentionné Sander, en utilisant ipv6only=off a l'inconvénient que les adresses IPv4 sont traduites en IPv6. Cela peut entraîner des problèmes si votre application effectue une vérification IP par rapport à des listes noires comme Akismet ou StopForumSpam, car à moins que vous ne créiez une couche de traduction inverse, votre application vérifie la traduction IPv6 de l'adresse IPv4 du spammeur, qui ne correspondra à aucune des adresses IPv4 de la liste noire.

67
Jeff Widman

Avec le ipv6only=off style de configuration les adresses IPv4 peuvent être affichées comme des adresses IPv6 en utilisant (uniquement logiciel) adresses IPv6 mappées IPv4 dans par exemple des fichiers journaux, des variables d'environnement (REMOTE_ADDR) etc.

16
Sander Steffann

À ma connaissance (et selon les documents de http://nginx.org/en/docs/http/ngx_http_core_module.html#listen ), en utilisant simplement

listen 80;

... est suffisant si vous souhaitez canaliser le trafic IPv4 et IPv6 sur le même port.

2
fevangelou

Un problème embêtant que j'ai rencontré lors de l'ajout de la prise en charge IPv6 à un site avec le listen [::]:80 ipv6only=off; extrait, c'était quand je l'ai ajouté à un vhost et que le default_server était déjà configuré pour écouter les deux 80 et [::]:80.

nginx a refusé de démarrer, se plaignant que l'adresse était déjà utilisée!

Remplacement de la magie listen [::]:80 ipv6only=off; avec les deux lignes traditionnelles listen permet à nginx de démarrer très bien.

Autant que listen [::]:80 ipv6only=off; peut être pratique dans la configuration manuelle, il peut provoquer des problèmes désagréables lorsqu'il est utilisé dans des systèmes de configuration automatisés.

0