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












  • 相关阅读:
    Manjaro19.0.2 electron-酸酸乳 无法添加订阅地址
    cnblogs美化技巧
    manjaro19.0.2+typora+PicGo
    剑指offer 面试题7.重建二叉树
    剑指offer 面试题6.从尾到头打印链表
    add sudo user
    tensorflow 禁用 gpu
    kill screen detached session
    git 修改远程仓库链接
    grub 分辨率修改
  • 原文地址:https://www.cnblogs.com/wyzhou/p/9630660.html
Copyright © 2011-2022 走看看