Jump to content
Калькуляторы

Mikrotik: 2 канала в инет и бэкап грамотная настройка переключения и одновременной работы

Микротик с каналами от двух провайдеров (основной и бэкап), переключение осуществляется через netwatch (пинг 8.8.8.8) и последующим запуском скрита, который меняет маршрут на 0.0.0.0 + пристреливает UDP сессии в NAT (т.к. они в отличии от TCP не убиваются, при изменении шлюза).

 

Проблемы 3:

- при однократной потере пинга, присходит переключение (вкупе с пристреливанием сессий это негативно отражается на VoIP)

- отсутствует возможность работы с двух провайдеров одновременно (т.е. достучаться к роутеру можно только по одному активному маршруту)

- доступ к роутеру только удаленный, экспериментировать опасно, локап сложно исправить, safe mode работает не так безупречно как хотелось бы

 

Собственно был бы благодарен за проверенную инструкцию по настройке мангла, чтобы работало 2 канала одновременно (как я понимаю надо маркировать трафик, пришедший на определенный интерфейс и в него же его возвращать) и совет по настройке автоматического переключения таким образом, чтобы переключение осуществлялось, например, если более 5 пакетов подряд потеряно, или несколько хостов не ответили, видимо тут нужна некая системная переменная, которая будет меняться после замены маршрута (чтобы понапрасу не убивать активные соединения).

 

Например:

 

- переход на бэкап, как только на пинг не ответил 8.8.8.8 (netwatch)

запускаем внешний скрипт, он проверяет значение переменной backup,

если 0 то пингуем (условно) 1.2.3.4, если НЕТ ответа, то меняем значение переменной backup=1, и запускаем скрипт замены шлюза

если 0 то пингуем (условно) 1.2.3.4, если ЕСТЬ ответ, то ничего не делаем

если 1 то ничего не делаем

 

- возврат на основной канал, как только на пинг ответил 8.8.8.8 (netwatch)

запускаем внешний скрипт, он проверяет значение переменной backup,

если 1 то пингуем (условно) 1.2.3.4, если НЕТ ответа, то ничего не делаем

если 1 то пингуем (условно) 1.2.3.4, если ЕСТЬ ответ, то меняем значение переменной backup=0, и запускаем скрипт замены шлюза

если 0 то ничего не делаем

 

Разумеется, пинги должны ходить только через основной шлюз.

 

Но думаю такой вариант тоже не безупречен... может кто подскажет надежнее? И как быть со шлюзом на 0.0.0.0, в случае с двумя активными каналами и манглом, просто менять шлюз уже не получится...

Share this post


Link to post
Share on other sites

отсутствует возможность работы с двух провайдеров одновременно (т.е. достучаться к роутеру можно только по одному активному маршруту)

Это решается:

/ip firewall mangle

add action=mark-connection chain=prerouting comment=Incoming_LN_connection connection-state=new in-interface=ether5-gateway new-connection-mark=LN_Route passthrough=no

add action=mark-connection chain=prerouting comment=Incoming_KS_connection connection-state=new in-interface=ether1-gateway new-connection-mark=KS_Route passthrough=no

add action=mark-routing chain=output comment=Mark_Out_LN_routing connection-mark=LN_Route new-routing-mark=LN_Route passthrough=no

add action=mark-routing chain=output comment=Mark_Out_KS_routing connection-mark=KS_Route new-routing-mark=KS_Route passthrough=no

/ip route

add distance=1 gateway="ln_gw" routing-mark=LN_Route

add distance=1 gateway="ks_gw" routing-mark=KS_Route

(1 и 5 порты на разных провайдеров)

 

 

при однократной потере пинга, присходит переключение (вкупе с пристреливанием сессий это негативно отражается на VoIP)

/ip firewall mangle

add action=mark-connection chain=postrouting comment=Outgoing_LN_connection connection-state=new new-connection-mark=LN_Route out-interface=ether5-gateway passthrough=no

add action=mark-connection chain=postrouting comment=Outgoing_KS_connection connection-state=new new-connection-mark=KS_Route out-interface=ether1-gateway passthrough=no

add action=mark-routing chain=prerouting comment=Mark_from_bridge_LN_routing connection-mark=LN_Route in-interface=bridge-local new-routing-mark=LN_Route passthrough=no

add action=mark-routing chain=prerouting comment=Mark_from_bridge_KS_routing connection-mark=KS_Route in-interface=bridge-local new-routing-mark=KS_Route passthrough=no

/ip route

add comment="yandex test route LN" distance=1 dst-address=213.180.193.3/32 gateway="ln_gw"

add comment="yandex blackhole" distance=20 dst-address=213.180.193.3/32 type=unreachable

add comment="yandex test route KS" distance=1 dst-address=213.180.204.3/32 gateway="ks_gw"

add comment="yandex blackhole" distance=20 dst-address=213.180.204.3/32 type=unreachable

/tool netwatch

add comment="yandex 213.180.193.3 over LN route" down-script="/system script run router0_down" host=213.180.193.3 interval=10s timeout=5s up-script="/system script run router0_up"

add comment="yandex 213.180.203.3 over KS route" down-script="/system script run router1_down" host=213.180.204.3 interval=10s timeout=5s up-script="/system script run router1_up"

/system script

add name=router1_down policy=ftp,read,write,policy,test,password source="

\n:if ([/ping 213.180.204.3 count=5] = 0) do={\

\n:log warning (\"KS router \$KSgateway DOWN, route is BAD, change route!!! :-(\");\

\n/tool sms send usb1 +xxx message=\"\$[/system clock get date]_\$[/system clock get time] :-( KS router \$KSgateway DOWN, route is BAD, change route!!! :-(\"\

\n:global router1 \"Down\";\

\n/ip dhcp-client set 0 default-route-distance=20;\ у меня маршруты по dhcp, у вас может быть статическим, тогда вы на нем меняете distance

\n:foreach i in=[/ip firewall connection find connection-mark=\"KS_Route\"] do={/ip firewall connection remove \$i};\ пристреливаются все сессии

\n/ip dhcp-client renew 0;\

\n:if ([:pick [/system clock get time] 0 2]>7) do={\

\n:beep frequency=900 length=200ms;\

\n:delay 200ms;\

\n:beep frequency=600 length=200ms;\

\n:delay 200ms;\

\n:beep frequency=300 length=200ms;\

\n}}"

аналогично скрипты router0_down router0_up router1_up

Edited by Lxndr.Ya

Share this post


Link to post
Share on other sites

add distance=1 gateway="ln_gw" routing-mark=LN_Route

а тут не надо IP шлюза указывать, если статика?

 

add comment="yandex blackhole" distance=20 dst-address=213.180.193.3/32 type=unreachable

страхуемся от физического падения линка (отключения порта)?

 

Правильно ли я понял логику?

Хост А пингуем через канал А, хост Б через канал Б.

По умолчанию у маршрута 0.0.0.0 на канале А дистанс меньше, чем на канале Б.

 

 

Как только А перестает отвечать на пинг, запускаем скрипт, который проверяет доступность хоста А еще 5 раз,

если подтверждается, то увеличиваем дистанс на 0.0.0.0 через А, убиваем все соединения, начинаем работать через Б.

 

Как только А поднимается, уменьшаем дистанс на 0.0.0.0 через А, убиваем все соединения, работаем через А.

 

 

А какова задача пингования Б через Б? Просто формально отследить состояние канала? Или если Б лежит,

то дистанс на нем будет еще больше и не позволит его использовать, если вдруг А упадет?

 

 

\n:global router1 \"Down\";\ - это просто переменная для наглядности и контроля текущего статуса?

 

 

Это как я понимаю звуковое уведомление, в зависимости от времени суток?

\n:if ([:pick [/system clock get time] 0 2]>7) do={\

Share this post


Link to post
Share on other sites

Вот бы сделать, чтобы пакет ушёл на тот некстхоп, через который rtt до dst-ip меньше.

Share this post


Link to post
Share on other sites

Если, например, канал сильно нагружен, а узкий бэкап простаивает, то может быть ложное переключение.

 

Кстати, по поводу ширины бэкапа, можно ли к нему прикрутить шейперы по виду трафика (например приоретизировать трафик от ip voip сервера)? Или очереди с приоритетами, но будет ли это нормально работать, если нет поддержки со стороны провайдера? (Бэкап 2мегабита, при переключении начинаются затыки на IP телефонии)

Share this post


Link to post
Share on other sites

add distance=1 gateway="ln_gw" routing-mark=LN_Route

Да, ln_gw и ks_gw указываются нужные шлюзы

 

А какова задача пингования Б через Б? Просто формально отследить состояние канала? Или если Б лежит,

то дистанс на нем будет еще больше и не позволит его использовать, если вдруг А упадет?

Тогда дистанс Б увеличится и все заработает через 3G modem (в моем случае).

Share this post


Link to post
Share on other sites

Если, например, канал сильно нагружен, а узкий бэкап простаивает, то может быть ложное переключение

Если происходят ложные срабатывания можно увеличить ping-и до 10, но это уж должна быть большая полка.

 

Кстати, по поводу ширины бэкапа, можно ли к нему прикрутить шейперы по виду трафика (например приоретизировать трафик от ip voip сервера)? Или очереди с приоритетами, но будет ли это нормально работать, если нет поддержки со стороны провайдера? (Бэкап 2мегабита, при переключении начинаются затыки на IP телефонии)

Можно попробовать значительно урезать качальщиков, чтобы не было полки.

Share this post


Link to post
Share on other sites

А как-то приоретизировать нельзя? При ширине бэкапа 2мбит-а и отсутствия активных телефонных звонков не хотелось бы просто так затыкать всем кислород.

Share this post


Link to post
Share on other sites

А как-то приоретизировать нельзя? При ширине бэкапа 2мбит-а и отсутствия активных телефонных звонков не хотелось бы просто так затыкать всем кислород.

если нет поддержки со стороны провайдера?

Только для исходящего трафика можно приоритезировать.

По входу - только шейпер для всех (2мбит-а минус 100кбит на кол-во звонков для G.711), оставляя запас для VoIP (чуть больше нужной полосы).

Share this post


Link to post
Share on other sites

Хотя, по входу можно настроить равномерное распределение очередями как написано тут PCQ

На микротик мне не надо было, а вот на ipfw dummynet нормально когда-то работало.

Share this post


Link to post
Share on other sites

Lxndr.Ya

Правильно понимаю логику скриптов поднятия маршрута?

 

Проверяем, что удаленный хост начал отвечать на пинг, а переменная router1 подтверждает, что ранее маршрут был отключен (а не просто netwatch запустил скрипт поднятия)

 

([/ping 77.88.8.8 count=5] = 5 and $router1 = Down) do={

 

Но потом встает задача очистить таблицу соединений, и вот тут логика не совсем ясна, при поднятии основного интерфейса убиваем все соединения на запасном, а вот при падении\поднятии запасного, что делать? Или ничего не делать?

 

Значение переменной global, которую создал другой скрипт при своей работе как долго должно просуществовать? До перезагрузки?

 

Кстати, а что если пинговать хосты не через статичные маршруты (связка хост+шлюз), а через команду

ping 8.8.8.8 interface=ether1-gw ? Насколько надежно это будет работать?

 

P.S. Кстати, почему-то UDP соединения в таблице ip firewall connection не имеют connection mark.

Edited by amper

Share this post


Link to post
Share on other sites

Хотя, по входу можно настроить равномерное распределение очередями как написано тут PCQ

На микротик мне не надо было, а вот на ipfw dummynet нормально когда-то работало.

 

А можно ли использовать те же router-mark'и, которые используются для одновременной работы двух каналов для PCQ?

И как быть с пакетами input\output (на микротике живет openvpn сервер)?

Share this post


Link to post
Share on other sites

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

 

У меня на микротик приходит два канала от одного провайдера по l2tp с разных физич. мест.

 

разрулил маршрутами с маркировкой, что исходящий трафик идет по разным туннелям l2tp, а вот входящий почему-то идет только через один туннель, а точнее трафик бегает в обоих туннелях, но по физической линии приходит только по одной. В чём загвоздка может быть? Может быть вообще не будет так работать, т.к. нужны еще определенные правила со стороны оператора?

Share this post


Link to post
Share on other sites

два канала от одного провайдера по l2tp с разных физич. мест.

трафик бегает в обоих туннелях, но по физической линии приходит только по одной

 

оба l2tp строится с одного ip?

Share this post


Link to post
Share on other sites

 

 

Просмотр сообщенияkinord (Сегодня, 12:07) писал:

два канала от одного провайдера по l2tp с разных физич. мест.

трафик бегает в обоих туннелях, но по физической линии приходит только по одной

 

 

оба l2tp строится с одного ip?

 

нет ip разные используются, т.е. я полагаю, что это даже разные сервера со стороны провайдера

Share this post


Link to post
Share on other sites

оба l2tp строится с одного ip?

 

 

нет ip разные используются, т.е. я полагаю, что это даже разные сервера со стороны провайдера

 

не сторона провайдера, твоя сторона 2 ip адреса?

 

А можно ли использовать те же router-mark'и, которые используются для одновременной работы двух каналов для PCQ?

И как быть с пакетами input\output (на микротике живет openvpn сервер)?

input\output по моим правилам и так маркируется.

Я с PCQ не игрался, но думаю, что те же можно.

Share this post


Link to post
Share on other sites

оба l2tp строится с одного ip?

 

 

нет ip разные используются, т.е. я полагаю, что это даже разные сервера со стороны провайдера

 

не сторона провайдера, твоя сторона 2 ip адреса?

 

Да, адреса разные, причем присваиваются они по dhcp сначала серые при физическом подключении, потом два разных паблика, когда происходит подключение по l2tp

Edited by kinord

Share this post


Link to post
Share on other sites

Да, адреса разные, причем присваиваются они по dhcp сначала серые при физическом подключении, потом два разных паблика, когда происходит подключение по l2tp

И как тогда на разные серые ip полученые с разных mac-ов через разные порты по dhcp пакеты прилетают через один порт?

Тогда не через разные порты работают серые ip.

Edited by Lxndr.Ya

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this