KVM中的四种简单网络模型

news2024/12/24 20:11:00

KVM中的四种简单网络模型,分别如下:
1、隔离模型(QEMU内置的用户模式网络(user mode networking)):虚拟机之间组建网络,该模式无法与宿主机通信,无法与其他网络通信,相当于虚拟机只是连接到一台交换机上。
2、路由模型(直接分配网络设备(包括VT-d和SR-IOV)):相当于虚拟机连接到一台路由器上,由路由器(物理网卡),统一转发,但是不会改变源地址。
3、NAT模型:在路由模式中,会出现虚拟机可以访问其他主机,但是其他主机的报文无法到达虚拟机,而NAT模式则将源地址转换为路由器(物理网卡)地址,这样其他主机也知道报文来自那个主机,在docker环境中经常被使用。
4、桥接模型(Bridge):在宿主机中创建一张虚拟网卡作为宿主机的网卡,而物理网卡则作为交换机。

下面分别对四种网络模型进行解读和实现,在之前,首先还是先交待一下环境:
宿主机:VMware虚拟机,2CPU,4G内存,40G存储
宿主机操作系统:CentOS 6.5 x86_64
网卡1:192.168.49.10 (NAT模式) 默认网关:192.168.49.2 可访问外网
网卡2:172.28.88.100 (Host-Only模式)

一、隔离模型

如上图所示,Guest1和Guest2都是在宿主机上创建的虚拟机,虚拟机的网卡分为前半段和后半段,前半段位于虚拟机上,后半段在宿主机上,按照图中所示,前半段就是eth0,它是在虚拟机内部看到的网卡名字,而后半段就是vnet0和vnet1,它们是在宿主机上看到的网卡名字。实际上,在Guest1上所有发往eth0的数据就是直接发往vnet0,是由vnet0进行数据的传送处理。
在隔离模式下,宿主机创建一个虚拟交换机vSwitch,然后把vnet0和vnet1接入到该虚拟交换机,交换机也可以叫做bridge,因为vnet0和vnet1在一个网桥内,所以可以互相通信,而虚拟机的eth0是通过后半段进行数据传输,所以只要虚拟机的前半段ip在一个网段内,就可以互相通信,这就是隔离模式。

实现方式:

1、创建虚拟网桥br0

[root@kvm-node1 ~]# yum -y install bridge-utils
[root@kvm-node1 ~]# brctl addbr br0
[root@kvm-node1 ~]# ifconfig br0 up
[root@kvm-node1 ~]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000000000000 no


2、编写一个网卡启动脚本

[root@kvm-node1 ~]# vi /opt/tools/qemu-ifup.sh
[root@kvm-node1 ~]# cat /opt/tools/qemu-ifup.sh

执行shell脚本:./opt/tools/qemu-ifup.sh 物理网卡名称

#!/bin/bash

BRIDGE=br0
if [  -n $1 ];then
    ip link set $1 up
    sleep 2
    brctl addif $BRIDGE $1
    [ $? -eq 0 ] && exit 0 || exit 1
else
    echo -e "\033[1;31mYou must give an interface.\033[0m"
    exit 3
fi

3、使用qumu-kvm创建2台虚拟机

创建第一台名为centos5-1的kvm虚拟机:
qemu-kvm -name “centos5-1” -smp 1 -m 512 -drive file=/images/kvm/centos5.img,if=virtio,media=disk,cache=writeback -net nic,model=virtio,macaddr=00:0c:29:86:4e:1a -net tap,ifname=vnet0.0,script=/opt/tools/qemu-ifup
创建第二台名为centos5-2的kvm虚拟机:
qemu-kvm -name “centos5-2” -smp 1 -m 512 -drive file=/images/kvm/centos5_2.img,if=virtio,media=disk,cache=writeback -net nic,model=virtio,macaddr=00:0c:29:86:4e:6a -net tap,ifname=vnet0.1,script=/opt/tools/qemu-ifup
这里我使用了之前安装过的虚拟机镜像文件,跳过安装过程,可以直接进入系统,安装过程可参照之前的文章。


4、到宿主机上查看虚拟机的网卡后半段

待两台虚拟机都启动后,我们在宿主机中可以看到有2章虚拟网卡vnet0.0和vnet0.1,这就是两台虚拟机网卡的后半段。

[root@kvm-node1 ~]# ifconfig
…
vnet0.0 Link encap:Ethernet HWaddr D2:65:97:7B:15:00
inet6 addr: fe80::d065:97ff:fe7b:1500/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:24 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:500
RX bytes:4993 (4.8 KiB) TX bytes:468 (468.0 b)

vnet0.1 Link encap:Ethernet HWaddr 82:94:C0:92:18:34
inet6 addr: fe80::8094:c0ff:fe92:1834/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:25 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:500
RX bytes:5329 (5.2 KiB) TX bytes:468 (468.0 b)

查看虚拟网桥信息:

两个虚拟机的eth0已经手动配好了IP地址,我们尝试在每台虚拟机上ping对方的IP地址

两台虚拟机可以互相通信了,那么虚拟机和宿主机之间呢?

虚拟机无法ping通宿主机

宿主机也无法ping通虚拟机。

这就是隔离模型,虚拟机之间可以互相通信,宿主机和虚拟机之间的网络是隔离开的。

二、路由模型

在隔离模型的基础上,将宿主机的一块虚拟网卡virnet0加入到虚拟网桥中,这样virnet0就可以和虚拟机通信,通过将虚拟机的默认网关设置为virnet0的IP地址,然后在宿主机中打开IP地址转发,使得虚拟机可以访问宿主机。不过此时虚拟机仅仅可以将报文发送到外部网络,因为外部网络没有路由到虚拟机中,所以外部网络无法将报文回传给虚拟机。

实现方式:

1、在宿主机上创建一个虚拟网卡

[root@kvm-node1 ~]# yum -y install tunctl
[root@kvm-node1 ~]# tunctl -b
tap0
[root@kvm-node1 ~]# ifconfig tap0
tap0 Link encap:Ethernet HWaddr 12:37:6E:87:3C:A8
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:500
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)

2、将tap0网卡加入到虚拟网桥br0中

[root@kvm-node1 ~]# ifconfig tap0 192.168.220.100 up
[root@kvm-node1 ~]# brctl addif br0 tap0
[root@kvm-node1 ~]# ifconfig tap0 0.0.0.0
[root@kvm-node1 ~]# ifconfig br0 192.168.220.100 netmask 255.255.255.0 up

3、进入虚拟机并将虚拟机的默认网关设置为tap0的IP地址

4、打开宿主机的ip转发功能

[root@kvm-node1 ~]# sed -i ‘/ip_forward/s/0/1/’ /etc/sysctl.conf
[root@kvm-node1 ~]# sysctl -p


5、尝试在虚拟机中ping宿主机的IP地址

可以ping通宿主机的IP地址

6、尝试ping宿主机的网关的ip地址

无法ping通宿主机的网关的IP地址
之所以无法ping通,是因为报文发到网关后,网关找不到回包的路由,所以报文无法回复,这时候,我们通过在宿主机上添加一条iptables规则,使得网关可以回包。
iptables -t nat -A POSTROUTING -s 192.168.220.0/24 -j MASQUERADE

此时,我们再次尝试在虚拟机上ping宿主机网关地址

已经可以ping通宿主机的网关了


7、在宿主机外的主机上ping虚拟机的地址


比如,我在运行VMware的主机上,当然宿主机的网关也在该主机上(熟悉VMware的应该了解),此时我的windows主机的IP地址有192.168.49.1和172.28.88.1,我尝试在windows主机上去ping虚拟机的地址。

此时,外部主机(windows主机)也无法ping通虚拟机,那么为了能ping通,我们还需要添加一条路由,
route add 192.168.220.0 mask 255.255.255.0 192.168.49.10

添加该路由后,外部主机已经可以和虚拟机通信了。

通过上述实践,也可以发现路由模型的缺陷,虽然虚拟机能同宿主机通信,也能将数据包发到外部网络,但是外部网络无法回传数据包,要想外部网络能与虚拟机通信,就要添加对应的路由规则。这对于大规模的虚拟环境,显然是不切实际的。

三、NAT模型

NAT模型其实就是SNAT的实现,路由中虚拟机能将报文发送给外部主机,但是外部主机因找不到通往虚拟机的路由因而无法回应请求。但是外部主机能同宿主机通信,所以在宿主机上添加一个NAT转发,从而在外部主机请求虚拟机时,将虚拟机的IP地址转换为宿主机上的某个地址,从而实现外部网络与虚拟机的通信,其实际上只是通过iptables的nat表的POSTROUTING链实现地址转换罢了。

实现方法:


1、编写虚拟机启动脚本

使用shell脚本方法:./opt/tools/qemu-natup.sh 物理网卡名称

[root@kvm-node1 ~]# cat /opt/tools/qemu-natup.sh
#!/bin/bash

bridge=br0
net="192.168.122.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
    sysctl -p
}

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

2、编写虚拟机停止脚本
 

[root@kvm-node1 ~]# cat /opt/tools/qemu-natdown
#!/bin/bash

bridge=br0
net="192.168.122.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

3、启动虚拟机

qemu-kvm --name “centos5-nat” -smp 1 -m 512 -cpu host --drive file=/images/kvm/centos5.img,if=virtio,media=disk,cache=writeback -net nic,model=virtio,macaddr=00:0c:29:86:4e:1a -net tap,ifname=vnet0.0,script=/opt/tools/qemu-natup,downscript=/opt/tools/qemu-natdown -daemonize


4、进入虚拟机,配置网络

5、给虚拟机添加默认网关,将br0的IP地址设置为虚拟机的默认网关

可以看到,添加了默认网关之后,虚拟机已经可以ping通宿主机了。另外,因为宿主机上添加了iptables规则,所以此时也可以ping通外部网络(192.168.49.1)了,NAT模型的实现完成。

四、桥接模型

在宿主机中创建一个桥设备,把宿主机的eth0放在桥上,这样Guest1上的eth0将报文发给vnet0,再直接发给宿主机上的eth0,将源地址改为宿主机上的eth0的地址。
当响应报文到达物理机上的eth0时如何判断此响应报文是发给虚拟机的还是物理机自己的?
物理机会先创建一个虚拟网卡,在物理机上打开混杂模式(无论mac地址是不是自己的都将接收响应报文),如果mac地址是自己的则转发给虚拟网卡,如果不是自己的则转发给vnet0,这就是桥接模型,因为物理机的网卡具有桥的功能所以叫做桥接模型。

实现方式:

1、创建虚拟网桥启动脚本

[root@kvm-node1 tools]# cat qemu-brup
#!/bin/bash

bridge=br0
device=eth1
device_ip=`ifconfig eth1|awk '/inet addr/ {print $2}' |cut -d: -f2`

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

initbr(){
    brctl addbr $bridge
    ip link set $bridge up
    brctl addif $bridge $device
    ifconfig $device 0.0.0.0
    ifconfig $bridge ${device_ip} netmask 255.255.255.0 up
}

setup_nat(){
    checkbr $bridge
    if [ $? -eq 1 ];then
        initbr
    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

2、创建虚拟网桥停止脚本

[root@kvm-node1 tools]# cat qemu-brdown
#!/bin/bash

bridge=br0
device=eth1

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
    ifconfig $bridge 0.0.0.0
    brctl delif $bridge $device
    isalone_bridge
    exit 0
else
    echo "Error: no interface specified."
    exit 1
fi

3、使用qemu-kvm创建虚拟机
 

qemu-kvm --name “centos5-bridge” -smp 1 -m 512 --drive file=/images/kvm/centos5.img,if=virtio,media=disk,cache=writeback -net nic,model=virtio,macaddr=00:0c:29:86:4e:6a -net tap,ifname=vnet0.0,script=/opt/tools/qemu-brup,downscript=/opt/tools/qemu-brdown --daemonize

4、登录虚拟机,检查虚拟机网络

虚拟机的ip段和宿主机上的eth1在一个网段(因为使用宿主机的eth0的IP地址进行ssh,所以这里使用eth1进行桥接)

5、在虚拟机上ping宿主机测试

虚拟机可以ping通宿主机的IP地址(eth1的IP地址),也可以ping通外部网络(eth1的网关地址)
至此,桥接模型实现完成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/954229.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3D数字孪生技术应用到河道治理的整体方案

无论是城市还是农村的污水处理厂,在建设完毕并稳定运行以后,日常的巡检是最重要的现场管理环节。污水处理由于其自身工艺的特点,污水处理设备众多 ,进水水质变化大,处理流程长,这期间需要经常对设备的运行情…

java安全问题处理

一、客户端的计算不可信 1、服务端计算价格,如果不这么做的话,很可能会被黑客利用,商品总价被恶意修改为比较低的价格。 二、客户端提交的参数需要校验 1、误以为客户端的数据来源是服务端,客户端就不可能提交异常数据 2、对参数进…

『PyQt5-Qt Designer篇』| 08 Qt Designer中容器布局和绝对布局的使用

08 Qt Designer中容器布局和绝对布局的使用 1 容器布局1.1 设计容器布局1.2 保存文件并执行2 绝对布局2.1 设计绝对布局2.2 保存文件并执行1 容器布局 1.1 设计容器布局 先拖入一个容器Frame容器,然后拖入几个控件: 把拖入的控件拖入容器中: 选中容器,右键-布局-栅格布局:…

拥抱储能新时代!科士达闪耀EESA第二届中国国际储能展览会

2023年8月30日,EESA第二届中国国际储能展览会在苏州国际博览中心拉开帷幕,科士达以“零碳光储数能未来”为主题,亮相G3-20展台,多维度展现户用光储、工商业储能、大型储能等解决方案,彰显安全、高效、可靠的产品性能和…

Spring源码分析(八)CreateBean与DoCreateBean

写目录 一 CreateBean二 doCreateBean2.1 BeanWrapper2.2 缓存删除2.3 实例化Bean2.3.1 Supplier创建对象2.3.2 工厂创建对象2.3.3 构造器创建实例无参构造构造器依赖注入Setter的依赖注入autowireConstructor实例化instantiateBean 方法 2.4 Bean的前置处理 官网:H…

四川玖璨电子商务有限公司:如何给短视频做运营

短视频已经成为了人们日常生活中的娱乐方式之一。随着短视频平台的兴起,越来越多的人开始尝试在短视频上进行运营,而给短视频配上适合的音乐则是其中一项重要的工作。在本文中,我们将探讨如何给短视频做运营,特别是如何给短视频配…

Leecode76: 最小覆盖子串

这道题我的第一反应就是设置一个滑动窗口,因为之前遇到过类似的题目。 首先复习一下ACSII码的知识,ASCII码总共有128个,先是数字,然后是大写字符,最后才是小写字符。所以设置一个128大小的数组就可以解决这个问题。 le…

4年外包终上岸,我只能说这类公司能不去就不去...

我大学学的是计算机专业,毕业的时候,对于找工作比较迷茫,也不知道当时怎么想的,一头就扎进了一家外包公司,一干就是4年。现在终于跳槽到了互联网公司了,我想说的是,但凡有点机会,千万…

Room的基本使用

参考:jetpack之Room数据库 目录 引言一、基本使用1. 导入相关引用2. 建表Entity3. 数据库操作类Dao4. 数据库RoomDatabase5. 简单使用 二、ViewModel LiveData Room 的结合开发1. 建表Entity2. 数据库操作类Dao3. 数据库RoomDatabase4. 仓库Repository5. ViewMode…

什么时候用增量式PID,什么时候用位置式PID

PID控制器原理: 增量式PID: 位置式PID: 什么时候用位置式PID,什么时候用增量式PID: 在设计PID控制器时,应该考虑下什么时候用增量式,什么时候用位置式。需要看控制器输出u与控制目标之间的关系…

大数据(六):Pandas的基础应用详解(三)

专栏介绍 结合自身经验和内部资料总结的Python教程,每天3-5章,最短1个月就能全方位的完成Python的学习并进行实战开发,学完了定能成为大佬!加油吧!卷起来! 全部文章请访问专栏:《Python全栈教…

Qt应用开发(基础篇)——进度对话框 QProgressDialog

一、前言 QProgressDialog类继承于QDialog,是Qt设计用来反馈进度的对话框。 对话框QDialog QProgressDialog提供了一个进度条,表示当前程序的某操作的执行进度,让用户知道操作依旧在激活状态,配合按钮,用户就可以随时终…

探索FedLCM——解锁FATE部署管理的实用功能

FedLCM (Federation Lifecycle Manager,联邦生命周期管理器)是 VMware 在 2022 年贡献到 FATE 社区的开源项目,通过 FedLCM 的部署管理服务和任务管理服务,我们可以用图形化的方式完成包括 FATE 集群的云原生部署、联邦…

Acwing791. 高精度加法

Acwing791. 高精度加法 题目描述代码展示 题目描述 代码展示 #include <iostream> #include <vector>using namespace std;vector<int> add(vector<int> &A, vector<int> &B) {if (A.size() < B.size()) return add(B, A);vector<…

扎根嵌入式行业需要什么学历文凭?

在嵌入式行业&#xff0c;学历并不是唯一关键。我本人拥有电子工程学士学位&#xff0c;但嵌入式行业更看重实际技能和经验。视频后方有免费的嵌入式学习资料&#xff0c;入门和进阶内容都涵盖其中。嵌入式行业一般接纳各种学历&#xff0c;从专科到本科到研究生&#xff0c;甚…

C++——vector:resize与reserve的区别,验证写入4GB大数据时相比原生操作的效率提升

resize和reserve的区别 reserve&#xff1a;预留空间&#xff0c;但不实例化元素对象。所以在没有添加新的对象之前&#xff0c;不能引用容器内的元素。而要通过调用push_back或者insert。 resize&#xff1a;改变容器元素的数量&#xff0c;且会实例化对象&#xff08;指定或…

用Python轻松实现Word文档到PDF的批量转换

Word文件&#xff08;Doc、Docx&#xff09;和PDF文件都是使用广泛的文档格式。其中&#xff0c;Word文档格式在编辑内容时优势明显&#xff0c;能够满足各种编辑需求。但想要保证文档的完整和格式的一致&#xff0c;以及使文档有良好的跨平台兼容性&#xff0c;PDF格式则是更好…

点对点传输技术可实现更大的文件传输

互联网的早期主要是基于点对点的系统。这是一个由学者和研究人员构成的网络&#xff0c;连接到这个网络的计算机都是同等的&#xff0c;因为每台计算机都提供了尽可能多的信息。在点对点连接的初期&#xff0c;不需要考虑快速传输大型文件。 随着互联网的发展&#xff0c;客户端…

strlen是碰到第一个字符串结束符‘\0‘就结束,所以长度不包括‘\0‘。定义数组时会默认在字符串后面添加一个‘\0‘

1 字符串数组 定义字符串数组的时候&#xff0c;会默认在字符串后面添加一个’\0’ 2 strlen 在碰到第一个字符串结束符’\0’的时候就结束计算&#xff0c;所以strlen的长度不包括’\0’。 3 实例 #include <stdio.h> #include <string.h>int main(void) {in…

Windows下将nginx等可执行文件添加为服务

Windows下将nginx等可执行文件添加为服务 为什么将可执行文件添加为服务&#xff1f;将可执行文件添加为服务的步骤步骤 1&#xff1a;下载和安装 Nginx步骤 2&#xff1a;添加为服务方法一&#xff1a;使用 Windows 自带的 sc 命令方法二&#xff1a;使用 NSSM&#xff08;Non…