Mikrotik: IPsec so konfigurieren, dass die VPN-Serveradresse automatisch aktualisiert wird

Bei der Konfiguration von IPSec muss sich früher oder später jeder damit auseinandersetzen, dass Sie nur die IP-Adressen des Remote-VPN-Servers festlegen können. Das Angeben von DNS-Einträgen in den Einstellungen für IPSec-Richtlinien und IPSec-Peers wird nicht unterstützt.

Dies kann einige Unannehmlichkeiten verursachen, wenn der VPN-Server:
  • wechselte einen Provider zum anderen;
  • beschlossen, die verwendete statische IP-Adresse zu ändern;
  • Es wird eine dynamische (graue) IP-Adresse verwendet.


Selbst nach dem einfachsten Schema wird klar, dass wir die Einstellungen der drei Router-Clients des VPN-Servers



ändern müssen : Und in jedem der drei Router ändern Sie die Werte:
  • IPSec / Policy / DST-Adresse
  • Ipsec / policy / sa-dst-address
  • IPSec / Peer / Adresse


In der Realität wird bei Dutzenden und Hunderten von Kunden die Automatisierung dieses Prozesses zur Notwendigkeit. Sehen wir uns an, wie dies mithilfe der Standardfunktionen von Microtik implementiert wird: DDNS, Skripts und Scheduler.

Zum Spaß werden wir das Schema etwas komplizieren. Lassen Sie die zentralen VPN-Server über zwei Router verfügen, mit denen sich unsere Clients verbinden.



Wir aktivieren das vom Unternehmen bereitgestellte DDNS auf beiden VPN-Servern. Mikrotik bietet DDNS als kostenlosen Service für RouterOS-Kunden an.

ip cloud set ddns-enabled=yes

Andere DDNS-Anbieter
Ich benutze den kostenpflichtigen DynECT-Dienst von DynDNS, aber das Arbeitsschema ändert sich hiervon nicht.

Wir können das Ergebnis sehen: die empfangenen A-Einträge in der Domain sn.mynetname.net , die auf unsere VPN-Server verweisen.

 > ip cloud print 
    ddns-enabled: yes
  public-address: 1.1.1.1
        dns-name: 111111111111.sn.mynetname.net
          status: updated

Wir übergeben an Router, die als Clients fungieren.

In den Einstellungen "IpSec / Policy" und "IpSec / Peer" werden in den Kommentaren für jede Zeile die DNS-Namen der VPN-Server geschrieben: Fügen Sie als





Nächstes das Skript " SetIpSecDstAddrFromDns" hinzu , das die DNS-Namen unserer VPN-Server aus dem Kommentar empfängt und mit den Werten in den Einstellungen vergleicht:

:if ([:len [/system script job find script=SetIpSecDstAddrFromDns]]>1) do={
  :error
}
:local DnsNameFromComment
:local ResolvedIpFromComment
:local ResolvedIpWithMaskFromComment
:local IpDstAddr
:local IpSaDstAddr
:foreach IpSecPolicyCount in=[/ip ipsec policy find] do={
  :set DnsNameFromComment [/ip ipsec policy get $IpSecPolicyCount comment]
  :if ($DnsNameFromComment!="") do={
    :do {
      :set ResolvedIpFromComment ([:resolve $DnsNameFromComment])
      :set ResolvedIpWithMaskFromComment ($ResolvedIpFromComment . "/32")
      :set IpDstAddr [/ip ipsec policy get $IpSecPolicyCount dst-address]
      :set IpSaDstAddr [/ip ipsec policy get $IpSecPolicyCount sa-dst-address]
      :if ($ResolvedIpWithMaskFromComment!=$IpDstAddr or $ResolvedIpFromComment!=$IpSaDstAddr) do={
        :log warning ("[SetIpSecDstAddrFromDns] Change IpSec policy dst-addr from " . $IpSaDstAddr . " to " . $ResolvedIpFromComment)
        /ip ipsec policy set $IpSecPolicyCount dst-address=$ResolvedIpWithMaskFromComment sa-dst-address=$ResolvedIpFromComment
      }
    } on-error={
      :set ResolvedIpFromComment "unknown"
      :log error ("[SetIpSecDstAddrFromDns] Cant resolve name " . $DnsNameFromComment)
    }
  }
}
: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 ("[SetIpSecDstAddrFromDns] Change IpSec peer addr from " . $IpPeerAddr . " to " . $ResolvedIpFromComment)
        /ip ipsec peer set $IpSecPeerCount address=$ResolvedIpWithMaskFromComment
      }
    } on-error={
      :set ResolvedIpFromComment "unknown"
      :log error ("[SetIpSecDstAddrFromDns] Cant resolve name " . $DnsNameFromComment)
    }
  }
}

Wir fügen dem Scheduler eine Aufgabe hinzu, die alle 30 Sekunden ein Skript ausführt und überprüft, ob die Adressen unserer VPN-Server relevant sind, und aktualisiert sie gegebenenfalls.

Vielen Dank für Ihre Aufmerksamkeit.

PS Dieser Artikel ist nicht für Anfänger gedacht, daher habe ich die einfachsten Dinge weggelassen, wie das Einrichten eines VPN-Tunnels oder das Beschreiben der Mikrotik-Skriptsprache.

Jetzt auch beliebt: