Всем привет! В данный момент RouterOS поддерживает добавление DHCP-опций и отправляет их только по запросу клиента. Мне же нужно отправлять условные опции, основываясь на информации, которую клиент присылает.
Первый пример — PXE-загрузка. В зависимости от того, что за клиент, что он поддерживает или на какой архитектуре основан, мне нужно отправлять разные опции. Вот пример конфигурации для ISC dhcpd:
# Объявляем пространство опций iPXE
option space ipxe;
option ipxe-encap-opts code 175 = encapsulate ipxe;
# Флаги возможностей iPXE, устанавливаемые в DHCP-запросе
option ipxe.http code 19 = unsigned integer 8;
option ipxe.bzimage code 24 = unsigned integer 8;
option ipxe.pxe code 33 = unsigned integer 8;
option ipxe.elf code 34 = unsigned integer 8;
option ipxe.efi code 36 = unsigned integer 8;
option ipxe.menu code 39 = unsigned integer 8;
# Другие полезные общие опции
option arch code 93 = unsigned integer 16;
class "PXEClient" {
match if substring(option vendor-class-identifier, 0, 9) = "PXEClient";
allow booting;
allow bootp;
next-server 10.0.0.1;
# Проверяем, поддерживает ли iPXE, который мы загружаем, необходимые функции,
# если нет — загружаем полнофункциональную версию.
if exists ipxe.http
and exists ipxe.menu
and ((exists ipxe.pxe
and exists ipxe.bzimage
and exists ipxe.elf)
or (exists ipxe.efi)) {
# Всё в порядке, просто отправляем файл конфигурации загрузки.
filename "http://10.0.0.1:3928/default.ipxe";
} elsif exists user-class and option user-class = "iPXE" {
# Мы уже используем iPXE, но не полнофункциональную версию,
# возможно, устаревшую из ROM, поэтому загрузим более
# полную версию с нативными драйверами.
if option arch = 00:06 {
filename "/ipxe/efi-i386.efi";
} elsif option arch = 00:07 {
filename "/ipxe/efi-x86_64.efi";
} else {
filename "/ipxe/ipxe.pxe";
}
} elsif exists user-class and option user-class = "gPXE" {
# Если у кого-то в ROM записана старая версия gPXE,
# загружаем более новую iPXE
filename "/ipxe/ipxe.pxe";
} elsif option arch = 00:06 {
filename "/ipxe/efi-i386.efi";
} elsif option arch = 00:07 {
filename "/ipxe/efi-x86_64.efi";
} else {
filename "/ipxe/ipxe.pxe";
}
}
Это довольно сложно... Используется информация из vendor-class-identifier, пространства опций ipxe и архитектуры (общая опция код 93). Но было бы здорово иметь такое решение в RouterOS.
Другой пример — микс VoIP-телефонов. В зависимости от производителя нужно отправлять разные опции…
# Siemens Opti Stage IP Phones
class "OptiIpPhone" {
match if option vendor-class-identifier = "OptiIpPhone";
option vendor-encapsulated-options 01:07:53:69:65:6D:65:6E:73:02:...;
}
# Lync Phone
class "CPE-OCPHONE" {
match if option vendor-class-identifier = "CPE-OCPHONE";
option vendor-encapsulated-options 01:0B:43:50:45:...;
}
class "MS-UC-Client" {
match if option vendor-class-identifier = "MS-UC-Client";
option vendor-encapsulated-options 01:0C:4d:53:2d:...;
}
Спасибо за ваши отличные устройства и замечательную операционную систему для роутеров!
С наилучшими пожеланиями, Крис
Первый пример — PXE-загрузка. В зависимости от того, что за клиент, что он поддерживает или на какой архитектуре основан, мне нужно отправлять разные опции. Вот пример конфигурации для ISC dhcpd:
# Объявляем пространство опций iPXE
option space ipxe;
option ipxe-encap-opts code 175 = encapsulate ipxe;
# Флаги возможностей iPXE, устанавливаемые в DHCP-запросе
option ipxe.http code 19 = unsigned integer 8;
option ipxe.bzimage code 24 = unsigned integer 8;
option ipxe.pxe code 33 = unsigned integer 8;
option ipxe.elf code 34 = unsigned integer 8;
option ipxe.efi code 36 = unsigned integer 8;
option ipxe.menu code 39 = unsigned integer 8;
# Другие полезные общие опции
option arch code 93 = unsigned integer 16;
class "PXEClient" {
match if substring(option vendor-class-identifier, 0, 9) = "PXEClient";
allow booting;
allow bootp;
next-server 10.0.0.1;
# Проверяем, поддерживает ли iPXE, который мы загружаем, необходимые функции,
# если нет — загружаем полнофункциональную версию.
if exists ipxe.http
and exists ipxe.menu
and ((exists ipxe.pxe
and exists ipxe.bzimage
and exists ipxe.elf)
or (exists ipxe.efi)) {
# Всё в порядке, просто отправляем файл конфигурации загрузки.
filename "http://10.0.0.1:3928/default.ipxe";
} elsif exists user-class and option user-class = "iPXE" {
# Мы уже используем iPXE, но не полнофункциональную версию,
# возможно, устаревшую из ROM, поэтому загрузим более
# полную версию с нативными драйверами.
if option arch = 00:06 {
filename "/ipxe/efi-i386.efi";
} elsif option arch = 00:07 {
filename "/ipxe/efi-x86_64.efi";
} else {
filename "/ipxe/ipxe.pxe";
}
} elsif exists user-class and option user-class = "gPXE" {
# Если у кого-то в ROM записана старая версия gPXE,
# загружаем более новую iPXE
filename "/ipxe/ipxe.pxe";
} elsif option arch = 00:06 {
filename "/ipxe/efi-i386.efi";
} elsif option arch = 00:07 {
filename "/ipxe/efi-x86_64.efi";
} else {
filename "/ipxe/ipxe.pxe";
}
}
Это довольно сложно... Используется информация из vendor-class-identifier, пространства опций ipxe и архитектуры (общая опция код 93). Но было бы здорово иметь такое решение в RouterOS.
Другой пример — микс VoIP-телефонов. В зависимости от производителя нужно отправлять разные опции…
# Siemens Opti Stage IP Phones
class "OptiIpPhone" {
match if option vendor-class-identifier = "OptiIpPhone";
option vendor-encapsulated-options 01:07:53:69:65:6D:65:6E:73:02:...;
}
# Lync Phone
class "CPE-OCPHONE" {
match if option vendor-class-identifier = "CPE-OCPHONE";
option vendor-encapsulated-options 01:0B:43:50:45:...;
}
class "MS-UC-Client" {
match if option vendor-class-identifier = "MS-UC-Client";
option vendor-encapsulated-options 01:0C:4d:53:2d:...;
}
Спасибо за ваши отличные устройства и замечательную операционную систему для роутеров!
С наилучшими пожеланиями, Крис
