Linux: Bloqueie o IPv6 para certos aplicativos / nomes de host

8

Problema e objetivo

Como não obtemos IPv6 do nosso ISP, tenho um túnel IPv6 que funciona bem, mas é claro que não é muito rápido. E não é realmente confiável. Eu gosto de ter o IPv6 disponível "apenas por precaução", mas quero que determinados hosts (domínios) sejam conectados apenas ao IPv4.

Protocolo padrão

Parece-me que todos os aplicativos experimentam o IPv6 primeiro; essa é provavelmente uma configuração glibc. Eu ficaria bem se esse padrão fosse revertido (para todos os aplicativos).

Netfilter

Seria possível bloquear endereços / redes IPv6 com o Netfilter, mas existem dois problemas:

  1. Isso causaria um atraso, pois o aplicativo aguardaria o tempo limite do IPv6 antes de tentar o IPv4?
  2. Alguns domínios parecem confusos que parecem caos. Separar google.com e youtube.com parece algo que você não deseja fazer se puder evitá-lo.

Acabei de observar que a página de manual do ip routediz para o tipo de roteamento unreachable:

Os remetentes locais recebem um erro EHOSTUNREACH.

O mesmo acontece com as DROPs ou REJECTs do Netfilter? Esse erro não deve causar um atraso relevante.

Filtragem de DNS

Outra solução (bastante fácil, se isso for possível) seria filtrar registros AAAA para determinados domínios. Se isso não for (facilmente) possível: É possível conectar o servidor DNS e o Netfilter para que eu saiba "O endereço IP X pertence ao domínio Y" para que eu possa adicioná-lo ao Netfilter? Algo mais elegante do que registrar tudo e grepping o log?

O caminho para seguir?

Quais (outras) possibilidades existem e qual é a mais fácil?

Hauke ​​Laging
fonte
2
Você realmente não notará nada que implemente o Happy Eyeballs ( RFC 6555 ), como navegadores modernos.
Michael Hampton
O DNS não foi realmente projetado para funcionar dessa maneira. De qualquer forma, você pode tentar um serviço de encapsulamento mais confiável.
Michael Hampton

Respostas:

16

Você pode controlar a seleção de endereço com /etc/gai.conf. O arquivo de configuração está bem documentado e já contém os padrões, para que você possa começar a ajustar.

Os padrões interessantes aqui são:

label  ::1/128       0
label  ::/0          1
label  2002::/16     2
label ::/96          3
label ::ffff:0:0/96  4
precedence  ::1/128       50
precedence  ::/0          40
precedence  2002::/16     30
precedence ::/96          20
precedence ::ffff:0:0/96  10

A última linha oferece a menor preferência para todos os endereços IPv4.

Se você deseja dar uma preferência maior a todos os IPv4, altere-os para:

precedence ::ffff:0:0/96  100

Se você deseja apenas dar maior preferência a endereços ou blocos IPv4 específicos, também pode especificá-los. Lembre-se de que você deve usar um IPv6 mapeado para IPv4 em hexadecimal.

Portanto, para dar preferência a 203.0.113.0/24 sobre todo o IPv6, você adicionaria:

label ::ffff:cb00:7100/120 5
precedence ::ffff:cb00:7100/120 100

Reinicie os aplicativos em execução para que eles capturem as alterações feitas.


Nos sistemas derivados do Debian, /etc/gai.confjá está presente. Nos sistemas derivados da Red Hat, ele está ausente, mas um arquivo de amostra está localizado em /usr/share/doc/glibc-common-*/gai.conf; basta copiá-lo para /etc.

Michael Hampton
fonte
Nunca ouvi falar disso antes; ótima dica, mesmo que não seja uma solução DNS.
Hauke ​​Laging
Você pediu o método mais fácil ... :)
Michael Hampton
4

OK, aqui está uma resposta completamente diferente.

Coloque os hosts ofensivos com conectividade IPv6 de baixa qualidade /etc/hostscom seu endereço IPv4 correspondente.

Por exemplo:

199.7.53.74 whois.verisign-grs.com

Lembre-se de removê-los quando a conectividade deles (nesse caso) ou a sua IPv6 melhorar.

Michael Hampton
fonte
1
Isso seria fácil para um único host com um único IP. Como mencionei, trata-se de **. Youtube.com. Assim, muitos nomes de host são afetados. Em teoria, isso seria fácil com o DNS: "Bloqueie registros AAAA para tudo no .youtube.com". Sua abordagem seria colocar todos esses endereços (provavelmente eles não mudam nem sua estrutura de domínio nem seus IPs com frequência e seria bom que um script verifique isso todos os dias) /etc/hosts. Se ninguém aparecer "O software do servidor DNS XY pode filtrar dessa maneira !!" Provavelmente vou acabar com isso.
Hauke ​​Laging
Eu estou familiarizado com quase todos os pacotes de servidores DNS conhecidos, e nenhum faz o que você parece querer, fácil ou absolutamente. Agora, se você quiser escrever seu próprio código personalizado ... mas a solução real, é claro, é melhorar sua conectividade IPv6. Tente um corretor de túnel diferente?
Michael Hampton