qemu虚拟机网桥通讯过程
虚拟机网络一般有三种模式如下,目前主要用的就是Bridge模式,所以这里主要是看看网桥的通讯过程。
Host-Only:
这种模式下,VM只能与Host之间进行网络通讯,与网段内其它的机器处于隔离的状态
Nat:
显然这种模式下,虚拟机要与网段内其它的机器或者外网的机器通讯时,必须要走nat
Bridge:
这种模式下,虚拟机相当于网段内一台独立的主机了,是目前应用最广泛的模式
一.网桥
简单来说,网桥就是把若干个网络接口连接起来,一个接口收到的数据会复制到其它接口,使得接口之间的数据能够转发,与交换机相似
与交换机的不同的是:
1.当一个设备加入到网桥后,原设备的IP会变得无效,Linux不再使用该设备的IP,而是使用网桥的IP来进行数据转发,并且此设备接收类型的数据会好不犹豫的转发到网桥上。
这就解释了为什么当我们将设备加入到网桥后,原来的网络就会中断,在正常配置好网桥的ip后,网络又恢复了
2.网桥的Mac地址是加入的网卡的Mac地址最小的那个Mac,如果手动设定,则必须设定的Mac地址与其加入的网卡的Mac地址相匹配
二.网桥的设定
设定网桥一般用两种command,即brctl或者iproute2
brctl:
brctl addbr br0 #创建一个网桥br0
brctl delbr br0 #删除网桥br0
brctl addif br0 eth0 #把eth0 加入到网桥
brctl addif br0 tap0 #把tap0 加入到网桥
brctl delif br0 eth0 #把eth0 从网桥中删除
brctl show #查看网桥信息
iproute2:
ip link add name br0 type bridge #新建一个网桥br0
ip link set br0 up #开启br0
ip link del dev br0 #删除br0
ip link add set dev eth0 master br0 #添加eth0 到br0
ip link add set dev tap0 master br0 #添加tap0 到br0
三. Tun/Tap网卡
在我们创建完虚拟机后,一般在host里会多了张tap网卡,那这个网卡是有什么作用呢?
普通的网卡工作模式:
普通的网卡一端连接物理链路,一端连接内核协议栈。当数据通过物理链路进来后,到达内核协议栈做进一步的处理,对于一些错误的数据包,协议栈可以选择丢弃;对于不属于本机的数据包,协议栈可以选择转发;对于属于本机的数据,协议栈就会通过Socket API告知上层正在等待的应用程序。
tun/tap网卡工作模式:
普通的物理网卡是通过物理链路来收发数据,而tun/tap 是通过/dev/net/tun来收发数据,一端连着/dev/net/tun,一端连着协议栈。
tun网卡:工作在三层网络层,能处理IP数据包并支持路由功能。
tap网卡:工作在二层链路层,能处理mac层数据包,支持mac层广播,可以与物理网卡做桥接,主要用在虚拟机通讯。
虚拟机里主要用的是tap类型网卡,下面是tap网卡工作模式:
tap网卡主要是两部分组成,字符设备驱动和虚拟网卡驱动。
字符设备驱动:负责和用户进程打交道,把数据写入/dev/net/tun,然后通知用户进程从/dev/net/tun里面拿数据实现数据交互
虚拟网卡驱动:负责和网络协议栈的数据打交道
tap虚拟网卡command:
ip tuntap add tap0 mode tap #添加一个tap0网卡
ip tuntap del tap0 mode tap #删除一个tap0网卡
qemu-kvm中 vm与Host之间的通讯过程:
1.在创建一个vm并启动时,在host中就会创建一个tap类型的网卡,例如tap0,同时vm作为一个qemu进程,内核为其提供了一个/dev/net/tun设备的文件描述符(fd)14,供其读写。
[root@localhost]$ ps -ef |grep qemu
root 12570 1 3 09:52 ? 00:00:24 qemu-system-x86_64 -name one_socket -daemonize -hdb sdb.img -enable-kvm -cpu host -smp cores=4,sockets=1, -m 16G -drive file=rhel7u4.img -vnc :12 -netdev tap,id=ipvm1,ifname=tap0,script=/etc/qemu-ifup -device e1000,netdev=ipvm1,id=net0,mac=00:00:02:98:AC:61
root 12968 3088 0 10:02 pts/0 00:00:00 grep --color=auto qemu
[root@localhost]$ ls -l /proc/12570/fd/ |grep tun
lrwx------ 1 root root 64 Sep 20 09:53 14 -> /dev/net/tun
[root@localhost]$
2.vm用户进程产生数据,发到vm的虚拟网卡上,实质上vm作为host的一个qemu进程,其产生的数据写入到/dev/net/tun里
3.tap0网卡通过字符设备驱动从/dev/net/tun 里收到数据后,会转发给网桥,网桥再判断是否丢弃,转发或者交给上层的API来处理