Скрипт для организации двух каналов в интернет+балансировка.
Работает на версиях (в теории)
2.xx
3.xx
4.xx
5.xx
 
Тестировался на версиях
2.9.27, 2.9.51, 3.20, 3.22, 3.30, 4.33, 5.0rc3

 

Доброго времени суток уважаемые!
Вот столкнулся с вопросом о двух и более каналов в инет на микротике...

Задача была следующая.
Два разных провайдера.
ISP1
ISP2

Сетка LAN с сервером RDP.

Тема была следующей: Дать доступ к серверу RDP с обоих внешних IP.
Был настроен dst-nat

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

ISP1 пинг идет, RDP работает.
ISP2 пинга нет, RDP не работает.
Все из-за того что ответы на запросы уходят в ISP1 и микротику неважно откуда они пришли...

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

После изучения горы манов, скриптов, рекомендаций я пришел к выводу... что все как то через одно место!
У одних только для версий выше 3,22, у других вообще непонятно какие ляпы, у третьих просто скопировано непонятно откуда без описания.
В общем, перебрал кучу способов, учел плюсы и минусы каждого из них, и родилось в голове, что-то более рациональное и понятное.

Итак, поехали....
Имеем:

ISP1
ISP2
LAN 192.168.1.0/24

Скриптег:

/ip firewall mangle
add chain=prerouting in-interface=ISP1 action=add-src-to-address-list address-list=ISP1 address-list-timeout=30s comment="Add_SRC_to_ISP1" disabled=no
add chain=prerouting in-interface=ISP2 action=add-src-to-address-list address-list=ISP2 address-list-timeout=30s comment="Add_SRC_to_ISP2" disabled=no
add chain=input in-interface=ISP1 action=add-src-to-address-list address-list=ISP2 address-list-timeout=30s comment="Add_SRC_to_ISP1_PING" disabled=no
add chain=input in-interface=ISP2 action=add-src-to-address-list address-list=ISP2 address-list-timeout=30s comment="Add_SRC_to_ISP2_PING" disabled=no
add chain=prerouting src-address-list=!exclude dst-address-list=ISP1 action=mark-routing new-routing-mark=route_ISP1 passthrough=no comment="Mark_to_ISP1" disabled=no
add chain=prerouting src-address-list=!exclude dst-address-list=ISP2 action=mark-routing new-routing-mark=route_ISP2 passthrough=no comment="Mark_to_ISP2" disabled=no
add chain=output src-address-list=!exclude dst-address-list=ISP1 action=mark-routing new-routing-mark=route_ISP1 passthrough=no comment="Mark_to_ISP1_PING" disabled=no
add chain=output src-address-list=!exclude dst-address-list=ISP2 action=mark-routing new-routing-mark=route_ISP2 passthrough=no comment="Mark_to_ISP2_PING" disabled=no
add chain=prerouting in-interface=LAN src-address-list=!exclude dst-address-list=!exclude action=mark-routing new-routing-mark=route_ISP1 passthrough=no comment="Send_50_percent_to_ISP1" disabled=no random=50
add chain=prerouting in-interface=LAN src-address-list=!exclude dst-address-list=!exclude action=mark-routing new-routing-mark=route_ISP2 passthrough=no comment="Send_ostatok_to_ISP2" disabled=no

/ip route
add dst-address=0.0.0.0/0 gateway=ISP1 distance=1 scope=255 target-scope=10 comment="Master_Route" disabled=no
add dst-address=0.0.0.0/0 gateway=ISP2 distance=2 scope=255 target-scope=10 comment="Secondary_Route" disabled=no
add dst-address=0.0.0.0/0 gateway=ISP1 scope=255 target-scope=10 routing-mark=route_ISP1 comment="Route_to_ISP1" disabled=no
add dst-address=0.0.0.0/0 gateway=ISP2 scope=255 target-scope=10 routing-mark=route_ISP2 comment="Route_to_ISP2" disabled=no

/ ip firewall nat
add chain=srcnat out-interface=ISP1 action=masquerade comment="NAT_ISP1" disabled=no
add chain=srcnat out-interface=ISP2 action=masquerade comment="NAT_ISP2" disabled=no

/ ip firewall address-list
add list=exclude address=93.186.232.0/21 comment="Vkontakte.ru" disabled=no
add list=exclude address=194.186.0.0/16 comment="Vkontakte.ru" disabled=no
add list=exclude address=93.186.224.0/21 comment="Vkontakte.ru" disabled=no
add list=exclude address=188.128.85.0/24 comment="Vkontakte.ru" disabled=no
add list=exclude address=188.128.86.0/24 comment="Vkontakte.ru" disabled=no
add list=exclude address=188.128.87.0/24 comment="Vkontakte.ru" disabled=no
add list=exclude address=195.218.128.0/17 comment="Vkontakte.ru" disabled=no

 


Разберем более подробно что и как в нашем типа скриптиге....



add chain=prerouting in-interface=ISP1 action=add-src-to-address-list address-list=ISP1 address-list-timeout=30s comment="Add_SRC_to_ISP1" disabled=no
add chain=prerouting in-interface=ISP2 action=add-src-to-address-list address-list=ISP2 address-list-timeout=30s comment="Add_SRC_to_ISP2" disabled=no

В первой стоке мы ловим ВХОДЯЩИЕ-ПРОХОДЯЩИЕ пакеты с первого интерфейса в нашем случае ISP1, копируем из них IP c которого к нам обратились и заносим его в список ISP1 на 30 секунд.
Во втором правиле мы ловим ВХОДЯЩИЕ-ПРОХОДЯЩИЕ пакеты со второго интерфейса в нашем случае ISP2, копируем из них IP c которого к нам обратились и заносим его в список ISP2 на 30 секунд.




add chain=input in-interface=ISP1 action=add-src-to-address-list address-list=ISP2 address-list-timeout=30s comment="Add_SRC_to_ISP1_PING" disabled=no
add chain=input in-interface=ISP2 action=add-src-to-address-list address-list=ISP2 address-list-timeout=30s comment="Add_SRC_to_ISP2_PING" disabled=no

В первом правиле мы ловим ВХОДЯЩИЕ на сам микроштык пакеты с первого интерфейса в нашем случае ISP1, копируем из них IP c которого к нам обратились и заносим его в список ISP1 на 30 секунд.
Во втором правиле мы ловим ВХОДЯЩИЕ на сам микроштык пакеты со второго интерфейса в нашем случае ISP2, копируем из них IP c которого к нам обратились и заносим его в список ISP2 на 30 секунд.


В итоге мы получили два списка ISP1 с адресами, которые обратились на первый интерфейс и ISP2 с адресами, которые обратились на второй интерфейс....

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


add chain=prerouting src-address-list=!exclude dst-address-list=ISP1 action=mark-routing new-routing-mark=route_ISP1 passthrough=no comment="Mark_to_ISP1" disabled=no
add chain=prerouting src-address-list=!exclude dst-address-list=ISP2 action=mark-routing new-routing-mark=route_ISP2 passthrough=no comment="Mark_to_ISP2" disabled=no

Первое правило пометит все ПРОХОДЯЩИЕ пакеты, у которых IP назначения совпадает с IP в списке ISP1.
Второе правило пометит все ПРОХОДЯЩИЕ пакеты, у которых IP назначения совпадает с IP в списке ISP2.


add chain=output src-address-list=!exclude dst-address-list=ISP1 action=mark-routing new-routing-mark=route_ISP1 passthrough=no comment="Mark_to_ISP1_PING" disabled=no
add chain=output src-address-list=!exclude dst-address-list=ISP2 action=mark-routing new-routing-mark=route_ISP2 passthrough=no comment="Mark_to_ISP2_PING" disabled=no

Первое правило пометит все ИСХОДЯЩИЕ от самого микроштыка пакеты, у которых IP назначения совпадает с IP в списке ISP1.
Второе правило пометит все ИСХОДЯЩИЕ от самого микроштыка пакеты, у которых IP назначения совпадает с IP в списке ISP2.

Ну, вот с Mangle почти закончили, и отклик на PING и SYN теперь будет с обоих интерфейсов, если дописать маршруты.....
Правилами, которые описаны выше будет обеспечен отклик через нужные интерфейсы, но у нас есть еще куча ИСХОДЯЩИХ пакетов (Запросов)
Для пытливых товарищей я дописал еще два правила, которые будут раскидывать запросы на два разных интерфейса, лично я отключил у себя эти правила, ибо балансировка на микроштыке это что-то нереальное и очень глючное создание.



add chain=prerouting in-interface=LAN src-address-list=!exclude dst-address-list=!exclude action=mark-routing new-routing-mark=route_ISP1 passthrough=no comment="Send_50_percent_to_ISP1" disabled=no random=50
add chain=prerouting in-interface=LAN src-address-list=!exclude dst-address-list=!exclude action=mark-routing new-routing-mark=route_ISP2 passthrough=no comment="Send_ostatok_to_ISP2" disabled=no

Первое правило случайным образом отберет 50% ИСХОДЯЩИХ пакетов (запросов) и пометит их в ISP1
Благодаря passthrough=no эти пакеты будут исключены из общего потока "prerouting"
Второе правило промаркирует все оставшиеся пакеты в потоке "prerouting" т.к. опущен параметр "random=" эти пакеты будут промаркированы в ISP2.


Вот теперь мы закончили с Mangle, перейдем к следующим шагам...




/ip route
add dst-address=0.0.0.0/0 gateway=ISP1 distance=1 scope=255 target-scope=10 comment="Master_Route" disabled=no
add dst-address=0.0.0.0/0 gateway=ISP2 distance=2 scope=255 target-scope=10 comment="Secondary_Route" disabled=no
add dst-address=0.0.0.0/0 gateway=ISP1 scope=255 target-scope=10 routing-mark=route_ISP1 comment="Route_to_ISP1" disabled=no
add dst-address=0.0.0.0/0 gateway=ISP2 scope=255 target-scope=10 routing-mark=route_ISP2 comment="Route_to_ISP2" disabled=no

В правилах естественно меняем gateway= на IP шлюза провайдера или вышестоящего шлюза, все зависит от ситуации.

Первый маршрут дефолтный он нужен для самого микротика, для DNS, и для исключений (о них позже)
Второй маршрут так сказать резервный.
Третий маршрут отправляет пакеты с пометкой route_ISP1 в первый интерфейс.
Четвертый маршрут отправляет пакеты с пометкой route_ISP2 во второй интерфейс.



/ ip firewall nat
add chain=srcnat out-interface=ISP1 action=masquerade comment="NAT_ISP1" disabled=no
add chain=srcnat out-interface=ISP2 action=masquerade comment="NAT_ISP2" disabled=no

Я думаю, что в особых пояснениях не нуждается, оба правила включают NAT.



/ ip firewall address-list
add list=exclude address=93.186.232.0/21 comment="Vkontakte.ru" disabled=no
add list=exclude address=194.186.0.0/16 comment="Vkontakte.ru" disabled=no
add list=exclude address=93.186.224.0/21 comment="Vkontakte.ru" disabled=no
add list=exclude address=188.128.85.0/24 comment="Vkontakte.ru" disabled=no
add list=exclude address=188.128.86.0/24 comment="Vkontakte.ru" disabled=no
add list=exclude address=188.128.87.0/24 comment="Vkontakte.ru" disabled=no
add list=exclude address=195.218.128.0/17 comment="Vkontakte.ru" disabled=no

Это список исключений, сюда необходимо вписать адреса или диапазоны адресов которые нужно исключить и не помечать никак, все пакеты на эти адреса будут уходить по дефолтному маршруту, в нашем случае на ISP1, либо по маршруту который вы обозначите отдельно в /ip route.
Я, к примеру, запихнул в него два диапазона 78.29.0.0/18 и 10.0.0.0/8 т.к. в мой микроштык приходит еще локальная сеть провайдера с внутренними ресурсами.
В нашем примере забиты диапазоны адресов сайта vkontakte.ru потому что контакт привязывается к IP и не работает при балансировке.
Туда же еще необходимо добавить vkadre.ru т.к. наблюдается глюк при открытии видео в контакте...

Второй выход это отключить балансировку для 80 порта.


Срок действия списков ISP1 и ISP2 равен 30 секундам простоя, потом они автоматически удалятся, сделано это для того чтобы можно было повторно подключиться с другого интерфейса.
Пример:
Подключаемся из инета к микротику по первому фейсу
Наш IP 88.88.88.88
При подключении сразу попадаем в список ISP1, микротик шлет все пакеты на 88.88.88.88 через первый фейс, при каждом отправленном пакете с адреса 88.88.88.88 на фейс 1 время устанавливается снова 30 сек.
А тут вдруг на первом фейсе микротика у прова упал инет.
Мы пробуем подключиться с ИП 88.88.88.88 на второй фейс микротика, сразу попадаем в список ISP2
Но тут облом! Уже есть такой ИП в списке ISP1 и соответственно все ответы будут роутится не в нужный интерфейс.
Далее два вида продолжения событий либо ждать 30 сек. либо менять ИП.
Весело тем у кого нет возможности поменять ИП и кто проставил в правиле время действия списка 1 день. :)


Несколько слов о балансировке и стабильности.
Все-таки работает оно как г...., ибо стало очень много сайтов с привязкой к IP.
Что касается аськи и скайпа, трое суток ни одного падения, подключается с полпинка, но передача файлов накрылась медным тазом, почти не работает, даже не через раз, на 7-10 попыток удается
послать/принять файл по аське, со скайпом глюков не замечено...

Что касается суммирования скоростей, это не есть так как вы думаете, это подобно рулетке, к примеру, открываем видео на youtube, и СЛУЧАЙНЫМ образом попадаем на канал ISP1 или ISP2, далее происходит привязка к этому каналу, и весь ролик выкачивается через тот канал, куда вас рулетка закинула в первый раз...

При закачке торрента все происходит более сбалансировано и то не всегда. Почти полный баланс получится, когда будет куча коннектов к пирам с маленькой скоростью, но может случиться так, что на первый канал "упадет" несколько соединений со скоростью в 2-3 мегабита и десяток "мелких", а на второй канал просто 12 мелких коннектов в итоге баланса не получится, пока не обнулятся списки.
А списки обнулятся только тогда, когда не будет обмена пакетами с пиром в течение 30сек.

Что касается балансировки исходящего трафика при отдаче на торрент, не реально! Вернее реально если вы как то чудом сообщите трекеру свой второй внешний IP, а не тот, через который вы подключились к нему.... Еще будет маленькая балансировка при обмене пирами и то не факт.
Я лично выключил последние два правила в Mangle, ибо такая глючная балансировка моим пользователям ни во, что не упиралась.

Все доработки, комментарии, спасибки и пр. приветствуются....
Не забываем сказать спасибо за труды!

Обсудить >>>

При использовании материалов ссылка на автора и источник ОБЯЗАТЕЛЬНЫ!

 

 

Автор: Григорьев Дмитрий (Inlarion)

 

 

Теги: Mikrotik, Микротик, Два провайдера, Несколько провайдеров, Балансировка, Два канала, Распределение нагрузки, Balancer, 2 WAN





Рейтинг@Mail.ru
Яндекс цитирования

Григорьев Дмитрий Владимирович (Inlarion) 2010-2014 (C) Все права защищены. При копировании материалов с сайта, ссылка на автора и источник обязательны!!!