Mikrotik:VPNサーバーのアドレスを自動的に更新するようにIPsecを構成する

IPSecを構成するとき、遅かれ早かれ、誰もがリモートVPNサーバーのIPアドレスしか設定できないという事実に直面します。 IPsecポリシーおよびIPsecピア設定でDNSレコードを指定することはサポートされていません。



これにより、VPNサーバーが以下の場合に不便が生じる可能性があります。





最も単純なスキームでも、VPNサーバーの3つのルータークライアントの設定を変更する必要があることが明らかになります。







3つのルーターのそれぞれで、値を変更します。





実際には、数十および数百の顧客がいる場合、このプロセスの自動化が必要になります。 MicroDNSの標準機能であるDDNS、スクリプト、スケジューラを使用してこれを実装する方法を見てみましょう。



楽しみのために、このスキームを少し複雑にします。 中央のVPNサーバーには、クライアントが接続する2つのルーターがあります。







両方のVPNサーバーで会社が提供するDDNSを有効にします。 MikrotikはDDNSをRouterOSのお客様に無料サービスとして提供しています。



ip cloud set ddns-enabled=yes
      
      





その他のDDNSプロバイダー
私はDynDNSの有料DynECTサービスを使用していますが、作業のスキームはこれから変わりません。



結果を見ることができます:ドメインsn.mynetname.netで受信したAレコードは、VPNサーバーを指します。



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





クライアントとして機能するルーターに渡します。



IpSec / PolicyおよびIpSec / Peer設定で、各行のコメントに、VPNサーバーのDNS名に署名します。











次に、 SetIpSecDstAddrFromDnsスクリプトを追加します。これは、コメントからVPNサーバーのDNS名を受け取り、設定の値と比較します。



 :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) } } }
      
      





スケジューラにタスクを追加します。スケジューラは30秒ごとにスクリプトを実行し、VPNサーバーのアドレスが関連するかどうかを確認し、必要に応じて更新します。



ご清聴ありがとうございました。



PSこの記事は初心者向けではないため、VPNトンネルのセットアップやMikrotikスクリプト言語の説明など、最も単純なことは省略しました。



All Articles