理解Linux Bridge、Tun/Tap、Veth Pair

最近在学习openstack neutron的相关知识,neutron的二层网络实现使用了linux网络虚拟化相关的技术。之前看kubernetes cni的时候,也使用过类似的技术。这一次整理一下这些内容,加深自己的理解。

veth pair

veth是虚拟以太网卡(Virtual Ethernet)的缩写。veth设备总是成对的,因此我们称之为veth pair。如下图所示,veth0和veth1是一对veth pair。eth0是物理网卡设备,与eth0一端连着网络协议栈一端连着物理网卡不同,veth pair两个设备,一端互相链接,另外一端都连着网络协议栈。这一特性,使得我们在用户空间向veth pair的一端(如veth0)发送网络包,在另一端(veth1)可以接收到这些网络包。
veth pair在容器化场景里,常用来连接不同的network namespace。在虚拟化场景中则常用来链接两个linux bridge。
请输入图片描述

tun/tap

tun/tap设备到底是什么?从Linux文件系统的角度看,它是用户可以用文件句柄操作的字符设备;从网络虚拟化角度看,它是虚拟网卡,一端连着网络协议栈,另一端连着用户态程序。
详细介绍tun/tap之前,我们先简单介绍物理设备上的数据是如何通过Linux网络栈送达用户态程序的。下图一个经典的、通过Socket调用实现用户态和内核态数据交互的过程。物理网卡从网线接收数据后送达网络协议栈,而进程通过Socket创建特殊套接字,从网络协议栈读取数据。
请输入图片描述

tun/tap设备是利用Linux的设备文件实现内核态和用户态的数据交互,而访问设备文件则会调用设备驱动相应的例程,要知道设备驱动也是内核态和用户态的一个接口。tun设备的工作模式如下图,普通的物理网卡通过网线收发数据包,而tun设备通过一个设备文件(/dev/tunX)收发数据包。所有对这个文件的写操作会通过tun设备转换成一个数据包传送给内核网络协议栈。当内核发送一个包给tun设备时,用户态的进程通过读取这个文件可以拿到包的内容。当然,用户态的程序也可以通过写这个文件向tun设备发送数据包。
tap设备与tun设备的工作原理完全相同,区别在于:

  • tun设备的/dev/tunX文件收发的是IP包,因此只能工作在L3,无法与物理网卡做桥接,但可以通过三层交换(例如ip_forward)与物理网卡连通;
  • tap设备的/dev/tapX文件收发的是链路层数据包,可以与物理网卡做桥接。

在虚拟化场景下,tap设备常用来链接虚机与物理机上的网络设备。如openstack,虚机使用qemu做io虚拟化向/dev/tunX读写数据,通过tap设备可以将虚机的网络包传送到物理机的网络协议栈内。
请输入图片描述

Linux Bridge

顾名思义,Linux bridge就是Linux系统中的网桥,但是Linux bridge的行为更像是一台虚拟的网络交换机,任意的真实物理设备(例如eth0)和虚拟设备(例如,前面讲到的veth pair和tap设备)都可以连接到Linux bridge上。需要注意的是,Linux bridge不能跨机连接网络设备。
Linux bridge与Linux上其他网络设备的区别在于,普通的网络设备只有两端,从一端进来的数据会从另一端出去。例如,物理网卡从外面网络中收到的数据会转发给内核协议栈,而从协议栈过来的数据会转发到外面的物理网络中。Linux bridge则有多个端口,数据可以从任何端口进来,进来之后从哪个口出去取决于目的MAC地址,原理和物理交换机差不多。
刚创建一个bridge时,它是一个独立的网络设备,只有一个端口连着协议栈,其他端口什么都没连接,这样的bridge其实没有任何实际功能,如下图所示。
请输入图片描述

下面我们将,veth pair设备的一端与br0相连接,如下图所示。一旦有网络设备与linux bridge相连,就会触发linux brdge的一个功能,与linux bridge相连的网络设备不再向网络协议栈发送数据,转而发送给linux bridge
因为这一特性,使得与linux bridge相连接的网络设备的ip地址失去了作用。如下图所示veth0 ip为1.2.3.101。但是由于veth0收到的数据都会转发给br0,而不会发送给网络协议栈。br0发现包并不是发送给自己的,因为br0本身没有ip,所以会将包丢弃。
请输入图片描述

通过以上的分析,网络设备A与linux bridge相连接后,为了保证网络的连通性,应该将网络设备A的ip地址配置到br0上。如下图所示
请输入图片描述

与linux bridge相连的一定是能与网络协议栈相连的设备。上述的veth pair,tun/tap,tun/tap有一段与网络协议栈相连,veth pair两端都与网络协议栈相连。进一步思考,我们就知道能够链接两个linux bridge的只能是veth pair设备。

参考:《Kubernetes网络权威指南:基础、原理与实践》

  • 18
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux TUN/TAP设备是一种虚拟网络设备,它能够模拟一个网络接口。通过TUN/TAP设备,用户空间的程序可以像操作物理网络设备一样,发送和接收网络数据包。 TUN/TAP设备主要有两种模式:TUN模式和TAP模式。TUN模式主要用于IP层协议,TAP模式主要用于以太网层协议。两种模式的差异在于数据包的处理方式不同。 在Linux内核中,TUN/TAP设备的实现位于`drivers/net/tun.c`文件中。该文件中定义了一个名为`tun_net`的网络设备对象,并实现了`tun_chr_write_iter()`、`tun_chr_read_iter()`等函数,用于处理用户空间和内核空间之间的数据交互。 当用户空间的程序打开TUN/TAP设备时,会创建一个名为`tunX`的虚拟接口,其中`X`是一个数字,表示设备的编号。内核会将数据包发送到该虚拟接口,然后用户空间的程序可以通过读取该接口的文件描述符来接收数据包。同样地,用户空间的程序可以通过写入该接口的文件描述符来发送数据包。 TUN/TAP设备的实现使用了内核中的网络协议栈,因此它能够与其他网络设备无缝交互。用户空间的程序可以使用标准的套接字接口来与TUN/TAP设备进行通信,实现虚拟网络设备和物理网络设备之间的数据交换。 总之,TUN/TAP设备是一个非常有用的工具,它可以用于各种网络应用程序,如虚拟私有网络(VPN)和网络隧道。通过了解TUN/TAP设备的实现,我们可以更好地理解网络协议栈和Linux内核的工作原理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值