jueves, 6 de agosto de 2009

Introducción a IPv6

Posted by Nicolas | jueves, 6 de agosto de 2009 | Category: |

El protocolo de Internet versión 6, IPv6, es definido por la IETF en el RFC 2460 (la versión en español se encuentra en: http://www.rfc-es.org/rfc/rfc2460-es.txt). La sección 3 de éste denota el encabezado de los paquetes de la siguiente manera:

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| Traffic Class | Flow Label |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Payload Length | Next Header | Hop Limit |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Source Address +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Destination Address +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Con:
  • Version (4 bits): 6. El salto de versión de 4 a 6 se debe básicamente a que el número de versión 5 fue asignado al protocolo STD2 (Internet Stream Protocol Version 2) definido en el RFC 1819.
  • Traffic Class (8 bits): Similar al campo DS en IPv4, el que se revisó en Tipos de Servicio con DSCP.
  • Flow Label (20 bits): Puede ser utilizado por la fuente de los paquetes para clasificar distintos flujos. Por lo general los flujos IPv4 son determinados a partir de las direcciones IP de origen/destino, puertos y transporte; udp/tcp. Este campo es definido en detalle en el RFC 3697.
  • Payload Length (16 bits): Número de octetos que componen la información que sigue al encabezado IPv6. Las extensiones de encabezado son también consideradas como parte del payload.
  • Next Header (8 bits): Identifica el tipo de encabezado que sigue al de IPv6. Utiliza los mismos número de protocolo definidos para IPv4 que se pueden revisar de manera online como dicta el RFC 3232 en http://www.iana.org/assignments/protocol-numbers/.
  • Hop Limit (8 bits): Es decrementado en 1 por cada nodo que transmite el paquete, siendo éste descartado si el valor llega a 0. Reemplaza a TTL cumpliendo la misma función, pero sin hacer referencia en su nombre a una función relacionada con tiempo, sino más bien a número de saltos.
  • Source Address (128 bit): Lo más relevante es que pasa de 32 a 128 bits en esta nueva versión del protocolo como se verá en detalle más abajo.
  • Destination Address (128 bit): Es posible no sea el destino final si un encabezado de ruteo está presente.
La nueva representación de direcciones se define en el RFC 4291, en particular en la sección 2.2 (Text Representation of Addresses) se señala existen tres modos convencionales de representación para las direcciones IPv6.

1. El modo predilecto es x:x:x:x:x:x:x:x, donde las 'x' representan entre uno y cuatro números hexadecimales que conforman uno de los ocho fragmentos de 16 bits de la dirección. Ejemplos:

ABCD:EF01:2345:6789:ABCD:EF01:2345:6789
2001:DB8:0:0:8:800:200C:417A

No es necesario denotar los ceros a la izquierda de cada fragmento, sin embargo debe existir al menos un número en cada campo.

2. Existe un método de comprimir una seguidilla de ceros. Para esto se utiliza "::" indicando uno o más grupos de 16 bits de ceros, apareciendo una única vez por dirección. También "::" se puede utilizar para comprimir los ceros al comienzo o final de la dirección. Ejemplos:

2001:DB8:0:0:8:800:200C:417A  <-> 2001:DB8::8:800:200C:417A
FF01:0:0:0:0:0:0:101 <-> FF01::101
0:0:0:0:0:0:0:1 <-> ::1
0:0:0:0:0:0:0:0 <-> ::

3. Una forma alternativa de denotar estas direcciones en ambientes mixtos IPv4/IPv6 es de la forma x:x:x:x:x:x:d.d.d.d, donde las 'x' representan los valores hexadecimales de los seis primeros fragmentos de 16 bits, mientras las 'd' los valores decimales de los últimos cuatro fragmentos de 8 bits (dos últimos fragmentos de 16 bits). Ejemplos:

0:0:0:0:0:0:13.1.68.3         <-> ::13.1.68.3
0:0:0:0:0:FFFF:129.144.52.38 <-> ::FFFF:129.144.52.38

Por otra parte hay que considerar que al igual que los prefijos IPv4, los prefijos IPv6 se denotan de la forma; ipv6-address/prefix-length, con ipv6-address un valor tal como los mostrados anteriormente y prefix-length un valor decimal que determina cuántos bits de izquierda a derecha componen el prefijo.

Existen distintos tipos de direcciones IPv6, los cuales quedan definidos por los primeros bits de las direcciones como muestra la siguiente tabla (sección 2.4 del RFC 4291).

Address type         Binary prefix        IPv6 notation
------------ ------------- -------------
Unspecified 00...0 (128 bits) ::/128
Loopback 00...1 (128 bits) ::1/128
Multicast 11111111 FF00::/8
Link-Local unicast 1111111010 FE80::/10
Global Unicast (everything else)

Será de interés revisar la estructura de las direcciones Global Unicast delegadas por IANA.


| n bits | m bits | 128-n-m bits |
+------------------------+-----------+----------------------------+
| global routing prefix | subnet ID | interface ID |
+------------------------+-----------+----------------------------+

Todas estas direcciones con excepción de aquellas que comienzan con 000 tienen un interface ID de 64 bits, es decir n + m = 64 y construido a partir del formato modificado EUI-64, que inserta 0xFFFE en medio de la MAC de 48 bits del dispositivo, es decir justo después del OUI (que identifica al fabricante). Además el bit universal/local es modificado de 0 a 1 (séptimo bit de izquierda a derecha de la MAC). Los detalles se pueden ver en el apéndice A del RFC 4291, así como en un ejemplo al final de este post.

El RFC 3587 (IPv6 Global Unicast Address Format) muestra un ejemplo de dirección unicast global bajo el 2000::/3 (como inicialmente se pretendía encasillar a las direcciones globales, cosa que ya no tiene efecto) .


| 3 | 45 bits | 16 bits | 64 bits |
+---+---------------------+-----------+----------------------------+
|001|global routing prefix| subnet ID | interface ID |
+---+---------------------+-----------+----------------------------+

Este ejemplo considera las recomendaciones del RFC 3177, el que señala en su sección 3 (Address Delegation Recommendations) que la distribución de direcciones debe seguir el siguiente patrón.
  • /48 en caso general, excepto para suscriptores que demanden un mayor número de direcciones
  • /64 cuando se sabe una única subnet es necesaria
  • /128 cuando es un único dispositivo el que se está conectando
El esquema jerárquico de asignación global de las direcciones queda representado en IPv6 Address Allocation and Assignment Policy como se ve a continuación.

                +--------+
| IANA |
+--------+
|
+-----------+
| |
+--------+ +--------+
| RIR | | RIR | Regional Internet
+--------+ +--------+ Registries (APNIC, ARIN, RIPE NCC,
| | plus possible future RIRs)
| |
| +-----+
| | NIR | National Internet
| +-----+ Registries (AP region)
| |
+--------+ +--------+
|LIR/ISP | |LIR/ISP | Local Internet
+--------+ +--------+ Registries (ISPs)
| |
+--------+ |
| | |
+-------+ +----+ +----+
|EU(ISP)| | EU | | EU | End users
+-------+ +----+ +----+

Además en este documento se señala que la asignación mínima que deben realizar los RIR's a los ISP's para direcciones IPv6 es /32. Por lo tanto si además se considera la actual distribución de IANA detallada en IPv6 Global Unicast Address Assignments, que asigna en su mayoría bloques /23 a los RIR's, se puede ver que la estructura es bastante estricta lo que permite mantener una tabla de ruteo reducida. El cliente final (EU) recibe un bloque /48, contando con 16 bits para su organización interna. Esta jerarquía puede ser evitada con el uso de direccionamiento independiente del proveedor (usualmente utilizado en casos de multihoming) como se detalla en IPv6 Provider Independent (PI) Assignments.

Por último señalar que de acá en adelante se utilizarán direcciones IPv6 del prefijo 2001:DB8::/32 para ejemplos tal como dicta la sección 4 del RFC 3849 (IPv6 Address Prefix Reserved for Documentation).

A continuación un ejemplo de asignación de dirección IPv6 utilizando la subnet 0 del prefijo mencionado anteriormente.

R2#
R2#conf t
Enter configuration commands, one per line. End with CNTL/Z.
R2(config)#interface FastEthernet2/0
R2(config-if)#ipv6 address 2001:DB8::/64 eui-64
R2(config-if)#^Z
R2#

R2#show interfaces FastEthernet 2/0 | include Hardware
Hardware is DEC21140A, address is 001a.6c7c.0038 (bia 001a.6c7c.0038)

R2#show ipv6 interface FastEthernet 2/0 | include address|subnet
IPv6 is enabled, link-local address is FE80::21A:6CFF:FE7C:38
No Virtual link-local address(es):
Global unicast address(es):
2001:DB8::21A:6CFF:FE7C:38, subnet is 2001:DB8::/64 [EUI]
Joined group address(es):
Hosts use stateless autoconfig for addresses.
R2#

Como se ve la MAC de la interface es 001a.6c7c.0038. Si se inserta 0xFFFE en medio se tiene 001a.6cff.fe7c.0038. Por otra parte los primeros ocho bits son 00 = 0000 0000, que se transforman en 02 = 0000 0010, por ende el interface ID queda en 021a.6cff.fe7c.0038. Con esto se tiene material suficiente para formar la dirección global (comienza con 2001:DB8::) y la dirección de link-local (comienza con FE80::).

En total 3 comentarios:

  1. Que tal Nicolas tengo una duda en mi escuela estamos configurando un router cisco 2800s con un tunel ipv6 y al hacer mi configuracion he checado que se necesita una ip de fuente y otra de destino. Mi duda es cuales son esas ip's o cuales debo usar?? por tu atencion gracias.

    Excelente post.

  2. Hola Fernando. Revisaste http://ccie-en-espanol.blogspot.com/2010/01/transicion-ipv6.html ? ahí traté de explicar los diferentes tipos de túneles para correr IPv6. Las direcciones de origen y destino dependerán de los propósitos de tu implementación, por ejemplo si es unir dos nubes IPv6, básicamente puedes usar direccionamiento local. Ahora si quieres tener conectividad IPv6 con el resto de Internet debes pedir la asignación de un bloque IPv6 válido.

  3. gracias... estoy haciendo mi tesis sobre ipv6 y me ayudaste a solucionar algunas dudas


Leave a Reply