IPv6 (primera parte)

Las direcciones IP se han acabado, incluso en los RIRs, realmente sólo quedan rangos por asignar sin restricción en África y la solución se llama IPv6.

IPv6 llegará a implantarse globalmente en un tiempo prudencial y ya es necesario conocer qué es y cómo funciona.

Una dirección IP es un activo limitado, el número total de direcciones IPv4 en el Mundo es de algo más de 4.294 millones de direcciones, realmente suficientes para soportar el Internet de hoy en día y el de un futuro cercano, pero una serie de malas prácticas en la asignación de esas direcciones nos han llevado a haberlas gastado en 25 años y ya no hay más.

No vamos a entrar en cómo es posible que se hayan gastado, en por qué hay gente vendiendo IPs cuando las IPs no son de ellos sino que sólo las tienen asignadas, etc… pero bueno, no estoy aquí para hablar ni de moral ni de ética.

Al principio la asignación de direccionamiento se hacia en la libreta de papel de John Postel y se asignaban rangos en clases a quien lo necesitara, así pues se asignaron unos cuantas /8 a empresas y entidades, de las que solo lo ha devuelto el MIT hace unas 2 semanas creo recordar. Se asignaban clases A, B o C, dependiendo y eso hizo que el direccionamiento se repartiera muy rápidamente.

A principios de los 90 la IETF ya se dio cuenta que el espacio de direccionamiento IPv4 se iba acabar, así que pensaron en opciones para reducir el número de IPs necesarias y se inventaron cosas como:

  1. CIDR, NAT y direcciones privadas
  2. DHCP
  3. Host Virtuales
  4. Controles de asignación por parte de los RIRs
  5. Recuperación de rango sin usar

Pero esto no paró el crecimiento de la demanda de direccionamiento IP, lo frenó un poco, pero no lo paró, así que la única salvación era la huida para adelante y pasar a IPv6, el cual estaba pensado para convivir con IPv4 durante el tiempo de transición.

IPv6 se pensó para que no se agotara en muchísimo tiempo, de hecho las IPv6 que se pueden asignar son las /3, es decir, todas las que empiezan por 001, de ahí se sacan para los RIRs 512 partes, cada una de ellas siendo un /12. Y se le asigna a cada RIR un /12, y con eso se asigna a los ISPs, es decir, ahora hay para asignar en total un 0,15% del direccionamiento disponible. 1/8 * 1/512 = 1/4096 = 0,15%.

Los RIRs son:

  1. American Registry for Internet Numbers (ARIN) para América Anglosajona.
  2. RIPE Network Coordination Centre (RIPE NCC) para Europa, el Oriente Medio y Asia Central.
  3. Asia-Pacific Network Information Centre (APNIC) para Asia y la Región Pacífica.
  4. Latin American and Caribbean Internet Address Registry (LACNIC) para América Latina y el Caribe.
  5. African Network Information Centre (AfriNIC) para África

En IPv6 tenemos 3 tipos de direcciones, las Unicast, las Multicast y las Anycast. Fijaros que no hay broadcast como tal, lo que hay es una dirección de multicast que es all-nodes (ff02::1).

  1. En Unicast enviamos un mensaje a un único destinatario.
  2. En Multicast enviamos un mensaje a un grupo de destinatarios, pero no a todo el Mundo.
  3. En Anycast enviamos un menaje a un único destinatario, pero esa IP de destino está en varios hosts. Responderá el que geográficamente esté más cerca.
  4. Broadcast que está presente en IPv4 deja de estarlo en IPv6 pues deja de tener sentido.

La forma de escribir las direcciones IPv6 es en hexadecimal. Como las direcciones MAC escribimos los bytes (octetos) de dos en dos separados por :, la diferencia es que en vez de ser 6 octetos como en una MAC aquí son 16, así que la dirección es mucho más larga.

Como es tan larga podemos abreviar, para ello pondremos :: cuando tengamos varios grupos de 0s, pero sólo una vez, si tenemos varios grupos de 0s en dos sitios, en el primero podremos :: y en el otro 0:0 y así.

Si queréis escribir una dirección IPv6 y un puerto la dirección IPv6 irá entre corchetes, luego : y el puerto [2001:cafe::1]:80

Siempre intentando que la notación sea la más simple y corta posible, esto de todos modos se define en la RFC 5952 (A Recommendation for IPv6 Address Text Representation) por si tenéis curiosidad y un rato.

En cuanto a la escritura de los prefijos es la dirección IPv6/longitud, como en IPv4.

Las direcciones IPv6 además soportan varios entornos o ámbitos.

  1. Link-local: Este ámbito es similar al entorno de broadcast de IPv4, está compuesto por aquellos interfaces que comparten el mismo cable o vlan.
  2. Unique-local (ULA): Este ámbito es similar al direccionamiento privado ya que son direcciones que no son encaminables en Internet.
  3. Global Universal: Este ámbito es el de las direcciones encaminables por Internet.

Las direcciones del /3 que he comentado antes son las que se conocen como Global Unicast Addresses.

Las Global Unicast Addresses se componen de Global Routing Prefix, que es el prefijo asignado al ISP por el RIR que le toque, en el caso de Tecnocrática es el 2a01:a940::/32. Luego hay otros 32 bit que el ISP, en este caso nosotros podemos asignar como Subnet ID y los últimos 64 bits serán el Interface ID.

Las direcciones que empiecen con 11111111 son las de multicast y no se pueden asignar.

Hay que tener en cuenta que tenemos 32 bits para asignar a una subred, que comparado con los 128 bits de la dirección es sólo la cuarta parte, pero pensad que 32 bits es el total de direccionamiento de IPv4, todas las direcciones posibles.

En cuanto al ámbito de las direcciones multicast es otra cosa y empiezan todas por ff0X:: donde la X identifica el ámbito de ese multicast.

Ahora pasamos al subnetting en IPv6. En IPv6 no tenemos ni dirección de red ni dirección de broadcast, con lo que todas las direcciones son útiles. Los prefijos utilizarán la notación de la barra, por ejemplo /64.

En cuanto a la cabecera de IPv6:

  1. Mayor espacio de direccionamiento: Se pasó de 32 a 128 bits
  2. Autoconfiguración: Se pueden generar direcciones gracias al Statleless Address Autoconfiguration (SLAAC). Se generan a partir de la MAC y de la red.
  3. Cabecera simplificada: La cabecera del protocolo se simplificó enormemente al hacerla de tamaño fijo (40 bytes). 16 de cada dirección (origen y destino) + 8 de información general.
  4. Soporte para extensiones: Se integra la opción de cabeceras de extensión que se insertan sólo si es necesario (Opciones salto a salto (Hop-By-Hop Options), Encaminamiento (Routing), Cabecera de fragmentación (Fragment), Cabecera de autenticación (Authentication Header (AH)), Encapsulado de seguridad de la carga útil (Encapsulating Security Payload (ESP)), Opciones para el destino (Destination Options))

En IPv6 por defecto no fragmentamos como en IPv4. Los routers no fragmentan y para avertiguar el tamaño máximo se utilizar el Path MTU Discovery (PMTUD). Si llegara un paquete más grande del permitido, este se descarta y se manda al origen un ICMPv6 de tipio 2, algo parecido a como se haría con el bit df de IPv4.

Si fuera necesario fragmentar por la razón que fuese se puede utilizar la cabecera de extensión de Fragment, donde los paquetes se fragmentan extremo a extremo.

Si hablamos de ICMP tendríamos que irnos a la versión 6, que es la utilizada en IPv6, no quiero centrarme mucho en ICMPv6, pero en ICMPv6 podemos encontrar algo que es sumamente importante y es NDP, Network Discover Protocol, que es un protocolo que en cierta medida sustituye al ARP de IPv4, aunque es más amplio.

Pero ¿qué es el Network Discovery Protocol (NDP)? Es un protocolo de nivel 2 OSI y que sirve para conocer la mac de otro equipo en la red, para conocer cual es el router o los routers de la red o para conocer cuales son las rutas.

NDP tiene 5 tipos de mensajes:

  1. Router Solicitation (RS) – ICMPv6 tipo 135
  2. Router Advertisement (RA) – ICMPv6 tipo 134
  3. Neighbor Solicitation (NS) –  ICMPv6 tipo 135
  4. Neighbor Advertisement (NA) – ICMPv6 tipo 136
  5. Redirect – ICMPv6 tipo 137

La lista completa de tipos de mensajes de ICMPv6 está en https://www.iana.org/assignments/icmpv6-parameters/icmpv6-parameters.xhtml

Como IPv6 no tiene ni ARP ni Broadcast tenemos que encontrar una forma alternativa para encontrar a otros elementos en la red. Además IPv6 nos dirá quien es nuestro gateway, la red y algún dato extra más.

Cuando conectamos un nodo IPv6 en una red lo primero que quiere saber es quien es el router, para ello va a mandar un RS.

El RS se enviará a todos los routers del enlace usando la IPv6 multicast de All Routers (ff02::2). En el RS irá la Link Local del interfaz del host o si no la tiene la Unspecified Address (::/128), todo ceros, y por supuesto la IPv6 Multicast de All Routers.

A un RS se contestará con un RA directamente al host, aunque el RA se enviará igualmente de forma periódica a la IP Multicast de All nodes (ff02::1)

El RA contiene los prefijos que el nodo puede usar, la MTU, rutas específicas e indica si tiene que usar o no SLAAC (autoconfiguración).

La dirección origen será la link-local del router y la de destino será o bien la dirección unicast ipv6 del nodo que ha enviado el RS o bien la IPv6 multicast de All nodes si es un envío periódico (ff02::1).

Con la información del RA el nodo ya tiene casi todo lo que necesita para conectarse, sólo le falta lo que sería lo equivalente al protocolo ARP de IPv4, que al no haberlo en IPv6 ha sido necesario montar un sistema alternativo.

Para conseguir la dirección MAC de un nodo destino el nodo origen envía NS y el nodo destino contestará con un NA al origen incluyendo su dirección MAC.

El mensaje de Redirect se utiliza para indicar, en el caso que haya varios routers, cual es el que tiene mayor prioridad o para indicar que el destino está en el mismo enlace.

Obviamente no vamos a enviar NS cada vez que queramos hablar con un vecino, así que tenemos que tener algo equivalente a la tabla de ARP. La Destination Cache y la Neighbor Cache son las que se encargan de mantener lo equivalente a la tabla de ARP.

Para configurar la dirección IPv6 en nuestros dispositivos tenemos tres opciones:

  1. Configuración estática
  2. Stateless Address Autoconfiguration (SLAAC)
  3. DHCP v6

Antes de asignar una IP a un interfaz lo primero que se le asigna es una Link-local, que se asignan automaticamente del rango fe80::/10 aunque realmente se asigna un /64. Para confirmar que la IPv6 asignada es única se comprueba con el Duplicate Address Detection (DAD) con un NS (Neighbor Solicitation) y si no está repetida se vuelve activa.

La generación de la dirección puede ser con la mac o con unos números aleatorios debido a las extensiones de privacidad de IPv6.