dividir el tráfico de red entre dos isp

Dividir el tráfico de red entre dos ISP en Linux

Tener dos canales de Internet (dos ISP), además de ser un modelo redundante ante fallas, también nos sirve como como modelo de balanceo de carga. Es decir, el tráfico de red se divide entre dos ISP (o más), con lo que obtenemos una mejora en el desempeño de los servicios electrónicos corporativos, tales como video-conferencias, correo electrónico, comercio electrónico, etc. Veamos entonces en este artículo cómo dividir el tráfico de red entre dos ISP en Linux.

Descripción del escenario


Existen dos formas de obtener un balanceo de carga del tráfico de red, en Linux, aplicando el método de dividir el tráfico de red entre dos ISP: Una forma es balancear el tráfico con Squid Proxy, y la otra es con este método que estamos repasando, usando directamente el kernel de Linux:

Para este propósito necesitamos básicamente estos recursos:

  • Dos ISP
  • Linux con iproute e iptables (Linux como firewall)

Este escenario podemos simularlo con ayuda de GNS3, y esta es la topología de red que puede servirnos como ejemplo:

dividir el tráfico de red entre dos isp

Entonces, el escenario consta de estos nodos:

  • Un cliente llamado UbuntuCliente, que es una máquina virtual con Ubuntu Desktop, y desde donde produciremos tráfico ICMP y Web.
  • Dos ISPs llamados NAT1 y NAT2
  • Un Firewall Linux llamado FirewallLinux, que es una máquina virtual con Ubuntu Server.

Es este último dispositivo que realiza el balanceo de carga, y sus tres interfaces de red tienen la siguiente configuración:

  • ens4: 10.0.0.1
  • ens5: 192.168.122.115 (default gateway 192.168.122.1)
  • ens6: 172.16.0.2 (default gateway 172.16.0.1)

Entonces, nuestro objetivo consiste en enrutar el tráfico ICMP y DNS a través de ISP 2, y por el otro lado enrutar el tráfico HTTP y HTTPS a través de ISP 1. Este objetivo lo cumplimos con ayuda de FirewallLinux.  

Debido a que los nodos NAT de GNS3 solo proporcionan direcciones IP en el mismo segmento de red (192.168.122.0/24), hemos colocado un segundo nodo llamado Linux (una máquina virtual Ubuntu Server) entre el FirewallLinux y NAT1, de manera que Linux y NAT1 funcionan como el ISP 1.

Comandos Linux para dividir el tráfico de red entre dos ISP


Ya definida la planificación del objetivo, es decir, la organización de la topología de red y la identificación de los dispositivos, empleamos los siguientes comandos para dividir el tráfico de datos en el nodo FirewallLinux:

#Instalamos iproute
sudo apt install iproute (ó iproute2)

#Borrar el default gateway predeterminado
sudo route del -net 0.0.0.0 gw 192.168.122.1

#Habilitamos el reenvío de paquetes
echo 1 >> /proc/sys/net/ipv4/ip_forward

#Creamoslas tablas router1 y router2 (ó ejecuta estos dos comandos como root)
echo 201 router1 >> /etc/iproute2/rt_tables
echo 202 router2 >> /etc/iproute2/rt_tables

#Marcar los paquetes ICMP y DNS que deben ir a traves de ISP 2
sudo iptables -t mangle -A PREROUTING -i ens4 ! -d 10.0.0.1 -p icmp -j MARK --set-mark 2
sudo iptables -t mangle -A PREROUTING -i ens4 ! -d 10.0.0.1 -p tcp --dport 53 -j MARK --set-mark 2
sudo iptables -t mangle -A PREROUTING -i ens4 ! -d 10.0.0.1 -p udp --dport 53 -j MARK --set-mark 2

#Definir la ruta predeterminada para ambos ISP
sudo ip route add default scope global nexthop via 192.168.122.1 dev ens5 weight 1 nexthop via 172.16.0.1 dev ens6 weight 2

#Enviamos los paquetes ICMP (marcados con 2) por el ISP 2
sudo ip route add default via 192.168.122.1 dev ens5 table router2
sudo ip rule add from all fwmark 2 table router2

#Habilitamos el trafico ICMP y DNS
sudo iptables -t nat -A POSTROUTING -o ens5 -p icmp -j MASQUERADE
sudo iptables -t nat -A POSTROUTING -o ens5 -p tcp --dport 53 -j MASQUERADE
sudo iptables -t nat -A POSTROUTING -o ens5 -p udp --dport 53 -j MASQUERADE

#Ahora marcamos el trafico http y https con 1, y su flujo sera a traves del ISP 1
sudo iptables -t mangle -A PREROUTING -i ens4 ! -d 10.0.0.1 -p tcp --dport 80 -j MARK --set-mark 1
sudo iptables -t mangle -A PREROUTING -i ens4 ! -d 10.0.0.1 -p tcp --dport 443 -j MARK --set-mark 1
sudo ip route add default via 172.16.0.1 dev ens6 table router1
sudo ip rule add from all fwmark 1 table router1

Por otro lado, en el equipo llamado Linux, colocamos los siguientes comandos para habilitar el tráfico a través de él mismo.

echo 1 >> /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o ens5 -j MASQUERADE

A este procedimiento también le llaman “enrutamiento selectivo”.

La teoría dice que el “scope” es un indicador de la distancia hacia la red de destino. El peso (weight) es un factor que se utiliza para determinar la preferencia de una ruta sobre otra. Cuanto mayor sea el peso, mayor será la preferencia.

Tarjetas de red para dividir el tráfico entre dos ISP


Todo bien con la simulación, pero es claro que para implementar esta mejora en una máquina Linux real, ésta debe tener tres interfaces de red. Con la NIC integrada que ya trae la mainboard, y una tarjeta de red dual adicional, como la Intel 82571 Gigabit Dual Port, cubrimos dicha necesidad.

La instalamos en el puerto PCI Express y listo.

Y ahí tenemos las dos interfaces adicionales proporcionadas por la  Intel 82571 listas para configurarla en Linux.

Verificando el balanceo de tráfico


Con ayuda del comando pktstat podemos validar que efectivamente el tráfico ICMP y DNS proveniente de UbuntuCliente esté circulando por medio de la interfaz ens5 de FirewallLinux, y que el tráfico web esté circulando por medio de la interfaz ens4 del nodo Linux.

Para tener un monitoreo más panorámico de las interfaces de red, puedes revisar el siguiente artículo:

Monitorear tráfico en Linux

Con el comando ip route list podemos verificar la rutas predeterminadas que definimos para ambos ISP:

default
    nexthop via 192.168.122.1 dev ens5 weight 1
    nexthop via 172.16.0.1 dev ens6 weight 2

Con el mismo comando podemos validar si se nos ha desconectado uno de los puertos del balanceo (en este ejemplo es el ens6):

default
    nexthop via 192.168.122.1 dev ens5 weight 1
    nexthop via 172.16.0.1 dev ens6 weight 2 dead linkdown

Datos adicionales


Las máquinas virtuales que usamos en este laboratorio de GNS3, podemos descargarlas desde la plataforma de OSBoxes.org.

Al poner a funcionar la máquina virtual Ubuntu Server, puede que no veamos de primerazo las interfaces de red porque éstas inician deshabilitadas. Podemos usar el siguiente comando para visualizarlas e identificarlas:

ip link 

Como NAT1 y NAT2 les configura una dirección IP automáticamente a ambos Linux, podemos instalar el paquete de utilerías net-tools para configurar y visualizar las interfaces de red de forma más amigable 

sudo apt install net-tools

Y configuramos el resto de interfaces de red:

#Para el nodo Linux
sudo ifconfig ens4 172.16.0.1 netmask 255.255.0.0 up
#Para LinuxFirewall
sudo ifconfig ens4 10.0.0.1 netmask 255.255.255.0 up
sudo ifconfig ens6 172.16.0.2 netmask 255.255.0.0 up

En un escenario real, el FirewallLinux debe tener todas las interfaces de red conectadas (así sea con un switche de red aislado, de esos de 8 puertos), de lo contrario al ejecutar el comando ip route add defaul scrope…  nos aparecerá un error que dice:

Error: Nexthop has invalid gateway.

Conmutando el Caudal de Datos ó Failover


Otro uso que podemos aprovechar del enrutamiento con Linux, es aquel que llaman failover. El failover, o conmutación por error, es un modelo de tolerancia a fallos, que ante la caída de un ISP, el sistema pone a operar el segundo ISP. Como hemos de suponer, en este modelo el caudal de datos no se divide entre los dos ISP, sino que todo el caudal se canaliza solo por uno de los dos. Ante el fallo de uno, el sistema canaliza la conexión a Internet por el segundo.  Pero este failover que muestro a continuación es manual, es decir, lo activamos por medio de un script (aunque podemos automatizarlo con un algoritmo sencillo, sistemas como pfSense traen un módulo ya hecho para failover).

Nuestro primer script define el enrutamiento base, solo lo activamos una sola vez (lo podemos incluir en el archivo /etc/rc.local para que se cargue al iniciar el sistema)

#!/bin/bash

#BORRAMOS RUTA PREDETERMINADA
route del -net 0.0.0.0 gw 192.168.122.1

#DEFINIMOS LOS DOS ISP
ip route add default scope global nexthop via 192.168.122.1 dev ens5 weight 1 nexthop via 172.16.0.1 dev ens6 weight 2

#TODO LO MARCADO CON 2 SALGA POR ISP 2
ip route add default via 192.168.122.1 dev ens5 table router2
ip rule add from all fwmark 2 table router2

#TODO LO MARCADO CON 1 SALGA POR ISP 1
ip route add default via 172.16.0.1 dev ens6 table router1
ip rule add from all fwmark 1 table router1

Con los siguientes dos scripts nos encargamos de marcar los paquetes para sean canalizados por el ISP según sea la falla.

ruta1.sh

#!/bin/bash
iptables -t mangle -F
iptables -t nat -F

iptables -t mangle -A PREROUTING -i ens4 ! -d 10.0.0.1 -j MARK --set-mark 1

ruta2.sh

#!/bin/bash
iptables -t mangle -F
iptables -t nat -F

iptables -t mangle -A PREROUTING -i ens4 ! -d 10.0.0.1 -j MARK --set-mark 2
iptables -t nat -A POSTROUTING -o ens5 -j MASQUERADE

Conclusión


Aunque en este ejemplo hemos canalizado el tráfico web por un lado, y el ICMP y DNS por otro, sólo a modo de ejemplo, en la vida real dentro de una corporación éstos dos últimos no son muy representativos en un alto flujo de datos, por lo que es mejor separar el tráfico tipo UDP del TCP, debido a que UDP suele ser usado por servicios de videollamadas y multimedia. De todas formas esto no es una camisa de fuerza, y la configuración del balanceo de carga depende la realidad de cada empresa, y Linux nos ofrece esa flexibilidad para ajustarlo a esas realidades.

Existe un excelente documento sobre Routing Policy Database, de Juan Sánchez, para su consulta.

Seguridad Informática


Si tenemos un máquina linux trabajando como router, firewall, equipo de frontera, es bueno aplicarle medidas de seguridad, tales como implementar Fail2ban, y seguir estas recomendaciones adicionales:

Bloquear escaneo de puertos en Linux

Port Knocking o Golpeteo de Puertos en Linux

Prevención de ataques informáticos

Comandos iptables

Y eso es todo.


Valora este artículo

Dividir el tráfico en dos canales en Linux
5,0 rating based on 12.345 ratings
Overall rating: 5 out of 5 based on 2 reviews.
Nombres
Email
Titulo
Calificanos
Contenido

Interesante

★★★★★
“ Me ayudó mucho a mi tarea. Gracias,”
- Andres Mauricio Posso

tema muy interesante

★★★★★
“ La parte de failover me intereso mucho lo pondre ya que tengo un servidor debian 12 que ya tiene 2 ISPs, Muchas gracias por tu aporte, estaba buscando algo que me diera ideas para poder hacer el failover de debiam, lo implementare en estos dias y te avisare si tengo exito.”
- Martin
Comparte esto en
Publicado en GNU Linux.

Un comentario

  1. Pingback: 🥇 Comandos Linux para la Gestión de Redes LAN - Networking

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *