在文章《vpp dhcp配置》中,介绍在dhcp client在vpp中实现原理,其中提到下面命令行是HDCP中继相关配置。
#dhcp中继命令行配置,没有尝试配置,后续有时间再搭环境验证
set dhcp proxy [del] server <ip-addr> src-address <ip-addr> [server-fib-id <n>] [rx-fib-id <n>]
#下面应该是dhcp中继功能查询命令行
ucpe-cli-kvm# show dhcp option-82-address interface GigabitEthernet0/3/0
interface source IP address
GigabitEthernet0/3/0 192.168.136.128
在 DHCP 中继(DHCP Relay)的实现逻辑中,最重要的部分是如何将客户端所在的网段信息传递给远程 DHCP 服务器,以便服务器能够正确地分配 IP 地址。以下是两种常见的实现方案:
DHCP报文中的GIADDR(Gateway IP Address)字段记录了DHCP报文经过的第一个DHCP Relay的IP地址,对于DHCP服务器和客户端不在同一个网段的场景,那么第一个DHCP Relay在将DHCP请求报文转发给DHCP服务器时,会把自己的IP地址填入此字段,DHCP服务器会根据此字段来判断出客户端所在的网段,从而选择合适的地址池,为客户端分配该网段的IP地址。
DHCP中继的工作过程为:
(1) 具有DHCP中继功能的网络设备收到DHCP客户端以广播方式发送的DHCP-DISCOVER或DHCP-REQUEST报文后,将报文中的giaddr字段填充为DHCP中继的IP地址,并根据配置将报文单播转发给指定的DHCP服务器。
(2) DHCP服务器根据giaddr字段为客户端分配IP地址等参数,并通过DHCP中继将配置信息转发给客户端,完成对客户端的动态配置。
Option 82称为中继代理信息选项,该选项记录了DHCP客户端的位置信息。DHCP中继或DHCP Snooping设备接收到DHCP客户端发送给DHCP服务器的请求报文后,在该报文中添加Option 82,并转发给DHCP服务器。管理员可以从Option 82中获得DHCP客户端的位置信息,以便定位DHCP客户端,实现对客户端的安全和计费等控制。支持Option 82的服务器还可以根据该选项的信息制定IP地址和其他参数的分配策略,提供更加灵活的地址分配方案。
Option 82最多可以包含255个子选项。若定义了Option 82,则至少要定义一个子选项。目前设备只支持如下子选项:sub-option 1(Circuit ID,电路ID子选项)、sub-option 2(Remote ID,远程ID子选项)和sub-option 5(Link Selection,链路选择子选项)。
vpp默认实现是基于Option82选项实现的,报文经过vpp中继代理时,会追加OPtion 82 sub-option1和sub-option5,其中sub-option1记录的是接口的索引;sub-option5 记录当前接口的网段,一般是做为网关,也就是DHCP服务器需要给客户端分配的网段。
在使用 DHCP Relay 时,如果通过 Option 82 的 Sub-option 5 传递网络信息,giaddr(Gateway IP Address)字段的填写仍然遵循基本规则。giaddr 应该填写中继代理在客户端子网上的接口地址。至于 DHCP 服务器如何处理 giaddr 和 Sub-option 5 中的 IP 字段,这取决于 DHCP 服务器的配置和实现。
giaddr:应填写中继代理在客户端子网上的接口地址。例如,如果中继代理在客户端子网 192.168.1.0/24 上的接口地址是 192.168.1.1,那么 giaddr 应该填写 192.168.1.1。
DHCP 服务器的处理逻辑:giaddr 优先:大多数 DHCP 服务器会优先信任 giaddr 字段。giaddr 提供了中继代理的 IP 地址,这通常足以帮助服务器确定客户端所在的子网。如果 giaddr 不为空,服务器通常会根据 giaddr 所在的子网来分配 IP 地址。Sub-option 5 作为补充信息:Sub-option 5 可以提供更详细的网络信息,如子网 ID 或 VLAN ID。这些信息可以用于更精确的 IP 地址分配。如果 giaddr 为空或不可信,服务器可能会使用 Sub-option 5 中的信息来确定客户端所在的子网。
但是在vpp实现中,dhcp_proxy_t 结构体定义描述了一个 DHCP 中继代理的核心组件。这个结构体包含了中继代理所需的各项信息,以便正确地处理 DHCP 请求和响应。以下是对每个字段的详细解释:
typedef struct dhcp_proxy_t_ {
/**
* @brief The set of DHCP servers to which messages are relayed.
* If multiple servers are configured then discover/solicit messages
* are relayed to each. A cookie is maintained for the relay, and only
* one message is replayed to the client, based on the presence of the
* cookie.
* The expectation is there are only 1 or 2 servers, hence no fancy DB.
*/
dhcp_server_t *dhcp_servers;
/**
* @brief Hash table of pending requests keyed on the client's MAC address
*/
uword *dhcp_pending;
/**
* @brief A lock for the pending request database.
*/
int lock;
/**
* @brief The source address to use in relayed messages
*/
ip46_address_t dhcp_src_address;
/**
* @brief The FIB index (not the external Table-ID) in which the client
* resides.
*/
u32 rx_fib_index;
} dhcp_proxy_t;
从上面的结构体定义中,我们可以发现,在 VPP 实现中,同一个 VRF 下只能配置一个 DHCP 中继代理结构体,这意味着只能指定一个 giaddr 地址。当在同一个 VRF 下接入多个网段时,如何处理这种情况呢?在实际测试中,如前面所说:如果 giaddr 为空或不可信,服务器可能会使用 Sub-option 5 中的信息来确定客户端所在的子网。也就是说即使 giaddr 地址相同,DHCP 服务器也可以根据 Option 82 中的信息来区分不同的客户端网段,并分配相应的 IP 地址。
而在实际使用过程,当dhcp server服务器不支持OPtion 82 选项时,如何如何?在给客户部署此功能时,我们就遇到了这种问题。使用window server 2012 配置DH CP服务器时,就遇到了上面的问题。无法给客户端分配ip地址。
https://learn.microsoft.com/zh-cn/windows-server/networking/technologies/dhcp/dhcp-subnet-options windows serverDHCP 子网选择选项介绍
在文档中明确支持window server 2012 不支持Option82选项,
今天到此为止,接下搭建环境学习dhcp relay功能具体转发流程,及此问题解决方案。
参考资料: 1、网络配置层DHCPv4协议解析 https://blog.csdn.net/Once_day/article/details/139033725 2、华为DHCP配置手册 https://support.huawei.com/enterprise/zh/doc/EDOC1100334304/75a2556 3、H3C DHCP配置手册 https://www.h3c.com/cn/d_202402/2048794_30005_0.htm#_Ref162336518
本文分享自 DPDK VPP源码分析 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!