Creación de una isla IPv6 y conexión al 6bone

Horacio J. Peña

IPv6 es el protocolo que reemplazará al TCP/IP actual (IPv4) para las comunicaciones de Internet en el futuro. Creemos muy importante estar preparados para este cambio desde ahora mismo.

La forma de hacerlo es participando en el 6bone. El 6bone es una red mundial que utiliza protocolos IPv6. Para realizar la conexión se utilizan túneles montados sobre la Internet IPv4 acteal (los datagramas IPv4 se encapsulan como carga en datagramas IPv4) A medida que más redes funcionen con IPv6 los túneles dejarán paso a conexiones físicas (y el 6bone dejará de llamarse así, le diremos sencillamente Internet)

Para conectarse al 6bone existen diversos métodos. En este artículo veremos el más completa (que también es el más complejo) El único requisito que debe cumplirse para poder conectarse es disponer de un equipo con capacidad de ruteo IPv6 y que tenga asignada una dirección IPv4 estática.

Creación y conexión de la isla

Los pasos a seguir son:

Si bien cualquier sistema operativo que tenga capacidad de rutear IPv6 (desde routers Cisco hasta NT) puede servir, tenemos experiencia solo con Linux y BSD, por lo que los ejemplos se darán para estos sistemas. Cualquier equipo que funcione con estos SO (incluso un 386) sirve.

Preparar el router para que soporte IPv6

En las instalaciones recientes de la mayoría de las distribuciones de Linux y de los BSD, IPv6 viene activado por defecto. En caso de que no sea así será necesario recompilar el kernel.

En BSD deben agregarse a la configuración del kernel las líneas:

options INET6
pseudo-device gif 4

En Linux deben activarse las opciones:

En ambos sistemas se debe recompilar el kernel de la forma habitual.

De la misma manera, puede hacer falta instalar algunas aplicaciones. En caso de usar BSD la instalación normalmente incluye todo lo necesario, en Linux habrá que asegurarse la presencia de ping6 e ip (este último comando se encuentra en el paquete iproute o iproute2)

Elegir un pTLA o pNLA como upstream y contactar a sus administradores

Los nodos del 6bone que pueden dar conexión a otros se llaman pTLA o pNLA (la diferencia está en el nivel que ocupen en la jerarquía de ruteo)

Para conectar al 6bone precisamos que alguien nos provea de tráfico hacia la red. Habrá entonces que encontrar algún nodo del 6bone dispuesto a hacerlo. A este lo llamaremos upstream.

Debemos indicar por lo menos los siguientes datos:

Necesitaremos de nuestro upstream:

Acerca de los números de sistema autónomo hablaremos luego.

Nuestro upstream debe asignarnos un bloque de direcciones IPv6 para nuestra isla. Estos bloques son equivalentes a los CIDR en IPv4, normalmente tienen un prefijo /48 (esto es, los primeros 48 bits identifican nuestra isla, y tenemos 16 bits para organizar nuestras redes, teniendo capacidad para una cantidad a los efectos prácticos infinita de dispositivos conectados a cada red)

Uninet, mediante su proyecto de IPv6 se ofrece a ser este upstream para quien sea que lo pida. Luego hablaremos más de esto.

En adelante tomaremos los siguientes valores como ejemplo:

Crear el túnel hacia el upstream

Hemos de crear el túnel asignando las direcciones IPv4 local y remota y luego configurar la interfaz del túnel como una punto a punto normal.

En BSD se debe modificar /etc/rc.conf para que incluya las siguientes líneas:

ipv6_enable="YES" # Activa IPv6
ipv6_gateway_enable="YES" # Activa las funciones de ruteo IPv6
network_interfaces="xl0 lo0 gif0" # Reemplazar xl0 por el nombre del dispositivo de red local que corresponda.
				  # gif0 es la interfaz que usaremos para el túnel
ipv6_network_interfaces="lo0 xl0 gif0" # Reemplazar xl0 por el nombre del dispositivo de red local que corresponda.
gif_interfaces="gif0"

gifconfig_gif0="208.221.169.1 200.47.36.254" # Recordemos reemplazar estos valores de ejemplo por los que correspondan.
ifconfig_gif0="inet6 3ffe:29a1:ffff:fffe::2 3ffe:29a1:ffff:fffe::1 prefixlen 128"

Para que el sistema acepte los cambios debemos reiniciar.

En Linux debemos agregar a alguno de los scripts de inicialización del sistema (en cuál hacerlo depende de la distribución) lo siguiente:

ip tunnel add 6bone mode sit remote 200.47.36.254 local 208.221.169.1 ttl 64
	# Creamos una nueva interfaz, llamada 6bone, de tunel modo SIT (IPv6 en IPv4),
	# desde nuestra dirección 208.221.169.1 a la dirección de nuestro upstream 200.47.36.254,
	# y que los datagramas IPv4 generados por el tunel lleven 64 hops como TTL

ip link set 6bone up # Activamos la interfaz
ip address add 3ffe:29a1:ffff:fffe::2/128 dev 6bone # Configuramos nuestra dirección IPv6 del túnel
ip route add 3ffe:29a1:ffff:fffe::1/128 dev 6bone # Configuramos la dirección IPv6 de nuestro upstream

(la últimas dos líneas deberían poder reemplazarse por:

ip address add 3ffe:29a1:ffff:fffe::2 peer 3ffe:29a1:ffff:fffe::1 dev 6bone

pero esta sintaxis no está implementada todavía en el iproute2 para IPv6)

Una vez hecho esto (y si nuestro upstream hizo su parte) podríamos verificar la conectividad por el túnel:

# ping6 -n 3ffe:29a1:ffff:fffe::1
PING 3ffe:29a1:ffff:fffe::1(3ffe:29a1:ffff:fffe::1) from 3ffe:29a1:ffff:fffe::2 : 56 data bytes
64 bytes from 3ffe:29a1:ffff:fffe::1: icmp_seq=0 hops=64 time=739 usec
64 bytes from 3ffe:29a1:ffff:fffe::1: icmp_seq=1 hops=64 time=724 usec
64 bytes from 3ffe:29a1:ffff:fffe::1: icmp_seq=2 hops=64 time=718 usec
64 bytes from 3ffe:29a1:ffff:fffe::1: icmp_seq=3 hops=64 time=715 usec
64 bytes from 3ffe:29a1:ffff:fffe::1: icmp_seq=4 hops=64 time=733 usec
64 bytes from 3ffe:29a1:ffff:fffe::1: icmp_seq=5 hops=64 time=742 usec
64 bytes from 3ffe:29a1:ffff:fffe::1: icmp_seq=6 hops=64 time=2.128 msec
64 bytes from 3ffe:29a1:ffff:fffe::1: icmp_seq=7 hops=64 time=1.012 msec

Activar protocolos de ruteo

Para que una red de redes funcione hace falta que los routers tengan mapas (totales o parciales) de la red. Estos mapas pueden generarse manualmente mediante rutas estáticas o automáticamente mediante protocolos de ruteo.

En la isla que hemos preparado, sería suficiente trabajar con rutas estáticas, sin embargo, dado que estamos experimentando es conveniente hacerlo también con los nuevos protocolos de ruteo y generar estos mapas automáticamente.

Se llama sistema autónomo a ``la red de alguien'', esto es, a una red o conjunto de redes controladas por una única entidad administrativa. Cada sistema autónomo decide cómo manejar sus redes internas independientemente de cualquier otro, y se conecta a otros sistemas autónomos por medio de protocolos de ruteo externos. El protocolo de ruteo externo más común es el BGP.

Este protocolo se maneja en base a números de sistema autónomo (ASN), en caso de no tener nosotros uno debemos pedirle a nuestro upstream que nos asigne un ASN reservado para nuestra conexión. Hay que tener cuidado con esto y no elegir cualquier número como ASN ya que podríamos generar problemas graves de ruteo. Si nuestra organización no tiene asignado un ASN es mejor dejarle a nuestro upstream la tarea de elegirlo por nosotros.

Basicamente, lo que hace BGP es establecer una relación de pares entre dos routers que pertenecen a distintos sistemas autónomos y esos routers se informan entre sí acerca de a qué redes conocen como hacer llegar paquetes, con lo que pueden formarse los mapas de los que hablabamos antes.

Para poder correr BGP en BSD o Linux usaremos el administrador de protocolos de ruteo Zebra. Este está disponible como paquete en varias distribuciones Linux, como port en los BSD, y en última instancia puede compilarse de los fuentes disponibles en http://www.zebra.org/.

Una vez compilado debe configurarse para que corran los procesos bgpd y zebra (normalmente lo único necesario es renombrar los ficheros zebra.conf.sample y bgpd.conf.sample a zebra.conf y bgpd.conf, y luego correr el script de inicialización del zebra) En los BSD hará falta agregar en /etc/rc.conf las líneas:

router_enable="YES"

router="/usr/local/sbin/zebractl"
router_flags="start"
rtadvd_enable="NO"

Tras esto, hemos de configurar el protocolo de ruteo, conectandonos al puerto 2605 (bgpd) de nuestro router usando telnet.

Hello, this is zebra (version 0.91a).
Copyright 1996-2001 Kunihiro Ishiguro.


User Access Verification

Password:
ipv6-gw> ena
Password:
ipv6-gw# conf t

(las claves en la configuración por default son zebra, conviene cambiarlas)

ipv6-gw(config)# password nuevaclave
ipv6-gw(config)# enable password nuevaclave

Para configurar el enlace BGP debemos ingresar al modo de configuración de router BGP, informando al sistema nuestro número de sistema autónomo (64500) y el bloque que se nos ha asignado (3ffe:29a1:fffe::/48)

ipv6-gw(config)# router bgp 64500
ipv6-gw(config-router)# ipv6 bgp network 3ffe:29a1:fffe::/48

Luego configuraremos la conexión BGP a nuestro upstream:

ipv6-gw(config-router)# ipv6 bgp neighbor 3ffe:29a1:ffff:fffe::1 remote-as 45328
ipv6-gw(config-router)# ipv6 bgp neighbor 3ffe:29a1:ffff:fffe::1 description Conexión al 6bone
ipv6-gw(config-router)# ipv6 bgp neighbor 3ffe:29a1:ffff:fffe::1 interface gif0 (nota: cambiar por 6bone, o el nombre que le hayamos dado a la interfaz del túnel si estamos trabajando en linux)
ipv6-gw(config-router)# ipv6 bgp neighbor 3ffe:29a1:ffff:fffe::1 next-hop-self

Guardamos la configuración.

ipv6-gw(config-router)# end
ipv6-gw# write f

Una vez hecho esto, y si nuestro upstream ha hecho lo propio deberíamos poder ver la conexión bgp activa:

ipv6-gw# show ipv6 bgp summary
BGP router identifier 208.221.169.1 local AS number 64500
131 BGP AS-PATH entries
0 BGP community entries

 Neighbor                          AS      MsgRcvd MsgSent  Up/Down  State/PfxRcd
3ffe:29a1:ffff:fffe::1          45328          200      10  00:01:03          152
  Description: Conexión al 6bone

Total number of neighbors 1

Y, desde el sistema operativo deberíamos tener conectividad a toda la red de 6bone:

# ping6 -n www.6bone.net
PING www.6bone.net(3ffe:b00:c18:1::10) from 3ffe:29a1:ffff:fffe::2 : 56 data bytes
64 bytes from 3ffe:b00:c18:1::10: icmp_seq=0 hops=58 time=628.050 msec
64 bytes from 3ffe:b00:c18:1::10: icmp_seq=1 hops=58 time=720.533 msec
64 bytes from 3ffe:b00:c18:1::10: icmp_seq=2 hops=58 time=623.119 msec

¡Nuestra isla ya está funcionando en el 6bone!

Registrar la isla en el 6bone

El último paso es anotarse en el registro de islas del 6bone. Para ello se debe ingresar a http://www.viagenie.qc.ca/en/ipv6/registry/index.shtml y leer las instrucciones que allí se dan.

En breve en el sitio del proyecto de IPv6 de uninet incluiremos una ayuda en castellano para hacer este registro facilmente.

Agregar otros equipos (clientes y servidores) a la isla

Ya tenemos nuestra isla de un equipo conectada al 6bone. Y ahora empieza la diversión, que consiste en ir expandiendo la isla hasta que toda nuestra red funcione con IPv6.

El paso inicial (y el único que veremos aquí) es configurar el router para que anuncie su existencia en la red local a la que esté conectado. Para ello debemos conectarnos al puerto 2601 (zebra), entrar en el modo de configuración y agregar lo siguiente (modificando xl0 por la interfaz de red local que corresponda:)

ipv6-gw(config)# interface xl0
ipv6-gw(config-if)# ipv6 nd send-ra 3ffe:29a1:fffe:1::/64

Ahora, cualquier equipo con capacidad IPv6 se autoconfigurará e ingresará al 6bone con solo conectarlo al mismo segmento que el router.

De aquí en más, el trabajo principal será ir modificando las aplicaciones que solo funcionan en IPv4 por aquellas que lo hagan con IPv6.

Proyecto IPv6 en Hispanoamérica de Uninet

(Notese que usamos Hispanoamérica en su sentido más completo, que incluye toda la Hispania -España y Portugal- y las Américas española y portuguesa)

Desde mediados del año pasado, Uninet viene preparando el proyecto que ahora anunciamos. Desde hace ya dos años que Uninet tiene una participación activa en el 6bone y ahora quiere usar esa experiencia ganada para difundir esta tecnología en Hispanoamérica.

Por esto Uninet se compromete a dar tráfico hacia el 6bone, bloques de direcciones IPv6 y ayuda técnica a todo aquel que quiera participar del proyecto (siempre y cuando el objetivo de la conexión no sea utilizarla para fines ilícitos)

La forma de solicitar esto será por mail a 6bone@uninet.edu o ipv6@uninet.edu, donde se deberán incluir los siguientes datos:

Por supuesto, aunque el proyecto tiene como objetivo la creación de islas en la región, lo que hará que estas -y especialmente aquellas que se ubiquen en países donde no haya otros proyectos de IPv6- tengan prioridad, ofreceremos lo mismo a todo aquel que lo pida sin importar su ubicación geográfica.

Este proyecto se llevará a cabo principalmente desde el nodo Compendium (laboratorio de redes de Uninet) Se podrá seguir la evolución de este proyecto en la página web ubicada en http://ipv6-gw.compendium.net.ar/ (accesible por IPv4 además de por IPv6)