![dhcpd サーバの無効な MAC 検出](https://rvso.com/image/768933/dhcpd%20%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AE%E7%84%A1%E5%8A%B9%E3%81%AA%20MAC%20%E6%A4%9C%E5%87%BA.png)
私の DHCP 構成では、デバイス情報を保存するためのコミット フックがあります。問題は、一部の 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
解析に何を使用するかによって異なりますが、プレフィックスのゼロを省略することは完全に有効であると主張する人もいます。また、何桁にすべきかの定義がないため、ほとんどの場合はそうしています。
ただし、これが無効であるかどうか、またその理由についての説明を飛ばして、代わりに「これを希望の形式で取得するにはどうすればよいか」と質問すれば、答えを得ることができます。
これはバグではありません。問題は、バイナリから 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 つの 16 進文字を取得して、それらをすべて再度連結することによって動作します。)
答え2
これは回答ではありませんが、この設定を共有したいだけです。DHCP サーバーは、クライアントの MAC アドレスを含むようにブートファイル名 (オプション 67) を設定します。ただし、MAC は または で終わるように変更されます00
。80
これは、Cisco スイッチの基本 MAC アドレスです。したがって、スイッチが 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",
"");
}