Linux 中的虚拟网络-简介
引言
随着云计算的兴起,计算机的虚拟化达到了空前的热度,计算机的虚拟化加强了服务器负载的能力,更有效的利用计算机资源。
Linux中的真实网络设备
Linux的网络设备像一个双向的管道,数据从一头进,就会从另一头出,关键要看这两头是什么?真实的网络设备中,如下图的eth0,
一头是网络协议栈,另一头网卡。用户发送数据的时候经过socket api调用,进入Linux 网络协议栈处理,再进入Linux 网络设备,最后进入网卡,
如果是接收数据则反过来。
+-------------------------------------------+
| |
| +-------------------+ |
| | User Application | |
| +-------------------+ |
| | |
|.................|.........................|
| ↓ |
| +----------+ |
| | socket | |
| +----------+ |
| | |
|.................|.........................|
| ↓ |
| +------------------------+ |
| | Newwork Protocol Stack | |
| +------------------------+ |
| | |
|.................|.........................|
| ↓ |
| +----------------+ |
| | eth0 | |
| +----------------+ |
| 192.168.0.11 | |
| | |
| | |
+-----------------|-------------------------+
↓
Physical Network
Linux中虚拟网络设备
TAP 设备、TUN 设备、VETH 设备、Bridge 设备、Bond 设备、VLAN 设备、MACVTAP 设备、
TAP/TUN 设备
TAP/TUN 设备是一种让用户态程序向内核协议栈注入数据的设备,TAP工作在二层,TUN工作在三层,TAP/TUN 的两头分别是内核网络协议栈和用户层,其作用是将协议栈中的部分数据包转发给用户空间的应用程序,给用户空间的程序一个处理数据包的机会。 当一个 TAP 设备被创建时,在 Linux 设备文件目录下将会生成一个对应 char 设备,用户程序可以像打开普通文件一样打开这个文件进行读写。当执行 write()操作时,数据进入 TAP 设备,此时对于 Linux 网络层来说,相当于 TAP 设备收到了一包数据,请求内核接受它,如同普通的物理网卡从外界收到一包数据一样,不同的是其实数据来自 Linux 上的一个用户程序。Linux 收到此数据后将根据网络配置进行后续处理,从而完成了用户程序向 Linux 内核网络层注入数据的功能。当用户程序执行 read()请求时,相当于向内核查询 TAP 设备上是否有需要被发送出去的数据,有的话取出到用户程序里,完成 TAP 设备的发送数据功能。针对 TAP 设备的一个形象的比喻是:使用 TAP 设备的应用程序相当于另外一台计算机,TAP 设备是本机的一个网卡,他们之间相互连接。应用程序通过 read()/write()操作,和本机网络核心进行通讯。
User Application 的数据流:1->2->3->4->5-6->7->8
+----------------------------------------------------------------+
| |
| +--------------------+ +--------------------+ |
| | User Application A | | User Application B |<-----+ |
| +--------------------+ +--------------------+ | |
| | 1 | 5 | |
|...............|......................|...................|.....|
| ↓ ↓ | |
| +----------+ +----------+ | |
| | socket A | | socket B | | |
| +----------+ +----------+ | |
| | 2 | 6 | |
|.................|.................|......................|.....|
| ↓ ↓ | |
| +------------------------+ 4 | |
| | Newwork Protocol Stack | | |
| +------------------------+ | |
| | 7 | 3 | |
|................|...................|.....................|.....|
| ↓ ↓ | |
| +----------------+ +-----------------+ | |
| | eth0 | | tun/tap char dev| | |
| +----------------+ +-----------------+ | |
| 10.32.0.11 | | 192.168.3.11 | |
| | 8 +---------------------+ |
| | |
+----------------|-----------------------------------------------+
↓
Physical Network
VETH 设备
VETH 设备出现较早,它的作用是反转通讯数据的方向,需要发送的数据会被转换成需要收到的数据重新送入内核网络层进行处理,从而间接的完成数据的注入。它的两头分别是内核网络协议栈和另一个VETH 设备。 VETH 设备总是成对出现,送到一端请求发送的数据总是从另一端以请求接受的形式出现。该设备不能被用户程序直接操作,但使用起来比较简单。创建并配置正确后,向其一端输入数据,VETH 会改变数据的方向并将其送入内核网络核心,完成数据的注入。在另一端能读到此数据。
+----------------------------------------------------------------+
| |
| +------------------------------------------------+ |
| | Newwork Protocol Stack | |
| +------------------------------------------------+ |
| ↑ ↑ ↑ |
|..............|...............|...............|.................|
| ↓ ↓ ↓ |
| +----------+ +-----------+ +-----------+ |
| | eth0 | | veth0 | | veth1 | |
| +----------+ +-----------+ +-----------+ |
|192.168.1.11 ↑ ↑ ↑ |
| | +---------------+ |
| | 192.168.2.11 192.168.2.1 |
+--------------|-------------------------------------------------+
↓
Physical Network
Bridge 设备
首先,bridge是一个虚拟网络设备,所以具有网络设备的特征,可以配置IP、MAC地址等;其次,bridge是一个虚拟交换机,和物理交换机有类似的功能。 对于普通的网络设备来说,只有两端,从一端进来的数据会从另一端出去,如物理网卡从外面网络中收到的数据会转发给内核协议栈,而从协议栈过来的数据会转发到外面的物理网络中。 而bridge不同,bridge有多个端口,数据可以从任何端口进来,进来之后从哪个口出去和物理交换机的原理差不多,要看mac地址。
+----------------------------------------------------------------+
| |
| +------------------------------------------------+ |
| | Newwork Protocol Stack | |
| +------------------------------------------------+ |
| ↑ ↑ |
|..............|................................|................|
| ↓ ↓ |
| +----------+ +------------+ |
| | eth0 | | br0 | |
| +----------+ +------------+ |
| 192.168.3.21 ↑ |
| | |
| | |
+--------------|-------------------------------------------------+
↓
Physical Network
这里将之前讲的VETH设备联系起来,其启动两个VETH设备,并将一个连接上Bridge设备,如图所示: 此时eth0和veth1就通过br0虚拟网桥实现了连接。
+----------------------------------------------------------------+
| |
| +------------------------------------------------+ |
| | Newwork Protocol Stack | |
| +------------------------------------------------+ |
| ↑ ↑ ↑ |
|............|............|...........................|..........|
| ↓ ↓ ↓ |
| +------+ +--------+ +-------+ +-------+ |
| | .3.21| | .3.101 | | | | .3.102| |
| +------+ +--------+ +-------+ +-------+ |
| | eth0 | | br0 |<--->| veth0 | | veth1 | |
| +------+ +--------+ +-------+ +-------+ |
| ↑ ↑ ↑ |
| | | | |
| | +------------+ |
| | |
+------------|---------------------------------------------------+
↓
Physical Network
这里为了画图方便,省略了IP地址前面的 192.168,比如.3.21 就表示 192.168.3.21
甚至可以把eth0和br0的IP去掉,当成单纯的交换机,如下图所示:
+----------------------------------------------------------------+
| |
| +------------------------------------------------+ |
| | Newwork Protocol Stack | |
| +------------------------------------------------+ |
| ↑ |
|.....................................................|..........|
| ↓ |
| +------+ +--------+ +-------+ +-------+ |
| | | | | | | | .3.102| |
| +------+ +--------+ +-------+ +-------+ |
| | eth0 |<--->| br0 |<--->| veth0 | | veth1 | |
| +------+ +--------+ +-------+ +-------+ |
| ↑ ↑ ↑ |
| | | | |
| | +------------+ |
| | |
+------------|---------------------------------------------------+
↓
Physical Network
虚拟网桥在host与虚拟机的一种部署,这样就达到和真实交换机一样的效果,虚拟机发出去的数据包先到达br0,然后由br0交给eth0发送出去,数据包都不需要经过host机器的协议栈,效率高。
+----------------------------------------------------------------+-----------------------------------------+-----------------------------------------+
| Host | VirtualMachine1 | VirtualMachine2 |
| | | |
| +------------------------------------------------+ | +-------------------------+ | +-------------------------+ |
| | Newwork Protocol Stack | | | Newwork Protocol Stack | | | Newwork Protocol Stack | |
| +------------------------------------------------+ | +-------------------------+ | +-------------------------+ |
| ↑ | ↑ | ↑ |
|..........................|.....................................|...................|.....................|....................|....................|
| ↓ | ↓ | ↓ |
| +--------+ | +-------+ | +-------+ |
| | .3.101 | | | .3.102| | | .3.103| |
| +------+ +--------+ +-------+ | +-------+ | +-------+ |
| | eth0 |<--->| br0 |<--->|tun/tap| | | eth0 | | | eth0 | |
| +------+ +--------+ +-------+ | +-------+ | +-------+ |
| ↑ ↑ ↑ | ↑ | ↑ |
| | | +-------------------------------------------+ | | |
| | ↓ | | | |
| | +-------+ | | | |
| | |tun/tap| | | | |
| | +-------+ | | | |
| | ↑ | | | |
| | +-------------------------------------------------------------------------------|--------------------+ |
| | | | |
| | | | |
| | | | |
+------------|---------------------------------------------------+-----------------------------------------+-----------------------------------------+
↓
Physical Network (192.168.3.0/24)
Bond 设备
虚拟网卡bond是通过多张网卡绑定为一个逻辑网卡,实现本地网卡的冗余,带宽扩容和负载均衡,在生产场景中是一种常用的技术。 其工作原理说起来也挺简单,就是虚拟网卡开启混杂模式,接收多张网卡的数据,并改成相同的mac地址。
+----------------------------------------------------------------+
| |
| +------------------------------------------------+ |
| | Newwork Protocol Stack | |
| +------------------------------------------------+ |
| ↑ |
| | |
| +------------------------------------------------+ |
| | eth2 (one mac) | |
| +------------------------------------------------+ |
| ↑ ↑ |
|..............|................................|................|
| ↓ ↓ |
| +----------+ +------------+ |
| | eth0 | | eth1 | |
| +----------+ +------------+ |
| ↑ ↑ |
| | | |
| | | |
+--------------|---------------------------------|---------------+
↓ ↓
Physical Network 1 Physical Network 2
VLAN 设备
对于VLAN概念的理解
1.VLAN分离了广播域;
2.单独的一个VLAN模拟了一个常规的交换以太网,因此VLAN将一个物理交换机分割成了一个或多个逻辑交换机;
3.不同VLAN之间通信需要三层参与;
4.当多台交换机级联时,VLAN通过VID来识别,该ID插入到标准的以太帧中,被称作tag;
5.大多数的tag都不是端到端的,一般在上行路上第一个VLAN交换机打tag,下行链路的最后一个VLAN交换机去除tag;
6.只有在一个数据帧不打tag就不能区分属于哪个VLAN时才会打上tag,能去掉时尽早要去掉tag;
7.最终,IEEE 802.1q解决了VLAN的tag问题。除了IEEE 802.1q,其余的都是和实现相关的,虽然Cisco和H3C的实现很类似,Linux可以和它们有大不同。
## 参考链接
https://www.ibm.com/developerworks/cn/linux/l-virtual-networking/
https://www.ibm.com/developerworks/cn/linux/1312_xiawc_linuxvirtnet/index.html
https://segmentfault.com/a/1190000009491002
https://wiki.linuxfoundation.org/networking/bonding