-
前言
DHCP和DHCP Relay的實戰
1、環境描述
節點 |
規格 |
角色 |
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地址。
2、準備操作
兩個步驟:
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功能轉發。所以先不修改兩臺主機的網卡,先確保軟件包安裝完成,需要需要文件獲取完畢後,再進行如下實驗。
3、配置DHCP server
兩個步驟:
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號端口上。
4、配置dhcp relay server
四個步驟:
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地址
4、驗證結果
VM1如我們預期和DHCP服務器處於同一網段可以獲取到地址
VM2和DHCP服務器不處於同一網段中也獲取到了自己對應網段的地址
DHCP服務器上也可以看到這些VM的租約信息