MikroTik和Kerio Control之间的IPSec VPN连接



初始参数:

  1. 具有两个边界代理的企业总部,Kerio Control v.9.2.9内部版本3171(在Kerio后面有一个Cisco 3550交换机,用于确定办公室本地网络的配置)。
  2. 每个Kerio都有两个通道,负载均衡高达ISP(在图中为ISP#1和ISP#2),带有静态白色IP。
  3. 从远程办公室的一侧,安装了MikroTik 951G-2HnD(OS v.6.43.11)。
  4. 两个ISP来到MikroTik(在图中为ISP#3和ISP#4)。

在撰写本文时,在总部和远程办公室中,与提供者的连接都是双绞线。

任务清单:


  1. 在MikroTik和Kerio Control之间建立IPSec VPN连接,其中MikroTik将作为发起者。
  2. 确保VPN连接的容错能力,即 除了MikroTik必须监视其ISP的性能这一事实之外,它还必须监视每个Kerio服务器的可用性,并确定将通过哪个通道(通过Kerio的哪个ISP)进行连接。
  3. 提供更改MikroTik连接到Kerio的网络地址的功能。 这是由于Kerio(而不是路由器)位于“边界”总部这一事实。


我们从输出中得到什么?


  1. 启动MikroTik(scheduleStartup)后,将组织到企业网络的通道(该通道将由MikroTik启动),从而使远程用户无需启动Kerio Client即可使用公司资源,而无需使用操作系统建立额外的VPN连接;
  2. MikroTik将实现故障转移,该故障转移将自动切换到实时ISP;
  3. 您可以通过将配置为连接到Kerio Control的对等方的隶属关系更改为MikroTik中的一个或另一个策略模板组,来设置连接到企业网络的优先级。
  4. MikroTik将能够自动监视Kerio Control服务器的性能,并且如果与优先级的连接断开,则可以独立切换到实时频道;
  5. 如果您的Kerio Control服务器发布在外部DNS服务器上,则MikroTik将能够跟踪其IP地址的更改(例如,如果您的提供商更改),并且可以独立地对其配置进行更改(scriptSetIPSecSADstAddrFromDNS)。


我必须马上说这篇文章不是教程(原则上,我在配置创建前两个月(2017年底)就熟悉路由器,尤其是MikroTik),并且没有解决“为什么?”的问题,请点击此处。给出了在实际企业中使用的MikroTik的工作配置的说明。

注意事项:
  1. 要在将脚本代码传输到MikroTik时保留俄语注释,请在将文本复制到缓冲区之前以及从缓冲区插入之前,确保已打开俄语键盘布局;
  2. 如果发现日志记录脚本是多余的,则可以注释掉或删除带有“日志警告”和“日志错误”的行;
  3. 您可能还会注意到代码中注释了“日志警告”和“日志错误”,这是尝试增加使用英语日志功能的尝试...


因此,让我们开始吧:

基本参数:

  1. 上级组织的网络(在Kerio后面)是192.168.77.0/24(此处我们使用Kerio在企业网络中所在的网络的地址)
  2. 分支机构网络(在MikroTik之后)-192.168.11.0/24
  3. 连接到Kerio Control#1-192.168.22.0/24时,分支网络将映射到的网络
  4. 连接到Kerio Control#2-192.168.33.0/24时,分支网络将映射到的网络
  5. ISP#1池(Kerio#1)的IP地址-11.11.11.111
  6. ISP#2池(Kerio#1)中的IP地址-22.22.22.111
  7. ISP#1池(Kerio#2)的IP地址-11.11.11.222
  8. ISP#2池(Kerio#2)的IP地址是22.22.22.222
  9. ISP#3池(MikroTik)的IP地址-33.33.33.111
  10. ISP#4池(MikroTik)的IP地址-44.44.44.111

首先要做的是在MikroTik上启用DDNS:

/ip cloud set ddns-enabled=yes 

由于MikroTik将没有静态的白色IP地址,因此配置和脚本的进一步工作基于DDNS的使用。

IP ---> Cloud也用于确定MikroTik的外部IP地址,它从Internet上查找。

现在,我们配置Kerio Control#1,以便以后不再使用它:
我们转到“接口”部分,并添加新的“ VPN隧道”接口...

Kerio Control中的隧道配置
1.在名称字段中,为接口分配一个名称;
2.将开关置于“被动-仅接受传入连接”位置;
3.输入请假“ IPSec”;
4.选项卡“身份验证”:

  • 4.1在“预定义的密钥:”字段中,输入将用于连接的密钥;
  • 注意事项:

    我绝对建议在一个特定的Kerio服务器上创建的所有VPN隧道中设置所有关键短语!

    这是由于Kerio具有一个浮动错误,如下所示。

    想象一下,在我的情况下,在Kerio配置中,有多个配置为连接到MikroTik的“ VPN隧道”接口,它们的区别仅在于“本地ID:”字段中的设置(将在下面讨论)。

    因此,在创建(我称之为)隧道时,无论Kerio将与哪个外部IP地址联系MikroTik,Kerio(出于某种原因)都将激活遇到的第一个接口,并且如果设置中指定了IP地址Kerio一侧的隧道与MikroTik所指的隧道不同,该隧道没有组织。

    并且在为所有隧道指示了不同的关键词的情况下,该问题停止了。
  • 4.2在“本地ID:”字段中,输入ISP#1地址池中的IP地址(在示例11.11.11.111中),该地址池分配给MikroTik将访问的Kerio Control#1 WAN接口;
  • 4.3在“远程ID:”字段中,输入FQDN,它是我们的MikroTik从DDNS(IP --->云---> DNS名称)获得的。 此设置使我们不必担心ISP MikroTik如何访问Kerio。
  • 4.4在“阶段1密码(IKE):”字段中,从列表中选择aes128-sha1-modp2048。
  • 4.5在“阶段2密码(ESP):”字段中,从列表中选择3des-sha1-modp2048。
  • 注意事项:
    编辑通过“更改...”按钮使用的默认设置;
    使用“科学戳方法”选择两种密码。

5.选项卡“远程网络”:

在这里,我们输入连接到此特定Kerio Control服务器时MikroTik将使用的本地网络的IP地址(在示例中为192.168.22.0/24)。
重要! 在所有其余的(在我的情况下,这取决于来自Kerio的ISP的数量),在此Kerio服务器上的MikroTik上的隧道,必须指示相同的IP地址!

让我提醒您,这是由于需要配置从总部网络到该网络的路由。

6.选项卡“局域网”:

  • 6.1取消选中“使用自动检测到的本地网络”框;
  • 6.2设置“使用自定义网络:”复选框,并将网络地址添加到网络列表中,以“覆盖” Kerio Control后面的本地网络中使用的整个地址范围(在示例中为192.168.0.0/16)。

对于同一台Kerio服务器上的第二条隧道,我们重复上述所有步骤。

第二个隧道配置将仅通过使用与ISP#2地址池不同的密码短语(第4.1节)和不同的外部IP地址(第4.2节)(在示例中为22.22.22.111)而有所不同。

Kerio Control#2设置与上述设置相同,除了在“远程网络”选项卡(p。5)上指示的网络地址(在示例中为192.168.33.0/24)以及“本地ID:”字段中的IP地址(第4.2节),应从分配给Kerio Control#2 WAN接口的IP地址中选择(在示例中为11.11.11.222和22.22.22.222)。

接下来,我们创建一个允许规则,以从MikroTik ping我们的Kerio ...

Kerio控制中的Ping规则
我们转到“交通规则”部分,并使用以下参数创建新规则:

  • 来源-表示我们的MikroTik从DDNS收到的FQDN;
  • 目标-防火墙
  • 服务-平;
  • 您也可以指定IP版本(IPv4),但这不是必需的。

我们使用您可以理解的名称保存该规则,并将其拖到规则列表的最上方。

我们在第二台Kerio服务器上重复相同的过程。

不要忘记在总部旁边的交换机或路由器中的MikroTik后面的网络上注册路由,以便总部网络知道将流量定向到何处(在我的情况下,这是网络192.168.22.0/24和192.168.33.0/24上的两条静态路由)。

从总部开始,我们做了所有事情,现在我们转到MikroTik。

让我们从创建用于组织和测试VPN隧道的基本配置对象开始。

第一步是创建本地子网地址列表。 我们将在防火墙规则中使用它。

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

接下来,为IKE通信量创建一个允许规则,并将其放置在规则列表的顶部。

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

然后将两个规则添加到防火墙过滤器以处理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" 

...并将它们移动到放置规则上方的位置,该规则禁止从LAN外部传入流量。 在我的默认配置中,它带有注释“ defconf:丢弃所有不是来自LAN的内容”

转到“防火墙缠结”并创建以下规则:

 /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 

接下来,我们在防火墙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 

重要! 这些规则应置于伪装规则之上。

现在,我们转到IP ---> IPSec部分,在这里我们需要创建一个策略,对等方,策略模板组(我将在后面讨论它们的目的)和建立第二阶段密码的建议。

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


ip ipsec策略组
 /ip ipsec policy group add name=1 add name=2 add name=3 add name=4 


ip ipsec对等体
 /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 


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 


评论:

1. / ip ipsec proposal-输入在“阶段2加密(ESP):”字段中配置Kerio Control时指定的相同加密参数。

注意事项:

注意参数“名称= KerioVPNProposal#01”。

不必专门使用此名称,但是如果您决定使用其他名称,则在更改它之后,您需要检查并在必要时更改关联的IPSec策略的设置,以及在脚本scriptCheckActiveVpnServer中更改DefKerioPropName变量的分配值。进一步讲。

(实际上,描述的配置中对象的大多数名称和注释都是在脚本中使用的,因此,由于需要对脚本代码进行更改,因此重命名它们可能会给您带来一些不便。我将尝试在文本中做适当的注释以方便搜索此类对象。)

2. / ip ipsec策略组

创建组的原因是,将来我们将在脚本中处理它们的名称(1、2,... n),并使用它们来确定我们将要访问的Kerio服务器的IP地址的优先级。

我一次创建四个组。 我有两个ISP,每个Kerio都有两个外部IP。 目前,我们在此阶段仅使用一组。

3. / ip ipsec对等

在对等方中,指定:

  • 地址-Kerio的IP地址,它将与MikroTik联系。 应该指定与我们在/ ip ipsec策略sa-dst-address中输入的地址相同的地址,仅使用掩码“ / 32”;
  • 本地地址-MikroTik的IP地址,可从其中访问Kerio。 应该指定与我们在/ ip ipsec策略sa-src-address中输入的地址相同的地址;
  • 验证码 方法-从列表中选择“预共享密钥”;
  • 交换模式-从列表中选择main-l2tp;
  • 如果已设置,请取消选中“被动”框;
  • 秘密-在“身份验证”选项卡上的“预定义密钥:”字段中,输入在Kerio上配置VPN接口时输入的密码。
  • 策略模板组-从列表中选择我们之前创建的名称为“ 1”的组;
  • 取消选中NAT遍历;
  • 我的ID类型-从列表中选择值“ fqdn”;
  • 我的ID-输入MikroTik在DDNS中分配的FQDN;
  • 在“加密”选项卡上,选择在Kerio上配置VPN接口时输入的加密参数,在“身份验证”选项卡的“第一阶段(IKE)密码:”字段中;
  • 注释( 警告!在脚本中使用! )。

在注释中,我指出了我的服务器的完整技术FQDN,这些FQDN已发布在为我的外部区域提供服务的DNS服务器上。

除了使用此配置之外,这还使我能够保持有关所使用的Kerio服务器的外部IP地址的最新信息(我只需要更改外部DNS服务器上的IP地址,它将自动更改为MikroTik( 此处为文章))。

对于那些懒得理解的人,我引用了工作代码:

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

脚本列表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") 


适用于对等方中的注释的基本规则是,名称必须以任何字母和/或数字开头,且不能带空格,后跟一个强制连字符 (“-”),然后是任意数量的任意字符。

我使用以下格式:

vsNN-pNN-NN.domain.ru

其中:

vsNN-vpn-server #NN(这部分注释在脚本中处理,并在IP --->防火墙--->地址列表中使用(见下文));
pNN-ISP #NN;
NN-提供商在Kerio上发布给我的地址池中的外部IP地址的序列号;

4. / ip ipsec策略

在政治中,我们定义:

  • Dst。 地址-Kerio后面的网络地址(dst-address);
  • Src。 地址-MikroTik将为其本地网络屏蔽的网络地址(请参阅下面的IP设置--->防火墙---> NAT)。 从Kerio端可以看到该网络地址(我们在“远程网络”选项卡上的Kerio上配置VPN接口时指定了该地址);
  • 协议-255(全部);
  • 动作-加密;
  • 级别-要求;
  • IPSec协议-esp;
  • 设置参数tunnel = yes;
  • SA Src。 地址-MikroTik的外部IP地址,将从中访问Kerio(sa-src-address);
  • SA Dst。 地址-将与MikroTik联系的Kerio的IP地址(sa-dst-address);
  • 提议-在/ ip ipsec提议部分中输入分配给name参数的值(在此配置中-KerioVPN提议#01);
  • 注释( 警告!用在脚本中! )-KerioVPNPolicy。

如果一切都正确完成,则在保存策略后,“已建立”值应出现在“ PH2状态”字段中,这表明在MikroTik和Kerio之间安装了VPN通道。
您可以通过在Kerio Control中检查VPN接口的状态来验证这一点。 此处,在“信息”字段中,与建立连接的接口相对的位置,应显示题词“建立与IP_your_MikroTik的连接”。

我们继续...

现在,我们将为Kerio服务器的所有其余IP地址创建对等方(在我的配置中,有必要再创建三个对等方)。

为此,我们需要重复第3段(/ ip ipsec对等端)中指示的所有步骤,但要注意以下更改:

  • 地址-更改Kerio的IP地址;
  • 秘密-输入与正在创建的连接有关的密码(pass2222,pass3333,... passNNNN);
  • 策略模板组-从列表(2,3,... n)中选择列表中的下一个组。

注意事项:

然后,您可以随时通过更改对等设置中的组来更改服务器的优先级。

  • 注释-在我的情况下,它更改为另一个Kerio服务器FQDN。

所有其他参数的输入均与第一个宴会相同。 那些需要更改的内容将由脚本处理,您现在可以不变地复制它们。

连接脚本工作之前进行配置的最后一步是使MikroTik作为常量存储库工作,我们将在脚本中使用该常量...
在防火墙地址列表中添加两个列表( 警告!在脚本中使用! ):

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

在其中,我们参考Kerio服务器名称前缀指示网络的地址,我们将在其中映射出站VPN流量。

好吧,为了使所有这些丢脸的工作自动化,我们添加了两个脚本和三个时间表(如果您决定重命名脚本,请不要忘记对代码进行适当的更改)

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

脚本清单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 

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 

scheduleStartup
 :global StartupScript true :global RepeatRun false /system script run scriptFunctionsList 


scheduleCheckIPSecSADstAddrFromDNS
 /system script run scriptSetIPSecSADstAddrFromDNS 


scheduleCheckActiveVpnServer
 /system script run scriptCheckActiveVpnServer 



:
MikroTik DNS- , Kerio Control, MikroTik, IP ---> DNS ---> Static…

- !

, …

感谢您的关注!

ps
:
  1. « ?:»;
  2. ;
  3. IP- , ISP, ;
  4. « :»;

Source: https://habr.com/ru/post/zh-CN439736/


All Articles