Actualmente, IPv6 es el tema que me resulta más interesante para investigar (siempre contando con la ayuda de VirtualBox). Hace un tiempo investigué los protocolos de bajo nivel: configuración estática de direcciones IPv6; Neighbor Discovery; Autoconfiguración de direcciones IPv6 de ámbito global tanto en routers (i.e. PC's funcionando como routers, se instala el demonio radvd) como en clientes (trivial); RIPng con zebra; y DNS utilizando bind9.

En este artículo voy a explicar HTTP sobre IPv6 y cómo levantar un servidor web Apache que funcione sobre IPv6. Debido a que las tecnologías libres incentivan y motivan la investigación y el desarrollo, siempre trabajo con sistemas operativos y software libre.



Para los experimentos cuento con un servidor Apache 2.0 ejecutándose en un host Ubuntu 8.04 con kernel 2.6.28 (este artículo va dirigido a un público avanzado, por lo tanto voy a saltear los pasos de instalación de SO y web server). Además cuento con un host XUbuntu 9.04 que va a funcionar como cliente utilizando Mozilla Firefox 3.0.11. Ambos hosts se encuentran en la misma red local cuya dirección es 2001:db8:0:2000::/64. El servidor Ubuntu tiene asignada la dirección IPv6 2001:db8:0:2000::1.

Como información adicional, cabe destacar que el mismo host Ubuntu funciona además como router (es quien le otorga el prefijo de red global "2001:db8:0:2000::/64" al host XUbuntu) y como servidor DNS ejecutando bind9 (escuchando pedidos en la dirección 2001:db8:0:3000::1).

Contando con el servidor Apache instalado, el primer paso es indicarle que escuche pedidos HTTP en un socket IPv6. Para esto se utiliza la directiva "Listen". Se edita el archivo de configuración de Apache:

$ sudo nano /etc/apache2/apache2.conf

y se agrega:

Listen [2001:db8:0:2000::1]:8008

Se observa que la dirección debe ir entre corchetes "[" para separar el puerto, debido a que IPv6 utiliza dos puntos ":" en lugar de punto "." en las direcciones IP. En este caso se eligió el puerto 8008.

Luego debe reiniciarse el servidor Apache para que utilice la nueva configuración:

$ sudo /etc/init.d/apache2 restart

El demonio inicia correctamente y se puede comprobar que está escuchando el el puerto 8008 utilizando nmap. Para esto se utiliza la opción "-6" que indica que se trata de un escaneo IPv6:

$ sudo nmap -sV -6 2001:db8:0:2000::1

Starting Nmap 4.76 ( http://nmap.org ) at 2010-01-06 19:47 ARST

Interesting ports on 2001:db8:0:2000::1:
Not shown: 996 closed ports
PORT STATE SERVICE VERSION
53/tcp open domain ISC BIND 9.5.1-P2
139/tcp open netbios-ssn Samba smbd 3.X (workgroup: GRUPO_TRABAJO)
445/tcp open netbios-ssn Samba smbd 3.X (workgroup: GRUPO_TRABAJO)
8008/tcp open http Apache httpd

Host script results:
| Discover OS Version over NetBIOS and SMB: Unix
|_ Discover system time over SMB: 2010-01-06 19:47:15 UTC-2

Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 12.16 seconds

Se puede comprobar más rápida y fácilmente utilizando netstat, pero aprovecho para probar herramientas de pentest sobre IPv6:

$ sudo netstat -tulpn | grep 8008
tcp6 0 0 2001:db8:0:2000::1:8008 :::* LISTEN 5310/apache2

Luego se puede probar la conexión a través de IPv6 utilizando "netcat6". Para instalar netcat6 en K/X/Ubuntu:

$ sudo aptitude install netcat6

Luego se conecta con el servidor Apache:

$ ping6 2001:db8:0:2000::1 -c 3
PING 2001:db8:0:2000::1(2001:db8:0:2000::1) 56 data bytes
64 bytes from 2001:db8:0:2000::1: icmp_seq=1 ttl=64 time=2.99 ms
64 bytes from 2001:db8:0:2000::1: icmp_seq=2 ttl=64 time=1.06 ms
64 bytes from 2001:db8:0:2000::1: icmp_seq=3 ttl=64 time=0.813 ms

--- 2001:db8:0:2000::1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 0.813/1.622/2.993/0.974 ms

$ nc6 2001:db8:0:2000::1 8008
OPTIONS / HTTP/1.0

HTTP/1.1 200 OK
Date: Wed, 06 Jan 2010 22:08:15 GMT
Server: Apache
Allow: GET,HEAD,POST,OPTIONS
Vary: Accept-Encoding
Content-Length: 0
Connection: close
Content-Type: text/html

Genial! Ya tenemos el servidor Apache trabajando sobre IPv6. Pero esto no es todo...

Si se están utilizando iptables, se deben reconfigurar para permitir el acceso al servidor web via IPv6. Debería agregarse una línea similar a la siguiente:

-A INPUT -m tcp -p tcp --dport 80 -j ACCEPT

De lo contrario no se podrá conectar al servidor, para más información sobre ip6tables véase [3].

Además, Apache utiliza hosts virtuales (VirtualHost) para mantener múltiples nombres de host en el servidor. Entonces, antes de poder acceder a documentos en el servidor se debe configurar el VirtualHost adecuadamente. Aquí existen dos posibilidades, modificar un VirtualHost IPv4 existente, o agregar uno nuevo si se desea trabajar con dual stack.
Los hosts virtuales se configuran en el archivo /etc/apache2/sites-enabled/000-default:

$ sudo gedit /etc/apache2/sites-enabled/000-default

Se agrega un nuevo VirtualHost:

<VirtualHost [2001:db8:0:2000::1]>

# Configuración

</VirtualHost>

La configuración del host virtual es exactamente igual que para IPv4, la única diferencia se observa en la dirección IPv6 en el tag <VirtualHost>. Es conveniente utilizar logs separados para IPv4 e IPv6 agregando las siguientes líneas en la configuración del VirtualHost:

ErrorLog "/var/log/apache2/ipv6.error.log"
CustomLog "/var/log/apache2/ipv6.access.log" common

Finalizada la configuración del VirtualHost es posible acceder al servidor desde el cliente utilizando Firefox, como se observa en las siguientes capturas:




Ahora falta que funcione utilizando DNS. Como había mencionado anteriormente, el mismo host Ubuntu funciona como servidor DNS utilizando bind9, a continuación se muestra el contenido de la zona "proyecto.com":

File: /etc/bind/zones/proyecto.com.db

@ IN SOA ubuntu.proyecto.com. postmaster.proyecto.com. (
2001012501
3H ; refresh
15M ; retry
1w ; expiry
1D) ; minimum

IN NS ns.proyecto.com

;
;
ns IN AAAA 2001:db8:0:3000::1
freebsd IN AAAA 2001:db8:0:3000::2
ubuntu IN AAAA 2001:db8:0:2000::1
winxp IN AAAA 2001:db8:0:1000:a00:27ff:fed8:ae0b
xubuntu IN AAAA 2001:db8:0:2000:a00:27ff:fe20:9983

Se observa que el servidor tiene el nombre de dominio "ubuntu.proyecto.com". Por lo tanto luego de iniciar bind9 es posible acceder desde el cliente utilizando ese nombre como se observa en las siguientes capturas:




Capturando el tráfico con Wireshark se observa la consulta DNS originada por Firefox:


La conclusión es que la configuración de Apache sobre IPv6 resulta tan simple como para IPv4. A continuación dejo algunas referencias de este trabajo.

Apache IPv6 Configuration: Dual Stacked IPv4 & IPv6 Virtual Hosts
ip6tables: IPv6 Firewall For Linux
Manual básico de creación de Host virtuales en Apache
Apache HTTP Server Version 2.0 Documentation


Tal vez pueda interesarte


Compartí este artículo