KVM网络模型补充
Posted 活跃的Jerry
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了KVM网络模型补充相关的知识,希望对你有一定的参考价值。
隔离模型
虚拟机网卡被分成前半段和后半段,彼此之间存在对应关系。前半段在虚拟机上通常表现为eth0、eth1等接口,后半段是物理主机上是一个虚拟接口,通常表现为vnet0、vnet1,与网桥关联(vnet0、vnet1通常称为tap设备)。任何时候guest1发往eth0的报文都发往vnet0,guest2发往eth0的报文都发往vnet1,vnet0和vnet1是网桥(虚拟交换机)上的接口,guest1和guest2通信则通过网桥才能进行通信,实现二层通信。(即相当于guest1和guest2连接至同一个网桥上)
网桥上没有关联物理网卡,所有隔离模型无法与外部网络进行通信也无法与主机自身通信。隔离模型类似于vmware中的VMnet2、VMnet3等虚拟通道。
仅主机模式
路由模型
NAT模型
桥接模型
测试环境
添加一个网桥
依赖的软件包是bridge-utils
依赖的模块:即在内核级别软件模拟一个软交换机,即使用bridge-utils向内核发指令,由内核创建网桥设备,网桥是在内核中实现的。
#brctl -h 查看帮助信息
#brctl addbr br0 添加网桥设备,命名为br0
#brctl stp br0 off 关闭stp
#ifconfig -a
表现为一个网络接口,使用ifconfig无法查看,原因是br0未激活。
#brctl show 查看当前主机上的所有桥设备
#ip link set dev br0 up 激活接口
注意:以上添加网桥的方式,重启后就消失了。要想永久生效,需要自定义脚本,创建kvm虚拟机时同时指定脚本路径。
/etc/qemu-ifup
/etc/qemu-ifdown
#chmod +x /etc/qemu-ifup
#chmod +x /etc/qemu-ifdown
设置隔离模型
#brctl addbr br0
#ip link set dev br0 up 激活网桥
添加第一台虚拟机至网桥
#qemu-kvm -m 128 -cpu host -smp 2 -name "test1" -drive file=/image/cirros-no_cloud-0.3.0-x86_64-disk.img,if=virtio,media=disk,format=qcow2,cache=writeba
ck -nographic -net nic -net tap,ifname=vif0.0,script=/etc/qemu-ifup
添加第二台虚拟机至同一网桥
#qemu-kvm -m 128 -cpu host -smp 2 -name "test2" -drive file=/image/cirros-no_cloud-0.3.0-x86_64-disk.img,if=virtio,media=disk,format=qcow2,cache=writeba
ck -nographic -net nic,macaddr=52:54:00:12:34:57 -net tap,ifname=vif1.0,script=/etc/qemu-ifup
#ifconfig 在物理机上查看创建的tap设备(即后半段)
#brctl show 查看网桥关联的tap设备
虚拟机1:
#ifconfig eth0 10.0.100.1/24
虚拟机2:
ifconfig eth0 10.0.100.2/24d
设置路由模型
在上述隔离模式的基础上执行以下操作。
在物理机上添加一块虚拟网卡(前半段和后半段):
#ip link add veth1.0 type veth peer veth1.1
#ifconfig -a 查看生成的虚拟网卡
激活网卡:
#ip link set veth0 up
#ip link set veth0.1 up
将veth1:0(后半段)关联至网桥:
#brctl addif br0 veth1.0
查看网桥上关联的接口:
#brctl show
#ifconfig veth0 10.0.100.3/24
此时虚拟机1和虚拟机2能够与veth0虚拟接口进行通信,要实现虚拟机能够与物理机物理网卡通信,要在虚拟机上指定网关(网关为veth0):
虚拟机1:
#route add default gw 10.0.100.3
虚拟机2:
#route add default gw 10.0.100.3
此时虚拟机能够与网络主机通信,要实现虚拟机与外部网络通信,主机要开启核心转发功能:
#echo 1 > /proc/sys/net/ipv4/ip_forward
存在的问题是:无法收到回包,可以通过在外部网络中添加路由实现(这种方式不太现实),也可以通过NAT模式实现(这种方式比较理想)。
设置NAT模型
添加iptables规则:
#iptables -t nat -A POSTROUTING -s 10.0.100.0/24 -o eth3 -j SNAT --to-source 192.168.1.230
#iptables -t nat -L -n
#tcpdump -i veth0 -nn icmp 抓包查看ping过程
测试发现虚拟机无法ping通外部网络,导致的原因是通信链太长,如下图:
删除虚拟网卡:
#ip link delete veth1.0 type veth
#ifconfig br0 10.0.100.3
#tcpdump -i br0 -nn icmp
#tcpdump -i eth3 -nn icmp
设置桥接模型
#ip addr del 10.0.100.3/24 dev br0
#ip addr del 192.168.1.230 dev eth3; brctl addif br0 eth3; ip addr add 192.168.1.230 dev br0;
#brctl show 网桥上关联了一张物理网卡和两个虚拟机网卡的后半段即虚拟网卡的后半段直接关联至物理网卡
虚拟机1:
#ifconfig eth0 192.168.1.67/24
虚拟机2:
#ifconfig eth0 192.168.1.68/24
测试:虚拟机可以直接ping通外部网络
虚拟机1:
#ping 192.168.1.230 通
#ping 192.168.1.25 通
以上是关于KVM网络模型补充的主要内容,如果未能解决你的问题,请参考以下文章
linux中的虚拟化网络模型及使用qemu-kvm创建隔离模型
matlab bp神经网络 预测模型 代码(详见补充),非常感谢!