Я настоятельно рекомендую сначала прочитать, далее вникнуть, потом понять и только после того, как у вас вся картина будет нарисована в голове, приступить к настройке.

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

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

Я не буду описывать некоторые очевидные нюансы которые описывал в основной части.

Начнём с чистого листа.

Наша схема

vasilevkirill multiwan mikrotik

Вспоминается мне история, о похабном поведении одного из участника хабра, который меня как то раз после статьи упрекал в том, что я использую 192.168.0.0 сеть, он не как не мог понять почему я взялся за сложный проект с такой сетью (говорил, что надо было переделать сеть), и я надеюсь мне не придётся объяснять, что такие сети до сих пор используются в корпоративных сетях, "да это неправильно, да это не удобно", но как есть.

Провайдер через PPP

Первый пример будет, о том когда вам провайдер предоставляет доступ в интернет, через какой либо туннель основанный на PPP, это может быть PPPoE, PPTP или L2TP.

Единственная особенность, заключается в том, что для подключения PPPoE вам нечего делать не надо так как он использует ethernet и вы явно указываете на каком интерфейсе поднимать клиента.

Интернет через PPPoE

Тут всё очень просто, поднимаем клиента.

/interface pppoe-client
add disabled=no interface=ether1 name=pppoe-ISP_1 password=1 user=1

Проверяем, что нам выдал провайдер

[admin@Router] > /ip address pr
Flags: X - disabled, I - invalid, D - dynamic 
 #   ADDRESS            NETWORK         INTERFACE                                                               
 0 D 1.1.1.1/32         192.168.0.255   pppoe-ISP_1                                                             
 1   192.168.0.1/24     192.168.0.0     bridge-local

И первая "проблема как многим кажется, это то, что адрес который назначил себе PPPoE сервер в первую очередь лежит в той же подсети, что и наша локальная сеть, а во вторых иногда встречается, что адрес шлюза может меняться, и нам он неизвестен.

Обходиться данная проблема очень просто. Так как соединение PPP, то некто нам не вправе запретить указать любой адрес удалённой стороны. Естественно руками мы задать его не можем на интерфейсе, так нам придётся указать и адрес наш, но он может быть динамический. Хорошим кейсом использовать профиль.

Создадим его

/ppp profile
add name=ISP_1-Client remote-address=172.31.1.1

Единственной особенностью данного профиля, мы указываем какой адрес будет использоваться для достижения удалённой стороны.

Теперь назначим данный профиль на наш PPPoE клиент

/interface pppoe-client
set dprofile=ISP_1-Client [find interface=ether1]

Передёрнем наш интерфейс, чтобы произошли изменения на основании профиля и видим, что теперь у нас данных шлюз не лежит в присоединённой сети и мы можем его использовать без каких либо оговорок в маршрутизации как шлюз и самое главное он всегда статичный.

[admin@Router] > /ip address pr
Flags: X - disabled, I - invalid, D - dynamic 
 #   ADDRESS            NETWORK         INTERFACE                                                               
 0   192.168.0.1/24     192.168.0.0     bridge-local                                                            
 1 D 1.1.1.1/32         172.31.1.1      pppoe-ISP_1

Единственное, что такой адрес не будет отвечать на пинги, но нам этого и не надо.

Теперь если необходимо отправить трафик через первого провайдера нам достаточно отправить в маршруту которого шлюз 172.31.1.1

На этом пока всё.

Интернет через L2TP

В нашем случае нам провайдер выдаёт настройки по DHCP и для доступа в интернет, нам необходимо поднять дополнительно L2TP туннель.

Настроим DHCP клиента.

/ip dhcp-client
add add-default-route=no disabled=no interface=ether2

С какими проблемами мы можем столкнутся при таком типе подключения при реализации multiwan.

  1. Должны использоваться DNS данного провайдера.
  2. Мы должны чтобы туннель строился обязательно через второго провайдера и адрес туннеля скорее всего лежит за пределами DHCP шлюза, значит нужен дефолтный маршрут.

С ДНС в версии 6.47 будет значительно проще так как появился форвард. Но пока она не long-term мы данную реализацию использовать не будем.

Сначала необходимо определиться с DNS

Посмотри какой DNS сервер нам выдал провайдер

[admin@Router] > /ip dhcp-client print detail 
Flags: X - disabled, I - invalid, D - dynamic 
 0   interface=ether2 add-default-route=no use-peer-dns=yes use-peer-ntp=yes dhcp-options="" status=bound 
     address=10.0.0.254/24 gateway=10.0.0.1 dhcp-server=10.0.0.1 primary-dns=22.22.22.22 expires-after=9m36s 

Если бы ДНС сервер был из той же сети, что и DHCP было бы значительно проще.

Наша задача сделать так, чтобы запросы к DNS шли через второго провайдера, так как через других провайдеров они могут не отвечать на запросы или отдавать другие данные при ответе.

Первое что приходит в голову, "а давайте сделаем маршрут до ДНС серверов ", Идея отличная ровно до того момента пока вам не прилетит другой DNS сервер, второй момент адрес шлюза может поменяться и статический маршрут мало чем поможет.

Решать мы будем простеньким скриптом и VRF, я не буду углубляться в нюансы в VRF просто обозначим, что это таблица маршрутизации которая изолированная от всех остальных.

Создадим VRF

/ip route vrf
add interfaces=ether2 routing-mark=VRF_ISP2

Укажем, что наш DHCP клиент должен устанавливать маршрут по умолчанию

/ip dhcp-client set add-default-route=yes [find interface=ether2]

Проверяем

[admin@Router] /ip route pr detail 
Flags: X - disabled, A - active, D - dynamic, C - connect, S - static, r - rip, b - bgp, o - ospf, m - mme, 
B - blackhole, U - unreachable, P - prohibit 
 0 ADS  dst-address=0.0.0.0/0 gateway=10.0.0.1 gateway-status=10.0.0.1 on VRF_ISP2 reachable via  ether2 
        distance=1 scope=30 target-scope=10 routing-mark=VRF_ISP2 vrf-interface=ether2 

 1 ADC  dst-address=10.0.0.0/24 pref-src=10.0.0.254 gateway=ether2 gateway-status=ether2 reachable distance=0 
        scope=10 routing-mark=VRF_ISP2 

 2 ADC  dst-address=172.31.1.1/32 pref-src=1.1.1.1 gateway=pppoe-ISP_1 gateway-status=pppoe-ISP_1 reachable 
        distance=0 scope=10 

 3 ADC  dst-address=192.168.0.0/24 pref-src=192.168.0.1 gateway=bridge-local 
        gateway-status=bridge-local reachable distance=0 scope=10

Видим, что два маршрута в таблице VRF

Вывод из WinBox

vasilevkirill multiwan mikrotik

Случающим шагом нам, необходимо сделать так, чтобы весь трафик который идёт на ДНС сервера второго провайдера, уходили через второго провайдера, т.е уходили через VRF таблицу.

И так, В первую очередь нам надо сделать loopback и создать псевдо-дефолтный маршрут для чего он нужен читайте основную статью.

/interface bridge add name=bridge-lo
/ip route add distance=253 gateway=bridge-lo

Теперь нам необходимо создать правило в mangle, чтобы трафик который уходит с маршрутизатора до определённых хостов из адрес листа, уходил через VRF

/ip firewall mangle
add action=mark-routing chain=output dst-address-list=list-VRF_ISP2 new-routing-mark=VRF_ISP2 passthrough=no

Другими словами, когда пакет будет уходить с маршрутизатора до ип адреса перечисленного в листе VRF_ISP2 он будет отправлен в VRF_ISP2

А теперь нам необходимо как то заполнить данных лист, будем использовать DHCP скрипты, очень маленький и простой скрипт.

:delay 5
:local pdns [/ip dhcp-client get value-name=primary-dns [find interface=$interface]]
:local sdns [/ip dhcp-client get value-name=secondary-dns [find interface=$interface]]

/ip firewall address-list remove [find list=VRF_ISP2]
/ip firewall address-list add list=VRF_ISP2 address=$pdns
/ip firewall address-list add list=VRF_ISP2 address=$sdns

Смысл примерно такой, получаем значения DNS серверов которые выдал DHCP сервер, удаляем текущие записи и устанавливаем новые. Да конечно можно допилить до того, чтобы сначала была проверка, если такая запись в листах существует то нечего не делать, чтобы не было лишней итерации записи в память, но это на ваше усмотрение.

vasilevkirill multiwan mikrotik

Теперь нам необходимо создать запись в адрес листе для vpn соединения, адрес для подключения VPN у нас vpn.isp.ru

/ip firewall address-list add address=vpn.isp.ru list=vpn.isp.ru

И проверяем

[admin@Router] > /ip firewall address-list pr     
Flags: X - disabled, D - dynamic 
 #   LIST                          ADDRESS                                           CREATION-TIME        TIMEOUT             
 0   vpn.isp.ru                    vpn.isp.ru                                        jun/25/2020 11:12:33
 1   VRF_ISP2                      22.22.22.22                                       jun/25/2020 11:16:58
 2   VRF_ISP2                      33.33.33.33                                       jun/25/2020 11:16:58
 3 D ;;; vpn.isp.ru
     vpn.isp.ru                    9.9.9.9                                           jun/25/2020 11:17:03

Далее нам необходимо указать, что если трафик уходит до адрес листа vpn.isp.ru отправляем его в VRF

/ip firewall mangle
add action=mark-routing chain=output dst-address-list=vpn.isp.ru new-routing-mark=VRF_ISP2 passthrough=no

Следующим этапом необходимо точно также подготовить профиль для l2tp клиента по аналогии с PPPoE

/ppp profile
add name=ISP_2-Client remote-address=172.31.1.2

Обратите внимание теперь мы используем уже другой адрес

Создать L2tp клиента

/interface l2tp-client
add connect-to=vpn.isp.ru disabled=no name=l2tp-ISP2 password=1 profile=ISP_2-Client user=1

Всё

Проверяем

[admin@Router] > /ip address print 
Flags: X - disabled, I - invalid, D - dynamic 
 #   ADDRESS            NETWORK         INTERFACE                                
 0   192.168.0.1/24     192.168.0.0     bridge-local                             
 1 D 1.1.1.1/32         172.31.1.1      pppoe-ISP_1                              
 2 D 10.0.0.254/24      10.0.0.0        ether2                                   
 3 D 2.2.2.2/32         172.31.1.2      l2tp-ISP2

А дальше мы работает с этими интерфейсами точно также как из основной статьи, единственно что можно пренебречь сетями, а маркировать весь пришедший на интерфейс трафик.

Рекурсивная маршрутизация

Я уже писал об этом ранее в статье о рекурсивной маршрутизации в RouterOS

Поэтому не буду давать в подробности, а только покажу наглядно.

Создаём два маршрута через двух разных провайдеров используя IP адреса шлюзов которые мы сами назначили

/ip route
add distance=1 dst-address=8.8.4.4/32 gateway=172.31.1.2
add distance=1 dst-address=8.8.8.8/32 gateway=172.31.1.1

Создаём рекурсию для первого провайдера с полным замещением в случае падения

/ip route
add distance=10 gateway=8.8.8.8 routing-mark=ISP1 target-scope=30 check-gateway=ping
add distance=20 gateway=8.8.4.4 routing-mark=ISP1 target-scope=30

И для второго провайдера

/ip route
add distance=10 gateway=8.8.4.4 routing-mark=ISP2 target-scope=30 check-gateway=ping
add distance=20 gateway=8.8.8.8 routing-mark=ISP2 target-scope=30

Итог

vasilevkirill multiwan mikrotik

Рассказать друзьям

Чатик телеграм

@mikrotikme