基于厂商类的KEA DHCP服务器配置问题:按厂商类标识符分发不同值的DHCP选项66
看起来你已经迈出了关键的第一步——创建了匹配厂商类的客户端规则,接下来只需要把这些规则和对应的选项配置落地,再确保服务器能正确识别并应用就可以了。我来帮你把剩下的步骤补全:
1. 完善客户端类的选项配置
首先你需要把每个厂商类对应的DHCP选项66(也就是tftp-server-name)补充到客户端类的option-data里。比如你的Cisco类可以这样写,同时我也给你加一个其他厂商的示例参考:
"client-classes": [ { "name": "Cisco", "test": "substring(option[vendor-class-identifier].text, 0, 5) == 'Cisco'", "only-if-required": true, "option-data": [ { "name": "tftp-server-name", "code": 66, "value": "tftp://cisco-tftp.example.com" } ] }, { "name": "Juniper", "test": "substring(option[vendor-class-identifier].text, 0, 6) == 'Juniper'", "only-if-required": true, "option-data": [ { "name": "tftp-server-name", "code": 66, "value": "tftp://juniper-tftp.example.com" } ] } ]
这里注意only-if-required的作用:如果设为true,只有当客户端明确请求选项66时才会发送;如果设为false,不管客户端有没有请求都会主动推送,你可以根据实际需求调整。
2. 确保子网配置允许客户端类生效
接下来需要在你的子网配置里(如果还没加的话)指定这些客户端类,或者至少确保服务器会自动评估客户端类。如果你的配置里已经有子网段,只需要在子网的client-classes列表里加入你定义的类名,比如:
"subnet4": [ { "subnet": "192.168.3.0/24", "pools": [ { "pool": "192.168.3.100 - 192.168.3.200" } ], "client-classes": [ "Cisco", "Juniper" ] } ]
这样当属于这些类的客户端请求IP时,服务器就会自动应用对应类里的选项配置。
3. 设置默认选项(可选)
如果还有不属于任何厂商类的客户端,你可以在全局的Dhcp4配置里设置一个默认的选项66作为 fallback:
"Dhcp4": { // 其他已有配置... "option-data": [ { "name": "tftp-server-name", "code": 66, "value": "tftp://default-tftp.example.com" } ], // 客户端类和子网配置... }
当客户端匹配不到任何自定义类时,就会使用这个默认值。
4. 验证配置并测试
配置完成后,先检查配置文件的合法性:
kea-dhcp4 -c /path/to/your/config.json
如果没有报错,就可以重启KEA DHCP服务生效。
你可以用dhclient模拟不同厂商的客户端来测试,比如创建一个临时的dhclient.conf:
send vendor-class-identifier "Cisco IOS 15.1";
然后执行:
dhclient -v -cf /tmp/dhclient.conf vlan3
查看返回的DHCP响应里是否包含了对应厂商的TFTP服务器地址。另外也可以用tcpdump抓包,确认客户端发送的厂商类字段和你的规则匹配。
备注:内容来源于stack exchange,提问作者Nikša Baldun

