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:
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:
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:
Y eso es todo.
Valora este artículo







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