balanceo de carga round-robin MIKROTIK

- Si es de tu interés este artículo, apoyanos compartiendo en tus redes sociales favoritas y de esa manera también incentivando a tus amigos que crees les pueda interesar a que nos lean.

balanceo de carga round-robin MIKROTIK
publicidad

Introducción

Este ejemplo es una versión mejorada (diferente) del balanceo de carga round-robin. Le agrega sesiones persistente al usuario, por ejemplo un usuario particular le gustaría usar la misma dirección IP origen para todas sus conexiones salientes. Considerar el siguiente diagrama de red:


Guía rápida para impacientes

Configuración exportada del router gateway:

/ ip address 
add address=192.168.0.1/24 network=192.168.0.0 broadcast=192.168.0.255 interface=Local 
add address=10.111.0.2/24 network=10.111.0.0 broadcast=10.111.0.255 interface=wlan2
add address=10.112.0.2/24 network=10.112.0.0 broadcast=10.112.0.255 interface=wlan1
 
/ ip firewall mangle 
add chain=prerouting src-address-list=odd in-interface=Local action=mark-connection \
  new-connection-mark=odd passthrough=yes 
add chain=prerouting src-address-list=odd in-interface=Local action=mark-routing \
  new-routing-mark=odd 
add chain=prerouting src-address-list=even in-interface=Local action=mark-connection \
  new-connection-mark=even passthrough=yes 
add chain=prerouting src-address-list=even in-interface=Local action=mark-routing \
  new-routing-mark=even 
add chain=prerouting in-interface=Local connection-state=new nth=1,1,0 \ 
    action=mark-connection new-connection-mark=odd passthrough=yes
add chain=prerouting in-interface=Local action=add-src-to-address-list \
  address-list=odd address-list-timeout=1d connection-mark=odd passthrough=yes 
add chain=prerouting in-interface=Local connection-mark=odd action=mark-routing \ 
    new-routing-mark=odd passthrough=no
add chain=prerouting in-interface=Local connection-state=new nth=1,1,1 \ 
    action=mark-connection new-connection-mark=even passthrough=yes
add chain=prerouting in-interface=Local action=add-src-to-address-list \
  address-list=even address-list-timeout=1d connection-mark=even passthrough=yes 
add chain=prerouting in-interface=Local connection-mark=even action=mark-routing \ 
    new-routing-mark=even passthrough=no
 
/ ip firewall nat 
add chain=srcnat connection-mark=odd action=src-nat to-addresses=10.111.0.2 \
    to-ports=0-65535 
add chain=srcnat connection-mark=even action=src-nat to-addresses=10.112.0.2 \
    to-ports=0-65535 
 
/ ip route 
add dst-address=0.0.0.0/0 gateway=10.111.0.1 scope=255 target-scope=10 routing-mark=odd
add dst-address=0.0.0.0/0 gateway=10.112.0.1 scope=255 target-scope=10 routing-mark=even 
add dst-address=0.0.0.0/0 gateway=10.112.0.1 scope=255 target-scope=10 

Explicación
Primero mostramos el código y luego explicamos que es lo que hace.

Dirección IP

/ ip address 
add address=192.168.0.1/24 network=192.168.0.0 broadcast=192.168.0.255 interface=Local
add address=10.111.0.2/24 network=10.111.0.0 broadcast=10.111.0.255 interface=wlan2 
add address=10.112.0.2/24 network=10.112.0.0 broadcast=10.112.0.255 interface=wlan1 
El router tiene los interfaces de subidas (wan) con la dirección IP 10.111.0.2/24 y 10.112.0.2/24.
La interface LAN tiene el nombre "Local" y la dirección ip 192.168.0.1/24.

Mangle
/ ip firewall mangle 
add chain=prerouting src-address-list=odd in-interface=Local action=mark-connection \
  new-connection-mark=odd passthrough=yes 
add chain=prerouting src-address-list=odd in-interface=Local action=mark-routing \
  new-routing-mark=odd 

Todo el tráfico de los usuarios que tienen sus direcciones IP puesta previamente en la "address list" "impar" son instantaneamente marcados con la marca de conección y routing "impar". Luego el tráfico es excluido del proceso susesivo del mangle en el chain prerouting.

/ ip firewall mangle 
add chain=prerouting src-address-list=even in-interface=Local action=mark-connection \
  new-connection-mark=even passthrough=yes 
add chain=prerouting src-address-list=even in-interface=Local action=mark-routing \
  new-routing-mark=even 

Igual que arriba, solo que los usuarios tiene sus direcciones IP puesta previamente en la address list "par".

/ ip firewall mangle 
add chain=prerouting in-interface=Local connection-state=new nth=1,1,0 \ 
    action=mark-connection new-connection-mark=odd passthrough=yes
add chain=prerouting in-interface=Local action=add-src-to-address-list \
  address-list=odd address-list-timeout=1d connection-mark=odd passthrough=yes 
add chain=prerouting in-interface=Local connection-mark=odd action=mark-routing \ 
    new-routing-mark=odd passthrough=no

Primero tomamos cada segundo paquete que establece una nueva sesión (nota connection-state=new) y marcamos con marca coneccion "impar". Consecuentemente todos los sucesivos paquetes siguientes de la misma sesión llevarán la marca conección "impar". Notar que estamos pasando esos paquetes a la segunda regla (passtrough=yes) par poner la marca de routeo en esos paquetes adicionando a la marca conección. La segunda regla agrega la IP del cliente a la address list para habilitar todas las susesivas sesiones que salgan a través del mismo gateway. La tercer regla pone la marca de routing "impar" en todos los paquetes pertenecientes a la conección "impar" y para de procesar todos los otros mangles en la cadena prerouting para esos paquetes.

/ ip firewall mangle 
add chain=prerouting in-interface=Local connection-state=new nth=1,1,1 \ 
    action=mark-connection new-connection-mark=even passthrough=yes
add chain=prerouting in-interface=Local action=add-src-to-address-list \
  address-list=even address-list-timeout=1d connection-mark=even passthrough=yes 
add chain=prerouting in-interface=Local connection-mark=even action=mark-routing \ 
    new-routing-mark=even passthrough=no

Esas reglas son las mismas para la mitad restante del tráfico como las primeras dos reglas para la primer mitad del tráfico.
El código anterior hace que cada nueva conección que se inicia a travéz del router desde la red local será marcado como "impar" o "par" con ambas marcas de routing y conección.

NAT

/ ip firewall nat 
add chain=srcnat connection-mark=odd action=src-nat to-addresses=10.111.0.2 \
    to-ports=0-65535 
add chain=srcnat connection-mark=even action=src-nat to-addresses=10.112.0.2 \
    to-ports=0-65535
Todo el tráfico marcado "impar" es NATeado con la ip origen 10.111.0.2, mientrás que el tráfico marcado "par" obtiene "10.112.0.2" como ip origen.

Routing

/ ip route 
add dst-address=0.0.0.0/0 gateway=10.111.0.1 scope=255 target-scope=10 routing-mark=odd 
add dst-address=0.0.0.0/0 gateway=10.112.0.1 scope=255 target-scope=10 routing-mark=even
Para todo el tráfico marcado "impar" (consecuentemente teniendo 10.111.1.0.2 como dirección origen traducida) usamos 10.111.0.1 como gateway. De la misma manera todo el tráfico marcado "par" es ruteada por el gateway 10.112.0.1.
/ ip route
add dst-address=0.0.0.0/0 gateway=10.112.0.1 scope=255 target-scope=10
Finalmente, tenemos una entrada adicional especificando el trafico del router mismo (tráfico sin marcas de routing) deberían ir por el gateway 10.112.0.1

No hay comentarios