隔离模型
虚拟机网卡被分成前半段和后半段,彼此之间存在对应关系。前半段在虚拟机上通常表现为eth0、eth1等接口,后半段是物理主机上是一个虚拟接口,通常表现为vnet0、vnet1,与网桥关联(vnet0、vnet1通常称为tap设备)。任何时候guest1发往eth0的报文都发往vnet0,guest2发往eth0的报文都发往vnet1,vnet0和vnet1是网桥(虚拟交换机)上的接口,guest1和guest2通信则通过网桥才能进行通信,实现二层通信。(即相当于guest1和guest2连接至同一个网桥上)
网桥上没有关联物理网卡,所有隔离模型无法与外部网络进行通信也无法与主机自身通信。隔离模型类似于vmware中的VMnet2、VMnet3等虚拟通道。
仅主机模式
隔离模型中在物理机上添加一个虚拟网卡并将该虚拟网卡后半段关联至网桥,只要虚拟机中网卡和该虚拟网卡后半段IP地址设置成同一个网段,guest1和guest2和物理机的虚拟网卡就能够通信了,但是还是无法与物理机之外的网络通信。
路由模型
隔离模型中在物理机上添加一个虚拟网卡并将该虚拟网卡后半段关联至网桥,只要虚拟机中网卡和该虚拟网卡后半段IP地址设置成同一个网段,guest1和guest2和物理机的虚拟网卡就能够通信了,但是还是无法与物理机之外的网络通信。可以将guest的网关指向物理机虚拟网卡的地址,并且在物理机上打开核心转发功能,guest就能够实现与外部网络进行通信。
这样存在一个问题:guest收不到外部网络回应的报文,路由模型需要在外部网络中为guest网段添加回程路由,这样会相当麻烦。即路由模型可以与外部网路进行通信了,但是无法作为通信目标使用。
NAT模型
为了解决路由模型中存在的问题,在物理主机上添加一个nat server,所有来自内部的报文通过物理网卡出去之前都将源地址转化成物理网卡的地址,所有的回应报文也都将回应给物理网卡,物理网卡由nat会话表再将物理网卡的地址转化回内部主机的地址。
桥接模型
桥接即在物理机上创建一个网桥并关联物理网卡至网桥,一旦将网卡设置为网桥可以将物理网卡看成是一台交换机,同时也会在物理机上为该物理网卡创建一个虚拟网卡(br0)并将物理网卡原本使用的MAC地址放至br0(物理网卡的IP地址配置在网桥上),同时物理网卡打开混杂模式(不管报文的目标mac地址是不是自身,该网卡将报文全部接收)。这样所有guest通过eth*发往vnet*的报文直接发往该网桥,而网桥有上关联了物理网卡,从而来自guest的报文直接从物理网卡发出;当网卡收到回应报文时,因为开启了混杂模式会接收所有的报文,报文目标MAC如果是的物理网卡就会将回应报文转交给br0,报文目标MAC如果是虚拟机就会将回应报文转虚拟机对应的网卡。(即物理网卡本身就相当于一个交换机,这种网桥一般称为物理网桥)
测试环境
虚拟机网段:10.0.100.0/24;物理主机ip地址:192.168.1.230(eth3);用于测试的外部网络地址:192.168.1.25。
添加一个网桥
依赖的软件包是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设备
分别为创建的虚拟机网卡设置ip地址,两台虚拟机就可以正常通信:
虚拟机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
为veth0(前半段)配置ip地址:
#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通外部网络,导致的原因是通信链太长,如下图:
在上述的网络模式中,br0作为一个网桥,在主机上显示的是一个虚拟网卡即ifconfig查看是一个虚拟网卡,同时主机又添加了一张虚拟网卡(虚拟网卡的前半段关联至网桥,即在物理机上多了两个虚拟接口)。这样会导致整个通信链过长。由于br0本身就是虚拟网卡,可以直接在br0设置一个ip地址作为虚拟机的网关,完全没有必要在物理机上再生成一张虚拟网卡。
删除虚拟网卡:
#ip link delete veth1.0 type veth
为br0配置IP地址:
#ifconfig br0 10.0.100.3
这时就可以ping通外部网络了。可以通过抓包查看地址转换过程:
#tcpdump -i br0 -nn icmp
#tcpdump -i eth3 -nn icmp
设置桥接模型
在桥接模型下,需要将物理网卡关联至网桥而且网桥上不能配置地址,再上述的环境中实现要先拆除网桥上配置的地址:
#ip addr del 10.0.100.3/24 dev br0
删除物理网卡上的IP地址;将物理网卡添加至br0上;为br0配置地址(原先eth3的地址配置在br0上):
#ip addr del 192.168.1.230 dev eth3; brctl addif br0 eth3; ip addr add 192.168.1.230 dev br0;
#ifconfig 此时的地址在br0上,物理网卡eth3无地址
#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 通
转自:https://www.cnblogs.com/lriwu/p/9248448.html