Você precisa de diretivas de escuta IPv4 e IPv6 separadas no nginx?

60

Eu vi vários exemplos de configuração para manipular hosts virtuais IPv4 e IPv6 de pilha dupla no nginx. Muitos sugerem esse padrão:

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

Tanto quanto eu posso ver, isso alcança exatamente a mesma coisa que:

listen [::]:80 ipv6only=off;

Por que você usaria o primeiro? A única razão pela qual consigo pensar é se você precisa de parâmetros adicionais específicos para cada protocolo, por exemplo, se você quiser definir apenas deferred no IPv4.

    
por Synchro 20.10.2014 / 18:26

4 respostas

37

Isso provavelmente é sobre a única razão pela qual você usaria a antiga construção, atualmente.

O motivo pelo qual você está vendo isso é provavelmente que o padrão de ipv6only foi alterado em nginx 1.3.4. Antes disso, o padrão era off ; nas versões mais recentes, o padrão é on .

Isso acontece para interagir com a opção de soquete IPV6_V6ONLY no Linux e opções semelhantes em outros sistemas operacionais, cujos padrões não são necessariamente previsíveis. Assim, a primeira construção era necessária antes do 1.3.4 para garantir que você estivesse realmente ouvindo as conexões no IPv4 e no IPv6.

A alteração para o padrão nginx para ipv6only garante que o padrão do sistema operacional para soquetes de pilha dupla seja irrelevante. Agora, o nginx se liga explicitamente ao IPv4, IPv6 ou ambos, nunca dependendo do SO para criar um soquete de pilha dupla por padrão.

De fato, minhas configurações padrão do nginx para o pré-1.3.4 têm a primeira configuração, e o pós-1.3.4 tem a segunda configuração.

No entanto, como ligar um soquete de pilha dupla é apenas para Linux, minhas configurações atuais agora parecem mais com o primeiro exemplo, mas sem ipv6only set, a saber:

listen [::]:80;
listen 80;
    
por 20.10.2014 / 18:32
54

Se você hospedar vários domínios vhost com uma única instância Nginx, não será possível usar a única diretiva de escuta combinada

listen [::]:80 ipv6only=off;

para cada um deles. O Nginx tem uma peculiaridade estranha, em que você só pode especificar o parâmetro ipv6only uma vez para cada porta ou não iniciará. Isso significa que você não pode especificá-lo para cada bloco de servidor de domínio vhost.

Como Michael mencionou, começando com Nginx 1.3.4, o parâmetro ipv6only é padronizado como on .

Portanto, se você quiser hospedar vários domínios em IPv4 e IPv6 com um único servidor Nginx, será forçado a usar duas diretivas de escuta para cada bloco de servidor de domínio:

listen 80;
listen [::]:80; 

Além disso, como Sander mencionou, usar ipv6only=off tem a desvantagem de os endereços IPv4 serem convertidos em IPv6. Isso pode causar problemas se o seu aplicativo fizer uma verificação de IP contra listas negras como Akismet ou StopForumSpam porque, a menos que você crie uma camada de tradução reversa, o aplicativo verificará a tradução IPv6 do endereço IPv4 do spammer, que não corresponderá a nenhum dos endereços IPv4. a lista negra.

    
por 24.04.2015 / 12:10
12

Com o estilo de configuração ipv6only=off , os endereços IPv4 podem ser exibidos como endereços IPv6 usando (somente de software) Endereços IPv6 mapeados para IPv4 , por exemplo, arquivos de log, variáveis de ambiente (REMOTE_ADDR), etc.

    
por 20.10.2014 / 19:08
1

No meu entendimento (e de acordo com os documentos no link ), usando apenas

listen 80;

... é suficiente se você deseja canalizar IPv4 & Tráfego IPv6 na mesma porta.

    
por 09.03.2017 / 07:38