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

8

Problema e objetivo

Não obtemos IPv6 do nosso ISP, por isso tenho um túnel IPv6 que funciona bem, mas que não é muito rápido. E não é realmente confiável. Eu gosto de ter o IPv6 disponível "apenas no caso", mas eu quero que certos hosts (domínios) sejam conectados apenas com o IPv4.

Protocolo padrão

Parece-me que todos os aplicativos tentam primeiro o IPv6; esta é 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 há dois problemas:

  1. Isso causaria um atraso à medida que o aplicativo aguardasse um tempo limite de IPv6 antes de tentar o IPv4?
  2. Alguns domínios parecem estar misturados e parecem caos. Separar google.com e youtube.com parece ser algo que você não quer fazer se puder evitá-lo.

Acabei de observar que a página man do ip route diz para o tipo de roteamento unreachable :

The local senders get an EHOSTUNREACH error.

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

filtragem de DNS

Outra solução (bastante fácil, se 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 que "o endereço IP X pertence ao domínio Y" para que eu possa adicioná-lo ao Netfilter? Qualquer coisa mais elegante do que registrar tudo e digitar o log?

O caminho a percorrer?

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

    
por Hauke Laging 27.05.2013 / 23:00

2 respostas

16

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

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 dá a menor preferência a todos os endereços IPv4.

Se você quiser dar uma preferência maior a todo o IPv4, poderá alterá-lo para:

precedence ::ffff:0:0/96  100

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

Portanto, para dar preferência a 203.0.113.0/24 em todo o IPv6, você deve adicionar:

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

Reinicie os aplicativos em execução para que eles recebam as alterações feitas por você.

Em sistemas derivados do Debian, /etc/gai.conf já está presente. Nos sistemas derivados do 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 .

    
por 27.05.2013 / 23:09
4

OK, aqui está uma resposta completamente diferente.

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

Por exemplo:

199.7.53.74 whois.verisign-grs.com

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

    
por 09.06.2013 / 01:43