前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >tun设备的妙用-OpenV**篇全流程补充

tun设备的妙用-OpenV**篇全流程补充

作者头像
LanceZhang
发布2022-04-15 19:33:13
8950
发布2022-04-15 19:33:13
举报
文章被收录于专栏:二哥聊云原生二哥聊云原生

大家好,我是二哥。

这篇是对上一篇《tun设备的妙用-V**篇》的补充。有朋友问二哥能不能把 OpenV** server 端的细节也画出来。安排!

在这张图里,你会发现在server端那里也有一个 tun0 设备。为什么呢?因为它需要将解封后的原始请求写入 tun0 设备。借此途径,等于是将 client 端浏览器产生的原始请求释放出来,并利用路由表将其导向至企业内部的服务。1.11~1.14 画出了这样的过程。这里需要强调的是网络包从 1.13 的位置移动至 1.14 的时候,路由表在这其中起到了非常重要的作用,经过路由之后,这个网络包被直接 FORWARD 至 interface em2 并离开server。

这张图里的关键位置上,二哥画了不少序号。它们被分为两种颜色:

  • 红色部分,序号为 1.x,表示从浏览器发起请求到 OpenV** server 将这个请求导向到内部服务这个过程。
  • 蓝色部分,序号为 2.x,表示从 OpenV** server 收到内部服务的响应,到浏览器收到这个响应的过程。

在浏览器发起的原始请求里,source IP 是给 tun0 设置的IP地址,它是企业内部使用的一个私有 IP 地址。这也就意味着,在访问企业内部服务的场景里,source IP 和 dest IP 都是企业私有IP地址。例如source IP是 10.182.35.43,dest IP是 10.180.83.145,而OpenV** client 所在的电脑IP却是电信运营商分配的IP地址。

当这个请求在 internet 上传输的时候,就出现了和文章《特洛伊木马-图解VXLAN容器网络通信方案》相似的场景:包含私有 IP 的原始网络包被封装在另一个网络包里面,而后者可以在 internet 上正常传输。

当 OpenV** server 收到了网络包,从中解封出原始请求后,再通过自己的 tun0 设备将请求释放出来,并将其导向企业内部。

如果把包含私有IP的原始浏览器请求比作私家车,而 internet 比作琼州海峡的话,这个过程像极了我们在琼州海峡的广州这端把车开进轮渡,到海南岛那端把车再开出来。

tun设备是一个网络设备

需要注意的是在这张图中,我将 tun 设备画在了链路层,因为它本质上还是一个网络设备,它的代码位于 drivers/net/tun.c 。既然是网络设备,那么始于应用层的数据发送流程,包括经过 socket 层、传输层、 IP 层、邻居子系统、网络设备子系统再到调用 tun.c 里面的 tun_net_xmit() 启动最终的驱动层数据发送工作,一步都不能少。

网上有不少图是直接将tun设备画在IP层的,二哥觉得这样画虽然可以形象地说明tun设备和IP层的密切关系( tun 设备和 IP frame 打交道,而 tap 设备与 Ethernet frame 打交道),但也会给人一种误导,让人误以为tun设备位于IP层。

思考再三,我还是决定遵循tun设备的本质和它该处的位置来画这张图。

IP层发给tun设备的数据包

同时因为 tun 设备又是一个 POINTOPOINT 设备,故数据发送过程中不会有 ARP 流程。如下图的 tcpdump 内容所示,tun 设备从上一层(网络设备子系统)收到的数据里 MAC 层只有4个字节,这里的2表示AF_INET。

Wireshark用 "Null/Loopback" 表示 "address family"/"protocol family" 。包含 Null 字样,是因为历史原因:大部分 BSD OS 上的loopback设备在链路层都称为 null 协议。感兴趣的同学可以参考https://wiki.wireshark.org/NullLoopback。Null 它不是说没有 MAC 层,相反是有4个字节的。2表示 address family AF_INET。

tun设备和用户态通信的数据包

那么另一个问题来了,tun 设备发往应用层的数据包的格式是什么呢?

这取决于应用层在打开"/dev/net/tun"的时候,是否会通过 ioctl() 设置 flag IFF_NO_PI。这里的 PI 是 Protocol Information 的缩写,一共4个字节。

数据格式如下图所示。其中protocol部分为skb->protocol。你也看到了,这不是标准的 ethernet frame 。但它所携带的 IP layer frame 是标准的,所以在 server 端 1.11 ~ 1.13 这个路径上,可以直接将解封后得到的 IP frame (包含客户端浏览器原始请求)送进三层进行处理。真是精妙和精巧的设计啊。

如果设置了 NO PI 的话,就表示说不需要加 Protocol Information ,在这种情况下,无论是 tun 设备送往应用层的数据还是从应用层接收到的数据,都会剥离掉4字节的PI头,只剩下 IP layer frame 了,这也就是为什么我们说tun设备是和 IP frame 打交道的。这个剥离工作是在 drivers/net/tun.c 里面完成的。

以上就是本文的全部内容。

本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-03-26,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 二哥聊云原生 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • tun设备是一个网络设备
  • IP层发给tun设备的数据包
  • tun设备和用户态通信的数据包
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com