• Neutron — DHCP Agent 实现原理


    目录

    DHCP

    DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)用于当 Host 加入一个 L3 网络的时候动态的从一个 IP Pool 中为 Host 租用一个 IP 地址的协议。

    DHCP 协议格式

    在这里插入图片描述

    DHCP 报文类型

    在这里插入图片描述

    DHCP 协议流程

    在这里插入图片描述

    1. Discover 阶段: 当 DHCP Client 启动时,由于没有 IP 地址,会自动发送 Discover 广播报文(带有 MAC 地址信息),DHCP Server 会响应该报文。

    2. Offer 阶段: 当 DHCP Server 监听到 Client 发来的 Discover 广播报文后,会检查租约表,将 IP Pool 中没有租出去且最靠前的空闲 IP 连同租约期限等信息封装为 Offer 报文,广播给 Client。

    3. 接受 IP 租约阶段:如果 Client 收到网络上多台 DHCP Server 的响应,只会挑选最先抵达的 Offer 报文进行解析,然后发送 ARP 报文,检查该 IP 在网络是否已经被其他 Hosts 所使用。如果发现该 IP 已经被使用,Client 会发送一个 Decline 报文给 DHCP Server,拒绝接受它的 Offer,并重新发送 Discover 报文;如果检查该 IP 未被使用,则会广播一个 Request 报文,告诉所有服务器自己接受了这个 IP 地址。

    4. ACK 阶段:当 DHCP Server 收到 Client 回答的 Request 报文后,向 Client 发送一个包含它提供的 IP 和其他设置的 ACK 确认信息,告诉 Client 可以使用它所提供的 IP 地址,Client 在收到 ACK 报文之后将 TCP/IP 协议与网卡绑定。

    在这里插入图片描述

    1. 重新登陆:当 Client 重启后,会直接广播发送前一次所分配 IP 地址的 Request 报文。当 DHCP Server 收到信息之后,会尝试让 Client 使用原来的 IP 地址,并回答一个 ACK 确认信息。如果该 IP 无法再次分配给 Client,则 Server 会回答一个 NAK 否认信息给 Client。当 Client 收到 Server 发来的 NAK 否认信息之后就必须重新发送 Discover 来重新获取新的 IP。

    2. 更新租约:DHCP 获取到的 IP 地址都有一个租约,租约过期后,DHCP Server 将回收该 IP 地址,所以如果 DHCP Client 如果想继续使用该 IP 地址,则必须更新器租约,DHCP Client 除了在开机的时候发出 DHCP Request 请求之外,在租约期限一半的时候也会发出 DHCP Request,如果此时得不到 DHCP 服务器的 ACK 确认的话,那么 Client 还可以继续使用该 IP;然后在剩下的租约期限的再一半的时候(即租约的 75%),还得不到确认的话,那么在租约到期之后 Client 就不能继续使用该 IP。

    在这里插入图片描述

    在这里插入图片描述

    DHCP Agent

    Neutron DHCP Agent 为多租户的 Subnets 网络提供 DHCP Server 服务。此外,DHCP-agent 还可能会与 Neutron Metadata Agent 协作完成云主机 Cloud-init 初始化流程。

    用户在创建 Subnet 时,如果指定了开启 DHCP,并且设定了 Subnet 的 IP Pool,那么 DHCP-agent 就会在 Network Node 上启动一个 qdhcp-{network_uuid} network namespace,并启动 DHCP Server,同时将 DHCP Server 中的 IP 地址范围设定为 IP Pool 指定的范围。如果没有指定 IP Pool,那么就根据 Subnet 的 CIDR 来进行设置。当云主机在 Subnet 中启动时,对应的 Port 就会通过 DHCP 协议流程从 DHCP Server 从获取一个 IP 地址。

    同时,Network Node 中的 OvS Agent 还会同步完成将一对 Veth-pair taps 设备分别接入到 OvS br-int 和 qdhcp namespace 中,使得 VMs 的 DHCP Discovery 和 DNS Query Request 流量能够正常达到 dnsmasq 服务进程。NOTE:当发现 VM 无法获取 IP 地址时,通过需要检查这条数据链路是否正常。

    关键配置

    DHCP Agent 的关键配置是位于 Network Node 上的 dhcp_agent.ini 配置文件。

    • dhcp_driver:默认使用 dnsmasq 来提供 DHCP Server 服务。
    • ovs_integration_bridge:qdhcp 连接到 br-int 上。
    • interface_driver:默认使用 OvS 来管理云主机的接口。

    dnsmasq 服务进程

    在 qdhcp namespace 中我们可以看见 dnsmasq 服务进程的启动指令。

    $ dnsmasq \
    	--no-hosts \
    	--no-resolv \
    	--strict-order \
    	--except-interface=lo \
    	--pid-file=/var/lib/neutron/dhcp/35b593af-7e57-4a4b-8346-975d227c557c/pid \
    	--dhcp-hostsfile=/var/lib/neutron/dhcp/35b593af-7e57-4a4b-8346-975d227c557c/host \
    	--addn-hosts=/var/lib/neutron/dhcp/35b593af-7e57-4a4b-8346-975d227c557c/addn_hosts \
    	--dhcp-optsfile=/var/lib/neutron/dhcp/35b593af-7e57-4a4b-8346-975d227c557c/opts \
    	--dhcp-leasefile=/var/lib/neutron/dhcp/35b593af-7e57-4a4b-8346-975d227c557c/leases \
    	--dhcp-match=set:ipxe,175 \
    	--bind-interfaces \
    	--interface=tap3043df67-be \
    	--dhcp-range=set:tag0,10.1.0.0,static,86400s \
    	--dhcp-option-force=option:mtu,1450 \
    	--dhcp-lease-max=256 \
    	--conf-file=/etc/neutron/dnsmasq.conf \
    	--server=8.8.8.8 \
    	--server=114.114.114.114 \
    	--domain=sample.openstack.org.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    其中的关键命令参数有:

    • –interface:指定 dnsmasq 用来监听 DHCP 请求/响应的 Port。
    • –dhcp-hostsfile:指定用于存放 DHCP host 信息的文件,dnsmasq 会从该文件中获取 Port 的 MAC、IP、Hostname 的对应关系。例如:

    在这里插入图片描述

    特殊的,如果一个 Network 中存在多个 Subnets 并且都开启了 DHCP,那么这些 Subnets 会共用同一个 qdhcp namespace。在 qdhcp namespace 的 Port 上会被配置多个 Subnets 对应的 IP 地址,并重启 dnsmasq 服务进程,使其服务于多个不同的 IP Pools。可见 qdhcp Instance 实际上是和 Network 一一对应的,所以命名为 qdhcp-{network_uuid}。

    dnsmasq 除了提供 DHCP 服务之外还提供了 DNS 服务,其 host 文件中也存储了 IP-Hostname 的映射关系。当云主机启动后,默认的 nameserver 会执行 qdhcp namespace 的服务接口 IP 地址。

    高可用方案

    由于 DHCP Agent 以及 dnsmasq 服务进程都是无状态的,只需要保持 host 文件的内容一直即可。所以在数据面的层面上,可以通过部署 3 台 Network Node 来获得高可用。在创建 Network 时候会分配 3 个不同的 DHCP Port。当创建云主机时,DHCP Agent 会为其随机分配一个 DHCP Port。

    在这里插入图片描述

  • 相关阅读:
    技术开发人员常用的安全浏览器
    keil打开别人的工程文件的相关问题解决(亲测成功!!!)
    【翻译】Texture Synthesis Using Convolutional Neural Networks
    工业控制系统与传统信息系统安全的对比分析
    java---贪心---货仓选址(每日一道算法2022.11.5)
    35、Lua 中的模块与module函数
    移动端css问题
    CC1101一款低成本的sub- 1ghz 收发器 芯片
    Class加载过程
    React小记(一)_基础部分
  • 原文地址:https://blog.csdn.net/Jmilk/article/details/131481916