为了模拟一台物理服务器上启动数十台虚拟机的云平台测试环境,需要给这些虚拟机配置相应的IP,这就需要在虚拟交换机侧具有DHCP功能。而现在的OVS并不自带DHCP地址转换功能,查阅了一些资料可以使用dnsmasq搭建一个DHCP服务器,将来自虚拟机的DHCP请求报文全部导入该端口即可。
dnsmasq本身是一个小巧且方便的用于配置DNS和DHCP的工具,这里我们只使用它的DHCP分配地址池功能。
安装dnamasq,debian系直接apt安装:
sudo apt-get install dnsmasq
先在OVS中加入DHCP虚拟设备的端口:
ovs-vsctl add-port br0 qdhcp tag=100 -- set interface qdhcp type=internal
其中的tag设置的是vlan的id。
下一步,启动该虚拟设备,并配置上地址和掩码:
ifconfig qdhcp up
ifconfig qdhcp 192.168.1.1 netmask 255.255.255.0
启动DHCP服务,并关联到上面的虚拟设备
/usr/sbin/dnsmasq --strict-order --bind-interfaces --except-interface lo \
--interface qdhcp --dhcp-range 192.168.1.1,192.168.1.200 \
--dhcp-leasefile=/var/run/dnsmasq/qdhcp.pid --dhcp-lease-max=253 \
--dhcp-no-override --log-queries --log-facility=/tmp/dnsmasq.log
第一次执行之前记得把/var/run/dnsmasq/文件夹创建了,不然会报错。
这里比较重要的参数就是创建地址池范围是192.168.1.1~192.168.1.200,即当有DHCP请求来时给它们从这个区间里分配ip地址。
当想要把一些虚拟机加入到这个DHCP虚拟设备所在的vlan中,需要同样设置好tag。(图中设置的是使用vhostuser端口的虚拟机,其他方式类似)
ovs-vsctl set port vhost-user-1 tag=100
这样我们建成了一个含有DHCP服务的虚拟网络拓扑,如下图所示:
一台物理服务器上的虚拟网络拓扑图.png
最后一个问题是在OVS中配置什么样的规则能够让DHCP的请求和应答按照图中黄色路径所示。
抓包显示,当虚拟机设置为“自动获取ip地址”时,启动后会发送源ip为“0.0.0.0”的请求包,所以我们就可以此为特征设置规则(源ip为0.0.0.0的流量发送到3端口,而答复流量可以直接匹配目的虚拟机的mac):
ovs-ofctl add-flow br0 "tun_src=0.0.0.0,actions=output:3"
ovs-ofctl add-flow br0 "dl_dst=00:00:00:00:00:01,actions=output:1"
至此,一个支持DHCP的小型虚拟网络已经设置完了。
网友评论