zoukankan      html  css  js  c++  java
  • linux中的虚拟化网络模型及各种模型实现

    第一种隔离模型:

    Guest1和Guest2都为虚拟机。

    首先要了解在linux中的虚拟机的网卡都包含前半段和后半段,前半段在虚拟机上,后半段在宿主机上,这里以centos6为例,上图

    eth0为Guest1虚拟机上的网卡,对应的后半段为vnet0,在Guest1上所有发往eth0的数据就直接发往vnet0了,也可以将vnet0看作

    一块网卡

    Guest1如何跟Guest2通信?

    很简单在宿主机中做一个虚拟交换机,让vnet0和vnet1分别为虚拟交换机的一个接口,交换机也可叫做bridge,只要两个虚拟机网卡

    的前半段的ip地址在同一个网段中,就可以相互通信了,这就是隔离模型

    第二种路由模型:

    交换机中多了virnet1网卡,将eth0和eth1的网关指向virnet1,再打开linux的核心转发功能,虚拟机就可以和外部通信了

    打开核心转发功能的方法sysctl -w net.ipv4.ip_ipforward=1

    第三种NAT模型:

    在路由模型中虽然虚拟机的ip报文能够发出去跟外部通信了,但外部主机可能找不到通往虚拟机的路由却能跟宿主机通信,为了虚拟机

    能得到外部主机的响应,将发出去跟外部主机通信的ip报文的源地址都转换成宿主机物理网卡的地址,这就是NAT模型,也是使用得最

    的模型

    最后一种桥接模型:

    在宿主机中创建一个桥设备,把宿主机的eth0放在桥上,这样Guest1上的eth0将报文发给vnet0,再直接发给宿主机上的eth0,将源

    地址改为宿主机上的eth0的地址

    当响应报文到达物理机上的eth0时如何判断此响应报文是发给虚拟机的还是物理机自己的?

    物理机会先创建一个虚拟网卡,在物理机上打开混杂模式(无论mac地址是不是自己的都将接收响应报文),如果mac地址是自己的则转

    发给虚拟网卡,如果不是自己的则转发给vnet0,这就是桥接模型,因为物理机的网卡具有桥的功能所以叫做桥接模型

    如何在linux上创建一个桥设备?

    桥设备是在内核中实现

    modinfo bridge查看内核是否安装此模块

    创建桥的命令为brctl,使用brctl -h查看命令帮助,使用brctl addbr br0就创建了一个叫br0的网络接口

    brctl show 显示当前主机上的所有桥

    ifconfig br0 up 激活br0接口

    qemu-kvm net选项介绍

         nic、tap和user三种类型网络接口的属性,nic就是虚拟机网卡的前半段,而tap就是对应的后半段

    net nic: 创建一个新的虚拟机网卡接口,使用方法:

        -net nic[,vlan=n][,macaddr=mac][,model=type][,name=name][,addr=addr][,vectors=v]

        创建一个新的网卡设备并连接至指定的vlan中,macaddr用于为其指定MAC地址

        model指定网卡类型,qemu可以模拟多个类型的网卡设备,如virtio,PC架构上默认的NIC为e1000,可以使用“qemu-

        kvm -net nic,model=?”来获取当前平台支持的类      

        name用于指定一个在监控时显示的网卡设备名称

        -net tap[,vlan=n][,name=name][,fd=h][,ifname=name][,script=file][,downscript=dfile]

        通过物理机的TAP网络接口连接至指定vlan中,ifname指定网卡后半段的名字

        虚拟机启动时,网卡的后半段不会自动添加,需要一个脚本来添加,使用script=file指定的脚本(默认为/etc/qemu-ifup)来

        配置当前网络接口,并使用downscript=file指定的脚本(默认为/etc/qemu-ifdown)来撤消接口配置,使用script=no和  

        downscript=no可分别用来禁止执行脚本

    qemu-kvm -m 128 -cpu host -smp 2 -name "first" -drive file=/root/cirros-no_cloud-0.3.0-x86_64-disk.img,if=virtio,media=disk,format=qcow2,cache=writeback -nographic -net nic -net tap,ifname=vnet0.0,script=no

    启动一个虚拟机,不指定tap脚本

    回到物理机上执行ifconfig -a

    虚拟机网卡后半段被自动添加了,但因为没有指定脚本而没有生效

    启动脚本示例:vim /etc/qemu-ifup

        #!/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

    qemu-kvm会在创建启动虚拟机时自动把虚拟机网卡的后半段的名字当作参数传递给此脚本

    关闭脚本示例:vim /etc/qemu-ifdown

        #!/bin/bash
        #
        bridge=br0
    
        if [ -n "$1" ];then
            brctl delif $bridge $1
            ip link set $1 down
            exit 0
        else
            echo "Error: no interface specified."
            exit 1
        fi

    qemu-kvm -m 128 -cpu host -smp 2 -name "first" -drive file=/root/cirros-no_cloud-0.3.0-x86_64-disk.img,if=virtio,media=disk,format=qcow2,cache=writeback -nographic -net nic -net tap,ifname=vnet0.0,script=/etc/qemu-ifup

    验证:

    vnet0.0已经被添加到物理机的桥上了    

    再启动一个虚拟机,两个虚拟机中将网卡地址配置到同一网段,两台虚拟机就可以通信了,不过记得创建虚拟机时,指定MAC地址因

    为不指定的话两台虚拟机的MAC地址是相同的,导致无法通信,配置MAC时前三位不要动固定:52:54:00后三位自己更改

    例如:    

    qemu-kvm -m 128 -cpu host -smp 2 -name "second" -drive file=/root/cirros-no_cloud-0.3.0-x86_64-disk.img,if=virtio,media=disk,format=qcow2,cache=writeback -nographic -net nic,macaddr=52:54:00:11:22:33 -net tap,ifname=vnet0.1,script=/etc/qemu-ifup    

    到此一个隔离模型的虚拟网络就创建完成了

     在此基础上实现基于路由的NAT模型也简单了,首先配置br0的ip地址,在虚拟机中添加路由,将网关指向br0,打开核心转发功能(net.ipv4.ip_forward),添加

    一条iptables规则,例如:iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 192.168.238.150 

    192.168.1.0/24:虚拟机所在网段  192.168.238.150:物理网卡地址

    补充:如果在centos6上此步免去,centos7需安装安装iptables,步骤如下

    service iptables status 检查是否安装了iptables

    yum -y install iptables

    yum -y install iptables-services

    systemctl stop firewalld

    systemctl mask firewalld  禁用firewalld

  • 相关阅读:
    .net core ef动态orderby
    .Net Core 2.*+ InfluxDB+Grafana+App Metrics实时性能监控
    .net core 第三方工具包集合
    .net core appsetting/获取配置文件
    appium处理混合APP_获取上下文(切换句柄)
    Linux平时常用命令_查看进程_监控日志等命令
    手机monkey测试BUG重现及解决方法
    postman常用公共函数
    Jmeter远程运行_多机联合负载
    httpclient向浏览器发送get和post请求
  • 原文地址:https://www.cnblogs.com/linuxboke/p/5536219.html
Copyright © 2011-2022 走看看