zoukankan      html  css  js  c++  java
  • libvirt kvm 虚拟机上网 – Bridge桥接

    版权声明:本文由陈煜东原创文章,转载请注明出处: 
    文章原文链接:https://www.qcloud.com/community/article/90

    来源:腾云阁 https://www.qcloud.com/community

    通过艰难的过程,终于使用libvirt安装完qemu kvm虚拟机了.但是发现虚拟机不能上网.虚拟机想要上网,有很多中方法.

    先说两个定义:Guest机器为虚拟机,Host机器为开机运行的真实机器.

    查看libvirt的教程,看到网络配置有许多中方式.详情可以访问http://libvirt.org/formatdomain.html#elementsNICS

    • NAT (默认上网) 虚拟机利用host机器的ip进行上网.对外显示一个ip
    • Bridge 将虚拟机桥接到host机器的网卡上,guest和host机器都通过bridge上网.对外不同的ip,

    一.Bridge桥接原理

    Bridge方式即虚拟网桥的网络连接方式,是客户机和子网里面的机器能够互相通信。可以使虚拟机成为网络中具有独立IP的主机。
    桥接网络(也叫物理设备共享)被用作把一个物理设备复制到一台虚拟机。网桥多用作高级设置,特别是主机多个网络接口的情况。

    • Bridge桥接原理

      如上图,网桥的基本原理就是创建一个桥接接口br0,在物理网卡和虚拟网络接口之间传递数据。

    二. 在host机器配置桥接网络

    首先可以按照ibm 文章的虚拟机配置一下host机的网络情况,这个的目的就是让host生成一个不日多个桥接,大家都通过这个桥接上网.下面我们来看看具体的步骤.

    1.查看网卡是否工作

    确保你想使用bridge网桥的网卡能够为kvm虚拟机模块提供网络连接能力并且网卡是否可以工作.这个网卡应该要能够给guest的kvm虚拟机提供相同的网络支持.接下来例子说明了网卡的配置,并且可以被外部网络访问.这个例子中,使用eth0网卡.

    # ifconfig
    eth0      Link encap:Ethernet  HWaddr 00:14:5E:C2:1E:40
              inet addr:10.10.1.152  Bcast:10.10.1.255  Mask:255.255.255.0
              inet6 addr: fe80::214:5eff:fec2:1e40/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:664 errors:0 dropped:526 overruns:0 frame:0
              TX packets:163 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000
              RX bytes:69635 (68.0 KiB)  TX bytes:25091 (24.5 KiB)
              Interrupt:74 Memory:da000000-da012800
    ................
    

    2.备份network-scripts网络脚本文件

    备份网络配置到不同的目录下,将来可以用来恢复网络配置,. 根据下面的命令将网络脚本ifcfg-eth0 网卡到 /root目录:

    # cp /etc/sysconfig/network-scripts/ifcfg-eth0 /root/.
    注意:不要把文件copy到/etc/sysconfig/network-scripts/目录或者其子目录

    3.进入network-scripts目录

    进入 /etc/sysconfig/network-scripts/目录.

    cd /etc/sysconfig/network-scripts/

    4.为桥接新建配置文件

    为Linux的bridge创建一个新的配置文件为/etc/sysconfig/network-scripts/ifcfg-br0,这里br0是bridge网桥的名字,同eth0类似.使用以下命令

    cp ifcfg-eth0 ifcfg-br0
    具体的内容是基于已有的配置文件来进行的.

    5.编辑bridge网桥配置文件

    编辑配置文件,让数据包通过bridge(网桥)进行上网.你的网络配置很可能是通过静态ip(BOOTPROTO=static)上网或者是从DHCP服务器获得ip(BOOTPROTO=dhcp)上网的.

    如果你的网络是通过静态ip地址来配置的,那么你的配置很可能是和下面一样的:

    DEVICE=eth0
    BOOTPROTO=static
    HWADDR=00:14:5E:C2:1E:40
    IPADDR=10.10.1.152
    NETMASK=255.255.255.0
    ONBOOT=yes
    

    下面的显示了eth0和br0的静态ip配置内容,可以根据下面进行编辑

    static ip配置


    /etc/sysconfig/network-scripts/ifcfg-eth0    
    DEVICE=eth0
    TYPE=Ethernet
    HWADDR=00:14:5E:C2:1E:40
    ONBOOT=yes
    NM_CONTROLLED=no
    BRIDGE=br0
    

    /etc/sysconfig/network-scripts/ifcfg-br0
    DEVICE=br0
    TYPE=Bridge
    NM_CONTROLLED=no
    BOOTPROTO=static
    IPADDR=10.10.1.152
    NETMASK=255.255.255.0
    ONBOOT=yes
    

    下面显示的eth0和br0的DHCP配置情况.

    DHCP配置


    /etc/sysconfig/network-scripts/ifcfg-eth0    
    DEVICE=eth0
    TYPE=Ethernet
    HWADDR=00:14:5E:C2:1E:40
    ONBOOT=yes
    NM_CONTROLLED=no
    BRIDGE=br0
    

    /etc/sysconfig/network-scripts/ifcfg-br0
    DEVICE=br0
    TYPE=Bridge
    NM_CONTROLLED=no
    BOOTPROTO=dhcp
    ONBOOT=yes
    

    6.重启网络服务

    重启网络以验证网络配置是否工作.

    如果网络配置不正确,网络连接将会断开,你的电脑将失去访问能力.这样的话,检查以下配置文件,然后使用以下的命令重启以下网络服务:

    # service network restart

    7.禁用网络过滤器

    向文件/etc/sysctl.conf添加以下代码:

    net.bridge.bridge-nf-call-ip6tables = 0
    net.bridge.bridge-nf-call-iptables = 0
    net.bridge.bridge-nf-call-arptables = 0
    

    8.重新加载kernel参数

    # sysctl -p 
    net.ipv4.ip_forward = 0 
    ...
    net.bridge.bridge-nf-call-ip6tables = 0 
    net.bridge.bridge-nf-call-iptables = 0 
    net.bridge.bridge-nf-call-arptables = 0
    

    9.验证配置是否成功

    通过运行ifconfig来验证以下配置是否成功.如果出现两个项,即网桥的br0和现在在工作的eth0:

    br0       Link encap:Ethernet  HWaddr 00:14:5E:C2:1E:40
              inet addr:10.10.1.152  Bcast:10.10.1.255  Mask:255.255.255.0
              inet6 addr: fe80::214:5eff:fec2:1e40/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:125 errors:0 dropped:0 overruns:0 frame:0
              TX packets:81 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:0
              RX bytes:16078 (15.7 KiB)  TX bytes:18542 (18.1 KiB)
    eth0      Link encap:Ethernet  HWaddr 00:14:5E:C2:1E:40
              inet6 addr: fe80::214:5eff:fec2:1e40/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:206 errors:0 dropped:0 overruns:0 frame:0
              TX packets:58 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000
              RX bytes:27308 (26.6 KiB)  TX bytes:13881 (13.5 KiB)
              Interrupt:74 Memory:da000000-da012800
    

    注意:你可能发现eth0的网络信息里面没有ipv4的地址了.或者你的GUI界面的网络显示你是断网的. 这不用担心.因为eth0的网络能力已经通过br0进行工作.你的host网络还是能正常工作的.
    也可以使用以下的命令来查看网桥是否工作.

    # brctl show
    bridge name     bridge id               STP enabled     interfaces
    virbr0          8000.000000000000       yes
    br0             8000.000e0cb30550       no              eth0
    

    如果是类似的输出,那么你的Linux的Bridge网桥就配置的差不多了.

    二.为Guest虚拟机配置网络

    1.配置Guest虚拟机的xml文件

    在虚拟机的xml配置文件进行设置网络的连接方式为bridge桥接,并且桥接的设备为br0.其中mac地址要改变!不然MAC相同,局域网MAC地址相同的电脑不能上网.

    <interface type="bridge"> <!--虚拟机网络连接方式-->
    <source bridge="br0" /> <!-- 当前主机网桥的名称-->
    <mac address="00:16:e4:9a:b3:6a" /> <!--为虚拟机分配mac地址,务必唯一,否则dhcp获得同样ip,引起冲突-->
    </interface>
    

    2.在虚拟机配置网络

    我使用的是CentOS Minimal Installation的发行版.使用以下命令就可以进行上网了. 一开始只有lo显示.没有看到eth0,后来想到了eth0被禁用了,于是开启即可.

    # ifconfig eth0 up
    # dhclient eth0
    

    现在还有个问题是,网络不随开机启动. 我打开/etc/sysconfig/network-scripts/ifcfg-eth0显示:

    DEVICE=eth0
    HWADDR=52:54:00:12:34:56
    ONBOOT=yes
    NM_CONTROLLED=yes
    BOOTPROTO=dhcp
    

    虽然设置了开机启动,但是每次开机都需要运行上面的两个命令.这样就没办法远程控制主机了.

    后来发现是udev弄的.udev在/etc/udev/rules.d/下面搞了一个持久命名规则(persistent-net.rules),对于网卡的持久命令,就采取了MAC地址的匹配方式

    原来虚拟机安装后自带MAC网卡地址和我xml定义的网卡不一样.于是我就将虚拟机的MAC网卡提取出来,替换xml文件的MAC网卡信息.然后undefine和define以下虚拟机.

    重启虚拟机,发现这次网络能够自动开机获得了.

    参考资料
    http://blog.csdn.net/samlei/article/details/7598541
    http://www.linuxtopia.org/online_books/rhel6/rhel_6_virtualization/rhel_6_virtualization_sect-Virtualization-Network_Configuration-Bridged_networking_with_libvirt.html
    IBM – Configuring the network
    http://ueaner.iteye.com/blog/1291350
    http://blog.csdn.net/xiyuan1999/article/details/5125002

  • 相关阅读:
    Windows Azure Web Site (19) Azure Web App链接到VSTS
    Windows Azure Virtual Machine (35) Azure VM通过Linked DB,执行SQL Job
    Azure PowerShell (16) 并行开关机Azure ARM VM
    Windows Azure Virtual Network (12) 虚拟网络之间点对点连接VNet Peering
    Azure ARM (21) Azure订阅的两种管理模式
    Windows Azure Platform Introduction (14) 申请海外的Windows Azure账户
    Azure ARM (20) 将非托管磁盘虚拟机(Unmanage Disk),迁移成托管磁盘虚拟机(Manage Disk)
    Azure ARM (19) 将传统的ASM VM迁移到ARM VM (2)
    Azure ARM (18) 将传统的ASM VM迁移到ARM VM (1)
    Azure Automation (6) 执行Azure SQL Job
  • 原文地址:https://www.cnblogs.com/purpleraintear/p/6026091.html
Copyright © 2011-2022 走看看