IP flotante con BGP en CentOS/RHEL/SL 7

ip_flotante_bgp

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

Deja un comentario