DHCP 概述
一、基本概念
Openstack在创建虚拟机的时候,会通过neutron的DHCP服务为虚拟机动态分配一个ip地址。Neutron提供DHCP功能的组件是运行在网络节点上的neutron-dhcp-agent服务。
- dnsmasq进程为网络提供dhcp功能
当创建network,并开启对应subnet的dhcp功能时,neutron会在网络节点上启动一个dnsmasq进程为该network提供DHCP服务。
dnsmasq重要命令参数解释
–interface: dnsmasq用来监听DHCP请求/响应的端口,从而提供DHCP服务。
–dhcp-hostsfile:存放DHCP host信息的文件,dnsmasq会从该文件中获取port和mac地址的对应关系。
–dhcp-leasefile: 租约文件,当我们成功运行dhcpd服务后,就可以分配ip地址给客户端,这些租用信息都可以通过查看租约文件/var/lib/dhcpd/dhcpd.leases来查看每个ip地址的租约记录。
每个租约声明都包含已租给客户端的单个ip地址。大括号内的语句定义了租约的期限及租约分配对象。
starts date;租约的开始时间
ends date;租约的结束时间
- 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服务。
3. 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
虚拟机第一次启动时:
- 虚拟机vm1启动时,会发出dhcpdiscover广播报文,该报文会在整个network(vlan)中被收
- dhcpdiscover广播报文会到达tap2c6747c1-2a,dnsmasq监听在它上面,dnsmasq检查对应网络的host文件,发现有对应选项,于是dnsmasq以dhcpoffer报文将ip(192.168.1.10),netmask(24)等信息发送给虚拟机vm1
- 虚拟机vm1发送dhcprequest广播消息,确认接受dhcpoffer消息。
- dnsmasq对虚拟机vm1的dhcprequest报文发送dhcpack消息进行确认,虚拟机vm1收到dhcpack消息之后,开始使用对应ip,整个过程结束。
- 具体源码参考https://blog.csdn.net/gyunling/article/details/88829156
二、DHCP原理
- DHCP基本概念
DHCP Dynamic Host Configure Protocol,动态主机配置协议
从BOOTP协议发展过来
UDP封装,服务器端口67,客户端端口68
动态分配TCP/IP信息(IP地址,子网掩码,默认网关,DNS服务器等)
分配出去的信息识有租约的
- DHCP系统组成
DHCP Client:通过DHCP协议请求获取IP地址等网络参数的设备
DHCP Server:能提供DHCP功能的服务器或网络设备
DHCP Relay:负责DHCP服务器和DHCP客户端之间的DHCP报文,协助DHCP服务器向DHCP客户端动态分配网络参数的设备 - DHCP报文类型