概述
在传统的网络环境中,一台物理主机包含一张或多张网卡,要实现与其它物理主机之间的通信,需要将自身的网卡通过路由器或者交换机连接到外部的物理网络中。随着虚拟化技术的发展,一台物理主机上会部署多个虚拟机或者容器应用,每个虚拟机都需要与物理机,以及主机或者跨主机上的其它虚拟机进行通信,为了实现与传统物理网络等同的虚拟网络结构,各类虚拟网络设备被加入,其中最为核心的两种网络设备就是NIC网卡与交换机设备。
Tap/tun设备
Tap/tun是Linux内核实现的虚拟网络设备,其中tap工作在二层,只能处理二层报文;tun工作在三层,支持配置IP地址,处理三层报文信息。tun/tap网络设备与物理网卡的使用方式相同,支持通过套接字收发网络数据,二者的主要区别在于:物理网卡连接的是真正的物理链路;而tun/tap网卡连接的是软件实现的虚拟链路。
tun/tap的工作机制
tun/tap驱动程序除了虚拟网卡的驱动外,还包括一个字符设备驱动,内核通过字符设备与用户空间应用传递网络数据,这里字符设备可以理解成实现了一条虚拟链路,操作字符设备的应用可以理解成另外一台计算机;同时,利用网卡驱动接收并发送来自TCP/IP协议栈的网络数据,或者发过来将收到的网络数据传送给协议栈处理。
创建tun/tap网络设备时,Linux内核会在设备文件目录下生成一个与之对应的字符设备,应用通过读写这个字符设备,可以实现在链路上传输数据。
- 数据发送:当对字符设备执行写操作时,相当于tun/tap网络设备接收到了数据,后续数据提交到协议栈当成普通的网络报文进行处理,这个过程类似于物理网卡接收到链路上的数据;
- 数据接收:当对字符设备执行读操作时,相当于向内核查询tun/tap设备上是否有数据需要被发送,有的话则通过字符设备传输到用户空间,从而完成tun/tap设备发送数据的功能。
Bridge网桥
当一台物理机上部署了多台虚拟机,这些虚拟机也需要相互之间进行数据交换,与主机需要接入到物理交换机才能与其它主机进行通信一样,Linux提供了虚拟交换机Bridge,实现各个虚拟机的通信连接。
Bridge的工作机制
Linux Bridge是工作在二层中的虚拟网络设备,功能类似于物理的交换机。Bridge可以绑定其它Linux网络设备作为从设备,并将这些设备虚拟化为端口进行使用。Bridge接收端口的数据报文,查找转发表,然后按照转发表规则将报文进行广播、转发或者直接丢弃,整个转发的逻辑与物理交换机相似。
传统的Linux网络虚拟化技术采用的是Tap+Bridge
的方式,将虚拟机连接到Tap虚拟网卡,然后将Tap网卡绑定到Linux Bridge,网络拓扑如下图:
当一个网络设备绑定到Bridge上时,该设备的IP地址会变得无效,如同物理交换机上的一个端口,Linux不会再使用这个设备在三层接收数据。通过这个网络设备接收的数据流量会被Bridge劫持,并通过Bridge的转发规则转发到其它端口;当Bridge需要通过某个端口发送数据时,最终会经由端口绑定的从设备来完成实际的发送。
Bridge IP
因为Bridge工作在二层,因此绑定到Bridge的从设备均不需要再配置IP地址,但Bridge本身支持设置IP地址,毕竟物理网卡的IP失效,总需要有一个设备配置IP以与外界通信。当Bridge配置了自己的IP之后,Bridge可以直接加入路由表,并通过它来发送数据,而实际的数据的发送过程则是由某个设备来完成的。
相关参考
- 《Linux开源网络全栈详解:从DPDK到OpenFlow》
- Linux Tun/Tap 介绍
- 云原生虚拟化:一文读懂网络虚拟化之 tun/tap 网络设备