martes, 29 de julio de 2014

Balanceo de Carga con Debian, IPTables e interfaces Bridge (virtuales).

Hace unos días tuvimos que resolver una configuración de balanceo de carga (únicamente balanceo de carga, sin redundancia). El esquema de red es el siguiente:
En resumen,según el esquema y lo que necesitamos:
Conecciones ADSL (o cualquier otro tipo de salida hacia internet)
Dos Router ADSL que nos servirán de Gateway, cada uno: ADSL1,ADSL2
Servidor Principal
Instalado en Debian 7 (Wheezy)
Instalado Proxmox como interfaz de administración de KVM
Dos Interfaces de Red (NIC) físicas (van conectadas cada una a un ADSL): IF1, IF2
Una Interfaz de Red Virtual (Bridge) que no está enlazada a ninguna interfaz de red física: IF0

La idea principal es que el servidor sirva de puerta de enlace, suministrando dos conexiones de internet a una misma salida virtual (bridge), para que la utilicen los servidores montados sobre máquinas virtuales (servidor de firewall, http proxy, distribución, dhcp, etc) y que devuelvan la conexión.

Configurar interfaces de red


Esto se hace desde el archivo "/etc/interfaces", donde se definen las configuraciones de las interfaces de red físicas y virtuales. Primero se deben conseguir los datos de configuración de los gateways de cada ISP, necesitamos IP-address y Netmask de cada router/gateway. A continuación el ejemplo de archivo de configuración (recuerden establecer los parámetros de conexión según sus necesidades). Primero abrimos el archivo de configuración con algún editor de texto, yo utilizo nano desde consola, para abrir el archivo se utilizaría el siguiente comando:
nano /etc/network/interfaces
Ahora editamos el archivo de configuración, básicamente debemos configurar las interfaces estáticas (manuales) y quitamos el Gateway:
# ###################################
# Configuración del loopback
auto lo

iface lo inet loopback
# ###################################
# Configuración de interfaces físicas
# ...

# IF1 - Sale por ADSL 1
# NO debe configurar Gatway --- SIN GATEWAY
auto eth0
allow-hotplug eth0
iface eth0 inet static
address 10.10.1.2
netmask 255.255.255.0
network 10.10.1.0
broadcast 10.10.1.255
# el gateway para el ejemplo es el 10.10.1.1

# IF2 - Sale por ADSL 2
# NO debe configurar Gatway --- SIN GATEWAY
auto eth1
allow-hotplug eth1
iface eth1 inet static
address 10.20.2.2
netmask 255.255.255.0
network 10.20.2.0
broadcast 10.20.2.255
# el gateway para el ejemplo es el 10.20.2.1

# ...
# Configuración de interfaz Virtual
# ...

# IF0 para red LAN Virtual
# Vmbr2 no tiene ninguna interface de red física enlazada,
# pues se utilizará únicamente para máquinas virtuales.
auto vmbr2
iface vmbr2 inet static
address 192.168.1.1
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
bridge_ports none
bridge_stp off
bridge_fd 0
# ...
# TO DO
# ...

Agregar tablas de rutas

Seguido se deben agregar las tablas de rutas, esto al final del archivo de configuración "/etc/iproute2/rt_tables", se puede agregar cualquier nombre, pero representativo para acordarnos a la hora de hacer los otros scripts. Agregaremos 4, 2 de salida/entrada y 2 de marcado de paquetes:

echo 200 T1 >> /etc/iproute2/rt_tables
echo 201 T2 >> /etc/iproute2/rt_tables
echo 202 lento >> /etc/iproute2/rt_tables
echo 203 rápido >> /etc/iproute2/rt_tables

Configurar rutas en el iptables

En las siguientes lineas se documenta todo explicando paso a paso. Nos basamos, casi textualmente :P, del blog de K-Nabora. Si desea puede hacer esta configuración en un archivo de script (bash,sh). Estas configuraciones se pierden con cada reinicio del computador, para que queden "permanentes" debería mandarlas a llamar desde "rc.local".
#!/bin/bash
# Se crean las tablas de rutas para las dos interfaces uplink
echo "Creando las rutas para cada tabla T1"
ip route add 10.10.1.0/24 dev eth0 src 10.10.1.2 table T1
ip route add default via 10.10.1.1 table T1
echo "Creando las rutas para cada tabla T2"
ip route add 10.20.2.0/24 dev eth1 src 10.20.2.2 table T2
ip route add default via 10.20.2.1 table T2
echo "Hecho."

# Aseguro que cada red enviará sus solicitudes a la ip correcta
echo "Asegurando la ruta para cada interface e IP"
echo "Asegurando ruta para eth0"
ip route add 10.10.1.0/24 dev eth0 src 10.10.1.2
echo "Asegurando ruta para eth1"
ip route add 10.20.2.0/24 dev eth1 src 10.20.2.2
echo "Hecho."

# Creo dos reglas para que cada ip se fije a su tabla de rutas
echo "Creando reglas para tabla T1"
ip rule add from 10.10.1.2 table T1
echo "Creando reglas para tabla T2"
ip rule add from 10.20.2.2 table T2
echo "Hecho."

# Se hace el balanceo 1 a 2
echo "Haciendo el balanceo"
ip route add default scope global nexthop via 10.10.1.1 dev eth0 weight 1
nexthop via 10.20.2.1 dev eth1 weight 2
echo "Hecho."

# Se agrega dos tablas de rutas estáticas para hacer marcado de paquetes sobre ellas
echo "Creando tablas para marcado de paquetes ..."
# Enlace lento
ip rule add fwmark 1 table lento
ip route add table lento via 10.10.1.1 dev eth1

# Enlace rápido
ip rule add fwmark 2 table rapido
ip route add table rapido via 10.20.2.1 dev eth2

echo "Refrescando las rutas"
ip route flush cache
echo "Hecho."

Para probar podemos utilizar los siguientes comandos:
  • ip route
  • ip route list table T1
  • ip route list table T2
  • ip route show table lento
  • ip route show table rapido
Si todo salió bien, deberíamos tener conexión hacia internet desde nuestro servidor principal.

Configurar nateo en el iptables

En las siguientes lineas se documenta todo explicando paso a paso. Nos basamos, casi textualmente :P, del blog de K-Nabora. Si desea puede hacer esta configuración en un archivo de script (bash,sh). Estas configuraciones se pierden con cada reinicio del computador, para que queden "permanentes" debería mandarlas a llamar desde "rc.local".

echo "Limpiando rutas"
iptables -F # Flush - Elimina las reglas existentes una a una
iptables -X # Elimina reglas definidas por el usuario
iptables -Z # Pone los contadores a cero
iptables -t nat -F # elimina las reglas definidas en la tabla nat
iptables -t mangle -F # elimina las reglas definidas en la tabla mangle

echo "Activando el NAT (ip_forwarding)"
echo 1 > /proc/sys/net/ipv4/ip_forward

echo "Enmascarando y definiendo NAT"
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 -j MASQUERADE

#Opcional
# Se realiza marcado de paquetes para permitir el retorno de paquetes para servicios de chat MSN y IRC
iptables -t mangle -A PREROUTING -i vmbr2 -s 192.168.1.0/24 -p tcp --dport 1863 -m state --state NEW,ESTABLISHED,RELATED -J MARK --set-mark 2
iptables -t mangle -A PREROUTING -i vmbr2 -s 192.168.1.0/24 -p tcp --dport 6667 -m state --state NEW,ESTABLISHED,RELATED -J MARK --set-mark 2


Enlaces

.
Antes agradecer a K-nabora e Izzy

No hay comentarios:

Publicar un comentario