Configurar una direccion IP flotante
entre 2 equipos en redes diferentes
Introduccion
Las direcciones IP flotantes son muy utiles para ofrecer alta disponibilidad a servicios dentro de un mismo rango de red, esto lo podemos
implementar haciendo uso de keepalived
, pero cuando los nodos no estan en el mismo rango de red no podemos utilizar keepalived debido a que este
utilizar el protocolo VRRP que funciona sobre L2
En caso de que necesitemos configurar una IP flotante entre equipos que estan en redes diferentes, es decir en rangos de red diferentes, lo podemos
utilizar haciendo uso del protocolo de ruteo BGP
La forma en la que esto funciona es la siguiente:
- Ambos nodos tienen la direccion
IP flotante
configurada en una interfaz dummy
-
Ambos nodos publican rutas por
BGP
para llegar a IP flotante
-
El router de la red debe aprender esas rutas de forma a que cuando un cliente quiera conectarse a la
IP flotante
, este direccionara el trafico
hacia nuestros nodos
-
En caso de que uno de los nodos caiga, el router dejara de aprender rutas de el por lo tanto el trafico se dirige al nodo activo
Esta implementacion nos ofrece alta disponibilidad entre nodos ademas de balanceo de carga
En este documento mostraremos paso a paso lo necesario para implementar la IP Flotante
utilizando BGP entre 2 nodos CentOS 7 y
un tercer nodo CentOS 7 que actuara de router
Para esto utilizaremos BIRD
tanto en los nodos que tendran la IP flotante
como en el router para que aprenda las rutas por BGP
El entorno en el que esta basado este documento es el siguiente:
-
nodo1:
- hostname: ha-bgp1
- SO: CentOS 7
- IP: 10.100.1.151
- BGP AS: 64513
-
nodo2:
- hostname: ha-bgp2
- SO: CentOS 7
- IP: 10.100.2.151
- BGP AS: 64514
-
router:
- hostname: rt1
- SO: CentOS 7
- IP eth0: 10.100.1.150
- IP eth0: 10.100.2.150
- BGP AS: 64515
-
IP Flotante
: 10.155.155.1/32
Instalacion de BIRD
Utilizaremos BIRD
tanto para publicar las rutas como para aprenderlas, por lo tanto debemos instalarlo tanto en los nodos, como en el router
El paquete BIRD se encuentra dentro del repositorio epel, el cual podemos configurar/habilitar con el siguiente comando:
yum install -y epel-release
Una vez que tenemos configurado el repositorio epel procedemos a instalar BIRD
yum install -y bird
Configurar IP flotante
en una interfaz dummy
Como comentamos en la introduccion, la IP flotante
en realidad seria una IP configurada en el equipo sobre una interfaz dummy
Que es una interfaz dummy?
Una interfaz dummy es un interfaz logica que no tiene conexion alguna con el mundo fisico, es decir, una interfaz que solo puede ser vista por el
mismo equipo donde esta configurado
Configuramos la interfaz en el nodo1, en nuestro caso ha-bgp1
, esto lo haremos creando un servicio de systemd que se encargue de levantar la IP
ha-bgp1
[root@ha-bgp1 ~]# cat <<EOF > /etc/systemd/system/dummy0.service
[Unit]
Description=Dummy network interface
After=network.target
[Service]
Type=simple
ExecStartPre=-/sbin/ip link add dev dummy0 type dummy
ExecStartPre=/sbin/ip link set dummy0 up
ExecStartPre=/sbin/ip addr add dev dummy0 10.155.155.1/32
ExecStart=/usr/bin/sleep infinity
ExecStop=/sbin/ip link del dummy0
[Install]
WantedBy=multi-user.target
EOF
Luego habilitamos y levantamos dicho servicio
[root@ha-bgp1 ]# systemctl daemon-reload
[root@ha-bgp1 ]# systemctl start dummy0
[root@ha-bgp1 ]# systemctl enable dummy0
ha-bgp2
Luego debemos hacer lo mismo en ha-bgp2
[root@ha-bgp2 ~]# cat <<EOF > /etc/systemd/system/dummy0.service
[Unit]
Description=Dummy network interface
After=network.target
[Service]
Type=simple
ExecStartPre=-/sbin/ip link add dev dummy0 type dummy
ExecStartPre=/sbin/ip link set dummy0 up
ExecStartPre=/sbin/ip addr add dev dummy0 10.155.155.1/32
ExecStart=/usr/bin/sleep infinity
ExecStop=/sbin/ip link del dummy0
[Install]
WantedBy=multi-user.target
EOF
Habilitamos y levantamos el servicio
[root@ha-bgp2 ]# systemctl daemon-reload
[root@ha-bgp2 ]# systemctl start dummy0
[root@ha-bgp2 ]# systemctl enable dummy0
Instalar y configurar BIRD
Una vez que tenemos nuestra IP flotante
configurada en la interfaz dummy de cada nodo, debemos configurar BIRD para que publique rutas para llegar a dicha IP utilizando el protocolo BGP
Movemos la configuracion de ejemplo para crear un archivo de configuracion vacio
ha-bgp1
[root@ha-bgp1 ~]# mv /etc/bird.conf /etc/bird.conf_original
ha-bgp2
[root@ha-bgp2 ~]# mv /etc/bird.conf /etc/bird.conf_original
Configuramos BIRD
en el nodo1
Editamos el archivo de configuracion del servicio
[root@ha-bgp1 ~]# vi /etc/bird.conf
Y agregamos lo siguiente
log "/var/log/bird" all;
router id 10.100.1.151;
protocol device {
scan time 60;
}
protocol direct {
interface "dummy0";
}
protocol bgp router1 {
local as 64513;
source address 10.100.1.151;
import none;
export all;
graceful restart on;
next hop self;
multihop 2;
neighbor 10.100.1.150 as 64515;
}
Configuramos BIRD
en el nodo2
Editamos el archivo de configuracion del servicio
[root@ha-bgp2 ~]# vi /etc/bird.conf
Y agregamos lo siguiente
log "/var/log/bird" all;
router id 10.100.2.151;
protocol device
{
scan time 60;
}
protocol direct {
interface "dummy0";
}
protocol bgp floatingip {
local as 64514;
source address 10.100.2.151;
import none;
export all;
graceful restart on;
next hop self;
multihop 2;
neighbor 10.100.2.150 as 64515;
}
Configuramos el firewall para que permita conexiones BGP
En caso de que tengamos habilitado el firewall del equipo debemos habilitar el puerto 179 tanto TCP como UDP
ha-bgp1
[root@ha-bgp1 ~]# firewall-cmd --permanent --add-port=179/tcp --add-port=179/udp
[root@ha-bgp1 ~]# firewall-cmd --reload
ha-bgp2
[root@ha-bgp2 ~]# firewall-cmd --permanent --add-port=179/tcp --add-port=179/udp
[root@ha-bgp2 ~]# firewall-cmd --reload
Iniciamos y habilitamos el servicio en ambos nodos
ha-bgp1
[root@ha-bgp1 ~]# systemctl start bird
[root@ha-bgp1 ~]# systemctl enable bird
ha-bgp2
[root@ha-bgp2 ~]# systemctl start bird
[root@ha-bgp2 ~]# systemctl enable bird
Configuracion de BIRD
en el router
Finalmente debemos configurar el router para que aprenda las rutas publicadas por los nodos
[root@rt1 ~]# vi /etc/bird.conf
Agregamos lo siguiente:
filter floatingip {
if net = 10.155.155.1/32 then accept;
}
router id 10.100.1.150;
protocol direct {
interface "*";
}
protocol kernel {
persist; # No elimina las rutas cuando se baja el servicio
scan time 20; # Escanea la tabla de ruteo del kernel cada 20 segundos
export all; # Carga todas las rutas a la tabla de rutas del kernel
}
protocol device {
scan time 10; # Escanea las interfaces cada 10 segundos
}
protocol bgp nodo1 {
import filter floatingip;
hold time 10;
local as 64515;
neighbor 10.100.1.151 as 64513;
}
protocol bgp nodo2 {
import filter floatingip;
hold time 10;
local as 64515;
neighbor 10.100.2.151 as 64514;
}
En caso de que tengamos habilitado el firewall debemos crear las reglas correspondientes para permitir BGP
[root@rt1 ~]# firewall-cmd --permanent --add-port=179/tcp --add-port=179/udp
[root@rt1 ~]# firewall-cmd --reload
Finalmente iniciamos y habilitamos el servicio bird
[root@rt1 ~]# systemctl start bird
[root@rt1 ~]# systemctl enable bird
Podemos comprobar las rutas importadas por nuestro router de la siguiente manera
[root@rt1 ~]# birdc show route
BIRD 1.4.5 ready.
10.100.2.0/24 dev eth0 [direct1 11:54:43] * (240)
10.100.1.0/24 dev eth0 [direct1 11:54:43] * (240)
10.155.155.1/32 via 10.100.1.151 on eth0 [nodo1 11:54:47] * (100) [AS64513i]
via 10.100.2.151 on eth0 [nodo2 11:54:48] (100) [AS64514i]
Con esto tenemos configurada nuestra IP flotante
entre equipos que no estan en la misma subnet. Esta configuracion la podemos utilizar con cualquier router que soporte el protocolo BGP