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é?", ​​Estará 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 ​​por 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