Автоматичне перемикання каналів на mikrotik routeros, блог tangarusа

Вбудована в MikroTik RouterOS функція забезпечення відмовостійкості доступу в Інтернет (мається на увазі check-gateway = ping), має величезний недолік: вона перевіряє доступність шлюзу провайдера, а не доступність мережі Інтернет через цього провайдера.

Подібне рішення для Linux я вже описував. і це можна сказати його «порт» на RouterOS 🙂

Маємо 3 каналу в Інтернет і один в локальну мережу (тут називається DMZ):

/ Ip address add address = 172.16.16.2 / 24 broadcast = 172.16.16.255 comment = DMZ disabled = no \ interface = ether1-dmz network = 172.16.16.0 add address = 80.X.255.130 / 26 broadcast = 80.X.255.191 comment = RialKom \ disabled = no interface = ether3-rialkom network = 80.X.255.128 add address = 212.152.X.55 / 26 broadcast = 212.152.X.63 comment = Inet disabled = \ no interface = ether5-inet network = 212.152.X.0 add address = 62.X.7.242 / 29 broadcast = 62.X.7.247 comment = Beeline \ disabled = no interface = ether4-beeline network = 62.X.7.240

Основні маршрути, які ми і будемо перемикати:

/ Ip route add comment = GW_1 disabled = no distance = 1 dst-address = 0.0.0.0 / 0 gateway = \ 80.X.255.129 scope = 30 target-scope = 10 add comment = GW_2 disabled = no distance = 2 dst- address = 0.0.0.0 / 0 gateway = \ 62.X.7.241 scope = 30 target-scope = 10 add comment = GW_3 disabled = no distance = 3 dst-address = 0.0.0.0 / 0 gateway = \ 212.152.X.1 scope = 30 target-scope = 10

Клієнти повинні маскарад:

/ System scheduler add comment = "" disabled = no interval = 30s name = CheckINET on-event = "/ system script run CheckINET" policy = \ reboot, read, write, policy, test, password, sniff, sensitive start-date = jan / 01/1970 start-time = 00: 00: 00

Здавалося-б все, але є один підводний камінь: зараз виконуючи пінг / ping www.ya.ru src-address = 212.152.X.55. RouterOS не звертатиме уваги на параметр 212.152.X.55 якщо цей шлюз недоступний.
Тобто якщо він доступний то пакети будуть йти через нього, але якщо немає, то через поточний default gw.
Щоб уникнути цього, необхідно позначати з'єднання на вході інтерфейсу відповідної routing mark.
Паралельно це вирішить проблему «відповідати на той інтерфейс, на який прийшов запит»: зараз пінгуя інтерфейс №2 відповіді підуть через інтерфейс якого належить default gw, і відповіді ми не отримаємо.

Додаємо маршрути в іменовані таблиці маршрутизації:

/ Ip route add comment = "" disabled = no distance = 1 dst-address = 0.0.0.0 / 0 gateway = \ 80.X.255.129 routing-mark = rialkom scope = 30 target-scope = 10 add comment = "" disabled = no distance = 1 dst-address = 0.0.0.0 / 0 gateway = \ 62.X.7.241 routing-mark = beeline scope = 30 target-scope = 10 add comment = "" disabled = no distance = 1 dst-address = 0.0.0.0/0 gateway = \ 212.152.X.1 routing-mark = inet scope = 30 target-scope = 10

/ Ip route rule add action = lookup comment = "" disabled = no src-address = 212.152.X.55 / 32 \ table = inet add action = lookup comment = "" disabled = no src-address = 62.X.7.242 / 32 table = \ beeline add action = lookup comment = "" disabled = no src-address = 80.X.255.130 / 32 \ table = rialkom

ці правила потрібні, щоб з внутрішньої мережі були завжди (в не залежності від поточного робочого каналу) доступні мережі провайдерів, я використовую для моніторингу:

/ Ip route rule add action = lookup comment = "" disabled = no dst-address = 62.X.7.240 / 29 table = \ beeline add action = lookup comment = "" disabled = no dst-address = 80.X.255.128 / 26 \ table = rialkom add action = lookup comment = "" disabled = no dst-address = 212.152.X.0 / 26 table = \ inet

Звертаю увагу: routing-mark які видно через WinBOX в MANGLE, це таблиці маршрутизації з / ip route (routing-table) і routing-mark'і, а routing-table там безпосередньо використовувати не можна!
Тобто там з незрозумілих причин отображаються як routing-mark, так і routing-table.
(UPD: А ось на іншому роутере працює і так і так. Хм.)

Потрібно їх зіставити:

/ Ip route rule add action = lookup comment = "" disabled = no routing-mark = rialkom table = rialkom add action = lookup comment = "" disabled = no routing-mark = beeline table = beeline add action = lookup comment = "" disabled = no routing-mark = inet table = inet

Помічаємо білий фарбою спинки пакетиків:

/ Ip firewall mangle add action = mark-routing chain = output comment = "Local answer to correct if" disabled = no new-routing-mark = beeline \ passthrough = yes src-address = 62.X.7.242 add action = mark- routing chain = output comment = "Local answer to correct if" disabled = no new-routing-mark = inet passthrough = \ yes src-address = 212.152.X.55 add action = mark-routing chain = output comment = "Local answer to correct if "disabled = no new-routing-mark = rialkom \ passthrough = yes src-address = 80.X.255.130

А якщо у мене два провайдера і один з них статика а другий PPPoE?

Якщо тільки два канали, то необхідно повикидати з скрипта всі згадки про третій провайдера, це не складно.

З приводу PPPOE, йому-же теж видається якоюсь іпішнік, а значить дана схема теж може працювати. Необхідно тільки окремо забезпечити автоматичне пере підключення PPPOE.

Готове рішення для випадку з PPPOE дати не вийти, тому що треба тестувати і налагоджувати.

Цікавить таке питання, в даній конфігурації відбувається розподіл навантаження по трьом каналам, або інші два використовуються як резервні.

Ні, в даному сценарії розподіл не відбувається.

Приклади з розподілом навантаження є в документації, наприклад:

Точніше складно сказати.

Також варто перевірити наступне:

1. Пакети справді не позначаються або мітка затирається.

Потрібно звернути увагу на параметр passthrough і порядок правил в яких відбувається установка міток.

2. Пакети позначаються, але за цими мітками нічого не відбувається.

Щось не так з таблицями маршрутизації або їх мітками (помилка в мітці?)

Спасибі, дуже допомогло в налаштуванні у себе.

Тільки додав пінг на два хоста, якщо раптом один лежить. В результаті є:

local IPToPing1 xx.xx.xx.xx

local IPToPing2 yy.yy.yy.yy

local pingresultA ([/ ping $ IPToPing1 count = $ PingCount src-address = $ SrcAddrA] + [/ ping $ IPToPing2 count = $ PingCount src-address = $ SrcAddrA])

local pingresultB ([/ ping $ IPToPing1 count = $ PingCount src-address = $ SrcAddrB] + [/ ping $ IPToPing2 count = $ PingCount src-address = $ SrcAddrB])

Ну і при перевірці (на прикладі першого):

if (($ pingresultA = 0) ($ PingresultB> = $ PingCount)) do =

зробив все як «по книзі» але коли роблю Дізабле основного інтерфейсу, інет потрапляє, іншими словами не перемикається на бек-ап канал.

Хто може допомогти, відпишіться на мило плз.

Наперед дякую.

Доброго часу доби всім добрий і чуйний людям!

Хай вибачать мене адміни форуму за цей відчайдушний крик душі.Помогіте налаштувати роутер: Microtik RouterBoard 493G,

За взаємну МАТЕРІАЛЬНУ допомогу з мого боку,

для компенсації ваших титанічних зусиль і витраченого часу.

Необхідно реалізувати наступну конфігурацію:

1.) Налаштувати 2 різних інтернет з'єднання.

a.) ISP1 провідний інтернет - має виділений ip.

b.) ISP2 usb модем Yota LTE - має виділений ip. (Роутер має usb порт)

але нічого не вийшло видає (no such item.) Якщо раптом так і не вийти підключити

спільними зусиллями то як варіант Yota модем застроми в ноут а з нього ISP2 (провід)

2.) Організувати резервну балансування інтернет каналу в разі падіння основного.

для всіх периферійних пристроїв знаходяться в мережі Lan, за однойменною повістю

a.) 2 Сервера RDP мають Основний Канал ISP2 (usb модем Yota LTE) - Резерв ISP 1 (провід).

3.) Дати доступ до 2-ум серверів RDP (radmin) з обох зовнішніх IP (isp 1 і isp 2)

за мотивами того ж всім нам доброго відомої людини легенди 🙂

А чого-б не попросити за «МАТЕРІАЛЬНУ» цього «людини легенду» самого допомогти? 🙂

Вибачте нуба (з роутер ос зіткнувся вперше):

Як додати маршрути в іменнование таблиці? (Ну то, що руками - це зрозуміло) Просто, всюди перед додаванням чого або, вказана команда, а тут немає.

Додаємо маршрути в іменовані таблиці маршрутизації:

add comment = "" disabled = no distance = 1 dst-address = 0.0.0.0 / 0 gateway = \

80.X.255.129 routing-mark = rialkom scope = 30 target-scope = 10

add comment = "" disabled = no distance = 1 dst-address = 0.0.0.0 / 0 gateway = \

62.X.7.241 routing-mark = beeline scope = 30 target-scope = 10

add comment = "" disabled = no distance = 1 dst-address = 0.0.0.0 / 0 gateway = \

212.152.X.1 routing-mark = inet scope = 30 target-scope = 10

Там просто: / ip route

А порт форвардного при такій настройці Роутера ускладнюється?

ip firewall nat add chain = dstnat dst-address = WORLD-IP protocol = udp dst-port = 1194 action = dstnat to-addresses = LOCAL-IP to-ports = 1194 і не працює правило, хоча, в теорії повинно.

Може я чогось не розумію?

Просто у внутрішній мережі живе сайт і ВПН-сервер і не можу до них достукатися. Плюс листи не приходять.

ЗИ. Все робив по Вашому мануалу. З локалки Інтернет видно.

Швидше за все щось наплутали в маршрутах і мітки.

Відповів в пошту.

Добрий день, не могли б на пошту скинути підкоригований скрипт для 2 каналів в інтернет. Намагаюся підкоригувати сам, але збиваюся на стрічках. if ((([/ ip route get [find comment = "GW_2"] distance] = 1) ([/ ip route get [find comment = "GW_1"] distance] = 2) ([/ ip route get [find comment = "GW_3"] distance] = 3)) = false) do =

і їм подібним, не можу зрозуміти що видаляти.

Якщо не складно буду чекати відповідь на пошту.

Для двох каналів це буде виглядати так:

local PingCount 3

# Ping GOOGLE DNS

local IPToPing 8.8.8.8

local SrcAddrA 80.X.255.130

local SrcAddrB 62.X.7.242

#ping gateways with src

local pingresultA [/ ping $ IPToPing count = $ PingCount src-address = $ SrcAddrA]

local pingresultB [/ ping $ IPToPing count = $ PingCount src-address = $ SrcAddrB]

#if link_A is DOWN and link_B is UP then:

if (($ pingresultA = 0) ($ PingresultB = $ PingCount)) do =

if ((([/ ip route get [find comment = "GW_2"] distance] = 1) ([/ ip route get [find comment = "GW_1"] distance] = 2)) = false) do =

log warning «set routes to B»

/ Ip route set [find comment = "GW_2"] distance = 1

/ Ip route set [find comment = "GW_1"] distance = 2

#if link_A is UP and link_B is DOWN then:

if (($ pingresultA = $ PingCount) ($ PingresultB = 0)) do =

if ((([/ ip route get [find comment = "GW_2"] distance] = 2) ([/ ip route get [find comment = "GW_1"] distance] = 1)) = false) do =

log warning «Set routes to A»

/ Ip route set [find comment = "GW_1"] distance = 1

/ Ip route set [find comment = "GW_2"] distance = 2

# Link A or Link B both are UP:

if (($ pingresultA = $ PingCount) ($ PingresultB = $ PingCount)) do =

if ((([/ ip route get [find comment = "GW_2"] distance] = 2) ([/ ip route get [find comment = "GW_1"] distance] = 1)) = false) do =

log warning «Set routes to A»

/ Ip route set [find comment = "GW_1"] distance = 1

/ Ip route set [find comment = "GW_2"] distance = 2

Велике спасибі за відповідь буду колупати далі сам.

Картина не зовсім повна, але спробую припустити:

На клієнтах другий DNS який, що не сервер першого провайдера? А на МК DNS-сервер коректно налаштований, в FW дозволений? На всіх клієнтів така проблема чи тільки на одному?

ipconfig / all + route print - в студію.

На клієнтах другого DNS немає (тільки первинний - IP мікротіка). На MK DNS налаштований так: ip dns set primary-dns = 109.232.185.26 secondary-dns = 91.204.136.6 allow-remote-requests = yes (первинний від першого провайдера, вторинний від другого). В FW спеціальних записів про DNS не робив. Спостерігається це на всіх клієнтах. Якщо у клієнта відключити кешування DNS, то при перемиканні каналу і пінг на ім'я працює адекватно.

Взагалі схоже, що тут не в DNS справу, а щось перемудрили з налаштуванням самого мікротіка. Що відбувається: після перемикання на інший канал «старі» з'єднання все одно направляються на старий канал.

До і після перемикання ya.ru ні перетворювати в різні іпішнікі? Думаю що так.

Що дасть такий тест: до перемикання починаємо одночасно пінгувати 213.180.193.3 і 93.158.134.203, після починаємо 213.180.204.3 і перезапускаємо перші два?

ЗИ: Рекомендую використовувати не DNS-сервера провайдерів, а DNS від google: 8.8.8.8 і 8.8.4.4

Як з'ясував у Яндекса своя мережа CDN для синхронізації серверів по світу. Там балансування, обчислення найменшого шляху, geoip і багато всього. IP можуть змінюватися не тільки при зміні маршрутів, а й на одному провайдеру. Поставив DNS від google і поки на цьому зупинився. Спасибі за сприяння.

Потрібна допомога в налаштуванні RB751g-2hnd (5.16 os) за винагороду, так як немає часу та й позначаються спогади настройки мікротіка 3.30 на PC. правда все запрацювало, але осад залишився. Завдання таке: треба завести 2 провайдера, один в резерві і активується при недоступності основного, і деактивується при появі основного. 2 провайдера підключені по DHCP.

1Порт основний провайдер

3порт проста роздача по DHCP

4порт клієнти підключені по PPPOE PPTP і статистичних IP.

WiFi проста роздача по DHCP і WEP ключем.

сподіваюся на повну підтримку в конфігуірованіі, але і не виключаю часткову при неможливості першої. доступ по Winbox (базову настройку доступу в інтернет зроблю сам) оплата Webmoney

Питання дурний, будуть-ли відновлюватися існуючі коннект на резервному каналі? Всю голову поламав, є софт, якому не подобається просте перемикання інету.

Мій перероблений робочий варіант скрипта

Думаю, у тебе використовуються протоколи динамічної маршрутизації (BGP, OSPF і т.п.) - опиши докладніше в pastebin своє мережеве оточення, у колег можуть виникнути зайві питання \ проблеми при імплементації.

Описуваний мною варіант для статичної маршрутизації, думаю тому у тебе і не запрацювало «з коробки».

Регулювали всі за офіційним мануалу (ENG)

У моєму випадку використовується 2 локальних мережі і 2 провайдера (модеми Bridge), але кількість локальних мереж на роботу скрипта не впливають.

p.s Імена інтерфейсів англійською.

Можливо в первісному скрипті можливо використовувати замість [find comment = "GW_3"] відразу імена інтерфейсів.

В скрипті на 2 провайдера помилка в рядках

log warning «set routes to A»

log warning «set routes to B»

через що він не працює! Потрібно знаки лапок «» замінити на ".

А так скрипт повністю робочий - все перемикається, тільки не забудьте виконати маркування як зазначено в статті (після опису скрипта на 3 провайдера)

З незрозумілих багів при роботі скрипта, скрипт був трохи переписаний повторно.

скрипт на pastebin.com

Приклад таблиці маршрутизації

Я помітив, що в процесі якогось оновлення WordPress поїхали спецсимволи типу лапок багато де, можливо справа в цьому.

Хлопці, все класно, але можете в скайпі пояснити як працює скрипт?

Зробив як описано тут. Інтерент сторінки і пінг бігають красиво. Але ось з кидок портів проблема, причому tcp (перевіряв на віддалене підключення до робочого столу) нормально, а udp нехочет, хоча в winbox-e показує що пакети шлються.

chain = dstnat action = netmap to-addresses = 10.10.1.201 to-ports = 7711

protocol = tcp in-interface = ether1 dst-port = 7711

chain = dstnat action = netmap to-addresses = 10.10.1.207 to-ports = 7711

protocol = udp in-interface = ether1 dst-port = 7711

chain = dstnat action = netmap to-addresses = 10.10.1.207 to-ports = 7711

protocol = udp in-interface = ether2 dst-port = 7711

chain = dstnat action = netmap to-addresses = 10.10.1.207 to-ports = 7711

protocol = tcp in-interface = ether2 dst-port = 7711

спасибі за мануал.

Схожі статті