Страница 1 из 2

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

Добавлено: 18 июл 2017, 17:51
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 ]
    }
}
Идея взята из официальной документации и допилена до состояния, когда её можно использовать в боевых условиях :)

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

Добавлено: 03 фев 2018, 21:06
kardash
Так хотелось поставить лайк (спасибо) чупа-чупсу за этот пост, но сайт не позволяет к сожалению....

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

Добавлено: 07 фев 2018, 21:33
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 - не добавило маршрут скриптом

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

Добавлено: 08 фев 2018, 00:50
Chupaka
Откатился на bugfix, скопировал скрипт в DHCP-клиент - всё отлично добавляет и удаляет (при включении и выключении клиента соответственно)

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

Добавлено: 08 фев 2018, 18:42
kardash
Добавляет, но я такое руками могу добавить....
01.png
01.png (49.74 КБ) 18724 просмотра
Указать интерфейс, а не шлюз можно, но такой роут не будет работать в Router OS
Что не так?

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

Добавлено: 09 фев 2018, 08:29
Chupaka
Как видно из кода, должен быть IP в том числе

А что говорит

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

/ip dhcp-client print detail
?

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

Добавлено: 09 фев 2018, 23:06
kardash
В RouterOS v6.39.3 отрабатывает так как на скрине выше

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

Добавлено: 09 фев 2018, 23:57
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 ]
}
}
В таком виде работает правильно только хотелось бы ещё метрику задавать....

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

Добавлено: 11 фев 2018, 19:12
Chupaka
А что поменялось? А то с телефона и с уничтоженным форматированием неудобно искать отличия. И что мешает задавать метрику?

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

Добавлено: 28 окт 2019, 14:58
winhex
Добрый день! Я использую резервирование каналов при помощи двух статических роутов с check-gateway и разным distance, все работает отлично, но есть небольшая проблема - один из провайдеров (velcom) иногда меняет шлюз, из-за чего микротик перекидывает все на резервный dsl-канал. После ручного изменения шлюза все работает дальше. Я так понимаю, этот скрипт можно использовать для решения проблемы? Т.е. маршрут с новым шлюзом для velcom прописывать этим скриптом - кроме шлюза ничего не меняется.

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

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

Меняется адрес шлюза, а адрес клиента остаётся тем, что и был?.. А пример можно в студию? Как-то я пока не представляю, что они такое у себя там внутри наворотили для этого %)

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

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

Меняется адрес шлюза, а адрес клиента остаётся тем, что и был?.. А пример можно в студию? Как-то я пока не представляю, что они такое у себя там внутри наворотили для этого %)
Адрес статика, шлюз иногда меняется, отдает по DHCP. Пример можно, только как его показать? Вот при последующих реконектах шлюз остался прежним, т.е. не то чтобы они его постоянно меняли, но все же..
А что за проблема им у себя шлюз поменять? Они-то уверены что при реконекте все его получат через dhcp и никто не заметит даже )

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

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

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

Добавлено: 15 сен 2020, 21:39
sharik987
Доброго времени всем.
Можете объяснить следующее. Если я включаю в дхцп клиенте скрипт, зачем мне ставить галку эдд дефаул роутер? (если не ставлю перестаёт работать)

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

Добавлено: 15 сен 2020, 23:57
Chupaka
Доброго.

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

Если скрипт создаёт маркированный маршрут, то для работы сервисов самого роутера (например, DNS-сервера) всё ещё нужен немаркированный маршрут, который создаётся галкой Add Default Route.

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

Добавлено: 21 сен 2020, 09:56
sharik987
Тогда у меня два маршрута образуется, с одинаковой дистанцией, это правильно? Или тот что образуется с помощью галки Add Default Route поставить дистанцию Больше единицы?

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

Добавлено: 21 сен 2020, 16:16
Chupaka
Но ведь эти маршруты в разных таблицах маршрутизации, верно?

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

Добавлено: 16 май 2021, 02:35
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 ]
    }
}

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

Добавлено: 16 май 2021, 03:12
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 ]
    }
}

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

Добавлено: 16 май 2021, 15:03
Chupaka
М-м-м, т.е. если не указывать check-gateway - то маршрут неактивный, а если указать check-gateway=arp - то всё работает?..

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

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

Нынче ночью имел развлечения по этой теме

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

Добавлено: 16 май 2021, 20:46
Dark Mind
Как одновременно поднять два маршрута и в таблице main и в кастомной, при чем с разными метриками?

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

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

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

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

В моем случае в качестве пограничного маршрутизатора стоит CCR1009 а к нему подвешены несколько Uplink-ов.
SXT-LTE один из них. С ним я и трахался.

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

Добавлено: 16 май 2021, 21:06
Dark Mind
Могу предположить почему, корректно, в моем случае все заработало только с check-gateway=arp.

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

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

Для справки: и на CCR и на SXT RoS 6.48.2

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

Добавлено: 07 окт 2022, 09:48
sharik987
Здравствуйте.
Подскажите, как в этом скрипте сделать так что бы, создавался еще один маршрут до 1.1.1.1 ?
Т.е. у меня есть isp1 подключенный в eth1, и есть юсб свисток в резервным каналом. ISP1 через DHCP получает адрес, следовательно гетэвэй может меняется у провайдера. И я не могу написать микротику иди к 1.1.1.1 через интерфейс eth1, микротик просит цифры гетэвэя а не интерфейс.

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

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