Mikrotik, 3 провайдера, переключение и разделение трафика

в 1:15, , рубрики: mikrotik, Сетевое оборудование, метки:

Написать данный пост меня сподвигнул этот вопрос habrahabr.ru/qa/38801/
Тем кому интересно прошу под кат.

И так дано:
1 порт — Провайдер 1
2 порт — Провайдер 2
3 порт — Провайдер 3 (резервный)
4 порт — Сеть 1 192.168.101.0
5 порт — Сеть 2 192.168.102.0
Вопрос:

  • На 4 порту сеть, со своим DHCP сервером на MikroTik, в инет они должны ходит через провайдера 1.
  • На 5 порту также отдельная сеть со своим DHCP сервером и в инет они должны ходить через провайдера 2.
  • 3 провайдер получается резервным, если 1 или 2 откажет, MikroTik должен переключить инет на него, ну и вернуть потом все на место когда канал восстановится.

Отсюда немного не понятно, что делать если откажет первый провайдер, трафик с 4 порта гнать во второго провайдера или сразу в третьего.
Предположим, что третий провайдер у нас считает трафик и поэтому он у нас будет самым последним.
И так вот наши интерфейсы
Mikrotik, 3 провайдера, переключение и разделение трафика
Далее наши IP адреса
Mikrotik, 3 провайдера, переключение и разделение трафика

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

На следующем этапе мы настроем отзывчивость MikroTik со всех провайдеров.

Для начала настроем маскарад для все трёх интерфейсов.

[admin@kirilka] /ip firewall nat add chain=srcnat out-interface=ether1 action=masquerade comment="ISP 1"
[admin@kirilka] /ip firewall nat add chain=srcnat out-interface=ether2 action=masquerade comment="ISP 2"
[admin@kirilka] /ip firewall nat add chain=srcnat out-interface=ether3 action=masquerade comment="ISP 3"
Теперь наверное самое интересное Mangle

Наша задача сделать так чтобы на MikroTik можно было достучаться через всех трёх провайдеров.
Для этого мы должны отловить входящие соединения и замаркировать соединения, следующим правилом необходимо для маркированного соединения сделать обратку в того провайдера с которого соединения пришло.

[admin@kirilka] /ip firewall mangle> print
Flags: X - disabled, I - invalid, D - dynamic 
0   chain=input action=mark-connection new-connection-mark=ISP 1 -> Input passthrough=no dst-address=172.25.25.247  in-interface=ether1 
1   chain=output action=mark-routing new-routing-mark=ISP 1 passthrough=no connection-mark=ISP 1 -> Input 
2   chain=input action=mark-connection new-connection-mark=ISP 2 -> Input passthrough=no dst-address=192.168.99.2  in-interface=ether2 
3   chain=output action=mark-routing new-routing-mark=ISP 2 passthrough=no connection-mark=ISP 2 -> Input 
4   chain=input action=mark-connection new-connection-mark=ISP 3 -> Input passthrough=no dst-address=192.168.100.2  in-interface=ether3 
5   chain=output action=mark-routing new-routing-mark=ISP 3 passthrough=no connection-mark=ISP 3 -> Input

Попробую расшифровать по человечески
Правило 0
Если в пакете пришедшем на первый интерфейс (ISP 1) в адресе назначения указан IP адрес 172.25.25.247(ISP 1), то маркируем соединение именем (ISP 1 -> Input)
Правило 1
Если исходящий пакет принадлежит соединению с маркировкой (ISP 1 -> Input), то для него используем маршрут ISP 1
Тем самым маршрутизатор знает, что если его (пингуют или любой входящий трафик) с провайдера ISP 1, то ответ вернёт он через провайдера ISP 1

Картинка для закрепления. И понимания.
Mikrotik, 3 провайдера, переключение и разделение трафика
Отлично теперь мы можем заходить на MikroTik через любого провайдера.

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

[admin@kirilka] /ip firewall address-list> print
Flags: X - disabled, D - dynamic 
 #   LIST                                                                                  ADDRESS                        
 0   LocalNet                                                                              192.168.101.0/24               
 1   LocalNet                                                                              192.168.102.0/24 

И так мы создали листы локальных сетей, теперь приступим к маршрутизации трафика.


 6   chain=prerouting action=mark-routing new-routing-mark=office 1 passthrough=no src-address=192.168.101.0/24 
     dst-address-list=!LocalNet 

Перед тем как пакет покинет маршрутизатор: если адрес отправителя состоит в сети 192.168.101.0/24 и адрес назначения не числится в листах, то маркируем маршрут именем office 1
Совсем просто, это весь трафик который принадлежит офису 1 и не идёт до наших других локальных подсетей.

Далее нам необходимо создать три маршрута для трафика office 1

dst-address=0.0.0.0/0 gateway=172.25.25.1  check-gateway=arp distance=10 routing-mark=office 1
dst-address=0.0.0.0/0 gateway=192.168.99.1 check-gateway=arp distance=11 routing-mark=office 1
dst-address=0.0.0.0/0 gateway=192.168.100.1 check-gateway=arp distance=12 routing-mark=office 1

Немного разъяснения check-gateway это процедура автоматической проверки доступности шлюза, так как у меня это соединение L2 то в моём случае arp лучше чем ping, если у вас L3 (pptp etc) то ставите ping.
Также необходимо обратить внимание distance как рас по ней маршрутизатор определяет при одинаковом адресе назначения какой приоритет маршрутов.

Ну а теперь финальная часть нашего «марлезонского балета».
Так как cheсk-gateway проверяет доступность только шлюза, нас это категорически не устраивает.
Наша задача определить живой ли канал в интернет через каждого провайдера и в зависимости от живности включать и отключать маршруты.
В данном случае у нас две сети
office1 ISP1->ISP2->ISP3
office2 ISP2->ISP1-ISP3
Как видно что конченым результатом у нас в любом случае будет ISP3, естественно канал ISP3 нам нет необходимости проверять.
И так прежде нам необходимо настроить дату и время на MikroTik. Я надеюсь вы сделаете это без моей помощи.

Отступление: в интернете много различных скриптов, но большинство из них выполняют скрипт в заданный промежуток времени которые меняет значения дистанции в маршрутах. Нас такой вариант не устраивает так как в MikroTik стоит NAND память и у неё есть свой предел записи. Мы будем его экономить. Кончено же можно было отредактировать скрипт и делать проверку, но это не наш метод. )

Будем использовать функционал MikroTik. NetWatch
Создадим два правила.

[admin@kirilka] /tool netwatch> print detail 
Flags: X - disabled 
0 host=8.8.8.8 timeout=1s interval=1m  status=up up-script=ISP1-UP down-script=ISP1-DOWN 
1 host=8.8.4.4 timeout=1s interval=1m  status=up up-script=ISP2-UP down-script=ISP2-DOWN

Netwacth работает как тригер.
Если состояние изменилось то выполняется скрипт указанный в текущем значении тригера.
В нашем случае если пинг до 8.8.8.8 не пройдёт то, смениться статус на down и исполниться скрипт ISP1-DOWN, как только значение станет up, то исполниться скрипт ISP1-UP

Напишем скрипты для наших событий.
ISP1-UP

/ip route enable [find dst-address=0.0.0.0/0 and gateway=172.25.25.1 and distance >= 10];

В моё случае я ищу так, кто то определяет по комментариям к маршрутам.
Но я пока встречал только один раз где реально использовалась дистанция больше 10.
ISP1-DOWN

/ip route disable [find dst-address=0.0.0.0/0 and gateway=172.25.25.1 and distance >= 10];

Собственно всё.

Остатки

Mangle:

[admin@kirilka] > ip firewall mangle print 
Flags: X - disabled, I - invalid, D - dynamic 
 0   chain=input action=mark-connection new-connection-mark=ISP 1 -> Input passthrough=no dst-address=172.25.25.247 
     in-interface=ether1 

 1   chain=output action=mark-routing new-routing-mark=ISP 1 passthrough=no connection-mark=ISP 1 -> Input 

 2   chain=input action=mark-connection new-connection-mark=ISP 2 -> Input passthrough=no dst-address=192.168.99.2 
     in-interface=ether2 

 3   chain=output action=mark-routing new-routing-mark=ISP 2 passthrough=no connection-mark=ISP 2 -> Input 

 4   chain=input action=mark-connection new-connection-mark=ISP 3 -> Input passthrough=no dst-address=192.168.100.2 
     in-interface=ether3 

 5   chain=output action=mark-routing new-routing-mark=ISP 3 passthrough=no connection-mark=ISP 3 -> Input 

 6   chain=prerouting action=mark-routing new-routing-mark=office 1 passthrough=no src-address=192.168.101.0/24 
     dst-address-list=!LocalNet 

 7   chain=prerouting action=mark-routing new-routing-mark=office 2 passthrough=no src-address=192.168.102.0/24 
     dst-address-list=!LocalNet 

Route:

[admin@kirilka] > ip route print 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 A S  dst-address=0.0.0.0/0 gateway=172.25.25.1 gateway-status=172.25.25.1 reachable via  ether1 distance=1 scope=30 
        target-scope=10 routing-mark=ISP 1 

 1 A S  dst-address=0.0.0.0/0 gateway=192.168.99.1 gateway-status=192.168.99.1 reachable via  ether2 distance=1 scope=30 
        target-scope=10 routing-mark=ISP 2 

 2 A S  dst-address=0.0.0.0/0 gateway=192.168.100.1 gateway-status=192.168.100.1 reachable via  ether3 distance=1 scope=3>
        target-scope=10 routing-mark=ISP 3 

 3 A S  dst-address=0.0.0.0/0 gateway=172.25.25.1 gateway-status=172.25.25.1 reachable via  ether1 check-gateway=arp 
        distance=10 scope=30 target-scope=10 routing-mark=office 1 

 4   S  dst-address=0.0.0.0/0 gateway=192.168.99.1 gateway-status=192.168.99.1 reachable via  ether2 check-gateway=arp 
        distance=11 scope=30 target-scope=10 routing-mark=office 1 

 5   S  dst-address=0.0.0.0/0 gateway=192.168.100.1 gateway-status=192.168.100.1 reachable via  ether3 check-gateway=arp 
        distance=12 scope=30 target-scope=10 routing-mark=office 1 

 6 A S  dst-address=0.0.0.0/0 gateway=192.168.99.1 gateway-status=192.168.99.1 reachable via  ether2 check-gateway=arp 
        distance=10 scope=30 target-scope=10 routing-mark=office 2 

 7   S  dst-address=0.0.0.0/0 gateway=172.25.25.1 gateway-status=172.25.25.1 reachable via  ether1 check-gateway=arp 
        distance=11 scope=30 target-scope=10 routing-mark=office 2 

 8   S  dst-address=0.0.0.0/0 gateway=192.168.100.1 gateway-status=192.168.100.1 reachable via  ether3 check-gateway=arp 
        distance=12 scope=30 target-scope=10 routing-mark=office 2 

 9 A S  dst-address=0.0.0.0/0 gateway=172.25.25.1 gateway-status=172.25.25.1 reachable via  ether1 distance=1 scope=30 
        target-scope=10 

10 A S  ;;; Netwatch ->ISP2
        dst-address=8.8.4.4/32 gateway=192.168.99.1 gateway-status=192.168.99.1 reachable via  ether2 distance=1 
        scope=30 target-scope=10 

11 A S  ;;; Netwatch ->ISP1
        dst-address=8.8.8.8/32 gateway=172.25.25.1 gateway-status=172.25.25.1 reachable via  ether1 distance=1 scope=30 
        target-scope=10 

12 ADC  dst-address=172.25.25.0/24 pref-src=172.25.25.247 gateway=ether1 gateway-status=ether1 reachable distance=0 
        scope=10 

13 ADC  dst-address=192.168.99.0/24 pref-src=192.168.99.2 gateway=ether2 gateway-status=ether2 reachable distance=0 
        scope=10 

14 ADC  dst-address=192.168.100.0/24 pref-src=192.168.100.2 gateway=ether3 gateway-status=ether3 reachable distance=0 
        scope=10 

15 ADC  dst-address=192.168.101.0/24 pref-src=192.168.101.1 gateway=ether4 gateway-status=ether4 reachable distance=0 
        scope=10 

16 ADC  dst-address=192.168.102.0/24 pref-src=192.168.102.1 gateway=ether5 gateway-status=ether5 reachable distance=0 
        scope=10 

Script:

[admin@kirilka] /system script> print        
Flags: I - invalid 
 0   name="ISP1-UP" owner="admin" policy=ftp,reboot,read,write,policy,test,winbox,password,sniff,sensitive,api 
     last-started=jul/11/2013 05:07:34 run-count=9 
     source=/ip route enable [find dst-address=0.0.0.0/0 and gateway=172.25.25.1 and distance >= 10]; 

 1   name="ISP1-DOWN" owner="admin" policy=ftp,reboot,read,write,policy,test,winbox,password,sniff,sensitive,api 
     last-started=jul/11/2013 04:47:03 run-count=2 
     source=/ip route disable [find dst-address=0.0.0.0/0 and gateway=172.25.25.1 and distance >= 10]; 

 2   name="ISP2-UP" owner="admin" policy=ftp,reboot,read,write,policy,test,winbox,password,sniff,sensitive,api 
     last-started=jul/11/2013 05:08:01 run-count=1 
     source=/ip route enable [find dst-address=0.0.0.0/0 and gateway=192.168.99.1 and distance >= 10]; 

 3   name="ISP2-DOWN" owner="admin" policy=ftp,reboot,read,write,policy,test,winbox,password,sniff,sensitive,api 
     last-started=jul/11/2013 05:07:36 run-count=1 
     source=/ip route disable [find dst-address=0.0.0.0/0 and gateway=192.168.99.1 and distance >= 10];

Автор: vasilevkirill

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js