linux Tun/Tap 原理

tun0是一个Tun/Tap虚拟设备,从上图中可以看出它和物理设备eth0的差别,它们的一端虽然都连着协议栈,但另一端不一样,eth0的另一端是物理网络,这个物理网络可能就是一个交换机,而tun0的另一端是一个用户层的程序,协议栈发给tun0的数据包能被这个应用程序读取到,并且应用程序能直接向tun0写数据

这里假设eth0配置的IP是10.32.0.11 (外网地址),而tun0配置的IP是192.168.3.11 (内网地址).

这里列举的是一个典型的tun/tap设备的应用场景,发到192.168.3.0/24网络的数据通过程序B这个隧道,利用10.32.0.11发到远端网络的10.33.0.1,再由10.33.0.1转发给相应的设备,从而实现VPN。

下面来看看数据包的流程:

  1. 应用程序A是一个普通的程序(比如是一个浏览器想通过vpn访问内网),通过socket A发送了一个数据包,假设这个数据包的目的IP地址是192.168.3.1 (内网地址)

  2. socket将这个数据包丢给协议栈

  3. 协议栈根据数据包的目的IP地址,匹配本地路由规则,知道这个数据包应该由tun0出去,于是将数据包交给tun0

  4. tun0收到数据包之后,发现另一端被进程B打开了,于是将数据包丢给了进程B

  5. 进程B收到数据包之后,做一些跟业务相关的处理,然后构造一个新的数据包,将原来的数据包嵌入在新的数据包中,最后通过socket B将数据包转发出去,这时候新数据包的源地址变成了eth0的地址,而目的IP地址变成了一个其它的地址,比如是10.33.0.1.

  6. socket B将数据包丢给协议栈

  7. 协议栈根据本地路由,发现这个数据包应该要通过eth0发送出去,于是将数据包交给eth0

  8. eth0通过物理网络将数据包发送出去

10.33.0.1收到数据包之后,会打开数据包,读取里面的原始数据包,并转发给本地的192.168.3.1,然后等收到192.168.3.1的应答后,再构造新的应答包,并将原始应答包封装在里面,再由原路径返回给应用程序B,应用程序B取出里面的原始应答包,最后返回给应用程序A

参考文章

Linux虚拟网络设备之tun/tap - SegmentFault 思否

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux TUN/TAP设备是一种虚拟网络设备,它能够模拟一个网络接口。通过TUN/TAP设备,用户空间的程序可以像操作物理网络设备一样,发送和接收网络数据包。 TUN/TAP设备主要有两种模式:TUN模式和TAP模式。TUN模式主要用于IP层协议,TAP模式主要用于以太网层协议。两种模式的差异在于数据包的处理方式不同。 在Linux内核中,TUN/TAP设备的实现位于`drivers/net/tun.c`文件中。该文件中定义了一个名为`tun_net`的网络设备对象,并实现了`tun_chr_write_iter()`、`tun_chr_read_iter()`等函数,用于处理用户空间和内核空间之间的数据交互。 当用户空间的程序打开TUN/TAP设备时,会创建一个名为`tunX`的虚拟接口,其中`X`是一个数字,表示设备的编号。内核会将数据包发送到该虚拟接口,然后用户空间的程序可以通过读取该接口的文件描述符来接收数据包。同样地,用户空间的程序可以通过写入该接口的文件描述符来发送数据包。 TUN/TAP设备的实现使用了内核中的网络协议栈,因此它能够与其他网络设备无缝交互。用户空间的程序可以使用标准的套接字接口来与TUN/TAP设备进行通信,实现虚拟网络设备和物理网络设备之间的数据交换。 总之,TUN/TAP设备是一个非常有用的工具,它可以用于各种网络应用程序,如虚拟私有网络(VPN)和网络隧道。通过了解TUN/TAP设备的实现,我们可以更好地理解网络协议栈和Linux内核的工作原理

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值