我希望有人能帮助我解决这个问题。
我想做什么
我想根据 Cisco ASR1k 的序列号向其提供信息。原因是我没有该设备的 MAC 地址。只知道底盘的序列号。
有问题的设备正在运行 IOS-XE
我需要使用 ISC DHCP Server 4.4
我尝试过什么
由于我已经对另一台思科设备(另一个运行 IOS-XR 的型号)执行了此操作,因此我只需复制我的配置并替换给定的序列号。
工作配置
class "working-cisco-device" {
match if (substring(option dhcp-client-identifier,0,11) = "SERIALWORKING");
option routers 1.1.1.1;
filename="http://SERVER/pub/configs/cisco/SERIALWORKING.txt";
subnet 10.119.168.128 netmask 255.255.255.128 {
option subnet-mask 255.255.255.128;
log(info, option dhcp-client-identifier);
pool {
allow members of "working-cisco-device";
allow members of "not-working-cisco-device";
range 10.119.168.131 10.119.168.140;
}
}
}
该设备无需配置即可启动,从 dhcp 服务器获取正确的信息并从 FTP 服务器下载其配置。
有问题的设备的配置
class "not-working-cisco-device" {
match if substring(option dhcp-client-identifier,0,11) = "SERIALNOTWORKING";
#match if option host-name ~~ "Router";
option routers 1.1.1.1;
option bootfile-name "http://SERVER/pub/configs/cisco/SERIALNOTWORKING.txt";
subnet 10.119.168.128 netmask 255.255.255.128 {
option subnet-mask 255.255.255.128;
pool {
allow members of "working-cisco-device";
allow members of "not-working-cisco-device";
range 10.119.168.131 10.119.168.140;
}
}
启动此设备时会出现以下输出:
笔记:由于选项 61 的长度(如果此设备为 12)我已经更改了子字符串索引,但没有成功。
我还尝试使用正则表达式进行匹配(此语法适用于我评估供应商类标识符的其他一些设备)
match if option dhcp-client-identifier ~~ ".*SERIALNOTWORKING.*";
为了检查它是否有效,我将设备主机名与
match if option host-name ~~ "Router";
这样做是有效的,并且设备开始获取其配置。
Jun 10 07:24:36 m4bnvmvs0133 dhcpd: DHCPDISCOVER from f8:xx:xx:xx:4b:40 via 10.119.168.130: network 10.119.168.128/25: no free leases
.
.
.
.
Jun 10 07:24:40 m4bnvmvs0133 dhcpd: DHCPDISCOVER from f8:xx:xx:xx:4b:40 via 10.119.168.130: network 10.119.168.128/25: no free leases
如您所见,选项 61 的长度在工作设备上为 11,在非工作设备上为 12。
我感觉在评估 DHCP Discover 消息的各个字段时,我遇到了基本的实现问题。
提前致谢并致以最诚挚的问候
亚伯斯
答案1
我自己找到了解决方案。
class "now-working" {
match if substring(option dhcp-client-identifier,1,12) = "SERIAL";
^ ^
| |
changed
option routers 10.119.168.129;
option bootfile-name "http://SERVER/pub/configs/cisco/SERIAL.txt";
}
subnet 10.119.168.128 netmask 255.255.255.128 {
option subnet-mask 255.255.255.128;
log(info, substring(option dhcp-client-identifier,1,12));
pool {
allow members of "now-working";
range 10.119.168.131 10.119.168.140;
}
}
笔记 log() 函数非常有用。我只增加了 substring() 函数调用中的最后一个索引。我还没有意识到 dhcp-client-identifier 有定义的类型。所以我们需要从第二个字节开始计数,而不是从第一个字节开始。
记录输出
Jun 10 10:16:14 dhcpd: DHCPDISCOVER from xx:xx:xx:xx:xx:xx via 10.119.168.130
Jun 10 10:16:15 dhcpd: DHCPOFFER on 10.119.168.138 to xx:xx:xx:xx:xx:xx (Router) via 10.119.168.130
Jun 10 10:16:15 dhcpd: SERIALNUMBER
Jun 10 10:16:15 dhcpd: DHCPREQUEST for 10.119.168.138 (172.22.134.147) from f8:0f:6f:21:4b:40 (Router) via 10.119.168.130
xx:xx:xx:xx:xx:xx dhcpd: DHCPACK on 10.119.168.138 to xx:xx:xx:xx:xx:xx (Router) via 10.119.168.130
我仍然不确定为什么正则表达式匹配不起作用。但我可以接受这个解决方案。