Tener dos o más enlaces WAN es común en cualquier ISP, WISP o empresa mediana en Latinoamérica — combinas fibra con radio enlace, o dos fibras de proveedores distintos para redundancia. El reto es aprovechar los dos enlaces simultáneamente (balanceo) y que además tu red siga funcionando si uno cae (failover). En MikroTik la herramienta oficial para esto es PCC (Per Connection Classifier).

Esta guía cubre la configuración completa de balanceo PCC con dos WAN en RouterOS, con comandos listos para pegar, reglas de mangle, routing marks, NAT por interfaz y un script de failover con netwatch. Funciona en ROS 6.49.x y ROS 7.x con pequeñas diferencias que señalamos en cada paso.

¿Por qué PCC y no ECMP?

ECMP balancea por paquete, lo que rompe conexiones HTTPS/NAT porque los paquetes de una misma sesión salen por diferentes IPs públicas. PCC balancea por conexión: toda una sesión TCP/UDP siempre pasa por el mismo enlace. Es el único método robusto recomendado por MikroTik para multi-WAN de internet.

1. Topología y prerequisitos

Ejemplo realista: un router MikroTik con dos enlaces hacia internet de proveedores distintos. WAN1 es fibra primaria (100 Mbps), WAN2 es enlace secundario (50 Mbps). LAN interna 192.168.1.0/24.

InterfazRolIPGateway
ether1WAN1 (fibra)203.0.113.2/30203.0.113.1
ether2WAN2 (backup)198.51.100.2/30198.51.100.1
bridge-lanLAN192.168.1.1/24—

La lógica general será:

  1. Marcar conexiones entrantes con la interfaz por donde llegaron, para que las respuestas salgan por el mismo enlace.
  2. Marcar nuevas conexiones salientes con PCC distribuido entre WAN1 y WAN2.
  3. Marcar rutas basándose en la marca de conexión.
  4. Crear dos rutas estáticas con routing-mark.
  5. Aplicar NAT masquerade por interfaz de salida.

2. Rutas base hacia cada gateway

Antes de PCC, crea las rutas por defecto hacia cada WAN. Una con distancia baja (principal) y otra con distancia alta (secundaria) para failover basal, más las rutas con routing-mark que PCC usará.

RouterOS — /ip route
# Ruta principal vía WAN1 (distancia 1)
/ip route add dst-address=0.0.0.0/0 gateway=203.0.113.1 distance=1 check-gateway=ping comment="default via WAN1"

# Ruta secundaria vía WAN2 (distancia 2 — solo se activa si WAN1 cae)
/ip route add dst-address=0.0.0.0/0 gateway=198.51.100.1 distance=2 check-gateway=ping comment="default via WAN2 backup"

# Rutas con routing-mark para PCC
/ip route add dst-address=0.0.0.0/0 gateway=203.0.113.1 routing-mark=to-wan1 distance=1 check-gateway=ping comment="PCC to WAN1"
/ip route add dst-address=0.0.0.0/0 gateway=198.51.100.1 routing-mark=to-wan2 distance=1 check-gateway=ping comment="PCC to WAN2"
check-gateway=ping

Esta opción hace que RouterOS verifique el gateway directo cada 10 segundos. Si no responde, la ruta se marca como inactiva automáticamente. Es la forma más rápida de failover sin scripts, pero solo detecta fallas de primer salto; si el proveedor tiene problemas más allá de su gateway, no lo detectará. Para eso usaremos netwatch en la sección 8.

3. Marcar conexiones entrantes por interfaz

Cuando llega una conexión desde internet a tu WAN1, la respuesta debe salir por WAN1 (no por WAN2), porque la IP pública de origen es la de WAN1. Si sale por WAN2, el ISP de WAN2 dropeará el paquete (RPF check). Por eso marcamos cada conexión entrante con su interfaz de origen:

RouterOS — /ip firewall mangle (marcar conexiones entrantes)
# Marcar conexiones entrantes por WAN1
/ip firewall mangle add chain=input in-interface=ether1 \
  action=mark-connection new-connection-mark=wan1-conn passthrough=yes \
  comment="mark input from WAN1"

# Marcar conexiones entrantes por WAN2
/ip firewall mangle add chain=input in-interface=ether2 \
  action=mark-connection new-connection-mark=wan2-conn passthrough=yes \
  comment="mark input from WAN2"

# Marcar el output del router hacia afuera usando la marca de conexión
/ip firewall mangle add chain=output connection-mark=wan1-conn \
  action=mark-routing new-routing-mark=to-wan1 passthrough=no \
  comment="route output via WAN1"

/ip firewall mangle add chain=output connection-mark=wan2-conn \
  action=mark-routing new-routing-mark=to-wan2 passthrough=no \
  comment="route output via WAN2"

4. PCC — marcar nuevas conexiones salientes de clientes LAN

Aquí está la magia. Para cada nueva conexión (state=new) que viene desde la LAN hacia internet, aplicamos el clasificador PCC. Con per-connection-classifier=both-addresses:2/0 y :2/1, RouterOS calcula un hash de (src-ip, dst-ip) y asigna la conexión a uno de los dos enlaces de forma determinística:

RouterOS — /ip firewall mangle (PCC balanceo)
# Marcar nuevas conexiones LAN con PCC (hash both-addresses, 2 enlaces)
/ip firewall mangle add chain=prerouting in-interface=bridge-lan connection-mark=no-mark \
  dst-address-type=!local per-connection-classifier=both-addresses:2/0 \
  action=mark-connection new-connection-mark=wan1-conn passthrough=yes \
  comment="PCC new conn to WAN1 (50%)"

/ip firewall mangle add chain=prerouting in-interface=bridge-lan connection-mark=no-mark \
  dst-address-type=!local per-connection-classifier=both-addresses:2/1 \
  action=mark-connection new-connection-mark=wan2-conn passthrough=yes \
  comment="PCC new conn to WAN2 (50%)"

# Aplicar routing-mark basándose en connection-mark (prerouting)
/ip firewall mangle add chain=prerouting in-interface=bridge-lan connection-mark=wan1-conn \
  action=mark-routing new-routing-mark=to-wan1 passthrough=no \
  comment="routing mark to WAN1"

/ip firewall mangle add chain=prerouting in-interface=bridge-lan connection-mark=wan2-conn \
  action=mark-routing new-routing-mark=to-wan2 passthrough=no \
  comment="routing mark to WAN2"
Proporción de balanceo asimétrico

Si WAN1 tiene el doble de capacidad que WAN2, usa 3 enlaces virtuales: 3/0, 3/1 apuntando a WAN1, y 3/2 apuntando a WAN2. Así WAN1 recibe ~66% y WAN2 ~33%. Ajusta el denominador según la proporción real de ancho de banda.

5. NAT masquerade por interfaz

Cada enlace WAN necesita su propio masquerade para que el src-address de los paquetes salientes coincida con la IP pública del enlace por donde salen:

RouterOS — /ip firewall nat
# NAT masquerade por interfaz WAN (no uses una sola regla con out-interface-list)
/ip firewall nat add chain=srcnat out-interface=ether1 action=masquerade comment="NAT WAN1"
/ip firewall nat add chain=srcnat out-interface=ether2 action=masquerade comment="NAT WAN2"

6. Verificación del balanceo

Desde dos dispositivos LAN distintos, abre https://ifconfig.me o https://ipinfo.io. Deberías ver dos IPs públicas distintas — una desde cada WAN. Si los dos dispositivos muestran la misma IP, revisa el hash PCC y la regla de mangle.

RouterOS — Verificación
# Ver contadores de paquetes por regla mangle
/ip firewall mangle print stats

# Ver conexiones activas con su mark
/ip firewall connection print where connection-mark!=""

# Ver tráfico por interfaz WAN
/interface monitor-traffic ether1,ether2 duration=10

# Ver tabla de rutas con los routing-marks
/ip route print where routing-mark!=""

7. Scope local: excluir tráfico a subredes internas

Si tienes múltiples LANs o una VPN WireGuard, debes asegurarte de que el tráfico a destinos internos no se enrute por el PCC (o se perderá). Agrega una regla de mangle antes del PCC para dejar pasar ese tráfico:

RouterOS — Exclusiones PCC
# Lista de destinos internos (expansible)
/ip firewall address-list add address=192.168.0.0/16 list=local-nets
/ip firewall address-list add address=10.0.0.0/8 list=local-nets
/ip firewall address-list add address=172.16.0.0/12 list=local-nets

# Regla que debe ir ANTES del PCC en chain prerouting
/ip firewall mangle add chain=prerouting dst-address-list=local-nets \
  action=accept place-before=0 comment="bypass PCC for local nets"

8. Failover con netwatch y script

check-gateway=ping solo verifica el gateway directo. Para detectar fallas más allá del gateway (ej: el proveedor tiene problemas en su core pero su gateway responde), usa netwatch:

RouterOS — /tool netwatch
# Ruta especial para probar conectividad específica vía WAN1
/ip route add dst-address=8.8.8.8/32 gateway=203.0.113.1 comment="probe WAN1"
/ip route add dst-address=1.1.1.1/32 gateway=198.51.100.1 comment="probe WAN2"

# Netwatch WAN1
/tool netwatch add host=8.8.8.8 interval=10s timeout=2s \
  up-script=":log info \"WAN1 UP\"; /ip firewall mangle enable [find comment~\"WAN1\"]" \
  down-script=":log warning \"WAN1 DOWN\"; /ip firewall mangle disable [find comment~\"WAN1\"]"

# Netwatch WAN2
/tool netwatch add host=1.1.1.1 interval=10s timeout=2s \
  up-script=":log info \"WAN2 UP\"; /ip firewall mangle enable [find comment~\"WAN2\"]" \
  down-script=":log warning \"WAN2 DOWN\"; /ip firewall mangle disable [find comment~\"WAN2\"]"
ROS 7 — sintaxis de netwatch

En RouterOS 7, netwatch añadió el parámetro type=icmp (por defecto). Si quieres monitorear por HTTP o TCP, especifica type=http-get o type=tcp-conn. Los scripts se ejecutan en el mismo contexto que en ROS 6.

9. Troubleshooting común

Una WAN recibe todo el tráfico y la otra nada

Verifica el orden de las reglas mangle en chain=prerouting. Las reglas PCC deben ir después de las reglas que marcan conexiones establecidas y antes del accept de excluir local-nets. También revisa que connection-mark=no-mark esté en las reglas PCC — si falta, RouterOS intenta marcar conexiones ya marcadas y el hash deja de ser estable.

Las conexiones se rompen periódicamente

Casi siempre es porque el router está cambiando la marca de una conexión a mitad de sesión. La solución es passthrough=no en las reglas de mark-routing, y asegurarte de que PCC solo aplica cuando connection-mark=no-mark.

Ping a 8.8.8.8 funciona pero HTTPS no

Normalmente es un MTU/MSS incorrecto en el enlace PPPoE de una de las WANs. Agrega clamping de MSS: /ip firewall mangle add chain=forward protocol=tcp tcp-flags=syn action=change-mss new-mss=clamp-to-pmtu

Failover tarda 30+ segundos

Reduce el intervalo de netwatch a interval=5s timeout=2s y asegúrate que check-gateway=ping esté activo en las rutas principales.

Conclusión

El balanceo PCC en MikroTik tiene cinco componentes esenciales: marcar conexiones entrantes por interfaz, clasificar nuevas conexiones con PCC hash, aplicar routing-marks, rutas por routing-mark y NAT masquerade por interfaz. Combinado con netwatch, obtienes balanceo activo-activo con failover en menos de 15 segundos.

En MikroHelp implementamos esta configuración en clientes de ISP en México y Colombia con enlaces mixtos fibra + radio. En cada despliegue ajustamos la proporción PCC a la capacidad real de cada enlace y monitoreamos con LibreNMS — ver nuestra guía de monitoreo SNMP.

¿Multi-WAN con problemas de rendimiento?

Auditamos tu configuración PCC, mangle y rutas y dejamos el balanceo funcionando de forma óptima.

Conocer el soporte MikroTik remoto o solicita una evaluación gratuita →