Está en la página 1de 10

Balanceo de Carga con

MikroTik RouterOS
v6.38.0.01
Ejemplos de Balanceo
Tabla de Contenido

Balanceo de Carga...............................................................................................................................................................
Balanceo de Carga Usando PCC (Per Connection Classifier) ...........................................................................................
Balanceo de Carga Usando ECMP (Equal Cost Multi-Path) ..............................................................................................
Balanceo de Carga usando eNésimo Paquete (Nth Packet)..............................................................................................
Balanceo de Carga
El balanceo de carga es un método que ayuda a distribuir el tráfico a través de múltiples enlaces para obtener una mejor
utilización.
El balanceo de carga ayuda a optimizar la utilización de recursos, maximizar el throughput, minimizar los tiempos de
respuesta, y evitar la sobrecarga de un único recurso. De esta forma se logra confiabilidad y disponibilidad a través de
redundancia.
Es importante mencionar que existe una diferencia entre balanceo de carga y unión de canales (channel bonding):
• Balanceo de carga – Divide el tráfico entre interfaces de red (Capa 4 del modelo OSI)
• Unión de canales (channel bonding) – Implica una división de tráfico entre interfaces física en un nivel más bajo, ya
sea por paquete (Capa 3) o por enlace de datos (Capa 2, utilizando el protocolo 802.1aq – SPB, Shortest Path
Bridging)
El balanceo de carga es sumamente útil donde existen enlaces de comunicación redundantes, ya que todos los enlaces se
pueden utilizar al mismo tiempo. Al utilizar múltiples enlaces de forma simultánea, se incrementa la disponibilidad del ancho
de banda. De esta forma se evita la congestión o saturación de la red en un solo enlace.
En RouterOS el balanceo de carga puede ser realizado basado en paquete (per-packet) o basado en conexión (per-
connection). Los más comunes son PCC, ECMP y Nth
Método per-connection per-packet
Marcado de firewall SI SI
ECMP (Equal Cost Multi-Path) SI NO
PCC (per Connection Classifier) SI NO
Nth (eNésimo Paquete - Nth Packet) SI SI
Bonding NO SI
OSPF SI NO
BGP SI NO

Balanceo de Carga Usando PCC (Per Connection Classifier)


PCC toma los campos seleccionados de la cabecera IP, y con la ayuda de un algoritmo de hashing convierte los campos
seleccionados en un valor de 32-bits.
Este valor se divide por un Denominador especificado y el resto se compara con un Restante especificado; si es igual
entonces se captura el paquete.
Se puede elegir de los siguientes campos de las cabeceras IP y TCP para utilizarlos en esta operación:
• src-address (cabecera IP)
• d|st-address (cabecera IP)
• src-port (cabecera TCP)
• dst-port (cabecera TCP)

Cabecera IP

Cabecera TCP
Con estos campos se pueden armar las siguientes combinaciones:
• both-addresses
• both-ports
• dst-address-and-port
• src-address
• src-port
• both-addresses-and-ports
• dst-address
• dst-port
• src-address-and-port
Si queremos revisar la sintaxis completa a través de CLI (línea de comandos) utilizamos el signo “?” al final del comando:
/ip firewall mangle add chain=prerouting per-connection-classifier=?

per-connection-classifier=
PerConnectionClassifier ::= [!]ValuesToHash:Denominator/Remainder
::= 0..4294967295 (integer number)
Denominator ::= 1..4294967295 (integer number)
ValuesToHash ::= both-addresses|both-ports|dst-address-and-port|
src-address|src-port|both-addresses-and-ports|dst-address|dst-port|src-address-and-port

Denominadores y Restos son partes de operaciones de módulos.


Una operación de módulo produce un valor entero que sobra cuando se divide dos números y solo uno acepta l a porción
del número completo del resultado. Se representa con un signo %
Ejemplos de esta operación:
• 3 % 3 = 0, porque 3 se divide limpiamente para 3
• 4 % 3 = 1, porque el siguiente número más pequeño al que 4 se divide limpiamente por 3 es 3, y 4 – 3 = 1
• 5 % 3 = 2, porque el siguiente número más pequeño al que 5 se divide limpiamente por 3 es 3, y 5 – 3 = 2
• 6 % 3 = 0, porque 6 se divide limpiamente para 3

Hash es una función que se alimenta de una entrada y produce una salida. Las funciones de hash tienen muchas
propiedades interesantes, pero para el uso de PCC la única que importa es la función determinística. Esto significa que, si
se alimenta una función hash con una entrada que lee “hola” y produce la salida “1”, entonces se puede confiar en el hecho
de que si se alienta nuevamente la entrada con “hola” producirá nuevamente la salida “1”, es decir, que cuando se alimenta
una función de hash con la misma entrada, entonces producirá la misma salida.
Para el caso de PCC, cuando se alimenta las direcciones IP y puertos, solo se agrega los octetos de las direcciones IP como
números decimales al igual que los puertos, y luego se toma el último dígito y lo produce co mo la salida.
Por ejemplo, la función hash se alimenta con:
• 1.1.1.1 como la dirección IP origen, 10000 como el puerto origen TCP
• 2.2.2.2 como la dirección IP destino, 80 como el puerto destino TCP
• La salida será 1+1+1+1+10000+2+2+2+2+80 = 10092, el último dígito de ese nuevo número es 2, por lo que la
salida de la función hash será 2.
• Por lo tanto, se producirá la salida 2 cada vez que se produzca la misma combinación de direcciones IP y puertos
Es importante notar que, aunque PCC es muy utilizado para balancear carga entre circuitos de red, sin embargo, PCC por
sí mismo no tiene nada que ver con el enrutamiento, con los routing-mark, con la distribución de la carga. PCC es
simplemente una forma para hacer coincidir (match) a los paquetes, y no está relacionado directamente con la acción de
marcar los paquetes que coinciden, aunque ese sea su propósito principal.
Las siguientes son líneas que comúnmente se utilizan en PCC:
1) /ip firewall mangle add chain=prerouting action=mark-connection \
new-connection-mark=1st_conn per-connection-classifier=src-address-and-port:3/0
2) /ip firewall mangle add chain=prerouting action=mark-connection \
new-connection-mark=2nd_conn per-connection-classifier=src-address-and-port:3/1
3) /ip firewall mangle add chain=prerouting action=mark-connection \
new-connection-mark=3rd_conn per-connection-classifier=src-address-and-port:3/2
La primera línea significa: Producir la salida de la función hash dada la dirección IP y puerto origen del paquete, dividirlo por
3, y si el resto es 0, realizar la acción de marcar la conexión como 1st_conn
La segunda línea significa: Producir la salida de la función hash dada la dirección IP y puerto origen del paquete, dividirlo
por 3, y si el resto es 1, realizar la acción de marcar la conexión como 2nd_conn
La tercera línea significa: Producir la salida de la función hash dada la dirección IP y puerto origen del paquete, dividirlo por
3, y si el resto es 2, realizar la acción de marcar la conexión como 3rd_conn
A continuación, se presenta el significado de las diferentes opciones de campo para el marcado de paquetes. Estos
constituyen los campos que serán alimentados en el algoritmo de hashing, y para el propósito de distribuir la carga a través
de los enlaces, decidir por qué enlace se enviará un paquete. Es importante recordar que una función de hash siempre
producirá la misma entrada cuando se alimenta la misma salida:
• src-address: La dirección origen de un cliente siempre será la misma, por lo que todo el tráfico de un cliente en
particular siempre coincidirá con el mismo matcher PCC, y siempre será puesto en el mismo enlace.
• dst-address: La dirección destino de un servidor específico siempre será la misma, por lo que todo el tráfico hacia
ese server (por ejemplo www.mikrotik.com) siempre coincidirá con el mismo matcher PCC, y siempre será puesto
en el mismo enlace.
• both-addresses: El par de IP origen y destino entre el mismo cliente y el mismo server siempre será el mismo, por
lo que todo el tráfico entre un cliente específico y un servidor específico (por ejemplo, entre su laptop y
www.mikrotik.com) siempre coincidirá con el mismo matcher PCC, y siempre será puesto en el mismo enlace.
• src-port: Los puertos origen de los clientes son generalmente elegidos aleatoriamente cuando se crea la conexión,
por lo que a través de muchas conexiones diferentes puertos origen serán alimentados en la función hash, y
diferentes matchers PCC coincidirán y el tráfico irá a través de diferentes enlaces. Sin embargo, algunos protocolos
cliente siempre eligen el mismo puerto origen, y los servidores atrás del router en su mayoría probablemente
siempre utilicen el mismo puerto de servicio para enviar el tráfico de retorno a sus clientes. Un servidor web detrás
del router enviaría la mayoría del tráfico desde sus puertos HTTP (80) y HTTPS (443), y ese tráfico siempre
coincidiría con el mismo matcher PCC y se enviaría en el mismo enlace.
• dst-port: Los puertos destino de los clientes suelen ser puertos de servicio bien definidos. Todo el tráfico HTTP
(80) entre clientes y servidores en Internet siempre coincidirá con el mismo matcher PCC, y se enviaría en el mismo
enlace. Sin embargo, los mismos clientes que realicen tráfico HTTPS (443) podrían coincidir con un matcher PCC
diferente y buscarían un enlace diferente.
• both-ports: Dado que el puerto del cliente es generalmente elegido en forma aleatoria, la combinación de los dos
puertos es generalmente aleatoria y propagará la carga a través de los enlaces
• src-address-and-port: Igual que src-port.
• dst-address-and-port: Igual que dst-port.
• both-addresses-and-ports: Esta es la forma más aleatoria de propagar el tráfico a través de los enlaces, ya que
tiene el mayor número de variables.

Ejemplo de balanceo de carga utilizando PCC


Direcciones IP
/ip address
add address=192.168.0.1/24 interface=eth3
add address=10.1.1.2/30 interface=eth1
add address=10.20.1.2/30 interface=eth2

Políticas de ruteo
El objetivo de las políticas de ruteo es forzar el tráfico hacia un gateway específico, incluso si estuviera destinado a otro
gateway. Las siguientes 2 reglas permiten el uso de las tablas de ruteo por default para el tráfico que está conectado a dichas
redes (10.1.0/30 y 10.20.1.0/30) siempre y cuando el tráfico provenga de la LAN (ether3, 192.168.0.1/24)
/ip firewall mangle
add chain=prerouting dst-address=10.1.1.0/30 action=accept in-interface=eth3
add chain=prerouting dst-address=10.20.1.0/30 action=accept in-interface=eth3

En las siguientes 2 reglas se manejarán las conexiones iniciadas en el exterior (en la WAN), ya que las respuestas deben
salir por la misma interface (desde la misma IP pública) por donde vino el requerimiento. Se marcarán únicamente las nuevas
conexiones entrantes.
add chain=prerouting in-interface=eth1 connection-mark=no-mark action=mark-connection \
new-connection-mark=ISP1_conn
add chain=prerouting in-interface=eth2 connection-mark=no-mark action=mark-connection \
new-connection-mark=ISP2_conn

En las siguientes 2 reglas se utiliza PCC para dividir el tráfico LAN (ether3, 192.168.0.1/24) en dos grupos (en este ejemplo
solo hay 2 interfaces WAN/Internet) para lo cual se utiliza both-addresses (basado en direcciones origen y destino). Puesto
que el tráfico filtrado por chain=prerouting captura todo el tráfico que va hacia el mismo router, y se necesita filtrar el tráfico
cuyo destino NO ES la red local (LAN, ether3), entonces se utiliza dst-address-type=!local
add chain=prerouting in-interface=eth3 connection-mark=no-mark dst-address-type=!local \
per-connection-classifier=both-addresses:2/0 action=mark-connection new-connection-mark=ISP1_conn
add chain=prerouting in-interface=eth3 connection-mark=no-mark dst-address-type=!local \
per-connection-classifier=both-addresses:2/1 action=mark-connection new-connection-mark=ISP2_conn

Cuando se trabaja con mark-routing debemos recordar que únicamente se puede utilizar chain=output y chain=prerouting.
Por este motivo el tráfico de conexión LAN (ether3) se filtra con prerouting, y el tráfico de conexión WAN/Internet se filtra y
marca (mark-routing) con chain=output.
add chain=prerouting connection-mark=ISP1_conn in-interface=eth3 action=mark-routing \
new-routing-mark=to_ISP1 passthrough=no
add chain=prerouting connection-mark=ISP2_conn in-interface=eth3 action=mark-routing \
new-routing-mark=to_ISP2 passthrough=no

add chain=output connection-mark=ISP1_conn action=mark-routing new-routing-mark=to_ISP1 passthrough=no


add chain=output connection-mark=ISP2_conn action=mark-routing new-routing-mark=to_ISP2 passthrough=no

En las siguientes 2 reglas se crean las rutas para cada routing-mark


/ip route
add dst-address=0.0.0.0/0 gateway=10.1.1.1 routing-mark=to_ISP1 check-gateway=ping
add dst-address=0.0.0.0/0 gateway=10.20.1.1 routing-mark=to_ISP2 check-gateway=ping

Las siguientes 2 reglas habilitan el failover cuando uno de los Gateway falla. Para esto es necesario que esté activada la
opción check-gateway
add dst-address=0.0.0.0/0 gateway=10.1.1.1 distance=1 check-gateway=ping
add dst-address=0.0.0.0/0 gateway=10.20.1.1 distance=2 check-gateway=ping

NAT
Finalmente, puesto que las decisiones de ruteo ya fueron realizadas en las reglas anteriores, tan solo se necesita enmascarar
(NATear) los paquetes que saldrán por cada interface WAN/Internet
/ip firewall nat
add chain=srcnat out-interface=eth1 action=masquerade
add chain=srcnat out-interface=eth2 action=masquerade
Balanceo de Carga Usando ECMP (Equal Cost Multi-Path)

Direcciones IP
/ip address
add address=192.168.0.1/24 interface=eth3
add address=10.1.1.2/30 interface=eth1
add address=10.20.1.2/30 interface=eth2

NAT
/ip firewall nat
add chain=srcnat out-interface=eth1 action=masquerade
add chain=srcnat out-interface=eth2 action=masquerade

Routing
/ip route
add dst-address=0.0.0.0/0 gateway=10.1.1.1,10.20.1.1 check-gateway=ping
/ip route
add dst-address=0.0.0.0/0 gateway=10.1.1.1,10.20.1.1,10.20.1.1,10.20.1.1,10.20.1.1,10.20.1.1\
check-gateway=ping

Conexiones usadas por propio router


/ip firewall mangle
add chain=input in-interface=eth1 action=mark-connection new-connection-mark=ISP1_conn
add chain=input in-interface=eth2 action=mark-connection new-connection-mark=ISP1_conn

add chain=output connection-mark=ISP1_conn action=mark-routing new-routing-mark=to_ISP1 passthrough=no


add chain=output connection-mark=ISP2_conn action=mark-routing new-routing-mark=to_ISP2 passthrough=no

/ip route
add dst-address=0.0.0.0/0 gateway=10.1.1.1 routing-mark=to_ISP1
add dst-address=0.0.0.0/0 gateway=10.20.1.1 routing-mark=to_ISP2

Balanceo de Carga usando eNésimo Paquete (Nth Packet)


En el balanceo de carga usando el eNésimo paquete, cada regla tiene su propio contador. Cuando la regla recibe un paquete,
el contador de la regla actual se incrementa en uno. Si el contador coincide con el valor de cada paquete será emparejado
(match) y el contador se pondrá a cero
Si el passthrough no se configura, entonces los paquetes se marcarán de la siguiente manera:
• Primera regla nth=2,1 – En esta regla se emparejará cada primer paquete de 2, por lo tanto, el 50% del tráfico es
emparejado por la regla
• Segunda regla si el passthrough=no – Emparejará únicamente el 25% del tráfico
Ejemplos:
Es posible emparejar (hacer match) el 50% de todo el tráfico solo con una regla:
/ip firewall mangle
add action=mark-packet chain=prerouting new-packet-mark=AAA nth=2,1
Si se necesita más de una regla, entonces existen 2 formas de hacer coincidir los paquetes:
1. La primera regla ve todos los paquetes y hace coincidir (match) el 1/3 de todos. La segunda regla ve los 2/3 restantes
de todos los paquetes y hace coincidir 1/2 d e los mismos. La tercera regla ve y hace coincidir todos los paquetes
que pasaron a través de as 2 reglas anteriores, es decir, el 1/3 de todos los paquetes (los que sobran).
/ip firewall mangle
add action=mark-packet chain=prerouting new-packet-mark=AAA nth=3,1 passthrough=no
add action=mark-packet chain=prerouting new-packet-mark=BBB nth=2,1 passthrough=no
add action=mark-packet chain=prerouting new-packet-mark=CCC
2. Todas las reglas pueden ver todos los paquetes y cada regla hace coincidir (match) cada tercer paquete
/ip firewall mangle
add action=mark-packet chain=prerouting new-packet-mark=AAA nth=3,1 passthrough=yes;
add action=mark-packet chain=prerouting new-packet-mark=BBB nth=3,2 passthrough=yes;
add action=mark-packet chain=prerouting new-packet-mark=CCC nth=3,3 passthrough=yes;

IP Addresses
En el este ejercicio (Fig. 14-1), el router tiene 2 interfaces WAN con direcciones eth1=10.1.1.2/30 y eth2=10.20.1.2/30.
La interface LAN (ether3) tiene la dirección ether3=192.168.0.1/24
/ip address
add address=192.168.0.1/24 interface=eth3
add address=10.1.1.2/30 interface=eth1
add address=10.20.1.2/30 interface=eth2

Mangle
Todo el tráfico de los clientes cuya Dirección IP coincide con el address-list=impar se marca con las marcas de conexión
y marcas de ruteo “impar". Después, el tráfico se excluye del procesamiento de sucesivas reglas de mangle en
chain=prerouting

/ip firewall mangle


add chain=prerouting src-address-list=impar in-interface=eth3 action=mark-connection \
new-connection-mark=impar passthrough=yes
add chain=prerouting src-address-list=impar in-interface=eth3 action=mark-routing \
new-routing-mark=impar passthrough=no

Lo mismo sucede con los clientes cuya dirección IP coincide con el address-list=par.

/ip firewall mangle


add chain=prerouting src-address-list=par in-interface=eth3 action=mark-connection \
new-connection-mark=par passthrough=yes
add chain=prerouting src-address-list=par in-interface=eth3 action=mark-routing \
new-routing-mark=par passthrough=no

A continuación, lo que se hará es tomar cada segundo paquete que establece una nueva conexión (connection-state=new),
y se lo marcará como “impar”. Consecuentemente todos los paquetes sucesivos que pertenezcan a la misma sesión llevarán
la marca de conexión “impar”.
Nótese que:
• Se pasarán estos paquetes a la segunda y tercera regla (passthrough=yes)
• La segunda regla añade la dirección IP del cliente al address-listpara habilitarlo para todas las sucesivas sesiones
que pasan a través del mismo Gateway.
• La tercera regla establece el routing-mark=impar en todos los paquetes que pertenecen a la conexión “impar” y
detiene el procesamiento de todas las otras reglas de mangle en chain=prerouting
/ip firewall mangle
add chain=prerouting in-interface=eth3 connection-state=new nth=2,1 \
action=mark-connection new-connection-mark=impar passthrough=yes
add chain=prerouting in-interface=eth3 action=add-src-to-address-list \
address-list=impar address-list-timeout=1d connection-mark=impar passthrough=yes
add chain=prerouting in-interface=eth3 connection-mark=impar action=mark-routing \
new-routing-mark=impar passthrough=no

Las siguientes reglas hacen lo mismo que el grupo anterior para la mitad restante del tráfico.
El código significa que cada nueva conexión que se inicia a través del router desde la red local será marcada como “impar”
o “par” con ambas reglas de marcado de conexión y de ruteo.

/ip firewall mangle


add chain=prerouting in-interface=eth3 connection-state=new nth=2,2 \
action=mark-connection new-connection-mark=par passthrough=yes
add chain=prerouting in-interface=eth3 action=add-src-to-address-list \
address-list=par address-list-timeout=1d connection-mark=par passthrough=yes
add chain=prerouting in-interface=eth3 connection-mark=par action=mark-routing \
new-routing-mark=par passthrough=no

Las reglas funcionan bien, sin embargo, hay algunas situaciones en que la misma dirección IP está listada en ambos address-
list (par e impar). Este comportamiento ocasiona problemas cuando las aplicaciones requieren conexiones persistentes.
Para solucionar este inconveniente se debe agregar la siguiente regla a las reglas de mangle. Esto asegurará que las nuevas
conexiones no sean parte del src-address-list=impar. Se tendrá que hacer lo mismo para las reglas de mangle “impar” y
de esta forma excluir las direcciones IP que ya son parte del src-address-list=par.

add chain=prerouting in-interface=eth3 connection-state=new nth=2,2 \


src-address-list=!impar action=mark-connection new-connection-mark=par \
passthrough=yes

NAT
Se realiza el NATeo por las interfaces de salida correspondientes
/ip firewall nat
add chain=srcnat out-interface=eth1 action=masquerade
add chain=srcnat out-interface=eth2 action=masquerade

Routing
Todo el tráfico marcado como “impar” saldrá por el Gateway 10.1.1.1, y todo el tráfico marcado como “par” saldrá por el
Gateway 10.20.1.1
/ip route
add dst-address=0.0.0.0/0 gateway=10.1.1.1 scope=255 target-scope=10 routing-mark=impar
add dst-address=0.0.0.0/0 gateway=10.20.1.1 scope=255 target-scope=10 routing-mark=par

Finalmente, se agrega una entrada adicional especificando que el tráfico del propio router (tráfico que no tiene routing mark)
deberá salir por el Gateway 10.20.1.1
/ip route
add dst-address=0.0.0.0/0 gateway=10.20.1.1 scope=255 target-scope=10

También podría gustarte