目录

文章目录

  • 目录
  • 虚拟二层网卡(Tap)与虚拟三层隧道网卡(Tun)
    • tap/tun 作为用户空间与内核空间的数据传输通道
    • tap/tun 与内核网络协议栈的数据传输

虚拟二层网卡(Tap)与虚拟三层隧道网卡(Tun)

tap/tun 是 Linux 内核 2.4.x 版本之后加入的虚拟网络设备,不同于物理网卡靠硬件网路板卡的实现方式,tap/tun 虚拟网卡完全由内核软件来实现的,是一种让用户态程序向内核协议栈注入数据的设备。tap 工作在二层(数据链路层)而 tun 工作在三层(网络层)。功能和硬件实现完全没有差别,它们都属于网络设备,都可以配置 IP,都归 Linux 网络设备管理模块统一管理。

  • tap 工作在数据链路层:只能处理二层的以太网数据帧,与其中的以太网(Ethernet)协议对应,所以 tap 有时也称为 “虚拟以太网设备” 。
  • tun 工作在网络层:是一个点对点(Peer To Peer)的网络层设备,只能处理 IP 数据包,通常用于建立 IP 层隧道(Tunnel)。

作为网络设备,tap/tun 也需要配套相应的驱动程序才能工作。tap/tun 驱动程序包括两个部分:

  1. 字符设备驱动:负责数据包在内核空间和用户空间的传送。
  2. 网卡驱动:负责数据包在内核网络协议栈上的传输和处理。

tap/tun 作为用户空间与内核空间的数据传输通道

在 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 通过实现相应的网卡驱动程序来和 TCP/IP 网络协议栈通信。一般的流程和物理网卡和协议栈的交互流程是一样的,不同的是物理网卡一端是连接物理网络,而 tap/tun 虚拟网卡一般连接到用户空间。

首先看看物理网卡是如何工作的,物理网卡时收到数据包之后就会交给内核网络协议栈处理,然后通过 Socket API 通知给用户程序。

下面看看 tun 的工作方式,物理网卡通过网线收发数据包,但是 tun 设备通过一个字符设备文件收发数据包。

如果使用 tun 设备搭建一个基于 UDP VPN,那么整个处理过程就是这样:数据包会通过内核网络协议栈两次,在经过 VPN App 的处理后,数据包可能已经加密,并且原有的 IP Header 被封装在 UDP 内部,所以网络包在第二次通过内核网络栈时看到的是截然不同的网络包。

再举一个例子,我们有两个应用程序 A、B,物理网卡 eth0 和虚拟网卡 tun0 分别配置 IP:10.1.1.11 和 192.168.1.11,程序 A 希望构造数据包发往 192.168.1.0/24 网段的主机 192.168.1.1。

+----------------------------------------------------------------+
|                                                                |
|  +--------------------+      +--------------------+            |
|  | User Application A |      | User Application B |<-----+     |
|  +--------------------+      +--------------------+      |     |
|               | 1                    | 5                 |     |
|...............|......................|...................|.....|
|               ↓                      ↓                   |     |
|         +----------+           +----------+              |     |
|         | socket A |           | socket B |              |     |
|         +----------+           +----------+              |     |
|                 | 2               | 6                    |     |
|.................|.................|......................|.....|
|                 ↓                 ↓                      |     |
|             +------------------------+                 4 |     |
|             | Newwork Protocol Stack |                   |     |
|             +------------------------+                   |     |
|                | 7                 | 3                   |     |
|................|...................|.....................|.....|
|                ↓                   ↓                     |     |
|        +----------------+    +----------------+          |     |
|        |      eth0      |    |      tun0      |          |     |
|        +----------------+    +----------------+          |     |
|    10.32.0.11  |                   |   192.168.3.11      |     |
|                | 8                 +---------------------+     |
|                |                                               |
+----------------|-----------------------------------------------+↓Physical Network
  1. 应用程序 A 构造数据包,目的 IP 是 192.168.1.1,通过 socket A 将这个数据包发给协议栈。
  2. 协议栈根据数据包的目的 IP 地址,匹配路由规则,发现要从 tun0 出去。
  3. tun0 发现自己的另一端已经被应用程序 B 打开,于是将数据发给程序 B。
  4. 程序 B 收到数据后,做一些跟业务相关的操作,然后构造一个新的数据包,源 IP 是 eth0 的 IP,目的 IP 是 10.1.1.0/24 的网关 10.1.1.1,封装原来的数据的数据包,重新发给协议栈。
  5. 协议栈再根据本地路由,将这个数据包从 eth0 发出。

后续步骤,当 10.1.1.1 收到数据包后,会进行解封装,读取里面的原始数据包,继而转发给本地的主机 192.168.1.1。当接收回包时,也遵循同样的流程。在这个流程中,应用程序 B 的作用其实是利用 tun0 对数据包做了一层隧道封装。

tap 设备与 tun 设备工作方式完全相同,区别在于:tun 设备的 /dev/tunX 文件收发的是 IP 层数据包,只能工作在 IP 层,无法与物理网卡做 bridge,但是可以通过三层交换(e.g. ip_forward)与物理网卡连通;而 tap 设备的 /dev/tapX 文件收发的是 MAC 层数据包,拥有 MAC 层功能,可以与物理网卡做 bridge,支持二层广播。

Linux 虚拟化网络技术 — 虚拟二层网卡(Tap)与虚拟三层隧道网卡(Tun)相关推荐

  1. Linux 虚拟化网络技术 — 物理网卡的虚拟化(MACVLAN 和 MACVTAP)

    目录 文章目录 目录 物理网卡的虚拟化(MACVLAN 和 MACVTAP) MACVLAN MACVLAN 与 VLAN 子接口.Bridge 之间的区别 Private 模式 VEPA 模式 Br ...

  2. Linux 虚拟化网络技术 — 虚拟网络协议栈

    目录 文章目录 目录 前言 Neutron L3 agent 概述 L3 agent的配置 虚拟路由器实现原理 总结 前言 本文通过 OpenStack Neutron L3 Agent 实现的 Li ...

  3. Linux 虚拟化网络技术 — 虚拟网线(Veth-pair)

    目录 文章目录 目录 虚拟网线(Veth-pair) 虚拟网线(Veth-pair) Veth-pair 不是一个设备,而是一对设备,作为虚拟网线用于连接两个虚拟网络设备.veth pair 是根据数 ...

  4. Linux 虚拟化网络技术 — KVM + Linux Bridge 的网络虚拟化解决方案

    目录 文章目录 目录 KVM 虚拟机应用 Linux Bridge + VLAN 实现网络隔离 TSG: Failed to restart network KVM 虚拟机应用 Linux Bridg ...

  5. 计算机网络是虚拟网么,计算机网络安全虚拟网络技术作用

    摘要:随着改革开放以来.我国的科技文化不断的进步,信息技术的不断的发展和完善,计算机逐渐在人们的生活中国普遍应用了起来,计算机给人的生活带来很多的便利,然而随着信息技术的不断的发展,计算机网络安全受到 ...

  6. Linux内核网络中的软中断ksoftirqd

    1. 前言 之前分享过Linux内核网络数据包的接收过程,当执行到网卡通过硬件中断(IRQ)通知CPU,告诉它有数据来了,CPU会根据中断表,调用已经注册的中断函数,这个中断函数会调到驱动程序(NIC ...

  7. 虚拟机实现二层交换机_局域网SDN技术硬核内幕 5 虚拟化网络的实现

    在前一篇文章 <从计算虚拟化到网络虚拟化>中提到,将虚拟私有云(VPC)中,各个网络节点互联的是通过虚拟网元实现的.那么,在现实中,谁扮演虚拟网元的角色呢? 让我们将时间轴拉回到21世纪的 ...

  8. 网络虚拟化技术(一): linux网络虚拟化,网络虚拟化技术(一): Linux网络虚拟化...

    网络虚拟化技术(一): Linux网络虚拟化 2018-12-11 01 March 2013 笔者现在在做云计算的网络设计,涉及到上百台服务器与交换机,在实测前必须进行原型测试,但是我只有一个工作用 ...

  9. Docker虚拟化容器技术(用在虚拟机上),VirtualBox中linux虚拟机联网的问题

    Docker虚拟化容器技术(用在虚拟机上),VirtualBox中linux虚拟机联网的问题 文章目录 前言:安装Docker,则先安装Linux虚拟机(我的CSDN中有发) 一.要解决在Virtua ...

最新文章

  1. 织梦内容管理系统修改
  2. FreeMarker template error: The following has evaluated to null or missing
  3. Machine Learning week 5 quiz: Neural Networks: Learning
  4. python和c混合编程 gil_终于搞明白python与gil
  5. 假如你学过高数,那你这一辈子都不会忘记这个人
  6. VS2017无法打开文件MSVCRTD.lib
  7. 混凝土墙开洞_新乐专业混凝土切割报价适中
  8. 深入理解Hadoop之HDFS架构
  9. 在ASP.NET中使用Session常见问题集锦
  10. OS X上搭建distcc使用XCode进行分布式编译
  11. [转]如何使用 DirectX 診斷工具判斷 DirectX 的版本
  12. SharePoint 2010之LINQ与SPMetal
  13. 7. Document write() 方法
  14. Gson解析原理概述
  15. linux内核登录不上,在嵌入式板上启动linux内核后,用root登录不了
  16. 《麦肯锡方法》读书笔记4
  17. DHCPv6(dhcpv6配置)
  18. 泛微oa系统什么框架_泛微OA办公系统是什么,怎么使用_使用方法_使用平台_企业服务汇...
  19. dagger2简单使用与理解笔记
  20. 数学悖论与三次数学危机

热门文章

  1. 基于ARP的网络扫描工具netdiscover
  2. Unity网络多玩家游戏开发教程第1章Unity自带网络功能
  3. 服务器文件数量监控,服务器监控指标有哪些?好文章一定要收藏
  4. sql和mysql一起,SQL连接和MySQL
  5. java spring怎么运行_java – 如何使用spring异步运行方法?
  6. 接口测试用例设计思路_接口测试平台设计思路10:成品总览白盒模块
  7. sql左连接排序取第一个_详解kettle工具记录集连接功能及实验测试
  8. 如何用photoshop做24色环_如何用Photoshop给照片添加印章水印,内附印章模板素材...
  9. Linux端日志加密,Linux学习--第十三天--日志、系统运行级别、grub加密
  10. iOS应用开发入门(2)——添加一个按钮