Linux: bloquee IPv6 para ciertas aplicaciones / nombres de host

8

Problema y objetivo

No obtenemos IPv6 de nuestro ISP, por lo tanto, tengo un túnel IPv6 que funciona bien pero, por supuesto, no es muy rápido. Y no es realmente confiable. Me gusta tener IPv6 disponible "por si acaso", pero quiero que ciertos hosts (dominios) se conecten solo con IPv4.

Protocolo predeterminado

Me parece que todas las aplicaciones prueban primero IPv6; Esta es probablemente una configuración glibc. Estaría bien si este valor predeterminado se revierte (para todas las aplicaciones).

Netfilter

Sería posible bloquear las direcciones / redes IPv6 con Netfilter, pero hay dos problemas:

  1. ¿Causaría esto una demora mientras la aplicación espera un tiempo de espera de IPv6 antes de probar IPv4?
  2. Algunos dominios parecen estar mezclados y parece un caos. Separar google.com y youtube.com parece algo que no quieres hacer si puedes evitarlo.

Solo noto que la página del manual ip routedice para el tipo de enrutamiento unreachable:

Los remitentes locales obtienen un error EHOSTUNREACH.

¿Sucede lo mismo con los DROP o RECHAZOS de Netfilter? Tal error no debería causar un retraso relevante.

Filtrado de DNS

Otra solución (bastante fácil si es posible) sería filtrar los registros AAAA para ciertos dominios. Si eso no es posible (fácilmente): ¿es posible conectar el servidor DNS y Netfilter para que yo sepa "la dirección IP X pertenece al dominio Y" para poder agregarla a Netfilter? ¿Algo más elegante que registrar todo y agarrar el registro?

¿El camino a seguir?

¿Qué (otras) posibilidades hay y cuál es la más fácil?

Hauke ​​Laging
fuente
2
Realmente no se dará cuenta con nada que implemente Happy Eyeballs ( RFC 6555 ), como los navegadores web modernos.
Michael Hampton
DNS no está realmente diseñado para funcionar de esa manera. En cualquier caso, puede probar un servicio de túnel más confiable.
Michael Hampton

Respuestas:

16

Puede controlar la selección de direcciones con /etc/gai.conf. El archivo de configuración está bien documentado y ya contiene los valores predeterminados, por lo que puede comenzar a ajustar.

Los valores predeterminados interesantes aquí son:

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

La última línea da la preferencia más baja a todas las direcciones IPv4.

Si desea dar una mayor preferencia a todos los IPv4, puede cambiarlo a:

precedence ::ffff:0:0/96  100

Si solo desea dar mayor preferencia a direcciones o bloques específicos de IPv4, también puede especificarlos. Recuerde que debe usar un IPv6 mapeado IPv4 en hexadecimal.

Entonces, para dar preferencia a 203.0.113.0/24 sobre todo IPv6, debe agregar:

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

Reinicie las aplicaciones en ejecución para que recojan los cambios que realice.


En sistemas derivados de Debian, /etc/gai.confya está presente. En los sistemas derivados de Red Hat, está ausente, pero se encuentra un archivo de muestra en /usr/share/doc/glibc-common-*/gai.conf; solo cópialo a /etc.

Michael Hampton
fuente
Nunca he oído hablar de eso antes; gran sugerencia a pesar de que no es una solución DNS.
Hauke ​​Laging
Solicitaste el método más fácil ... :)
Michael Hampton
4

OK, aquí hay una respuesta completamente diferente.

Coloque los hosts infractores con conectividad IPv6 de mala calidad /etc/hostscon su dirección IPv4 correspondiente.

Por ejemplo:

199.7.53.74 whois.verisign-grs.com

Recuerde eliminarlos cuando su (en este caso) o su conectividad IPv6 mejore.

Michael Hampton
fuente
1
Eso sería fácil para un solo host con una sola IP. Como mencioné, esto se trata de **. Youtube.com. Por lo tanto, muchos nombres de host se ven afectados. En teoría, esto sería fácil con DNS: "Bloquear registros AAAA para todo en .youtube.com". Su enfoque sería poner todas estas direcciones (probablemente no cambien su estructura de dominio ni sus IP a menudo y estaría bien que un script verifique eso todos los días) /etc/hosts. Si a nadie se le ocurre "¡El software de servidor DNS XY puede filtrar de esta manera!" Probablemente termine con eso.
Hauke ​​Laging
Estoy familiarizado con casi todos los paquetes de servidores DNS conocidos, y ninguno hace lo que parece querer, fácilmente o en absoluto. Ahora, si desea escribir su propio código personalizado ... pero la solución real, por supuesto, es mejorar su conectividad IPv6. Pruebe con un corredor de túnel diferente?
Michael Hampton