Propaganda de endereços IPv6 estáticos e autoconfig IPv6 no Debian / Ubuntu

6

Eu tenho uma rede que anuncia endereços IPv6 por meio do autoconfig do IPv6. Para permitir pesquisas de DNS e ter endereços IP sofisticados, configuramos endereços IPv6 "estáticos" por meio de / etc / network / interfaces:

auto eth0
iface eth0 inet dhcp
iface eth0 inet6 static
    address a:b:c:d:e::f 
    netmask 64

Sempre que nos conectamos através do IPv6, o Linux usa o endereço autoconfig do IPv6:

 a:b:c:d:21d:60ff:fe4a:479

e não o endereço IPv6 estático:

 a:b:c:d:e::f

Um servidor do outro lado só vê o endereço autoconfig.

Existe uma maneira de forçar o linux (Debian / Ubuntu) a usar o endereço estático para pacotes de saída? Isso é especialmente interessante para configurações reversas de DNS e firewall.

Eu não quero desativar o autoconfig IPv6, pois não tenho controle sobre as configurações que o roteador anuncia.

    
por Pascal 19.06.2012 / 18:42

1 resposta

6

É claro que a maneira mais fácil de evitar que os endereços do autoconf sejam usados é impedir que o kernel os crie fazendo algo assim:

echo 0 >/proc/sys/net/ipv6/conf/eth0/autoconf

Observe como isso não exige que você reconfigure o roteador para que ele pare de emitir anúncios para o prefixo.

OBSERVAÇÃO nos comentários, você fala sobre /etc/gai.conf , mas isso não é aplicável. Este é um arquivo de configuração da glibc, não do kernel, e influencia a seleção do endereço de destino, não a seleção do endereço de origem.

Se você ainda deseja ter os endereços autoconf presentes, mas não quer que eles sejam usados, então continue lendo ...

Para comunicações entre hosts na mesma rede

Não consegui encontrar uma boa maneira de forçar a seleção do endereço a preferir o endereço estático ao autoconf. Ao olhar para todas as regras do RFC 3484, nenhuma delas foi realmente útil.

Você pode tentar alterar a rota / 64 em sua tabela de roteamento para a sub-rede conectada, de modo que ela tenha um atributo "src", mas ela é autogerada pelo kernel quando qualquer um dos endereços na sub-rede for adicionado à interface e não tive sucesso em editá-lo depois do fato.

Para comunicações com hosts no resto da internet

Existem várias maneiras de influenciar a seleção de endereço para conexões de saída. O mais óbvio é usar o atributo src nas rotas. Por exemplo:

ip route add ::/0 via <gateway> src <desired-source-IP-address>

Mas talvez sua rota padrão venha de uma mensagem de anúncio de roteador e seja inserida automaticamente pelo kernel. Nesse caso, é impossível atribuir um atributo "src" para a rota. Então, aqui está outro método, baseado na configuração de etiquetas de endereço.

Por padrão, no Linux, a tabela de rótulos de endereço do kernel é semelhante a:

prefix ::1/128 label 0
prefix ::/96 label 3
prefix ::ffff:0.0.0.0/96 label 4
prefix 2001::/32 label 6
prefix 2001:10::/28 label 7
prefix 2002::/16 label 2
prefix fc00::/7 label 5
prefix ::/0 label 1

A ideia é que, ao iniciar um pacote em um endereço de destino com o rótulo x , o kernel prefira usar um endereço de origem com o mesmo rótulo x . Assim, por exemplo, se você enviar um pacote para um host com um endereço 6to4 (que é um endereço em 2002: / 16), o rótulo para isso é 2, e o kernel preferirá selecionar um endereço de origem 6to4 para o pacote de saída , se houver um disponível.

Destinos gerais do IPv6 recebem o rótulo 1 (:: / 0, que corresponde a tudo). Aqui está o que você quer fazer:

  • Substitua a atribuição de rótulo da sub-rede local para que os endereços na sub-rede local obtenham um rótulo "marciano" (um rótulo que não seja usado por mais nada). Esta regra irá corresponder a toda a sub-rede, então será / 64.
  • Substitua novamente a atribuição de rótulo para o endereço estático desejado para defini-lo de volta para 1 (ou seja, o mesmo rótulo que o resto dos endereços da Internet obtém). Esta regra vai corresponder apenas ao endereço específico desejado, por isso, será / 128.

Dessa forma, todos esses endereços autoconf na sub-rede local receberão uma etiqueta marciana que não corresponderá à etiqueta de qualquer outra coisa na Internet, de modo que eles não serão preferidos, enquanto o rótulo da fonte desejada o endereço será 1, então ele irá combinar com o endereço de destino e ser escolhido.

Se o seu prefixo for 2001: db8 :: / 64 e seu endereço estático escolhido for 2001: db8 :: aaaa / 128 então:

ip addrlabel add prefix 2001:db8::/64 label 99
ip addrlabel add prefix 2001:db8::aaaa/128 label 1

Você pode adicionar esses dois comandos como up em /etc/network/interfaces para que eles sejam executados toda vez que a interface aparecer.

    
por 19.06.2012 / 22:13