[RouterOS] leiniercs-balanceoNTH-0.3

 Leinier Cruz Salfran     08/Feb/2019
Balanceo, Cortafuegos, IPv4, Mikrotik, NTH, Recetas, RouterOS


Tabla de contenidos

Introducción

Esta receta trata sobre el mecanismo a implementar para configurar, de forma automática y dinámica, las reglas en el cortafuegos que permitan ejecutar balanceo de carga utilizando el mecanismo NTH.

Procedimiento de instalación

Se utilizará Winbox para implementar esta receta en nuestro RouterOS. Lo primero que se debe hacer es iniciar sesión, una vez completado este paso, procedemos a la implementación.

WinBox

  1. Abrir la ventana System->Scripts
  2. Crear un nuevo guión
  3. Asignar el nombre leiniercs-balanceoNTH-0.3
  4. Establecer permisos de lectura, escritura, política y prueba
  5. Pegar todo el texto del guión en el campo Source
  6. Guardar los cambios
  7. Abrir System->Scheduler
  8. Crear una nueva planificación
  9. Asignar el nombre leiniercs-balanceoNTH-0.3
  10. Asignar la fecha de incio a Jan/01/1970
  11. Asignar la hora de incio a 00:00:00
  12. Especificar el intervalo a 00:00:30
  13. Establecer permisos de lectura, escritura, política y prueba
  14. Escribir en el campo Evento:
    /system script run leiniercs-balanceoNTH-0.3

Guión

# Fecha: 7-feb-2019 3:20 pm
# Autor: Leinier Cruz Salfran <leiniercs@gmail.com>
# Nombre: balanceoNTH
# Version: 0.3
# Licencia: GPLv3
# Grupo en Telegram: https://t.me/ccari_grupo
#
# Instalacion:
#   - Pegar todo el texto de este archivo en un nuevo guion con las siguientes
#     caracteristicas:
#     * Nombre: leiniercs-balanceoNTH-0.3
#     * Permisos: lectura, escritura, politica, prueba
#   - Crear una planificacion con las siguientes caracteristicas:
#     * Nombre: leiniercs-balanceoNTH-0.3
#     * Fecha de inicio: Jan/01/1970
#     * Hora de inicio: 00:00:00
#     * Intervalo: 00:00:30
#     * Permisos: lectura, escritura, politica, prueba
#     * Evento: /system script run leiniercs-balanceoNTH-0.3
#
# Logica:
#   - Crea un listado con los nombres de las rutas de las interfaces que tienen acceso a Internet.
#   - Crea un listado con los nombres de las rutas que integran el balanceo NTH actualmente.
#   - Actualiza las reglas en el cortafuegos, si difieren ambos listados, para que permita la
#     correcta ejecucion del balanceo de carga entre esas interfaces utilizando NTH.
#
# Variables que se pueden ajustar:
#   - origenInterfaces: ID del origen de las interfaces. Tipo: numerico
#                       Valores: 1 - Inalambrico
#                                2 - Ethernet VLAN
#   - prefijoInterfaces: Prefijo de los nombres de las interfaces.
#                        Tipo: cadena de texto
#   - prefijoMarcasRuta: Prefijo de los nombres de las marcas de rutas.
#                        Tipo: cadena de texto
#   - prefijoMarcasConexion: Prefijo de los nombres de las marcas de conexiones que se
#                            usaran en la generacion de las reglas del cortafuegos.
#                            Tipo: cadena de texto
#   - destinoPruebaICMP: Direccion a utilizar para la realizacion de las pruebas ICMP.
#                        Tipo: cadena de texto
#   - nombreListaDirecciones: Nombre de la lista de direcciones que se beneficiara del
#                             balanceo NTH. Tipo: cadena de texto

##
# Variables modificables
#
:local origenInterfaces 1
:local prefijoInterfaces "vwlan"
:local prefijoMarcasRuta "rm_vwlan"
:local prefijoMarcasConexion "cm_vwlan"
:local destinoPruebaICMP "icmp.ccari.net"
:local nombreListaDirecciones "al_vwlan_sum"
##
# Variables no modificables para uso en el guion
#
:global leiniercsBalanceoNTH03
:local totalInterfaces
:local iI
:local tipoInterfaz
:local estadoInterfaz
:local balanceoNTHActual
:local balanceoNTHPropuesta
:local totalRutasNTHPropuesta
:local reglaCortafuegos
:local rutaInterfaz

##
# Termina o continua la ejecucion del guion en dependencia de
# si se esta ejecutando una instancia anterior del mismo
#
:if ($leiniercsBalanceoNTH03 = true) do={
  :exit
}

:set leiniercsBalanceoNTH03 true

##
# Obtiene el total de interfaces a procesar segun el origen especificado
#
:if ($origenInterfaces = 1) do={
  :set totalInterfaces [:len [/interface wireless find interface-type=virtual mode=station disabled=no]]
}
:if ($origenInterfaces = 2) do={
  :set totalInterfaces [:len [/interface vlan find disabled=no]]
}

##
# Crea el listado con los nombres de las rutas de las interfaces que acceden a Internet
#
:for iI from=1 to=$totalInterfaces do={
  :if ($origenInterfaces = 1) do={
    :set tipoInterfaz [/interface wireless get [find name="$prefijoInterfaces$iI" mode=station disabled=no] interface-type]
  }
  :if ($origenInterfaces = 2) do={
    :set tipoInterfaz [/interface vlan get [find name="$prefijoInterfaces$iI" disabled=no] type]
  }
  :set estadoInterfaz [/ip dhcp-client get [find interface="$prefijoInterfaces$iI" disabled=no] status]

  if ($tipoInterfaz = "virtual" || $tipoInterfaz = "vlan") do={
    :if ($estadoInterfaz = "bound") do={
      :if ([/ping address="$destinoPruebaICMP" count=2 routing-table="$prefijoMarcasRuta$iI"] > 0) do={
        :set balanceoNTHPropuesta ($balanceoNTHPropuesta, "$prefijoMarcasRuta$iI")
      }
    }
  }
}

##
# Obtiene las rutas que estan activas en el balanceo NTH
#
:foreach reglaCortafuegos in=[/ip firewall mangle find comment="leiniercs-balanceoNTH" disabled=no] do={
  :set rutaInterfaz [/ip firewall mangle get $reglaCortafuegos new-routing-mark]

  :if ([:len $rutaInterfaz] > 0) do={
    :set balanceoNTHActual ($balanceoNTHActual, "$rutaInterfaz")
  }
}

##
# Actualiza las reglas del balanceo NTH
#
:if ([:toarray $balanceoNTHActual] != [:toarray $balanceoNTHPropuesta]) do={
  :set totalRutasNTHPropuesta [:len [:toarray $balanceoNTHPropuesta]]
  :set $iI 0

  /ip firewall mangle remove [find comment="leiniercs-balanceoNTH" disabled=no]

  :foreach rutaInterfaz in=[$balanceoNTHPropuesta] do={
    :set iI ($iI + 1)

    /ip firewall mangle add chain=prerouting src-address-list="$nombreListaDirecciones" dst-address-type=!local nth="$totalRutasNTHPropuesta,$iI" action=mark-connection new-connection-mark="$prefijoMarcasConexion$iI" passthrough=yes comment="leiniercs-balanceoNTH" disabled=no
    /ip firewall mangle add chain=prerouting connection-mark="$prefijoMarcasConexion$iI" src-address-list="$nombreListaDirecciones" action=mark-routing new-routing-mark="$rutaInterfaz" passthrough=no comment="leiniercs-balanceoNTH" disabled=no
  }
}

:set leiniercsBalanceoNTH03 false