Guía del enrutador IPv6 en Gentoo

Peter Johanson  Desarrollador
Jorge Paulo  Editor
Sven Vermeulen  Editor, Revisor
Camille Huot  Editor
Pasi Valminen  Editor
Alberto García Hierro  Traductor
Enrique Barbeito García  Traductor

Actualizado 10 de septiembre, 2008

1.  Configuración del núcleo

Configuración básica del núcleo

Cualquiera de los núcleos 2.6 disponibles en Gentoo soportará conexiones IPv6 fácilmente. La nueva pila USAGI para IPv6 está integrada en el núcleo desde la versión 2.6.0.

Listado de Código 1.1: Emergiendo un núcleo

# emerge gentoo-sources

Ahora estamos listos para entrar en el directorio de las fuentes del núcleo y comenzar con su configuración.

Listado de Código 1.2: Configurando el núcleo de Linux

# cd /usr/src/linux
# make menuconfig

Nota: Esta guía asume que el enlace /usr/src/linux apunta a las fuentes que estará usando.

Listado de Código 1.3: Opciones de 'make menuconfig'

Device Drivers --->
Networking support --->
Networking options --->
   <*> The IPv6 protocol (EXPERIMENTAL)
(Las opciones IPv6 bajo ésta pueden ser útiles para otras muchas aplicaciones,
pero no deberían de ser necesarias para una configuración básica)

(Esta opción solo es necesaria si está usando ptrtd para la conversión de IPv6 a IPv4)
[*] Network device support
   <*> Universal TUN/TAP device driver support

Probando el soporte IPv6

Después de activar las opciones recomendadas, recompile su núcleo y reinicie usando su nuevo núcleo con IPv6 activado.

Si todavía no tiene iproute2 instalado, le animamos a hacerlo ahora. iproute2 es una suite de configuración de red que contiene ip, el famoso sustituto para ifconfig, route, iptunnel y otros ...

Listado de Código 1.4: Instalando iproute2

# emerge sys-apps/iproute2

Aviso: El uso de ifconfig puede ocasionar serios dolores de cabeza si tiene múltiples dispositivos de tunel. Tiene que eliminar los túneles en orden inverso, quiere decir que el creado en último lugar debe ser eliminado primero ¡Queda avisado!

Si IPv6 está funcionando, el dispositivo de loopback debería mostrar una dirección IPv6:

Listado de Código 1.5: Comprobando el dispositivo de loopback

# ip -6 addr show lo
1: lo: <LOOPBACK,UP> mtu 16436
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
    (Las líneas de arriba demuestran que las cosas funcionan)

Antes de proseguir, asegúrese de añadir ipv6 a su lista de variables USE en make.conf, de tal modo que en futuras instalaciones de paquetes se incluirá soporte para IPv6.

2.  Configuración del túnel

Configuración básica

La mayoría de los proveedores de Internet todavía no ofrecen conexiones IPv6 de modo nativo. Para saltarse está limitación, existen varios proveedores de túneles en todo el mundo que ofrecen gratuitamente túneles IPv6. Esto le permite hacer un túnel para todas las conexiones IPv6 a través de una conexión IPv4.

Proveedor Situación geográfica
Hurricane Electric EE.UU./Canada
Freenet6 EE.UU.
Sixxs Europa
Singnet Singapur
Aarnet Australia/Pacífico Sur

A continuación hay dos ejemplos de configuración de un túnel IPv6 con dos populares proveedores de norteamérica: Hurricane Electric (también se aplica a túneles de sixxs.net sin mecánismo heartbeat) y Freenet6.

Hurricane Electric

Hurricane Electric (HE de forma abreviada) ofrece túneles IPv6 gratuitos y le asigna un bloque /64 de direcciones. También permite configurar un DNS inverso. Conseguir un túnel de HE es tan sencillo como ir a http://www.tunnelbroker.net y rellenar un formulario.

Nota: El registro incluye una lista de datos personales como su dirección y número de teléfono.

Aviso: Los túneles de HE tardan 24 horas en activarse para evitar abusos.

Una vez activado el túnel y asignado un bloque /64, puede configurar su sistema Gentoo. HE proporciona configuraciones de ejemplo basadas en las utilidades ifconfig e iproute. Los dos siguientes ejemplos asumen que tiene la siguiente configuración:

Dirección IPv4 Local 68.36.91.195
Dirección IPv4 de HE 64.71.128.82
Dirección local del túnel IPv6 2001:470:1F00:FFFF::189
Bloque IPv6k 2001:470:1F00:296::/64

Utilizando el paquete iproute2 y el comando ip, usted haría lo siguiente:

Listado de Código 2.1: Configuración de un túnel IPv6

(Crear un túnel entre la IPv4 local (eth0) and la dirección IPv4 de HE
# ip tunnel add sixbone mode sit remote 64.71.128.82 local 68.36.91.195 ttl 64 dev eth0
(Extraer el túnel indirecto del MTU)
# ip link set sixbone mtu 1280
(Levantar el túnel)
# ip link set sixbone up
(Asignarle la dirección IPv6)
# ip addr add 2001:470:1F00:FFFF::189 dev sixbone
(Enrutar todo el tráfico de direcciones IPv6 a través de nuestro dispositivo túnel 'sixbone')
# ip route add 2000::/3 dev sixbone

Freenet6

Freenet6 es otro proveedor de túneles gratuito. El registro optativo solo requiere un nombre de usuario y una dirección de correo electrónico válida. En Freenet6 han escogido utilizar una estructura de cliente/servidor para administrar el túnel y han creado el cliente freenet6. El cliente está disponible en Portage. Para instalarlo haga:

Listado de Código 2.2: Instalando el cliente de Freenet6

# emerge freenet6

Si elige conectar con autenticación, configure freenet6 editando /etc/freenet6/gw6c.conf. Sólamente debería tener que cambiar los campos userid y passwd colocando los asignados por Freenet6, además de cambiar la puerta de enlace. A continuación tiene una configuración de ejemplo.

Listado de Código 2.3: gw6c.conf de ejemplo

auth_method=any
userid=anonymous
passwd=foobar
template=linux
server=broker.freenet6.net

Probando la conexión

Ahora que el túnel está configurado, puede probar su conexión. La forma más sencilla es usando la herramienta ping6 e intentando hacer ping a un nombre de máquina IPv6.

Listado de Código 2.4: Probando la conexión

# emerge iputils
# ping6 www.kame.net
PING www.kame.net(orange.kame.net) 56 data bytes
64 bytes from orange.kame.net: icmp_seq=1 ttl=52 time=290 ms
64 bytes from orange.kame.net: icmp_seq=2 ttl=52 time=277 ms
64 bytes from orange.kame.net: icmp_seq=3 ttl=52 time=280 ms
64 bytes from orange.kame.net: icmp_seq=4 ttl=52 time=279 ms
64 bytes from orange.kame.net: icmp_seq=5 ttl=52 time=277 ms

--- www.kame.net ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4038ms
rtt min/avg/max/mdev = 277.040/281.041/290.046/4.699 ms

Actualmente se está trabajando para añadir mejor soporte IPv6 a los guiones de inicio de red. Si desea conocer su estado y/o ofrecer ayuda, escriba a latexer@gentoo.org.

3.  Soporte IPv6 en aplicaciones

Re-emergiendo paquetes

A menos que ya tenga USE="ipv6" en /etc/make.conf, probablemente necesitará re-emerger unos cuantos paquetes con soporte IPv6. Para obtener una lista de todos los paquetes instalados afectados por el cambio del parámetro USE, use la opción --newuse (-N) de Portage:

Listado de Código 3.1: Candidatos para ser re-emergidos

# emerge -uDNav world

Si ha cambiado muchos parámetros USE, la lista puede que sea bastante grande. Se recomienda mantener el sistema actualizado para que no sufra en caso de tener que recompilar todos los paquetes afectados.

Nota: Algunos paquetes detectan soporte IPv6 "automágicamente" y por eso no requieren la opción ipv6 en las variables USE. Por eso no todos los paquetes que deberían soportar IPv6, lo soportarán si no lo compilaste con IPv6 habilitado.

Paquetes específicos de IPv6

Hay algunos paquetes que tratan con elementos IPv6. La mayoría se encuentran en /usr/portage/net-misc.

Paquete Descripción
net-misc/ipv6calc Convierte una dirección IPv6 a un formato comprimido
net-misc/netcat6 Versión de netcat que soporta tanto IPv6 como IPv4
dev-perl/Socket6 La parte de las definiciones de socket.h de C y los manipuladores de estructuras relacionados con IPv6

4.  Configuración de DNS

IPv6 y DNS

Los DNS para IPv4 utilizan registros A, los DNS para IPv6 usan registros AAAA. (Esto se debe a que IPv4 tiene un espacio de direcciones de 2^32 mientras que en IPv6 es de 2^128). Para el DNS inverso, el estándar INT es el más soportado. ARPA es el último formato, pero no está tan difundido como INT. Ahora describiremos el soporte para el formato INT.

Configuración de BIND

Las versiones recientes de BIND incluyen un soporte IPv6 excelente. Esta sección asumirá que tiene un conocimiento mínimo de configuración y uso de BIND. Asumiremos que no está corriendo BIND en un entorno enjaulado (chroot). Si, por el contrario, lo está haciendo, simplemente añada el prefijo de la jaula a la mayoría de las rutas en la siguiente sección.

Lo primero que necesita es añadir entradas tanto para la resolución directa como para la resolución inversa en /etc/bind/named.conf.

Listado de Código 4.1: Entradas en named.conf

(Permitimos a bind escuchar a direcciones IPv6.
Usando 'any' es la única forma de hacerlo en versiones anteriores a bind-9.3)
options {
    [...]
    listen-on-v6 { any; }
    [...]
};
(Esto proporcionará DNS directo para el dominio 'ipv6-rules.com':)
zone "ipv6-rules.com" IN {
    type master;
    file "pri/ipv6-rules.com";
};
(El formato para DNS inverso se obtiene bit a bit. Se hace tomando el prefijo IPv6,
invirtiendo el orden de los números y colocando un punto entre cada uno de ellos)
zone "6.9.2.0.0.0.f.1.0.7.4.0.1.0.0.2.ip6.arpa" {
        type master;
        file "pri/rev-ipv6-rules.com.arpa";
};

Ahora crearemos los archivos de zona y añadiremos entradas para todas nuestros nombres de máquina:

Listado de Código 4.2: pri/ipv6-rules.com

$TTL    2h
@       IN      SOA     ipv6-rules.com. webmaster.ipv6-rules.com.  (
                                2003052501 ; Serial
                                28800      ; Refresh
                                14400      ; Retry
                                3600000    ; Expire
                                86400 )    ; Minimum
                NS      ns1.ipv6-rules.com

        IN      AAAA    2001:470:1f00:296::1 ; address for ipv6-rules.com
host1   IN      AAAA    2001:470:1f00:296::2 ; address for host1.ipv6-rules.com
host2   IN      AAAA    2001:470:1f00:296::3:3 ; address for host2.ipv6-rules.com

Listado de Código 4.3: pri/rev-ipv6-rules.com.arpa

$TTL 3d ; Default TTL (bind 8 needs this, bind 9 ignores it)
@       IN SOA ipv6-rules.com. webmaster.ipv6-rules.com. (
                        2003052501      ; Serial number (YYYYMMdd)
                        24h             ; Refresh time
                        30m             ; Retry time
                        2d              ; Expire time
                        3d )            ; Default TTL
        IN      NS     ns1.ipv6-rules.com.
; IPv6 PTR entries
$ORIGIN 6.9.2.0.0.0.f.1.0.7.4.0.1.0.0.2.ip6.arpa.

1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 IN      PTR     ipv6-rules.com.
2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 IN      PTR     host1.ipv6-rules.com.
3.0.0.0.3.0.0.0.0.0.0.0.0.0.0.0 IN      PTR     host2.ipv6-rules.com.

Configuración de DJBDNS

Actualmente hay algunos parches para DJBDNS hechos por terceros disponibles en http://www.fefe.de/dns/ que le permiten funcionar con IPv6. DJBDNS puede instalarse con estos parches emergiéndolo con ipv6 en el USE.

Aviso: Todavía no están soportados todos los tipos de registro con estos parches. En particular, los registros MX y NS no están soportados.

Listado de Código 4.4: Instalando djbdns

# emerge djbdns

Una vez instalado djbdns, puede configurarse con tinydns-setup, respondiendo unas cuantas preguntas sobre las direcciones IP en las que debe escuchar, donde instalar tinydns, etc.

Listado de Código 4.5: Configurando tinydns

# tinydns-setup

Asumiendo que hemos instalado tinydns en /var/tinydns, editaremos /var/tinydns/root/data. Este archivo contendrá todos los datos necesarios para conseguir que tinydns maneje los DNS para su delegación IPv6.

Listado de Código 4.6: Archivo data de ejemplo

(*.ipv6-rules.com manejado autoritariamente por 192.168.0.1)
.ipv6-rules.com:192.168.0.1:a:259200
(DNS inverso autoritario para 2001:470:1f00:296::/64)
.6.9.2.0.0.0.f.1.0.7.4.0.1.0.0.2.ip6.arpa:192.168.0.1:a
(Especifica las IPs para host1 y host2)
6host1.ipv6-rules.com:200104701f0002960000000000000001:86400
6host2.ipv6-rules.com:200104701f0002960000000000000002:86400
(Apunta www a host1)
3www.ipv6-rules.com:200104701f0002960000000000000002:86400

Las líneas que comienzan con 6 tendrán creado tanto un registro AAAA como un registro PTR. Aquellas que comiencen con 3 solamente tendrán un registro AAAA. Además de editar manualmente el archivo data, puede usar los guiones add-host6 y add-alias6 para añadir nuevas entradas. Una vez hecho los cambios al archivo data, simplemente ejecute make desde /var/tinydns/root. Así se creará /var/tinydns/root/data.cfb, el cual usa tinydns como fuente de información para las peticiones DNS.

5.  Enrutador IPv6

Configurar el enrutado

Si queremos que nuestro sistema funcione como enrutador para otros clientes que deseen conectarse al mundo exterior con IPv6, se necesita algo más de configuración. Necesitamos activar el reenvío de paquetes IPv6. Podemos hacerlo de dos maneras.

Listado de Código 5.1: Activando el reenvío

# echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
o
# sysctl -w net.ipv6.conf.all.forwarding=1

Aviso: El guión de inicio radvd, explicado en el próximo capítulo, activa (y desactiva) el reenvío haciendo innecesario el siguiente paso.

Para activar el reenvío en el inicio, necesitará editar /etc/sysctl.conf y modificar la siguiente línea:

Listado de Código 5.2: Fragmento a añadir en sysctl.conf

net.ipv6.conf.default.forwarding=1

Ahora el tráfico debería ser reenviado desde esta máquina a través del túnel establecido con nuestro proveedor.

Para asignar direcciones IPv6 a los clientes, las especificación IPv6 permiten tanto la asignación con estado, como sin estado. La asignación sin estado usa un proceso llamado anuncio de enrutador (en inglés: Router Advertisement y permite a los clientes obtener una dirección IP y una ruta predeterminada simplemente activando el dispositivo de red. Se denomina 'sin estado' porque no se guarda ningún registro del estado de las IPs asignadas y las máquinas a las cuales se les ha asignado. La asignación 'con estado' se maneja mediante DHCPv6. Se llama así porque el servidor mantiene un registro con el estado de los clientes que han solicitado una IP y las que lo han obtenido.

Configuración sin estado

La configuración sin estado se lleva a cabo sencillamente con el demonio de anuncio de enrutador, o radvd.

Listado de Código 5.3: Configurando radvd

# emerge radvd

Después de emerger radvd, necesitamos crear /etc/radvd/radvd.conf que contiene información acerca del bloque de IP del que se asignarán las IPs. Aquí tiene un ejemplo del archivo radvd.conf usando el prefijo asignado por nuestro proveedor.

Listado de Código 5.4: Ejemplo de radvd.conf

interface eth1
{
        (Envía el mensaje de anuncio a otro hosts)
        AdvSendAdvert on;
        (La fragmentación es mala(tm))
        AdvLinkMTU 1280;
        MaxRtrAdvInterval 300;
        (El prefijo de subred IPv6 que hemos asignado por nuestro PoP)
        prefix 2001:470:1F00:296::/64
        {
                AdvOnLink on;
                AdvAutonomous on;
        };
};

Aviso: Asegúrese que la interfaz en la primera línea es la correcta para propagar los anuncios de enrutador hacia su intranet y ¡no hacia su ISP!

En man radvd.conf está disponible información más detallada. Ahora podemos iniciar radvd y configurarlo para que se cargue al inicio.

Listado de Código 5.5: Iniciando radvd

# /etc/init.d/radvd start
# rc-update add radvd default

Configuración con estado

Si desea usar configuración con estado, necesitará instalar y configurar dhcpv6.

Listado de Código 5.6: Instalando dhcpv6

# emerge dhcpv6

Ahora debemos configurar el servidor DHCPv6 editando /etc/dhcp6s.conf.

Listado de Código 5.7: Ejemplo de dhcp6s.conf

prefer-life-time 10000;
valid-life-time 20000;
renew-time 5000;
rebind-time 8000;
interface eth1 {
    link AAA {
        allow unicast;
        send unicast;
        allow rapid-commit;
        send server-preference 5;
        renew-time 1000;
        rebind-time 2400;
        prefer-life-time 2000;
        valid-life-time 3000;
        pool{
            range 2001:470:1f00:296::10 to 2001:470:1f00:296::110/64;
            prefix 2001:470:1f00:296::/64;
        };
    };
};

Ahora podemos arrancar dhcp6s y configurarlo para que se cargue al inicio.

Listado de Código 5.8: Iniciando dhcp6s

# /etc/init.d/dhcp6s start
# rc-update add dhcp6s default

6.  Clientes IPv6

Usando radvd

Ahora los clientes detrás de este enrutador deben ser capaces de acceder a la red vía IPv6. Si está usando radvd, configurar las máquinas debería ser tan sencillo como activar el dispositivo de red. (Probablemente ya lo hayan hecho sus guiones de inicio net.ethX).

Listado de Código 6.1: Conectando a través de IPv6

# ip link set eth0 up
# ip addr show eth0
1: eth0: <BROADCAST,MULTICAST,UP> mtu 1400 qdisc pfifo_fast qlen 1000
    link/ether 00:01:03:2f:27:89 brd ff:ff:ff:ff:ff:ff
    inet6 2001:470:1f00:296:209:6bff:fe06:b7b4/128 scope global
       valid_lft forever preferred_lft forever
    inet6 fe80::209:6bff:fe06:b7b4/64 scope link
       valid_lft forever preferred_lft forever
    inet6 ff02::1/128 scope global
       valid_lft forever preferred_lft forever

Usando DHCPv6

Si el enrutador está configurado para usar DHCPv6, los clientes también necesitarán instalar el paquete dhcpv6. Hecho esto, configure los clientes editando /etc/dhcp6c.conf.

Listado de Código 6.2: Ejemplo de dhcp6c.conf

interface eth0 {
        send rapid-commit;
        request domain-name-servers;
        iaid 11111;
        renew-time 11000;
};

7.  Usando conversión de 6 a 4

Principios básicos

La conversión de 6 a 4 se puede usar si tiene máquinas que necesitan comunicarse con otras máquinas con direcciones IPv4 sobre una conexión IPv6 pura. Puede tener una red interna funcionando enteramente con IPv6, con una máquina tratando las conexión hacia el mundo exterior IPv4/IPv6.

Configuración DNS

Para hacer funcionar la conversión de 6 a 4 necesita configurar un proxy DNS, totd, que enviará registros AAAA para los sitios que solo tienen un registro A. Estos registros AAAA apuntarán a direcciones IPv6 que realmente no existen, pero serán enrutadas a través del proxy 6 a 4.

totd todavía está enmascarado en ~x86, pendiente de más pruebas y tendrá que desenmascararlo añadiendo la siguiente línea en su fichero /etc/portage/package.keywords (vea "man portage" para mayor información acerca de este fichero).

Listado de Código 7.1: totd permanentemente desenmascarado es package.keywords

net-misc/totd ~x86

Después simplemente ejecute emerge:

Listado de Código 7.2: Instalando totd

# emerge totd

Ahora, necesitamos configurar /etc/totd.conf con alguna información básica de configuración.

Listado de Código 7.3: Ejemplo de /etc/totd.conf

(Apunta a un DNS real)
forwarder 192.168.0.2 port 53
(El prefijo que se colocará delante de los registros AAAA falsos)
prefix 3ffe:abcd:1234:9876::
(El puerto en el que correrá totd)
port 5005
(El archivo PID a usar)
pidfile /var/run/totd.pid
(Hacer realmente las tareas 6 a 4)
stf

Nota: totd debe configurarse para usar un puerto diferente al 53 si otro servidor de nombres está corriendo en la misma máquina.

Proxy 6 a 4

ptrtd se usará como proxy 6 a 4, permitiendo las conexiones entre máquinas IPv6 de la red interna y máquinas IPv4 externas.

Listado de Código 7.4: Instalando ptrtd

# emerge ptrtd

Ahora necesitamos configurar ptrtd, especificándole el falso prefijo (el que le especificamos a totd que use) para crear las conexiones del proxy. Edite /etc/conf.d/ptrtd y configure IPV6_PREFIX. Recuerde que debe ser el mismo prefijo con el cual se configuró totd.

Listado de Código 7.5: Ejemplo de /etc/ptrtd.conf

IPV6_PREFIX="3ffe:abcd:1234:9876::"

Ahora puede iniciar totd y configúrelo para que se cargue al arrancar.

Listado de Código 7.6: Starting totd

# /etc/init.d/totd start
# rc-update add totd default

Configuración de los clientes y pruebas

Ahora los clientes deberían estar configurados para conectarse tanto a máquinas IPv4 como IPv6, a través de una conexión basada solamente en IPv6. Asumiendo que los clientes ya han recibido una dirección IPv6 de radvd, simplemente necesitamos añadir una nueva entrada para la resolución de DNS y añadir una ruta predeterminada para esas "direcciones falsas". En primer lugar, añada una entrada al principio de su /etc/resolv.conf apuntando a la máquina corriendo totd.

Listado de Código 7.7: Ejemplo de /etc/resolv.conf

nameserver 2001:470:1f00:296::1 (El servidor corriendo totd)

Para probar la resolución de nombres, solicite un registro AAAA para un sitio IPv4 conocido.

Listado de Código 7.8: Probando la resolución de nombres

# dig aaaa google.com
;; ANSWER SECTION:
google.com.             300     IN      AAAA     3ffe:abcd:1234:9876::d8ef:3364
google.com.             300     IN      AAAA     3ffe:abcd:1234:9876::d8ef:3564

Ahora añadiremos una ruta predeterminada para todas las direcciones que comiencen con nuestro falso prefijo.

Listado de Código 7.9: Añadiendo la ruta predeterminada

(Asumiento que su interfaz IPv6 es eth0)
# ip route add 3ffe:abcd:1234:9876::/64 via 2001:470:1f00:296::1 dev eth0

Finalmente, use ping6 para hacer ping a google.com a su falsa dirección IPv6.

Listado de Código 7.10: Probando 6 a 4

# ping6 -c 2 google.com
PING 3ffe:abcd:1234:9876::d8ef:3364(3ffe:abcd:1234:9876::d8ef:3364) 56 data bytes
64 bytes from 3ffe:abcd:1234:9876::d8ef:3364: icmp_seq=1 ttl=54 time=0.106 ms
64 bytes from 3ffe:abcd:1234:9876::d8ef:3364: icmp_seq=2 ttl=54 time=0.090 ms

--- 3ffe:abcd:1234:9876::d8ef:3364 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.090/0.098/0.106/0.008 ms

Nota: El enrutador corriendo ptrtd está respondiendo, lo cual muestra que todo está funcionando.

8.  Otros recursos

En la red hay gran cantidad de recursos muy buenos relacionados con IPv6.

Sitios web Recurso
www.ipv6.org Información general sobre IPv6
www.linux-ipv6.org/ Proyecto USAGI
www.deepspace6.net Sitio sobre Linux/IPv6
www.kame.net Implementación *BSD

En el IRC, puede probar #ipv6 en Freenode. Puede conectarse a los servidores de Freenode mediante IPv6 usando irc.ipv6.freenode.net.