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를 사용하여 노트북과 컨트롤러 장치의 패킷 덤프를 비교합니다(임시로 HP 노트북용 클래스를 생성하고 이 클래스를 "컨트롤러" 풀에 추가한 후 범위를 2개 주소로 확장했습니다). 컨트롤러 장치는 실제로 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 15413부, 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");
}

하지만 장치가 하나만 있는 경우 고정 주소를 사용하면 어떨까요?

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");
}

관련 정보