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来处理

 

posted on 2019-09-20 10:52  骑着蜗牛追太阳  阅读(4119)  评论(0编辑  收藏  举报

导航