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

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

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

Сообщение Chupaka » 18 июл 2017, 17:51

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

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

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

#
# здесь надо подправить метку на нужную (например, 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 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 type=unicast ]
    }
}
Идея взята из официальной документации и допилена до состояния, когда её можно использовать в боевых условиях :)

Аватара пользователя
kardash
Сообщения: 40
Зарегистрирован: 27 апр 2017, 22:08
Откуда: Минск
Контактная информация:

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

Сообщение kardash » 03 фев 2018, 21:06

Так хотелось поставить лайк (спасибо) чупа-чупсу за этот пост, но сайт не позволяет к сожалению....

Аватара пользователя
kardash
Сообщения: 40
Зарегистрирован: 27 апр 2017, 22:08
Откуда: Минск
Контактная информация:

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

Сообщение kardash » 07 фев 2018, 21:33

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

#
: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 - не добавило маршрут скриптом

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

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

Сообщение Chupaka » 08 фев 2018, 00:50

Откатился на bugfix, скопировал скрипт в DHCP-клиент - всё отлично добавляет и удаляет (при включении и выключении клиента соответственно)

Аватара пользователя
kardash
Сообщения: 40
Зарегистрирован: 27 апр 2017, 22:08
Откуда: Минск
Контактная информация:

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

Сообщение kardash » 08 фев 2018, 18:42

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

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

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

Сообщение Chupaka » 09 фев 2018, 08:29

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

А что говорит

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

/ip dhcp-client print detail
?

Аватара пользователя
kardash
Сообщения: 40
Зарегистрирован: 27 апр 2017, 22:08
Откуда: Минск
Контактная информация:

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

Сообщение kardash » 09 фев 2018, 23:06

В RouterOS v6.39.3 отрабатывает так как на скрине выше

Аватара пользователя
kardash
Сообщения: 40
Зарегистрирован: 27 апр 2017, 22:08
Откуда: Минск
Контактная информация:

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

Сообщение kardash » 09 фев 2018, 23:57

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

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

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

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

Сообщение Chupaka » 11 фев 2018, 19:12

А что поменялось? А то с телефона и с уничтоженным форматированием неудобно искать отличия. И что мешает задавать метрику?

Ответить