Interconectando routers Linux y Cisco con OSPF

Como ya sabemos OSPF es un protocolo de enrutamiento estándar de la industria (RFC 2338). Esto significa que, a diferencia de EIGRP que es propietario de Cisco y solo puede correr en routers de esa marca, OSPF está presente en una gran variedad de routers de diferentes fabricantes como Huawei, Juniper, Force10, entre otros. Por supuesto, en distintos sistemas operativos de código libre también se puede correr OSPF como es el caso de OpenBSD (ver OpenBGPd y OpenOSPFd) y Linux. En este artículo mostraré como interconectar un router Linux basado en Debian montado en una máquina virtual (Virtualbox) con una topología simple de dos routers Cisco en GNS3 y lograr establecer conectividad de capa3 entre las máquinas.
Esta topología usaremos como ejemplo:

Topología

Las tres máquinas pertenecen al área 0 de OSPF (para hacerlo simple) y el PC corresponde a Virtualbox corriendo en la misma máquina física donde corre GNS3. Para esto deben tener VirtualBox (o VMWare si lo prefieren) con algún Linux ya corriendo en su PC. En mi caso utilizaré Debian. Básicamente, la máquina virtual instala un adaptador de red virtual en el sistema operativo Linux (eth0) que está conectada internamente con VirtualBox hacia Internet en modo NAT. Para mantener conexión a Internet en Linux (ej, para actualizar y descargar paquetes) vamos a mantener la interfaz eth0 intacta. Lo que haremos será agregar una nueva interfaz a Linux (eth1) desde Virtualbox. Para eso hay que apagar la máquina virtual y configurar las opciones de red de la siguiente forma:

Luego inician Linux y revisan con el comando #cat /proc/net/dev que el kernel haya detectado la interfaz eth01 (debería haber además una eth0 y lo). Luego de eso en GNS3 solo deben levantar una nube (Cloud) desde el menú de imágenes de GNS3 y configurarla de la siguiente manera:

 Importante es que la interfaz que se agregue en la nube sea el adaptadorVirtualBox Host-Only Network que es eth1 en Linux.

En este punto deberíamos tener ya GNS3 corriendo, VirtualBox con Linux también y los enlaces virtuales conectados.

Ahora veremos la configuración. Partiré por las máquinas Cisco en GNS3:

R1:

!
interface FastEthernet0/0
ip address 192.168.0.1 255.255.255.0
duplex auto
speed auto

!
interface Serial0/0
ip address 10.0.0.2 255.255.255.252
clock rate 2000000
!
router ospf 1
router-id 1.1.1.1
log-adjacency-changes
network 10.0.0.0 0.0.0.3 area 0
network 192.168.0.0 0.0.0.255 area 0
!

R2:

!
interface Loopback0
ip address 200.200.200.200 255.255.255.255
!
interface Serial0/0
ip address 10.0.0.1 255.255.255.252

clock rate 2000000
!
router ospf 1
router-id 2.2.2.2
log-adjacency-changes
network 10.0.0.0 0.0.0.255 area 0
network 200.0.0.0 0.255.255.255 area 0
!

Hasta ese punto debería haber conectividad completa entre R1 y R2. Probamos haciendo ping desde R1 a la interfaz Loopback0 de R2:

R1#ping 200.200.200.200

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 200.200.200.200, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 4/66/132 ms
R1#

A continuación vamos a levantar OSPF en Linux. Para esto utilizaremos Quagga, el cual se puede descargar fácilmente mediante apt-get. Por eso es importante que la interfaz eth0 de Linux siga con conexión a Internet.

root@router :~# apt-get update && apt-get install quagga

Configuramos la interfaz de red eth1 que es la que se conectará con nuestro router Cisco R1 en GNS3 con la IP 192.168.0.2/24 y como puerta de enlace 192.168.0.1 (FastEthernet 0/0 de R1). Lo demás queda intacto

 root@router:~# nano /etc/network/interfaces

——————————————————————–

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eth0
iface eth0 inet dhcp

auto eth1
iface eth1 inet static
address 192.168.0.2
netmask 255.255.255.0
gateway 192.168.0.1

———————————————————————

Aquí ya deberíamos tener conexión de capa 3 en enlace virtual entre Debian y R1. Subimos la interfaz eth1 y probamos con un ping:

root@router:~# ifup eth1
root@router:~# ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_req=1 ttl=255 time=68.8 ms
64 bytes from 192.168.0.1: icmp_req=2 ttl=255 time=44.0 ms
64 bytes from 192.168.0.1: icmp_req=3 ttl=255 time=52.2 ms
^C
— 192.168.0.1 ping statistics —
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 44.022/55.015/68.818/10.319 ms
root@router:~#

Perfecto. El enlace entre Linux y GNS3 funciona! Ahora, a configurar el enrutamiento OSPF en Debian. Hay que decir que Quagga contiene soporte para varios protocolos de enrutamiento como BGP (muy interesante), OSPFv2, OSPFv3 para IPv6 y RIP. Para nuestro ejemplo utilizaremos dos: Zebra y OSPF, el primero se encargará de habilitar las interfaces de Linux para el enrutamiento dinámico.

El directorio de configuración de Quagga es /etc/quagga/.

1. Lo primero que haremos será copiar los archivos de configuración de ejemplo de OSPF y Zebra a /etc/quagga:

root@router:~# cp /usr/share/doc/quagga/examples/zebra.conf.sample /etc/quagga/zebra.conf

root@router:~# cp /usr/share/doc/quagga/examples/ospfd.conf.sample /etc/quagga/ospfd.conf

Importante es que estos archivos puedan ser leídos por el usuario quagga. Aplicamos los permisos correspondientes:

#chown quagga.quaggavty /etc/quagga/*.conf
#chmod 640 /etc/quagga/*.conf

2. Editamos /etc/quagga/zebra.conf :

! -*- zebra -*-
!
! zebra sample configuration file
!
! $Id: zebra.conf.sample,v 1.1 2002/12/13 20:15:30 paul Exp $
!
hostname Router
password zebra
enable password zebra
!
! Interface’s description.
!
!interface lo
! description test of desc.
!
!interface sit0
! multicast
interface eth1
ip address 192.168.0.2/24
no shutdown
!
! Static default route sample.
!
!ip route 0.0.0.0/0 203.181.89.241
!

log file /var/log/quagga/zebra.log

La sintaxis de los archivos *.conf de Quagga tienen el mismo formato que los comandos de los routers Cisco, por lo que les parecerá muy familiar. Lo que he hecho en zebra.conf es habilitar la interfaz eth1 con la misma IP que ya tenía en la configuración de Linux.

3. Ahora abrimos /etc/quagga/ospfd.conf y declaramos las redes que participarán en OSPF, al igual que un router Cisco:

! -*- ospf -*-
!
! OSPFd sample configuration file
!
!
hostname ospfd
password zebra
!enable password please-set-at-here
!
router ospf
ospf router-id 3.3.3.3
network 192.168.0.0/24 area 0.0.0.0

log syslog
!

Como ven, el entorno es familia ¿no?. He declarado el router-id de Linux como 3.3.3.3 y agregué la red 192.168.0.0 /24 al proceso de enrutamiento en el area 0 (también se puede poner area 0. O el área 1 sería: area 0.0.0.1). Luego enviamos logs al syslog por si algo no anda bien.

4. En el archivo /etc/quagga/daemons indicamos que servicios o protocolos de enrutamiento ejecutaremos. Indicamos con la opción =”yes” en Zebra y OSPF:

zebra=yes
bgpd=no
ospfd=yes
ospf6d=no
ripd=no
ripngd=no
isisd=no

5. Luego reiniciamos el servicio Quagga y éste debería levantar Zebra y OSPF:

#/etc/init.d/quagga restart

6. Comprobamos en R1 que se haya levantado la adyacencia con el vecino 3.3.3.3 que sería nuestro Debian:

R1#
*Mar 1 03:06:52.919: %OSPF-5-ADJCHG: Process 1, Nbr 3.3.3.3 on FastEthernet0/0 from LOADING to FULL, Loading Done
R1#

7. Ya podríamos desde Linux entonces hacer ping a la interfaz Loopback de R2 en el otro extremo de la red. Antes comprobamos que la red 200.200.200.200/32 exista en la tabla de enrutamiento de Linux:

root@router:~# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
200.200.200.200 192.168.0.1 255.255.255.255 UGH 75 0 0 eth1
10.0.0.0 192.168.0.1 255.255.255.252 UG 74 0 0 eth1
10.0.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 eth1
0.0.0.0 10.0.2.2 0.0.0.0 UG 0 0 0 eth0
root@router:~# ping 200.200.200.200 -c 3
PING 200.200.200.200 (200.200.200.200) 56(84) bytes of data.
64 bytes from 200.200.200.200: icmp_req=1 ttl=254 time=98.4 ms
64 bytes from 200.200.200.200: icmp_req=2 ttl=254 time=57.3 ms
64 bytes from 200.200.200.200: icmp_req=3 ttl=254 time=66.0 ms

— 200.200.200.200 ping statistics —
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 57.314/73.941/98.463/17.703 ms
root@router:~#

Y eso es todo. ¿Fácil no?. Como complemento podemos levantar una sesión Telnet dentro de Linux hacia el servicio Quagga y controlar el enrutamiento en una consola muy similar a la CLI de Cisco. Los puertos de Telnet son los siguientes:

Zebra:   2601

RIPd:       2602

RIPng:    2603

OSPFd:   2604

BGPd:     2605

OSPF6d: 2606

Para entrar a configurar OSPF en tiempo real al más puro estilo Cisco, levantamos una sesión Telnet local al puerto 2604. La contraseña por defecto es zebra (tal como aparece en ospfd.conf)

 root@router:~# telnet 127.0.0.1 2604
Trying 127.0.0.1…
Connected to 127.0.0.1.
Escape character is ‘^]’.

Hello, this is Quagga (version 0.99.17).
Copyright 1996-2005 Kunihiro Ishiguro, et al.

User Access Verification

Password:
ospfd>?
echo Echo a message back to the vty
enable Turn on privileged mode command
exit Exit current mode and down to previous mode
help Description of the interactive help system
list Print command list
quit Exit current mode and down to previous mode
show Show running system information
terminal Set terminal line parameters
who Display who is on vty
ospfd> en
ospfd#

Ya con eso pueden luego implementar configuraciones más complejas como escenarios multiárea, OSPFv3 con IPv6 y BGP.

Para más información consulten la página oficial de Quagga http://www.quagga.net/docs/docs-info.php