Скрипт для организации двух каналов в интернет+балансировка.
|
Работает на версиях (в
теории)
|
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