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

Автоматизация при помощи встроенного скриптового языка и RouterOS API
Аватара пользователя
Chupaka
Сообщения: 3880
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск
Контактная информация:

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

Сообщение Chupaka »

Добрый. Velcom отдаёт адрес по DHCP? Тогда можно попробовать этот скрипт.

Меняется адрес шлюза, а адрес клиента остаётся тем, что и был?.. А пример можно в студию? Как-то я пока не представляю, что они такое у себя там внутри наворотили для этого %)
winhex
Сообщения: 4
Зарегистрирован: 28 окт 2019, 14:35
Откуда: Минск

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

Сообщение winhex »

Chupaka писал(а): 28 окт 2019, 18:08 Добрый. Velcom отдаёт адрес по DHCP? Тогда можно попробовать этот скрипт.

Меняется адрес шлюза, а адрес клиента остаётся тем, что и был?.. А пример можно в студию? Как-то я пока не представляю, что они такое у себя там внутри наворотили для этого %)
Адрес статика, шлюз иногда меняется, отдает по DHCP. Пример можно, только как его показать? Вот при последующих реконектах шлюз остался прежним, т.е. не то чтобы они его постоянно меняли, но все же..
А что за проблема им у себя шлюз поменять? Они-то уверены что при реконекте все его получат через dhcp и никто не заметит даже )
Аватара пользователя
Chupaka
Сообщения: 3880
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск
Контактная информация:

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

Сообщение Chupaka »

winhex писал(а): 30 окт 2019, 10:42 Адрес статика, шлюз иногда меняется, отдает по DHCP.
Т.е. в какие-то моменты действия текущей аренды у них работает два шлюза в одной подсети? Бессмысленно и беспощадно :)
winhex писал(а): 30 окт 2019, 10:42 Пример можно, только как его показать?
Просто текстом: вот был такой-то шлюз, а потом стал такой.
winhex писал(а): 30 окт 2019, 10:42 А что за проблема им у себя шлюз поменять? Они-то уверены что при реконекте все его получат через dhcp и никто не заметит даже )
Ну, как минимум реконнект будет заметен многим :)
sharik987
Сообщения: 41
Зарегистрирован: 03 сен 2018, 12:47

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

Сообщение sharik987 »

Доброго времени всем.
Можете объяснить следующее. Если я включаю в дхцп клиенте скрипт, зачем мне ставить галку эдд дефаул роутер? (если не ставлю перестаёт работать)
Аватара пользователя
Chupaka
Сообщения: 3880
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск
Контактная информация:

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

Сообщение Chupaka »

Доброго.

Не совсем понятно, что именно перестаёт работать.

Если скрипт создаёт маркированный маршрут, то для работы сервисов самого роутера (например, DNS-сервера) всё ещё нужен немаркированный маршрут, который создаётся галкой Add Default Route.
sharik987
Сообщения: 41
Зарегистрирован: 03 сен 2018, 12:47

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

Сообщение sharik987 »

Тогда у меня два маршрута образуется, с одинаковой дистанцией, это правильно? Или тот что образуется с помощью галки Add Default Route поставить дистанцию Больше единицы?
Аватара пользователя
Chupaka
Сообщения: 3880
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск
Контактная информация:

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

Сообщение Chupaka »

Но ведь эти маршруты в разных таблицах маршрутизации, верно?
Dark Mind
Сообщения: 5
Зарегистрирован: 16 май 2021, 02:18

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

Сообщение Dark Mind »

Возврашаю народу оригинальный скрипт с небольшим допилом.

Тут интересовались изменением метрики маршрута. Допил именно на эту тему.

Добавлены две входные переменные Description и Metric

Спасибо Аффтару за идею!
Буду еще сочинять скрипт на подъем маршрута и в таблице main и в альтернативной одновременно.

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

#
# здесь надо подправить метку на нужную (например, WAN1, WAN2, WAN3)
# ставим "main", если надо добавить маршрут в основную таблицу маршрутизации
#
########################################
# Дописка к оригинальному скрипту:
# Переменная metric
# в нее пишем необходимое значение метрики. 
# В терминах RoS это параметр Distance
# Переменная description
# В нее мы пишем желаемый коментарий
########################################
:local rmark "main"
# А это дописанные входные переменные для скрипта
:local metric "253"
:local description "Emergency Route via SXT LTE UpLink"
#
# дальше ничего редактировать не надо
#
:local count [ /ip route print count-only where dst-address=0.0.0.0/0 routing-mark=$rmark ]
:if ($bound=1) do={
    :local iface $interface
    :local gw [ /ip dhcp-client get [ find interface=$"iface" ] gateway ]
    :set gw "$gw%$iface"
    :if ($count=0) do={
        /ip route add gateway=$gw routing-mark=$rmark distance=$metric comment=$description
    } else={
        if ($rmark="main") do={
            /ip route set [ find dst-address=0.0.0.0/0 !routing-mark gateway!=$gw ] gateway=$gw distance=$metric comment=$description
        } else={
            /ip route set [ find dst-address=0.0.0.0/0 routing-mark=$rmark gateway!=$gw ] gateway=$gw distance=$metric comment=$description
        }
    }
} else={
    :if ($rmark="main") do={
        /ip route remove [ find dst-address=0.0.0.0/0 !routing-mark gateway~"%$interface\$" ]
    } else={
        /ip route remove [ find dst-address=0.0.0.0/0 routing-mark=$rmark type=unicast ]
    }
}
Dark Mind
Сообщения: 5
Зарегистрирован: 16 май 2021, 02:18

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

Сообщение Dark Mind »

Предложенный скрипт с допилом не работает с 3G/LTE Uplink-ами.
Добавил еще одну переменную check.

С 3G/LTE для переменной check нужно выбирать значение "arp", иначе маршрут падает в unreachable

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

#
# здесь надо подправить метку на нужную (например, WAN1, WAN2, WAN3)
# ставим "main", если надо добавить маршрут в основную таблицу маршрутизации
#
########################################
# Дописка к оригинальному скрипту:
# Переменная metric
# в нее пишем необходимое значение метрики. 
# В терминах RoS это параметр Distance
# Переменная description
# В нее мы пишем желаемый коментарий
########################################
# Еще одна дописка - переменная check
# Допустимые значения "arp" иили "ping"
########################################
:local rmark "main"
# А это дописанные входные переменные для скрипта
:local metric "253"
:local description "Emergency Route via SXT LTE UpLink"
:local check "arp"
#
# дальше ничего редактировать не надо
#
:local count [ /ip route print count-only where dst-address=0.0.0.0/0 routing-mark=$rmark ]
:if ($bound=1) do={
    :local iface $interface
    :local gw [ /ip dhcp-client get [ find interface=$"iface" ] gateway ]
    :set gw "$gw%$iface"
    :if ($count=0) do={
        /ip route add gateway=$gw routing-mark=$rmark check-gateway=$check distance=$metric comment=$description
    } else={
        if ($rmark="main") do={
            /ip route set [ find dst-address=0.0.0.0/0 !routing-mark gateway!=$gw ] gateway=$gw check-gateway=$check distance=$metric comment=$description
        } else={
            /ip route set [ find dst-address=0.0.0.0/0 routing-mark=$rmark gateway!=$gw ] gateway=$gw check-gateway=$check distance=$metric comment=$description
        }
    }
} else={
    :if ($rmark="main") do={
        /ip route remove [ find dst-address=0.0.0.0/0 !routing-mark gateway~"%$interface\$" ]
    } else={
        /ip route remove [ find dst-address=0.0.0.0/0 routing-mark=$rmark type=unicast ]
    }
}
Аватара пользователя
Chupaka
Сообщения: 3880
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск
Контактная информация:

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

Сообщение Chupaka »

М-м-м, т.е. если не указывать check-gateway - то маршрут неактивный, а если указать check-gateway=arp - то всё работает?..
Dark Mind
Сообщения: 5
Зарегистрирован: 16 май 2021, 02:18

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

Сообщение Dark Mind »

М-м-м, т.е. если не указывать check-gateway - то маршрут неактивный, а если указать check-gateway=arp - то всё работает?..
Не знаю с чем связано, но таки да...

Нынче ночью имел развлечения по этой теме
Dark Mind
Сообщения: 5
Зарегистрирован: 16 май 2021, 02:18

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

Сообщение Dark Mind »

Как одновременно поднять два маршрута и в таблице main и в кастомной, при чем с разными метриками?

Оказалось всё банально просто:
1. Вешаем последнюю версию скрипта на DHCP клиента на нужном интерфейсе.
2. Правим в скрипте входные данные под нашу кастомную таблицу.
3. А для того чтобы поднять еще один маршрут, но уже в таблице main говорим DHCP клиенту, что нужно использовать Default Route c нужной нам метрикой.

После этого поднимаются два маршрута в двух таблицах с теми метриками, которые задуманы.

Этот ленивый способ тоже придумался и опробован сегодня ночью.

У меня, наконец всё заработало, как задумывалось с WAN Uplink-ом через SXT LTE.

В моем случае в качестве пограничного маршрутизатора стоит CCR1009 а к нему подвешены несколько Uplink-ов.
SXT-LTE один из них. С ним я и трахался.
Dark Mind
Сообщения: 5
Зарегистрирован: 16 май 2021, 02:18

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

Сообщение Dark Mind »

Могу предположить почему, корректно, в моем случае все заработало только с check-gateway=arp.

У меня на SXT-LTE идет проброс LTE через APN в режиме Passthrough на локальный бридж в пределах SXT-LTE. А уже дальше с этого бриджа всё прилетает на интерфейс CCR1009.

Возможно это связано именно с Passthrough. Но я в этом до конца не уверен.

Для справки: и на CCR и на SXT RoS 6.48.2
sharik987
Сообщения: 41
Зарегистрирован: 03 сен 2018, 12:47

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

Сообщение sharik987 »

Здравствуйте.
Подскажите, как в этом скрипте сделать так что бы, создавался еще один маршрут до 1.1.1.1 ?
Т.е. у меня есть isp1 подключенный в eth1, и есть юсб свисток в резервным каналом. ISP1 через DHCP получает адрес, следовательно гетэвэй может меняется у провайдера. И я не могу написать микротику иди к 1.1.1.1 через интерфейс eth1, микротик просит цифры гетэвэя а не интерфейс.
Вложения
2022-10-06_16-29-12.jpg
2022-10-06_16-29-12.jpg (23.47 КБ) 7719 просмотров
Аватара пользователя
Chupaka
Сообщения: 3880
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск
Контактная информация:

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

Сообщение Chupaka »

Приветствую. Вам надо создавать маршрут к 1.1.1.1/32 в дополнение к 0.0.0.0/0?.. А почему вы решили, что 0.0.0.0/0 не хватит? Может, вы лучше задачу опишите, а не конкретный путь её решения?..
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
Сообщения: 3880
Зарегистрирован: 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
2022-10-13_9-11-39.jpg (143.15 КБ) 5018 просмотров
под цифрой 3 удалится, а под цифрой 1 останется. У меня же проблема с цирой 4, т.к. гетевэй указан "ether1", что не правильно, и не правильно отрабатывает маршрут, а нужно указать гетэвэй как у цифры 1, по скрину 178.ХХХ.ХХХ.ХХХ. И тогда у меня будет отрабатывать нетвоч как надо, и переключать правильный isp. (естественно в фаирволе у меня пинг может идти до 1.1.1.1 только через ether1 )
В общем как мне резервирование настроить если посмотреть на мой скриншет?
Аватара пользователя
Chupaka
Сообщения: 3880
Зарегистрирован: 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
Сообщения: 3880
Зарегистрирован: 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
Сообщения: 3880
Зарегистрирован: 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 не нужен.
Аватара пользователя
Dominik
Сообщения: 19
Зарегистрирован: 09 июл 2018, 12:59
Контактная информация:

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

Сообщение Dominik »

SXT-R настроен на passthrough на hap ac lite, в свою очередь DHCP client получает адрес с него на порт lte_mngmt
DNS server (Ad-guard 192.168.2.19) настроен на сервере в локалке 192.168.2.0/25
Хочу пропищат скрипт в DHCP Client yf SXT-R чтобы когда меняется DNS сервер на hap-ac lite, также обновляйся DHCP client на SXT-R
Пробовал:

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

:if ( [/ping 192.168.2.19 interface=lte_mngmt count=3] = 0) do={/ip dhcp-client release numbers=0}
Скрипт в поле DHCP Client на SXT-R не срабатывает, в Scheduler срабатывает, но только когда пропадает пинг на сервере, при появлении пинга обратно не переключает на внутренний DNS 192.168.1.1
Сможете помочь?
Цифровая типография в Москве здесь
Аватара пользователя
Chupaka
Сообщения: 3880
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск
Контактная информация:

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

Сообщение Chupaka »

Dominik писал(а): 26 фев 2024, 12:19 Хочу пропищат скрипт в DHCP Client yf SXT-R
Этот скрипт выполняется, когда клиент получает или теряет адрес. Между этими событиями он НЕ выполняется.
Dominik писал(а): 26 фев 2024, 12:19 чтобы когда меняется DNS сервер на hap-ac lite, также обновляйся DHCP client на SXT-R
В смысле, когда hap-ac начинает выдавать по DHCP другой адрес? А он его не обновляет по истечению Lease Time? Может, достаточно просто уменьшить Lease Time для SXT на сервере до разумного минимума?
Dominik писал(а): 26 фев 2024, 12:19 в Scheduler срабатывает, но только когда пропадает пинг на сервере, при появлении пинга обратно не переключает на внутренний DNS
Ваш скрипт запускает переполучение адреса, когда пинга нет. Когда пинг появляется - скрипт не делает ничего. Если нужно ловить события пропадания-появления пинга - можно воспользоваться Tools -> Netwatch (прописав переполучение адреса в оба скрипта, Up и Down).
Аватара пользователя
Dominik
Сообщения: 19
Зарегистрирован: 09 июл 2018, 12:59
Контактная информация:

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

Сообщение Dominik »

Chupaka писал(а): 26 фев 2024, 14:40 В смысле, когда hap-ac начинает выдавать по DHCP другой адрес? А он его не обновляет по истечению Lease Time? Может, достаточно просто уменьшить Lease Time для SXT на сервере до разумного минимума?
Разумный это сколько? 1 минута не слишком ли мало, вед когда изменится DNS то если поставит 10 мин., например, то эти 10 мин не будет интернета получается, вернее не будут резолвится домены)
Chupaka писал(а): 26 фев 2024, 14:40 Если нужно ловить события пропадания-появления пинга - можно воспользоваться Tools -> Netwatch (прописав переполучение адреса в оба скрипта, Up и Down).
Да, согласен: сделал так: ping сервера [192.168.2.39] на котором крутится Adguard
UP {/ip dhcp-server network set 0 dns-server=192.168.2.39; /log info "Updating DNS to Adguard"}
Down {/ip dhcp-server network set 0 dns-server=192.168.2.1; /log warning "Updating DNS to third-party"}
Все норм орабатывает! Спасибо, остался вопрос: Lease Time на DHCP сервере, какой оптимально поставить чтобы инет не пропадал, если "упадет" сервер с Adguard
Цифровая типография в Москве здесь
Ответить