Connexion VPN IPSec entre MikroTik et Kerio Control



Paramètres initiaux:

  1. Siège social de l'entreprise avec deux proxys frontaliers Kerio Control v.9.2.9 build 3171 (derrière Kerio se trouve un commutateur Cisco 3550 qui détermine la configuration du réseau local du bureau).
  2. Chaque Kerio a deux canaux avec équilibrage de charge jusqu'à ISP (dans le diagramme - ISP # 1 et ISP # 2) avec des adresses IP blanches statiques.
  3. Du côté du bureau distant, MikroTik 951G-2HnD (OS v.6.43.11) a été installé.
  4. Deux FAI viennent à MikroTik (dans le diagramme sont FAI # 3 et FAI # 4).

Au moment de la rédaction du présent rapport, tant au siège social que dans le bureau distant, la connexion avec les prestataires était à paire torsadée.

La liste des tâches:


  1. Établissez une connexion VPN IPSec entre MikroTik et Kerio Control, où MikroTik sera l'initiateur.
  2. Assurez la tolérance aux pannes de la connexion VPN, c.-à-d. en plus du fait que MikroTik doit surveiller les performances de ses FAI (article ici ), il doit également surveiller la disponibilité de chaque serveur Kerio et déterminer l'accès par quel canal (par quel FAI de Kerio) la connexion sera établie.
  3. Permet de modifier l'adresse réseau avec laquelle MikroTik se connecte à Kerio. Cela est dû au fait que Kerio, et non un routeur, se trouve au siège «frontière».


Qu'obtenons-nous à la sortie?


  1. Lorsque MikroTik démarre (ScheduleStartup), un canal vers le réseau d'entreprise sera créé (le canal sera lancé par MikroTik), ce qui permet à un utilisateur distant de travailler avec les ressources de l'entreprise sans démarrer Kerio Client et sans configurer de connexion VPN supplémentaire à l'aide du système d'exploitation;
  2. MikroTik implémentera le basculement, qui bascule automatiquement vers un FAI en direct;
  3. Vous pouvez définir des priorités pour les points de connexion au réseau d'entreprise en modifiant l'affiliation des homologues configurés pour se connecter à Kerio Control à l'un ou l'autre groupe de modèles de stratégie dans MikroTik;
  4. MikroTik pourra surveiller automatiquement les performances des serveurs Kerio Control et, si la connexion avec le point prioritaire est rompue, basculez sur le canal en direct de manière indépendante;
  5. Si vos serveurs Kerio Control sont publiés sur des serveurs DNS externes, MikroTik pourra suivre les modifications de leurs adresses IP (par exemple, si votre fournisseur change) et apporter des modifications à sa configuration (scriptSetIPSecSADstAddrFromDNS).


Je dirai tout de suite que cet article n'est pas un tutoriel (en principe, je me suis familiarisé avec les routeurs et en particulier avec MikroTik seulement deux mois (fin 2017) avant la création de la configuration) et il ne répond pas aux questions «pourquoi?», Il sera ici La description de la configuration de travail de MikroTik, qui est utilisée dans une entreprise réelle, est donnée.

Remarque:
  1. Pour conserver les commentaires en russe lors du transfert du code de script vers MikroTik, avant de copier du texte dans le tampon et avant de coller à partir du tampon, assurez-vous que la disposition du clavier russe est activée;
  2. Si vous trouvez que les scripts de journalisation sont superflus, vous pouvez commenter ou supprimer des lignes avec «avertissement de journal» et «erreur de journal»;
  3. Vous pouvez également remarquer commenté «avertissement de journal» et «erreur de journal» dans le code, c'est une tentative d'ajouter la possibilité d'utiliser la journalisation en anglais ...


Commençons donc:

Paramètres de base:

  1. Le réseau de l'organisation mère (derrière Kerio) est 192.168.77.0/24 (ici, nous utilisons l'adresse du réseau où Kerio est situé dans le réseau d'entreprise)
  2. Réseau d'agences (derrière MikroTik) - 192.168.11.0/24
  3. Le réseau auquel le réseau de succursales mappera lors de la connexion à Kerio Control # 1 - 192.168.22.0/24
  4. Le réseau auquel le réseau de succursales mappera lors de la connexion à Kerio Control # 2 - 192.168.33.0/24
  5. Adresse IP du pool ISP # 1 (Kerio # 1) - 11.11.11.111
  6. Adresse IP du pool ISP # 2 (Kerio # 1) - 22.22.22.111
  7. Adresse IP du pool ISP # 1 (Kerio # 2) - 11.11.11.222
  8. L'adresse IP du pool ISP # 2 (Kerio # 2) est 22.22.22.222
  9. Adresse IP du pool ISP # 3 (MikroTik) - 33.33.33.111
  10. Adresse IP du pool ISP # 4 (MikroTik) - 44.44.44.111

La première chose à faire est d'activer le DDNS sur MikroTik:

/ip cloud set ddns-enabled=yes 

Étant donné que MikroTik n'aura pas d'adresse IP blanche statique, les travaux de configuration et de script ultérieurs sont basés sur l'utilisation de DDNS.

IP ---> Cloud est également utilisé pour déterminer l'adresse IP externe de MikroTik, à partir de laquelle il regarde sur Internet.

Maintenant, configurons Kerio Control # 1, pour que plus tard nous n'y revenions pas:
Nous allons dans la section «Interfaces» et ajoutons la nouvelle interface «tunnel VPN» ...

Configuration du tunnel dans Kerio Control
1. Dans le champ du nom, attribuez un nom à l'interface;
2. Mettez l'interrupteur en position "Passif - accepte uniquement les connexions entrantes";
3. Tapez congé "IPSec";
4. L'onglet "Authentification":

  • 4.1 Dans le champ "Clé prédéfinie:" entrez la phrase clé qui sera utilisée pour se connecter;
  • Remarque:

    Je recommande catégoriquement de définir toutes les phrases clés sur tous les tunnels VPN créés sur un serveur Kerio spécifique!

    Cela est dû au fait que Kerio a un bug flottant, qui est exprimé dans ce qui suit.

    Imaginez que dans la configuration Kerio, comme dans mon cas, il existe plusieurs interfaces «tunnel VPN» configurées pour se connecter à MikroTik, qui ne diffèrent les unes des autres que dans les paramètres du champ «Local ID:» (sera discuté ci-dessous).

    Ainsi, lors de la création (je l'appellerai ainsi) d'un tunnel entrant, quelle que soit l'adresse IP externe que Kerio contactera MikroTik, Kerio (pour une raison quelconque) activera la première interface qui apparaîtra, et si l'adresse IP spécifiée dans les paramètres le tunnel du côté de Kerio est différent de celui auquel MikroTik fait référence, le tunnel n'est pas organisé.

    Et dans le cas où différentes phrases clés sont indiquées pour tous les tunnels, ce problème s'arrête.
  • 4.2 Dans le champ "Local ID:", entrez l'adresse IP du pool d'adresses ISP # 1 (dans l'exemple 11.11.11.111) affectée à l'interface WAN Kerio Control # 1, à laquelle MikroTik aura accès;
  • 4.3 Dans le champ «Remote ID:», entrez le FQDN, qui a été obtenu par notre MikroTik à partir du DDNS (IP ---> Cloud ---> DNS Name). Ce paramètre nous permet de ne pas se soucier de la façon dont le FAI MikroTik accède à Kerio;
  • 4.4 Dans le champ "Chiffre de phase 1 (IKE):" sélectionnez aes128-sha1-modp2048 dans la liste;
  • 4.5 Dans le champ "Chiffre Phase 2 (ESP):" sélectionnez 3des-sha1-modp2048 dans la liste;
  • Remarque:
    Modification des paramètres par défaut utilisés via le bouton "Modifier ...";
    Les deux chiffres sont sélectionnés en utilisant la «méthode scientifique de piquer».

5. L'onglet "Réseaux distants":

Ici, nous entrons l'adresse IP du réseau local que MikroTik utilisera lors de la connexion à ce serveur Kerio Control spécifique (dans l'exemple - 192.168.22.0/24).
Important! Dans tous les autres (dans mon cas, c'est déterminé par le nombre de FAI de Kerio) tunnels sur MikroTik, sur ce serveur Kerio, la même adresse IP doit être indiquée!

Permettez-moi de vous rappeler que cela est dû à la nécessité de configurer l'itinéraire vers ce réseau à partir du réseau du siège social.

6. L'onglet "Réseaux locaux":

  • 6.1 Décochez la case «Utiliser les réseaux locaux détectés automatiquement»;
  • 6.2 Cochez la case «Utiliser des réseaux personnalisés:» et ajoutez à la liste des réseaux l'adresse réseau «couvrant» toute la plage d'adresses utilisée dans le réseau local derrière Kerio Control (dans l'exemple - 192.168.0.0/16).

Nous répétons toutes les étapes ci-dessus pour le deuxième tunnel sur le même serveur Kerio.

Le deuxième paramètre de tunnel ne différera qu'en utilisant une phrase de passe différente (clause 4.1) et une adresse IP externe différente, du pool d'adresses ISP # 2 (clause 4.2) (dans l'exemple, 22.22.22.111).

Les paramètres Kerio Control # 2 sont identiques à ceux décrits ci-dessus, à l'exception de l'adresse réseau indiquée dans l'onglet Réseaux distants (p. 5) (dans l'exemple, 192.168.33.0/24) et, par conséquent, des adresses IP dans le champ ID local: ( Section 4.2), qui doit être sélectionnée parmi les adresses IP attribuées aux interfaces WAN Kerio Control # 2 (dans l'exemple, 11.11.11.222 et 22.22.22.222).

Ensuite, nous créons une règle d'autorisation pour envoyer un ping à notre Kerio depuis MikroTik ...

Règle Ping dans Kerio Control
Nous allons dans la section «Règles de circulation» et créons une nouvelle règle avec les paramètres suivants:

  • source - indiquez le FQDN qui a été reçu par notre MikroTik du DDNS;
  • Destination - Pare-feu
  • service - Ping;
  • Vous pouvez également spécifier la version IP (IPv4), mais ce n'est pas nécessaire.

Nous enregistrons la règle avec un nom qui vous est compréhensible et la faisons glisser tout en haut de la liste des règles.

Nous répétons la même procédure sur le deuxième serveur Kerio.

N'oubliez pas d'enregistrer les routes sur le réseau derrière MikroTik dans des commutateurs ou des routeurs sur le côté du siège social afin que le réseau du siège social sache où diriger le trafic (dans mon cas, ce sont deux routes statiques sur les réseaux 192.168.22.0/24 et 192.168.33.0/24).

Du siège social, nous avons tout fait, maintenant nous passons à MikroTik.

Commençons par créer les objets de configuration de base pour organiser et tester le tunnel VPN.

La première étape consiste à créer une liste d'adresses de sous-réseau local. Nous l'utiliserons dans les règles du pare-feu.

 /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" 

Ensuite, créez une règle d'autorisation pour le trafic IKE et placez-la tout en haut de la liste des règles.

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

Ajoutez ensuite deux règles au filtre de pare-feu pour travailler avec le trafic 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" 

... et déplacez-les à une position immédiatement au-dessus de la règle de suppression , ce qui interdit le trafic entrant de l'extérieur du LAN. Dans ma configuration par défaut, c'était avec le commentaire "defconf: drop all ne venant pas du LAN"

Accédez à Firewall Mangle et créez les règles suivantes:

 /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 

Ensuite, nous notons dans 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 

Important! Ces règles doivent être placées au-dessus des règles de masquage.

Maintenant, nous allons à la section IP ---> IPSec, où nous devons créer une politique, un homologue, des groupes de modèles de politique (je discuterai de leur objectif plus tard) et une proposition pour la configuration du chiffrement de phase 2.

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


groupe de stratégies 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 


politique 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 


Commentaire:

1. / ip ipsec proposition - entrez les mêmes paramètres de cryptage que nous avons spécifiés lors de la configuration de Kerio Control dans le champ "Phase 2 Encryption (ESP):".

Remarque:

Faites attention au paramètre "nom = KerioVPNProposal # 01".

Il n'est pas nécessaire d'utiliser ce nom spécifiquement, mais si vous décidez d'en utiliser un autre, après l'avoir changé, vous devez vérifier et, si nécessaire, modifier le paramètre de la stratégie IPSec associée, et également modifier la valeur affectée de la variable DefKerioPropName dans le script scriptCheckActiveVpnServer, qui sera discuté discours plus loin.

(En fait, la plupart des noms et commentaires des objets dans la configuration décrite sont utilisés dans les scripts, donc les renommer peut vous causer des inconvénients en raison de la nécessité d'apporter des modifications au code du script. J'essaierai de prendre les notes appropriées dans le texte pour faciliter la recherche de ces objets.)

2. / groupe de stratégies ip ipsec

La création de groupes est due au fait qu'à l'avenir, nous traiterons leurs noms (1, 2, ... n) dans des scripts et les utiliserons pour hiérarchiser les adresses IP des serveurs Kerio auxquels nous accéderons.

Je crée quatre groupes à la fois parce que J'ai deux FAI, avec deux IP externes sur chacun de Kerio. À ce stade, nous utilisons jusqu'à présent un seul groupe.

3. / ip ipsec peer

En pair, spécifiez:

  • Adresse - Adresse IP de Kerio, qui sera contactée avec MikroTik. La même adresse que nous avons entrée dans / ip ipsec policy sa-dst-address doit être spécifiée, uniquement avec le masque "/ 32";
  • Adresse locale - Adresse IP de MikroTik, à partir de laquelle Kerio sera accessible. La même adresse que nous avons entrée dans / ip ipsec policy sa-src-address doit être spécifiée;
  • Auth. Méthode - sélectionnez «clé pré-partagée» dans la liste;
  • Mode Exchange - sélectionnez main-l2tp dans la liste;
  • Si elle est définie, décochez la case «Passif»;
  • Secret - entrez la phrase secrète que nous avons saisie lors de la configuration de l'interface VPN sur Kerio, dans l'onglet "Authentification", dans le champ "Clé prédéfinie:";
  • Groupe de modèles de stratégie - sélectionnez dans la liste le groupe que nous avons créé précédemment avec le nom «1»;
  • Décochez NAT Traversal;
  • My ID Type - sélectionnez la valeur «fqdn» dans la liste;
  • Mon ID - entrez le FQDN attribué par MikroTik dans DDNS;
  • Sur l'onglet «Cryptage», sélectionnez les paramètres de cryptage que nous avons entrés lors de la configuration de l'interface VPN sur Kerio, sur l'onglet «Authentification», dans le champ «Phase 1 (IKE) Cipher:»;
  • Commentaire ( Attention! Utilisé dans les scripts! ).

Dans le commentaire, j'indique le FQDN technique complet de mes serveurs, qui sont publiés sur les serveurs DNS desservant ma zone externe.

En plus d'utiliser cette configuration, cela me permet de garder des informations à jour sur les adresses IP externes des serveurs Kerio utilisés (j'ai juste besoin de changer l'adresse IP sur le serveur DNS externe et elle sera automatiquement changée en MikroTik (article ici )).

Pour ceux qui sont trop paresseux pour comprendre, je cite le code de travail:

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

Liste des scripts 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 règle de base qui s'applique au commentaire entre pairs est que le nom doit commencer par des lettres et / ou des chiffres, sans espaces, suivis d'un trait d'union OBLIGATOIRE ("-"), suivi d'un nombre quelconque de caractères arbitraires.

J'utilise le format suivant:

vsNN-pNN-NN.domain.ru

Où:

vsNN - vpn-server #NN (Cette partie du commentaire est traitée dans des scripts et utilisée dans IP ---> Pare-feu ---> Listes d'adresses (voir ci-dessous));
pNN - FAI #NN;
NN - numéro de série de l'adresse IP externe dans le pool d'adresses qui m'a été délivré par le fournisseur sur Kerio;

4. / Politique ipsec ip

En politique, nous définissons:

  • Dst. Adresse - adresse réseau derrière Kerio (adresse dst);
  • Src. Adresse - l'adresse réseau à laquelle MikroTik masquera (voir les paramètres IP ---> Pare-feu ---> NAT ci-dessous) son réseau local (adresse src). Cette adresse réseau sera visible du côté Kerio (nous l'avons spécifiée lors de la configuration de l'interface VPN sur Kerio, dans l'onglet Réseaux distants);
  • Protocole - 255 (tous);
  • Action - crypter;
  • Niveau - requis;
  • Protocoles IPSec - esp;
  • définissez le paramètre tunnel = yes;
  • SA Src. Adresse - L'adresse IP externe de MikroTik, à partir de laquelle Kerio sera accessible (sa-src-address);
  • SA Dst. Adresse - Adresse IP de Kerio, à laquelle MikroTik sera contacté (adresse sa-dst);
  • Proposition - Entrez la valeur attribuée au paramètre de nom dans la section de proposition / ip ipsec (dans cette configuration - KerioVPNProposal # 01);
  • Commentaire ( Attention! Utilisé dans les scripts! ) - KerioVPNPolicy.

Si tout est fait correctement, après avoir enregistré la politique, la valeur «établie» devrait apparaître dans le champ «État PH2», qui indique l'installation d'un canal VPN entre MikroTik et Kerio.
Vous pouvez le vérifier en vérifiant l'état de l'interface VPN dans Kerio Control. Là, dans le champ "Informations", en face de l'interface vers laquelle la connexion est établie, l'inscription "La connexion à IP_votre_MikroTik est établie" doit apparaître.

Nous continuons ...

Nous allons maintenant créer des homologues pour toutes les adresses IP restantes des serveurs Kerio (dans ma configuration, je dois créer trois autres homologues).

Pour ce faire, nous devons répéter toutes les étapes indiquées au paragraphe 3 (/ ip ipsec peer), mais faites attention aux modifications suivantes:

  • Adresse - modifiez l'adresse IP de Kerio;
  • Secret - entrez la phrase secrète relative à la connexion en cours de création (pass2222, pass3333, ... passNNNN);
  • Groupe de modèles de stratégie - sélectionnez le groupe suivant dans la liste dans la liste (2, 3, ... n).

Remarque:

Ensuite, vous pouvez modifier la priorité de vos serveurs à tout moment en modifiant le groupe dans les paramètres des homologues.

  • Commentaire - dans mon cas, il passe à un autre nom de domaine complet du serveur Kerio.

Tous les autres paramètres sont entrés de la même manière que lors de la première fête. Ceux qui devront être modifiés sont traités par des scripts et vous pouvez les copier tels quels pour l'instant.

La dernière étape de la configuration avant de connecter les scripts au travail consiste à faire fonctionner MikroTik comme un référentiel de constantes, que nous utiliserons dans les scripts ...
Ajoutez deux listes aux listes d'adresses du pare-feu ( Attention! Utilisé dans les scripts! ):

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

nous y indiquons les adresses des réseaux en référence aux préfixes de nom Kerio-server, dans lesquels nous allons cartographier le trafic VPN sortant.

Eh bien, afin d'automatiser le travail de toute cette honte, nous ajoutons deux scripts et trois planifications (si vous décidez de renommer les scripts, n'oubliez pas d'apporter les modifications appropriées au code) .

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

Liste des scripts 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 

Liste des scripts 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 

Planifier la liste des horaires
 :global StartupScript true :global RepeatRun false /system script run scriptFunctionsList 


Planification de la liste de calendrierCheckIPSecSADstAddrFromDNS
 /system script run scriptSetIPSecSADstAddrFromDNS 


Planification de la liste ScheduleCheckActiveVpnServer
 /system script run scriptCheckActiveVpnServer 



La touche finale:
pour que MikroTik contacte correctement les serveurs DNS d'entreprise situés derrière Kerio Control, vous devez ajouter des enregistrements statiques avec leurs adresses dans MikroTik, dans la section IP ---> DNS ---> Statique ...

Eh bien, quelque part comme ça!

J'espère que je n'ai jamais fait d'erreur et que je n'ai rien oublié ...

Merci de votre attention!

ps
Historique des modifications et changements:
  1. Ajout de la section «Qu'obtenons-nous à la sortie?:»;
  2. Un commentaire a été ajouté à l'adresse réseau de la société mère;
  3. Modification des adresses IP des réseaux des pools ISP utilisés dans la description de la configuration;
  4. Ajout de l'élément "Touche finale:";

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


All Articles