zoukankan      html  css  js  c++  java
  • kvm的4中网络模型(qemu-kvm)

     1. 隔离模式(类似vmare中仅主机模式):虚拟机之间组建网络,该模式无法与宿主机通信,无法与其他网络通信,相当于虚拟机只是连接到一台交换机上,所有的虚拟机能够相互通信。
     2. 路由模式:相当于虚拟机连接到一台路由器上,由路由器(物理网卡),统一转发,但是不会改变源地址。
     3. NAT模式(类似vmare中的NAT模式):在路由模式中,会出现虚拟机可以访问其他主机,但是其他主机的报文无法到达虚拟机,而NAT模式则将源地址转换为路由器(物理网卡)地址,这样其他主机也知道报文来自那个主机,在docker环境中经常被使用。
     4. 桥接模式(类似vmare中的bridge桥接模式):在宿主机中创建一张虚拟网卡作为宿主机的网卡,而物理网卡则作为交换机。

    一. 隔离模式:

    Guest1 和 Guest2 均是虚拟机


    Linux在虚拟机中的网卡都包含"前半段"和"后半段"(实际上是一对设备),前半段在虚拟机上,后半段在宿主机上。上图eth0在Guest1虚拟机上的网卡,对应的后半段为vnet0,在Guest1上所有发往eth0的数据就直接发往vnet0了,也可以将vnet0看作一张网卡

    Guest1和Guest2如何通信:
    在宿主机中创建一个虚拟交换机(即网桥,也称软桥),让vnet0和vnet1分别为虚拟交换机(网桥)的一个接口,交换机也可以叫做bridge,只要两个虚拟网卡的前半段ip(eth0)地址在同一个网段内(两个虚拟机后半段的两个虚拟网卡vnet0和vnet1均绑定在同一个网桥上),就可以相互通信,这就是隔离模式。

    1.1 使用qemu-kvm创建隔离模式网络的虚拟机

    虚拟机启动时,网卡的后半段不会自动添加到虚拟网桥,需要一个脚本来实现,首先编写脚本

    添加网卡脚本:

    cat >>/etc/qemu-ifup<<end

    #!/bin/bash
    BRIDGE=br0
    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 interface specified."
    exit 1
    fi
    
    sh  -n  /etc/qemu-ifup         # 检测有无语法错误
    chmod  +x   /etc/qemu-ifup     # 给与执行权限
    当虚拟机停止时,网卡会自动从网桥中down掉,所以不用编写停止网卡脚本

    执行如下指令启动虚拟机:

    qemu-kvm -smp 1 -m 512 -cpu host 
    -drive file=/images/centos7.img,if=virtio,media=disk,cache=writeback
    -net nic,model=virtio,macaddr=52:54:00:11:22:33
    -net tap,ifname=vnet0.0,script=/etc/qemu-ifup
    -daemonize

    参数说明:
    -smp: 虚拟机cpu线程数
    -cpu: cpu的类型;host为虚拟机使用物理机cpu类型
    -drive: 驱动设备
            file: 驱动设备目录
            if: 驱动设备类型,virtio为半虚拟化类型,性能较好
            media:驱动设备是disk还是cdrom
            cache:设备缓存,writeback为回写
    -net
            nic:虚拟机网卡前半段,这是在虚拟机中使用的网卡
            macaddr:设置虚拟机网卡mac地址,在使用qemu-kvm创建虚拟机时,需要手动指定mac地址,否则会出现相同的mac地址虚拟机
            model:网卡类型,virtio为半虚拟化类型,性能较好
    tap:为虚拟网卡后半段,需要连接到网桥上 ifname:宿主机系统中网卡名称(随意指定),比如:vnet0.0 script:指定启动时,需要执行的脚本,该脚本是将虚拟机的后半段网卡添加到网桥中

    启动第二台虚拟机

    qemu-kvm -smp 1 -m 512 -cpu host 
    -drive file=/images/centos7-1.img,if=virtio,media=disk,cache=writeback
    -net nic,model=virtio,macaddr=52:54:00:11:22:34
    -net tap,ifname=vnet0.1,script=/etc/qemu-ifup
    -daemonize

    两个虚拟机启动后,分别登录,互ping一次
    然后在从宿主机分别ping两台虚拟机一次




    二、 路由模型及NAT模型

    NAT模式
    该模式网桥要作为路由器对虚拟机地址进行转发。

    路由模式是无法修改源地址ip,因此虚拟机可能会成功的将报文发送给目标地址ip,而目标地址ip无法将报文回传给源地址ip;
    NAT模式则是将源地址ip改为物理网卡ip发送给目标地址,目标地址ip回传给物理网卡,在将报文发送至虚拟主机。

     yum install iptables-services  -y     # 安装需要的程序包,使用iptables规则对报文进行转发。

    编写虚拟机开启执行脚本:
    cat >> /etc/qemu-natup<<end

    #!/bin/bash
    #
    bridge=br0
    net="192.168.100.1/24"

    checkbr() {
    if   brctl show | grep -i $1; then
    return 0
    else
    return 1
    fi
    }

    initbr() {
       brctl   addbr   $bridge
       ip   link   set   $bridge   up
       ip   addr  add   $net   dev   $bridge
    }

    enable_ip_forward() {
        sysctl -w net.ipv4.ip_forward=1
    }

    setup_nat() {
      checkbr   $bridge
    if [ $? -eq 1 ]; then
      initbr
      enable_ip_forward
      iptables   -t nat    -A POSTROUTING   -s $net   ! -d $net   -j MASQUERADE
    fi
    }

    if [ -n $1 ]; then
      setup_nat
      ip   link   set   $1   up
      brctl   addif   $bridge   $1
      exit 0
    else
      echo "Error: no interface specified."
      exit 1
    fi

    end

    编写虚拟机关闭执行脚本:

    cat  >>/etc/qemu-natdown <<end

    #!/bin/bash

    #
    bridge=br0
    net='192.168.100.0/24'

    remove_rule() {
      iptables   -t nat   -F
    }

    isalone_bridge() {
    if  ! brctl show | awk "/^$bridge/{print $4}" | grep "[^[:space:]]" &> /dev/null; then
      ip link set $bridge down
      brctl delbr $bridge
      remove_rule
    fi
    }

    if [ -n $1 ]; then
      ip link set $1 down
      brctl delif $bridge $1
      isalone_bridge
      exit 0
    else
      echo "Error: no interface specified."
      exit 1
    fi

    end

    chmod  +x  /etc/{qemu-natup,qemu-natdown}

    ll   /etc/{qemu-natup,qemu-natdown}

    上述2个脚本对于nat模式的网络很重要

    创建虚拟机:
    qemu-kvm -smp 1 -m 512 -cpu host 
    -drive file=/images/centos7.img,if=virtio,media=disk,cache=writeback
    -net nic,model=virtio,macaddr=52:54:00:11:22:33
    -net tap,ifname=vnet0.0,script=/etc/qemu-natup,downscript=/etc/qemu-natdown
    -daemonize
    qemu-kvm -smp 1 -m 512 -cpu host 
    -drive file=/images/centos7-1.img,if=virtio,media=disk,cache=writeback
    -net nic,model=virtio,macaddr=52:54:00:11:22:34
    -net tap,ifname=vnet0.1,script=/etc/qemu-natup,downscript=/etc/qemu-natdown
    -daemonize

    查看两台虚拟机的后半段网卡(vnetX)是否都连接在桥br0上,在通过POSTROUTING链进行源地址转换
    brctl show
    ip a 
    iptables -nL -t nat
    
    

    分别给两台虚拟机配置ip地址,命令如下:

    ip addr add 192.168.100.20/24   dev eth0 
    ip addr add 192.168.100.30/24   dev eth0
    两台虚拟机之间实现互通了,配置默认路由为br0地址,实现公网的访问

    路由配置如下:
    ip route add default via 192.168.100.1



    三、桥接模式

    在该模式下,宿主机会虚拟出来一张虚拟网卡作为宿主机本身的通信网卡(br0),而宿主机的物理网卡则成为桥设备(交换机)(eth0),所以虚拟机相当于在宿主机所在局域网内的一个单独的主机,他的行为和宿主机是同等地位的,没有依存关系。


    使用qemu-kvm创建桥接模式

    为宿主机创建虚拟网卡,并将物理网卡作为桥设备

    cd /etc/sysconfig/network-scripts/
    cp -a ifcfg-eno16777736   ifcfg-br0
    cat >>ifcfg-eno16777736<<end
    TYPE=Ethernet
    BOOTPROTO=none
    DEFROUTE=yes
    PEERDNS=yes
    PEERROUTES=yes
    IPV4_FAILURE_FATAL=no
    IPV6INIT=no
    NAME=eno16777736
    UUID=9f0bf158-e598-4309-8c0c-7609174ff212
    DEVICE=eno16777736
    ONBOOT=yes
    BRIDGE=br0
    end

    cat >>ifcfg-br0 <<end
    TYPE=Bridge
    BOOTPROTO=none
    DEFROUTE=yes
    PEERDNS=yes
    PEERROUTES=yes
    IPV4_FAILURE_FATAL=no
    IPV6INIT=no
    NAME=br0
    DEVICE=br0
    ONBOOT=yes
    IPADDR=10.0.0.11
    NETMASK=255.255.255.0
    GATEWAY=10.0.0.1
    DNS1=10.0.0.1
    DNS2=114.114.114.114
    end

    systemctl restart network 
    ip a

    brctl show

    物理网卡eno16777736 将作为交换机使用,没有ip地址

    编写虚拟机启动脚本,该脚本和隔离模式脚本一致:

    cat   >>  /etc/qemu-ifup<<end

    #!/bin/bash
    #
    BRIDGE=br0
    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 interface specified."
    exit 1
    fi

    end

    启动虚拟机:

    qemu-kvm -smp 1 -m 512 -cpu host 
    -drive file=/images/centos7-1.img,if=virtio,media=disk,cache=writeback
    -net nic,model=virtio,macaddr=52:54:00:11:22:34
    -net tap,ifname=vnet0.1,script=/etc/qemu-ifup
    -daemonize












  • 相关阅读:
    第二十九课 循环链表的实现
    第二十八课 再论智能指针(下)
    第二十七课 再论智能指针(上)
    第二十六课 典型问题分析(Bugfix)
    普通new和placement new的重载
    leetcode 581. Shortest Unsorted Continuous Subarray
    leetcode 605. Can Place Flowers
    leetcode 219. Contains Duplicate II
    leetcode 283. Move Zeroes
    leetcode 217. Contains Duplicate
  • 原文地址:https://www.cnblogs.com/wyzhou/p/9630660.html
Copyright © 2011-2022 走看看