TL;DR


Telefónica ha hecho un uso "creativo" del DNS, que implica que quien tenga soporte IPv6 podría no acceder a www.agenciatributaria.es.

El problema


Imagínate esto: quieres consultar algún dato para hacer la declaración de la renta 2013/2014, o quizás confirmar tu borrador. Lanzas tu navegador favorito y pones www.agenciatributaria.es en la barra de navegación. Para tu sorpresa, pasa una de estas cosas:


  • Da un error de "conexión rechazada"
  • Sale una página por defecto de Apache, nginx o algún otro servidor web
  • Una tercera opción que desvelaré luego, para no estropear la historia

Lo más probable es que te pase esto si usas Linux. Puede que tengas algún amigo o compañero al que no le pase, y que usa OSX o Windows. Desde tu móvil tampoco pasa. ¿Por qué? ¿Es por usar Linux?

La explicación


En parte, sí. Es por usar Linux, pero no por algún tipo de discriminación fascista o conspiración judeo-masónica, sino por una cuestión tecnológica: Linux prefiere conectarse a sitios accesibles por IPv6 antes que por IPv4. Un ejemplo práctico: mi otro blog está en un VPS con IPv6, y cuando haces una consulta DNS obtienes dos resultados: un registro A con la IP en IPv4 y un registro AAAA con IPv6. Así, si sólo tienes IPv4, te conectas a la IP indicada por el registro A; pero si tienes conexión a Internet con IPv6, te conectas a la IP indicada por el registro AAAA.

"¡Pero yo no tengo conexión a Internet con IPv6!", exclamas. Es cierto, pero sí que tienes conexión a ciertas IPs IPv6. Como mínimo, dos:


  • La IP link-local de tu interfaz de red (la que empieza por fe80). Vete un momento al primer artículo sobre IPv6 que escribí para ver cuál es.
  • La IP ::1, que es la IP en IPv6 del interfaz "lo". O, dicho de otra forma, el equivalente de 127.0.0.1 en IPv6.


Veamos ahora qué pasa cuando le preguntas a un servidor DNS por www.agenciatributaria.es. Esto es lo que sale con el comando host www.agenciatributaria.es:

www.agenciatributaria.es is an alias for b7123.cdn.telefonica.com.
b7123.cdn.telefonica.com is an alias for b7123.1.cdn.telefonica.com.
b7123.1.cdn.telefonica.com has address 81.45.8.14
b7123.1.cdn.telefonica.com has address 81.45.8.8
b7123.1.cdn.telefonica.com has IPv6 address ::

www.agenciatributaria.es es un CNAME (un alias) que apunta a b7123.cdn.telefonica.com, que por el nombre es una parte de la Content Delivery Network (CDN) de Telefónica. Para entendernos, la versión de Telefónica de lo que hace Akamai. A su vez, este registro es un CNAME que apunta a b7123.1.cdn.telefonica.com. El registro b7123.1.cdn.telefonica.com apunta a dos direcciones IP, 81.45.8.14 y 81.45.8.8. Cada vez que preguntes, te dirá una de ellas. Es una forma fácil y común de repartir carga.

Lo interesante viene en la última línea: el registro b7123.1.cdn.telefonica.com también tiene una entrada AAAA (IPv6), apuntando a  ... ¿"::"? ¿Qué es "::"?

Lo mismo que ::1. Es decir: localhost. Telefónica tiene un registro IPv6 apuntando a localhost.

Cuando lanzas el navegador y te conectas a www.agenciatributaria.es, el navegador resuelve el nombre y eso le lleva primero a b7123.cdn.telefonica.com y luego a b7123.1.cdn.telefonica.com. Si no tienes soporte de IPv6, irás a una de las dos IPs apuntadas por este registro. Pero si tienes IPv6, irás a la IP "::", que es lo mismo que "::1". O sea, que te conectarás al servidor web de tu equipo.

Ahora podrás imaginarte la tercera opción que no desvelé antes: puede que cuando te conectas a www.agenciatributaria.es aparezca en tu navegador la página web que tengas configurada en tu servidor local (si existe). Puede que aparezca la página por defecto del servidor. O puede que no tengas ningún servidor web y te dé un error de "Conexión rechazada". He ahí nuestras tres posibilidades.

Todo porque alguien en Telefónica configuró mal un registro DNS.

La solución


La solución, obviamente, es que Telefónica corrija ese registro. Es más: sólo con quitar el registro AAAA ya se arreglaría el problema. Así no habría respuestas IPv6, y todo el mundo iría a las dos IPs balanceadas por el registro b7123.1.cdn.telefonica.com. Si realmente quieren usar IPv6, que pongan una IP de verdad, y no el equivalente de "localhost". Si tu equipo recibe una IP IPv6, seguirá intentando conectarse a ella antes que a la de IPv4; pero como no tienes conexión a Internet con IPv6, la conexión no funcionará y Linux intentará la conexión IPv4. Todo de forma transparente, sin que te enteres.

La chapuza


La forma más chapucera y sencilla de arreglar este problema es añadir una entrada en /etc/hosts para www.agenciatributaria.es con una de las dos IPs a las que resuelve b7123.1.cdn.telefonica.com. Es decir, algo así:

81.45.8.8    www.agenciatributaria.es

De esa forma, no pasarás por los servidores DNS de Telefónica para resolver el nombre, evitando el problema.

Otra solución es que el servidor DNS que usas no te devuelva registros AAAA. Si sólo tienes IPv4, no te hacen falta. Si no controlas el servidor DNS (porque usas el de tu ISP, por ejemplo), no es una solución válida. Pero si es tuyo, y usas Bind, y ha sido compilado con la opción --enable-filter-aaaa , puedes añadir esto a la sección options:

filter-aaaa-on-v4 yes;

De esta forma, Bind no devolverá registros AAAA a clientes que hayan hecho la consulta usando IPv4.

Conclusión


Niños, no dejéis a un becario configurar vuestro DNS. De este servicio dependen cosas importantes, y si no podéis pagar a alguien con conocimientos para que lo administre, es mejor que no os dediquéis a esto.