《Kubernetes网络权威指南》读书笔记 | 给用户态一个机会:tun/tap设备

Posted COCOgsta

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《Kubernetes网络权威指南》读书笔记 | 给用户态一个机会:tun/tap设备相关的知识,希望对你有一定的参考价值。

书籍来源:《Kubernetes网络权威指南:基础、原理与实践》

一边学习一边整理读书笔记,并与大家分享,侵权即删,谢谢支持!

附上汇总贴:《Kubernetes网络权威指南》读书笔记 | 汇总_COCOgsta的博客-CSDN博客


tun/tap设备到底是什么?从Linux文件系统的角度看,它是用户可以用文件句柄操作的字符设备;从网络虚拟化角度看,它是虚拟网卡,一端连着网络协议栈,另一端连着用户态程序。

tun表示虚拟的是点对点设备,tap表示虚拟的是以太网设备,这两种设备针对网络包实施不同的封装。

tun/tap设备有什么作用呢?tun/tap设备可以将TCP/IP协议栈处理好的网络包发送给任何一个使用tun/tap驱动的进程,由进程重新处理后发到物理链路中。

1.4.1 tun/tap设备的工作原理

tun/tap设备的基本原理如图1-10所示。

图1-10 tun/tap设备的基本原理

物理网卡从网线接收数据后送达网络协议栈,而进程通过Socket创建特殊套接字,从网络协议栈读取数据。

tun/tap设备这类虚拟网卡与物理网卡并无区别,与物理网卡的不同表现在它的数据源不是物理链路,而是来自用户态!

tun/tap设备其实就是利用Linux的设备文件实现内核态和用户态的数据交互。tun设备的工作模式如图1-11所示。

图1-11 tun设备的工作模式

tun设备通过一个设备文件(/dev/tunX)收发数据包。所有对这个文件的写操作会通过tun设备转换成一个数据包传送给内核网络协议栈。

tap设备与tun设备的工作原理完全相同,区别在于:

  • tun设备的/dev/tunX文件收发的是IP包,因此只能工作在L3;
  • tap设备的/dev/tapX文件收发的是链路层数据包,可以与物理网卡做桥接。

1.4.2 利用tun设备部署一个VPN

我们将使用tun设备搭建一个基于UDP的VPN,网络拓扑如图1-12所示。

图1-12 使用tun设备搭建一个基于UDP的VPN

如上所示,数据包的流程包括:

(1)App1通过Socket API发送了一个数据包,假设这个数据包的目的IP地址是192.168.1.3(和tun0在同一个网段)。

(2)程序A的数据包到达网络协议栈后,根据目的IP地址匹配由tun0网口出去,于是将数据包发送给tun0网卡。

(3)tun0网卡收到数据包之后,将数据包发送给App2。

(4)App2收到数据包之后,通过报文封装构造出一个新的数据包(报文源地址与VPN属于同一网段)。App2通过同样的Socket API将数据包发送给协议栈。

(5)协议栈根据本地路由,将这个数据包应该通过eth0发送出去,发送给VPN的对端。

综上所述,发到192.168.1.0/24网络的数据,首先通过监听在tun0设备上的App2进行封包,再利用eth0发到远端,从而实现VPN。

1.4.3 tun设备编程

我们将用一个简单的C语言程序示范tun设备的具体使用方法。程序代码如下所示:

假设我们把以上C语言代码保存在tun.c文件中,然后编译成tun二进制文件:

tun程序启动后会一直阻塞并等待接收数据包:

虽然tun程序目前还没有任何输出,但系统已经自动创建了一块新的tun设备。打开另一个shell terminal,通过ip命令查看网卡,输出如下所示:

给它分配IP地址192.128.1.2,并设置状态为UP:

做好上面一系列配置后,tun0网卡上已经收到3个48字节的报文:

再来给tun0发送4个ping包:

会发现tun0网卡上又收到了6个84字节的报文,如下所示:

对上述现象的解释是,ping包发送给了tun0网卡。

以上是关于《Kubernetes网络权威指南》读书笔记 | 给用户态一个机会:tun/tap设备的主要内容,如果未能解决你的问题,请参考以下文章

《Kubernetes网络权威指南》读书笔记 | iptables

《Kubernetes网络权威指南》读书笔记 | 打通CNI与Kubernetes:Kubernetes网络驱动

《Kubernetes网络权威指南》读书笔记 | Kubernetes网络策略:为你的应用保驾护航

《Kubernetes网络权威指南》读书笔记 | 最常用的Docker网络技巧

《Kubernetes网络权威指南》读书笔记 | Linux隧道网络的代表:VXLAN

《Kubernetes网络权威指南》读书笔记 | 主角登场:Linux容器