En este tutorial vamos a tratar la configuración de rutas en Vyatta mediante un versátil protocolo de routing dinámico, OSPF (Open Shortest Path First). Es un protocolo fácil de configurar y nos permite, en grandes redes con numerosas rutas y equipos de routing, que cada uno de los routers (Vyatta en este caso) conozca la topología lógica de la red de forma dinámica sin tener que configurar uno a uno cada uno de ellos cada vez que se modifique dicha topología.

OSPF es un protocolo de routing dinámico que usa el algoritmo de estado del enlace de Dijkstra LSA-Link State Algorithm,
a diferencia de otros protocolos (como RIP) un sistema autónomo AS de vector distancia.
Es un protocolo de pasarela interno (IGP) y opera en un único sistema autónomo (AS).
Es OSPF cada router advierte el estado de sus propios enlaces o conexiones en anuncios de estado del enlace (LSA) que se envían como paquetes multicast a otros routers de la red. Ademas, cada router usa los LSAs que recibe de otros routers para construir un grafo que representa la topología de la red. Para construir su propia tabla de rutas el router OSPF aplica el algoritmo SPF (Shortest Path First) de Dijkstra para encontrar el mejor camino (ruta mas corta) en el grafo a cada red de la topología representada. Ese “árbol de rutas cortas” se convierte en la base de la tabla de rutas de cada router OSPF.
OSPF es jerárquico, es decir, en OSPF la red se divide en áreas, dentro de cada área los routers envían solo información local de rutas. La información de routing entre áreas se calcula mediante sumarización de rutas o supernetting intercambiadas entre áreas, lo que reduce la cantidad de información sobre la topología de la red que los routers han de intercambiar, generar y mantener haciendo a OSFP una buena alternativa para grandes redes corporativas.

Después de un poco de literatura, volvemos a la practica, nos centramos en la topología ejemplo de Vyatta y vamos a configurar un área 0 entre los routers openredesR1 y openredesR2 usando para el intercambio de información OSPF entre ambos routers el canal privado VPN que ya habíamos configurado antes.
Partiendo de la base de que los routers openredesR1 y openredesR2 no conocen las redes internas cada uno del otro (no hemos configurado rutas estáticas según el tutorial anterior), vamos con la configuración de openredesR1:

En primer lugar, por experiencia propia, tenemos que evitar un problema de routing circular y también tener en cuenta que el tipo de interfaces que vamos a usar para OSPF son interfaces punto a punto, con lo que hay que afinar un poco mas con la configuración que si fuesen interfaces Ethernet. Para evitar un problema de routing circular tenemos que configurar una ruta estática en cada router OSPF hacia la interfaz física que levanta la VPN del router OSPF que sera su vecino:

openredes@openredesR1# set protocols static route 192.0.2.20/32 next-hop 192.0.2.1
[edit]
openredes@openredesR1# commit



Cada router OSPF tiene que usar su propio identificador (ID) con el que lo conocerán sus vecinos, una buena practica es asignar una IP a la interfaz de loopback diferente para cada router OSPF y usar su IP como identificador. Vamos a usar como IP de loopback una IP del rango TEST-NET 2, podría usarse cualquier IP privada:

openredes@openredesR1# set interfaces loopback lo address 198.51.100.1/24
[edit]
openredes@openredesR1# commit



Y ahora vamos a configurar openredesR1 como router OSPF para que envíe sus actualizaciones a openredesR2 por medio de la VPN:

openredes@openredesR1# set protocols ospf area 0 network 192.168.2.34/32
[edit]
openredes@openredesR1# set protocols ospf redistribute connected
[edit]
openredes@openredesR1# set protocols ospf log-adjacency-changes detail
[edit]
openredes@openredesR1# set protocols ospf parameters router-id 198.51.100.1
[edit]
openredes@openredesR1# commit
[edit]
openredes@openredesR1# save
Saving configuration to '/opt/vyatta/etc/config/config.boot'...
Done
[edit]
openredes@openredesR1#



Ya esta, ya hemos configurado openredesR1 como router OSPF, veamos la configuración del protocolo OSPF:

openredes@openredesR1# show protocols ospf
 area 0 {
     network 192.168.2.34/32
 }
 log-adjacency-changes {
     detail
 }
 parameters {
     router-id 198.51.100.1
 }
 redistribute {
     connected {
     }
 }
[edit]
openredes@openredesR1#



Ahora hacemos lo mismo en openredesR2, configuramos ruta estática a la interfaz que se usa para la VPN del router openredesR1, configuramos la interfaz de loopback y el apartado del protocolo OSPF:

openredes@openredesR2# set protocols static route 192.0.2.20/32 next-hop 192.0.2.2
[edit]
openredes@openredesR2# set interfaces loopback lo address 198.51.100.2/24
[edit]
openredes@openredesR2# set protocols ospf area 0 network 192.168.2.33/32
[edit]
openredes@openredesR2# set protocols ospf redistribute connected
[edit]
openredes@openredesR2# set protocols ospf log-adjacency-changes detail
[edit]
openredes@openredesR2# set protocols ospf parameters router-id 198.51.100.2
[edit]
openredes@openredesR2# commit
[edit]
openredes@openredesR2# save
Saving configuration to '/opt/vyatta/etc/config/config.boot'...
Done
[edit]
openredes@openredesR2#



Ya hemos configurado openredesR2 como router OSPF en el área 0, ahora los routers comienzan a enviarse paquetes de sincronización (paquetes Hello) y paquetes de estado de sus enlaces (paquetes LSA).
Podemos ver en el log como se ha creado la adyacencia entre openredesR2 y openredesR1:

openredes@openredesR2# run show log tail
Apr 19 11:19:04 openredesR2 ospfd[2004]: ospfTrapIfStateChange trap sent: 192.168.2.34 now Point-To-Point
Apr 19 11:19:04 openredesR2 ospfd[2004]: interface 192.168.2.34 [9] join AllSPFRouters Multicast group.
Apr 19 11:19:06 openredesR2 ospfd[2004]: AdjChg: Nbr 198.51.100.1 on vtun10:192.168.2.34: Down -> Init (HelloReceived)
Apr 19 11:19:06 openredesR2 ospfd[2004]: AdjChg: Nbr 198.51.100.1 on vtun10:192.168.2.34: Init -> ExStart (2-WayReceived)
Apr 19 11:19:06 openredesR2 ospfd[2004]: Packet[DD]: Neighbor 198.51.100.1: Initial DBD from Slave, ignoring.
Apr 19 11:19:06 openredesR2 ospfd[2004]: Packet[DD]: Neighbor 198.51.100.1 Negotiation done (Master).
Apr 19 11:19:06 openredesR2 ospfd[2004]: AdjChg: Nbr 198.51.100.1 on vtun10:192.168.2.34: ExStart -> Exchange (NegotiationDone)
Apr 19 11:19:06 openredesR2 ospfd[2004]: AdjChg: Nbr 198.51.100.1 on vtun10:192.168.2.34: Exchange -> Loading (ExchangeDone)
Apr 19 11:19:06 openredesR2 ospfd[2004]: AdjChg: Nbr 198.51.100.1 on vtun10:192.168.2.34: Loading -> Full (LoadingDone)
Apr 19 11:19:06 openredesR2 ospfd[2004]: nsm_change_state(198.51.100.1, Loading -> Full): scheduling new router-LSA origination



Y si miramos la tabla de rutas de cada uno de los routers veremos que de forma automática se han anunciado mutuamente sus redes y se han creado las rutas necesarias en cada router para alcanzar todas las redes de la topología:

- Tabla de rutas de openredesR1:

openredes@openredesR1# run show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF,
       I - ISIS, B - BGP, > - selected route, * - FIB route

S>* 0.0.0.0/0 [1/0] via 192.0.2.1, eth2
C>* 127.0.0.0/8 is directly connected, lo
O   192.0.2.0/24 [110/20] via 192.168.2.34, 00:05:14
C>* 192.0.2.0/24 is directly connected, eth2
S>* 192.0.2.20/32 [1/0] via 192.0.2.1, eth2
C>* 192.168.0.0/25 is directly connected, bond0.10
C>* 192.168.0.128/26 is directly connected, bond0.20
C>* 192.168.0.192/28 is directly connected, bond0.30
C>* 192.168.0.208/28 is directly connected, bond0.40
C>* 192.168.0.224/28 is directly connected, bond0.50
O>* 192.168.1.0/25 [110/20] via 192.168.2.34, vtun10, 00:05:14
O>* 192.168.1.128/26 [110/20] via 192.168.2.34, vtun10, 00:05:14
O>* 192.168.1.192/26 [110/20] via 192.168.2.34, vtun10, 00:05:14
C>* 192.168.2.0/29 is directly connected, vtun0
C>* 192.168.2.8/29 is directly connected, vtun1
O>* 192.168.2.33/32 [110/20] via 192.168.2.34, vtun10, 00:05:14
O   192.168.2.34/32 [110/10] is directly connected, vtun10, 00:23:48
C>* 192.168.2.34/32 is directly connected, vtun10
O   198.51.100.0/24 [110/20] via 192.168.2.34, 00:05:14
C>* 198.51.100.0/24 is directly connected, lo
[edit]
openredes@openredesR1#



- Tabla de rutas de openredesR2:

openredes@openredesR2# run show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF,
       I - ISIS, B - BGP, > - selected route, * - FIB route

S>* 0.0.0.0/0 [1/0] via 192.0.2.2, eth2
C>* 127.0.0.0/8 is directly connected, lo
O   192.0.2.0/24 [110/20] via 192.168.2.33, 00:03:46
C>* 192.0.2.0/24 is directly connected, eth2
S>* 192.0.2.10/32 [1/0] via 192.0.2.2, eth2
O>* 192.168.0.0/25 [110/20] via 192.168.2.33, vtun10, 00:03:46
O>* 192.168.0.128/26 [110/20] via 192.168.2.33, vtun10, 00:03:46
O>* 192.168.0.192/28 [110/20] via 192.168.2.33, vtun10, 00:03:46
O>* 192.168.0.208/28 [110/20] via 192.168.2.33, vtun10, 00:03:46
O>* 192.168.0.224/28 [110/20] via 192.168.2.33, vtun10, 00:03:46
C>* 192.168.1.0/25 is directly connected, bond0.60
C>* 192.168.1.128/26 is directly connected, bond0.70
C>* 192.168.1.192/26 is directly connected, bond0.80
O>* 192.168.2.0/29 [110/20] via 192.168.2.33, vtun10, 00:03:46
O>* 192.168.2.8/29 [110/20] via 192.168.2.33, vtun10, 00:03:46
O   192.168.2.33/32 [110/10] is directly connected, vtun10, 00:03:59
C>* 192.168.2.33/32 is directly connected, vtun10
O>* 192.168.2.34/32 [110/20] via 192.168.2.33, vtun10, 00:03:46
O   198.51.100.0/24 [110/20] via 192.168.2.33, 00:03:46
C>* 198.51.100.0/24 is directly connected, lo
[edit]
openredes@openredesR2#



Interesante verdad? bueno, un poco mas adelante aprenderemos a crear listas de acceso y para prevenir que ciertas redes no sean anunciadas en el caso de que haya redes que no queramos que sean conocidas por algunos routers OSPF.

Nota: en este tutorial no hemos usado autenticación alguna entre los routers para poder formar adyacencias ya que los paquetes OSPF se envían por un canal seguro (VPN), pero en caso de configurarlo en una red no segura (Ethernet), tenemos la posibilidad de asignar password en cada una de las áreas y enviar los paquetes OSPF con encriptación md5 para que toda la información del estado de los enlaces entre routers OSPF y la creación de adyacencias se de en un entorno cifrado y seguro. Esto puede generarse con los comandos “set protocols ospf area 0 authentication md5” y “set protocols ospf area 0 authentication plaintext-password“.







vyatta_cores_large