一、DHCP原理简述

DHCP:动态主机配置协议,是一个局域网的网络协议。由DHCP服务器控制一段IP地址范围,客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。

工作流程如下:

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

Offer阶段: 当DHCP Server监听到Client发来的DHCP discover广播报文后,会检查租约表,将地址范围内没有租出去,且最靠前的空闲IP,连同租约期限等信息封装为offer报文,广播回应给Client

接受IP租约阶段: 如果Client收到网络上多台DHCP Server的响应,只会挑选最先抵达的DHCP Offer报文进行解析,然后发送进行arp报文,检查该ip在网络是否已经被其他主机所使用,如果发现该ip已经被使用,Client会发送一个DHCP Decline报文给DHCP Server,拒绝接受它的DHCP Offer,并重新发送Discover报文。

如果检查该ip未被使用,则会广播一个Request报文,告诉所有服务器自己接受了哪台Server的ip地址。

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

重新登陆: 当Client重新登陆网络时,会直接广播发送前一次所分配ip地址的request请求,当Server收到信息之后,会尝试让Client使用原来的IP地址,并回答一个DHCP ack确认信息。如果该ip无法再次分配给client,则Server会回答一个DHCP nak否认信息给Client。当Client收到Server发来的DHCP nak否认信息之后就必须重新发送DHCP discover来重新获取新的ip。

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

二、neutron-dhcp-agent概述

OpenStack在创建虚拟机的时候,会通过neutron的DHCP服务为虚拟机动态分配一个ip地址。Neutron提供DHCP功能的组件是运行在网络节点上的neutron-dhcp-agent服务。

三、配置文件

1、DHCP服务的配置文件位于网络节点

vim /etc/neutron/dhcp_agent.ini

dhcp_driver

默认使用dnsmasq实现dhcp功能

ovs_integration_bridge

dhcp的接口连接在ovs的br-int上

interface_driver

默认使用ovs来管理虚拟机接口

当创建network,并开启对应subnet的dhcp功能时,neutron会在网络节点上启动一个dnsmasq进程为该network提供DHCP服务,进程截图如下:

dnsmasq重要命令参数解释:

–interface: dnsmasq用来监听DHCP请求/响应的端口,从而提供DHCP服务。

–dhcp-hostsfile:存放DHCP host信息的文件,dnsmasq会从该文件中获取port和mac地址的对应关系。

四、Network namespace

Neutron通过namespace 为每个network提供独立的DHCP,从而允许租户创建重叠的网络。

DHCP对应的namespace以qdhcp-network_id命名,可以通过ip netns查看(网络节点上运行),效果如下:

通过命令

ip netns exec qdhcp-6f854b6c-231d-48c3-876d-0514718bbb58 ip a

可以看到在该网络的namespace中,为tap22c9cf6e-cb设备配置了ip地址

而tap22c9cf6e-cb设备是连接在br-int上的一个port,dnsmasq就是通过监听该端口来为对应网络提供dhcp服务。

五、OpenStack DHCP获取ip过程分析

创建虚拟机vm1时,Neutron会为其分配一个port,并同步mac和ip地址信息到dnsmasq的host文件中,如图:

cat /var/lib/neutron/dhcp/6f854b6c-231d-48c3-876d-0514718bbb58/host

同时,nova-compute会生成instance的xml文件,其中网络部分如下:

virsh edit instance-00000001

虚拟机第一次启动

1、虚拟机vm1启动时,会发出dhcpdiscover广播报文,该报文会在整个network(vlan)中被收到。

2、dhcpdiscover广播报文会到达tap2c6747c1-2a,dnsmasq监听在它上面,dnsmasq检查对应网络的host文件,发现有对应选项,于是dnsmasq以dhcpoffer报文将ip(192.168.1.10),netmask(24)等信息发送给虚拟机vm1

3、虚拟机vm1发送dhcprequest广播消息,确认接受dhcpoffer消息。

4、dnsmasq对虚拟机vm1的dhcprequest报文发送dhcpack消息进行确认,虚拟机vm1收到dhcpack消息之后,开始使用对应ip,整个过程结束。

5、虚拟机vm1发起arp广播,获取网关mac地址

(创建网络时指定的网关地址,默认是x.x.x.1,可能和绑定路由的实际网关不一致)。

6、与内部地址169.254.169.254进行交互。

7、虚拟机vm1会向网关发送icmp,进行确认之后,整个过程结束。

虚拟机重启流程

1、当发生重启操作时,虚拟机vm1会用上一次的地址,直接广播发送dhcprequest报文请求继续使用对应ip地址,dnsmasq确认后,会发送dhcpack消息进行确认,虚拟机vm1收到dhcpack消息,继续使用对应ip。

2、虚拟机vm1发起arp广播,获取网关mac地址。

3、与内部地址169.254.169.254进行交互。

4、虚拟机vm1会向网关发送icmp,进行确认之后,整个过程结束。

六、Network内有多个subnet情景分析

1、在一个network内有多个subnet,且都开启dhcp功能的情况下,neutron会在network 的namespace 里,为它的tap设备(network:dhcp port)配置多个对应ip地址,如图:

2、同时通过neutron数据库更新dhcp host文件(同一个mac地址上配置了两个ip),如图:

3、最后重启网络节点上的dnsmasq进程,更新–dhcp-range、–dhcp-hostsfile参数,使该进程作用在多个dhcp-range上,实现一个network,多个subnet的dhcp服务,如图:

七、虚拟机通过域名访问

dnsmasq 是一款开源软件,支持DHCP和DNS功能,neutron通过调用dnsmasq来支持同network内的虚拟机域名解析功能。

1、创建虚拟机vm1时,Neutron会为其分配一个port,并同步域名和ip地址信息到dnsmasq的host文件中,如图:

cat /var/lib/neutron/dhcp/6f854b6c-231d-48c3-876d-0514718bbb58/host

2、192.168.1.10的对应域名为host-192-168-1-10.openstacklocal,默认后缀名openstacklocal,如果需要修改,则可以修改neutron.conf,如图:

3、当虚拟机启动之后,neutron会更新虚拟机的/etc/resolv.conf,使用dhcp port的的IP地址作为域名服务器地址(dnsmasq监听该地址),从而实现dns功能,效果如图:

八、DHCP HA实现分析

分析前提:

已经完成dhcp agent部署(具体部署过程可以参考社区文档),dhcp已经运行在网络节点上且状态ok(以三台网络节点为例),效果如图:

1、创建一个network,neutron会在所有网络节点(运行dhcp-agent)上创建对应网络的namespace,tap设备,配置dhcp port的ip地址,每台网络节点均会启动一个dnsmasq进程,用于监听对应的tap设备,用于提供dhcp服务。

2、在horizon页面上也能够看到network启动了三个dhcp port,效果如图:

3、创建虚拟机时,Neutron会为其分配一个port,在HA场景之下, mac和ip地址信息会被更新到所有网络节点的host文件中,换句话说,所有网络节点使用的host文件完全一样。

4、虚拟机启动时,会广播发送dhcpdiscover报文,所有网络节点的tap设备都会收到该报文,所以所有的dnsmasq都会给出dhcpoffer响应。

  • dhcpoffer报文中的Yiaddr字段是分配给虚拟机的地址
  • dhcpoffer报文中的option会放入dnsmasq的IP地址

5、虚拟机会对第一个收到的dhcpoffer报文,以广播的方式进行dhcprequest回答,dhcprequest报文内会包含dnsmasq的ip,所以只有对应dnsmasq才会发送dhcpack报文(option字段中会新增租约信息)进行确认,其他的dnsmasq收到报文之后,不做处理。

6、虚拟机在收到dhcpack确认报文之后检查ip地址是否可以使用,如果可以,则更新租约信息,开始使用该ip。