MostraRevisions

IPv6 fácil con 6to4

¿Sabéis? Creo que uno de los obstáculos que impiden el desarrollo de Internet como una auténtica red distribuida son las trabas que ponen los proveedores de acceso a ofrecer direcciones IP públicas estáticas a sus clientes domésticos, que se tienen que apañar con direcciones dinámicas, redes privadas y NAT. Una lástima, porque hacer las máquinas de todos accesibles vía Internet permitiría a cualquiera ofrecer sus propios servicios, empoderando a los individuos y nivelando su posición frente a los grandes proveedores de contenidos, como ocurre en redes libres y neutrales como guifi.net. Y es que, a diferencia de los medios de masas, Internet no distingue entre emisores y receptores.

La escasez de direcciones IPv4 es un (muy debatible) motivo argüido por los proveedores para mantener el actual statu quo. IPv6, en cambio, ofrece una auténtica abundancia de direcciones para todo el mundo y, aunque no lo parezca, ya es posible usarlo sea cual sea nuestra forma de acceso a Internet. Además, es divertido eso de conectarse a la Internet del futuro, ¡así que ya es hora de dar el salto!

Para empezar poco a poco, este artículo describe cómo dotar de conexión IPv6 estable a una máquina Debian con dirección IPv4 fija, usando 6to4, sin necesidad de suscribirse a un servidor de túneles y con una configuración realmente mínima.

Configuración de 6to4

En primer lugar, nos tenemos que asegurar de que tenemos acceso a un encaminador 6to4 mediante la dirección anycast 192.88.99.1:

$ ping -c 4 192.88.99.1
PING 192.88.99.1 (192.88.99.1) 56(84) bytes of data.
64 bytes from 192.88.99.1: icmp_seq=1 ttl=249 time=2.00 ms
64 bytes from 192.88.99.1: icmp_seq=2 ttl=249 time=2.09 ms
64 bytes from 192.88.99.1: icmp_seq=3 ttl=249 time=1.85 ms
64 bytes from 192.88.99.1: icmp_seq=4 ttl=249 time=2.04 ms

--- 192.88.99.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3000ms
rtt min/avg/max/mdev = 1.854/1.996/2.091/0.099 ms

También podemos ejecutar mtr 192.88.99.1 para comprobar si el encaminador se encuentra muy lejos. Por supuesto, cuanto más cerca esté, mejor.

Para crear una configuración 6to4 para la dirección pública IPv4 de la máquina, lo más sencillo es usar el generador de configuración IPv6 con 6to4 para Debian. Por ejemplo, para la dirección IPv4 1.2.3.4 obtendríamos este fragmento:

# IPv6 using a 6to4 tunnel to the internet (from 1.2.3.4)
# Generated at http://debian6to4.gielen.name/
auto tun6to4
iface tun6to4 inet6 v4tunnel
        pre-up modprobe ipv6
        address 2002:0102:0304::1
        netmask 16
        gateway ::192.88.99.1
        endpoint any
        local 1.2.3.4

# If you have an IPv6-capable firewall (and you really should have one),
# it can be enabled by using an "up" rule, such as the example below.
#       up /usr/local/sbin/ipv6firewall.sh tun6to4

Simplemente incluimos el fragmento anterior en /etc/network/interfaces y activamos la interfaz con:

# ifup tun6to4

Podemos probar la nueva dirección IPv6 haciendo ping a alguna máquina de la red IPv6, por ejemplo:

# ping6 -I tun6to4 -c 4 www.whatismyv6.com
PING www.whatismyv6.com(www.whatismyv6.com) from 2002:102:304::1 tun6to4: 56 data bytes
64 bytes from www.whatismyv6.com: icmp_seq=1 ttl=59 time=9.10 ms
64 bytes from www.whatismyv6.com: icmp_seq=2 ttl=59 time=10.3 ms
64 bytes from www.whatismyv6.com: icmp_seq=3 ttl=59 time=10.3 ms
64 bytes from www.whatismyv6.com: icmp_seq=4 ttl=59 time=10.1 ms

--- www.whatismyv6.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 9.107/9.980/10.333/0.518 ms

Si esto no funciona y tenemos un cortafuegos en el ordenador, es posible que necesitemos indicarle que permita el paso a los paquetes IPv4 con protocolo IPv6, con el comando siguiente o el equivalente en nuestro sistema de configuración del cortafuegos:

# iptables -t filter -A INPUT -p ipv6 -j ACCEPT

Una vez funcionen los ping, podemos hacer una prueba de acceso a la web vía IPv6. Lo más sencillo es visitar www.whatismyv6.com usando w3m:

$ w3m -6 www.whatismyv6.com

Si la página nos muestra una dirección de origen IPv6, esto ya está hecho. Sí, de veras, ya está. ¡Bienvenidos al maravilloso mundo de IPv6!

Direcciones adicionales

Bien, ya disponemos de nuestra dirección IPv6, pero realmente tenemos mucho más que eso: 6to4 reserva para cada dirección IPv4 216 subredes de 264 direcciones IPv6 (eso es un cuatrillón de direcciones, ¡decidme si no es la abundancia total!) para que montemos nuestra propia red IPv6. Además, asignar direcciones IPv6 adicionales a la máquina es tan fácil como añadir una opción up y una down al bloque de configuración de tun6to4 para cada dirección extra. Por ejemplo:

up   ip -6 addr add 2002:0102:0304::2/16 dev $IFACE preferred_lft 0
down ip -6 addr del 2002:0102:0304::2/16 dev $IFACE

La opción preferred_lft 0 evita que se use la última dirección añadida como dirección de origen por defecto en las conexiones salientes. Consultad este artículo para una descripción más detallada de este mecanismo (¡gracias Axel!).

Si nuestra máquina tuviera diferentes direcciones IPv4 públicas, podríamos añadir una entrada similar a tun6to4 para cada una de ellas, pero con una sola ya tenemos muchísimas direcciones, y de paso simplificamos la configuración de red y nos facilitaremos las cosas si después queremos preparar la resolución inversa de nombres.

Para saber cómo montar una red IPv6 detrás de esta máquina, consultad este punto de la guía IPv6 de Madduck.

Configuración del cortafuegos

Ya que la máquina estará accesible al público vía IPv6, es recomendable configurar su cortafuegos con ip6tables (por ejemplo usando local-iptables). Las reglas deberían de ser similares a las de IPv4. Por ejemplo, para permitir el tráfico local, las conexiones entrantes a SSH y SMTP, y las establecidas desde dentro:

# ip6tables -t filter -N in-new
# ip6tables -t filter -A INPUT -i lo -j ACCEPT
# ip6tables -t filter -A INPUT -p ipv6-icmp -j ACCEPT
# ip6tables -t filter -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# ip6tables -t filter -A INPUT -m state --state INVALID -j DROP
# ip6tables -t filter -A INPUT -m state --state NEW -j in-new
# ip6tables -t filter -A in-new -p tcp -m tcp ! --syn -j RETURN
# ip6tables -t filter -A in-new -p tcp -m tcp --dport 22 -j ACCEPT
# ip6tables -t filter -A in-new -p tcp -m tcp --dport 25 -j ACCEPT
# ip6tables -t filter -A INPUT -m limit --limit 3/min --limit-burst 10 \
            -j LOG --log-prefix "[INPUT6]: "
# ip6tables -t filter -A INPUT -j REJECT

Con los núcleos Linux anteriores a 2.6.20 no funciona el seguimiento de conexiones. La configuración siguiente es similar a la anterior, pero no tiene en cuenta el estado de las conexiones (y desafortunadamente tampoco permite tráfico UDP sobre IPv6 sin reglas explícitas):

# ip6tables -t filter -A INPUT -i lo -j ACCEPT
# ip6tables -t filter -A INPUT -p ipv6-icmp -j ACCEPT
# ip6tables -t filter -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
# ip6tables -t filter -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
# ip6tables -t filter -A INPUT -p tcp -m tcp --dport 1024:65535 \
            ! --syn -j ACCEPT
# ip6tables -t filter -A INPUT -m limit --limit 3/min --limit-burst 10 \
            -j LOG --log-prefix "[INPUT6]: "
# ip6tables -t filter -A INPUT -j REJECT

Resolución de nombres

Las direcciones IPv6 són numeracos bastante difíciles de recordar. Si queremos asociar nombres a las direcciones mediante DNS, deberemos incluir nuevas entradas de tipo AAAA en los servidores de nombres correspondientes. En el ejemplo anterior, la entrada siguiente asignaría el nombre test6to4 a la dirección IPv6:

test6to4  IN  AAAA  2002:102:304::1

Una ver hechos los cambios en el DNS, usamos dig (paquete dnsutils) para comprobar que la resolución directa funciona bien en nuestro servidor DNS. Para el ejemplo:

$ dig -t AAAA test6to4.example.net @SERVIDOR_DE_DNS +short
2002:102:304::1

Si queremos que funcione la resolución inversa habremos de sufrir un poco más porque es necesario disponer de un servidor de DNS donde podamos crear nuevos dominios y pedir que se nos delegue la resolución de las direcciones IPv6 que comiencen con el prefijo asociado a nuestra dirección IPv4. Afortunadamente esto último es automático.

El propósito es hacer que nuestra dirección IPv6 del ejemplo, que escrita en forma completa es:

2002:0102:0304:0000:0000:0000:0000:0001

o en términos de DNS (¡cuidado, que va!):

1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.4.0.3.0.2.0.1.0.2.0.0.2.ip6.arpa

(es decir, la dirección completa invertida con los dígitos separados por puntos) sea resuelta a un nombre como test6to4.example.net.

Comenzaremos por visitar 6to4.nro.net usando IPv6 desde la misma máquina donde estemos haciendo los cambios:

$ w3m -6 http://6to4.nro.net/

El dominio indicado como reverse será el que habremos de crear en nuestro servidor DNS (la instalación o configuración de éste queda como ejercicio para el lector, pero podéis inspiraros en esta página). En nuestro ejemplo, el dominio inverso sería 4.0.3.0.2.0.1.0.2.0.0.2.ip6.arpa, y el fichero de zona completo podría ser similar a éste:

@  IN  SOA  4.0.3.0.2.0.1.0.2.0.0.2.ip6.arpa.  hostmaster.example.net.  (
    2009122102  ; Serial number (YYYYMMDDnn)
    3h          ; Refresh time
    1h          ; Retry time
    7d          ; Expire time
    3h          ; Default TTL
)

; Nameservers
    IN  NS  ns1.example.net.
    IN  NS  ns2.example.net.

; IPv6 pointers
$ORIGIN  4.0.3.0.2.0.1.0.2.0.0.2.ip6.arpa.

1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0  IN  PTR  test6to4.example.net.

Una vez completados los cambios al DNS, usamos dig (paquete dnsutils) para comprobar que la resolución inversa funciona bien en nuestro servidor DNS. Para el ejemplo:

$ dig -x 2002:102:304::1 @SERVIDOR_DE_DNS +short
test6to4.example.net.

Tras esto, pedimos la delegación visitando otra vez 6to4.nro.net usando IPv6 desde la misma máquina donde estemos haciendo los cambios:

$ w3m -6 http://6to4.nro.net/

Introducimos en el formulario la dirección de correo del administrador (hostmaster@example.net) y los nombres de al menos dos servidores de nombres (ns1.example.net y ns2.example.net) del dominio inverso, una contraseña para evitar que cualquier usuario de la máquina pueda cambiar los datos, y pulsamos Submit. Arreglado.

Cuando los cambios del DNS se hayan propagado (cosa que puede llevar horas), deberíais poder ver la resolución inversa correcta p.ej. en la salida de ping6 (entre paréntesis):

$ ping6 -c 4 test6to4.example.net
PING test6to4.example.net(test6to4.example.net) 56 data bytes
64 bytes from 2002:102:304::1 icmp_seq=1 ttl=64 time=0.033 ms
64 bytes from 2002:102:304::1 icmp_seq=2 ttl=64 time=0.053 ms
64 bytes from 2002:102:304::1 icmp_seq=3 ttl=64 time=0.052 ms
64 bytes from 2002:102:304::1 icmp_seq=4 ttl=64 time=0.049 ms

--- test6to4.example.net ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2999ms
rtt min/avg/max/mdev = 0.033/0.046/0.053/0.011 ms

¡Más, más, más!

Ahora que ya sabemos cómo dotar a nuestro servidor con una conexión IPv6 de primera, estaría bien poder configurar nuestro ordenador de casa para acceder a Internet vía IPv6. En algún envío futuro comentaré cómo dotar de conectividad IPv6 a una máquina situada tras un encaminador con NAT sin apenas problemas, usando Teredo. No obstante, esto ofrece una dirección IPv6 temporal que puede cambiar según los caprichos de nuestro proveedor de Internet o de nuestro encaminador.

El siguiente paso sería configurar nuestra red de casa para que forme una red IPv6 plenamente accesible desde el exterior, por ejemplo usando el servidor de túneles SixXS. Afortunadamente, el tío Madduck ya ha descrito el procedimiento con pelos y señales en su página sobre IPv6 con Debian. Incluso podemos encontrar en la web cómo montar un túnel y red IPv6 con OpenWRT, aunque hay algunos problemas de sobrecarga del procesador. Si me animo ya os contaré cómo fue.

¡Hasta el próximo viaje IPv6!

Interesant

Amb el retras que portem en l'adopció del ipv6 a europa i la crisi económica sembla que aquesta será la única sol.lució durant algun temps.
A vore si algún valent s'atreveix a fer la transició de una vegada.
PD: Ja porte 4 intents del maleit CAPTCHA.

Desesperançador

Veent la IPv6 Matrix me cau l’ànima als peus pel desinterès en l’adopció d’IPv6, que ja sembla completament interessat, valga el joc de paraules. A Espanya per exemple els operadors s’ho estan prenent amb calma, probablement perquè estiguen esperant a que els ploguen les subvencions. Però com dius, amb la crisi probablement s’endarreriran i els operadors podrien fer pagar cares les seues adreces (en unes altres paraules, NAT per a tothom o paga la teua adreça pública —i dinàmica, per descomptat).

(He simplificat un poc els captcha, ¡si els inhabilite em plou l’spam!)

No em cap al cap

Jo es que no entenc com una cosa que es sol.luciona amb una actualització softwar en el pitjor dels casos, pot tardar tants anys en portarse a termini, sobre tot si tenim en compte que la majoría dels dispositius de xarxa ja incorporen IPv6 desde fa prou anys, açó es un destarifo.

Per cert m'agrada el nou tema, més acorde amb el nom del blog i lleuger, menys de 300Kb dels que nomes 40Kb o 60Kb son dinamics.

Ahh i el captcha a la primera nen :-P.

No tan fàcil…

Bé, no crec que siga fàcil a la «perifèria», on et pots trobar amb maquinari i programari molt divers a sovint fora del teu control. Pensa per exemple en els routers que regalen els ISP: molts d’ells no admeten IPv6 i són tan vells que probablement el firmware ja no tinga manteniment. A les troncals d’Internet segurament hi haja menys problemes, però a l’entorn domèstic i d’oficina la cosa es resistirà més perquè algú ho haurà de fer ;).

M’alegre de que t’agrade el nou tema!

Pingback

[...] hace tiempo describí cómo usar 6to4 para proporcionar una conexión IPv6 estable a una máquina dotada de una dirección pública IPv4 [...]