IPv6 Ya es el presente y futuro de Internet

FacebooktwitterinstagramFacebooktwitterinstagram

Buscando en el baul de los recuerdos (uuuuuh) encontré un artículo que escribí en el extinto e-zine «#NetSearch» en septiembre del 99, hace casi 12 años, sobre IPv6. Algunas de las cosas del documento han cambiado, sobre todo el apartado en el que señalaba que eran DRAFTs (Borradores), pero el resto es muy utilizable para conocer de una forma sencilla este protocolo 🙂 Perdonad la «maquetación», he respetado el artículo tal cual fue escrito con el editor «vi» 🙂

Fijaros sobre todo en los «graficazos» que nos gastábamos en ASCII Art 😉

=[IPv6, el futuro de Internet]================================================
=[por p0th]===================================================================

                          | IPv6, el futuro de Internet | 

0 Introduccion 

1 Nomenclatura IPv6.
	1.1   Nomenclatura. 

2 Cabeceras IPv6
	2.1   Cabecera Estandar.
	2.2   Extensiones de Cabecera. 

3 Deteccion de problemas y mantenimiento bajo IPv6
	3.1   Mantenimiento
	3.2   Neighbor Discovery.
	3.2.1 Formatos para Neighbor Discovery.
	3.2.2 Formato del campo de opciones del ND. 

4 ICMPv6
	4.1 Tipos de ICMPv6
	4.2 Tipos de ICMPv6 de informacion y sus formatos
	4.3 Tipos de ICMPv6 de error y sus formatos
	4.4 Seguridad e ICMPv6 

5 Links, bibliografia, etc...
	5.1   Links.
	5.2   Bibliografia.
	5.3   Agradecimientos y comentarios finales. 

0 Introduccion 

Para todos vosotros, supongo que sera conocida la actual implementacion de
protocolo IP, es decir la version 4 del Internet Protocol, por lo que
intentare no 'abusar' de las comparativas, para no aburrir demasiado.
Tambien intentare, en lo posible, respetar los terminos adecuados,
traduciendolos entre parentesis la primera vez que sean referenciados. No
obstante, las traducciones literales de ciertos terminos, conducirian a
la confusion mas absoluta, lejos de lograr un mejor entendimiento del
concepto, por lo que conceptos como router (enrutador), enlace (link) y
socket (conector) seran directamente tratados en el idioma
anglosajon. Asi mismo, sinonimos como datagrama y paquete; pasarela,
gateway, router se usara el mas actual o mas usado, como en este ultimo
ejemplo, router. Para cualquier duda o reporte de errores en el presente
documento, enviadme un mail a la direccion que especifico en la parte
final del mismo. 

				|-------------------------------| 

1_ Nomenclatura IPv6. 

 Cuando se desarrollo la actual notacion basada en direcciones de 32 Bits,
agrupados en 4 campos de 8 bits, el numero de hosts maximos que por aquel
entonces se podian direccionar resultaba muy lejano de las expectativas
que por aquel entonces se tenian de la red Internet.
Actualmente, aunque se ha visto frenada debido al uso de CIDR, el continuo
y tambien desorbitado crecimiento esta a punto de desbordar la capacidad
de IPv4. Gracias a las nuevas implementaciones de IPv6, no nos tendremos
que preocupar de este problema durante muuuuchos años. 

1.1  Nomenclatura 

El nuevo formato, usa una direccion de 128 bits, repartidas en
8 campos de 16 bits de la siguiente manera: 

23CF:0000:0000:0000:19FC:A96C:B456:FFFF 

Tambien se especifica la posibilidad de 'comprimir' campos cuyo valor sea
0, con lo que si un campo es ...:0000:... se puede usar ...:0:... en su
lugar.
Asi mismo, si algunos campos vecinos, tienen de valor 0 tambien se pueden
comprimir tal y como se explica a continuacion, basandose en la direccion
de antes: 

23CF::FFFF:19FC:A96C:B456:FFFF 

Donde se ha cambiado la cadena :0000:0000: por solo :: aunque no se pueden
comprimir a la vez, 2 grupos colocados en lugares no contiguos. Por
ejemplo en la direccion FFFF:0:0:0:FFFF:0:0:0, se podria
comprimir en FFFF::FFFF:0:0:0 o en FFFF:0:0:0:FFFF::, pero nunca en
FFFF::FFFF:: por que no se podria distinguir cual de los campos se usa de
relleno. Explicado en otras palabras, cuando un campo vale ::, se rellena
con 0 hasta completar la direccion. 

Como es logico, las direcciones reservadas como loopback, de broadcast y
usadas en intranets, se han visto modificadas, aunque, como ya veremos,
estas ultimas no necesitaran de ser actualizadas si no es preciso. 

   Direcciones especiales:
			  		IPv4		IPv6		 

Loopback ---    	      127.0.0.1    0:0:0:0:0:0:0:1	|| ::1
Unspecified Adresss ---	        0.0.0.0	   0:0:0:0:0:0:0:0	|| :: 

 Tambien se ha pensado en las redes que comparten las dos versiones de IP,
y se accedera a ellas del siguiente modo: 

    |                80 bits               | 16 |      32 bits        |
    +--------------------------------------+--------------------------+
    |0000..............................0000|0000|    IPv4 address     |
    +--------------------------------------+----+---------------------+ 

Para conectarse a la maquina Host1 desde Host2, se debe especificar la
direccion IP en el formato de la V6, de la siguiente manera
0:0:0:0:0:FFFF:192.168.1.2 y Host2 es visto desde Host1 como 192.168.1.3 

Si son varias redes las que hay en juego, se procede a practicar el
tunneling entre versiones por parte de los nodos. 

 _____________		  ______________________	 _______________
|Red con IPv6 |		 |Nodo  	        |	|Red con IPv4   |
| 	      |==========|0:0:0:0:0:192.168.1.1 |=======|	        |
|Zona A	      |		 |______________________|	|Zona B         |
|_____________|		            			|_______________|
 _____________		 ______________________ 		|
|Red con IPv6 |  	|Nodo   	       |		|
|	      |=========|0:0:0:0:0:192.168.2.1 |================+
|Zona C	      |		|______________________|
|_____________| 

Asi de esta forma, se pueden comunicar sin problemas, la Zona A con la
Zona C, sin necesidad de actualizar la Zona B y de una forma elegante y
transparente para los usuarios. 

Para identificar a un host, perteneciente a nuestra subred, en la IPv4, se
hacia mediante la comparacion de nuestra direccion con la mascara de red.
Esto supuso una manera comoda de trabajar, aunque propicio el despilfarro
de muchisimas direcciones IP, hasta que fue frenado de manera considerable
por el uso de CIDR.
Como es logico, IPv6 realiza esta tarea de una manera mas eficiente mediante
Identificadores. El uso de estos identificadores facilitara tanto la asigna-
cion, como la identificacion de una red, independientemente de su tamaño.
En el ejemplo que se recoge en el RFC 1884, se puede observar el mecanismo
empleado para ello: 

    |              n bits            | 80-n bits |     48 bits        |
    +--------------------------------+-----------+--------------------+
    |        subscriber prefix       | subnet ID |   interface ID     |
    +--------------------------------+-----------+--------------------+ 

En este ejemplo, se puede observar la zona de 80 bits para el identificador de
subred y los 48 bits finales, que son asignados mediante la direccion hardware
del interfaz de red, en este caso, una tarjeta de red que cumple el estandar
IEEE-802.
Esto a su vez, permitiria una manera muy facil de asignar direcciones IP sin
mayor complicacion que la asignacion de el ID de subred comun, por lo que el
administrador, no se tendria que preocupar de asignar las direcciones ultimas
de host.
En este mismo RFC, se describen otros metodos, pero no es mi intencion
profundizar demasiado, o que este documento sea una traduccion literal del
mismo, por lo que recomiendo su atenta lectura. 

				|-------------------------------|
 
2  Cabeceras IPv6 

2.1 Cabecera Estandar 

Tambien, como es logico, el formato del cabecera de IP, se ha visto alterado,
y  se han añadido muchas e interesantes opciones, algunas ya presentes en
IPv4, y se ha procedido a la eliminacion de las no usadas o deficientemente
implementadas. 

   Segun esto, una cabecera IPv6 quedaria dividida en los siguientes campos: 

	Version (4 bits) :
		Identifica la version, y logicamente, tiene el valor 6 

	Traffic Class (8 bits):
		Esto renueva y amplia en anterior concepto de TOS (Type of
		service). Los valores de este campo, no se encuentran
		estandarizados por el momento, por lo que su valor inicial,
		deberia ser 00000000 por el momento. 

	Flow Label (20 bits):
		En este campo, se pueden comunicar diferentes valores, para el
		manejo del paquete para su enrrutamiento, reserva de ancho de
		banda, que mejorara la recepcion de video y sonido sobre IP,
		a parte de descargar al router de parte del trabajo en lo que
		a administracion de calidad de servicio se refiere.
		Para mas informacion sobre este valor, recomiendo la
	 	lectura del Apendice A en el RFC 2460. 

	Payload Length (16 bits como unsigned integer):
		Expresa la longitud de la carga del paquete en bytes (octetos) 

	Next Header (8 bits):
		Comunica el tipo de cabecera siguiente a la de IPv6. Como por
		ejemplo, 6 para TCP. Los valores son los mismos que usa IPv4
		aunque en la anterior especificacion, este campo tomaba el
		nombre de 'Protocol', y se recogen en el RFC 1700. 

	Hop Limit (8 bits como unsigned integer):
		Este campo sustituye al TTL de IPv4, y tiene un valor inicial
		determinado por el host emisor en un rango de 0 a 255. Cuando
		un paquete llega a un router, a este valor se le resta 1 y si
		este llega a 0, es descartado por el mismo. 

	Source Address (128 bits):
		Direccion de origen del paquete. 

	Destination Address (128 bits):
		Direccion de destino, aunque como se explica en la seccion, se
		puede añadir la ruta por la cual se debe encaminar el paquete.
 
2.2 Extensiones de cabecera 

   Como novedad, se implementa el concepto extensiones de cabeceras. Estas, son
como 'añadidos' a la cabecera estandar, lo que hace mas modulables y
extensibles las posibilidades de IPv6.
Estan extensiones, se identifican mediante el campo 'Next Header'. Los nuevos
identificativos son: 

 Hop-by-Hop Options (Valor de next header de la cabecera anterior 0)
 Routing (Valor de next header de la cabecera anterior 43)
 Fragment (Valor de next header de la cabecera anterior 44)
 Destination Options (Valor de next header de la cabecera anterior  )
 Authentication (Valor en el campo next header de la cabecera anterior 51)
 Encapsulating Security Payload (Valor de next header de la cabecera anterior50)
 Last header (Valor en el campo next header de la cabecera anterior 59)
 Destination Options (Valor en el campo next header de la cabecera anterior 60) 

En el RFC 2460, se pone como ejemplo los siguientes: 

   +---------------+------------------------
   |  IPv6 header  | TCP header + data
   |               |
   | Next Header = |
   |      TCP      |
   +---------------+------------------------ 

   +---------------+----------------+------------------------
   |  IPv6 header  | Routing header | TCP header + data
   |               |                |
   | Next Header = |  Next Header = |
   |    Routing    |      TCP       |
   +---------------+----------------+------------------------ 

   +---------------+----------------+-----------------+-----------------
   |  IPv6 header  | Routing header | Fragment header | fragment of TCP
   |               |                |                 |  header + data
   | Next Header = |  Next Header = |  Next Header =  |
   |    Routing    |    Fragment    |       TCP       |
   +---------------+----------------+-----------------+----------------- 

 Que pueden ayudar a comprender el importate alcance de incluir esta capa
dentro de un datagrama. Cabe destacar, que una version propietaria, puede
incluir sus propias extensiones. Logicamente, se tienen que cumplir las
minimas  requeridas por el RFC 2460, que son las siguientes que se comentan
brevemente a continuacion: 

>	Hop-by-Hop Options:
		Son opciones, cuyo valor debe ser revisado por todos los nodos
 por los que el paquete es encaminado.
	Tiene el siguiente formato: 

	+--------------+----------------+------------------+
	|Next header   | Hdr Ext Len	| Options	   |
	+--------------+----------------+------------------+ 

 En el campo Next Header se expecifica el tipo de cabecera inmediatamente
siguiente a esta, indicandolo mediante un selector de 8 bits.
 En el campo Hdr Ext Len ( Header Extended Lenght) se especifica la longitud
del campo options, exceptuando los primeros 8 bytes. Se indica como
un valor de 8 bits unsigned integer.
 En el campo Options, se incluyen las opciones que se especifican en el
apartado 4.2 del RFC 2460. Su longitud es variable aunque la suma de la
longitud de la cabecera Hop-by-Hop, debe ser multiplo de 8 bytes. 

>	Routing:
	Esta cabecera, posibilita una de las funciones mas taractivas de la
version 6 de IP. Su funcion, es la de poder especificar el camino exacto que
preferentemente debe recorrer un paquete hasta llegar a su destino.
	El formato es el siguiente: 

	+---------------+---------------+---------------+---------------+
	|  Next Header  |  Hdr Ext Len  |  Routing Type | Segments Left |
	+---------------+---------------+---------------+---------------+ 

 En el campo Next Header se expecifica el tipo de cabecera inmediatamente
siguiente a esta, indicandolo mediante un selector de 8 bits.
 En el campo Hdr Ext Len ( Header Extended Lenght) se especifica la longitud
de la cabecera routing, exceptuando los primeros 8 bytes. Se indica como
un valor de 8 bits unsigned integer.
 El campo Routing Type es un selector de 8 bits de tamaño, que indica el tipo
de cabecera 'routing' que de momento es 0. Este tipo de cabeceras de
enrrutado, tiene el siguiente formato: 

	+---------------+---------------+-----------------+---------------+
	|  Next Header  |  Hdr Ext Len  | Routing Type = 0| Segments Left |
	+---------------+---------------+-----------------+---------------+
	|			      (Reservado)			  |
	+-----------------------------------------------------------------+
	|			      Direccion 1			  |
	+-----------------------------------------------------------------+
	|			      Direccion 2			  |
	+-----------------------------------------------------------------+
	|			      Direccion x			  |
	+-----------------------------------------------------------------+
	En este tipo de cabecera de enrrutado, se especifican en el campo de
direcciones la IP por la que el paquete debe pasar para llegar a su destino.
Cuando un paquete llega a 'Direccion 1' esta, coloca si propia direccion en el
ultimo lugar y envia el paquete a la 'Direccion 2' que hace el mismo
procedimiento y se decrementa en 1 el campo Segments Left. Cuando se llega al
destino final. El paquete conserva la ruta completa por la que ha pasado y es
utilizada para enviar el retorno. Para obtener informacion mas extensa, asi
como un algorritmo de manejo de esta clase de cabeceras, te remito al RFC 2460. 

 El campo Segments Left de la cabecera de routing, se indica el
numero se segmentos de red, que quedan para que el paquete llege a su destino.
En cada salto, este numero se decrementa en 1. Su valor se comunica mediante
un unsigned integer. 

>	Fragment:
	Al contrario de la IPv4, la fragmentacion unicamente debe ser
efectuada en el host de origen. Si el router se encontrara con un paquete de
un tamaño mayor al que puede manejar el siguiente salto, debe descartarlo y
enviar al host de origen un ICMP que comunique la MTU del siguiente salto.
	El formato de esta clase de cabeceras es el siguiente: 

	+---------------+---------------+-------------------------+---+-+
	|  Next Header  |   Reserved    |      Fragment Offset    |Res|M|
	+---------------+---------------+-------------------------+---+-+
	|                         Identification                        |
	+---------------------------------------------------------------+ 

 En el campo Next Header se expecifica el tipo de cabecera inmediatamente
siguiente a esta, indicandolo mediante un selector de 8 bits.
 El campo Reserved esta reservado para usos futuros y debe ser inicializado a
0 en el origen e ignorado en la recepcion. El valor debe ser de 8 bytes del
tipo unsigned integer.
 El campo Fragment Offset es de una longitud de 13 bits, e indica
desplazamientos, en bloques de 8 bytes relativos al primer paquete de la serie.
 El campo Res, esta reservado para usos futuros y debe ser inicializado en
origen a 0 e ignorado por el destino.
 La flag M, inica mediante un bit, si el paquete es el ultimo (valor 0) o por
el contrario es uno mas de la serie (valor 1) 

>	Destination Options
		Esta cabecera, indica las opciones que deben procesarse en el
destino o en los destinos en el caso de multienvios.Si va acompañada por
cabeceras de enrutamiento, la cabecera de opciones de destino colocada antes
de la de enrrutamiento, se aplica a todos los nodos, mientras que la que se
encuantra al final, es solo aplicable a la direccion de destino. Su formato es
el siguiente: 

	+--------------+----------------+------------------+
	|Next header   | Hdr Ext Len	| Options	   |
	+--------------+----------------+------------------+ 

 En el campo Next Header se expecifica el tipo de cabecera inmediatamente
siguiente a esta, indicandolo mediante un selector de 8 bits.
 En el campo Hdr Ext Len ( Header Extended Lenght) se especifica la longitud
de la cabecera Destination Options, exceptuando los primeros 8 bytes. Se indica como
un valor de 8 bits unsigned integer.
 El campo options, de longitud variable, no se han especificado mas opciones
que las de relleno hasta que el tamaño sea multiplo de 8 bytes. 

>	Authentication:
	Debida la extension de esta especificacion y el estado de desarrollo,
	Ver RFC 2402 

>	Encapsulating Security Payload:
	Debida la extension de esta especificacion y el estado de desarrollo,
	Ver RFC 2406 

Todas ellas, deben seguir un orden dentro del datagrama: 

 IPv6 header
 Hop-by-Hop Options header
 Destination Options header
 Routing header
 Fragment header
 Authentication header
 Encapsulating Security Payload header
 Destination Options header
 Upper-layer header 

				|-------------------------------|
 
3 Deteccion de problemas y mantenimiento bajo IPv6 

3.1 Mantenimiento
 Con la nueva version de IP, a parte de la eliminacion de mascaras de red, y
limitaciones en el numero de direcciones disponibles, los desarrolladores del
Internet Protocol han decidido facilitarle mucho la vida a los administradores.
Una red que corra sobre IPv6, sera una red facil de administrar, con menos
carga en los routers y con muchos problemas menos de trafico que la 'antigua'
IPv4.
Esto no quiere decir que una red sobre IPv6, sea el paraiso, por que el
trabajo de administrador siempre sera el de administrar, hoy estoy muy
inspirado :), y las cosas que se han de administrar, suelen tener tendencia a
desadministrarse, bonito trabalenguas. 

Para el montage de una red sobre IPv6, se han desarrollado nuevos protocolos,
y se han extendido muchos de los existentes. En el RFC 2452, se da una clara
exposicion de los cambios dentro del MIB, extendiendose en el 2454 y en el
RFC 2465. Parece ser que el snmp va a pasar un periodo de nueva juventud, y un
uso mas extendido por parte de los administradores.
Soluciones mas completas como la del DHCPv6, explicada en el RFC 2462,
permiten que un host, no solo obtenga una IP con la seguridad de que es unica
en su red, si no que sea tambien dado de alta en el servidor de DNS,
solicitando un nombre directamente al servidor DHCPv6. 

Tampoco el ARP se salva de la quema, y sus funciones son mucho mejor cubiertas
por nuevos procedimientos explicados en este mismo documento, en la seccion 3.2
Problemas como los traslados de equipos a otras redes y/o la reconfiguracion
de la misma para ampliarla, seran historia en la nueva version IP. 

3.2 Neighbor Discovery 

El Neighbor Discovery protocol (protocolo de descubrimiento de vecindad), es
el encargado de saber por que hosts/redes estamos rodeados. Esto, tambien
incluye descubrir las caracteristicas del medio por donde van a circular los
paquetes que salgan de nuestra maquina. El Neighbor Discovery hace uso de
ICMPv6, para comunicarse, tal y como se especificara en el siguiente capitulo.
Tal y como se comenta en el RFC 2461, el Neighbor Discovery, es una
combinacion de ARP, ICMP Router Discovery e ICMP redirect, y a su vez se han
incorporado nuevas funciones. Entre las funciones de este protocolo, estan
las de: 

 Router Discovery (Descubrimiento de router): Comunica al host y a otros
routers, la existencia de un nuevo router, o la permanencia / eliminacion de
los actuales. 

 Parameter Discovery (Descubrimiento de parametros): Da informacion a los nodos
de una red, sobre el MTU, asi como del numero maximo de saltos para llegar al
exterior. 

 Prefix Discovery (Descubrimiento de prefijo): Comunica al nodo el prefijo de
la red, que tiene la direccion IPv6 de su subred. 

 Next-hop determination (Determinacion del proximo salto): Comunica el nodo
mas cercano. Este valor puede ser usado para determinar la ruta mas corta por
la cual se encaminaran los paquetes. 

 Address Autoconfiguration (Autoconfiguracion de direccion): Da a conocer a
la maquina, la IP de un interfaz de red. 

 Address resolution (Resolucion de direccion): Haciendo un poco de humor, se
le puede llamar 'El artista antes conocido como ARP' ;). Se encarga de
establecer la corespondencia entre la direccion IP y la de su capa de enlace
(Direccion MAC de una ethernet por ejemplo). 

 Neighbor Unreachability Detection (Deteccion de inalcanzabilidad de un
vecino): Detecta la caida, o eliminacion de un router y/o host. 

 Duplicate Address Detection (Deteccion de Duplicidad de direcciones):
Comprueba que no hay direcciones IP duplicadas dentro de una red. Puede ser
usado antes de dar de alta un nuevo nodo. 

 Redirect (Redireccion): Informa a un nodo, de el mejor camino mas corto, para
alcanzar un destino. 

3.2.1 Formatos para Neighbor Discovery. 

Los formatos para los mensages, quedan definidos de la siguiente manera. 

 Router Solicitation: 

	+---------------+---------------+-------------------------------+
	|     Type      |     Code      |          Checksum             |
	+---------------+---------------+-------------------------------+
	|                            Reserved                           |
	+---------------------------------------------------------------+
	|   Options ...							|
	+---------------------------------------------------------------+ 

Los valores para estos campos, son los siguientes:
 Type: 133
 Code: 0
 Checksum: (Suma de control ICMPv6)
 Reserved: 0 (Sin un valor asignado)
 Options:
- Source link-layer address
Direccion de la capa de enlace del origen del mensage. 

 Router Advertisement: 

	+---------------+---------------+-------------------------------+
	|     Type      |     Code      |          Checksum             |
	+---------------+---------------+-------------------------------+
	| Cur Hop Limit |M|O|  Reserved |       Router Lifetime         |
	+---------------+-+-+-----------+-------------------------------+
	|                         Reachable Time                        |
	+---------------------------------------------------------------+
	|                          Retrans Timer                        |
	+---------------------------------------------------------------+
	|   Options ...							|
	+---------------------------------------------------------------+ 

 Los valores para estos campos, son los siguientes:
 Type: 134
 Code: 0
 Checksum: (Suma de control ICMPv6)
 Cur Hop Limit: Valor actual que debe tomar el campo de IP que indica el
numero de saltos por defecto, o Hop Limit, especificado en 8 bytes unsigned
integer. Un valor de 0, no especifica nada.
 M: Flag de 1 bit, para el Managed address configuration.
 O: Flag de 1 bit, para el Other stateful configuration.
 Reserved: Campo reservado para usos futuros. Con valor de 6 bit, debe ser
inicializado a 0. Cualquier otro valor, sera ignorado.
 Router Lifetime: Valor de 16 bits unsigned integer. El tiempo de vida del
router por defecto. Si el valor es 0, no debe ser usado para este fin.
 Reachable Time: Tiempo medido en 32 bits unsigned integer, que indica, en
milisegundos, el tiempo desde que un nodo, ha recibido una confirmacion de
alcance, por parte de sus vecinos. Un valor de 0, no especifica nada.
 Retrans Timer: Tiempo en milisegundos, expresados como unsigned integer,
trascurrido entre 2 mensajes de solucitud de vecindad. Un valor de 0,
inhabilita este campo.
 Options:
- Source link-layer address
Direccion de la capa de enlace del origen del mensage.
-MTU
Debe ser enviada en redes con la MTU variable. En otra clase de enlaces,
esta opcion es opcional.
-Prefix Information
Los prefijos de las redes que alcanza el router excepto la local. 

 Neighbor Solicitation 

	+---------------------------------------------------------------+
	|      Type      |     Code      |          Checksum		|
	+---------------------------------------------------------------+
	|			Reserved 				|
	+---------------------------------------------------------------+
	|			Target Address				|
	+---------------------------------------------------------------+
	|  Options ...							|
	+---------------------------------------------------------------+ 

Los valores para estos campos, son los siguientes:
 Type: 135
 Code: 0
 Checksum: (Suma de control ICMPv6)
 Reserved: 0 (Sin un valor asignado)
 Target address: Direccion IP hacia la cual se envia la solucitud. Este campo
no debe ser ocupado por una direccion de multicast.
 Options:
- Source link-layer address
Direccion de la capa de enlace del origen del mensage.
No debe incluirse si es una direccion de arranque. En cambio si ya tiene IP,
puede ser incluida si es una solicitud de multicast y debe ser incluida si es
una solicitud de anycast. 

 Neighbor Advertisement 

	+---------------------------------------------------------------+
	|      Type      |     Code      |          Checksum		|
	+---------------------------------------------------------------+
	|R|S|O| 		Reserved 				|
	+---------------------------------------------------------------+
	|			Target Address				|
	+---------------------------------------------------------------+
	|  Options ...							|
	+---------------------------------------------------------------+ 

Los valores para estos campos, son los siguientes: 

 Type: 136
 Code: 0
 Checksum: (Suma de control ICMPv6)
 R: Router flag de un bit. Indica que el nodo de envio es un router. Es usado
por el Neighbor Unreachability Detection, para ver si un router cambia a host.
 S: Solicited flag de un bit. Toma valor 1, si el mensage es en respuesta a
una solicitud de vecindad.
 O: Override flag. Con valor 1, indica que la cache de destino debe ser
actualizada. Si el valor es 0, la cache de destino no debe ser actualizada
menos para los nodos implicados.
 Reserved: 29 bits sin uso, destinados a furusar implementaciones. debe ser
inicializado a 0. Otro valor, sera ignorado.
 Target Address: Direccion de destino, que debe ser la del nodo que solocito
este mensage. No debe ser ninguna direccion de multicast.
 Options:
- Target link-layer address
Direccion de la capa de enlace del destino. Puede ser incluida respondiendo a
una solicitud de multicast y debe ser incluida si es una respuesta a
una solicitud de anycast. 

 Redirect 

	+---------------------------------------------------------------+
	|      Type      |     Code      |          Checksum		|
	+---------------------------------------------------------------+
	|			Reserved 				|
	+---------------------------------------------------------------+
	|			Target Address				|
	+---------------------------------------------------------------+
	|			Destination Address			|
	+---------------------------------------------------------------+
	|  Options ...							|
	+---------------------------------------------------------------+ 

Los valores para estos campos, son los siguientes: 

 Type: 137
 Code: 0
 Checksum: (Suma de control ICMPv6)
 Reserved: 0 (Sin un valor asignado)
 Target Address: Informa al host, de que hay un camino mejor por donde
encaminar su trafico hacia su destino, indicandolo en este campo.
 Destination Address:  Aqui informa el router al host, el destino del trafico
al cual se refiere.
 Options:
-Target link-layer address
Direccion de la capa de enlace del destino. Debe incluirse si es posible. En
enlaces del tipo NBMA (non-broadcast multi-access), los host podria requerir
la direccion de la capa de enlace del destino.
-Redirected Header
Incluir tanto como sea posible de la cabecera IP del paquete que ha probocado
el envio del mensage. 

3.2.2 Formato del campo de opciones del ND. 

Dentro de los mensages anteriormente citados, el campo Options debe tener este
formato: 

-Source/Target Link-layer Address 

	+---------------+---------------+---------------------------+
	|     Type      |    Length     |    Link-Layer Address ... |
	+---------------+---------------+---------------------------+ 

Type:
 1 Para el Source Link-layer Address
 2 Para el Target Link-layer Address 

Length: Longitud, incluyendo el campo Type y Length medida en valores de 8
bytes. 

Link-Layer Address:
Direccion de la capa de enlace. Su formato esta a la espera de ser
especificado. 

-Prefix Information 

	+---------------+---------------+---------------+-+-+-----------+
	|     Type      | Length	| Prefix Length |L|A| Reserved1 |
	+---------------+---------------+---------------+-+-+-----------+
	|			Valid Lifetime				|
	+---------------------------------------------------------------+
	|			 Preferred Lifetime			|
	+---------------------------------------------------------------+
	|			    Reserved2				|
	+---------------------------------------------------------------+
	+			  Prefix				+
	|                                                               |
	+---------------------------------------------------------------+ 

Type: 3 

Length: 4 

Prefix Length: 8 bits de unsigned integer en un rango de 0 a 128 que indican
las primeras posiciones del prefijo que son validas. 

L: Flag de on-link. Con valor 1, indica que la direccion es del tipo on-link,
a 0, no especifica nada. 

A: Flag de autonomous address-configuration (configuracion autonoma de
configuracion). Con valor 1, indica que el prefijo puede ser usado para que el
host configure su direccion. 

Reserved1: Campo de 6 bits reservados para uso futuro. Se debe inicializar a 0. 

Valid Lifetime: Valor de 32 bits insigned integer, que informa del tiempo en
segundos que el prefijo, a fines de direcciones on-link, debe ser valido. Si
el campo son todos 1 (0xffffffff) el valor es infinito. 

Preferred Lifetime: Valor de 32 bits insigned integer, que indica el tiempo en
segundos, que la direccion generada a partir del prefijo es preferible que sea
usada. Si el campo son todos 1 (0xffffffff) el valor es infinito. 

Reserved2: Campo reservado para uso futuro. Se debe inicializar a 0. 

Prefix: Contiene una direccion IP o un prefijo IP. El campo Prefix Length
contiene los bits primeros a tener en cuenta y el resto deben ser
inicializados a 0 e ingnorados por el que envia el mensage. Un router no debe
mandar prefijos hacia links locales y un host local, debe ignorarlo. 

-Redirected Header 

	+---------------+---------------+-------------------------------+
	|     Type      |    Length     |            Reserved           |
	+---------------+---------------+-------------------------------+
	|                           Reserved                            |
	+---------------+---------------+-------------------------------+
	|                                                               |
	~			IP header + data 			~
	|                                                               |
	+---------------------------------------------------------------+ 

Type: 4 

Length: longitud en unidades de 8 bytes de la opcion. 

Reserved: Campo reservado para futuros usos. Debe ser inicializado a 0. 

IP header + data: Paquete original truncando su tamaño para que, la longitud
total, no exceda de 1280 bits. 

-MTU 

	+-------------+---------------+-------------------------------+
	|   Type      |    Length     |           Reserved            |
	+-------------+---------------+-------------------------------+
	|                            MTU                              |
	+-------------+---------------+-------------------------------+ 

Type: 5 

Length: 1 

Reserved: Campo reservado para futuros usos. Debe ser inicializado a 0. 

MTU: 32 bits unsigned integer que indica el MTU recomendado. El valor debe ser
aplicado a todos los segmentos. 

Si algun campo de opciones es encontrado dentro de un tipo de mensage que no
le corresponde, debe ser simplemente ignorado por el router. 

El Neighbor Discovery, es un protocolo tan extenso, que ocupa un RFC entero
(el RFC 2461). Solo he querido tratarlo muy por encima, por lo que sugiero su
lectura para mayor informacion. 

				|-------------------------------|
 
4 ICMPv6 

El Internet Control Messages Protocol (56 en el campo de Next Header), tiene
el mismo uso que su antepasado, el ICMPv4. La mision de un ICMP, es sobre todo
la de informar. Sobre que informa, como y de que forma, lo tratare de explicar
en las siguientes secciones. 

4.1  Tipos de ICMPv6 y formato 

Los mensages de ICMP, se han dividido en 2 clases, los que comunican errores,
y los que piden/dan informacion sobre un nodo. Para diferenciarlos, se han
adjudicado una numeracion del 0 al 127 a los mensages que contienen
informacion y del 128 al 255, sobre los que informan de algun tipo de error de
una peticion. 

Un paquete ICMPv6, esta formado por una cabecera IPv6, y es precedido
inmediatamente por una cabecera con valor 58 en el campo next header: 

   +---------------+------------------------
   |  IPv6 header  | ICMP header + data
   |               |
   | Next Header = |
   |      58       |
   +---------------+------------------------ 

Notese, que este procedimiento es diferente al de IPv4, y que un ICMP puede
ser insertado en cualquier tipo de paquetes. 

4.2 Tipos de ICMPv6 de informacion 

Los mensages de informacion, pueden ser del tipo: 

 Echo Request (Type 128) 

Un nodo, puede enviar un ICMP Echo Request (Mas conocidos como pings), para
saber el tiempo de respuesta de otro host. 

El formato es el siguiente: 

	+---------------+---------------+-------------------------------+
	|     Type      |     Code      |          Checksum             |
	+---------------+---------------+-------------------------------+
	|           Identifier          |        Sequence Number        |
	+-------------------------------+-------------------------------+
	|     Data ...							|
	+---------------------------------------------------------------+ 

 Type: 128 

 Code: 0 

 Checksum: Suma de control, para la comprobacion de la informacion. 

 Identifier: Identificador para contrastar los ICMP Echo Reply de respuesta. 

 Sequence Number: Secuencia de numeros, para contrastar los ICMP Echo Reply
 de respuesta en orden. 

 Data: Datos aleatorios o ceros de relleno. 

La recepcion de ICMP Echo Request, debe ser comunicada a la capa superior de
trasporte. 

Echo Reply (Type 129) 

El ICMP Echo Reply, es enviado como respuesta a un ICMP Echo Request. El ICMP
Echo Reply debe ser trasportado al proceso que origino el ICMP Echo Request. 

Su formato es el siguiente: 

	+---------------+---------------+-------------------------------+
	|     Type      |     Code      |          Checksum             |
	+---------------+---------------+-------------------------------+
	|           Identifier          |        Sequence Number        |
	+-------------------------------+-------------------------------+
	|     Data ...							|
	+---------------------------------------------------------------+ 

 Type: 129 

 Code: 0 

 Checksum: Suma de control, para la comprobacion de la informacion. 

 Identifier: Identificador que debe contrastar con los ICMP Echo request
 que se han recibido. 

 Sequence Number: Secuencia de numeros, que debe contrastar con los ICMP Echo
 request que se han recibido en el mismo orden. 

 Data: Datos aleatorios o ceros de relleno. 

4.3 Tipos de ICMPv6 de error 

 Destination Unreachable (Type 1) 

Un ICMP Destination Unreachable es mandado por un router, o por cualquier
nodo, para informar de la imposibilidad de que un paquete lleje a su destino.
NO se deberian mandar ICMPv6, si son ocasionados por problemas de congestion
de la red.
Estos ICMP se dividen en subclases, segun el tipo de problema que halla
ocasionado su emision: 

-Si el error es ocasionado por un envio de un paquete al nodo erroneo, este
enviara un ICMPv6 con codigo 0
-Si el error es ocasionado por un envio hacia un destino cerrado por causas
administrativas (Un firewall por ejemplo), se debe enviar un ICMP de codigo 1.
-Si el error es ocasionado por la imposibilidad de resolver la direccion IP de
un link, se enviara un ICMPv6 con codigo 3.
-Si el error es ocasionado por un fallo en la capa de trasporte si el
puerto esta indisponible para la misma se enviara un ICMP con codigo 4. Por
ejemplo, un paquete TCP enviado a un puerto UDP.
Un nodo que ha recibido un ICMPv6 Destination Unreachable, debe comunicarlo a
la capa superior del proceso. 

El formato seria el siguiente: 

	+---------------+---------------+-------------------------------+
	|     Type      |     Code      |          Checksum             |
	+---------------+---------------+-------------------------------+
	|                             Unused                            |
	+---------------------------------------------------------------+
	|		La maxima cantidad posible de datos del		|
	|		paquete originario del error, sin exceder	|
	| 		el tamaño del MTU.			   	|
	+---------------------------------------------------------------+ 

Type: 0 

Code:   0 - no route to destination
	1 - communication with destination administratively prohibited
	2 - (not assigned)
	3 - address unreachable
	4 - port unreachable 

Unused: Campo sin uso, que debe ser inicializado a 0 por el emisor e ignorado
por el destino. 

Checksum: Suma de control, para la comprobacion de la informacion. 

 Packet Too Big (Type 2) 

Un ICMP Packet Too Big , es enviado cuando el tamaño maximo de un paquete es
superior a la MTU del interfaz de red al que se ha enviado. Tambien es enviado
por un router, si el siguiente salto es tiene un MTU inferior al tamaño del
paquete. Este ICMP, puede ser usado para saber el MTU de un path. 

El formato seria el siguiente: 

	+---------------+---------------+-------------------------------+
	|     Type      |     Code      |          Checksum             |
	+---------------+---------------+-------------------------------+
	|				 MTU				|
	+---------------------------------------------------------------+
	|		La maxima cantidad posible de datos del		|
	|		paquete originario del error, sin exceder	|
	| 		el tamaño del MTU.			   	|
	+---------------------------------------------------------------+ 

Type: 2 

Code: 0 (Inicializado a 0 por el origen, ignorado por el destino) 

Checksum: Suma de control, para la comprobacion de la informacion. 

MTU: MTU del siguiente salto. 

 Time Exceeded (Type 3) 

Si un router recive un paquete con el Hop limit a 0 o si es el quien
lo tiene que poner a 0, el paquete es descartado y se envia un ICMPv6 Time
Exceeded. Si un host, no puede ensamblar un paquete en un tiempo x, descartara
todos los fragmentos recibidos y tambien enviara un ICMP de esta clase.
La llegada de un ICMPv6, debe ser notificada a la capa superior de trasporte. 

El formato queda de esta forma: 

	+---------------+---------------+-------------------------------+
	|     Type      |     Code      |          Checksum             |
	+---------------+---------------+-------------------------------+
	|				Unused				|
	+---------------------------------------------------------------+
	|		La maxima cantidad posible de datos del		|
	|		paquete originario del error, sin exceder	|
	| 		el tamaño del MTU.			   	|
	+---------------------------------------------------------------+ 

Type: 3
Code: 0 - hop limit exceeded in transit (Rebasado el limite de saltos)
      1 - fragment reassembly time exceeded (Rebasado el tiempo de
          ensamblado en destino) 

Unused: Campo inicializado a 0 en origen, e ignorado por destino. 

Checksum: Suma de control, para la comprobacion de la informacion. 

 Parameter Problem (Type 4) 

Si un nodo IPv6, al procesar un paquete, encuantra un error en uno de los
parametros de sus campos, enviara un ICMP Parameter Problem informando al
destino de la situacion del error en el paquete. 

El formato quedaria asi: 

	+---------------+---------------+-------------------------------+
	|     Type      |     Code      |          Checksum             |
	+---------------+---------------+-------------------------------+
	|				Pointer				|
	+---------------------------------------------------------------+
	|		La maxima cantidad posible de datos del		|
	|		paquete originario del error, sin exceder	|
	| 		el tamaño del MTU.			   	|
	+---------------------------------------------------------------+ 

Type: 4 

Code:   0 - erroneous header field encountered (Error en la cabecera)
	1 - unrecognized Next Header type encountered (Numero de Next Header
	    desconocido)
 	2 - unrecognized IPv6 option encountered (Opcion desconocida en el
	    paquete IPv6) 

Checksum: Suma de control, para la comprobacion de la informacion. 

Pointer: Contiene un offset, para la localizacion del parametro que origino el
	 error. El offset, es el byte donde se encuentra el dato erroneo
	 dentro del paquete. 

 

4.4 Seguridad e ICMPv6 

Los ataques producidos por los ICMP enviados de forma masiva, generalmente para
provocar un DOS (Denial of Service) y/o la caida de un nodo de una red y/o de
una conexion, son lo suficientemente conocidos como para no tener que volver a
explicarlos.
El protocolo IPv6, implementa medios de autentificacion que pueden evitar los
mas comunes. 

-Caida por recepcion de envios masivos de ICMP.
-Desconexion de un host, por el envio de un atacante al servidor, de ICMP con
mensages de error.
-Falsificacion de ICMP. 

Todos estos problemas, estan descritos en el RFC 2463, asi como sus posibles
soluciones mediante aplicaciones de metodos autentificadores a niver de
trasporte IP y/o mediante el chesum de control. 

				|-------------------------------| 

5 Links, bibliografia, etc... 

5.1 Links sobre IPv6 

*+* Url donde se centraliza IPv6 

http://www.ipv6.org 

http://dir.yahoo.com/Computers_and_Internet/Comunications_and_Networking/
 Protocols/IP/IPv6 

ftp://ftp.inria.fr/network/ipv6/netbsd 

ftp://ftp.inria.fr/network/ipv6/freebsd 

http://www.ipv6.nrl.navy.mil/ipv6+ipsec/ 

http://sunsite.cnlab-switch.ch/ 

http://www.redhat.com/mirrors/LPD/HOWTO/Net-HOWTO-6.html 

http://www.terra.net/ipv6/ 

http://playground.sun.com/pub/ipng/html/ipng-main.html 

ftp://ftp.kyoto.wide.ad.jp/IPv6/ 

http://www.research.microsoft.com/msripv6  (tnx zhodiac) 

ftp://ftp.kame.net./pub/kame/misc/ 

 5.2   Bibliografia. 

TCP/IP	*** Dr. Sidnie Feit 

TCP/IP Illustrated Vol 1 *** W. Richard Stevens (D.E.P) 

Computers Networks *** Andrews S. Tannembaum 

HOW-TO de Linux 

RFC:
	2373 IP Version 6 Addressing Architecture
	2462 IPv6 Stateless Address autoconfiguration
	2461 Neighbor Discovery for IP Version 6
	2460 Internet Protocol, Version 6 (IPv6) Specification
	2463 Internet Control Message Protocol (ICMPv6) for the Internet
	     Protocol Version 6 (IPv6) Specification
	2454 IP Version 6 Management Information Base for the
	     User Datagram Protocol
	2553 Basic Socket Interface Extensions for IPv6
	2543 6Bone Routing Practice
	2529 Transmission of IPv6 over IPv4 Domains without Explicit Tunnels 

5.3   Agradecimientos y comentarios finales. 

En primer lugar a todos los de Undersec.com, mis amigos; a ABBA, la banda
sonora de este doc ;), a todos los que me devolvieron la ilusion por lo que
hacia, cuando se acercaba el precipicio y Linux, mi vicio actual (Por lo
menos el mas confesable ;). 

Como comentario final, recomendaria que se leyera este doc como un apoyo
solamente. Para una informacion mas profunda, se deben leer los rfc destinados
a tal fin, y comentados en la seccion de bibliografia.
Espero que hayas disfrutado leyendo. 

-------------------------------------------------------------------------------
Septiembre de 1999
http://www.undersec.com
p0th@undersec.com
FacebooktwitterredditlinkedinmailFacebooktwitterredditlinkedinmail
abril 12, 2011

Etiquetas: , , , ,
  • Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *