Balanceo de carga PCC en Mikrotik con 2 (o más WAN DHCP)

Hacía ya mucho tiempo que no jugaba un rato con los Mikrotik, mucho menos con RouterOS. Un amigo me consultó por la posibilidad de rearmar una red en un estudio de diseño, al cual acepté. El panorama era:

  • Una red wifi que se caía todo el tiempo.
  • Una red cableada que se colgaba todo el tiempo.
  • Un balanceo de WAN inexistente (administrado por un Cisco con configuración default).

Lo que se necesitaba:

  • Una red wifi y cableada estable, con buen throughput.
  • Un balanceo de dos WAN DHCP (Fibertel 50MB y Arnet 10MB).
  • Eliminar los blind spots del Wifi en todo el taller.

hands up!

Ya establecida la lista de problemas y los requerimientos, empezamos con las compras:

  • Ubiquiti Unifi UAP LR AC PRO, doble banda 5.8/2.4Ghz para cubrir el taller entero, con posibilidad de agregar otro mas en caso de requerimiento especial.
  • Mikrotik RB2011UiAS-RM, espectacular equipo a precio mas que razonable, ideal para el tráfico del lugar.
  • Switch unmanaged HP de 24 bocas, not much on it, un simple Switch.

Configuración

Mikrotik

Empezamos por una configuración default, todo absolutamente todo en cero.

Esto es importante, porque de otra manera el router se preconfigurará con bridges, rutas y demás configuraciones que no necesitamos, y además nos complicarán mas adelante.

Configuración de interfaces

En nuestro esquema, usaremos los dos primeros puertos como WANs para ambas conexiones a Internet, y usaremos el tercer puerto como salida al Switch. Renombré las bocas a utilizar, como wan0, wan1 y ether3 la conservé tal cual. Al tener el Switch, el resto de las bocas no las utilizaremos, por mi OCD, prefiero dejarlas deshabilitadas:

DHCP Server y DNS

La idea es que el Mikrotik como router, nos entregue direcciones IP a nosotros, clientes a través del puerto ether3

/ip pool
add name=dhcp_pool1 ranges=192.168.88.10-192.168.88.254
/ip dhcp-server
add address-pool=dhcp_pool1 disabled=no interface=ether3 name=dhcp1
/ip address
add address=192.168.88.1/24 comment=Salida interface=ether3 network=192.168.88.0
/ip dhcp-server network
add address=192.168.88.0/24 dns-server=8.8.8.8,8.8.4.4 gateway=192.168.88.1 netmask=24
/ip dns
set servers=8.8.8.8,8.8.4.4
DHCP Clients

Como ambas conexiones son DHCP, y sus modems entregan IP pública,

/ip dhcp-client
add add-default-route=no dhcp-options=hostname,clientid disabled=no interface=wan0 use-peer-dns=no
add add-default-route=no dhcp-options=hostname,clientid disabled=no interface=wan1 use-peer-dns=no

Las configuraremos como clientes DHCP.

Enmascarado de conexiones WAN

Es importante emascarar el tráfico de las WAN para su correcto funcionamiento, para ello aplicamos

/ip firewall nat
add action=masquerade chain=srcnat out-interface=wan0
add action=masquerade chain=srcnat out-interface=wan1
Rutas

Las rutas son importantes para que el router sepa por donde salir al momento de un request.

add check-gateway=ping distance=1 gateway=190.194.249.1
add check-gateway=ping distance=2 gateway=10.42.0.1

En el caso de ustedes, van a tener que escribir las rutas correspondientes a su proveedor de Internet. Pueden chequear la ruta que les asignó al momento de aplicar el DHCP, en DHCP Client.

Un detalle a tener en cuenta aquí es la sentencia check-gateway. Esto es importantísimo para no tener problemas luego: si una de las dos conexiones a Internet se cae, Mikrotik se dará cuenta de ello gracias a que tiene configurado el check-gateway, que no es mas que un ping (o arp en caso de que se configure así) contra el gateway. De no responder, el mismo se deshabilitará.

Otro detalle un poco menor es distance. Es simplemente, que ruta es la “preferida”. Una distancia menor la hará mas preferida que una ruta con distancia mayor. De esta manera avalamos que la ruta preferida sea la de Fibertel, la conexión más rápida.

Mangle / balanceo propiamente dicho

Lo importante aquí es marcar las conexiones que pasen a través del router. De no configurar esto, el router no sabría diferenciar entre una conexión que entra por wan0 y una que entra por wan1, causandonos muchos dolores de cabeza cuando los paquetes empiecen a mezclarse

/ip firewall mangle
add action=mark-routing chain=prerouting connection-mark=wan0_conn in-interface=ether3 new-routing-mark=to_wan0
add action=mark-routing chain=prerouting connection-mark=wan1_conn in-interface=ether3 new-routing-mark=to_wan1

Una vez configuradas las primeras reglas, vamos a lo divertido, el balanceo:

/ip firewall mangle
add action=mark-connection chain=prerouting connection-state=new dst-address-type=!local in-interface=ether3 new-connection-mark=wan0_conn per-connection-classifier=both-addresses-and-ports:6/0
add action=mark-connection chain=prerouting connection-state=new dst-address-type=!local in-interface=ether3 new-connection-mark=wan0_conn per-connection-classifier=both-addresses-and-ports:6/1
add action=mark-connection chain=prerouting connection-state=new dst-address-type=!local in-interface=ether3 new-connection-mark=wan0_conn per-connection-classifier=both-addresses-and-ports:6/2
add action=mark-connection chain=prerouting connection-state=new dst-address-type=!local in-interface=ether3 new-connection-mark=wan0_conn per-connection-classifier=both-addresses-and-ports:6/3
add action=mark-connection chain=prerouting connection-state=new dst-address-type=!local in-interface=ether3 new-connection-mark=wan0_conn per-connection-classifier=both-addresses-and-ports:6/4
add action=mark-connection chain=prerouting connection-state=new dst-address-type=!local in-interface=ether3 new-connection-mark=wan0_conn per-connection-classifier=both-addresses-and-ports:6/5

Como verán, son un montón de lineas prácticamente iguales. Donde definimos una marca de conexión y un modo de pcc, que es both-addresses-and-ports. Ésta es la manera mas aleatoria para elegir la conexión. Por qué tantas líneas? Porque de esa manera balanceamos dos links desiguales. De esta manera, de las 6 reglas de balanceo, 5 pertenecen a Fibertel (wan0) y una sola a Arnet (wan1). Así el algoritmo de resolución que usa RouterOS, “caerá” mas cantidad de veces (con suerte, en relación 5:1) en la conexión de Fibertel, logrando un balanceo mas prolijo. En caso de ser dos conexiones iguales, solo agregaríamos dos lineas con 2/0 y 2/1.

Rutas parte 2

Las primeras dos rutas que agregamos, son rutas default para el tráfico, ahora es importante también utilizar esas marcas definidas anteriormente en dos nuevas rutas que controlarán el tráfico

/ip route
add check-gateway=ping distance=1 gateway=190.194.249.1 routing-mark=to_wan0
add check-gateway=ping distance=1 gateway=10.42.0.1 routing-mark=to_wan1

Como verán, son similares a las reglas anteriores, pero agregan la marca de routeo.

Servicios y seguridad

Es importante controlar quien puede acceder a los servicios del Mikrotik, por defaut, todos los servicios (web, ssh, telnet, etc) se pueden acceder desde cualquier lado (incluso las wan!) eso es peligroso,

/ip service
set telnet address=192.168.88.0/24
set ftp disabled=yes
set www address=192.168.88.0/24
set ssh address=0.0.0.0/0 port=2223
set api disabled=yes
set winbox disabled=yes
set api-ssl disabled=yes

Como en mi caso telnet y el panel web me quedan comodos, los limito a la red interna, ftp no voy a utilizar, tampoco la api ni winbox, ni la api sobre ssl. Me interesa tener acceso SSH desde afuera, ante cualquier eventualidad podré conectarme y arreglar lo necesario sin tener que ir físicamente al lugar. Lo cambiaré de puerto para que no quede tan expuesto.

Resultados

Descargar configuración completa

Para los vagos, flojos, codemonkeys: RB2011 configuración completa