Semântica de :: e 0.0.0.0 em sistemas operacionais de pilha dupla

10

De volta aos dias apenas com IPv4, uma conexão LISTEN mostrando em netstat como ouvindo em 0.0.0.0 responderia a conexões em qualquer interface IPv4 no sistema.

Pelo que entendi, o novo idioma IPv6 :: escuta em todas as interfaces IPv4 e disponíveis. Está correto, para todos os sistemas operacionais (Unix, Windows, Mac)? Existe uma expressão para ouvir apenas as interfaces IPv6?

    
por Alex J 08.06.2009 / 03:48

3 respostas

17

Infelizmente, isso é diferente dependendo do sistema operacional que você está usando.

No Microsoft Windows, a ligação de um soquete a :: é vinculada apenas às portas IPv6. Assim, para escutar em todos os endereços tanto no IPv4 quanto no IPv6, você precisa se ligar ao 0.0.0.0 e também ao :: . O extrato a seguir é de uma caixa do Vista:

C:\>netstat -an | find "445"
  TCP    0.0.0.0:445            0.0.0.0:0              LISTENING
  TCP    [::]:445               [::]:0                 LISTENING

O exemplo que dou é a porta 445, usada para o tráfego SMB quando o NetBIOS não é usado. Como você pode ver, é obrigatório que 0.0.0.0 e :: façam, respectivamente, clientes IPv4 e IPv6 trabalharem.

No Linux, :: é inclusivo dos endereços compatíveis com IPv4, como você adivinhou corretamente, então a ligação a 0.0.0.0 também é desnecessária. Eu escrevi um programa Python simples que só se liga a um soquete AF_INET6 em :: . Embora eu também não tenha vinculado a um soquete AF_INET (IPv4), ele ainda aceita conexões de clientes IPv4. Se, digamos, 10.1.1.3 se conectar a ele, ele será exibido como conectando a partir de ::ffff:10.1.1.3 .

Exceto que fica peludo. O acima não se aplica ao Linux se /proc/sys/net/ipv6/bindv6only estiver definido como 1 , caso em que o comportamento é exatamente igual ao do Windows - a vinculação a :: somente atenderá a solicitações IPv6. Se você quiser ouvir solicitações IPv4, precisará criar um soquete AF_INET e também ouvir 0.0.0.0 . Felizmente, o padrão para bindv6only é 0 , então há uma chance muito pequena que você terá para lidar com isso (exceto se você usar o Debian, que na verdade é o padrão bindv6only = 1 ).

Tudo isso é útil saber ao verificar se um serviço está habilitado para IPv6 e se também está habilitado para IPv4. Aqui está o meu servidor SSH:

$ netstat -64ln | grep 22
tcp6    0    0 :::22    :::*    LISTEN

Como você pode ver, o SSH está apenas ouvindo :: port 22. No entanto, ele não está apenas atendendo a clientes IPv6 - funciona bem em clientes IPv4, devido à ligação compatível com IPv4. Para provar isso, se você olhar para isto:

$ cat /proc/sys/net/ipv6/bindv6only 
0

bindv6only está desativado (o padrão). Se isso fosse definido como 1 , eu teria que incentivar o SSH a escutar 0.0.0.0 (ou em vez disso).

Desculpas por não ter informações sobre o lado do Mac OS X das coisas. Eu usei isso no passado, mas eu prefiro a estética do GNOME, então eu não uso há muito tempo. No entanto, eu diria que o comportamento é o mesmo do Linux.

Espero que isso ajude.

    
por 12.07.2009 / 14:37
4

Isso não é possível, já que um segmento do espaço de endereçamento IPv6 é o mesmo que o espaço IPv4, portanto, mesmo que você pudesse desabilitar sockets IPv4, ainda assim seria possível enviar pacotes IPv4 para o soquete IPv6. Verifique a seção de transição do IPv4 na página de wikipedia do IPv4 .

Edit: Ah, pouco mais abaixo diz:

Some common IPv6 stacks do not support the IPv4 mapped address feature, either because the IPv6 and IPv4 stacks are separate implementations (Microsoft Windows prior to Vista/Longhorn: e.g. XP/2003), or because of security concerns (OpenBSD). On these operating systems, it is necessary to open a separate socket for each IP protocol that is to be supported. On some systems (e.g., Linux, NetBSD, FreeBSD) this feature is controlled by the socket option IPV6_V6ONLY as specified in RFC 3493
    
por 08.06.2009 / 04:09
-1

Você provavelmente poderia fazer isso com sua ID de rede, AAAA: BBBB: CCCC: DDDD :: ou o que quer que seja para você. Isso garantiria que apenas as interfaces IPv6 o captassem. Eu acho que. Eu não sou mestre em IPv6.

    
por 08.06.2009 / 04:01