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:
Kr0m
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";
};
}
--server-- 9000
rc-update add vtun default
Zoiber
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";
};
}
--server-- 9000
zoiber_kr0m WANIP_KR0M
rc-update add vtun default
M4s4cr3
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";
};
}
m4s4cr3_kr0m WANIP_KR0M
m4s4cr3_zoiber WANIP_ZOIBER
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.
net.ipv4.ip_forward = 1
Kr0m
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
hostname Kr0m-Zebra
password 4lf43xp10it
enable password 4lf43xp10it
interface lo
ip address 10.255.255.1/32
rc-update add zebra default
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
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/ripd restart
Zoiber
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
hostname Zoiber-Zebra
password 4lf43xp10it
enable password 4lf43xp10it
interface lo
ip address 10.255.255.2/32
rc-update add zebra default
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
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/ripd restart
M4s4cr3
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
hostname M4s4cr3-Zebra
password 4lf43xp10it
enable password 4lf43xp10it
interface lo
ip address 10.255.255.3/32
rc-update add zebra default
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
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/ripd restart
NOC
hostname NOC-Zebra
password 4lf43xp10it
enable password 4lf43xp10it
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
hostname Skynet-Zebra
password 4lf43xp10it
enable password 4lf43xp10it
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
hostname Moria-Zebra
password 4lf43xp10it
enable password 4lf43xp10it
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