dhcpdがこのMACアドレスと一致しません

dhcpdがこのMACアドレスと一致しません

bootp私の小規模ネットワークには、アドレスを取得するためにbootpではなくdhcp拡張のみを使用する単純なデバイスがあります。私のdhcpd.confファイルは次のとおりです

class "user" {
    match if substring(hardware, 1, 3) = 00:01:02;
    log(info, "matched to a 3com";
}

class "controller" {
    # tried matching based on two different styles I've seen on the net
    #match if substring(hardware, 1, 3) = 00:a0:45;
    match if (binary-to-ascii(16, 8, ":", substring(hardware, 0, 4)) = "1:00:a0:45");
    log(info, "found a controller");
}

subnet 192.168.0.0 netmask 255.255.0.0 {
    pool {
        allow members of "user";
        range 192.168.0.20 192.168.0.99;
        log(info, "A user just attached");
    }            

    pool {
        allow members of "controller";
        # never more than 1 on the network at a time
        range 192.168.1.240;
        log(info, "Allocated to a pwr user");
    }
}

DHCPサーバーは、一致する必要があるプールと一致しません。ログから

BOOTREQUEST from 00:a0:45:95:ce:14 via eth1: BOOTP from dynamic client and no dynamic leases

デバイスは拒否される両方のクラスについて。 tcpdumpとWiresharkを使用して、ノートブックとコントローラデバイスのパケットダンプを比較します。コントローラデバイスは実際にはbootpパケットであり(つまり、dhcpタイプを識別する必須オプション53はありません)、オプション255のみを渡します。ラップトップは変換をdhcpd使用せずにbinary-to-ascii一致しました。さらに、奇妙なことに、コントローラクライアントのIPヘッダーは最初の割り当てIPアドレスである192.168.1.240を使用しますが、パケットのbootp部分ではこのciaddrフィールドは0です。有効なリースがあると思ったらこれを反映してはいけませんかciaddr

dhcpdがこのデバイスのMACアドレスと一致しないのはなぜですか?

答え1

この質問に対する答えを見つけて投稿したかったのです。パターンが一致する方法とは何の関係もないことがわかりました。実際、

class "user" {
    match if substring(hardware, 1, 3) = 00:01:02;
    log(info, "matched to a 3com";
}

これはハードウェアマッチングのための正しい構文です。

しかし、事実は私を間違った結論に導きました。 bootpとdhcpに関する複数のRFCを検討した後、問題のデバイスに必要なDHCPタイプオプションがないことが明らかになりました。RFC 1541パート3、bootp専用のクライアントにするので、修正は私が必要だと思っていなかったことから来ました。このrangeステートメントには、dynamic-bootpIP スコープが dhcp または bootp クライアントに適用可能であることを示す修飾子が含まれています。ただし、allow dynamic bootp clients;プールには以下も必要です。

pool {
    allow dynamic bootp clients;
    allow members of "controller";
    # never more than 1 on the network at a time
    range dynamic-bootp 192.168.1.240;
    log(info, "Allocated to a pwr user");
}

私はこの修飾語で十分だろうと思いましたが、そうではありません。仕事を終えるには両方が必要です。

これが誰かに役立つことを願っています。

答え2

比較する前に、データを「ハードウェア」に変換し、表示されたタイプの最初の要素を考慮する必要があります。次のようにしてみてください。

class "controller" {
    # binary-to-ascii deletes leading zeroes and makes everything lowercase!
    match if binary-to-ascii(16,8,":",substring(hardware, 0, 4)) = "1:0:a0:45";
    log(info, "found a controller");
}

しかし、デバイスが1つしかない場合は、固定アドレスを使用するとどうなりますか?

host controller-hostname {
    hardware ethernet 00:a0:45:95:ce:14;
    fixed-address 192.168.1.240;
}

プールに「dynamic-bootp」を追加します。

pool {
    allow members of "controller";
    # never more than 1 on the network at a time
    range dynamic-bootp 192.168.1.240;
    log(info, "Allocated to a pwr user");
}

関連情報