码迷,mamicode.com
首页 > 其他好文 > 详细

KVM虚拟化的四种简单网络模型介绍及实现(一)

时间:2018-06-24 16:57:04      阅读:267      评论:0      收藏:0      [点我收藏+]

标签:mtu   dia   opp   bridge   too   sha   9.1   脚本   网络模型   

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

下面分别对四种网络模型进行解读和实现,在之前,首先还是先交待一下环境:
宿主机: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
[root@kvm-node1 ~]# cat /opt/tools/qemu-ifup

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

查看虚拟网桥信息:
技术分享图片

5、登录虚拟机中进行查看
技术分享图片
由于我并没有dhcp服务,所以虚拟机获取不到IP地址,我选择手动配置两个IP地址,
技术分享图片
此时,两个虚拟机的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
技术分享图片
添加该路由后,外部主机已经可以和虚拟机通信了。

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

KVM虚拟化的四种简单网络模型介绍及实现(一)

标签:mtu   dia   opp   bridge   too   sha   9.1   脚本   网络模型   

原文地址:http://blog.51cto.com/jerry12356/2132221

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!