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

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

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

Сообщение Chupaka »

Скрипт создаёт дефолтный маршрут с указанной Routing Mark, при этом в шлюзе указывается IP-адрес и интерфейс (на случай, если на разных интерфейсах получены одинаковые шлюзы)

Скрипт нужно вписать в поле Script у DHCP-Client'а, подправив лишь первую переменную (изменить на желаемую Routing Mark для данного интерфейса). Если нужно добавлять в основную таблицу маршрутизации, делаем :local rmark "main"

UPDATES:
13.10.2022: Оказывается, в скрипте доступна переменная gateway-address - используем её. И добавил скрипт для RouterOS v7 - там поменяли routing-mark на routing-table и надо заранее создавать таблицу маршрутизации.

Для RouterOS v6:

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

#
# здесь надо подправить метку на нужную (например, WAN1, WAN2, WAN3)
# ставим "main", если надо добавить маршрут в основную таблицу маршрутизации
#
:local rmark "WAN1"
#
# дальше ничего редактировать не надо
#
:local count [ /ip route print count-only where dst-address=0.0.0.0/0 routing-mark=$rmark ]
:if ($bound=1) do={
    :local gw "$"gateway-address"%$interface"
    :if ($count=0) do={
        /ip route add gateway=$gw routing-mark=$rmark
    } else={
        if ($rmark="main") do={
            /ip route set [ find dst-address=0.0.0.0/0 !routing-mark gateway!=$gw ] gateway=$gw
        } else={
            /ip route set [ find dst-address=0.0.0.0/0 routing-mark=$rmark gateway!=$gw ] gateway=$gw
        }
    }
} 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 ]
    }
}
Для RouterOS v7:

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

#
# здесь надо подправить метку на нужную (например, WAN1, WAN2, WAN3)
# ставим "main", если надо добавить маршрут в основную таблицу маршрутизации
# таблица уже должна существовать, создаётся командой
# /routing table add fib name=ИМЯ
#
:local rmark "WAN1"
#
# дальше ничего редактировать не надо
#
:local count [ /ip route print count-only where dst-address=0.0.0.0/0 routing-table=$rmark ]
:if ($bound=1) do={
    :local gw "$"gateway-address"%$interface"
    :if ($count=0) do={
        /ip route add gateway=$gw routing-table=$rmark
    } else={
        if ($rmark="main") do={
            /ip route set [ find dst-address=0.0.0.0/0 !routing-table gateway!=$gw ] gateway=$gw
        } else={
            /ip route set [ find dst-address=0.0.0.0/0 routing-table=$rmark gateway!=$gw ] gateway=$gw
        }
    }
} else={
    :if ($rmark="main") do={
        /ip route remove [ find dst-address=0.0.0.0/0 !routing-table gateway~"%$interface\$" ]
    } else={
        /ip route remove [ find dst-address=0.0.0.0/0 routing-table=$rmark type=unicast ]
    }
}
Идея взята из официальной документации и допилена до состояния, когда её можно использовать в боевых условиях :)
Аватара пользователя
kardash
Сообщения: 302
Зарегистрирован: 27 апр 2017, 22:08
Откуда: Минск

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

Сообщение kardash »

Так хотелось поставить лайк (спасибо) чупа-чупсу за этот пост, но сайт не позволяет к сожалению....
Мой блог по MikroTik: https://netflow.by/blog/tweak-isp/mikrotik 8-)
Аватара пользователя
kardash
Сообщения: 302
Зарегистрирован: 27 апр 2017, 22:08
Откуда: Минск

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

Сообщение kardash »

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

#
:local rmark "WAN1"
#
# дальше ничего редактировать не надо
#
: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
    } else={
        if ($rmark="main") do={
            /ip route set [ find dst-address=0.0.0.0/0 !routing-mark gateway!=$gw ] gateway=$gw
        } else={
            /ip route set [ find dst-address=0.0.0.0/0 routing-mark=$rmark gateway!=$gw ] gateway=$gw
        }
    }
} 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 ]
    }
}
Использовал в таком виде для RouterOS v6.39.3 - не добавило маршрут скриптом
Мой блог по MikroTik: https://netflow.by/blog/tweak-isp/mikrotik 8-)
Аватара пользователя
Chupaka
Сообщения: 4086
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

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

Сообщение Chupaka »

Откатился на bugfix, скопировал скрипт в DHCP-клиент - всё отлично добавляет и удаляет (при включении и выключении клиента соответственно)
Аватара пользователя
kardash
Сообщения: 302
Зарегистрирован: 27 апр 2017, 22:08
Откуда: Минск

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

Сообщение kardash »

Добавляет, но я такое руками могу добавить....
01.png
Указать интерфейс, а не шлюз можно, но такой роут не будет работать в Router OS
Что не так?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Мой блог по MikroTik: https://netflow.by/blog/tweak-isp/mikrotik 8-)
Аватара пользователя
Chupaka
Сообщения: 4086
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

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

Сообщение Chupaka »

Как видно из кода, должен быть IP в том числе

А что говорит

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

/ip dhcp-client print detail
?
Аватара пользователя
kardash
Сообщения: 302
Зарегистрирован: 27 апр 2017, 22:08
Откуда: Минск

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

Сообщение kardash »

В RouterOS v6.39.3 отрабатывает так как на скрине выше
Мой блог по MikroTik: https://netflow.by/blog/tweak-isp/mikrotik 8-)
Аватара пользователя
kardash
Сообщения: 302
Зарегистрирован: 27 апр 2017, 22:08
Откуда: Минск

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

Сообщение kardash »

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

#
:local rmark "WAN2"
#
: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 $iface
:if ($count=0) do={
/ip route add gateway=$gw routing-mark=$rmark
} else={
if ($rmark="main") do={
/ip route set [ find dst-address=0.0.0.0/0 !routing-mark gateway!=$gw ] gateway=$gw
} else={
/ip route set [ find dst-address=0.0.0.0/0 routing-mark=$rmark gateway!=$gw ] gateway=$gw
}
}
} 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 ]
}
}
В таком виде работает правильно только хотелось бы ещё метрику задавать....
Мой блог по MikroTik: https://netflow.by/blog/tweak-isp/mikrotik 8-)
Аватара пользователя
Chupaka
Сообщения: 4086
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

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

Сообщение Chupaka »

А что поменялось? А то с телефона и с уничтоженным форматированием неудобно искать отличия. И что мешает задавать метрику?
winhex
Сообщения: 4
Зарегистрирован: 28 окт 2019, 14:35
Откуда: Минск

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

Сообщение winhex »

Добрый день! Я использую резервирование каналов при помощи двух статических роутов с check-gateway и разным distance, все работает отлично, но есть небольшая проблема - один из провайдеров (velcom) иногда меняет шлюз, из-за чего микротик перекидывает все на резервный dsl-канал. После ручного изменения шлюза все работает дальше. Я так понимаю, этот скрипт можно использовать для решения проблемы? Т.е. маршрут с новым шлюзом для velcom прописывать этим скриптом - кроме шлюза ничего не меняется.
Аватара пользователя
Chupaka
Сообщения: 4086
Зарегистрирован: 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
Сообщения: 4086
Зарегистрирован: 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
Сообщения: 4086
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

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

Сообщение Chupaka »

Доброго.

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

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

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

Сообщение sharik987 »

Тогда у меня два маршрута образуется, с одинаковой дистанцией, это правильно? Или тот что образуется с помощью галки Add Default Route поставить дистанцию Больше единицы?
Аватара пользователя
Chupaka
Сообщения: 4086
Зарегистрирован: 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
Сообщения: 4086
Зарегистрирован: 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, микротик просит цифры гетэвэя а не интерфейс.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Chupaka
Сообщения: 4086
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

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

Сообщение Chupaka »

Приветствую. Вам надо создавать маршрут к 1.1.1.1/32 в дополнение к 0.0.0.0/0?.. А почему вы решили, что 0.0.0.0/0 не хватит? Может, вы лучше задачу опишите, а не конкретный путь её решения?..