Direccionamiento IPv6 básico


IPv6 es la nueva generación del protocolo de comunicaciones de Internet y gran parte de los sistemas operativos actuales están ya preparados para utilizarlo. En esta entrada se explican de forma sencilla las características más importantes de las direcciones IPv6 y se muestra una conexión elemental entre dos equipos a través de IPv6. Para artículos posteriores se reservan la conexión de un equipo doméstico a Internet IPv6 a través de un túnel sobre IPv4 o la configuración de una red local con IPv6.

Tipos de direcciones IP

Definiciones previas de los tipos de direcciones IPv6 (extraído de RFC 2462):

  • Unicast: Dirección que identifica de forma única a una interfaz.
  • Multicast: Dirección que identifica a un conjunto de interfaces (normalmente pertenecientes a diferentes nodos). Un paquete que se envíe a una dirección multicast es reenviado a todas las interfaces identificadas por esa dirección.
  • Anycast: Dirección que identifica a un conjunto de interfaces (normalmente pertenecientes a diferentes nodos). Un paquete que se envíe a una dirección anycast es reenviado a una de las interfaces identificadas por esa dirección (la más cercana de acuerdo la protocolo de enrutamiento utilizado)
  • Broadcast: No existen este tipo de direcciones en IPv6
  • Link-local: Una dirección que sólo tiene el ámbito (scope) de enlace y que puede utilizarse para alcanzar los nodos vecinos conectados en el mismo enlace. Todas las interfaces de red tienen una dirección unicast link-local.
  • Site-local: Una dirección con el ámbito limitado al sitio local, término obsoleto hoy en día y sustituido por unique local.
  • Unique local (ULA): Sustituyen a las direcciones site-local (RFC-4193) y son direcciones privadas no enrutables o enrutables a través de unos pocos routers que cooperen.
  • Global: Una dirección con un ambito sin límite

Representación de las direcciones

La característica más conocida de IPv6 es el tamaño de sus direcciones de 128 bits. Al ser direcciones tan grandes son más difíciles de representar, ya que la tradicional notación decimal puntuada de IPv4 no es demasiado práctica al producir direcciones muy grandes. Para la representación de direcciones IPv6 se optó por utilizar 8 grupos de 16 bits en notación hexadecimal, separando cada grupo mediante «:», un ejemplo de dirección IPv6 sería:

fe80:0000:0000:0000:0217:31ff:fe80:026b

que si se representara en notación decimal puntuada sería:

254.128.0.0.0.2.23.49.255.254.128.2.107

Como es lógico, en IPv6 se pueden quitar los ceros a la izquierda en cada grupo, por lo que la dirección anterior quedaría:

fe80:0:0:0:217:31ff:fe80:26b

Además se permite sustituir varios grupos de cero por «::», aunque sólo una vez en cada dirección, para poder invertir el cambio:

fe80::217:31ff:fe80:26b

Dirección de red / Dirección de host

Al contrario que en IPv4, en IPv6 la parte de la dirección IP que corresponde a la dirección de host es fija y se corresponde con los últimos 64 bits. Aunque también se utiliza la notación CIDR para especificar bloques de direcciones IP. Así, la dirección del ejemplo anterior debería estar especificada por:

fe80::217:31ff:fe80:26b/64

que indicaría que la dirección de red son los primeros 64 bits y la identificación del host los 64 siguientes:

Dirección de red: fe80::
Dirección de host: 217:31ff:fe80:26b

El valor de la dirección de host no es aleatorio ya que se corresponde con la dirección MAC de la interfaz de red en formato EUI-64, que se puede obtener transformando la dirección MAC estándar en formato MAC-48. La dirección MAC de la interfaz anterior escrita en el formato habitual de 48 bits en hexadecimal es:

mut:~$ ip -6 link show eth0 |grep link |awk '{print $2}'
00:17:31:80:02:6b

donde hay que separar los 16 bits del fabricante:

17:31

y los 24 bits de identifiación de la interfaz de red:

80:02:6b

Para escribir ahora la dirección MAC de la interfaz de red en formato EUI-64 hay que hacer:

02:Fabricante:ff:fe:Identificación interfaz

o lo que es lo mismo:

0217:31ff:fe80:026b = 217:31ff:fe80:26b

URL

Las URL en IPv6 se representan entre corchetes, por lo que si quisiéramos acceder a un sitio web alojado en la dirección anterior, habría que poner lo siguiente en la barra de navegación:

http://[fe80::217:31ff:fe80:26b]

Direcciones IPv6 reservadas

Existen direcciones IPv6 reservadas que no pueden utilizarse para direcciones unicast convencionales, las más importantes son:

  • ::/128 Dirección no especificada, equivalente a 0.0.0.0 de IPv4
  • ::1/128 Dirección de loopback, equivalente a 127.0.0.1 de IPv4
  • fc00::/7 ULA, equivalente a las direcciones especificadas en RFC1918 de IPv4
  • . Se divide a su vez en dos grupos:

    • fc00::/8 que se debe asignar de forma centralizada a través del denominado «ULA-Central», aunque todavía no está definido. ?
    • fd00::/8 que se construye generando una cadena de 40 bits aleatoria, tal como se define en el RFC4193
  • ff00::/8 Direcciones multicast, equivalente al rango 224.0.0.0/4 de IPv4
  • fe80::/10 Direcciones link-local, equivalente al rango 169.254.0.0/16 de IPv4

Pruebas de funcionamiento

Ya hay muchos sistemas operativos que están preparados para utilizar IPv6. En este caso vamos a utilizar dos equipos con Debian GNU/Linux (lenny) para hacer algunas pruebas, ya que se configuran de forma automática direcciones link-local si los dos equipos están dentro de la misma red local. Veamos las direcciones IPv6 de cada uno de ellos:

mut:~$ ip -6 addr show
1: lo:  mtu 16436 
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0:  mtu 1500 qlen 1000
    inet6 fe80::217:31ff:fe80:26b/64 scope link 
       valid_lft forever preferred_lft forever

jondalar:~$ ip -6 addr show
1: lo:  mtu 16436 
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
3: eth1:  mtu 1500 qlen 1000
    inet6 fe80::21f:e1ff:fe67:ccaf/64 scope link 
       valid_lft forever preferred_lft forever

Donde podemos ver que en ambos casos el dispositivo de loopback incluye la dirección ::1/128 y las interfaces de red eth0 y eth1 respectivamente tienen configurada una dirección link-local. Lo primero es hacer una prueba de ping, donde hay que especificar la interfaz de red en algunos casos:

mut:~$ ping6 -c 1 ::1
PING ::1(::1) 56 data bytes
64 bytes from ::1: icmp_seq=1 ttl=64 time=0.046 ms

--- ::1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.046/0.046/0.046/0.000 ms

mut:~$ ping6 -c 1 -I eth0 fe80::21f:e1ff:fe67:ccaf
PING fe80::21f:e1ff:fe67:ccaf(fe80::21f:e1ff:fe67:ccaf) from fe80::217:31ff:fe80:26b eth0: 56 data bytes
64 bytes from fe80::21f:e1ff:fe67:ccaf: icmp_seq=1 ttl=64 time=1.13 ms

--- fe80::21f:e1ff:fe67:ccaf ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 1.135/1.135/1.135/0.000 ms

Si por ejemplo quisiéramos acceder a través de ssh deberíamos hacer lo siguiente:

mut:~$ ssh fe80::21f:e1ff:fe67:ccaf%eth0

Una configuración completa de la red local utilizando direcciones globales y el acceso a Internet IPv6 a través de túneles sobre IPv4 lo trataremos en artículos posteriores.

Referencias:

Direccionamiento IPv6 básico

3 comentarios en “Direccionamiento IPv6 básico

  1. francisco dijo:

    el primer ejemplo no esta en notacion sino en binario y de ahi pasada a decimal por octetos, porque pasado a decimal el primer valor daria 3580

    Me gusta

  2. Luis dijo:

    No explicas lo màs importante, ¿Dé donde sale el 02 de la dirección link-local?

    02:Fabricante:ff:fe:Identificación interfaz

    No es simplemente colocar un 02

    Me gusta

Deja un comentario