DHCP和DHCP Relay的实战
节点 |
规格 |
角色 |
node1 |
2CPU 2G |
DHCP 服务器 |
node2 |
2CPU 2G |
DHCP 中继 |
VM1 |
1CPU 128M |
1.0网段测试VM |
VM2 |
1CPU 128M |
2.0网段测试VM |
整体环境通过2台Workstation上的VM实现,node1使用2块网卡,node2使用3块网卡,其中node2上再跑2台VM充当不同网段的客户端来测试地址获取。
注意:这个拓扑环境中请屏蔽eth0,eth0这块网卡我没有配置网关,这个网卡就只用于我本地ssh连接,就当node1只有eth1,node2只有eth2、eth3。网卡可以先添加但不配置地址,下文有配置地址的步骤。
这个拓扑中大体的规划是这样
node1:作为DHCP服务器
eth1:hostonly模式(我这里是workstion的vmnet2)
node2:作为DHCP中继服务器
eth1:hostonly模式(我这里是workstion的vmnet2)
eth2:hostonly模式(我这里是workstion的vmnet3)
注意:去勾选workstaion的DHCP服务器分配地址避免影响
而后eth1和eth2分别添加到br1,br2的这个两个桥上,然后VM1、VM2的后半段网卡也分别桥接到br1,br2的这个两个桥上。
一般情况下DHCP Server和终端要在同一网段中,但如果每一个网段都维护一台DHCP这样会太奢侈。这个时候可以通过DHCP relay来实现使用一台DHCP为不同的网段的终端分配地址。
拓扑中DHCP server和VM2不在同一个网段中,VM2 DHCP初始化时广播只能在本网段进行,所以VM2(2.0网段)的广播请求是无法到达DHCP服务器(1.0网段),这个时候与本地相连DCHP Relay就相当于是一个代理人的角色,收到该广播报文后将进行适当处理并转发给其指定的其它网络上的dhcp server,dhcp server 根据dhcp client 提供的信息进行相应的配置,并通过dhcp relay 将配置信息发送给dhcp client,完成对dhcp client 的动态配置。
最终我们的目的是,同网段的VM1(1.0网段)可以获取IP地址,不同网段VM2(2.0网段)也可以获取IP地址。
两个步骤:
1.两台需要安装好DHCP软件包
2.在DHCP中继上准备cirros-0.5.1-x86_64-disk.img
安装dhcp软件包(软件包中已经包含dhcp和dhcrelay两个程序)
yum install dhcp
准备用于验证VM的镜像文件(只需要在dhcp中继上操作)
wget http://download.cirros-cloud.net/0.5.1/cirros-0.5.1-x86_64-disk.img -o /dhcp/
cp /dhcp/cirros-0.5.1-x86_64-disk{,-vm1}.img
cp /dhcp/cirros-0.5.1-x86_64-disk{,-vm2}.img
文章中所有用到的配置文件及镜像可以从此处获取
https://github.com/junfengjiang/DHCP
我们目的仅仅为了做DHCP和DHCP relay的功能性验证,为了保持环境的简单我们DHCP relay上不配置iptables nat功能转发。所以先不修改两台主机的网卡,先确保软件包安装完成,需要需要文件获取完毕后,再进行如下实验。
两个步骤:
1.配置dhcp server地址
2.配置两个作用域(地址池),192.168.1.0/24, 192.168.2.0/24
3.1、配置dhcp server地址
我的dhcpserver在192.168.1.0的这个网络中,因此我们只需要配置eth1的地址,要注意的是网关一定要配置eth1上,其他网卡不能配置网关。
为了避免混淆我把我这台机器上两块网卡的配置贴出来,如下:
# vim /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
IPADDR=192.168.3.170
NETMASK=255.255.255.0
NAME=eth0
DEVICE=eth0
ONBOOT=yes
# vim /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE=Ethernet
BOOTPROTO=static
IPADDR=192.168.1.100
NETMASK=255.255.255.0
GATEWAY=192.168.1.254
NAME=eth1
DEVICE=eth1
ONBOOT=yes
配置完成重启网络服务
systemctl restart network
3.2、定义两个subnet
配置规划的地址池
vim /etc/dhcp/dhcpd.conf
subnet 192.168.1.0 netmask 255.255.0.0 {
range 192.168.1.20 192.168.1.30;
option routes 192.168.1.254
}
subnet 192.168.2.0 netmask 255.255.0.0 {
range 192.168.2.20 192.168.2.30;
option routes 192.168.2.254
}
启动dhcp服务
systemctl start dhcpd.service
3.3、验证结果
如果配置正常,结果应该如下图所示,dhcpserver在192.168.1.0这个网段中,而且网关是指向我们的dchp中继服务器的192.168.1.254(中继服务器的eth1)。
dchpd也已经正常启动,且监听在本机所有地的67号端口上。
四个步骤:
1.打开核心转发
2.配置虚拟机网络环境
3.运行虚拟机
4.启动dhcp replay
4.1、打开核心转发功能
echo 1 >/proc/sys/net/ipv4/ip_forward
cat /proc/sys/net/ipv4/ip_forward
注意:这里是临时启用,系统重启后会失效
4.2、配置虚拟机网络环境
brctl addbr br1 && brctl addif br1 eth1 && ifconfig br1 192.168.1.254/24;
brctl addbr br2 && brctl addif br2 eth2 && ifconfig br2 192.168.2.254/24;
提供br1的ifup、ifdown脚本
脚本可以通过文章开头链接获取,脚本可以全部直接放到/etc/下
/etc/if-up-br1脚本:
#!/bin/bash
bridge=br1
if [ -n "$1" ]; then
ip link set $1 up
sleep 1
brctl addif $bridge $1
[ $? -eq 0 ] && exit 0 || exit 1
else
echo "Error: no port specified."
exit 2
fi
/etc/if-down-br1脚本:
#!/bin/bash
bridge=br1
if [ -n "$1" ]; then
ip link set $1 down
sleep 1
brctl delif $bridge $1
[ $? -eq 0 ] && exit 0 || exit 1
else
echo "Error: no port specified."
exit 2
fi
提供br2的ifup、ifdown脚本
/etc/if-up-br1脚本:
#!/bin/bash
bridge=br2
if [ -n "$1" ]; then
ip link set $1 up
sleep 1
brctl addif $bridge $1
[ $? -eq 0 ] && exit 0 || exit 1
else
echo "Error: no port specified."
exit 2
fi
/etc/if-down-br2脚本:
#!/bin/bash
bridge=br2
if [ -n "$1" ]; then
ip link set $1 down
sleep 1
brctl delif $bridge $1
[ $? -eq 0 ] && exit 0 || exit 1
else
echo "Error: no port specified."
exit 2
fi
4.3、给于脚本执行权限
chmod +x /etc/qemu-ifup-br{1,2}
chmod +x /etc/qemu-ifdown-br{1,2}
4.4、链接qemu-kvm到命令搜索的path环境变量中
ln -sv /usr/libexec/qemu-kvm /usr/bin/
4.5、创建VM1
qemu-kvm -m 128 -smp 1 -name vm1 -drive file=/dhcp/cirros-0.5.1-x86_64-disk-vm1.img,if=virtio,media=disk,format=qcow2, -net nic,macaddr=52:54:00:aa:bb:aa -net tap,ifname=vmnet1,script=/etc/qemu-ifup-br1,downscript=/etc/qemu-ifdown-br1 --nographic
4.6、创建VM2
qemu-kvm -m 128 -smp 1 -name vm2 -drive file=/dhcp/cirros-0.5.1-x86_64-disk-vm2.img,if=virtio,media=disk,format=qcow2, -net nic,macaddr=52:54:00:aa:bb:bb -net tap,ifname=vmnet2,script=/etc/qemu-ifup-br2,downscript=/etc/qemu-ifdown-br2 --nographic
4.7、启用dhcrelay功能
dhcrelay 192.168.1.100
4.8、验证结果
如果过配置正确,br1这个桥上有eth1和vmnet1,br2这个桥上有eth2和vmnet2
且中继服务正常启动起来监听在所有网卡的67号端口上
而且node2中可以使用br1来ping通node1的eth1地址
VM1如我们预期和DHCP服务器处于同一网段可以获取到地址
VM2和DHCP服务器不处于同一网段中也获取到了自己对应网段的地址
DHCP服务器上也可以看到这些VM的租约信息