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

Написать данный пост меня сподвигнул этот вопрос 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 порта гнать во второго провайдера или сразу в третьего.
Предположим, что третий провайдер у нас считает трафик и поэтому он у нас будет самым последним.
И так вот наши интерфейсы

Далее наши IP адреса

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

Собственно на этом всё. Наш MikroTik готов для дальнейшей тонкой настройке.

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

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

 

<code class="bash hljs">[admin@kirilka] /ip firewall nat add chain=srcnat out-interface=ether1 action=masquerade comment=<span class="hljs-string">"ISP 1"</span>
[admin@kirilka] /ip firewall nat add chain=srcnat out-interface=ether2 action=masquerade comment=<span class="hljs-string">"ISP 2"</span>
[admin@kirilka] /ip firewall nat add chain=srcnat out-interface=ether3 action=masquerade comment=<span class="hljs-string">"ISP 3"</span>
</code>

 

Теперь наверное самое интересное Mangle

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

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

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

Картинка для закрепления. И понимания.

Отлично теперь мы можем заходить на MikroTik через любого провайдера.

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

<code class="bash hljs">[admin@kirilka] /ip firewall address-list&gt; <span class="hljs-built_in">print</span>
Flags: X - disabled, D - dynamic 
 <span class="hljs-comment">#   LIST                                                                                  ADDRESS                        </span>
 0   LocalNet                                                                              192.168.101.0/24               
 1   LocalNet                                                                              192.168.102.0/24 
</code>

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

<code class="bash hljs">
 6   chain=prerouting action=mark-routing new-routing-mark=office 1 passthrough=no src-address=192.168.101.0/24 
     dst-address-list=!LocalNet 
</code>

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

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

<code class="bash hljs">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
</code>

Немного разъяснения 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
Создадим два правила.

<code class="bash hljs">[admin@kirilka] /tool netwatch&gt; <span class="hljs-built_in">print</span> 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
</code>

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

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

<code class="bash hljs">/ip route <span class="hljs-built_in">enable</span> [find dst-address=0.0.0.0/0 and gateway=172.25.25.1 and distance &gt;= 10];
</code>

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

<code class="bash hljs">/ip route <span class="hljs-built_in">disable</span> [find dst-address=0.0.0.0/0 and gateway=172.25.25.1 and distance &gt;= 10];
</code>

Для того чтобы весь наш netwatch полноценно работал нам необходимо добавить два маршрута, который будут отправлять трафик на 8.8.8.8 через ISP1, а трафик до 8.8.4.4 через ISP2

<code class="bash hljs">[admin@kirilka] &gt; ip route add dst-address=8.8.8.8 gateway=172.25.25.1
[admin@kirilka] &gt; ip route add dst-address=8.8.4.4 gateway=192.168.99.1
</code>

Источник

Запись опубликована в рубрике *Lan&Wan, *Сети, MikroTik. Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Я не спамер This plugin created by Alexei91