零入门容器云网络-8:网络虚拟设备之tun设备介绍

news2025/3/15 17:01:45

已发表的技术专栏(订阅即可观看所有专栏)
0  grpc-go、protobuf、multus-cni 技术专栏 总入口

1  grpc-go 源码剖析与实战  文章目录

2  Protobuf介绍与实战 图文专栏  文章目录

3  multus-cni   文章目录(k8s多网络实现方案)

4  grpc、oauth2、openssl、双向认证、单向认证等专栏文章目录


1、tun、tap设备是什么

TUN与TAP是操作系统内核中的虚拟网络设备。

不同于硬件设备这些虚拟的网络设备全部用软件实现,但提供了与硬件设备完全相同的功能。

2、tun设备跟tap设备的区别?

  • TUN 设备
    • 字符描述文件/dev/net/tun,收发的是 IP 层数据包,只能工作在 IP 层;
    • 点对点的三层设备;
    • 无法与物理网卡做 bridge,但是可以通过三层交换(如 ip_forward)与物理网卡连通。
  • TAP 设备
    • /dev/tapX 文件收发的是 MAC 层数据包(以太网帧);
    • 拥有 MAC 层功能,可以与物理网卡做 bridge;
    • 支持 MAC 层广播。

换一种形式:

对比项tun设备tap设备
协议栈层次三层设备二层设备
处理数据包类型IP数据包以太网数据包
是否有MAC地址没有
是否是虚拟网卡

tap比tun更接近于物理网卡

3、tun、tap设备跟物理网卡设备的区别?

3.1、区别?

  • tun、tap设备
    • 纯软件实现的
    • 一端链接网络协议栈,一端通过字符文件/dev/net/tun链接应用程序
  • 物理网卡
    • 一端链接网络协议栈,一端链接物理网线
    • 非软件实现

3.2、注意点

tun设备和物理网卡eth0分别代表不同的网络,分别属于不同的网络段里。

比方说,

  • tun设备所属的网络为10.244.1.0/24
  • 物理网卡eth0所属的网络为10.211.55.0/24

要求是,业务应用希望通过tun所在的网络,跟其他宿主机上的tun所属于的网络进行数据的通信;

不同宿主机上tun设备所在的网络,默认情况下,是不能直接通信的,

因此,我们要解决的是如何让不同宿主机上tun设备所在的网络能够通信?

4、tun设备的使用场景

TUN设备最常用的场景是VPN,包括tunnel以及应用层的IPSec

比方说,flannel网络中的UDP模式

5、tun设备、tap设备收发数据包的方式

5.1、物理网卡收发数据包的方式

先看一下,物理网卡收发数据包的方式

在这里插入图片描述

用户空间中的应用程序如何跟外部网络进行通信呢?

直接通过物理网卡eth0进行的通信,通过eth0网卡将物理线路wire跟内核空间中的网络协议栈进行链接在一起。

通过eth0网卡,进行数据包的收发。

也没有转发到其他设备。

好,我们看下虚拟网络设备tun、tap是如何收发数据包的?

5.2、虚拟网络设备tun、tap是如何收发数据包的?

5.2.1、业务应用程序APP接收tun设备发送数据包方式?

在这里插入图片描述

从上面的图,可以看出来:
虚拟网络设备tun跟物理网卡有一个很大的区别,tun设备的一端并没有链接物理网线,而是链接了一个文件描述符/dev/net/tun;

/dev/net/tun就是一个文件,如下图所示:(centos7.5上)
在这里插入图片描述

假设我们以flannel为例

  • 用户空间的flannel服务向文件描述符/dev/net/tun发送数据;
    • 注意,给/dev/net/tun发送数据时,必须遵循一定的格式,
    • 比方说,发送一个icmp数据包(ping xx.xx.xx.xx),必须添加上IP报文头
    • 因为,tun设备,只能处理IP层的数据包
  • 可以认为,只要/dev/net/tun文件收到数据后,就会自动的转发给tun设备,即转发了给虚拟网卡flannel0设备;(背后的原理,不再深究,这相当于基础条件,类似于1+1必须等于2)
  • 当虚拟网络设备flannel0收到数据包后,可能会经过路由表,IP防火墙规则,网络协议栈等,最终发送给了用户空间的业务应用
    • 注意一点,虚拟网络设备flannel0收到/dev/net/tun转发的数据包后,会解析IP头
    • 将剩下的数据,扔给业务应用APP

接下来,看下面的图:

5.2.2、业务应用程序APP给tun设备发送数据包的方式?

此图跟上面的图,数据包的流向刚好相反

在这里插入图片描述

  • 假设某个应用的APP产生一个ICMP类型的数据包,此数据包会经过网络协议栈,路由表,防火墙,最终进入到了tun设备里(flannel0)
  • 当虚拟网络设备flannel0接收到icmp类型的数据包,会自动给这个数据包添加一个IP层的报文头,
  • 此时,新的数据包就会自动的转发到/dev/net/tun文件描述符里
  • 而flannel服务在不断的从/dev/net/tun文件描述符里读取数据,这样的话,flannel服务就读取到了业务应用发送的ICMP数据包了
    • 注意一点,flannel服务收到的数据包是IP类型的数据包
    • 需要flannel服务,解析IP数据包,去掉20个字节的IP报文头,获取剩下的数据内容

5.2.3、业务应用程序APP如何利用tun设备跟外部进行通信呢?

接下来,我们分析一下,业务应用程序APP如何利用tun设备跟外部进行通信呢?

在这里插入图片描述

上图中的网络协议栈-1,网络协议栈-2 就是宿主机上的同一个网络协议栈,为了更好理解,画了两个。

  • 假设用户空间的APP应用执行ping命令,产生ICMP数据包,此数据包经过了路由表,防火墙,网络协议栈,最终到达tun设备(flannel0)
  • flannel0设备接收到数据包后,会自动的添加上IP报文头,20个字节,产生的新的数据包,
  • 新的数据包会自动的转发到文件描述符/dev/net/tun里
  • 用户空间的flannel服务,会不断的监听/dev/net/tun文件描述符,从此文件里读取数据包
  • 本地宿主机上,会建立一个socket链接,如udp链接;
  • 用户空间的flannel服务会将从/dev/net/tun文件描述符里接收的数据包通过udp连接发送出去

通过这种形式,业务应用就将数据包传输出去了

5.2.4、如何利用tun设备实现不同宿主机上的tun网络通信?跨主机通信

如何利用tun设备实现不同宿主机上的应用通信呢?
如下图所示:

在这里插入图片描述

假设,上面的图是宿主机1,下面的图是宿主机2;

宿主机-1对应的物理网卡eth0的IP地址10.211.55.161,
宿主机-2对应的物理网卡eth0的IP地址10.211.55.162,

宿主机-1上flannel0虚拟网卡的IP网络是10.244.1.1/24
宿主机-2上flannel0虚拟网卡的IP网络是10.244.2.1/24

宿主机-1上的业务应用APP-1使用的网络是flannel0网络10.244.1.1/24
宿主机-2上的业务应用APP-2使用的网络是flannel0网络10.244.2.1/24

现在的需求是,希望宿主机-1上的业务应用APP-1能够ping通宿主机-2上的业务应用APP-2

在宿主机-1上

  • 业务应用APP-1使用ping命令创建icmp数据包
  • 经过路由表,防火墙,网络协议栈,最终达到了tun设备,如flannel0
  • 虚拟网络设备flannel0接收到ICMP包后,会自动的给ICMP包添加一个IP报文头,20个字节(如,报文协议,源地址10.244.1.1,目的IP地址10.244.2.1)
  • 虚拟网络设备flannel0产生的新的数据包,会自动的转发到文件描述符/dev/net/tun里
  • 网络相关服务,如flannel服务,会从/dev/net/tun里读取到虚拟网络设备flannel0产生的数据包,
  • flannel服务将接收到的数据包通过udp连接,发送出去

在宿主机-2上

  • flannel服务通过UDP连接,读取到宿主机-1上发送过来的数据包
  • flannel服务,会将接收到的数据包写到文件描述符/dev/net/tun里
  • 虚拟网络设备flannel0从文件描述符/dev/net/tun里读取到了数据包
  • 虚拟网络设备flannel0会自动的分析数据包的IP报文头,即分析前20个字节,
  • 虚拟网络设备去掉前20个字节后,会将剩下的数据包发送出去
  • 离开虚拟网络设备flannel0的数据包,会经过路由表,防火墙,网络协议栈后,最终到达业务应用APP-2里
    = 业务应用APP-2接收到数据包后,会进行响应的处理

其实具体是TUN或者是TAP,都不是在open打开设备的文件节点时就确定的。文件节点只是内核提供给用户的接口而已,应用程序需要ioctl设置自己的虚拟网络设备的工作模式,是TUN还是TAP。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/102913.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringCloud(8)— 使用ElasticSearch(RestClient)

SpringCloud(8)— 使用ElasticSearch(RestClient) 一 认识RestClient ES 官方提供了各种语言的客户端用来操作ES,这些客户端的本质就是组创DSL语句,通过 Http 请求发送给ES 官方文档地址:Elasticsearch Clients | E…

运维基础(上部)

运维基础【(上部)】 因为笔记所记内容太多,所以我分成了上下两部分来分享给大家查看学习!同时我会持续更新博客发布更加优质的文章,希望大家多多支持与关注!感谢! 一、运维概述 1、运维岗位的收…

[附源码]计算机毕业设计Python港口集团仓库管理系统(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等…

GitLab Runner的使用

一、初次使用GitLab Runner 特别说明:前面已经将本地项目成功推送到了GitLab中,并且已经注册了一个GitLab Runner,接下来就是使用GitLab Runner。 触发GitLab Runner以完成GitLab的CI(持续集成)/CD(持续部署),需满足下述两个条件: 仓库根目录下面存在有.gitlab-ci.yml文…

[ Linux ] 互斥量实现原理,线程安全

上篇文章我们对抢票系统做了加锁处理,对互斥量tickets进行加锁。而本篇博文来谈谈互斥量实现的原理以及相关问题。 目录 1.上篇遗留问题 我们在临界资源对应的临界区中加锁了,就不是多行代码了吗?如果还是多行代码,难道不会被切…

[附源码]计算机毕业设计Python公益组织登记与查询系统论文(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

【AI with ML】第 13 章 :在 Android 应用程序中使用 TensorFlow Lite

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

vue的虚拟DOM和diff算法

虚拟DOM和diff算法密不可分, 虚拟dom,它本身就是一个 JavaScript 对象,为解决DOM操作非常耗时,把DOM转换为虚拟DOM,DOM操作转换为js计算,js执行速度较快。 diff算法在vue中被优化为O(n)的时间复杂度&#x…

手机损坏的数据导出方法

主板损坏的症状 手机主板损坏的症状表现一般为系统启动失败、屏幕无显示、启动黑屏死机、无法开机、没有声音、无法打电话、没网络等等。 资料的重要性 手机坏了,怎么把手机里面重要的资料导出来?今天小编就来跟大家说说手机导资料这个事。 手机坏了,具体要看手机是哪里…

java计算机毕业设计ssm基于JavaWeb的公务员招考信息发布平台

项目介绍 随着互联网技术的发发展,计算机技术广泛应用在人们的生活中,逐渐成为日常工作、生活不可或缺的工具,各种管理系统层出不穷。公务员是各国负责统筹管理经济社会秩序和国家公共资源,维护国家法律规定,贯彻执行相关义务的公职人员。每年报考公务员的人数逐渐增加,特为此…

寒假训练营 第一节 时空复杂度分析

一.时空复杂度的分析 1.时间复杂度 时间复杂度&#xff1a;程序运行会消耗多少时间。 在此&#xff0c;为了方便讨论&#xff0c;我们假定每一个语句消耗的时间一样&#xff0c;视为一个时间单元。 #include <iostream> using namespace std; int main() {int n 100;…

国企的设备管理工作如何做好?

国企的设备管理工作如何做好&#xff1f; 在市场经济建设持续深化、经营体制不断转变的过程中&#xff0c;一些企业设备管理工作发生了很大的变化&#xff0c;出现整体水平下降&#xff0c;设备技术状况恶化等现象&#xff0c;这在一定程度上制约了企业技术创新&#xff0c;制…

Transformer实现以及Pytorch源码解读(二)-embedding源码分析

前言 本部分博客需要先阅读博客&#xff1a;《Transformer实现以及Pytorch源码解读&#xff08;一&#xff09;-数据输入篇》 作为知识储备。 Embedding使用方式 如下面的代码中所示&#xff0c;embedding一般是先实例化nn.Embedding(vocab_size, embedding_dim)。实例化的过…

业务安全情报,预知发现黑灰产的企业攻击

业务遭遇欺诈风险&#xff0c;发起攻击的黑灰产主要是为了谋取利益。对于黑灰产利益目的甄别需要多方面情报&#xff0c;再辅助技术和专家经验&#xff0c;然后进行综合判断&#xff0c;进而帮助企业及时响应、精准布控。 安全情报帮助企业提前发现攻击 12月13日&#xff0c;“…

谁代表先进生产力?

互联网企业代表先进生产力方向 做软件项目的时候碰到三类企业 1、 传统企业&#xff0c;以卖货或卖服务为主 2、 互联网类&#xff0c;做个服务工具或平台 3、 分配模式类&#xff0c;以某分配模式为“宝贝” 毫无疑问&#xff1a; 互联网企业代表先进的生产力方向 互联网类…

即时通讯音视频开发之音频基础及编码原理

即时通讯应用中的实时音视频技术&#xff0c;几乎是IM开发中的最后一道高墙。原因在于&#xff1a;实时音视频技术 音视频处理技术 网络传输技术 的横向技术应用集合体&#xff0c;而公共互联网不是为了实时通信设计的。 比特率&#xff1a; 表示经过编码&#xff08;压缩&am…

C#读取Excel文件内容(WPS)

本地安装的WPS版本为 一、下载accessdatabaseengine_X64后安装 网址&#xff1a;https://www.microsoft.com/en-us/download/details.aspx?id54920 二、项目中引用OleDb包 三、代码部分 //excelFilePath为文件路径&#xff08;例如D:\Test.xslx&#xff09; > //strin…

Android---RecyclerView回收复用机制

一、RecyclerView回收复用 回收什么&#xff1f;复用什么&#xff1f; 回收&#xff1a;回收即缓存。当屏幕上的一个itemView滑出屏幕(即不可见了)&#xff0c;RecyclerView就利用回收机制&#xff0c;将该itemView放入内存。当其它itemView出现时&#xff0c;不用每次都去new…

JavaScript-Sass

Sass的基础使用 1.简介 1.1简介 Sass是世界上最成熟&#xff0c;最稳定&#xff0c;最强大的CSS扩展语言Sass是css预编译工具可以更加优雅的书写csssass写出来的东西浏览器不认识需要进行转换VSCode推荐使用Easy Sass插件Sass中可以使用加减乘除&#xff0c;条件分支以及循环…

【Three.js入门】处理动画、尺寸自适应、双击进入/退出全屏(Clock跟踪时间,Gsap动画库,自适应画面,进入/退出全屏)

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;也会涉及到服务端 &#x1f4c3;个人状态&#xff1a; 在校大学生一枚&#xff0c;已拿多个前端 offer&#xff08;秋招&#xff09; &#x1f680;未…