Conexi贸n IPSec VPN entre MikroTik y Kerio Control



Par谩metros iniciales

  1. La oficina central de la empresa con dos proxies fronterizos Kerio Control v.9.2.9 build 3171 (detr谩s de Kerio hay un switch Cisco 3550 que determina la configuraci贸n de la red local de la oficina).
  2. Cada Kerio tiene dos canales con equilibrio de carga hasta el ISP (en el diagrama: ISP # 1 e ISP # 2) con IP blancas est谩ticas.
  3. Desde el lado de la oficina remota, se instal贸 MikroTik 951G-2HnD (OS v.6.43.11).
  4. Dos ISP llegan a MikroTik (en el diagrama est谩n ISP # 3 e ISP # 4).

Al momento de escribir, tanto en la oficina central como en la oficina remota, la conexi贸n con los proveedores era un par trenzado.

La lista de tareas:


  1. Establezca una conexi贸n VPN IPSec entre MikroTik y Kerio Control, donde MikroTik ser谩 el iniciador.
  2. Garantizar la tolerancia a fallos de la conexi贸n VPN, es decir Adem谩s del hecho de que MikroTik debe monitorear el rendimiento de sus ISP (art铆culo aqu铆 ), tambi茅n debe monitorear la disponibilidad de cada servidor Kerio y determinar el acceso a trav茅s de qu茅 canal (a trav茅s de qu茅 ISP de Kerio) se realizar谩 la conexi贸n.
  3. Proporcione la capacidad de cambiar la direcci贸n de red con la que MikroTik se conecta a Kerio. Esto se debe al hecho de que Kerio, y no un enrutador, se encuentra en la sede "fronteriza".


驴Qu茅 obtenemos en la salida?


  1. Cuando se inicia MikroTik (scheduleStartup), se organizar谩 un canal a la red empresarial (el canal ser谩 iniciado por MikroTik), lo que permite a un usuario remoto trabajar con recursos corporativos sin iniciar Kerio Client y sin configurar una conexi贸n VPN adicional utilizando el sistema operativo;
  2. MikroTik implementar谩 Failover, que cambia autom谩ticamente a un ISP en vivo;
  3. Puede establecer prioridades para los puntos de conexi贸n a la red empresarial cambiando la afiliaci贸n de los pares configurados para conectarse a Kerio Control a uno u otro Grupo de plantillas de pol铆ticas en MikroTik;
  4. MikroTik podr谩 monitorear autom谩ticamente el rendimiento de los servidores Kerio Control, y si la conexi贸n con el punto de prioridad se interrumpe, cambie al canal en vivo de forma independiente;
  5. Si sus servidores Kerio Control se publican en servidores DNS externos, MikroTik podr谩 realizar un seguimiento de los cambios en sus direcciones IP (por ejemplo, si su proveedor cambia) y realizar cambios de forma independiente en su configuraci贸n (scriptSetIPSecSADstAddrFromDNS).


Debo decir de inmediato que este art铆culo no es un tutorial (en principio, me familiaric茅 con los enrutadores y, en particular, con MikroTik solo dos meses (finales de 2017) antes de que se creara la configuraci贸n) y no aborda las preguntas "驴por qu茅?", 鈥嬧婨star谩 aqu铆 Se proporciona la descripci贸n de la configuraci贸n de trabajo de MikroTik, que se utiliza en una empresa real.

Nota:
  1. Para mantener los comentarios en ruso al transferir el c贸digo del script a MikroTik, antes de copiar texto en el b煤fer y antes de insertarlo desde el b煤fer, aseg煤rese de que la distribuci贸n del teclado ruso est茅 activada;
  2. Si encuentra que las secuencias de comandos de registro son superfluas, puede comentar o eliminar l铆neas con "advertencia de registro" y "error de registro";
  3. Tambi茅n puede observar comentarios comentados como "advertencia de registro" y "error de registro" en el c贸digo, este es un intento de agregar la capacidad de usar el registro en ingl茅s ...


Entonces comencemos:

Par谩metros b谩sicos:

  1. La red de la organizaci贸n matriz (detr谩s de Kerio) es 192.168.77.0/24 (aqu铆 usamos la direcci贸n de la red donde se encuentra Kerio en la red empresarial)
  2. Red de sucursales (detr谩s de MikroTik) - 192.168.11.0/24
  3. La red a la que se asignar谩 la red de sucursales cuando se conecte a Kerio Control # 1 - 192.168.22.0/24
  4. La red a la que se asignar谩 la red de sucursales cuando se conecte a Kerio Control # 2 - 192.168.33.0/24
  5. Direcci贸n IP del grupo ISP # 1 (Kerio # 1) - 11.11.11.111
  6. Direcci贸n IP del grupo ISP # 2 (Kerio # 1) - 22.22.22.111
  7. Direcci贸n IP del grupo ISP # 1 (Kerio # 2) - 11.11.11.222
  8. La direcci贸n IP del grupo ISP # 2 (Kerio # 2) es 22.22.22.222
  9. Direcci贸n IP del grupo ISP # 3 (MikroTik) - 33.33.33.111
  10. Direcci贸n IP del grupo ISP # 4 (MikroTik) - 44.44.44.111

Lo primero que debe hacer es habilitar DDNS en MikroTik:

/ip cloud set ddns-enabled=yes 

Debido al hecho de que MikroTik no tendr谩 una direcci贸n IP blanca est谩tica, el trabajo adicional de la configuraci贸n y los scripts se basa en el uso de DDNS.

Tambi茅n IP ---> Cloud se usa para determinar la direcci贸n IP externa de MikroTik, desde la que se ve en Internet.

Ahora configuremos Kerio Control # 1, para que luego no volvamos a 茅l:
Vamos a la secci贸n "Interfaces" y agregamos la nueva interfaz "T煤nel VPN" ...

Configuraci贸n de t煤nel en Kerio Control
1. En el campo de nombre, asigne un nombre a la interfaz;
2. Coloque el interruptor en la posici贸n "Pasivo: solo acepta conexiones entrantes";
3. Escriba leave "IPSec";
4. La pesta帽a "Autenticaci贸n":

  • 4.1 En el campo "Clave predefinida:" ingrese la frase clave que se utilizar谩 para conectarse;
  • Nota:

    隆Recomiendo categ贸ricamente configurar todas las frases clave en todos los t煤neles VPN creados en un servidor Kerio espec铆fico!

    Esto se debe al hecho de que Kerio tiene un error flotante, que se expresa a continuaci贸n.

    Imagine que en la configuraci贸n de Kerio, como en mi caso, hay varias interfaces de "t煤nel VPN" configuradas para conectarse a MikroTik, que difieren entre s铆 solo en la configuraci贸n en el campo "ID local:" (se discutir谩 a continuaci贸n).

    Entonces, al crear (lo llamar茅 as铆) un t煤nel entrante, independientemente de la direcci贸n IP externa que Kerio contactar谩 con MikroTik, Kerio (por alguna raz贸n) activar谩 la primera interfaz que se encuentre, y si la direcci贸n IP especificada en la configuraci贸n el t煤nel en el lado de Kerio es diferente al que MikroTik hace referencia, el t煤nel no est谩 organizado.

    Y en el caso de que se indiquen diferentes frases clave para todos los t煤neles, este problema se detiene.
  • 4.2 En el campo "ID local:", ingrese la direcci贸n IP del grupo de direcciones ISP # 1 (en el ejemplo 11.11.11.111) asignado a la interfaz WAN Kerio Control # 1, a la que MikroTik acceder谩;
  • 4.3 En el campo "Remote ID:", ingrese el FQDN, que fue obtenido por nuestro MikroTik de DDNS (IP ---> Cloud ---> DNS Name). Esta configuraci贸n nos permite no preocuparnos por c贸mo el ISP MikroTik accede a Kerio;
  • 4.4 En el campo "Fase 1 cifrado (IKE):" seleccione aes128-sha1-modp2048 de la lista;
  • 4.5 En el campo "Cifrado de fase 2 (ESP):" seleccione 3des-sha1-modp2048 de la lista;
  • Nota:
    Edici贸n de la configuraci贸n predeterminada utilizada a trav茅s del bot贸n "Cambiar ...";
    Ambas cifras se seleccionan utilizando el "m茅todo de b煤squeda cient铆fica".

5. La pesta帽a "Redes remotas":

Aqu铆 ingresamos la direcci贸n IP de la red local que MikroTik usar谩 cuando se conecte a este servidor Kerio Control espec铆fico (en el ejemplo: 192.168.22.0/24).
Importante! En todo lo dem谩s (en mi caso est谩 determinado por el n煤mero de ISP de Kerio) los t煤neles en MikroTik, en este servidor Kerio, 隆debe indicarse la misma direcci贸n IP!

Perm铆tame recordarle que esto se debe a la necesidad de configurar la ruta a esta red desde la red de la oficina central.

6. La pesta帽a "Redes de 谩rea local":

  • 6.1 Desmarque la casilla "Usar redes locales detectadas autom谩ticamente";
  • 6.2 Establezca la casilla de verificaci贸n "Usar redes personalizadas:" y agregue la direcci贸n de red "que cubre" todo el rango de direcciones utilizadas en la red local detr谩s de Kerio Control a la lista de redes (en el ejemplo - 192.168.0.0/16).

Repetimos todos los pasos anteriores para el segundo t煤nel en el mismo servidor Kerio.

La configuraci贸n del segundo t煤nel solo diferir谩 usando una frase de contrase帽a diferente (cl谩usula 4.1) y una direcci贸n IP externa diferente del conjunto de direcciones ISP # 2 (cl谩usula 4.2) (en el ejemplo, 22.22.22.111).

La configuraci贸n de Kerio Control # 2 es id茅ntica a la descrita anteriormente, excepto por la direcci贸n de red indicada en la pesta帽a Redes remotas (p. 5) (en el ejemplo, 192.168.33.0/24) y, en consecuencia, las direcciones IP en el campo ID local: Sec. 4.2), que debe seleccionarse de las direcciones IP asignadas a las interfaces WAN Kerio Control # 2 (en el ejemplo, 11.11.11.222 y 22.22.22.222).

A continuaci贸n, creamos una regla de permiso para hacer ping a nuestro Kerio desde MikroTik ...

Regla de ping en Kerio Control
Vamos a la secci贸n "Reglas de tr谩fico" y creamos una nueva regla con los siguientes par谩metros:

  • fuente: indique el FQDN que recibi贸 nuestro MikroTik de DDNS;
  • Destino - Cortafuegos
  • servicio - Ping;
  • Tambi茅n puede especificar la versi贸n de IP (IPv4), pero esto no es necesario.

Guardamos la regla con un nombre que sea comprensible para usted y la arrastramos a la parte superior de la lista de reglas.

Repetimos el mismo procedimiento en el segundo servidor Kerio.

No olvide registrar las rutas en la red detr谩s de MikroTik en conmutadores o enrutadores al costado de la oficina central para que la red de la oficina central sepa hacia d贸nde dirigir el tr谩fico (en mi caso, estas son dos rutas est谩ticas en las redes 192.168.22.0/24 y 192.168.33.0/24).

Desde la oficina central, hicimos todo, ahora pasamos a MikroTik.

Comencemos creando los objetos de configuraci贸n b谩sicos para organizar y probar el t煤nel VPN.

El primer paso es crear una lista de direcciones de subred local. Lo usaremos en las reglas de Firewall.

 /ip firewall address-list #      MikroTik, # IP-      DHCP add address=192.168.11.0/24 list="Local subnet" #  ,        MikroTik #   VPN-  Kerio Control #1 # (     VPN-  Kerio Control #1, #   " ") add address=192.168.22.0/24 list="Local subnet" #  ,        MikroTik #   VPN-  Kerio Control #2 # (     VPN-  Kerio Control #2, #   " ") add address=192.168.33.0/24 list="Local subnet" 

A continuaci贸n, cree una regla de permiso para el tr谩fico IKE y col贸quela en la parte superior de la lista de reglas.

 add action=accept chain=input comment="VPN Allow IKE" dst-port=500 protocol=udp 

Luego agregue dos reglas al Filtro de firewall para trabajar con tr谩fico VPN ...

 /ip firewall filter add action=accept chain=forward comment="VPN In IpSec" dst-address-list=\ "Local subnet" ipsec-policy=in,ipsec src-address=192.168.0.0/16 \ src-address-list="!Local subnet" add action=accept chain=forward comment="VPN Out" dst-address=192.168.0.0/16 \ dst-address-list="!Local subnet" src-address-list="Local subnet" 

... y moverlos a una posici贸n inmediatamente superior a la regla de ca铆da , que proh铆be el tr谩fico entrante desde fuera de la LAN. En mi configuraci贸n predeterminada, fue con el comentario "defconf: descartar todo lo que no viene de LAN"

Vaya a Firewall Mangle y cree las siguientes reglas:

 /ip firewall mangle #      , #  ... add action=mark-connection chain=prerouting comment="VPN In" \ new-connection-mark=VPN_conn_in passthrough=no src-address=192.168.0.0/16 \ src-address-list="!Local subnet" # ...   add action=mark-routing chain=output comment="VPN In" connection-mark=\ VPN_conn_in new-routing-mark=VPN_route_in passthrough=yes #     MikroTik      . #     NAT. add action=mark-connection chain=postrouting comment="VPN Out" dst-address=\ 192.168.0.0/16 dst-address-list="!Local subnet" new-connection-mark=\ VPN_conn_out passthrough=no 

A continuaci贸n, observamos en Firewall NAT:

 /ip firewall nat #     MikroTik     #      , #    Kerio- (:  Kerio Control #1 - 192.168.22.0/24,  Kerio Control #2 - 192.168.33.0/24) # ! # comment=KerioVpnNatOut   ! add action=netmap chain=srcnat comment=KerioVpnNatOut connection-mark=\ VPN_conn_out to-addresses=192.168.22.0/24 #     MikroTik     #          MikroTik add action=netmap chain=dstnat comment=KerioVpnNatIn connection-mark=\ VPN_conn_in to-addresses=192.168.11.0/24 #  MikroTik  Kerio- add action=accept chain=srcnat comment=KerioVpnNatPing out-interface-list=WAN protocol=icmp 

Importante! Estas reglas deben colocarse por encima de las reglas de enmascaramiento.

Ahora vamos a la secci贸n IP ---> IPSec, donde necesitamos crear una pol铆tica, un par, grupos de plantillas de pol铆ticas (discutir茅 su prop贸sito m谩s adelante) y una propuesta para configurar el cifrado de fase 2.

propuesta ip ipsec
 /ip ipsec proposal add enc-algorithms=3des name=KerioVPNProposal#01 pfs-group=modp2048 


grupo de pol铆ticas ip ipsec
 /ip ipsec policy group add name=1 add name=2 add name=3 add name=4 


ip ipsec peer
 /ip ipsec peer add address=11.11.11.111/32 comment=vs01-i01-01.domain.ru exchange-mode=\ main-l2tp local-address=33.33.33.111 my-id=\ fqdn:mikrotik.sn.mynetname.net policy-template-group=1 profile=\ profile_4 secret=pass1111 


pol铆tica ip ipsec
 /ip ipsec policy add comment=KerioVPNPolicy dst-address=192.168.77.0/24 proposal=KerioVPNProposal#01 \ sa-dst-address=11.11.11.111 sa-src-address=33.33.33.111 src-address=\ 192.168.22.0/24 tunnel=yes 


Comentario:

1. / propuesta de ip ipsec: ingrese los mismos par谩metros de cifrado que especificamos al configurar Kerio Control en el campo "Cifrado de fase 2 (ESP):".

Nota:

Preste atenci贸n al par谩metro "nombre = KerioVPNProposal # 01".

No es necesario usar este nombre espec铆ficamente, pero si decide usar otro, luego de cambiarlo debe verificar y, si es necesario, cambiar la configuraci贸n de la pol铆tica IPSec asociada, as铆 como cambiar el valor asignado de la variable DefKerioPropName en el script scriptCheckActiveVpnServer, que se discutir谩 discurso adicional.

(En realidad, la mayor铆a de los nombres y comentarios de los objetos en la configuraci贸n descrita se usan en scripts, por lo que renombrarlos puede ocasionar algunos inconvenientes debido a la necesidad de realizar cambios en el c贸digo del script. Intentar茅 tomar notas apropiadas en el texto para facilitar la b煤squeda de dichos objetos).

2. / grupo de pol铆ticas ip ipsec

La creaci贸n de grupos se debe al hecho de que en el futuro procesaremos sus nombres (1, 2, ... n) en scripts y los utilizaremos para priorizar las direcciones IP de los servidores Kerio a los que accederemos.

Creo cuatro grupos a la vez porque Tengo dos ISP, con dos IP externas en cada uno de Kerio. En esta etapa, estamos usando solo un grupo hasta ahora.

3. / ip ipsec peer

En igual, especifique:

  • Direcci贸n: direcci贸n IP de Kerio, que se contactar谩 con MikroTik. Debe especificarse la misma direcci贸n que ingresamos en / ip ipsec policy sa-dst-address, solo con la m谩scara "/ 32";
  • Direcci贸n local: direcci贸n IP de MikroTik, desde la cual se acceder谩 a Kerio. Se debe especificar la misma direcci贸n que ingresamos en / ip ipsec policy sa-src-address;
  • Auth. M茅todo: seleccione "clave precompartida" de la lista;
  • Modo de intercambio: seleccione main-l2tp de la lista;
  • Si est谩 configurado, desmarque la casilla "Pasivo";
  • Secreto: ingrese la frase de contrase帽a que ingresamos cuando configuramos la interfaz VPN en Kerio, en la pesta帽a "Autenticaci贸n", en el campo "Clave predefinida:";
  • Grupo de plantillas de pol铆ticas: seleccione de la lista el grupo que creamos anteriormente con el nombre "1";
  • Desmarque el recorrido NAT;
  • Mi tipo de ID: seleccione el valor "fqdn" de la lista;
  • Mi ID: ingrese el FQDN asignado por MikroTik en DDNS;
  • En la pesta帽a "Cifrado", seleccione los par谩metros de cifrado que ingresamos cuando configuramos la interfaz VPN en Kerio, en la pesta帽a "Autenticaci贸n", en el campo "Fase 1 (IKE) Cipher:";
  • Comentario ( 隆Advertencia! 隆Utilizado en scripts! ).

En el comentario, indico el FQDN t茅cnico completo de mis servidores, que se publican en los servidores DNS que sirven a mi zona exterior.

Adem谩s de usar esta configuraci贸n, esto me permite mantener informaci贸n actualizada sobre las direcciones IP externas de los servidores Kerio utilizados (solo necesito cambiar la direcci贸n IP en el servidor DNS externo y se cambiar谩 autom谩ticamente a MikroTik (art铆culo aqu铆 )).

Para aquellos que son demasiado flojos para entender, cito el c贸digo de trabajo:

 /system script add dont-require-permissions=no name=scriptSetIPSecSADstAddrFromDNS owner=\ admin policy=read,write 

Listado de script scriptSetIPSecSADstAddrFromDNS
 :if ([:len [/system script job find script=SetIPSecSADstAddrFromDNS]]>1) do={ :error } :local DnsNameFromComment :local ResolvedIpFromComment :local ResolvedIpWithMaskFromComment :local IpPeerAddr :foreach IpSecPeerCount in=[/ip ipsec peer find] do={ :set DnsNameFromComment [/ip ipsec peer get $IpSecPeerCount comment] :if ($DnsNameFromComment!="") do={ :do { :set ResolvedIpFromComment [:resolve $DnsNameFromComment] :set ResolvedIpWithMaskFromComment ($ResolvedIpFromComment . "/32") :set IpPeerAddr [/ip ipsec peer get $IpSecPeerCount address] :if ($ResolvedIpWithMaskFromComment!=$IpPeerAddr) do={ :log warning ("[SetIPSecSADstAddrFromDNS]     " . DnsNameFromComment . "  IP-  " . $IpPeerAddr . "  " . $ResolvedIpFromComment) #:log warning ("[SetIPSecSADstAddrFromDNS] In the peer to the server " . DnsNameFromComment . " changed IP address from " . $IpPeerAddr . " on " . $ResolvedIpFromComment) /ip ipsec peer set $IpSecPeerCount address=$ResolvedIpWithMaskFromComment } } on-error={ :set ResolvedIpFromComment "unknown" :log error ("[SetIPSecSADstAddrFromDNS]     " . $DnsNameFromComment) #:log error ("[SetIPSecSADstAddrFromDNS] Cant resolve name " . $DnsNameFromComment) } } } :log warning ("[SetIPSecSADstAddrFromDNS]  IP- VPN- ") #:log warning ("[SetIPSecSADstAddrFromDNS] The IP-addresses of the VPN-servers are checked") 


La regla b谩sica que se aplica al comentario en pares es que el nombre debe comenzar con cualquier letra y / o n煤mero, sin espacios, seguido de un gui贸n OBLIGATORIO ("-"), seguido de cualquier n煤mero de caracteres arbitrarios.

Yo uso el siguiente formato:

vsNN-pNN-NN.domain.ru

Donde:

vsNN - vpn-server #NN (Esta parte del comentario se procesa en scripts y se usa en IP ---> Firewall ---> Listas de direcciones (ver m谩s abajo));
pNN - ISP #NN;
NN: n煤mero de serie de la direcci贸n IP externa en el conjunto de direcciones que me envi贸 el proveedor en Kerio;

4. / ip ipsec policy

En pol铆tica, definimos:

  • Dst. Direcci贸n: direcci贸n de red detr谩s de Kerio (dst-address);
  • Src. Direcci贸n: la direcci贸n de la red a la que MikroTik enmascarar谩 (consulte la configuraci贸n de IP ---> Firewall ---> NAT) su red local (direcci贸n src). Esta direcci贸n de red ser谩 visible desde el lado de Kerio (la especificamos cuando configuramos la interfaz VPN en Kerio, en la pesta帽a Redes remotas);
  • Protocolo - 255 (todos);
  • Acci贸n: cifrar;
  • Nivel - requiere;
  • Protocolos IPSec - esp;
  • establezca el par谩metro tunnel = yes;
  • SA Src. Direcci贸n: la direcci贸n IP externa de MikroTik, desde la cual se acceder谩 a Kerio (sa-src-address);
  • SA Dst. Direcci贸n: direcci贸n IP de Kerio, con la que se contactar谩 a MikroTik (sa-dst-address);
  • Propuesta: ingrese el valor asignado al par谩metro de nombre en la secci贸n de propuesta / ip ipsec (en esta configuraci贸n - KerioVPNProposal # 01);
  • Comentario ( 隆Advertencia! 隆Utilizado en scripts! ) - KerioVPNPolicy.

Si todo se hace correctamente, luego de guardar la pol铆tica, el valor "establecido" deber铆a aparecer en el campo "Estado PH2", que indica la instalaci贸n de un canal VPN entre MikroTik y Kerio.
Puede verificar esto comprobando el estado de la interfaz VPN en Kerio Control. All铆, en el campo "Informaci贸n", opuesto a la interfaz a la que se realiza la conexi贸n, deber铆a aparecer la inscripci贸n "Se establece la conexi贸n a su_MikroTik_IP_address".

Continuamos ...

Ahora crearemos pares para todas las direcciones IP restantes de los servidores Kerio (en mi configuraci贸n es necesario crear tres pares m谩s).

Para hacer esto, debemos repetir todos los pasos indicados en el p谩rrafo 3 (/ ip ipsec peer), pero preste atenci贸n a los siguientes cambios:

  • Direcci贸n: cambie la direcci贸n IP de Kerio;
  • Secreto: ingrese la frase de contrase帽a relacionada con la conexi贸n que se est谩 creando (pass2222, pass3333, ... passNNNN);
  • Grupo de plantillas de pol铆ticas: seleccione el siguiente grupo de la lista de la lista (2, 3, ... n).

Nota:

Luego puede cambiar la prioridad de sus servidores en cualquier momento cambiando el grupo en la configuraci贸n de pares.

  • Comentario: en mi caso, cambia a otro FQDN del servidor Kerio.

Todos los dem谩s par谩metros se ingresan igual que en la primera fiesta. Aquellos que necesitar谩n ser cambiados son procesados 鈥嬧媝or scripts y puede copiarlos sin cambios por ahora.

El paso final de la configuraci贸n antes de conectar los scripts al trabajo es hacer que MikroTik funcione como un dep贸sito de constantes, que usaremos en los scripts ...
Agregue dos listas a las Listas de direcciones del firewall ( 隆Advertencia! 隆Utilizadas en scripts! ):

 /ip firewall address-list add address=192.168.22.0/24 list=vs01 add address=192.168.33.0/24 list=vs02 

en ellas indicamos las direcciones de las redes con referencia a los prefijos de nombres de Kerio-server, en los que mapearemos el tr谩fico VPN saliente.

Bueno, para automatizar el trabajo de toda esta desgracia, agregamos dos scripts y tres programaciones (si decide cambiar el nombre de los scripts, no olvide hacer los cambios apropiados en el c贸digo) .

 /system script add dont-require-permissions=no name=scriptFunctionsList owner=admin policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon 

Listado de guiones scriptFunctionsList
 #   IP --> Cloud   DNS- #  : # # $start (true/false); # #  ""  "updated" :global subUpdateCloudDns do={ put ($start); :if ($start=false) do={ set $CloudDnsStatus; #     set $m 1; log warning ("[subUpdateCloudDns] ---> DDNS  --->  "); #log warning ("[subUpdateCloudDns] ---> DDNS status ---> CHECK STARTED"); do { log warning ("[subUpdateCloudDns] ---> DDNS ,  ---> " . $m); [/ip cloud force-update]; delay 30000ms; set $CloudDnsStatus ([/ip cloud get status]); set $m ($m+1); :if ($CloudDnsStatus="updated") do={ log warning ("[subUpdateCloudDns] ---> DDNS  ---> " . $CloudDnsStatus); #log warning ("[subUpdateCloudDns] ---> DDNS status ---> " . $CloudDnsStatus); } else={ log error ("[subUpdateCloudDns] ---> DDNS  ---> " . $CloudDnsStatus); #log error ("[subUpdateCloudDns] ---> DDNS status ---> " . $CloudDnsStatus); } } while=(($CloudDnsStatus!="updated") and ($m<10)); return ($CloudDnsStatus); } } #    IP --> Cloud #   : # # 0 - ; # 1 - ,   ; # 2 -    :global subCheckCloudDDNS do={ set $CloudDnsActive ([/ip cloud get ddns-enabled]); #  - ( $m=0 ) set $m 0; :if ($CloudDnsActive=yes) do { #  IP--->Cloud  ( $m=1 ) set $m ($m+1); set $CloudDnsStatus ([/ip cloud get status]); #    IP- (  IP--->Cloud    DNS) set $CloudDnsIP ([/ip cloud get public-address]); set $CheckIpAddr ([resolve [/ip cloud get dns-name]]); :if ($CloudDnsIP!=$CheckIpAddr) do={ #  IP  (  MikroTik  )... set $CloudDnsStatus "updating..."; } :if ($CloudDnsStatus="updated") do { #  IP--->Cloud    ( $m=2 ) set $m ($m+1); } } return ($m); } #       #  : # # $ScriptName ( ) :global subRepeatScript do={ put ($ScriptName); :if ($ScriptName!="") do { [/system script run $ScriptName]; } } #     VPN-   # #   IP- VPN-     :global subGetVpnServers do={ #    IP- VPN-        :foreach IpSecPeerId in=[/ip ipsec peer find passive!=yes] do={ set $CheckIpAddr [/ip ipsec peer get $IpSecPeerId address]; :if ($CheckIpAddr!="") do={ set $MaskPos [find $CheckIpAddr "/"]; set $GroupFromPeer ([/ip ipsec peer get $IpSecPeerId policy-template-group]); set $IpFromPeer ([pick $CheckIpAddr 0 $MaskPos]); set $VpnServersList ($VpnServersList, {{$GroupFromPeer; $IpFromPeer}}); } } return ($VpnServersList); } #        # #    ID   :global subDisableIpSecPeers do={ # ...  ,  (passive=false) ... :foreach IpSecPeerId in=[/ip ipsec peer find passive!=yes] do={ log warning ("[IP IPSec Peer] --->    ---> " . [/ip ipsec peer get $IpSecPeerId comment]); #log warning ("[IP IPSec Peer] ---> processed peer on ---> " . [/ip ipsec peer get $IpSecPeerId comment]); #  address   ... set $CheckIpAddr [/ip ipsec peer get $IpSecPeerId address]; :if ($CheckIpAddr!="") do={ #  address  ,  IP-  ... set $MaskPos ([find $CheckIpAddr "/"]); set $CheckIpAddr ([pick $CheckIpAddr 0 $MaskPos]); # ...   IPSec- :foreach IpSecPolicyId in=[/ip ipsec policy find sa-dst-address=$CheckIpAddr] do={ :if ($IpSecPolicyId!="") do={ :if ([/ip ipsec policy get $IpSecPolicyId disabled]!=yes) do={ [/ip ipsec policy disable $IpSecPolicyId]; log warning ("[IP IPSec Policy] --->  " . [/ip ipsec policy get $IpSecPolicyId comment] . " "); #log warning ("[IP IPSec Policy] ---> policy " . [/ip ipsec policy get $IpSecPolicyId comment] . " deactivated"); } #    ID     set $IdList ($IdList, $IpSecPolicyId); } } } # :     ,      :if ([/ip ipsec peer get $IpSecPeerId disabled]!=yes) do={ [/ip ipsec peer disable $IpSecPeerId]; log warning ("[IP IPSec Peer] ---> " . [/ip ipsec peer get $IpSecPeerId comment] . " ---> "); #log warning ("[IP IPSec Peer] ---> " . [/ip ipsec peer get $IpSecPeerId comment] . " ---> deactivated"); } } return ($IdList); } #        #  : # # $PeerID (ID   VPN-); # $PolIdList ( ID  $subDisableIpSecPeers); # $CloudIP (IP MikroTik  DDNS); # $SrcIP (src-address    VPN-) :global subEnableIpSecPeers do={ put ($PeerID); put ($PolIdList); put ($CloudIP); :if (($PeerID!="")&&($PeerID!=nil)&&($PolIdList!="")&&($PolIdList!=nil)&&($CloudIP!="")&&($CloudIP!=nil)) do={ #   VPN- set $ActiveVPN [/ip ipsec peer get $PeerID address]; :if ($ActiveVPN!="") do={ #  ,  IP-   set $MaskPos [find $ActiveVPN "/"]; set $ActiveVPN ([pick $ActiveVPN 0 $MaskPos]); } #   ,      :if ([/ip ipsec peer get $PeerID disabled]=yes) do={ delay 5000ms; [/ip ipsec peer enable $PeerID]; log warning ("[IP IPSec Peer] --->  peer  ---> " . [/ip ipsec peer get $PeerID address]); #log warning ("[IP IPSec Peer] ---> activated peer on ---> " . [/ip ipsec peer get $PeerID address]); } #    ID   PolIdList, ,    Src. Address, SA Src. Address  SA Dst. Address,   :foreach IpSecPolicyId in=$PolIdList do={ :if ($IpSecPolicyId!="") do={ :if ([/ip ipsec policy get $IpSecPolicyId src-address]!=$SrcIP) do={ [/ip ipsec policy set $IpSecPolicyId src-address=$SrcIP]; log warning ("[IP IPSec Policy] --->  src-address"); #log warning ("[IP IPSec Policy] ---> src-address changed"); } :if ([/ip ipsec policy get $IpSecPolicyId sa-src-address]!=$CloudIP) do={ [/ip ipsec policy set $IpSecPolicyId sa-src-address=$CloudIP]; log warning ("[IP IPSec Policy] --->  sa-src-address"); #log warning ("[IP IPSec Policy] ---> sa-src-address changed"); } :if ([/ip ipsec policy get $IpSecPolicyId sa-dst-address]!=$ActiveVPN) do={ [/ip ipsec policy set $IpSecPolicyId sa-dst-address=$ActiveVPN]; log warning ("[IP IPSec Policy] --->  sa-dst-address"); #log warning ("[IP IPSec Policy] ---> sa-dst-address changed"); } :if ([/ip ipsec policy get $IpSecPolicyId disabled]=yes) do={ delay 3000ms; [/ip ipsec policy enable $IpSecPolicyId]; log warning ("[IP IPSec Policy] --->  "); #log warning ("[IP IPSec Policy] ---> policy activated"); #  DNS- [/ip dns cache flush] } } } } } #      ID  #  : # # $PeerIP (IP    ); # $CloudIP (IP MikroTik  DDNS); # $action (enable/disable/skip) # #    ID,   ,  :global subGetPoliciesByPeer do={ put ($PeerIP); put ($CloudIP); put ($action); :if (($action="")||($action=nil)) do={ set $action "skip"; } :foreach IpSecPolicyId in=[/ip ipsec policy find sa-dst-address=$PeerIP] do={ :if ($IpSecPolicyId!="") do={ #     $action=disable,   :if (([/ip ipsec policy get $IpSecPolicyId disabled]!=yes)&&($action="disable")) do={ [/ip ipsec policy disable $IpSecPolicyId]; log warning ("[IP IPSec Policy] --->  "); #log warning ("[IP IPSec Policy] ---> policy deactivated"); } #     $CloudIP  sa-src-address!=$CloudIP ( ISP),     sa-src-address :if (($CloudIP!="")&&($CloudIP!=nil)&&([/ip ipsec policy get $IpSecPolicyId sa-src-address]!=$CloudIP)) do={ [/ip ipsec policy disable $IpSecPolicyId]; [/ip ipsec policy set $IpSecPolicyId sa-src-address=$CloudIP]; log warning ("[IP IPSec Policy] --->   --->  sa-src-address ---> " . $CloudIP); #log warning ("[IP IPSec Policy] ---> policy deactivated ---> new sa-src-address ---> " . $CloudIP); #   ,  Kerio   delay 30000ms; } #     $action=enable,   :if (([/ip ipsec policy get $IpSecPolicyId disabled]=yes)&&($action="enable")) do={ [/ip ipsec policy enable $IpSecPolicyId]; log warning ("[IP IPSec Policy] --->  "); #log warning ("[IP IPSec Policy] ---> policy activated"); #  DNS- [/ip dns cache flush] } #    ID     set $IdList ($IdList, $IpSecPolicyId); } } return ($IdList); } #   local-address  #  : # # $PeerID (ID   VPN-); # $CloudIP (IP MikroTik  DDNS) :global subCheckPeerLocalIp do={ put ($PeerID); put ($CloudIP); :if (($PeerID!="")&&($PeerID!=nil)&&($CloudIP!="")&&($CloudIP!=nil)) do={ #   DDNS-IP :if ([/ip ipsec peer get $PeerID local-address]!=$CloudIP) do={ [/ip ipsec peer set $PeerID local-address=$CloudIP]; log warning ("[IP IPSec Peer] --->  local-address"); #log warning ("[IP IPSec Peer] ---> local-address changed"); } } } 


 /system script add dont-require-permissions=no name=scriptCheckActiveVpnServer owner=admin policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon 

Listado de script scriptCheckActiveVpnServer
 :if ([:len [/system script job find script=scriptCheckActiveVpnServer]]>1) do={ :error } #      scheduleStartup #   ,       :global subCheckCloudDDNS :global subCheckPeerLocalIp :global subDisableIpSecPeers :global subEnableIpSecPeers :global subGetPoliciesByPeer :global subGetVpnServers :global subUpdateCloudDns :local CheckIP :local CheckPeer #     DDNS ( ) :local CloudDnsStatus ([:put [$subCheckCloudDDNS]]) :local Exit false :local DefMikroTikSrcNet 192.168.11.0/24 :local DefKerioDstNet 192.168.77.0/24 :local DefKerioPropName KerioVPNProposal#01 :local DefKerioPolName KerioVPNPolicy :local IpSecPolicyId :local KerioName :local KerioVpnNatRuleName KerioVpnNatOut :local m :local n 1 :local PeerCount 0 :local PeerDisabled :local PingCount 3 :local PingResult :local PoliciesList :local PublicIp :local VpnServersList #   DDNS ,  ,    IP- MikroTik :if ($CloudDnsStatus=0) do={ #  Cloud DDNS  ,         :log error ("[schedule CheckActiveVpnServer] --->    VPN-   Cloud DDNS! (IP -> Cloud)") # :log error ("[schedule CheckActiveVpnServer] ---> to connect to the VPN server, you need to activate Cloud DDNS! (IP -> Cloud)") :error } :if ($CloudDnsStatus=1) do={ #  Cloud DDNS ,   ,   ( ) :set CloudDnsStatus [:put [$subUpdateCloudDns start=false]] :if ($CloudDnsStatus="updated") do={ :set CloudDnsStatus 2 } } :if ($CloudDnsStatus=2) do { #  Cloud DDNS    ... #  IP  DDNS :set PublicIp [/ip cloud get public-address] #   VPN-  ,    ( ) :set VpnServersList ([:put [$subGetVpnServers]]) #     :foreach VpnIpId in=$VpnServersList do={ :set PeerCount ($PeerCount+1) } #   VPN-    DDNS-IP ( ,   VPN-    ) :while (($Exit!=true)&&$n<=$PeerCount) do={ :foreach VpnIpId in=$VpnServersList do={ #  IP- VPN-    :if (($VpnIpId->0)=$n) do={ :set CheckIP ($VpnIpId->1) :if ($CheckIP!="") do={ #    IP :set PingResult ([:put [/ping address=$CheckIP count=$PingCount src-address=$PublicIp]]) :if ($PingResult=$PingCount) do={ :log warning ("[schedule CheckActiveVpnServer] ---> DDNS-IP ---> " . $PublicIp . " ---> VPN-IP ---> " . $CheckIP . " ---> Ping Result ---> " . $PingResult) #  IP ,     IP- :set CheckPeer (:put [/ip ipsec peer find address=($CheckIP . "/32")]) :if ($CheckPeer!="") do={ #   ,     src- (IP ---> Firewall ---> Address Lists),     Kerio #    Kerio    :set KerioName [/ip ipsec peer get $CheckPeer comment] #    (  ,  FQDN  Kerio   KerioName-Parameter1-...-Parameter_n :if ($KerioName!="") do={ #    :set m ([find $KerioName "-"]) #  KerioName    :set KerioName ([pick $KerioName 0 $m]) #    Firewall -> Address List (       : # Name ---> KerioName (eg srv1) # Address ---> DefMikroTikSrcNet (eg 192.168.99.0/24)) :set m [/ip firewall address-list find list=$KerioName] :set DefMikroTikSrcNet ([/ip firewall address-list get $m address]) } # ...          Kerio :set IpSecPolicyId (:put [/ip ipsec policy find comment="$DefKerioPolName"]) #      ,       # (    )         :if ($IpSecPolicyId="") do={ [/ip ipsec policy add disabled=yes dst-address=$DefKerioDstNet proposal=$DefKerioPropName sa-dst-address=$CheckIP sa-src-address=$PublicIp src-address=$DefMikroTikSrcNet tunnel=yes comment=$DefKerioPolName place-before=0] :log warning ("[schedule CheckActiveVpnServer] --->   " . $DefKerioPolName . " --->    ") #:log warning ("[schedule CheckActiveVpnServer] ---> created policy " . $DefKerioPolName . " ---> default parameters used") } else={ #   ,     src-address,   . :if ($DefMikroTikSrcNet!=[/ip ipsec policy get $IpSecPolicyId src-address]) do={ [/ip ipsec policy set $IpSecPolicyId src-address=$DefMikroTikSrcNet]; :log warning ("[schedule CheckActiveVpnServer] --->  " . $DefKerioPolName . "  ---> src-address   ---> " . $DefMikroTikSrcNet) #:log warning ("[schedule CheckActiveVpnServer] ---> policy " . $DefKerioPolName . " changed ---> src-address changed to ---> " . $DefMikroTikSrcNet) } } #   :set m #  NAT-      Kerio  :set m [/ip firewall nat find comment=$KerioVpnNatRuleName] :if ($m!="") do={ #   src-address   ipsec,       Kerio  :if ([/ip firewall nat get $m to-addresses]!=$DefMikroTikSrcNet) do={ [/ip firewall nat set $m to-addresses $DefMikroTikSrcNet] :log warning ("[IP Firewall NAT] --->    ---> " . $KerioVpnNatRuleName) #:log warning ("[IP Firewall NAT] ---> netmap rule changed ---> " . $KerioVpnNatRuleName) } } # ... local-address      IP MikroTik,    ( ) :put [$subCheckPeerLocalIp PeerID=$CheckPeer CloudIP=$PublicIp] # ...    :set PeerDisabled ([/ip ipsec peer get $CheckPeer disabled]) :if ($PeerDisabled=true) do={ #   ... #       ( ) :set PoliciesList ([:put [$subDisableIpSecPeers]]) #     VPN-   ( ) :put [$subEnableIpSecPeers PeerID=$CheckPeer PolIdList=$PoliciesList CloudIP=$PublicIp SrcIP=$DefMikroTikSrcNet] } else={ #   ... #      ,    ( ) :set PoliciesList ([:put [$subGetPoliciesByPeer PeerIP=$CheckIP CloudIP=$PublicIp SrcIP=$DefMikroTikSrcNet action="enable"]]) } :set Exit true } } else={ :log error ("[schedule CheckActiveVpnServer] ---> DDNS-IP ---> " . $PublicIp . " ---> VPN-IP ---> " . $CheckIP . " ---> Ping Result ---> " . $PingResult) } } } } :set n ($n+1) } } 


 /system scheduler add interval=1h name=scheduleCheckIPSecSADstAddrFromDNS on-event=\ "/system script run scriptSetIPSecSADstAddrFromDNS" policy=read,write \ start-date=oct/30/2017 start-time=00:10:00 add name=scheduleStartup on-event=":global StartupScript true :global RepeatRun false /system script run scriptFunctionsList" policy=\ ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ start-time=startup add interval=5m name=scheduleCheckActiveVpnServer on-event=\ "/system script run scriptCheckActiveVpnServer" policy=\ ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ start-date=nov/29/2017 start-time=00:00:00 

Horario de listado de horario
 :global StartupScript true :global RepeatRun false /system script run scriptFunctionsList 


Programar listado scheduleCheckIPSecSADstAddrFromDNS
 /system script run scriptSetIPSecSADstAddrFromDNS 


Lista de programaci贸n scheduleCheckActiveVpnServer
 /system script run scriptCheckActiveVpnServer 



El toque final:
para que MikroTik se ponga en contacto correctamente con los servidores DNS de la empresa ubicados detr谩s de Kerio Control, debe agregar registros est谩ticos con sus direcciones en MikroTik, en la secci贸n IP ---> DNS ---> Est谩tica ... 隆

Bueno, en alg煤n lugar as铆!

Espero no haberme equivocado nunca y no haya olvidado nada ...

Gracias por su atencion!

ps
Historia de ediciones y cambios:
  1. Se agreg贸 la secci贸n "驴Qu茅 obtenemos en la salida?:";
  2. Se ha agregado un comentario a la direcci贸n de red de la empresa matriz;
  3. Cambi贸 las direcciones IP de las redes de los grupos de ISP utilizados en la descripci贸n de la configuraci贸n;
  4. Se agreg贸 el elemento "Toque final:";

Source: https://habr.com/ru/post/439736/


All Articles