it-swarm.com.de

Benötigen Sie separate IPv4- und IPv6-Listen-Direktiven in Nginx?

Ich habe verschiedene Konfigurationsbeispiele für den Umgang mit virtuellen Dual-Stack-IPv4- und IPv6-Hosts auf Nginx gesehen. Viele schlagen dieses Muster vor:

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

Soweit ich sehen kann, erreicht dies genau das Gleiche wie:

listen [::]:80 ipv6only=off;

Warum sollten Sie die erstere verwenden? Der einzige Grund, an den ich denken kann, ist, wenn Sie zusätzliche Parameter benötigen, die für jedes Protokoll spezifisch sind, beispielsweise wenn Sie nur deferred auf IPv4 festlegen möchten.

73
Synchro

Das ist wahrscheinlich ist der einzige Grund, warum Sie heutzutage das frühere Konstrukt verwenden würden.

Der Grund, warum Sie dies sehen, ist wahrscheinlich, dass der Standardwert von ipv6only geändert in nginx 1.3.4. Zuvor war standardmäßig off; In neueren Versionen wird standardmäßig on verwendet.

Dies geschieht zufällig mit der Socket-Option IPV6_V6ONLY unter Linux und ähnlichen Optionen unter anderen Betriebssystemen, deren Standardeinstellungen nicht unbedingt vorhersehbar sind. Daher war das frühere Konstrukt vor 1.3.4 erforderlich, um sicherzustellen, dass Sie tatsächlich auf Verbindungen sowohl auf IPv4 als auch auf IPv6 warten.

Die Änderung der Nginx-Standardeinstellung für ipv6only stellt sicher, dass die Standardeinstellung des Betriebssystems für Dual-Stack-Sockets irrelevant ist. Jetzt bindet nginx entweder explizit an IPv4, IPv6 oder beides, je nach Betriebssystem, um standardmäßig einen Dual-Stack-Socket zu erstellen.

In der Tat haben meine Standard-Nginx-Konfigurationen für Pre-1.3.4 die erste Konfiguration und Post-1.3.4 alle die zweite Konfiguration.

Da das Binden eines Dual-Stack-Sockets nur für Linux möglich ist, ähneln meine aktuellen Konfigurationen jetzt eher dem ersten Beispiel, jedoch ohne ipv6only set, um zu sagen:

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

Wenn Sie mehrere vhost-Domänen mit einer einzelnen Nginx-Instanz hosten, können Sie die einzelne kombinierte Listen-Direktive nicht verwenden

listen [::]:80 ipv6only=off;

für jeden von ihnen. Nginx hat eine seltsame Eigenart, bei der Sie den Parameter ipv6only Nur einmal für jeden Port angeben können, da er sonst nicht gestartet werden kann. Das heißt, Sie können es nicht für jeden vhost-Domänenserverblock angeben.

Wie Michael bereits erwähnt hat, ist der Parameter ipv6only Ab Nginx 1.3.4 standardmäßig on.

Wenn Sie mehrere Domänen auf IPv4 und IPv6 mit einem einzigen Nginx-Server hosten möchten, müssen Sie daher zwei Listen-Direktiven für jeden Domänenserverblock verwenden:

listen 80;
listen [::]:80; 

Wie Sander bereits erwähnt hat, hat die Verwendung von ipv6only=off Den Nachteil, dass IPv4-Adressen in IPv6 übersetzt werden. Dies kann zu Problemen führen, wenn Ihre App IP-Überprüfungen anhand von Blacklists wie Akismet oder StopForumSpam durchführt. Wenn Sie keine umgekehrte Übersetzungsschicht einbauen, überprüft Ihre App die IPv6-Übersetzung der IPv4-Adresse des Spammers, die keiner der IPv4-Adressen in entspricht die schwarze Liste.

67
Jeff Widman

Mit dem ipv6only=off Konfigurationsstil Die IPv4-Adressen können als IPv6-Adressen unter Verwendung von (nur Software) IPv4-zugeordnete IPv6-Adressen in beispielsweise Protokolldateien, Umgebungsvariablen (REMOTE_ADDR) usw. angezeigt werden.

16
Sander Steffann

Nach meinem Verständnis (und gemäß den Dokumenten unter http://nginx.org/en/docs/http/ngx_http_core_module.html#listen ) mit just

listen 80;

... ist ausreichend, wenn Sie sowohl IPv4- als auch IPv6-Verkehr am selben Port kanalisieren möchten.

2
fevangelou

Ein lästiges Problem, das beim Hinzufügen von IPv6-Unterstützung zu einer Site mit dem Snippet listen [::]:80 ipv6only=off; aufgetreten ist, war, als ich es einem vhost hinzufügte und der default_server bereits so konfiguriert war, dass er sowohl auf 80 als auch auf [::]:80 wartet.

nginx weigerte sich zu starten und beschwerte sich, dass die Adresse bereits verwendet wurde!

Durch Ersetzen des magischen listen [::]:80 ipv6only=off; durch die beiden traditionellen listen Zeilen kann nginx einwandfrei gestartet werden.

So bequem listen [::]:80 ipv6only=off; bei der manuellen Konfiguration sein mag, kann es bei Verwendung in automatisierten Konfigurationssystemen zu bösen Problemen kommen.