Tengo la fortuna de trabajar para un ISP con IPv6 implementado. Voy a explicar el procedimiento para levantar un tunel IPv4 para pasar paquetes IPv6 entre un router Cisco y un PC con Linux.
Topologia:
PC Linux (2820:26:11::/64) ------ RED IPv4 (ISP) ----- Cisco router (Ipv4 e IPv6) ---- RED IPv6
Comenzaremos configurando el Cisco:
Es necesario crear una interfaz tunnel similar a la siguiente:
interface Tunnel0
description Tunel hacia mi casa
no ip address
ipv6 address 2820:26:10::1/64
ipv6 enable
tunnel source 210.57.51.107
tunnel destination 211.28.235.85
tunnel mode ipv6ip
end
ipv6 route 2820:26:11::/64 Tunnel0
Explicacion:
En la configuracion anterior se aprecia que hay que indicarle la direccion IPv4 fuente, la direccion IPv6 destino y una direccion IPv6 al tunel. El modo del tunel es lo mas importante el cual indica que son paquetes ipv6 en ipv4. Recordemos que Cisco soporta muchos tipos de tunel y recomiendo ser explicito. Adicionalmente el modo del tunel concuerda con el tipo de tunel que vamos a utilizar en Linux (modo sit). Notese que la direccion IPv4 origen del tunel puede ser cualquier IPv4 configurado en el router (una loopback, otra interfaz, etc).
Por ultimo, el comando ipv6 route indica la red que va a manejarse del lado del linux. Muy importante para que exista conectividad y enrutamiento dentro del tunel.
A configurar el linux:
Del lado del Linux es mas facil de lo que uno esperaria. Estos son los comandos utilizados por mi persona:
ifconfig eth0 add 2820:26:11::1/64
ifconfig sit0 tunnel ::210.147.51.107
ifconfig sit1 up
route -A inet6 add ::0/ dev sit1
ping6 2820:26:10::1
Explicacion:
El primer comando le indica la red IPv6 a la interfaz eth0.
El segundo comando indica la interfaz sit (modo ipv6 en ipv4) y el IPv4 donde va a terminar el tunel. El comando route indica la ruta por defecto para que sea enviado por la interfaz sit 1.
Luego de esto, estamos listos para probar la conexion. Primero, vamos a ubicarnos del lado del Linux:
Lo primero es realizar un ping al IPv6 del tunel
[root@localhost ~]# ping6 2800:26:10::1 -c 4
PING 2800:26:10::1(2800:26:10::1) 56 data bytes
64 bytes from 2820:26:10::1: icmp_seq=1 ttl=64 time=153 ms
64 bytes from 2820:26:10::1: icmp_seq=2 ttl=64 time=154 ms
64 bytes from 2820:26:10::1: icmp_seq=3 ttl=64 time=153 ms
64 bytes from 2820:26:10::1: icmp_seq=4 ttl=64 time=152 ms
Luego un ping6 a ipv6.google.com:
[root@localhost ~]# ping6 ipv6.google.com -c 4
PING ipv6.google.com(qw-in-x68.google.com) 56 data bytes
64 bytes from qw-in-x68.google.com: icmp_seq=1 ttl=55 time=232 ms
64 bytes from qw-in-x68.google.com: icmp_seq=2 ttl=55 time=229 ms
64 bytes from qw-in-x68.google.com: icmp_seq=3 ttl=55 time=230 ms
64 bytes from qw-in-x68.google.com: icmp_seq=4 ttl=55 time=231 ms
Tambien recomiendo hacer traceroute y el primer salto que veras es el IPv6 del Cisco.
Ahora bien, del lado del Cisco podemos ver la cantidad de paquetes que han transitado por la interfaz tunel y comprobar el incrementos de paquetes:
#sh int tunne0
Linkstar_PBR#sh int tunnel 0
Tunnel0 is up, line protocol is up
Hardware is Tunnel
Description: Tunel a mi casa
MTU 1514 bytes, BW 9 Kbit, DLY 500000 usec,
reliability 255/255, txload 1/255, rxload 1/255
Encapsulation TUNNEL, loopback not set
Keepalive not set
Tunnel source 210.147.51.107, destination 211.28.235.85
Tunnel protocol/transport IPv6/IP
Tunnel TTL 255
Fast tunneling enabled
Tunnel transmit bandwidth 8000 (kbps)
Tunnel receive bandwidth 8000 (kbps)
Last input 00:00:07, output 00:00:06, output hang never
Last clearing of "show interface" counters never
Input queue: 0/75/0/0 (size/max/drops/flushes); Total output drops: 0
Queueing strategy: fifo
Output queue: 0/0 (size/max)
5 minute input rate 0 bits/sec, 0 packets/sec
5 minute output rate 0 bits/sec, 0 packets/sec
19 packets input, 2736 bytes, 0 no buffer
Received 0 broadcasts, 0 runts, 0 giants, 0 throttles
0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored, 0 abort
51 packets output, 5540 bytes, 0 underruns
0 output errors, 0 collisions, 0 interface resets
0 output buffer failures, 0 output buffers swapped out
En otra oportunidad indicare como hacer que toda tu red navegue en IPv6 dentro del Tunel.
Suerte y exitos,
Blog en espanol destinado a diferentes temas tecnicos principalmente en IT y Networking. Se desea cubrir Linux, DNS, DNSSEC, RPKI, BGP, Cisco, Programacion (Bash, Python, etc), Protocolos de Enrutamiento, Seguridad en Redes, VoIP.
sábado, 2 de mayo de 2009
viernes, 1 de mayo de 2009
Instalar Mandriva sin unidad de CD
En esta oportunidad voy a explicar el procedimiento de instalacion de Linux Mandriva en un equipo sin utilizar unidad de CDROM. En dos oportunidades me ha ocurrido que necesidad de cambiar el Mandriva de mi Laptop sin embargo no tengo el CD de instalacion a la mano y no quiero ir a un sitio a comprar un CD en blanco y luego quemar el iso.
El procedimiento indicado aqui es un extracto, adaptacion y traduccion de una excelente referencia que consegui en: http://wiki.mandriva.com/en/Docs/Installing_Mandriva_Linux#Booting_the_installer_direct_from_a_hard_disk_-_Linux_method
Por ello la siguiente explicacion:
Primero, en el linux actual bajar el ISO de mandriva de cualquier repositorio en Internet. Por favor bajarlo en una particion que durante la instalacion no sea necesario formatear (por ejemplo NO bajarlo en /). Adicionalmente debes recordar el directorio donde lo bajaste y a que particion pertenece (sda3, hda2, etc)
Posteriormente es necesario extraer dos archivos del iso bajado, para ello es necesario montar el iso como loop. El comando es similar al siguiente:
mkdir /mnt/iso
mount -t iso9660 -o ro,loop /home/mandriva2009.iso /mnt/iso
Luego vamos a copiar al directorio /boot los siguientes archivos. Personalmente prefiero cambiar el nombre durante la copia:
cp /mnt/iso/x86_64/isolinux/alt0/allnew.rdz /boot/allnew.rdz
cp /mnt/iso/x86_64/isolinux/alt0/vmlinuz /boot/vmlinuznew
Es importante que identifiques correctamente tu arquitectura (i586 o x64).
Posteriormente es necesario indicarle a tu boot-loader (grub o lilo) la existencia de dichos archivos. En mi caso quedo de la siguiente manera utilizando grub:
title mandriva2009
kernel (hd0,0)/boot/vmlinuznew root=/dev/ram3 ramdisk_size=32000 vga=791
initrd (hd0,0)/boot/allnew.rdz
Para prevenir cualquier error recomiendo que utilicen una entrada ya existente y te bases en ella unicamente cambiando los nombre de kernel e initrd.
Voila!.., reinicia tu equipo y escoje mandriva2009 al momento del arranque y sigue el procedimiento de instalacion.
Suerte!.
El procedimiento indicado aqui es un extracto, adaptacion y traduccion de una excelente referencia que consegui en: http://wiki.mandriva.com/en/Docs/Installing_Mandriva_Linux#Booting_the_installer_direct_from_a_hard_disk_-_Linux_method
Por ello la siguiente explicacion:
Primero, en el linux actual bajar el ISO de mandriva de cualquier repositorio en Internet. Por favor bajarlo en una particion que durante la instalacion no sea necesario formatear (por ejemplo NO bajarlo en /). Adicionalmente debes recordar el directorio donde lo bajaste y a que particion pertenece (sda3, hda2, etc)
Posteriormente es necesario extraer dos archivos del iso bajado, para ello es necesario montar el iso como loop. El comando es similar al siguiente:
mkdir /mnt/iso
mount -t iso9660 -o ro,loop /home/mandriva2009.iso /mnt/iso
Luego vamos a copiar al directorio /boot los siguientes archivos. Personalmente prefiero cambiar el nombre durante la copia:
cp /mnt/iso/x86_64/isolinux/alt0/allnew.rdz /boot/allnew.rdz
cp /mnt/iso/x86_64/isolinux/alt0/vmlinuz /boot/vmlinuznew
Es importante que identifiques correctamente tu arquitectura (i586 o x64).
Posteriormente es necesario indicarle a tu boot-loader (grub o lilo) la existencia de dichos archivos. En mi caso quedo de la siguiente manera utilizando grub:
title mandriva2009
kernel (hd0,0)/boot/vmlinuznew root=/dev/ram3 ramdisk_size=32000 vga=791
initrd (hd0,0)/boot/allnew.rdz
Para prevenir cualquier error recomiendo que utilicen una entrada ya existente y te bases en ella unicamente cambiando los nombre de kernel e initrd.
Voila!.., reinicia tu equipo y escoje mandriva2009 al momento del arranque y sigue el procedimiento de instalacion.
Suerte!.
martes, 28 de abril de 2009
Ejemplo VPN entre Juniper y Cisco
El siguiente ejemplo muestra la creación de una VPN entre un Firewall Juniper con ScreenOS 5.4 y un Cisco router con el set de Crypto.
La topología es la siguiente:
LAN_lado_Juniper <----> Juniper <---- INTERNET <---> Cisco <--- LAN_lado_Cisco --->
Del lado del Cisco la configuración es la siguiente:
*** BEGIN ***
crypto isakmp policy 1
encr 3des
authentication pre-share
group 2
crypto isakmp key MISECRETO address IP_JUNIPER
crypto map MIVPN 1 ipsec-isakmp
set peer IP_REMOTO
set transform-set MIVPN
match address 140
access-list 140 permit ip LAN_LADO_CISCO 0.0.0.255 LAN_LADO_JUNIPER
crypto ipsec transform-set VPN_to_SW7B esp-3des esp-sha-hmac
interface f0/0
description VPN-SUICHE7B
ip address IP_CISCO 255.255.255.255
crypto map MIVPN
end
*** FIN ***
Aqui podemos ver que el isakmp map utiliza shared secret (clave compartida) para levantar la VPN, MISECRETO es la clave y donde indica IP_JUNIPER hay que colocar el IP del Firewall de la interfaz externa del Juniper.
Luego el Crytp map llamada MIVPN indica el Peer Remoto (nuevamente el IP de la interfaz externa del Juniper, el transform set a utilizar (donde se indica lo que es la fase 2 de la negociación de la VPN) y finalmente el Access-list (ACL con el cual va a hacer match al momento de cifrar y no cifrar los paquetes).
El ACL en realidad define los SA (security association) que se van a intercambiar en la VPN. Es muy importante que utilices un ACL extendido para que puedas definir IPs origen y destino. Es decir, aqui se definen (desde la perspectiva del cisco) cuales son las redes remotas y cuales son las redes locales.
Luego el comando crypto ipsec es en realiad quien define que tipo de cifrado y hash para los datos se va a utilizar. En este caso 3DES y SHA1, sin embargo se puede utilizar DES, MD5, combinaciones y otros.
Finalmente, lo que hay que hacer es aplicar el cryto map a la interfaz por donde va a "transitar" el tráfico en el Cisco, en nuestro caso F0/0
Con lo anterior, ya terminamos con el lado del Cisco...., ahora vamos a Juniper.
Pasos:
1) Crear una interfaz tunnel (tunnel -- interfaces --- new interface) con los siguientes parametros:
* Unnumbered
* Interfaz WAN del Juniper
2) VPN --> Autokey advance --- Gateway
3) New
Debemos dejar la configuración como aparece en la siguiente pantalla:
4) Click en Advance
5) Dejar la configuración como aparece en la siguiente pantalla:
6) VPN --> Autokey advance --- Gateway
7) Click en new
8) Dejar la configuración similar a como aparece en la imagen:
9) Click en advance
10) Dejar la configuración como a aparece en la imagen:
11) Comenzar a pasar tráfico por el tunel (MUY IMPORTANTE)
Luego de esto.., ya debe comenzar a funcionar el tunel sin inconvenientes. La típica prueba en este caso es dejar un ping extendido entre ambos sitios.
Suerte y saludos,
La topología es la siguiente:
LAN_lado_Juniper <----> Juniper <---- INTERNET <---> Cisco <--- LAN_lado_Cisco --->
Del lado del Cisco la configuración es la siguiente:
*** BEGIN ***
crypto isakmp policy 1
encr 3des
authentication pre-share
group 2
crypto isakmp key MISECRETO address IP_JUNIPER
crypto map MIVPN 1 ipsec-isakmp
set peer IP_REMOTO
set transform-set MIVPN
match address 140
access-list 140 permit ip LAN_LADO_CISCO 0.0.0.255 LAN_LADO_JUNIPER
crypto ipsec transform-set VPN_to_SW7B esp-3des esp-sha-hmac
interface f0/0
description VPN-SUICHE7B
ip address IP_CISCO 255.255.255.255
crypto map MIVPN
end
*** FIN ***
Aqui podemos ver que el isakmp map utiliza shared secret (clave compartida) para levantar la VPN, MISECRETO es la clave y donde indica IP_JUNIPER hay que colocar el IP del Firewall de la interfaz externa del Juniper.
Luego el Crytp map llamada MIVPN indica el Peer Remoto (nuevamente el IP de la interfaz externa del Juniper, el transform set a utilizar (donde se indica lo que es la fase 2 de la negociación de la VPN) y finalmente el Access-list (ACL con el cual va a hacer match al momento de cifrar y no cifrar los paquetes).
El ACL en realidad define los SA (security association) que se van a intercambiar en la VPN. Es muy importante que utilices un ACL extendido para que puedas definir IPs origen y destino. Es decir, aqui se definen (desde la perspectiva del cisco) cuales son las redes remotas y cuales son las redes locales.
Luego el comando crypto ipsec es en realiad quien define que tipo de cifrado y hash para los datos se va a utilizar. En este caso 3DES y SHA1, sin embargo se puede utilizar DES, MD5, combinaciones y otros.
Finalmente, lo que hay que hacer es aplicar el cryto map a la interfaz por donde va a "transitar" el tráfico en el Cisco, en nuestro caso F0/0
Con lo anterior, ya terminamos con el lado del Cisco...., ahora vamos a Juniper.
Pasos:
1) Crear una interfaz tunnel (tunnel -- interfaces --- new interface) con los siguientes parametros:
* Unnumbered
* Interfaz WAN del Juniper
2) VPN --> Autokey advance --- Gateway
3) New
Debemos dejar la configuración como aparece en la siguiente pantalla:
4) Click en Advance
5) Dejar la configuración como aparece en la siguiente pantalla:
6) VPN --> Autokey advance --- Gateway
7) Click en new
8) Dejar la configuración similar a como aparece en la imagen:
9) Click en advance
10) Dejar la configuración como a aparece en la imagen:
11) Comenzar a pasar tráfico por el tunel (MUY IMPORTANTE)
Luego de esto.., ya debe comenzar a funcionar el tunel sin inconvenientes. La típica prueba en este caso es dejar un ping extendido entre ambos sitios.
Suerte y saludos,
BGP en IPv6 y Cisco
Configurar BGP sobre IPv6 en Cisco es parecido a IPv4.
En realidad los principios son los mismos de IPv4 tales como:
* Debe existir una ruta en la tabla de enrutamieto para que sea publicada vía BGP
* Hay que crear el peering con el equipo remoto
* Colocar filtros correspondiente tales como filtros entrantes y salientes
Antes de crear la sesión BGP hay que conocer:
* Dirección IPv6 local
* Subred IPv6 a publicar
* Dirección IPv6 remota
* Password (opcional)
Un ejemplo de configuración de BGP sobre IPv6 sería:
router bgp 65501
bgp log-neighbor-changes
neighbor 2820:22:1:1::1 remote-as 1111
neighbor 2820:22:1:1::1 update-source POS3/0
!
address-family ipv6
neighbor 2820:22:3:1::1 activate
network 2820:26::/32
En caso de querer levantar sobre el mismo enlace una sesión BGP en IPv4 es necesario también el siguiente comando:
address-family ipv4
neighbor 2820:22:3:1::1 activate
Comandos utiles para troubleshooting:
1) sh bgp ipv6 unicast (vemos los prefijos ipv6 aprendidos por BGP)
2) sh bgp ipv6 unicast neighbors 2820:22:3:1::1 advertised-routes (prefijos IPv6 que nosotros publicamos al peer)
3) show ipv6 route
Suerte!
En realidad los principios son los mismos de IPv4 tales como:
* Debe existir una ruta en la tabla de enrutamieto para que sea publicada vía BGP
* Hay que crear el peering con el equipo remoto
* Colocar filtros correspondiente tales como filtros entrantes y salientes
Antes de crear la sesión BGP hay que conocer:
* Dirección IPv6 local
* Subred IPv6 a publicar
* Dirección IPv6 remota
* Password (opcional)
Un ejemplo de configuración de BGP sobre IPv6 sería:
router bgp 65501
bgp log-neighbor-changes
neighbor 2820:22:1:1::1 remote-as 1111
neighbor 2820:22:1:1::1 update-source POS3/0
!
address-family ipv6
neighbor 2820:22:3:1::1 activate
network 2820:26::/32
En caso de querer levantar sobre el mismo enlace una sesión BGP en IPv4 es necesario también el siguiente comando:
address-family ipv4
neighbor 2820:22:3:1::1 activate
Comandos utiles para troubleshooting:
1) sh bgp ipv6 unicast (vemos los prefijos ipv6 aprendidos por BGP)
2) sh bgp ipv6 unicast neighbors 2820:22:3:1::1 advertised-routes (prefijos IPv6 que nosotros publicamos al peer)
3) show ipv6 route
Suerte!
jueves, 23 de abril de 2009
IPv6 y Apache
En esta oportunidad indicaré como se configura Apache con soporte para IPv6.
La buena noticia es que a partir de Apache 2.0 el soporte IPv6 viene intrinsico dentro de Apache y en realidad no hay que hacer nada.
Debajo de estas lineas encontraras una configuración que funciona perfectamente en un servidor dualstack ipv4/ipv6 y que adicionalmente posee los comandos ErrorLog y CustomLog para un virtualhosting en IPv6. La ventaja de esta configuración es que permite dentro del mismo servidor separar los logs ipv6 de los ipv6.
La configuración es la siguiente:
Posteriormente reinicias Apache (service httpd restart o /etc/init.d/apache restart) y listo!.
Ahora bien, para revisar que efectivamente tu servidor se encuentre escuchando en el puerto 80 tcp ejecuta los siguientes comandos:
#netstat -pan | grep 80
y
#telnet ::1 80
Con el primer comando puedes ver si tu servidor se encuentra escuchando en IPv6 en el puerto 80. Busca un string similar a:
tcp 0 0 :::80 :::* LISTEN 24972/httpd
y con el segundo comando puedes revisar que efectivamente el puerto 80 responda. El output sería similar al siguiente:
[root@www ~]# telnet ::1 80
Trying ::1...
Connected to ::1 (::1).
Escape character is '^]'.
Saludos,
La buena noticia es que a partir de Apache 2.0 el soporte IPv6 viene intrinsico dentro de Apache y en realidad no hay que hacer nada.
Debajo de estas lineas encontraras una configuración que funciona perfectamente en un servidor dualstack ipv4/ipv6 y que adicionalmente posee los comandos ErrorLog y CustomLog para un virtualhosting en IPv6. La ventaja de esta configuración es que permite dentro del mismo servidor separar los logs ipv6 de los ipv6.
La configuración es la siguiente:
Posteriormente reinicias Apache (service httpd restart o /etc/init.d/apache restart) y listo!.
Ahora bien, para revisar que efectivamente tu servidor se encuentre escuchando en el puerto 80 tcp ejecuta los siguientes comandos:
#netstat -pan | grep 80
y
#telnet ::1 80
Con el primer comando puedes ver si tu servidor se encuentra escuchando en IPv6 en el puerto 80. Busca un string similar a:
tcp 0 0 :::80 :::* LISTEN 24972/httpd
y con el segundo comando puedes revisar que efectivamente el puerto 80 responda. El output sería similar al siguiente:
[root@www ~]# telnet ::1 80
Trying ::1...
Connected to ::1 (::1).
Escape character is '^]'.
Saludos,
martes, 21 de abril de 2009
Actualizar el bootrom de un telefono Polycom
En día de hoy tuve la necesidad de actualizar el bootrom de un telefono Polycom. Este es el procedimiento:
* Bajar el software necesario de: http://polycom.com/support/voice/soundpoint_ip/soundpoint_ip501.html
* Colocar el archivo bootrom.ld en el servidor de provisioning
* Reiniciar el teléfono.
El teléfono detectará la nueva versión y realizará el proceso de manera automática. Verás varias pantallas como: formateando el filesystem, reiniciando, etc. No te preocupes
Mi recomendación: utiliza primero solo un teléfono antes de realizarlo con toda la red.
* Listo!.., verifica la version dentro del menú del teléfono.
Suerte!.
* Bajar el software necesario de: http://polycom.com/support/voice/soundpoint_ip/soundpoint_ip501.html
* Colocar el archivo bootrom.ld en el servidor de provisioning
* Reiniciar el teléfono.
El teléfono detectará la nueva versión y realizará el proceso de manera automática. Verás varias pantallas como: formateando el filesystem, reiniciando, etc. No te preocupes
Mi recomendación: utiliza primero solo un teléfono antes de realizarlo con toda la red.
* Listo!.., verifica la version dentro del menú del teléfono.
Suerte!.
Probar IPv6
Tradicionalmente suelo escribir mis experiencias con IPv6 por ello en esta oportunidad voy a comentar tres pequeños TIPs:
* Cuando quieras probar si estas navegando con IPv6 te recomiendo:
- Visitar http://www.ipv6tf.org. En esta página puedes ver con cual dirección IPv6 te encuentras navegando. En caso negativo, la página te mostrará tu dirección IPv4
- Visitar http://www.whatismyipv6.co. En esta página puedes ver con cual dirección IPv6 te encuentras navegando. En caso negativo, la página te mostrará tu dirección IPv4
- Abril la página web de IPv6 de google: http://ipv6.google.com. Esta página solo funciona en IPv6, es imposible utilizarla desde una dirección IPv4
- Realizar ping6 a ipv6.google.com, nuevamente esta dirección solo resuelve en IPv6.
Suerte!
* Cuando quieras probar si estas navegando con IPv6 te recomiendo:
- Visitar http://www.ipv6tf.org. En esta página puedes ver con cual dirección IPv6 te encuentras navegando. En caso negativo, la página te mostrará tu dirección IPv4
- Visitar http://www.whatismyipv6.co. En esta página puedes ver con cual dirección IPv6 te encuentras navegando. En caso negativo, la página te mostrará tu dirección IPv4
- Abril la página web de IPv6 de google: http://ipv6.google.com. Esta página solo funciona en IPv6, es imposible utilizarla desde una dirección IPv4
- Realizar ping6 a ipv6.google.com, nuevamente esta dirección solo resuelve en IPv6.
Suerte!
Suscribirse a:
Entradas (Atom)
Una mejora práctica en el Transporte DNS sobre UDP en IPv6
Por Hugo Salgado y Alejandro Acosta Introducción y planteamiento del problema En el presente documento queremos discutir sobre un draft (bor...
-
Debido al crecimiento moderado que ha tenido el presente blog se me ocurrió añadir/integrar las estadisticas de google analytics a mi blog. ...
-
Introduccion: En algunas ocasiones es necesario "bajar" o deshabilitar iptables en nuestro Linux, el procedimiento depende de...
-
Saludos, Lo primero que debemos de hacer para quitar el stacking entre los switches es desconectar los cables Stack que los unen.... Es buen...