Оборудование Mikrotik отлично подходит для организации филиальной VPN-сети. В центре ставим что-нибудь мощное из 1000-ой или 1100-ой серии (они, кстати, имеют на борту модуль аппаратного шифрования), а в регионы RB750 и выше.
Настройка IPSEC-VPN не представляет никакой сложности после ознакомления с документацией, при этом следует внимательно отнестись к выбору алгоритмов аутентификации и шифрования исходя из требуемого уровня безопасности и производительности. На мой взгляд, оптимальным является auth: md5 с enc:aes-256.
После отработки настройки туннелей, встает вопрос об обеспечении их отказоустойчивости: понятно, что необходимо минимум два канала в Интернет на каждой стороне, и N+1 роутеров в горячем или холодном резерве. Многолетний опыт эксплуатации RouterBOARD показывает, что холодного резерва вполне достаточно, т.к. оборудование очень надёжно (при желании конечно можно сделать горячий резерв на базе VRRP).

Переключение туннелей, конечно, будем реализовывать с помощь скриптов.

На центральном устройстве создаём по одному скрипту на каждую удалённую площадку, скрипт «ipsec-center-region1»:

###################################################################
#Name:		Autoscript for Ipsec
#Version:	1.5.0
#Created:	Andrey Orlov
#Email:		tangarus(a)gmail.com
#Web:		http://www.tangarus.ru/
#Date:		10.2012
#Description:Автоматическое переключение IPSEC-VPN на RouterOS
####################################################################
 
####
#	Vars
####
 
:local PingCount 3
 
#Destinations
:local Center2	213.x.x.3
:local Center1	62.x.x.138
 
:local RemoteA 80.x.x.130
:local RemoteB 212.x.x.78
 
 
####
#      Ping Ochakovo:
:local StatusA1 [/ping $RemoteA count=$PingCount src-address=$Center1]
:local StatusA2 [/ping $RemoteA count=$PingCount src-address=$Center2]
:local StatusB1 [/ping $RemoteB count=$PingCount src-address=$Center1]
:local StatusB2 [/ping $RemoteB count=$PingCount src-address=$Center2]
###
 
 
####
# Templates
####
:local EnableA1 [:parse (":if ([/ip ipsec policy get [find sa-src-address=$Center1 sa-dst-address=$RemoteA] disabled]=true) do={/ip ipsec policy set [find sa-src-address=$Center1 sa-dst-address=$RemoteA] disabled=no}")];
:local DisableA1 [:parse (":if ([/ip ipsec policy get [find sa-src-address=$Center1 sa-dst-address=$RemoteA] disabled]=false) do={/ip ipsec policy set [find sa-src-address=$Center1 sa-dst-address=$RemoteA] disabled=yes}")];
####
:local EnableA2 [:parse (":if ([/ip ipsec policy get [find sa-src-address=$Center2 sa-dst-address=$RemoteA] disabled]=true) do={/ip ipsec policy set [find sa-src-address=$Center2 sa-dst-address=$RemoteA] disabled=no}")];
:local DisableA2 [:parse (":if ([/ip ipsec policy get [find sa-src-address=$Center2 sa-dst-address=$RemoteA] disabled]=false) do={/ip ipsec policy set [find sa-src-address=$Center2 sa-dst-address=$RemoteA] disabled=yes}")];
 
####
:local EnableB1 [:parse (":if ([/ip ipsec policy get [find sa-src-address=$Center1 sa-dst-address=$RemoteB] disabled]=true) do={/ip ipsec policy set [find sa-src-address=$Center1 sa-dst-address=$RemoteB] disabled=no}")];
:local DisableB1 [:parse (":if ([/ip ipsec policy get [find sa-src-address=$Center1 sa-dst-address=$RemoteB] disabled]=false) do={/ip ipsec policy set [find sa-src-address=$Center1 sa-dst-address=$RemoteB] disabled=yes}")];
####
:local EnableB2 [:parse (":if ([/ip ipsec policy get [find sa-src-address=$Center2 sa-dst-address=6$RemoteB] disabled]=true) do={/ip ipsec policy set [find sa-src-address=$Center2 sa-dst-address=$RemoteB] disabled=no}")];
:local DisableB2 [:parse (":if ([/ip ipsec policy get [find sa-src-address=$Center2 sa-dst-address=$RemoteB] disabled]=false) do={/ip ipsec policy set [find sa-src-address=$Center2 sa-dst-address=$RemoteB] disabled=yes}")];
 
####
 
####
############################## IPsec ######
:if ($StatusA1>0) do={
$DisableA2;
$DisableB1;
$DisableB2;
delay 2;
:put "A1"
$EnableA1;
}
:if (($StatusA1=0)&&($StatusA2>0)) do={
:put "A2"
$DisableA1;
$DisableB1;
$DisableB2;
 
delay 2;
$EnableA2;
:put "A2"
}
:if (($StatusA1=0)&&($StatusA2=0)&&($StatusB1>0)) do={
:put "B1"
$DisableA1;
$DisableA2;
$DisableB2;
 
delay 2;
$EnableB1;
:put "B1"
}
:if (($StatusA1=0)&&($StatusA2=0)&&($StatusB1=0)&&($StatusB2>0)) do={
:put "B2"
$DisableA1;
$DisableA2;
$DisableB1;
 
delay 2;
$EnableB2;
:put "B2"
}
######################## End of IPsec #####

и выполняем его с помощью шедулера:

/system scheduler add disabled=no interval=21s name=test-ipsec-center-region1 on-event="/system script run ipsec-center-region1" policy=reboot,read,write,policy,test,password,sniff,sensitive start-date=jan/01/1970 start-time=00:00:00

Необходимо обратить внимание на интервал, он не должен быть меньше чем время выполнения скрипта при «упавшем» канале, но увеличение его приводит к задержке в реакции.

На региональном устройстве работает аналогичный скрипт «ipsec-region1-center»:

###################################################################
#Name:		Autoscript for Ipsec
#Version:	1.5.0
#Created:	Andrey Orlov
#Email:		tangarus(a)gmail.com
#Web:		http://www.tangarus.ru/
#Date:		10.2012
#Description:Автоматическое переключение IPSEC-VPN на RouterOS
####################################################################
 
####
#	Vars
####
 
:local PingCount 3
 
#Destinations
:local Center2	213.x.x.3
:local Center1	62.x.x.138
 
:local RemoteA 80.x.x.130
:local RemoteB 212.x.x.78
 
####
#      Ping Center:
:local StatusA1 [/ping $Center1 count=$PingCount src-address=$RemoteA]
:local StatusA2 [/ping $Center2 count=$PingCount src-address=$RemoteA]
:local StatusB1 [/ping $Center1 count=$PingCount src-address=$RemoteB]
:local StatusB2 [/ping $Center2 count=$PingCount src-address=$RemoteB]
###
 
####
# Templates
####
:local EnableA1 [:parse (":if ([/ip ipsec policy get [find sa-src-address=$RemoteA sa-dst-address=$Center1] disabled]=true) do={/ip ipsec policy set [find sa-src-address=$RemoteA sa-dst-address=$Center1] disabled=no}")];
:local DisableA1 [:parse (":if ([/ip ipsec policy get [find sa-src-address=$RemoteA sa-dst-address=$Center1] disabled]=false) do={/ip ipsec policy set [find sa-src-address=$RemoteA sa-dst-address=$Center1] disabled=yes}")];
####
:local EnableB1 [:parse (":if ([/ip ipsec policy get [find sa-src-address=$RemoteB sa-dst-address=$Center1] disabled]=true) do={/ip ipsec policy set [find sa-src-address=$RemoteB sa-dst-address=$Center1] disabled=no}")];
:local DisableB1 [:parse (":if ([/ip ipsec policy get [find sa-src-address=$RemoteB sa-dst-address=$Center1] disabled]=false) do={/ip ipsec policy set [find sa-src-address=$RemoteB sa-dst-address=$Center1] disabled=yes}")];
 
####
:local EnableA2 [:parse (":if ([/ip ipsec policy get [find sa-src-address=$RemoteA sa-dst-address=$Center2] disabled]=true) do={/ip ipsec policy set [find sa-src-address=$RemoteA sa-dst-address=$Center2] disabled=no}")];
:local DisableA2 [:parse (":if ([/ip ipsec policy get [find sa-src-address=$RemoteA sa-dst-address=$Center2] disabled]=false) do={/ip ipsec policy set [find sa-src-address=$RemoteA sa-dst-address=$Center2] disabled=yes}")];
####
:local EnableB2 [:parse (":if ([/ip ipsec policy get [find sa-src-address=$RemoteB sa-dst-address=$Center2] disabled]=true) do={/ip ipsec policy set [find sa-src-address=$RemoteB sa-dst-address=$Center2] disabled=no}")];
:local DisableB2 [:parse (":if ([/ip ipsec policy get [find sa-src-address=$RemoteB sa-dst-address=$Center2] disabled]=false) do={/ip ipsec policy set [find sa-src-address=$RemoteB sa-dst-address=$Center2] disabled=yes}")];
####
 
############################## IPsec ######
:if ($StatusA1>0) do={
$DisableA2;
$DisableB1;
$DisableB2;
delay 2;
$EnableA1;
:if ($debug = true ) do={ :put "Selected A1";}
}
:if (($StatusA1=0)&&($StatusA2>0)) do={
$DisableA1;
$DisableB1;
$DisableB2;
delay 2;
$EnableA2;
:if ($debug = true ) do={ :put "Selected A2";}
}
:if (($StatusA1=0)&&($StatusA2=0)&&($StatusB1>0)) do={
$DisableA1;
$DisableA2;
$DisableB2;
delay 2;
$EnableB1;
:if ($debug = true ) do={ :put "Selected B1";}
}
:if (($StatusA1=0)&&($StatusA2=0)&&($StatusB1=0)&&($StatusB2>0)) do={
$DisableA1;
$DisableA2;
$DisableB1;
delay 2;
$EnableB2;
:if ($debug = true ) do={ :put "Selected B2";}
}
 
######################## End of IPsec #####

и его шедулер:

/system scheduler add comment="" disabled=no interval=21s name=test-ipsec-region1-center on-event="/system script run ipsec-region1-center" policy=reboot,read,write,policy,test,password,sniff,sensitive start-date=jan/01/1970 start-time=00:00:00

Сконфигурированная таким образом VPN сеть работает сейчас в одном месте с 23 конечными точками без каких-либо проблем.