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-bootp
IP 범위가 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");
}