====== Mikrotik и несколько провайдеров. Резервирование каналов ======
В данной статье мы не будем рассматривать базовую настройку роутера: выход в интернет, правила брандмауэра и т.п., будем считать, что читатель владеет этими вещами и уделим внимание только обеспечению резервирования внешних каналов.
Ниже показана схема, реализованная в нашей лаборатории с указанием адресов и интерфейсов, подключенных к двум условным провайдерам, а также их шлюзы.
{{https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/hardware/microtik/Mikrotik-2-ISP-Failover-002-thumb-600xauto-17021.png?nolink&}}
Для правильной работы всех описанных ниже способов вам потребуется отключить динамическое добавление маршрутов, которое может быть включено если вы получаете сетевые настройки от провайдера по DHCP или используете PPPoE:
{{https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/hardware/microtik/Mikrotik-2-ISP-Failover-003-thumb-600xauto-17024.png?nolink&}}
**Важно!** Во время выполнения операций с настройкой маршрутов у вас кратковременно пропадет доступ в интернет. Поэтому все указанные действия следует выполнять **имея физический доступ** к устройству.
Хотя можно обойтись и без этого, просто перед настройкой создайте дополнительный нулевой маршрут через основной шлюз и укажите ему самую меньшую административную дистанцию. Но помните, что любое неверное ваше действие грозит потерей сетевого доступа к устройству из внешней сети.
==== Резервирование на основе дистанции маршрута ====
Самый простой, можно даже сказать примитивный способ, в этом случае мы добавляем два маршрута с разной административной дистанцией и включаем проверку доступности шлюза для них.
Для этого перейдем в** IP - Routes** и добавим маршрут к первому провайдеру: **Dst. Address** - оставляем по умолчанию - **0.0.0.0/0**, **Gateway** - указываем шлюз первого провайдера, в нашем случае **192.168.3.1**, включаем механизм проверки доступности шлюза - **Check Gateway - ping**, и устанавливаем административную дистанцию маршрута - **Distance - 1**.
{{https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/hardware/microtik/Mikrotik-2-ISP-Failover-004-thumb-600xauto-17027.png?nolink&}}
Эти же действия в терминале:
/ip route
add check-gateway=ping distance=1 gateway=192.168.3.1
Аналогичным образом добавляем маршрут ко второму провайдеру, только указываем административную дистанцию **Distance - 2**. В данном случае абсолютные цифры не так важны, при наличии нескольких маршрутов к одному адресу назначения работать будет тот, у которого административная дистанция меньше.
{{https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/hardware/microtik/Mikrotik-2-ISP-Failover-005-thumb-600xauto-17030.png?nolink&}}
Или в терминале:
/ip route
add check-gateway=ping distance=2 gateway=192.168.233.2
После этого у вас появится интернет и будет активен маршрут через первого провайдера:
{{https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/hardware/microtik/Mikrotik-2-ISP-Failover-006-thumb-600xauto-17033.png?nolink&}}
Теперь имитируем аварию, в нашем случае мы просто отключим патч-корд от интерфейса **ether1**, через небольшое время роутер обнаружит недоступность шлюза и сделает маршрут не активным, после чего автоматически заработает маршрут через второго провайдера и трафик пойдет туда.
{{https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/hardware/microtik/Mikrotik-2-ISP-Failover-007-thumb-600xauto-17036.png?nolink&}}
После восстановления доступности шлюза провайдера обратное переключение произойдет автоматически.
==== Резервирование при помощи рекурсивной маршрутизации ====
Предыдущий способ имеет один серьезный недостаток, он проверяет доступность шлюза провайдера, но не проверяет наличие интернета за этим шлюзом, и вы можете оказаться в ситуации, когда интернет отсутствует, но переключения на резервный канал не произошло. Чтобы избежать такой ситуации следует проверять доступность не шлюза провайдера, а внешних высокодоступных узлов.
Один из методов, позволяющих это сделать, называется рекурсивной маршрутизацией, мы подробно рассматривали ее в отдельной статье, поэтому здесь просто покажем последовательность настройки, не вдаваясь в подробности.
Прежде всего выберем два высокодоступных узла, в нашем случае это будут **8.8.8.8** и **9.9.9.9** и пропишем к каждому из них маршрут через шлюзы первого и второго провайдеров.
Переходим в **IP - Routes** и создаем маршрут:** Dst. Address - 8.8.8.8** - узел для проверки первого провайдера, **Gateway - 192.168.3.1** - шлюз первого провайдера, **Distance - 1, Scope - 10**. Обратите внимание на значение **области (Scope)**, если вы оставите там значение по умолчанию - 30, то рекурсивная маршрутизация работать не будет! Затем добавим второй аналогичный маршрут, но уже к узлу **9.9.9.9** через шлюз второго провайдера.
{{https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/hardware/microtik/Mikrotik-2-ISP-Failover-008-thumb-600xauto-17039.png?nolink&}}
Тоже самое быстро в терминале:
/ip route
add distance=1 dst-address=8.8.8.8/32 gateway=192.168.3.1 scope=10
add distance=1 dst-address=9.9.9.9/32 gateway=192.168.233.2 scope=10
Теперь добавим рекурсивные маршруты для каждого из провайдеров со следующими настройками: **Dst. Address** оставляем по умолчанию - **0.0.0.0/0**, **Gateway - 8.8.8.8** - высокодоступный узел для первого провайдера, **Check Gateway - ping** - указываем проверку доступности шлюза, **Distance - 1**. Для второго провайдера все тоже самое, но **Gateway - 9.9.9.9 ** и **Distance - 2**.
{{https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/hardware/microtik/Mikrotik-2-ISP-Failover-009-thumb-600xauto-17042.png?nolink&}}
В терминале воспользуйтесь командами:
/ip route
add check-gateway=ping distance=1 gateway=8.8.8.8
add check-gateway=ping distance=2 gateway=9.9.9.9
Мы сейчас не будем вдаваться в подробности как это работает, для этого есть отдельная статья, но общий смысл заключается в том, что рекурсивные маршруты в итоге работают через реальные шлюзы провайдеров, но проверяют доступность не провайдерского шлюза, а высокодоступного узла за ним. Если связь пропала - маршрут деактивируется и начинает работать следующий, с большей дистанцией.
На рисунке ниже мы можем видеть, что активный маршрут переключился на резервный канал несмотря на то, что шлюз основного провайдера доступен:
{{https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/hardware/microtik/Mikrotik-2-ISP-Failover-010-thumb-600xauto-17045.png?nolink&}}
При восстановлении работы первого провайдера обратное переключение произойдет автоматически.
==== Резервирование при помощи Netwatch ====
Прежде всего добавим маршруты к каждому из провайдеров с разными дистанциями, никаких проверок включать не надо, но обязательно следует добавить к каждому маршруту комментарий, в нашем случае это будут **"ISP1"** и **"ISP2"**.
{{https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/hardware/microtik/Mikrotik-2-ISP-Failover-011-thumb-600xauto-17048.png?nolink&}}
В терминале:
/ip route
add comment=ISP1 distance=1 gateway=192.168.3.1
add comment=ISP2 distance=2 gateway=192.168.233.2
Затем выбираем высокодоступный хост и добавляем к нему маршрут через первого провайдера:
{{https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/hardware/microtik/Mikrotik-2-ISP-Failover-012-thumb-600xauto-17051.png?nolink&}}
Эти же действия в терминале:
/ip route
add distance=1 dst-address=8.8.8.8/32 gateway=192.168.3.1
Затем переходим в **Tools - Netwatch** и добавляем там новый узел, на закладке **Host** указываем адрес выбранного высокодоступного узла, при необходимости меняем интервал опроса.
{{https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/hardware/microtik/Mikrotik-2-ISP-Failover-013.png?nolink&}}
На закладе **Up** вводим следующий скрипт:
/ip route set [find comment="ISP1"] disabled=no
/ip route set [find comment="ISP2"] disabled=yes
Затем на закладке **Down**:
/ip route set [find comment="ISP1"] disabled=yes
/ip route set [find comment="ISP2"] disabled=no
Их смысл предельно прост, если узел через первого провайдера доступен, то включаем маршрут с меткой ISP1, а маршрут с меткой ISP2 выключаем, если недоступен - то делаем ровно наоборот.
В терминале все это можно быстро сделать при помощи "заклинания":
/tool netwatch
add down-script="/ip route set [find comment=\"ISP1\"] disabled=yes\r\
\n/ip route set [find comment=\"ISP2\"] disabled=no" host=8.8.8.8 \
up-script="/ip route set [find comment=\"ISP1\"] disabled=no\r\
\n/ip route set [find comment=\"ISP2\"] disabled=yes"
Для проверки блокируем доступ через первого провайдера и убеждаемся, что переключение происходит:
{{https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/hardware/microtik/Mikrotik-2-ISP-Failover-014-thumb-600xauto-17055.png?nolink&}}
Обратное переключение произойдет автоматически после восстановления связи с высокодоступным узлом.