前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >learning vpp:dhcp relay功能(1)

learning vpp:dhcp relay功能(1)

作者头像
dpdk-vpp源码解读
发布2024-11-23 08:30:17
发布2024-11-23 08:30:17
12900
代码可运行
举报
文章被收录于专栏:DPDK VPP源码分析
运行总次数:0
代码可运行
DHCP中继(DHCP Relay)是一种网络技术,用于在网络中的不同子网之间转发DHCP(动态主机配置协议)请求和响应。这项技术使得DHCP客户端即使不在与DHCP服务器相同的子网内,也能获取到所需的网络配置信息,如IP地址、子网掩码、默认网关等。

在文章《vpp dhcp配置》中,介绍在dhcp client在vpp中实现原理,其中提到下面命令行是HDCP中继相关配置。

代码语言:javascript
代码运行次数:0
复制
#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报文中的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字段

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 请求和响应。以下是对每个字段的详细解释:

代码语言:javascript
代码运行次数:0
复制

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;
  • dhcp_server_t *dhcp_servers:描述: 这是一个指向 DHCP 服务器数组的指针。如果配置了多个服务器,发现(Discover)和请求(Solicit)消息会被中继到每一个服务器。中继代理会维护一个 cookie,确保只有一个响应被转发回客户端。用途: 存储 DHCP 服务器的地址和相关信息,以便中继代理可以将 DHCP 消息发送到这些服务器。
  • uword *dhcp_pending:描述: 这是一个哈希表,用于存储待处理的 DHCP 请求,键是客户端的 MAC 地址。用途: 用于跟踪和管理未完成的 DHCP 请求,确保每个客户端的请求不会重复处理。
  • int lock:描述: 这是一个锁,用于保护待处理请求数据库的并发访问。用途: 确保在多线程或多进程环境中,对 dhcp_pending 哈希表的访问是线程安全的。
  • ip46_address_t dhcp_src_address:描述: 这是中继代理在中继消息中使用的源地址。用途: 确保中继消息的源地址是正确的,以便 DHCP 服务器能够正确处理这些消息。
  • u32 rx_fib_index:描述: 这是客户端所在的 FIB(Forwarding Information Base)索引,而不是外部的表 ID。用途: 用于确定客户端所在的网络子网,以便中继代理可以正确地将 DHCP 消息中继到适当的服务器。

从上面的结构体定义中,我们可以发现,在 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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-11-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DPDK VPP源码分析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档