客户使用我司S12500替换友商设备做为DHCP relay设备,DHCP服务器为Linux服务器,DHCP服务器为客户端分配IP。在S12500设备上客户使用了Super VLAN功能,里面包含N个sub VLAN,客户需求为对每个subVLAN分配同一网段下/24位的地址。通过S12500上送sub VLAN 信息到DHCP服务器,DHCP服务器收到相应的DHCP报文,分配相应段的IP地址。
客户现网配置如下:
#
dhcp enable
dhcp server always-broadcast
#
vlan 61 to 65
#
vlan 1000
description super-vlan
supervlan
subvlan 61 to 65
#
interface Vlan-interface1000
ip address 172.18.0.1 255.255.0.0
local-proxy-arp enable
dhcp select relay
dhcp relay information enable
dhcp relay server-address 10.27.100.99
#
interface Ten-GigabitEthernet2/0/3
port link-mode bridge
port access vlan 61
#
当配置好后,发现PC无法从DHCP服务器获取IP地址。
当用户获取IP时通过debug信息提示如下
received dhcp discover vlan-interface 1000
no match network for the client
通过对配置信息分析,未发现问题,由于替换设备后产生的问题,于是收集了我司设备和友商设备的抓包进行分析。
友商信息如下

我司设备抓包信息如下

通过对两台设备的抓包对比分析,报文不一致。查询RFC Option为自定义选项,没有标准格式。根据用户反馈信息vlan为61,换算为16进制为3d,匹配我司设备为第1、2个字节,匹配友商设备为第3、4个字节。通过在实验室修改vlan反复测试可以确认第2个字节为vlan信息。由于设备侧无法修改vlan信息,于是收集了用户服务器的配置信息,关键配置如下:
class "vlan61" {
match if binary-to-ascii(10,16,"",substring(option agent.circuit-id,2,2)) = "61";
}
class "vlan62" {
match if binary-to-ascii(10,16,"",substring(option agent.circuit-id,2,2)) = "62";
}
class "vlan63" {
match if binary-to-ascii(10,16,"",substring(option agent.circuit-id,2,2)) = "63";
}
class "vlan64" {
match if binary-to-ascii(10,16,"",substring(option agent.circuit-id,2,2)) = "64";
}
class "vlan65" {
match if binary-to-ascii(10,16,"",substring(option agent.circuit-id,2,2)) = "65";
############
subnet 172.18.0.0 netmask 255.255.0.0 {
pool {
allow members of "vlan61";
range 172.18.1.0 172.18.4.255;
option routers 172.18.0.1;
}
pool {
allow members of "vlan62";
range 172.18.5.0 172.18.8.255;
option routers 172.18.0.1;
}
pool {
allow members of "vlan63";
range 172.18.9.0 172.18.12.255;
option routers 172.18.0.1;
}
pool {
allow members of "vlan64";
range 172.18.13.0 172.18.16.255;
option routers 172.18.0.1;
}
pool {
allow members of "vlan62";
range 172.18.17.0 172.18.20.255;
option routers 172.18.0.1;
}
}
##########
查询linux相关资料substring(option agent.circuit-id,2,2) 表示偏移量2, 长度2,这样取到我司设备的vlan信息为3,无法找到对应的vlan,也无法分配IP地址。
于是尝试修改服务器配置,将偏移量改为0测试,可以正常获取IP
class "vlan61" {
match if binary-to-ascii(10,16,"",substring(option agent.circuit-id,0,2)) = "61";
}
class "vlan62" {
match if binary-to-ascii(10,16,"",substring(option agent.circuit-id,0,2)) = "62";
}
class "vlan63" {
match if binary-to-ascii(10,16,"",substring(option agent.circuit-id,0,2)) = "63";
}
class "vlan64" {
match if binary-to-ascii(10,16,"",substring(option agent.circuit-id,0,2)) = "64";
}
class "vlan65" {
match if binary-to-ascii(10,16,"",substring(option agent.circuit-id,0,2)) = "65";
}
在使用DHCP relay传递信息时注意区分版本和设备所携带信息的格式,在未知格式情况下,可通过抓包确认。