amper Posted February 25, 2015 Posted February 25, 2015 Микротик с каналами от двух провайдеров (основной и бэкап), переключение осуществляется через 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, в случае с двумя активными каналами и манглом, просто менять шлюз уже не получится... Вставить ник Quote
Lxndr.Ya Posted February 25, 2015 Posted February 25, 2015 (edited) отсутствует возможность работы с двух провайдеров одновременно (т.е. достучаться к роутеру можно только по одному активному маршруту) Это решается: /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 February 25, 2015 by Lxndr.Ya Вставить ник Quote
amper Posted March 2, 2015 Author Posted March 2, 2015 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={\ Вставить ник Quote
ARtisT Posted March 3, 2015 Posted March 3, 2015 Вот бы сделать, чтобы пакет ушёл на тот некстхоп, через который rtt до dst-ip меньше. Вставить ник Quote
amper Posted March 3, 2015 Author Posted March 3, 2015 Если, например, канал сильно нагружен, а узкий бэкап простаивает, то может быть ложное переключение. Кстати, по поводу ширины бэкапа, можно ли к нему прикрутить шейперы по виду трафика (например приоретизировать трафик от ip voip сервера)? Или очереди с приоритетами, но будет ли это нормально работать, если нет поддержки со стороны провайдера? (Бэкап 2мегабита, при переключении начинаются затыки на IP телефонии) Вставить ник Quote
Lxndr.Ya Posted March 3, 2015 Posted March 3, 2015 add distance=1 gateway="ln_gw" routing-mark=LN_Route Да, ln_gw и ks_gw указываются нужные шлюзы А какова задача пингования Б через Б? Просто формально отследить состояние канала? Или если Б лежит, то дистанс на нем будет еще больше и не позволит его использовать, если вдруг А упадет? Тогда дистанс Б увеличится и все заработает через 3G modem (в моем случае). Вставить ник Quote
Lxndr.Ya Posted March 3, 2015 Posted March 3, 2015 Если, например, канал сильно нагружен, а узкий бэкап простаивает, то может быть ложное переключение Если происходят ложные срабатывания можно увеличить ping-и до 10, но это уж должна быть большая полка. Кстати, по поводу ширины бэкапа, можно ли к нему прикрутить шейперы по виду трафика (например приоретизировать трафик от ip voip сервера)? Или очереди с приоритетами, но будет ли это нормально работать, если нет поддержки со стороны провайдера? (Бэкап 2мегабита, при переключении начинаются затыки на IP телефонии) Можно попробовать значительно урезать качальщиков, чтобы не было полки. Вставить ник Quote
amper Posted March 3, 2015 Author Posted March 3, 2015 А как-то приоретизировать нельзя? При ширине бэкапа 2мбит-а и отсутствия активных телефонных звонков не хотелось бы просто так затыкать всем кислород. Вставить ник Quote
Lxndr.Ya Posted March 4, 2015 Posted March 4, 2015 А как-то приоретизировать нельзя? При ширине бэкапа 2мбит-а и отсутствия активных телефонных звонков не хотелось бы просто так затыкать всем кислород. если нет поддержки со стороны провайдера? Только для исходящего трафика можно приоритезировать. По входу - только шейпер для всех (2мбит-а минус 100кбит на кол-во звонков для G.711), оставляя запас для VoIP (чуть больше нужной полосы). Вставить ник Quote
Lxndr.Ya Posted March 10, 2015 Posted March 10, 2015 Хотя, по входу можно настроить равномерное распределение очередями как написано тут PCQ На микротик мне не надо было, а вот на ipfw dummynet нормально когда-то работало. Вставить ник Quote
amper Posted March 14, 2015 Author Posted March 14, 2015 (edited) 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 March 14, 2015 by amper Вставить ник Quote
amper Posted March 15, 2015 Author Posted March 15, 2015 Хотя, по входу можно настроить равномерное распределение очередями как написано тут PCQ На микротик мне не надо было, а вот на ipfw dummynet нормально когда-то работало. А можно ли использовать те же router-mark'и, которые используются для одновременной работы двух каналов для PCQ? И как быть с пакетами input\output (на микротике живет openvpn сервер)? Вставить ник Quote
kinord Posted March 16, 2015 Posted March 16, 2015 что бы не плодить новую тему спрошу здесь с позволения топикстартера: У меня на микротик приходит два канала от одного провайдера по l2tp с разных физич. мест. разрулил маршрутами с маркировкой, что исходящий трафик идет по разным туннелям l2tp, а вот входящий почему-то идет только через один туннель, а точнее трафик бегает в обоих туннелях, но по физической линии приходит только по одной. В чём загвоздка может быть? Может быть вообще не будет так работать, т.к. нужны еще определенные правила со стороны оператора? Вставить ник Quote
Lxndr.Ya Posted March 16, 2015 Posted March 16, 2015 два канала от одного провайдера по l2tp с разных физич. мест. трафик бегает в обоих туннелях, но по физической линии приходит только по одной оба l2tp строится с одного ip? Вставить ник Quote
kinord Posted March 16, 2015 Posted March 16, 2015 Просмотр сообщенияkinord (Сегодня, 12:07) писал: два канала от одного провайдера по l2tp с разных физич. мест. трафик бегает в обоих туннелях, но по физической линии приходит только по одной оба l2tp строится с одного ip? нет ip разные используются, т.е. я полагаю, что это даже разные сервера со стороны провайдера Вставить ник Quote
Lxndr.Ya Posted March 16, 2015 Posted March 16, 2015 оба l2tp строится с одного ip? нет ip разные используются, т.е. я полагаю, что это даже разные сервера со стороны провайдера не сторона провайдера, твоя сторона 2 ip адреса? А можно ли использовать те же router-mark'и, которые используются для одновременной работы двух каналов для PCQ? И как быть с пакетами input\output (на микротике живет openvpn сервер)? input\output по моим правилам и так маркируется. Я с PCQ не игрался, но думаю, что те же можно. Вставить ник Quote
kinord Posted March 16, 2015 Posted March 16, 2015 (edited) оба l2tp строится с одного ip? нет ip разные используются, т.е. я полагаю, что это даже разные сервера со стороны провайдера не сторона провайдера, твоя сторона 2 ip адреса? Да, адреса разные, причем присваиваются они по dhcp сначала серые при физическом подключении, потом два разных паблика, когда происходит подключение по l2tp Edited March 16, 2015 by kinord Вставить ник Quote
Lxndr.Ya Posted March 16, 2015 Posted March 16, 2015 (edited) Да, адреса разные, причем присваиваются они по dhcp сначала серые при физическом подключении, потом два разных паблика, когда происходит подключение по l2tp И как тогда на разные серые ip полученые с разных mac-ов через разные порты по dhcp пакеты прилетают через один порт? Тогда не через разные порты работают серые ip. Edited March 18, 2015 by Lxndr.Ya Вставить ник Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.