我想做什么

我想做什么

我希望有人能帮助我解决这个问题。

我想做什么

我想根据 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    

DHCP 发现消息 DHCP 发现转储

如您所见,选项 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

我仍然不确定为什么正则表达式匹配不起作用。但我可以接受这个解决方案。

相关内容