Apache web server sobre IPv6
Para esta entrega decidí traerles un muy buen artículo realizado por Emiliano Marini, el cual, por suerte, me dio permiso para publicarlo en el blog. Emiliano es bastante fanático del IPv6 y espera que en algún futuro no muy lejano se comience a utilizar masivamente, así que dedica algunas de sus horas libres a investigar cómo funcionan ciertas cosas con este protocolo.
En este caso armó un artículo sobre cómo utilizar Apache sobre IPv6 luego de pelearse un rato haciendo pruebas. Realmente es muy interesante.

Emiliano es Ingeniero en Sistemas, además trabaja como administrador de seguridad y al igual que yo promueve el uso de herramientas libres.

Este es el primer artículo que publico que no fue realizado por mi, y espero poder traerles más en el futuro, dado que tengo varios amigos haciendo trabajos muy interesantes y que me gustaría poder compartir acá.

Sin más introducción, los dejo con el artículo.


Prólogo

Esta es la primer entrega (espero que sea la primera de muchas) de una serie de artículos de investigación sobre IPv6. Actualmente, IPv6 es el tema que me resulta más interesante para investigar, siempre con la ayuda de VirtualBox. Para el final de Redes y Teleprocesamiento investigué (junto con Sebastián Silva) 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.
Por lo tanto ahora voy a investigar los protocolos de alto nivel, empezando por lo básico: HTTP sobre IPv6 y cómo levantar un servidor web Apache que funcione sobre IPv6 ("quiere dejar de decir IPv6" diría Marge Simpson).
Debido a que las tecnologías libres incentivan y motivan la investigación y el desarrollo, voy a trabajar con sistemas operativos y software libre, por lo tanto dejando de lado los productos del amigo "Puertas".


Introducción

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).


Desarrollo

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:



Conclusión

La configuración de Apache sobre IPv6 resultó tan simple como para IPv4.


Referencias

[1] Ruteo IPv6 Utilizando PCs. Marini, E., Silva, S. 2009
[2] Apache IPv6 Configuration: Dual Stacked IPv4 & IPv6 Virtual Hosts
[3] ip6tables: IPv6 Firewall For Linux
[4] Manual básico de creación de Host virtuales en Apache
[5] Apache HTTP Server Version 2.0 Documentation

3 comentarios:

Nacho dijo...

Muy bueno el artículo. Sobre todo para mi que me sirve para una introducción a la implementación de servicios con IPv6.

Saludos

Unknown dijo...

GRACIAS por el articulo, espero poder con esa configuracion !!!

ArbelaezGeek dijo...

Hola ¿Como puedo hacerlo desde windows 10?

Publicar un comentario