http://blog.csdn.net/hbsong75/article/details/9304163

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

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

NAT的逻辑原理图如下:

 

上图中的“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.xml default网络的配置文件

打开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可以看到:

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

 

2.        virbr0如何工作

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

如下图所示:

# iptables –t nat –L –nv

该主机上的设置表明对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的网络接口被创建出来,这就是该虚拟机的虚拟网络接口。

 

再运行“brctlshow”看看:

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

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

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

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐