Esta pagina se ve mejor con JavaScript habilitado

RIP-OSPF con Quagga

 ·  🎃 kr0m

Quagga es un conjunto de herramientas que permiten implementar en un sistema Linux los protocolos de enrutamiento OSPF, RIP y BGP, gestionando para ello, la tabla de enrutamiento del propio núcleo del sistema. Utiliza una interfaz y sintaxis parecidas a la que empleada en los routers de CISCO así que si estamos familizarizados con estos nos resultará muy fácil la configuración de Quagga.

En este mini howto supondremos que disponemos del siguiente escenario, tres redes independientes con direccionamiento interno con acceso al exterior, cada red se comunica a través de un router de salida con una única dirección ip wan, además en cada red dispondremos de un servidor que actuará de nexo de interconexión entre redes internas mediante túneles creados con vtun, en cada red interna donde haya un server actuando como server-vtun deberemos redirigir el puerto utilizado por vtun a dicho server, en mi caso en kr0m y zoiber.

En la red de los túneles publicaremos las rutas por OSPF logrando así alta disponibilidad, es decir si un servidor de interconexión cae se llevará el tráfico por el otro con el consiguiente retraso, en cambio en las redes internas publicaremos las rutas remotas mediante RIP e instalaremos en los pcs cliente quagga para “asimilar” las rutas aprendidas por RIP.

El resultado final será que todas las redes internas podrán comuniarse entre ellas de forma transparente para los pcs y en caso de problemas con algún server de interconexión se enviará el tráfico por la ruta alternativa, se podría decir que conseguiremos una VPN con redundancia.

En el esquema podemos observar los nombres de los pcs clientes de cada red interna así como la configuración de red, en cambio en los nodos de interconexión vemos sus nombres, las ips de las interfaces de túnel y la configuración de las interfaces pertenecientes a cada una de las redes internas.

A la derecha la estructura interna de quagga donde podemos ver que cada demonio se encarga de un protocolo de enrutamiento especifico los cuales informan a zebra y es este el que pushea las rutas en la tabla de enrutamiento del sistema operativo.


Comencemos por el principio, instalando el software necesario:

emerge -av net-misc/vtun net-misc/quagga


Kr0m

vi /etc/vtund.conf
options {
  port 9000;        # Listen on this port.

  # Syslog facility
  syslog     daemon;

  # Path to various programs
  ifconfig     /bin/ifconfig;
  route     /bin/route;
  firewall     /sbin/iptables;
  ip        /bin/ip;
}

# Default session options
default {
  compress no;      # Compression is off by default
  encrypt no;
  speed 0;        # By default maximum speed, NO shaping
}

zoiber_kr0m {
    passwd 4lf43xp10it;
    type ether;
    device vtap0;
    proto tcp;
    keepalive yes;
    persist yes;
    compress no;
    encrypt yes;

    up {
        ip "link set %% up multicast on";
        ip "-family inet addr add 10.10.0.1/30 dev %%";
    };

    down {
        ifconfig "%% down";
    };
}

m4s4cr3_kr0m {
    passwd 4lf43xp10it;
    type ether;
    device vtap1;
    proto tcp;
    keepalive yes;
    persist yes;
    compress no;
    encrypt yes;

    up {
        ip "link set %% up multicast on";
        ip "-family inet addr add 10.10.1.1/30 dev %%";
    };

    down {
        ifconfig "%% down";
    };
}
vi /etc/vtund-start.conf
--server-- 9000
/etc/init.d/vtun start
rc-update add vtun default

Zoiber

vi /etc/vtund.conf
options {
  port 9000;        # Listen on this port.

  # Syslog facility
  syslog     daemon;

  # Path to various programs
  ifconfig     /bin/ifconfig;
  route     /bin/route;
  firewall     /sbin/iptables;
  ip        /bin/ip;
}

# Default session options
default {
  compress no;      # Compression is off by default
  encrypt no;
  speed 0;        # By default maximum speed, NO shaping
}

zoiber_kr0m {
    passwd 4lf43xp10it;
    type ether;
    device vtap0;
    proto tcp;
    keepalive yes;
    persist yes;
    compress no;
    encrypt yes;

    up {
        ip "link set %% up multicast on";
        ip "-family inet addr add 10.10.0.2/30 dev %%";
    };

    down {
        ifconfig "%% down";
    };
}

m4s4cr3_zoiber {
    passwd 4lf43xp10it;
    type ether;
    device vtap1;
    proto tcp;
    keepalive yes;
    persist yes;
    compress no;
    encrypt yes;

    up {
        ip "link set %% up multicast on";
        ip "-family inet addr add 10.10.2.1/30 dev %%";
    };

    down {
        ifconfig "%% down";
    };
}
vi /etc/vtund-start.conf
--server-- 9000
zoiber_kr0m WANIP_KR0M
/etc/init.d/vtun start
rc-update add vtun default

M4s4cr3

vi /etc/vtund.conf
options {
  port 9000;        # Listen on this port.

  # Syslog facility
  syslog     daemon;

  # Path to various programs
  ifconfig     /bin/ifconfig;
  route     /bin/route;
  firewall     /sbin/iptables;
  ip        /bin/ip;
}

# Default session options
default {
  compress no;      # Compression is off by default
  encrypt no;
  speed 0;        # By default maximum speed, NO shaping
}

m4s4cr3_kr0m {
    passwd 4lf43xp10it;
    type ether;
    device vtap0;
    proto tcp;
    keepalive yes;
    persist yes;
    compress no;
    encrypt yes;

    up {
        ip "link set %% up multicast on";
        ip "-family inet addr add 10.10.1.2/30 dev %%";
    };

    down {
        ifconfig "%% down";
    };
}

m4s4cr3_zoiber {
    passwd 4lf43xp10it;
    type ether;
    device vtap1;
    proto tcp;
    keepalive yes;
    persist yes;
    compress no;
    encrypt yes;

    up {
        ip "link set %% up multicast on";
        ip "-family inet addr add 10.10.2.2/30 dev %%";
    };

    down {
        ifconfig "%% down";
    };
}
vi /etc/vtund-start.conf
m4s4cr3_kr0m WANIP_KR0M
m4s4cr3_zoiber WANIP_ZOIBER
/etc/init.d/vtun start
rc-update add vtun default

Pasamos a la configuración OSPF, debemos configurar un router-id este debe ser la dirección ip de una interfaz que nunca falle, una interfaz loopback es ideal.

Debemos tener el enrutamiento habilitado a nivel de kernel en todos los nodos de interconexión.

vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p

Kr0m

cp /usr/share/doc/quagga-0.99.23.1/samples/zebra.conf.sample.bz2 /etc/quagga/
cp /usr/share/doc/quagga-0.99.23.1/samples/ospfd.conf.sample.bz2 /etc/quagga/
cp /usr/share/doc/quagga-0.99.23.1/samples/ripd.conf.sample.bz2 /etc/quagga/
cd /etc/quagga/
bzip2 -dc zebra.conf.sample.bz2 > zebra.con
bzip2 -dc ospfd.conf.sample.bz2 > ospfd.conf
bzip2 -dc ripd.conf.sample.bz2 > ripd.conf
rm *.bz2
chown quagga:quagga .conf
chmod 640 /etc/quagga/
.conf
/etc/init.d/zebra restart
vi zebra.conf
hostname Kr0m-Zebra
password 4lf43xp10it
enable password 4lf43xp10it

interface lo
  ip address 10.255.255.1/32
/etc/init.d/zebra restart
rc-update add zebra default
vi ripd.conf
hostname Kr0m-Zebra
password 4lf43xp10it

key chain ripauth
 key 11
  key-string 4lf43xp10it

interface lxcbr0
 ip rip send version 2
 ip rip receive version 2
 ip rip authentication mode md5 auth-length rfc
 ip rip authentication key-chain ripauth

router rip
 version 2
! Habilito RIP en la interfaz LAN
 network lxcbr0

! Publico por rip las redes aprendidas por OSPF, pero las redes deben ser de las indicadas en zoiber_m4s4cr3_net -> zoiber_m4s4cr3_acl
  redistribute ospf route-map zoiber_m4s4cr3_net
 
! Filtro el trafico de salida en la LAN, esto se hace por si alguien publica rutas en la LAN que sean ignoradas, las redes deben ser de las indicadas en zoiber_m4s4cr3_acl
  distribute-list zoiber_m4s4cr3-acl out lxcbr0
 
! Defino las ACLs:
  access-list zoiber_m4s4cr3-acl permit 192.168.69.0/24
  access-list zoiber_m4s4cr3-acl permit 192.168.1.0/24
  access-list zoiber_m4s4cr3-acl deny any

! Defino grupos de ACLs que forma route-maps:
  route-map zoiber_m4s4cr3_net permit 10
    match ip address zoiber_m4s4cr3-acl

log stdout
vi ospfd.conf
hostname Kr0m-Zebra
password 4lf43xp10it
enable password 4lf43xp10it

interface vtap0
   ip ospf cost 1
interface vtap1
   ip ospf cost 2

router ospf
  ospf router-id 10.255.255.1
  network 10.255.255.1/32 area 0
  network 10.10.0.0/30 area 0
  network 10.10.1.0/30 area 0
  network 192.168.40.0/24 area 0

log stdout
/etc/init.d/zebra restart
/etc/init.d/ripd restart

Zoiber

cp /usr/share/doc/quagga-0.99.23.1/samples/zebra.conf.sample.bz2 /etc/quagga/
cp /usr/share/doc/quagga-0.99.23.1/samples/ospfd.conf.sample.bz2 /etc/quagga/
cp /usr/share/doc/quagga-0.99.23.1/samples/ripd.conf.sample.bz2 /etc/quagga/
cd /etc/quagga/
bzip2 -dc zebra.conf.sample.bz2 > zebra.conf
bzip2 -dc ospfd.conf.sample.bz2 > ospfd.conf
bzip2 -dc ripd.conf.sample.bz2 > ripd.conf
rm *.bz2
chown quagga:quagga .conf
chmod 640 /etc/quagga/
.conf
/etc/init.d/zebra restart
vi zebra.conf
hostname Zoiber-Zebra
password 4lf43xp10it
enable password 4lf43xp10it

interface lo
  ip address 10.255.255.2/32
/etc/init.d/zebra restart
rc-update add zebra default
vi ripd.conf
hostname Zoiber-Zebra
password 4lf43xp10it

key chain ripauth
 key 11
  key-string 4lf43xp10it

interface eth0
 ip rip send version 2
 ip rip receive version 2
 ip rip authentication mode md5 auth-length rfc
 ip rip authentication key-chain ripauth

router rip
 version 2
! Habilito RIP en la interfaz LAN
 network eth0

! Publico por rip las redes aprendidas por OSPF, pero las redes deben ser de las indicadas en kr0m_m4s4cr3_net -> kr0m_m4s4cr3_acl
  redistribute ospf route-map kr0m_m4s4cr3_net
 
! Filtro el trafico de salida en la LAN, esto se hace por si alguien publica rutas en la LAN que sean ignoradas, las redes deben ser de las indicadas en kr0m_m4s4cr3_acl
  distribute-list kr0m_m4s4cr3-acl out eth0
 
! Defino las ACLs:
  access-list kr0m_m4s4cr3-acl permit 192.168.40.0/24
  access-list kr0m_m4s4cr3-acl permit 192.168.1.0/24
  access-list kr0m_m4s4cr3-acl deny any

! Defino grupos de ACLs que forma route-maps:
  route-map kr0m_m4s4cr3_net permit 10
    match ip address kr0m_m4s4cr3-acl

log stdout
vi ospfd.conf
hostname Zoiber-Zebra
password 4lf43xp10it
enable password 4lf43xp10it

interface vtap0
   ip ospf cost 1

interface vtap1
   ip ospf cost 2

router ospf
! Habilito OSPF en la interfaz TUNEL
  ospf router-id 10.255.255.2
  network 10.255.255.2/32 area 0
  network 10.10.0.0/30 area 0
  network 10.10.2.0/30 area 0
  network 192.168.69.0/24 area 0

log stdout
/etc/init.d/zebra restart
/etc/init.d/ripd restart

M4s4cr3

cp /usr/share/doc/quagga-0.99.23.1/samples/zebra.conf.sample.bz2 /etc/quagga/
cp /usr/share/doc/quagga-0.99.23.1/samples/ospfd.conf.sample.bz2 /etc/quagga/
cp /usr/share/doc/quagga-0.99.23.1/samples/ripd.conf.sample.bz2 /etc/quagga/
cd /etc/quagga/
bzip2 -dc zebra.conf.sample.bz2 > zebra.conf
bzip2 -dc ospfd.conf.sample.bz2 > ospfd.conf
bzip2 -dc ripd.conf.sample.bz2 > ripd.conf
rm *.bz2
chown quagga:quagga .conf
chmod 640 /etc/quagga/
.conf
/etc/init.d/zebra restart
vi zebra.conf
hostname M4s4cr3-Zebra
password 4lf43xp10it
enable password 4lf43xp10it

interface lo
  ip address 10.255.255.3/32
/etc/init.d/zebra restart
rc-update add zebra default
vi ripd.conf
hostname M4s4cr3-Zebra
password 4lf43xp10it

key chain ripauth
 key 11
  key-string 4lf43xp10it

interface enp5s2
 ip rip send version 2
 ip rip receive version 2
 ip rip authentication mode md5 auth-length rfc
 ip rip authentication key-chain ripauth

router rip
 version 2
! Habilito RIP en la interfaz LAN
 network enp5s2

! Publico por rip las redes aprendidas por OSPF, pero las redes deben ser de las indicadas en kr0m_zoiber_net -> kr0m_zoiber_acl
  redistribute ospf route-map kr0m_zoiber_net
 
! Filtro el trafico de salida en la LAN, esto se hace por si alguien publica rutas en la LAN que sean ignoradas, las redes deben ser de las indicadas en kr0m_zoiber_acl
  distribute-list kr0m_zoiber-acl out enp5s2
 
! Defino las ACLs:
  access-list kr0m_zoiber-acl permit 192.168.40.0/24
  access-list kr0m_zoiber-acl permit 192.168.69.0/24
  access-list kr0m_zoiber-acl deny any

! Defino grupos de ACLs que forma route-maps:
  route-map kr0m_zoiber_net permit 10
    match ip address kr0m_zoiber-acl

log stdout
vi ospfd.conf
hostname M4s4cr3-Zebra
password 4lf43xp10it
enable password 4lf43xp10it

interface vtap0
   ip ospf cost 1

interface vtap1
   ip ospf cost 2

router ospf
! Habilito OSPF en la interfaz TUNEL
  ospf router-id 10.255.255.3
  network 10.255.255.3/32 area 0
  network 10.10.1.0/30 area 0
  network 10.10.2.0/30 area 0
  network 192.168.1.0/24 area 0

log stdout
/etc/init.d/zebra restart
/etc/init.d/ripd restart

NOC

vi zebra.conf
hostname NOC-Zebra
password 4lf43xp10it
enable password 4lf43xp10it
vi ripd.conf
hostname NOC-Zebra
password 4lf43xp10it

key chain ripauth
 key 11
 key-string 4lf43xp10it

interface enp0s18
 ip rip authentication mode md5 auth-length rfc
 ip rip authentication key-chain ripauth

router rip
 version 2
 network enp0s18

log stdout

chown quagga:quagga .conf
chmod 640 /etc/quagga/
.conf

/etc/init.d/zebra restart
/etc/init.d/ripd restart
rc-update add zebra default
rc-update add ripd default


Skynet

vi zebra.conf
hostname Skynet-Zebra
password 4lf43xp10it
enable password 4lf43xp10it
vi ripd.conf
hostname Skynet-Zebra
password 4lf43xp10it

key chain ripauth
 key 11
 key-string 4lf43xp10it

interface eth0
 ip rip authentication mode md5 auth-length rfc
 ip rip authentication key-chain ripauth

router rip
 version 2
 network eth0

log stdout

chown quagga:quagga .conf
chmod 640 /etc/quagga/
.conf

/etc/init.d/zebra restart
/etc/init.d/ripd restart
rc-update add zebra default
rc-update add ripd default


Moria

vi zebra.conf
hostname Moria-Zebra
password 4lf43xp10it
enable password 4lf43xp10it
vi ripd.conf
hostname Moria-Zebra
password 4lf43xp10it

key chain ripauth
 key 11
 key-string 4lf43xp10it

interface enp5s1
 ip rip authentication mode md5 auth-length rfc
 ip rip authentication key-chain ripauth

router rip
 version 2
 network enp5s1

log stdout

chown quagga:quagga .conf
chmod 640 /etc/quagga/
.conf

/etc/init.d/zebra restart
/etc/init.d/ripd restart
rc-update add zebra default
rc-update add ripd default

Ahora desde cualquier equipo interno dentro de la lan podremos acceder de forma transparente a los equipos de las otras dos lanes :)

Además si cortamos la comunicación en alguno de los nodos de interconexión el tráfico será re-enrutado de forma transparente para el cliente.


TROUBLESHOOTING

Si queremos debugear RIP conectamos con el demonio del siguiente modo:

telnet localhost 2602
4lf43xp10it

show ip rip
show ip rip status
show ip protocols
debug rip events
debug rip packet
debug rip zebra
show debugging rip

En cambio si queremos debugear OSPF:

telnet localhost 2604
4lf43xp10it

enable
4lf43xp10it

show ip ospf
show ip ospf interface IFACE
show ip ospf neighbor
show ip ospf neighbor detail
show ip ospf neighbor IFACE
show ip ospf route

Si te ha gustado el artículo puedes invitarme a un RedBull aquí