Linux Bridge是Linux Kernel提供的一种虚拟网络桥接功能,通过bridge-utils提供的brctl命令进行管理。本文将阐述如何将Linux Brige和dnsmasq结合,来为新创建的虚机分配IP地址,并且允许续集通过linux bridge访问外网。
总体的架构图如下:
实现方法如下:
1. 安装bridge-utils软件包
# yum -y install bridge-utils
2. 安装libvirt, virt-install和qemu-kvm软件包,并启动libvirtd
# yum -y install libvirt virt-install qemu-kvm
# systemctl start libvirtd
# systemctl enable libvirtd
3. 创建一个linux bridge,命名为bridge0。打开stp,并且将"bridge forward delay"设置为2秒(很重要,否则虚机在启动过程中将需要很长时间才能获得DHCP响应)。
# brctl addbr bridge0
# brctl stp bridge0 on
# brctl setfd bridge0 2
4. 为bridge0配置一个IP地址,比如10.0.0.1/24
# ifconfig bridge0 10.0.0.1 netmask 255.255.255.0 up
5. 打开IP forward。只有打开,才能让虚机访问外网。
# echo 1 > /proc/sys/net/ipv4/ip_forward
6. 在bridge0上启动一个dnsmasq监听进程,如下:
# /usr/sbin/dnsmasq --strict-order --bind-interfaces --except-interface lo --interface bridge0 --dhcp-range 10.0.0.2,10.0.0.254 \
--dhcp-leasefile=/var/run/dnsmasq/bridge0.pid --dhcp-lease-max=253 --dhcp-no-override --log-queries --log-facility=/tmp/dnsmasq.log
7. 创建一个虚机来测试,命名为vm1。为了简单起见,用cirros作为disk image。需要提前将image文件cirros-0.3.1-x86_64-disk.img上传到/tmp/vm1/下面。这里用到的network就是之前创建的bridge。
# virt-install --connect=qemu:///system --name=vm1 --ram=50 --vcpus=1 --virt-type qemu --disk path=/tmp/vm1/cirros-0.3.1-x86_64-disk.img,format=qcow2 --import --network bridge:bridge0
可以看到虚拟机在启动过程中通过DHCP获得了IP地址,如下:
Starting network...
udhcpc (v1.20.1) started
Sending discover...
Sending select for 10.0.0.49...
Lease of 10.0.0.49 obtained, lease time 3600
8. 登陆虚拟机,然后ping外网地址,可以ping通。
$ hostname
cirros
$ ping www.baidu.com
PING www.baidu.com (61.135.169.121): 56 data bytes
64 bytes from 61.135.169.121: seq=0 ttl=127 time=23.946 ms
64 bytes from 61.135.169.121: seq=1 ttl=127 time=51.263 ms
64 bytes from 61.135.169.121: seq=2 ttl=127 time=47.491 ms