写点什么

滴普技术荟 - 云原生基座 OpenKube 开放容器实践(六):理解 linux 虚拟网络设备 tun

发布于: 2021 年 02 月 20 日
滴普技术荟-云原生基座OpenKube开放容器实践(六):理解linux虚拟网络设备tun

tun 是 linux 的另一种虚拟网络设备,与前面讲过的 veth 类似,只是另一端连的不一样,veth 设备是一端连着内核协议栈,另一端连着另一个 netns 的协议栈;而 tun 设备是一端连着内核协议栈,另一端连接着一个用户程序,任何时候从协议栈发到 tun 网卡的数据都能从用户程序中读到,而从用户程序写入/dev/net/tun 的数据都会被内核协议栈收到。

 

当我们通过程序打开/dev/net/tun 设备时,就会发现我们的主机上多了一张网卡,打开多次会新增多张网卡,命名依次为 tun0/tun1/tun2....,我们读写 tun 网卡的方式与正常读写一个文件一样,下面通过示例来了解一下。

 

首先编写一个 c 程序,文件名为 tun.c,代码如下:



然后编译并执行:


然后从另一个终端打开并查看网卡:



发现已经多了一张 tun0 的网卡,我们给这个网卡配上地址,然后启动起来


注意我们给 tun0 配上地址时,主机上会多一条路由

 

最后,ping 一下 192.168.100.101,正常应该没有回应,但观察打开的第一个终端,发现有收到数据包:


可以看到,我们的用户程序已经收到了 ICMP 包,注意这里 PING 的不是我们给 tun0 设置的地址,如果你去 ping tun0 的地址 192.168.100.100,会发现有正常的 ICMP 包回应,而终端 1 却什么也没收到,为什么要 PING 一个不存在的地址才行呢?让我们来捋一捋:


我们在主机上 ping tun0 的地址,进入协议栈后,在 ROUTING 判决时,发现这是本机地址,于是从 lo 网卡发送出去了,所以 tun0 永远也收不到这个包,要想让 tun0 收到包,要 ping 一个和 tun0 同网段的地址,因为这样才会让协议栈让这个包从 tun0 发出去,另一端是我们的程序,我们的程序啥也没干,只是打印了一下结果,所以 ping 的那一端不会有回应。

 

了解更多信息请登录:https://www.deepexi.com/bbs/developer-bbs


发布于: 2021 年 02 月 20 日阅读数: 21
用户头像

还未添加个人签名 2020.12.22 加入

滴普科技2048实验室致力于探索科技未知,以点滴努力,普惠科技为驱动力,立足于数据智能、创新性技术和应用技术的研究院。

评论

发布
暂无评论
滴普技术荟-云原生基座OpenKube开放容器实践(六):理解linux虚拟网络设备tun