Archivo de la etiqueta: IPv6

Pequeñas mejoras (o eso espero)

¡A los buenos días!

Hoy por fin he encontrado esos 20 minutos (y las ganas) que necesitaba para actualizar la versión de WordPress, algunos plugins y demás historias del blog. Y la verdad es que estoy bastante cansado de hacer eso cada X tiempo, cuando X tiende a “no mucho”. Es por esto que planeo abandonar WordPress por un sistema de generación de webs estáticas como Jekyll o Hyde. Lo más probable es que acabe utilizando Hyde, ya que está escrito en Python y al menos puedo entenderlo y/o escribir algún plugin que necesite. 🙂

La idea es poder escribir los posts con el ViM utilizando Markdown y mantener el blog en un repositorio de git en GitHub.

Lo que a éste tipo de sistemas les suele faltar es un sistema de comentarios. Pero por suerte tenemos Disqus. Disqus es un sistema externo de comentarios que permite login con Facebook, Twitter, OpenID, etc. y que es posible integrar en prácticamente cualquier sistema de blogging. Con la idea de abandonar WordPress en algún momento, he instalado el plugin de Disqus aquí, de manera que los comentarios que dejéis a partir de ahora serán con Disqus. Lo mejor de todo es que Disqus se sincroniza con la base de datos local de WordPress, por lo que si cambio de idea todos los comentarios seguirán disponibles en la base de datos local. Awesomness^3.

El segundo cambio es transparente y es posible que ya lo hayáis utilizado sin daros cuenta: desde el pasado IPv6 day, saghul.net dispone tanto de regitro DNS de tipo A como AAAA, así que podríamos decir que está IPv6 enabled. Crear un dominio ipv6.dominio.com o www6.dominio.com para una web con WordPress es bastante inútil por lo que comprobé, ya que sólo verás la primera página a través de IPv6, todos los links que WordPress ya tiene generados apuntarían a un dominio que no tiene registro AAAA y por lo tanto se utilizaría IPv4.

IPv6 por toda la casa

Hace un par de meses que no escribo nada por aquí, así que con la excusa del IPv6-day me he animado a escribir un post que hace tiempo tenía pensado escribir.

Vamos a ver cómo conectar no solo un ordenador, sino toda la casa al mundo IPv6. Para ello vamos a suponer que no tenemos IPv6 de manera nativa, pero que disponemos de un servidor en algún datacenter (también sin IPv6 de manera nativa) y un router con GNU/Linux. También vamos a suponer que algo sabemos de OpenVPN y Quagga.

Para llevar a cabo esta frikada he contado con la inestimable ayuda de Mikel “Mike” Jiménez, un yonki de las redes que vive por y para el TCP/IP y el único al que dejaría una shell de root en mi router sin preocuparme. 🙂

Dado que no disponemos de conectividad real IPv6 necesitaremos los servicios de un broker que nos provea de un túnel. Para este montaje utilizaremos el servicio proporcionado por Hurricane. Para poder crear el túnel necesitamos que nuestro extremo disponga de una IP fija, pero como vamos a configurarlo en el host que tenemos en un datacenter esto no debería suponer un problema.

Al finalizar la solicitud través de la web obtendremos un rango /64 para nosotros. Suficiente, ¿no? Pues no. Hemos dicho que queremos tener IPv6 en toda la casa, e IPv6 nos ofrece un mecanismo para asignar una dirección IP a cada dispositivo sin la necesidad de utilizar DHCP: Router Advertisement. Básicamente nuestro router tendrá una IP en este rango y se anunciará mediante paquetes RA y los dispositivos generarán una IP única en ese rango utilizando su MAC. Esto significa que necesitamos un rango más grande si queremos crear varias subredes /64 para poder interconectar a varios colegas con IPv6 mediante un único túnel. Hurricane nos da la posibilidad de obtener un rango /48, así que no hay problema 🙂

A continuación podéis ver una captura de pantalla de los datos de la red IPv6 /64 que Hurricane nos ha dado y la /48 que nos enruta a través de ella:

Ya que hemos dicho que teníamos un servidor en un datacenter, lo utilizaremos para crear múltiples subredes IPv6 que saldrán al mundo real por un único túnel a través de Hurricane. Veamos una imagen con la estructura que queremos montar:

Como se aprecia en la imagen, todos los nodos (los routers de nuestras casas) están conectados mediante una VPN sobre IPv4 al servidor. Utilizaremos una subred que actuará como red de tránsito entre nuestro server y cada una de las subredes de los clientes que conectemos.  Los clientes se conectarán mediante una VPN sobre IPv4. En éste túnel, implementaremos tanto IPv4 como IPv6, teniendo así soporte dual stack en la VPN. Para publicar la red que nos ha sido asignada como cliente, usaremos OSPFv3. ¡Vamos al lio!

Primero configuramos el tunel con Hurricane tal y como se nos indica en la web:

ip tunnel add he-ipv6 mode sit remote 216.66.84.42 local 91.121.117.27 ttl 255
ip link set he-ipv6 up
ip addr add 2001:470:1f12:286::2/64 dev he-ipv6
ip route add ::/0 dev he-ipv6
ip -f inet6 addr

Es una buena idea poner esto en un script y ejecutarlo en el post-up de la interfaz a través de la cual tiraremos el túnel, para no tener que lanzarlo manualmente al reiniciar.

Una vez tenemos el túnel levantado ya deberíamos poder hacer ping6 a ipv6.google.com y molar. Ahora elegiremos una subred (de la /48 que nos enrutan) que usaremos como red de tránsito. En nuestro caso, nos enrutan la siguiente subred:

2001:470:c846::/48

Y elegiremos la siguiente subred de transito:

2001:470:c846:1::/64

En el extremo de la VPN del servidor, nos pondremos la primera IP de la subred de transito, y cada cliente podrá elegir cualquier IP en su extremo. Con 2^64 posibilidades creo que no habrá muchas colisiones 😉

2001:470:c846:1::1/64

Veamos la configuración de Quagga para el servidor:

interface tap0
 ipv6 address 2001:470:c846:1::1/64
 ipv6 nd suppress-ra
 ipv6 ospf6 cost 1
 ipv6 ospf6 dead-interval 40
 ipv6 ospf6 hello-interval 10
 ipv6 ospf6 instance-id 0
 ipv6 ospf6 priority 255
 ipv6 ospf6 retransmit-interval 5
 ipv6 ospf6 transmit-delay 1
 link-detect
!
router ospf6
 router-id 2.2.2.2
 redistribute kernel
 redistribute static
 interface tap0 area 0.0.0.0

Lo importante de todas opciones arriba listadas son:

  • IPv6 address: indica la IP del interfaz tap0
  • Router-id, nos podemos inventar
  • Area, necesiaremos que sea el mismo en el servidor y los clientes
  • Redistribute kernel: hará que se publique la IP del servidor por OSPF para que los clientes la usen como ruta por defecto para el tráfico IPv6

Ahora veamos la configuración en un cliente:

interface eth1
 ipv6 address 2001:470:c846:2::1/64
 ipv6 nd prefix 2001:470:c846:2::/64
 ipv6 nd ra-interval 30
 ipv6 nd ra-lifetime 600
 link-detect
 no ipv6 nd suppress-ra
!
interface tap0
 ipv6 address 2001:470:c846:1::666/64
 ipv6 nd suppress-ra
 ipv6 ospf6 cost 1
 ipv6 ospf6 dead-interval 40
 ipv6 ospf6 hello-interval 10
 ipv6 ospf6 instance-id 0
 ipv6 ospf6 priority 1
 ipv6 ospf6 retransmit-interval 5
 ipv6 ospf6 transmit-delay 1
 link-detect
!
router ospf6
 router-id 1.1.1.1
 redistribute connected
 interface tap0 area 0.0.0.0

Aquí tenemos varias cosas. Por un lado, tenemos que elegir una subred (al azar, la posibilidad de colisión es casi nula) que será la que usemos en ese cliente (nuestara casa):

  • IPv6 address (eth1): indica la IP que tendrá este router en la subred que hemos seleccionado para este cliente
  • IPv6 nd prefix (eth1): indica el prefijo por el cual se hará el neighbour discovery
  • “no ipv6 nd suppress-ra”: indica que se utilizará Router Advertisement para que los dispositivos que tengamos por casa de autoprovisionen. Podríamos haber utilizado radvd, pero ya que se usa Quagga para el OSPF…
  • IPv6 address (tap0): indica la IP del extremo del túnel del lado del cliente. Ha de pertenecer a la red de tránsito que hemos definido arriba.
  • Redistribute connected: indica que se publicarán rutas para llegar hasta ésta subred por OSPF. De esta manera el servidor sabrá cómo enrutar los paquetes que tengan como destino la subred que hemos elegido y habremos habilitado el enrutamiento entre clientes/casas de frikis y también desde/hacia Internet.

Los que entendáis algo del asunto estaréis pensando que hemos matado moscas a cañonazos. Y tenéis razón. ¿Entonces porqué hacerlo? Porque podemos.

Happy routing!

Probando el soporte IPv6 de Asterisk 1.8

Como ya habréis leído por ahí la próxima versión de Asterisk, la 1.8, traerá soporte para IPv6. Gracias a mi buen amigo Mikel “packet tracer” Jimenez dispongo de plena conectividad IPv6 en mi casa, así que hacer una llamada SIP por IPv6 era la siguiente prueba tras ping6. 😉

No quería ensuciar mucho el servidor de SIPdoc (donde realicé las pruebas) así que opté por instalar Asterisk 1.8 con el script live_ast que ya comenté en su día. Resumiendo:

svn co http://svn.asterisk.org/svn/asterisk/branches/1.8 asterisk18
cd asterisk18
cp contrib/scripts/live_ast .
./live_ast configure
./live_ast install
./live_ast samples
./live_ast run -vvvvvvvvvvvvvvc

Tras instalar asterisk modificamos el fichero sip.conf e indicamos que Asterisk escuche en IPv6:

udpbindaddr=::

Si tenemos una IP concreta a la que queremos bindear haríamos lo siguiente:

udpbindaddr=[2001:470:1f12:X:X::1]:5060

¡Ya tenemos el servidor configurado! Para hacer nuestra primera llamada SIP con IPv6 utilizaremos la herramienta pjsua del proyecto PJSIP.

Por defecto PJSIP no se compila con soporte IPv6, así que haremos lo siguiente para descargar y compilar PJSIP:

svn co http://svn.pjsip.org/repos/pjproject/trunk pjsip
cd pjsip
echo "#define PJ_HAS_IPV6 1" > pjlib/include/pj/config_site.h
./configure && make dep && make

La herramienta pjsua se habrá compilado en el directorio pjsip-apps/bin. Nos cambiamos a ese directorio y ya podemos arrancarla:

./pjsua-x86_64-unknown-linux-gnu --ipv6 --no-tcp

pjsua-ipv6

Probemos ha hacer una llamada: pulsamos ‘m’ e introducimos la URI SIP a la que queremos llamar: ‘sip:1000@[2001:470:1f12:286::2]’.

Si hemos dejado el dialplan por defecto deberíamos estar escuchando a Allison Smith y su demo-congrats. ¡A través de IPv6!

asterisk-ipv6

¡Parece que funciona!

INVITE sip:1000@[2001:470:1f12:286::2]:5060 SIP/2.0
Via: SIP/2.0/UDP [2001:470:c846:1:225:ff:feac:6aca]:5060;rport;branch=z9hG4bKPjBcy323TSZVZa86u8GMIV01Zv8wNs1DAE
Max-Forwards: 70
From: ;tag=-3p-SYm.MD6bVaH-8WHegCIArkOYu.9R
To: sip:1000@[2001:470:1f12:286::2];tag=as349aa7db
Contact: 
Call-ID: cWEqE795OfqpixU.l1IavBkTPpgVmX3F
CSeq: 21549 INVITE
Allow: PRACK, INVITE, ACK, BYE, CANCEL, UPDATE, SUBSCRIBE, NOTIFY,
REFER, MESSAGE, OPTIONS
Supported: replaces, 100rel, timer, norefersub
Session-Expires: 1800;refresher=uas
Min-SE: 90
Content-Type: application/sdp
Content-Length:   310

v=0
o=- 3490026667 3490026668 IN IP6 2001:470:c846:1:225:ff:feac:6aca
s=pjmedia
c=IN IP6 2001:470:c846:1:225:ff:feac:6aca
t=0 0
a=X-nat:0
m=audio 4030 RTP/AVP 3 101
a=rtcp:4031 IN IP6 2001:470:c846:1:225:ff:feac:6aca
a=rtpmap:3 GSM/8000
a=sendrecv
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15

--end msg--
 21:51:09.178   pjsua_core.c  RX 659 bytes Response msg
100/INVITE/cseq=21549 (rdata0x1f61238) from UDP
2001:470:1f12:286::2:5060:
SIP/2.0 100 Trying
Via: SIP/2.0/UDP [2001:470:c846:1:225:ff:feac:6aca]:5060;branch=z9hG4bKPjBcy323TSZVZa86u8GMIV01Zv8wNs1DAE;received=2001:470:c846:1:225:ff:feac:6aca;rport=5060
From: ;tag=-3p-SYm.MD6bVaH-8WHegCIArkOYu.9R
To: sip:1000@[2001:470:1f12:286::2];tag=as349aa7db
Call-ID: cWEqE795OfqpixU.l1IavBkTPpgVmX3F
CSeq: 21549 INVITE
Server: Asterisk PBX SVN-branch-1.8-r281052
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY,
INFO, PUBLISH
Supported: replaces, timer
Require: timer
Session-Expires: 1800;refresher=uas
Contact: 
Content-Length: 0


--end msg--
 21:51:09.180   pjsua_core.c  RX 981 bytes Response msg
200/INVITE/cseq=21549 (rdata0x1f61238) from UDP
2001:470:1f12:286::2:5060:
SIP/2.0 200 OK
Via: SIP/2.0/UDP [2001:470:c846:1:225:ff:feac:6aca]:5060;branch=z9hG4bKPjBcy323TSZVZa86u8GMIV01Zv8wNs1DAE;received=2001:470:c846:1:225:ff:feac:6aca;rport=5060
From: ;tag=-3p-SYm.MD6bVaH-8WHegCIArkOYu.9R
To: sip:1000@[2001:470:1f12:286::2];tag=as349aa7db
Call-ID: cWEqE795OfqpixU.l1IavBkTPpgVmX3F
CSeq: 21549 INVITE
Server: Asterisk PBX SVN-branch-1.8-r281052
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY,
INFO, PUBLISH
Supported: replaces, timer
Require: timer
Session-Expires: 1800;refresher=uas
Contact: 
Content-Type: application/sdp
Content-Length: 293

v=0
o=root 1289948586 1289948587 IN IP6 2001:470:1f12:286::2
s=Asterisk PBX SVN-branch-1.8-r281052
c=IN IP6 2001:470:1f12:286::2
t=0 0
m=audio 11994 RTP/AVP 3 101
a=rtpmap:3 GSM/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-16
a=silenceSupp:off - - - -
a=ptime:20
a=sendrecv

Dejo pendiente para otro día el montaje de IPv6 que realicé con Mikel en el servidor de SIPdoc y mi casa.

Happy IPv6 calling!

Soporte de IPv6 en Asterisk

Ya lo había comentado Kevin P. Fleming varios meses atrás y hoy me he desayunado con la noticia. Russell Bryant acaba de postear el soporte de IPv6 para Asterisk en reviewboard.

No es que todo el mundo el vaya a utilizar (aún falta para eso…) pero es algo que hay que soportar a día de hoy y que convertirá Asterisk en un buena herramienta para probar IPv6 en otras aplicaciones como clientes SIP.

Añadir soporte para IPv6 en una aplicación del tamaño de Asterisk no ha tenido que ser fácil, así que mi enhorabuena al equipo de Asterisk por haberlo conseguido. 🙂

ipv6

Happy IPV6ing!

PD: La imágen la he tomado prestada de aquí.

Asterisk y el IPv6

Leyendo a Elio me encuentro un post sobre IPv6 y el futuro de las comunicaciones, escrito en un tono muy gracioso, donde comenta que con IPv6 nuestra tostadora, nevera, etc,… podrán tener una dirección IP. 🙂

Lo que me ha llamado la atención y que no sabía es que Asterisk 1.6 NO trae soporte para IPv6. No obstante en esta web: http://www.asteriskv6.org se esta haciendo un port de Asterisk para que soporte IPv6.

De momento solo esta portado lo esencial: SIP, RTP y poco más, pero irán portando IAX, H323, etc… poco a poco.

Podéis probar Asterisk 1.4 con soporte IPv6 aquí. 

20070423-art54_ipv6.jpg