
Parâmetros iniciais:
- A sede da empresa com dois proxies de borda Kerio Control v.9.2.9 build 3171 (atrás do Kerio, há um switch Cisco 3550 que determina a configuração da rede local do escritório).
- Cada Kerio possui dois canais com balanceamento de carga até o ISP (no diagrama - ISP # 1 e ISP # 2) com IPs brancos estáticos.
- Do lado do escritório remoto, o MikroTik 951G-2HnD (OS v.6.43.11) foi instalado.
- Dois ISPs chegam ao MikroTik (no diagrama são o ISP # 3 e o ISP # 4).
No momento da redação deste artigo, tanto na sede quanto na remota, a conexão com os provedores era de par trançado.
A lista de tarefas:
- Estabeleça uma conexão VPN IPSec entre o MikroTik e o Kerio Control, onde o MikroTik será o iniciador.
- Garanta a tolerância a falhas da conexão VPN, ou seja, Além do fato de o MikroTik precisar monitorar o desempenho de seus ISPs (artigo aqui ), também deve monitorar a disponibilidade de cada servidor Kerio e determinar o acesso através de qual canal (através do qual ISP do Kerio) a conexão será feita.
- Forneça a capacidade de alterar o endereço de rede com o qual o MikroTik se conecta ao Kerio. Isso se deve ao fato de o Kerio, e não um roteador, estar na sede da "fronteira".
O que obtemos na saída?
- Quando o MikroTik (scheduleStartup) é iniciado, um canal para a rede corporativa será organizado (o canal será iniciado pelo MikroTik), permitindo que um usuário remoto trabalhe com recursos corporativos sem iniciar o Kerio Client e sem configurar uma conexão VPN adicional usando o sistema operacional;
- O MikroTik implementará o Failover, que alterna automaticamente para um ISP ativo;
- Você pode definir prioridades para pontos de conexão com a rede corporativa alterando a afiliação de pares configurados para se conectar ao Kerio Control a um ou outro Grupo de Modelos de Política no MikroTik;
- O MikroTik poderá monitorar automaticamente o desempenho dos servidores Kerio Control e, se a conexão com o ponto de prioridade for interrompida, alterne para o canal ao vivo de forma independente;
- Se seus servidores Kerio Control forem publicados em servidores DNS externos, o MikroTik poderá rastrear alterações em seus endereços IP (por exemplo, se o seu provedor mudar) e fazer alterações independentemente em sua configuração (scriptSetIPSecSADstAddrFromDNS).
Devo dizer imediatamente que este artigo não é um tutorial (em princípio, eu me familiarizei com roteadores e, em particular, com o MikroTik apenas dois meses (final de 2017) antes da criação da configuração) e não aborda as perguntas “por quê?”, Ele estará aqui A descrição da configuração de trabalho do MikroTik, usada em uma empresa real, é fornecida.
Nota:- Para manter os comentários no idioma russo ao transferir o código de script para o MikroTik, antes de copiar o texto para o buffer e antes de inseri-lo, verifique se o layout do teclado russo está ativado;
- Se você achar que os scripts de log são supérfluos, pode comentar ou excluir linhas com "aviso de log" e "erro de log";
- Você também pode observar "aviso de log" e "erro de log" comentados no código, esta é uma tentativa de adicionar a capacidade de usar o log em inglês ...
Então, vamos começar:
Parâmetros básicos:- A rede da organização pai (atrás do Kerio) é 192.168.77.0/24 (aqui usamos o endereço da rede em que o Kerio está localizado na rede corporativa)
- Rede de filiais (atrás do MikroTik) - 192.168.11.0/24
- A rede na qual a rede da filial mapeará ao conectar-se ao Kerio Control # 1 - 192.168.22.0/24
- A rede na qual a rede da filial mapeará ao conectar-se ao Kerio Control # 2 - 192.168.33.0/24
- Endereço IP do pool do ISP # 1 (Kerio # 1) - 11.11.11.111
- Endereço IP do pool do ISP # 2 (Kerio # 1) - 22.22.22.111
- Endereço IP do pool do ISP # 1 (Kerio # 2) - 11.11.11.222
- O endereço IP do pool do ISP # 2 (Kerio # 2) é 22.22.22.222
- Endereço IP do pool do ISP # 3 (MikroTik) - 33.33.33.111
- Endereço IP do pool do ISP # 4 (MikroTik) - 44.44.44.111
A primeira coisa a fazer é ativar o DDNS no MikroTik:
/ip cloud set ddns-enabled=yes
Devido ao fato de o MikroTik não ter um endereço IP branco estático, o trabalho adicional da configuração e dos scripts é baseado no uso do DDNS.
Também o IP ---> Cloud é usado para determinar o endereço IP externo do MikroTik, a partir do qual ele se parece na Internet.
Agora vamos configurar o Kerio Control # 1, para que depois não voltemos a ele:
Vamos para a seção "Interfaces" e adicionamos a nova interface "VPN tunnel" ...
Configuração de túnel no Kerio Control1. No campo nome, atribua um nome à interface;
2. Coloque o interruptor na posição "Passivo - aceita apenas conexões de entrada";
3. Digite leave "IPSec";
4. A guia "Autenticação":
- 4.1 No campo "Chave predefinida:", digite a frase-chave que será usada para conectar;
- Nota:
Eu recomendo categoricamente definir todas as frases-chave em todos os túneis VPN criados em um servidor Kerio específico!
Isso ocorre pelo fato de o Kerio ter um bug flutuante, que é expresso a seguir.
Imagine que na configuração do Kerio, como no meu caso, existem várias interfaces de "túnel da VPN" configuradas para conectar ao MikroTik, que diferem entre si apenas nas configurações do campo "Local ID:" (será discutido abaixo).
Portanto, ao criar (chamarei assim) um túnel de entrada, independentemente do endereço IP externo que o Kerio contatar o MikroTik, o Kerio (por algum motivo) ativará a primeira interface que aparecer, e se o endereço IP especificado nas configurações o túnel do lado do Kerio é diferente daquele ao qual o MikroTik se refere, o túnel não está organizado.
E no caso em que frases-chave diferentes são indicadas para todos os túneis, esse problema é interrompido. - 4.2 No campo “Local ID:”, digite o endereço IP do pool de endereços ISP # 1 (no exemplo 11.11.11.111) atribuído à interface WAN do Kerio Control # 1, à qual o MikroTik acessará;
- 4.3 No campo “Remote ID:”, digite o FQDN, obtido pelo MikroTik no DDNS (IP ---> Cloud ---> DNS Name). Essa configuração permite que não nos importemos com o modo como o ISP MikroTik acessa o Kerio;
- 4.4 No campo "Cifra de fase 1 (IKE):", selecione aes128-sha1-modp2048 da lista;
- 4.5 No campo "Cifra da fase 2 (ESP):", selecione 3des-sha1-modp2048 da lista;
- Nota:
Editar as configurações padrão usadas através do botão "Alterar ...";
Ambas as cifras são selecionadas usando o "método científico de cutucada".
5. A guia "Redes remotas":
Aqui, inserimos o endereço IP da rede local que o MikroTik usará ao se conectar a esse servidor Kerio Control em particular (no exemplo - 192.168.22.0/24).
Importante! Em todos os outros túneis (no meu caso, é determinado pelo número de ISPs do Kerio) no MikroTik, neste servidor Kerio, o mesmo endereço IP deve ser indicado!
Deixe-me lembrá-lo de que isso se deve à necessidade de configurar a rota para esta rede a partir da rede da matriz.
6. A guia "Redes Locais":
- 6.1 Desmarque a caixa "Usar redes locais detectadas automaticamente";
- 6.2 Defina a caixa de seleção "Usar redes personalizadas:" e adicione o endereço de rede "cobrindo" todo o intervalo de endereços usado na rede local atrás do Kerio Control à lista de redes (no exemplo - 192.168.0.0/16).
Repetimos todas as etapas acima para o segundo túnel no mesmo servidor Kerio.
A segunda configuração de túnel será diferente apenas usando uma frase secreta diferente (seção 4.1) e um endereço IP externo diferente do pool de endereços do ISP # 2 (seção 4.2) (no exemplo, 22.22.22.111).
As configurações do Kerio Control # 2 são idênticas às descritas acima, exceto o endereço de rede indicado na guia Redes remotas (p. 5) (no exemplo, 192.168.33.0/24) e, portanto, os endereços IP no campo ID local: Seção 4.2), que deve ser selecionada a partir dos endereços IP atribuídos às interfaces WAN do Kerio Control # 2 (no exemplo, 11.11.11.222 e 22.22.22.222).
Em seguida, criamos uma regra de permissão para executar ping no Kerio do MikroTik ...
Regra de ping no controle KerioVamos para a seção "Regras de tráfego" e criamos uma nova regra com os seguintes parâmetros:
- fonte - indica o FQDN que foi recebido pelo nosso MikroTik do DDNS;
- Destino - Firewall
- serviço - Ping;
- Você também pode especificar a versão IP (IPv4), mas isso não é necessário.
Nós salvamos a regra com um nome que seja compreensível para você e a arrastamos para o topo da lista de regras.
Repetimos o mesmo procedimento no segundo servidor Kerio.
Não se esqueça de registrar as rotas na rede atrás do MikroTik em switches ou roteadores no lado da matriz para que a rede da matriz saiba para onde direcionar o tráfego (no meu caso, são duas rotas estáticas nas redes 192.168.22.0/24 e 192.168.33.0/24).
Desde a matriz, fizemos tudo, agora estamos migrando para o MikroTik.
Vamos começar criando os objetos de configuração básica para organizar e testar o túnel da VPN.
O primeiro passo é criar uma lista de endereços de sub-rede local. Vamos usá-lo nas regras do firewall.
/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"
Em seguida, crie uma regra de permissão para o tráfego IKE e coloque-a no topo da lista de regras.
add action=accept chain=input comment="VPN Allow IKE" dst-port=500 protocol=udp
Em seguida, adicione duas regras ao filtro de firewall para trabalhar com o tráfego 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"
... e mova-os para uma posição imediatamente
acima da regra de queda , que proíbe o tráfego de entrada de fora da LAN. Na minha configuração padrão, foi com o comentário "defconf: solte tudo que não vem da LAN"
Vá para o Firewall Mangle e crie as seguintes regras:
/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
Em seguida, observamos no 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
Importante! Essas regras devem ser colocadas acima das regras de mascaramento.
Agora vamos para a seção IP ---> IPSec, onde precisamos criar uma política, pares, grupos de modelos de política (discutirei seu objetivo posteriormente) e uma proposta para configurar a cifra da fase 2.
proposta ip ipsec /ip ipsec proposal add enc-algorithms=3des name=KerioVPNProposal#01 pfs-group=modp2048
grupo de políticas 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
política 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
Comentário:
1. / proposta ip ipsec - insira os mesmos parâmetros de criptografia que especificamos ao configurar o Kerio Control no campo "Fase 2 de criptografia (ESP):".
Nota:Preste atenção no parâmetro "name = KerioVPNProposal # 01".
Não é necessário usar esse nome especificamente, mas se você decidir usar outro, depois de alterá-lo, precisará verificar e, se necessário, alterar a configuração da política IPSec associada, além de alterar o valor atribuído da variável DefKerioPropName no script scriptCheckActiveVpnServer, que será discutido discurso adicional.
(Na verdade, a maioria dos nomes e comentários de objetos na configuração descrita é usada em scripts, portanto, renomeá-los pode causar alguns inconvenientes devido à necessidade de fazer alterações no código do script. Tentarei fazer anotações apropriadas no texto para facilitar a busca por esses objetos.)
2. grupo de políticas ipsec / ip
A criação de grupos se deve ao fato de que, no futuro, processaremos seus nomes (1, 2, ... n) em scripts e os usaremos para priorizar os endereços IP dos servidores Kerio aos quais acessaremos.
Crio quatro grupos ao mesmo tempo. Eu tenho dois ISPs, com dois IPs externos em cada um do Kerio. Nesta fase, estamos usando apenas um grupo até agora.
3. / ip ipsec peer
Em pares, especifique:
- Endereço - endereço IP do Kerio, que será contatado com o MikroTik. O mesmo endereço que inserimos na política / ip ipsec sa-dst-address da política deve ser especificado, apenas com a máscara "/ 32";
- Endereço Local - Endereço IP do MikroTik, do qual o Kerio será acessado. O mesmo endereço que inserimos na política ipsec / ip sa-src-address deve ser especificado;
- Auth. Método - selecione "chave pré-compartilhada" na lista;
- Modo de troca - selecione main-l2tp na lista;
- Se definido, desmarque a caixa "Passivo";
- Segredo - digite a senha que inserimos quando configuramos a interface VPN no Kerio, na guia "Autenticação", no campo "Chave predefinida:";
- Grupo de modelos de política - selecione na lista o grupo que criamos anteriormente com o nome "1";
- Desmarque NAT Traversal;
- Meu tipo de ID - selecione o valor "fqdn" na lista;
- Meu ID - insira o FQDN atribuído pelo MikroTik no DDNS;
- Na guia "Criptografia", selecione os parâmetros de criptografia que inserimos quando configuramos a interface VPN no Kerio, na guia "Autenticação", no campo "Cifra IKE):";
- Comentário ( Aviso! Usado em scripts! ).
No comentário, indico o FQDN técnico completo dos meus servidores, publicados nos servidores DNS que atendem à minha zona externa.
Além de usar essa configuração, isso me permite manter informações atualizadas sobre os endereços IP externos dos servidores Kerio usados (só preciso alterar o endereço IP no servidor DNS externo e ele será alterado automaticamente para MikroTik (artigo
aqui )).
Para quem tem preguiça de entender, cito o código de trabalho:
/system script add dont-require-permissions=no name=scriptSetIPSecSADstAddrFromDNS owner=\ admin policy=read,write
Listagem de script 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")
A regra básica que se aplica ao comentário em pares é que o nome deve começar com qualquer letra e / ou número, sem espaços, seguido por um
hífen OBRIGATÓRIO ("-"), seguido por qualquer número de caracteres arbitrários.
Eu uso o seguinte formato:
vsNN-pNN-NN.domain.ru
Onde:
vsNN - vpn-server #NN (Esta parte do comentário é processada em scripts e usada em IP ---> Firewall ---> Address Lists (veja abaixo));
pNN - ISP #NN;
NN - número de série do endereço IP externo no pool de endereços emitidos para mim pelo provedor no Kerio;
4. / ip ipsec policy
Na política, definimos:
- Dst. Endereço - endereço de rede atrás do Kerio (endereço dst);
- Src. Endereço - o endereço de rede ao qual o MikroTik irá mascarar (consulte as configurações de IP ---> Firewall ---> NAT abaixo) sua rede local (endereço src). Este endereço de rede será visível do lado do Kerio (nós o especificamos quando configuramos a interface VPN no Kerio, na guia Redes Remotas);
- Protocolo - 255 (todos);
- Ação - criptografar;
- Nível - requer;
- Protocolos IPSec - esp;
- defina o parâmetro tunnel = yes;
- SA Src. Endereço - O endereço IP externo do MikroTik, do qual o Kerio será acessado (sa-src-address);
- SA Dst. Endereço - endereço IP do Kerio, para o qual o MikroTik será contatado (sa-dst-address);
- Proposta - Digite o valor atribuído ao parâmetro name na seção de proposta / ip ipsec (nesta configuração - KerioVPNProposal # 01);
- Comentário ( Aviso! Usado em scripts! ) - KerioVPNPolicy.
Se tudo for feito corretamente, depois de salvar a política, o valor "estabelecido" deve aparecer no campo "Estado do PH2", que indica a instalação de um canal VPN entre o MikroTik e o Kerio.
Você pode verificar isso verificando o status da interface VPN no Kerio Control. Lá, no campo "Informações", em frente à interface com a qual a conexão é feita, a inscrição "Conexão com o seu_MikroTik_IP_address é estabelecida" deve aparecer.
Continuamos ...
Agora criaremos pares para todos os endereços IP restantes dos servidores Kerio (na minha configuração é necessário criar mais três pares).
Para fazer isso, precisamos repetir todas as etapas indicadas no parágrafo 3 (/ ip ipsec peer), mas preste atenção às seguintes alterações:
- Endereço - altere o endereço IP do Kerio;
- Segredo - digite a senha relacionada à conexão que está sendo criada (pass2222, pass3333, ... passNNNN);
- Grupo de modelos de política - selecione o próximo grupo da lista (2, 3, ... n).
Nota:Em seguida, você pode alterar a prioridade de seus servidores a qualquer momento, alterando o grupo nas configurações de mesmo nível.
- Comentário - no meu caso, ele muda para outro FQDN do servidor Kerio.
Todos os outros parâmetros são inseridos da mesma forma que no primeiro banquete. Aqueles que precisarão ser alterados são processados por scripts e você pode copiá-los inalterados por enquanto.
A etapa final da configuração antes de conectar os scripts ao trabalho é fazer o MikroTik funcionar como um repositório de constantes, que usaremos nos scripts ...
Adicione duas listas às listas de endereços do firewall (
aviso! Usado em scripts! ):
/ip firewall address-list add address=192.168.22.0/24 list=vs01 add address=192.168.33.0/24 list=vs02
neles, indicamos os endereços das redes com referência aos prefixos de nome do servidor Kerio, nos quais mapearemos o tráfego VPN de saída.
Bem, para automatizar o trabalho de toda essa desgraça, adicionamos dois scripts e três agendas
(se você decidir renomear scripts, não se esqueça de fazer as alterações apropriadas no código) .
/system script add dont-require-permissions=no name=scriptFunctionsList owner=admin policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon
Listagem de script 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
Listagem de 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
Agendar lista de agendamento :global StartupScript true :global RepeatRun false /system script run scriptFunctionsList
Lista de programação scheduleCheckIPSecSADstAddrFromDNS /system script run scriptSetIPSecSADstAddrFromDNS
Lista de programação scheduleCheckActiveVpnServer /system script run scriptCheckActiveVpnServer
O toque final:para que o MikroTik entre em contato corretamente com os servidores DNS da empresa localizados atrás do Kerio Control, é necessário adicionar registros estáticos com seus endereços no MikroTik, na seção IP ---> DNS ---> Static ...Bem, em algum lugar assim!Espero nunca ter cometido um erro e não ter esquecido nada ...Obrigado pela atenção!
ps
Histórico de edições e alterações:- Adicionada seção “O que obtemos na saída?:”;
- Um comentário foi adicionado ao endereço de rede da empresa controladora;
- Foram alterados os endereços IP das redes dos pools de ISP usados na descrição da configuração;
- Adicionado o item "Toque final:";