TUN/TAP设备浅析(一) -- 原理浅析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TUN/TAP设备浅析(一) -- 原理浅析相关的知识,希望对你有一定的参考价值。

参考技术A

TUN 设备是一种虚拟网络设备,通过此设备,程序可以方便地模拟网络行为。 TUN 模拟的是一个三层设备,也就是说,通过它可以处理来自网络层的数据,更通俗一点的说,通过它,我们可以处理 IP 数据包。

先来看看物理设备是如何工作的:

上图中的 eth0 表示我们主机已有的真实的网卡接口 ( interface )。

网卡接口 eth0 所代表的真实网卡通过网线( wire )和外部网络相连,该物理网卡收到的数据包会经由接口 eth0 传递给内核的网络协议栈( Network Stack )。然后协议栈对这些数据包进行进一步的处理。

对于一些错误的数据包,协议栈可以选择丢弃;对于不属于本机的数据包,协议栈可以选择转发;而对于确实是传递给本机的数据包,而且该数据包确实被上层的应用所需要,协议栈会通过 Socket API 告知上层正在等待的应用程序。

下面看看 TUN 的工作方式:

我们知道,普通的网卡是通过网线来收发数据包的话,而 TUN 设备比较特殊,它通过一个文件收发数据包。

如上图所示, tunX 和上面的 eth0 在逻辑上面是等价的, tunX 也代表了一个网络接口,虽然这个接口是系统通过软件所模拟出来的.

网卡接口 tunX 所代表的虚拟网卡通过文件 /dev/tunX 与我们的应用程序(App) 相连,应用程序每次使用 write 之类的系统调用将数据写入该文件,这些数据会以网络层数据包的形式,通过该虚拟网卡,经由网络接口 tunX 传递给网络协议栈,同时该应用程序也可以通过 read 之类的系统调用,经由文件 /dev/tunX 读取到协议栈向 tunX 传递的 所有 数据包。

此外,协议栈可以像操纵普通网卡一样来操纵 tunX 所代表的虚拟网卡。比如说,给 tunX 设定 IP 地址,设置路由,总之,在协议栈看来, tunX 所代表的网卡和其他普通的网卡区别不大,当然,硬要说区别,那还是有的,那就是 tunX 设备不存在 MAC 地址,这个很好理解, tunX 只模拟到了网络层,要 MAC 地址没有任何意义。当然,如果是 tapX 的话,在协议栈的眼中, tapX 和真是网卡没有任何区别。

如果我们使用 TUN 设备搭建一个基于 UDP VPN ,那么整个处理过程可能是这幅样子:

首先,我们的应用程序通过 eth0 和远程的 UDP 程序相连,对方传递过来的 UDP 数据包经由左边的协议栈传递给了应用程序, UDP 数据包的内容其实是一个网络层的数据包,比如说 IP 数据报,应用程序接收到该数据包的数据(剥除了各种头部之后的 UDP 数据)之后,然后进行一定的处理,处理完成后将处理后的数据写入文件 /dev/tunX ,这样,数据会第二次到达协议栈。需要注意的是,上图中绘制的两个协议栈其实是同一个协议栈,之所以这么画是为了叙述的方便。

TAP 设备与 TUN 设备工作方式完全相同,区别在于:

最后,关于文章中出现的二层,三层,我这里说明一下,第一层是物理层,第二层是数据链路层,第三层是网络层,第四层是传输层。

参考文章:
[1]. https://blog.kghost.info/2013/03/27/linux-network-tun/

TUN/TAP设备浅析

 

https://www.jianshu.com/p/660e69326e65

在 linux 2.4 及之后的内核版本中,tun/tap 驱动是默认编译进内核中的。 (tun编译到内核中, tap作为内核模块编译)

 

 

TUN/TAP设备浅析(一) -- 原理浅析

https://www.jianshu.com/p/09f9375b7fa7

 

 

TUN/TAP设备浅析(二) -- TUN/TAP的编程

https://www.jianshu.com/p/ab91f7cd98cd

 

 

TUN/TAP设备浅析(三) -- TUN/TAP设备的应用

https://www.jianshu.com/p/14f9340d940d

 

以上是关于TUN/TAP设备浅析(一) -- 原理浅析的主要内容,如果未能解决你的问题,请参考以下文章

通用TUN/TAP设备驱动

[Linux用户空间编程-4]:Linux虚拟网络设备TUN/TAP的工作原理与代码示例

[Linux用户空间编程-4]:Linux虚拟网络设备TUN/TAP的工作原理与代码示例

Linux 网络工具详解之 ip tuntap 和 tunctl 创建 tap/tun 设备

硬货 | 利用 Linux tap/tun 虚拟设备写一个 ICMP echo 程序

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