Четверг
21.09.2017, 20:43
Приветствую Вас Гость | RSS
Главная Каталог статей Регистрация Вход
Меню сайта

Категории раздела
Разное [15]
Документация [18]
Авторские статьи [45]

Поиск

Свежие статьи
Динамическое деление скоро...
port knocking на mikrotik
Установка NGINX без прав R...
Как настроить время (NTP S...
Настраеваем CROND
Биллинг MikBill на UBUNTU
Даунгрейд PHP до версии 5....
Устанавливаем в Ubuntu 10....
Как настроить MySQL
Как настроить ZendOptimize...

Форма входа
Логин:
Пароль:

Главная » Статьи » Авторские статьи

Скрипт балансировки нагрузки + аварийное переключение на работу по другому каналу интернета

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

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

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

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

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

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

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

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

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

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, ибо такая глючная балансировка моим пользователям ни во что не упиралась.

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

Общение тоже рулит, мои координаты в профиле. P.S. Не люблю ленивых! Если вы не хотите понимать чисто для себя что и как работает, не [s]еб....[/s] лечите людям голову и заплатите деньги специалисту который это все вам настроит. Безвозмездная помощь реальна в случае наличия свободного времени, самое главное чтобы человек был хороший.

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



Источник: http://mikrotik.axiom-pro.ru/scripts/balancerv1.php

Спонсоры данной статьи


Категория: Авторские статьи | Добавил: -=shurf=- (31.12.2010)
Просмотров: 12382 | Комментарии: 1 | Теги: балансировка нагрузки, аварийный канал | Рейтинг: 5.0/2

Настройка Mikrotik
Биллинг MikBill на UBUNTU
RouterOS на офисном шлюзе, час...
Adress Lists в Mikrotik: чем м...
Защита mikrotik от внешних вто...
Линк точка-многоточка-точка на...
Как настроить ZendOptimizer
Mangle
Средства Mangle для маркировки...
Настройка микротик для провайд...
RouterOS на офисном шлюзе, час...

Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Профиль
Привет: Гость

Сообщения:

Гость, мы рады вас видеть. Пожалуйста зарегистрируйтесь или войдите!

Реклама

Наш опрос
Нужен ли этому сайту форум?
Всего ответов: 55

Нашел ошибку?
Система Orphus

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0



Бесплатный хостинг uCoz