Перейти к содержимому
Калькуляторы

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

/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

Изменено пользователем Lxndr.Ya

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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={\

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

 

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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.

Изменено пользователем amper

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

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

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

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

 

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

 

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

 

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

 

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

 

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

 

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

 

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

Изменено пользователем kinord

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

Изменено пользователем Lxndr.Ya

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.