
初始参数:
- 具有两个边界代理的企业总部,Kerio Control v.9.2.9内部版本3171(在Kerio后面有一个Cisco 3550交换机,用于确定办公室本地网络的配置)。
- 每个Kerio都有两个通道,负载均衡高达ISP(在图中为ISP#1和ISP#2),带有静态白色IP。
- 从远程办公室的一侧,安装了MikroTik 951G-2HnD(OS v.6.43.11)。
- 两个ISP来到MikroTik(在图中为ISP#3和ISP#4)。
在撰写本文时,在总部和远程办公室中,与提供者的连接都是双绞线。
任务清单:
- 在MikroTik和Kerio Control之间建立IPSec VPN连接,其中MikroTik将作为发起者。
- 确保VPN连接的容错能力,即 除了MikroTik必须监视其ISP的性能这一事实之外,它还必须监视每个Kerio服务器的可用性,并确定将通过哪个通道(通过Kerio的哪个ISP)进行连接。
- 提供更改MikroTik连接到Kerio的网络地址的功能。 这是由于Kerio(而不是路由器)位于“边界”总部这一事实。
我们从输出中得到什么?
- 启动MikroTik(scheduleStartup)后,将组织到企业网络的通道(该通道将由MikroTik启动),从而使远程用户无需启动Kerio Client即可使用公司资源,而无需使用操作系统建立额外的VPN连接;
- MikroTik将实现故障转移,该故障转移将自动切换到实时ISP;
- 您可以通过将配置为连接到Kerio Control的对等方的隶属关系更改为MikroTik中的一个或另一个策略模板组,来设置连接到企业网络的优先级。
- MikroTik将能够自动监视Kerio Control服务器的性能,并且如果与优先级的连接断开,则可以独立切换到实时频道;
- 如果您的Kerio Control服务器发布在外部DNS服务器上,则MikroTik将能够跟踪其IP地址的更改(例如,如果您的提供商更改),并且可以独立地对其配置进行更改(scriptSetIPSecSADstAddrFromDNS)。
我必须马上说这篇文章不是教程(原则上,我在配置创建前两个月(2017年底)就熟悉路由器,尤其是MikroTik),并且没有解决“为什么?”的问题,请点击此处。给出了在实际企业中使用的MikroTik的工作配置的说明。
注意事项:- 要在将脚本代码传输到MikroTik时保留俄语注释,请在将文本复制到缓冲区之前以及从缓冲区插入之前,确保已打开俄语键盘布局;
- 如果发现日志记录脚本是多余的,则可以注释掉或删除带有“日志警告”和“日志错误”的行;
- 您可能还会注意到代码中注释了“日志警告”和“日志错误”,这是尝试增加使用英语日志功能的尝试...
因此,让我们开始吧:
基本参数:- 上级组织的网络(在Kerio后面)是192.168.77.0/24(此处我们使用Kerio在企业网络中所在的网络的地址)
- 分支机构网络(在MikroTik之后)-192.168.11.0/24
- 连接到Kerio Control#1-192.168.22.0/24时,分支网络将映射到的网络
- 连接到Kerio Control#2-192.168.33.0/24时,分支网络将映射到的网络
- ISP#1池(Kerio#1)的IP地址-11.11.11.111
- ISP#2池(Kerio#1)中的IP地址-22.22.22.111
- ISP#1池(Kerio#2)的IP地址-11.11.11.222
- ISP#2池(Kerio#2)的IP地址是22.22.22.222
- ISP#3池(MikroTik)的IP地址-33.33.33.111
- 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
:- « ?:»;
- ;
- IP- , ISP, ;
- « :»;