Скрипт DHCP-клиента для создания маркированного маршрута

Автоматизация при помощи встроенного скриптового языка и RouterOS API
sharik987
Сообщения: 41
Зарегистрирован: 03 сен 2018, 12:47

Re: Скрипт DHCP-клиента для создания маркированного маршрута

Сообщение sharik987 »

Задача проста. Переключения с провайдера Один isp1, который дает белый динамический адрес, на LTE свисток(который даёт серый динамический адрес). В Нетвотче стоит задание Пингуй 1.1.1.1, если пингуется то ищи маршрут с комментарием ISP1, включай его, а маршрут с комментарием ISP2 выключай. А если НЕ пингуется 1.1.1.1 то наоборот isp1 выключай, а isp2 включай. Короче простое переключение на резервный канал.
Пинг до 1.1.1.1 у меня будет идти только через провайдера один isp1

И загвоздка в том, что в маршрутах не могу руками прописать статикой маршрутизацию до 0.0.0.0 и им дать комментарий, т.к. в поле гетевэй нужно вписывать цифры\ip адрес, маршрутизатора\шлюза провайдера , а не интерфейс микротика. А так же вписать на этом маршруте нужно Комментарий, и если динамическим его оставить, то после переключения\отключения провайдера динамический маршрут исчезнет, и когда восстановится и после мой комментарий исчезнет.
надеюсь нормально объяснил.
Аватара пользователя
Chupaka
Сообщения: 3559
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: Скрипт DHCP-клиента для создания маркированного маршрута

Сообщение Chupaka »

Я снова потерялся... Если isp1 совсем отвалится - то пропадут и все его маршруты, включая 1.1.1.1. А значит, пинг к 1.1.1.1 пойдёт через isp2, скрипт добросовестно включит ISP1, выключит ISP2... Я правильно описываю? В полночь выглядит так, что эта схема будет работать только тогда, когда линк к ISP1 есть, адрес по DHCP получает, а в Интернет он не ходит.
sharik987
Сообщения: 41
Зарегистрирован: 03 сен 2018, 12:47

Re: Скрипт DHCP-клиента для создания маркированного маршрута

Сообщение sharik987 »

Chupaka писал(а): 12 окт 2022, 23:54 Я правильно описываю?
Так... видимо я чего то не понимаю, для чего данный скрипт темы нужен. Как я понимаю, Для того что бы статический маршрут автоматически появлялся, с нужной мне метрикой и плюсом маркировкой. В тот момент когда DHCP клиент получает адрес от isp1, следовательно при отключении интернета\провайдера\провода isp1 этот СТАТИЧЕСКИЙ адрес останется, и будет продолжать пытаться работать через isp1.
2022-10-13_9-11-39.jpg
под цифрой 3 удалится, а под цифрой 1 останется. У меня же проблема с цирой 4, т.к. гетевэй указан "ether1", что не правильно, и не правильно отрабатывает маршрут, а нужно указать гетэвэй как у цифры 1, по скрину 178.ХХХ.ХХХ.ХХХ. И тогда у меня будет отрабатывать нетвоч как надо, и переключать правильный isp. (естественно в фаирволе у меня пинг может идти до 1.1.1.1 только через ether1 )
В общем как мне резервирование настроить если посмотреть на мой скриншет?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Chupaka
Сообщения: 3559
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: Скрипт DHCP-клиента для создания маркированного маршрута

Сообщение Chupaka »

Почему роут под цифрой 1 останется? Нижняя видимая строка скрипта DHCP-клиента на вашем скриншоте (/ip route remove ...) как раз и удалит его, когда DHCP-клиент потеряет адрес :) А ещё он маркированный (routing-mark=ether1), поэтому используется только для маркированного трафика. А ещё даже если его не удалить - при потере адреса шлюз станет неактивным, поэтому неактивным станет и сам роут, и использоваться в процессе поиска маршрута не будет.

Если же вам надо просто, например, обновить шлюз у всех маршрутов к 1.1.1.1/32 при переполучении адреса DHCP-клиентом, то можно сделать вот так:

Код: Выделить всё

:if ($bound=1) do={
    :set gw "$"gateway-address"%$interface"
    /ip route set [ find dst-address=1.1.1.1/32 gateway!=$gw ] gateway=$gw
}
З.Ы. Смотрю, через пару недель после публикации моего скрипта здесь в вики добавили параметр "gateway-address", так что мой скрипт можно упростить, удалив две строчки :)
Аватара пользователя
Chupaka
Сообщения: 3559
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: Скрипт DHCP-клиента для создания маркированного маршрута

Сообщение Chupaka »

Подправил первое сообщение темы. Оказывается, в скрипте доступна переменная gateway-address - используем её. И добавил скрипт для RouterOS v7 - там поменяли routing-mark на routing-table и надо заранее создавать таблицу маршрутизации.
sharik987
Сообщения: 41
Зарегистрирован: 03 сен 2018, 12:47

Re: Скрипт DHCP-клиента для создания маркированного маршрута

Сообщение sharik987 »

Chupaka писал(а): 13 окт 2022, 14:40 Нижняя видимая строка скрипта DHCP-клиента на вашем скриншоте (/ip route remove ...) как раз и удалит его, когда DHCP-клиент потеряет адрес
На сколько я знал скрипт в DHCP выполнятся только в момент получения ip адреса. Сейчас вики причитал пишут при изменении статуса DHCP.
Chupaka писал(а): 13 окт 2022, 14:40 А ещё даже если его не удалить - при потере адреса шлюз станет неактивным, поэтому неактивным станет и сам роут, и использоваться в процессе поиска маршрута не будет.
Но тогда как быть? как мне автопереключение интернета настроить между isp1 и isp2 ? при условии что isp1 основной, и по dhcp получает адрес.
При статике я делал как, пинговал к примеру 8.8.8.8 только через isp1, в маршрутах на это указывал, и в фаирволе запрещал через isp2 идти до 8.8.8.8. И всё работало.
Аватара пользователя
Chupaka
Сообщения: 3559
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: Скрипт DHCP-клиента для создания маркированного маршрута

Сообщение Chupaka »

Я бы попробовал так:

Код: Выделить всё

:local count [ /ip route print count-only where dst-address=1.1.1.1/32 scope=10 ]
:if ($bound=1) do={
    :local gw "$"gateway-address"%$interface"
    :if ($count=0) do={
        /ip route add dst-address=1.1.1.1/32 scope=10 gateway=$gw
    } else={
        /ip route set [ find dst-address=1.1.1.1/32 scope=10 gateway!=$gw ] gateway=$gw
    }
}
Этот скрипт будет создавать маршрут к 1.1.1.1 с scope=10 через isp1. При этом добавление default gateway в DHCP-клиенте надо выключить и создать маршрут /ip route add gateway=1.1.1.1 check-gateway=ping. Он будет активным тогда, когда 1.1.1.1 активный и пингуется. Netwatch не нужен.