![обнаружение неверного MAC-адреса сервера dhcpd](https://rvso.com/image/768933/%D0%BE%D0%B1%D0%BD%D0%B0%D1%80%D1%83%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BD%D0%B5%D0%B2%D0%B5%D1%80%D0%BD%D0%BE%D0%B3%D0%BE%20MAC-%D0%B0%D0%B4%D1%80%D0%B5%D1%81%D0%B0%20%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B0%20dhcpd.png)
В моей конфигурации DHCP у меня есть хук on commit для сохранения информации об устройстве. Моя проблема в том, что некоторые MAC-адреса становятся недействительными:
8:7c:39:cf:b6:3f
- это должно начинаться с нуля
8:d0:b7:52:f9:68
- также это
мойdhcpd.conf
set clientmac = binary-to-ascii(16,8,":",substring(hardware,1,6));
решение1
Это зависит от того, что вы используете для анализа. Можно утверждать, что полностью допустимо опускать префиксные нули, и именно так мы поступаем большую часть времени, поскольку нет определения того, сколько цифр должно быть.
Однако если мы пропустим часть о том, является ли это недействительным и почему, и вместо этого спросим «Как мне получить это в нужном формате», мы сможем дать ответ.
В этом случаеУ isc есть статья в базе знаний об этом
Это не ошибка. Проблема в том, что функция двоичного кода в код ASCII ничего не «знает» о предполагаемом использовании преобразованных двоичных цифр, и включение начальных нулей при печати числовых значений является необычным.
Однако, проделав немного дополнительных манипуляций, все равно можно получить желаемый результат:
set foo = concat (
suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,1,1))),2), ":",
suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,2,1))),2), ":",
suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,3,1))),2), ":",
suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,4,1))),2), ":",
suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,5,1))),2), ":",
suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,6,1))),2)
);
(Он работает, преобразуя каждый «компонент» по отдельности, добавляя к нему начальный ноль (если он необходим), беря два последних шестнадцатеричных символа, а затем снова объединяя их все вместе.)
решение2
Это не ответ, но я просто хочу поделиться этой конфигурацией. Где DHCP-сервер устанавливает bootfile-name (опция 67) для содержания mac-адреса клиента. Но mac изменяется так, чтобы заканчиваться на 00
или 80
. Что является базовым mac-адресом коммутаторов Cisco. Поэтому независимо от того, какой mac использует коммутатор из своего пула mac-адресов. Он все равно получит тот же файл конфигурации.
# Option 66
option tftp-server-name "198.51.100.19";
# Option 67
# Set to "switch-config/by-mac/<mac-of-client>"
# If the mac ends with 80-ff, set it to 80, else 00.
# Because the base MAC either ends with 00 or 80.
if substring(suffix (concat ("0", binary-to-ascii (2, 8, "", substring(hardware,6,1))),8), 0, 1) = "1"
{
option bootfile-name = concat(
"switch-config/by-mac/",
suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,1,1))),2),
suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,2,1))),2),
suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,3,1))),2),
suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,4,1))),2),
suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,5,1))),2),
"80",
"");
} else {
option bootfile-name = concat(
"switch-config/by-mac/",
suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,1,1))),2),
suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,2,1))),2),
suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,3,1))),2),
suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,4,1))),2),
suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,5,1))),2),
"00",
"");
}