云计算网络之---tap/tun/veth 虚拟网卡详解 admin 2023-08-28 14:54:01 篇首语:本文由小编为大家整理,主要介绍了云计算网络之---tap/tun/veth 虚拟网卡详解相关的知识,希望对你有一定的参考价值。 参考资料 https://www.kernel.org/doc/Documentation/networking/tuntap.txt https://www.cnblogs.com/bakari/p/10450711.html - linux云计算网络 区别图 一图胜千言,进入正题: 物理网卡,TUN, TAP, VETH 四种模型的数据收发如下图所示 TAP/TUN tap/tun 是 Linux 内核 2.4.x 版本之后实现的虚拟网络设备,不同于物理网卡靠硬件网路板卡实现,tap/tun 虚拟网卡完全由软件来实现,功能和硬件实现完全没有差别,它们都属于网络设备,都可以配置 IP,都归 Linux 网络设备管理模块统一管理。 作为网络设备,tap/tun 也需要配套相应的驱动程序才能工作。tap/tun 驱动程序包括两个部分,一个是字符设备驱动,一个是网卡驱动。这两部分驱动程序分工不太一样,字符驱动负责数据包在内核空间和用户空间的传送,网卡驱动负责数据包在 TCP/IP 网络协议栈上的传输和处理。 用户空间与内核空间的数据传输 在 Linux 中,用户空间和内核空间的数据传输有多种方式,字符设备就是其中的一种。tap/tun 通过驱动程序和一个与之关联的字符设备,来实现用户空间和内核空间的通信接口。 在 Linux 内核 2.6.x 之后的版本中,tap/tun 对应的字符设备文件分别为: tap:/dev/tap0 tun:/dev/net/tun 设备文件即充当了用户空间和内核空间通信的接口。当应用程序打开设备文件时,驱动程序就会创建并注册相应的虚拟设备接口,一般以 tunX 或 tapX 命名。当应用程序关闭文件时,驱动也会自动删除 tunX 和 tapX 设备,还会删除已经建立起来的路由等信息。 tap/tun 设备文件就像一个管道,一端连接着用户空间,一端连接着内核空间。当用户程序向文件 /dev/net/tun 或 /dev/tap0 写数据时,内核就可以从对应的 tunX 或 tapX 接口读到数据,反之,内核可以通过相反的方式向用户程序发送数据。 tap/tun 和网络协议栈的数据传输 tap/tun 通过实现相应的网卡驱动程序来和网络协议栈通信。一般的流程和物理网卡和协议栈的交互流程是一样的,不同的是物理网卡一端是连接物理网络,而 tap/tun 虚拟网卡一般连接到用户空间。 如下图的示意图,我们有两个应用程序 A、B,物理网卡 eth0 和虚拟网卡 tun0 分别配置 IP:10.1.1.11 和 192.168.1.11,程序 A 希望构造数据包发往 192.168.1.0/24 网段的主机 192.168.1.1。 基于上图,我们看看数据包的流程: 应用程序 A 构造数据包,目的 IP 是 192.168.1.1,通过 socket A 将这个数据包发给协议栈。 协议栈根据数据包的目的 IP 地址,匹配路由规则,发现要从 tun0 出去。 tun0 发现自己的另一端被应用程序 B 打开了,于是将数据发给程序 B. 程序 B 收到数据后,做一些跟业务相关的操作,然后构造一个新的数据包,源 IP 是 eth0 的 IP,目的 IP 是 10.1.1.0/24 的网关 10.1.1.1,封装原来的数据的数据包,重新发给协议栈。 协议栈再根据本地路由,将这个数据包从 eth0 发出。 后续步骤,当 10.1.1.1 收到数据包后,会进行解封装,读取里面的原始数据包,继而转发给本地的主机 192.168.1.1。当接收回包时,也遵循同样的流程。 在这个流程中,应用程序 B 的作用其实是利用 tun0 对数据包做了一层隧道封装。其实 tun 设备的最大用途就是用于隧道通信的 VETH PAIRS Veth设备被构建为成对的连接虚拟以太网接口,并且可以被视为虚拟跳线。最终结果将在另一端显现出来。 这使得veth对非常适合将不同的虚拟网络组件(例如Linux网桥,OVS网桥和LXC容器)连接在一起。 您将在veth pairs对中看到的一个常见用例是OpenStack Neutron。在使用第veth pairs对将多个Linux桥接器连接在一起的情况下,您目前无法使用基于Tap的设备进行此操作。 常见问题 TUN / TAP驱动程序支持哪些平台? 目前,驱动程序已为3 Unices编写: Linux内核2.2.x,2.4.x 及以后版本 FreeBSD 3.x,4.x,5.x及以后版本 Solaris 2.6、7.0、8.0及以后版本 TUN / TAP驱动程序用于什么? 如上所述,TUN / TAP驱动程序的主要目的是隧道。 VTun(http://vtun.sourceforge.net)使用它。 使用TUN / TAP的另一个有趣的应用程序是pipsecd (http://perso.enst.fr/~beyssac/pipsec/),一个用户空间IPSec 可以使用完整的内核路由的实现(与FreeS / WAN不同)。 3.虚拟网络设备实际如何工作? 可以将虚拟网络设备视为简单的点对点或 以太网设备,而不是从物理设备接收数据包 媒体,从用户空间程序接收它们,而不是发送 通过物理媒体发送的数据包将它们发送到用户空间程序。 假设您在tap0上配置了IPv6, 内核将IPv6数据包发送到tap0,并将其传递给应用程序 (例如,VTun)。该应用程序将其加密,压缩并发送到 另一端在TCP或UDP上。另一边的应用解压缩 解密接收到的数据并将数据包写入TAP设备, 内核会像处理来自实际物理设备的数据包一样处理数据包。 TUN驱动程序和TAP驱动程序有什么区别? TUN适用于IP框架。 TAP适用于以太网帧。 这意味着在使用tun和 使用水龙头时使用以太网帧。 BPF和TUN / TAP驱动程序有什么区别? BPF是高级数据包筛选器。可以附加到现有的 网络接口。它不提供虚拟网络接口。 TUN / TAP驱动程序确实提供了虚拟网络接口,并且可能 将BPF附加到此接口。 TAP驱动程序是否支持内核以太网桥接? 是。 Linux和FreeBSD驱动程序支持以太网桥接。 以上是关于云计算网络之---tap/tun/veth 虚拟网卡详解的主要内容,如果未能解决你的问题,请参考以下文章 windows7怎么设置vpn Switchhosts Mac 安装 您可能还会对下面的文章感兴趣: 相关文章 浏览器打不开网址提示“ERR_CONNECTION_TIMED_OUT”错误代码的解决方法 如何安装ocx控件 VMware的虚拟机为啥ip地址老是自动变化 vbyone和EDP区别 linux/debian到底怎么重启和关机 苹果平板键盘被弄到上方去了,如何调回正常? 机器学习常用距离度量 如何查看kindle型号