Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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
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
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.
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
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
/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
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
Lo mismo sucede con los clientes cuya dirección IP coincide con el address-list=par.
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.
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.
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