kvm原理【1】:网络模型


VMware Workstation(环境)

设备配置
VMware宿主机192.168.100.106
VMnet810.0.0.2
Gateway(nat)10.0.0.1
KVM宿主机10.0.0.51

KVM(环境)

设备配置
tap010.0.1.1
kvm-00110.0.1.101
kvm-00210.0.1.102

一、隔离模型


kvm详解【1】:网络模型
Guest1和Guest2都是在宿主机上创建的虚拟机,虚拟机的网卡分为前半段和后半段,前半段位于虚拟机上,后半段在宿主机上。实际上,在Guest1上所有发往eth0的数据就是直接发往vnet0,是由vnet0进行数据的传送处理。

在隔离模式下,宿主机创建一个虚拟交换机vSwitch,然后把vnet0和vnet1接入到该虚拟交换机,交换机也可以叫做bridge,因为vnet0和vnet1在一个网桥内,所以可以互相通信。

1.1、临时生效:

1、创建虚拟网桥br0

[root@kvm-node1 ~]# brctl addbr br0
[root@kvm-node1 ~]# ifconfig br0 up

2、桥接虚拟机网卡到网桥上

[root@localhost opt]# brctl addif br0 vnet0
[root@localhost opt]# brctl addif br0 vnet1

3、两台虚拟机配置为同网段,就可以互相通信了;但无法ping通宿主机;宿主机也无法ping通虚拟机。

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

1.2、永久生效

1、创建虚拟网桥br0

[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0
TYPE=Bridge
BOOTPROTO=static
IPADDR=0.0.0.0
ONBOOT=yes

2、桥接虚拟机网卡到网桥上

[root@localhost ~]# virsh edit <虚拟机名称>
    <interface type='bridge'>
      <mac address='52:54:00:74:63:c3'/>
      <source bridge='br0'/>
      <model type='virtio'/>

二、路由模型


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

2.1、临时生效

1、安装所需软件包

[root@localhost opt]# vim /etc/yum.repos.d/nux-misc.repo
[nux-misc]
name=Nux Misc
baseurl=http://li.nux.ro/download/nux/misc/el7/x86_64/
enabled=0
gpgcheck=1
gpgkey=http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
[root@localhost opt]# yum -y --enablerepo=nux-misc install tunctl

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

[root@kvm-node1 ~]# tunctl -b
tap0

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

[root@kvm-node1 ~]# brctl addif br0 tap0
[root@kvm-node1 ~]# ifconfig tap0 10.0.1.1 up
[root@kvm-node1 ~]# ifconfig br0 10.0.1.1 netmask 255.255.255.0 up
[root@localhost qemu]# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.0263d5085d14       no              tap0
                                                        vnet0
                                                        vnet1
virbr0          8000.525400de867a       yes             virbr0-nic

4、进入虚拟机并将虚拟机的默认网关设置为tap0的IP地址后,虚拟机可与宿主机互相通信,但无法沟通宿主机网关;

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

[root@kvm-node1 ~]# echo "1" > /proc/sys/net/ipv4/ip_forward

6、此时报文可转发至宿主机网关,但是网关找不到回包的路由,需要在宿主机添加一条iptables规则

[root@localhost qemu]# iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -j MASQUERADE

虚拟机与宿主机已经可以互通了!!!

7、在宿主机外的主机上ping虚拟机的地址
比如,我在运行VMware的主机上,当然宿主机的网关也在该主机上,此时我的windows主机的IP地址有192.168.100.106和10.0.0.2,我尝试在windows主机上去ping虚拟机的地址。

此时,外部主机(windows主机)也无法ping通虚拟机,那么为了能ping通,我们还需要添加一条路由,
在这里插入图片描述

{注意:在 windows 下添加路由}

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

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

2.1、永久生效

1、安装所需软件包

[root@localhost opt]# vim /etc/yum.repos.d/nux-misc.repo
[nux-misc]
name=Nux Misc
baseurl=http://li.nux.ro/download/nux/misc/el7/x86_64/
enabled=0
gpgcheck=1
gpgkey=http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
[root@localhost opt]# yum -y --enablerepo=nux-misc install tunctl

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

1)创建启动服务脚本
[root@hunterfu ~]# vim /etc/init.d/config_tap 	#作为系统服务随系统自动启动创建虚拟网卡
#!/bin/bash
#
# config_tap          Start up the tun/tap virtual nic
#
# chkconfig: 2345 55 25

USER="root"
TAP_NETWORK="10.0.1.1"		# 设置虚拟网卡tap0的IP(根据具体需求修改)
TAP_DEV_NUM=0
DESC="TAP config"

do_start() {
if [ ! -x /usr/sbin/tunctl ]; then
  echo "/usr/sbin/tunctl was NOT found!"
  exit 1
fi
tunctl -t tap$TAP_DEV_NUM -u root
ifconfig tap$TAP_DEV_NUM ${TAP_NETWORK}  netmask 255.255.255.0 promisc
ifconfig tap$TAP_DEV_NUM
brctl addif br0 tap0	# 将tap0网卡加入到虚拟网桥br0中(根据具体需求修改)

}

do_stop() {
ifconfig tap$TAP_DEV_NUM down 
}
do_restart() {
do_stop
do_start
}
check_status() {
ifconfig tap$TAP_DEV_NUM 
}

case $1 in 
start)    do_start;;
stop)     do_stop;;
restart)  do_restart;;
status)
		  echo "Status of $DESC: "
		  check_status
		  exit "$?"
		  ;;
*)
echo "Usage: $0 {start|stop|restart|status}"
exit 1 
esac
2)加入到系统服务中
[root@hunterfu ~]# chkconfig --add config_tap
3)设置开机自启动
[root@hunterfu ~]# chkconfig --level 345 config_tap on		

操作完成后,就可以像其他标准服务一样,通过 service config_tap start 来进行创建和启动操作

3、将tap0网卡加入到虚拟网桥br0中 (已写入上述脚本中)
4、进入虚拟机并将虚拟机的默认网关设置为tap0的IP地址后,虚拟机可与宿主机互相通信,但无法沟通宿主机网关;
5、打开宿主机的ip转发功能

[root@localhost ~]# vim /etc/sysctl.conf 
net.ipv4.ip_forward = 1
[root@kvm-node1 ~]# sysctl -p	# 加载一下

6、此时报文可转发至宿主机网关,但是网关找不到回包的路由,需要在宿主机添加一条iptables规则

[root@localhost qemu]# iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -j MASQUERADE

虚拟机与宿主机已经可以互通了!!!

7、在宿主机外的主机上ping虚拟机的地址
比如,我在运行VMware的主机上,当然宿主机的网关也在该主机上,此时我的windows主机的IP地址有192.168.100.106和10.0.0.2,我尝试在windows主机上去ping虚拟机的地址。

此时,外部主机(windows主机)也无法ping通虚拟机,那么为了能ping通,我们还需要添加一条路由,
在这里插入图片描述

{注意:在 windows 下添加路由}

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

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

三、NAT模型


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

3.1、临时生效

step1:虚拟网卡桥接到网桥上

[root@localhost opt]# brctl addif br0 tap0
[root@localhost opt]# brctl addif br0 vnet0
[root@localhost opt]# brctl addif br0 vnet1

step2:给虚拟网桥配置IP

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

此时虚拟机可与宿主机通信,但无法连接到宿主机网关;

step3:配置转发

[root@kvm-node1 ~]# echo "1" > /proc/sys/net/ipv4/ip_forward

step4:配置SNAT

[root@localhost ~]# iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -d 0.0.0.0/0 -j MASQUERADE	# 虚拟机通往外部;

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

由于宿主机上添加了iptables规则,虚拟机也可以ping通外部网络(192.168.49.1)了,NAT模型的实现完成。

3.2、永久生效

step1:虚拟网卡桥接到网桥上

[root@localhost ~]# virsh edit <虚拟机名称>
    <interface type='bridge'>
      <mac address='52:54:00:74:63:c3'/>
      <source bridge='br0'/>
      <model type='virtio'/>

step2:给虚拟网桥配置IP
1)在tap0启动服务中设置IP为0.0.0.0

[root@hunterfu ~]# vim /etc/init.d/config_tap
... ...
TAP_NETWORK="0.0.0.0"	
... ...

2)在br0配置文件中设置IP为10.0.1.1

[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-br0 
DEVICE=br0
TYPE=Bridge
BOOTPROTO=static
ONBOOT=yes

IPADDR=10.0.1.1
NETMASK=255.255.255.0

此时虚拟机可与宿主机通信,但无法连接到宿主机网关;

step3:配置转发

[root@localhost ~]# vim /etc/sysctl.conf 
net.ipv4.ip_forward = 1
[root@kvm-node1 ~]# sysctl -p	# 加载一下

step4:配置SNAT

[root@localhost ~]# iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -d 0.0.0.0/0 -j MASQUERADE	# 虚拟机通往外部;
[root@localhost ~]# iptables-save > /etc/sysconfig/iptables		# 保存一下iptables策略

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

由于宿主机上添加了iptables规则,虚拟机也可以ping通外部网络(192.168.100.106)了,NAT模型的实现完成。

四、桥接模型


kvm详解【1】:网络模型
物理机的网卡具有桥的功能所以叫做桥接模型。

4.1、临时生效

step1:创建网桥

[root@localhost ~]# brctl addbr br1
[root@localhost ~]# ifconfig br1 up

step2:桥接物理网卡和虚拟网卡到网桥上

[root@localhost ~]# brctl addif br1 vnet0
[root@localhost ~]# brctl addif br1 ens33

step3:配置网络

[root@localhost ~]# ifconfig ens33 0.0.0.0
[root@localhost ~]# ifconfig br1 10.0.0.51 netmask 255.255.255.0 up

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

4.2、永久生效

step1:创建网桥

[root@localhost ~]# brctl addbr br1
[root@localhost ~]# ifconfig br1 up
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-br1
DEVICE=br1
TYPE=Bridge
BOOTPROTO=static
ONBOOT=yes

IPADDR=10.0.0.51
NETMASK=255.255.255.0
GATEWAY=10.0.0.1
DNS1=114.114.114.114
DNS2=8.8.8.8

step2:桥接物理网卡和虚拟网卡到网桥上

[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
BOOTRPOTO=none	# 修改
BRIDGE=br1		# 追加
[root@localhost ~]# virsh edit <虚拟机名称>

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值