前言
VLAN作为一种虚拟局域网技术,在交换机组网管理、云计算平台的网络服务中都有较为重要的作用,尤其在目前的虚拟交换OVS中,VLAN的应用更加灵活和重要,关于VLAN在OVS中的基础使用方法,可以参见作者的另一篇文章《基于OVS的VLAN应用及实现》,行描述。本文主要介绍在VLAN网络中的DHCP服务器,如何在不同的VLAN网络中分配不同网段的DHCP地址池。
一、技术背景
通常DHCP服务器能够根据DHCP协议的option扩展字段来分配不同的地址池,由于VLAN属于二层网络属性,在DHCP上层应用中是无法获取VLAN信息的,想要根据VLAN信息进行地址池的划分,要么把VLAN信息通过一定的方式带到应用层,要么在不同的VLAN网络中启用多个DHCP服务,一般情况下,选择后一种方式较为简单。
例如,在下图一个Linux系统的网络节点中,外部不同vlan网络可以和节点中的不同VM主机通信,通过eth0接口接入的设备需要根据不同的vlan获取不同网段的地址,eth0接口为了处理vlan1和vlan2的报文,使用vconfig工具创建eth0.1和eth0.2的虚拟接口,和VM的tap口桥接,然后在每个桥接口上采用接口绑定的方式启用DHCP Server服务,这样就完成了不同vlan划分不同地址池的功能。
二、实现原理
上述基于Linux虚拟接口实现的VLAN处理,如果设备接口较多,且VLAN子网也较多的情况下,就需要创建很多个VLAN虚接口来处理不同接口的不同vlan报文,比如存在两个eth0、eth1接口,都需要处理vlan1和vlan2的报文,这样就需要创建eth0.1、eth0.2、eth1.1、eth1.2四个虚拟接口,这种乘法关系在网络接口和vlan子网较多的场景中使用相对繁琐,更进一步的,如果这些虚拟接口在虚拟交换OVS中完成多个地址池,也需要创建多个OVS桥。
在OVS网络中,有一种类型为internal的桥接口,可以通过针对该接口设置tag来处理不同vlan的报文,通过在该接口上启动DHCP服务来分配不同的地址池,实现组网如下图所示:
其中eth1和eth2作为OVS的trunk口转发链路上的报文,dhcp1和dhcp2分别是tag为1和2的internal类型的桥接口,在dhcp1和dhcp2上配置地址并启用DHCP Server,这样就完成了不同的VLAN分配不同地址池的要求。
三、配置命令
创建ovs桥Java
- # ovs-vsctl add-br br-ovs
eth1和eth2加入OVSJava
- # ovs-vsctl add-port br-ovs eth1
- # ovs-vsctl add-port br-ovs eth1
创建启用dhcp服务的桥接口dhcp1和dhcp2Java
- # ovs-vsctl add-port br-ovs dhcp1 -- set interface dhcp1 type=internal
- # ovs-vsctl add-port br-ovs dhcp2 -- set interface dhcp2 type=internal
设置dhcp1和dhcp2的tagJava
- # ovs-vsctl set Port dhcp1 tag=1
- # ovs-vsctl set Port dhcp2 tag=2
查看上述配置如下:
配置地址到桥接口dhcp1和dhcp2Java
- # ifconfig dhcp1 192.168.1.1
- # ifconfig dhcp2 10.0.0.1
在dhcp1和dhcp2上启动dhcp服务Java
- # dnsmasq --bind-interfaces --except-interface=lo --interface dhcp1
- --dhcp-range 192.168.1.2,192.168.1.10
- # dnsmasq --bind-interfaces --except-interface=lo --interface dhcp2
- --dhcp-range 10.0.0.2,10.0.0.10
四、测试结果
用PC设备运行dhcp client获取地址,并通过交换机分别打上tag1和tag2接入eth1(或eth2)进行vlan的测试。当tag值为1时,在eth1上通过tcpdump抓包可以看到vlan1的dhcp报文如下:
在dhcp1上通过tcpdump抓包可以看到dhcp报文如下:
当tag值为2时,在eth1上通过tcpdump抓包可以看到vlan2的dhcp报文如下:
在dhcp2上通过tcpdump抓包可以看到dhcp报文如下:
从上面的验证结果可以看出,两个桥接口dhcp1和dhcp2根据配置的tag只选择处理了对应vlan值的报文,完成了不同网段的VLAN隔离,从而实现了不同VLAN分配不同DHCP地址池的功能。