Ubuntu12.10 下搭建基于KVM-QEMU的虚拟机环境(十五)

接下来我们试验虚拟机的网络配置功能,KVM虚拟机网络配置主要有两种方式:NAT方式和Bridge方式。今天我们主要理解和实验NAT方式的网络配置。

NAT方式是kvm安装后的默认方式,它支持主机与虚拟机的互访,同时也支持虚拟机访问互联网,但不支持外界访问虚拟机,因为NAT的全称是Network Address Translation(网络地址转换),即虚拟机和主机在一个特定的内部子网内,虚拟机的网络数据在经过物理机网络的时候进行ip伪装,这样所有虚拟机出去的网络数据都相当于是物理机出去的数据,也就是说,我们可以分配给使用nat网络的虚拟机一个内网ip,而这个内网ip的虚拟机访问出去的时候外部网络看到的是物理机的外网ip,这样做的用处就是实现多个虚拟机共享物理主机的外网ip,节省外网ip地址。

NAT的逻辑原理图如下:

Ubuntu12.10 下搭建基于KVM-QEMU的虚拟机环境(十五)

上图中的“virbr0”就充当了一个虚拟网络交换机的作用,所有虚拟机要跟外界通信都先通过这个virbr0。那么virbr0是如何在主机上创建出来的呢?virbr0又如何起作用的?虚拟机如何使用virbr0作为其网络交换机?

1.virbr0的创建

libvirt默认使用了一个名为defaultnat网络,这个网络默认使用virbr0作为桥接接口,使用dnsmasq来为使用nat网络的虚拟机提供dnsdhcp服务,dnsmasq生效后的配置文件默认保存在以下路径:

/var/lib/libvirt/dnsmasq/default.hostsfile mac&&ip绑定的配置文件

/var/lib/libvirt/dnsmasq/default.leases dhcp分配到虚拟机的ip地址列表

/var/lib/libvirt/network/default.xmldefault网络的配置文件

打开default.xml可以看到:

<!--

WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE

OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:

virsh net-edit default

or other application using the libvirt API.

-->

<networkstatus>

<class_id bitmap='0-2'/>

<floor sum='0'/>

<network>

<name>default</name>

<uuid>cfbccd14-664c-4d02-91ef-ef3b1e168f61</uuid>

<forward mode='nat'>

<nat>

<port start='1024' end='65535'/>

</nat>

</forward>

<bridge name='virbr0' stp='on' delay='0' />

<ip address='192.168.122.1' netmask='255.255.255.0'>

<dhcp>

<range start='192.168.122.2' end='192.168.122.254' />

</dhcp>

</ip>

</network>

从上面的配置里可以清楚的看到网络名称是“default”, 网桥名称是”virbr0”forward模式是“nat”,虚拟机可以dhcp的地址范围等。

ifconfig可以看到:

Ubuntu12.10 下搭建基于KVM-QEMU的虚拟机环境(十五)

Virbr0已经被成功的虚拟出来了。

2.virbr0如何工作

本质上说libvirt所实现的这种nat网络是通过物理机的iptables规则来实现的,也即是在虚拟机数据经过nat表的postrouting链出去的时候对其进行了伪装。

如下图所示:

# iptables –t nat –L –nv

Ubuntu12.10 下搭建基于KVM-QEMU的虚拟机环境(十五)

该主机上的设置表明对source192.168.122.0网段的所有数据包,如果destination不是192.168.122.0网段(即不是同一子网的虚拟机或主机),那么都用主机的IP地址进行伪装。这样当虚拟机访问外网的时候,外网只看到了主机的IP地址,而看不到虚拟机的实际内网地址。

3.虚拟机如何配置virbr0

虚拟机的定义XML中的interface定义如下:

<interface type='bridge'>

<mac address='52:54:00:7b:a8:d8'/>

<source bridge='virbr0'/>

<target dev='vnet0'/>

<model type='virtio'/>

</interface>

上面的source bridge就指向了“virbr0”,虚拟机从dnsmasq获取到192.168.122.0网段的一个IP地址

启动虚拟机后,运行“ifconfig, 可以看到有个叫vnet0的网络接口被创建出来,这就是该虚拟机的虚拟网络接口。

Ubuntu12.10 下搭建基于KVM-QEMU的虚拟机环境(十五)

再运行“brctlshow”看看:

Ubuntu12.10 下搭建基于KVM-QEMU的虚拟机环境(十五)

很清楚,这个虚拟机的vnet0网络接口是加入在virbr0这个虚拟网桥的,所以这个虚拟机的网络数据都需要这个virbr0转发。

最后来看一下,虚拟机里面的IP情况:

Ubuntu12.10 下搭建基于KVM-QEMU的虚拟机环境(十五)

可以看到这个虚拟机的IP地址是192.168.122.10,网关、DHCP服务器地址和DNS服务器地址都是192.168.122.1192.168.122.1又是什么呢?就是主机上这个virbr0IP地址。