tap #
- TAP:模拟以太网设备,处理 二层帧 (含 MAC 头),适用于桥接、虚拟交换机等场景。
- TUN:模拟点对点设备,处理 三层 IP 包 (无 MAC 头),适用于路由、VPN 隧道(如 OpenVPN)。
作为网络设备,tap/tun 也需要配套相应的驱动程序才能工作。
tap/tun 驱动程序包括两个部分
字符设备
驱动- 字符驱动负责数据包在内核空间和用户空间的传送
网卡
驱动- 网卡驱动负责数据包在 TCP/IP 网络协议栈上的传输和处理
tap / tun 对应的字符设备文件分别为:
- tap:
/dev/tap0
- tun:
/dev/net/tun
- tap:
物理网卡一端是连接物理网络,而 tap/tun 虚拟网卡一般连接到用户空间。
基于上图,我们看看数据包的流程:
应用程序 A 构造数据包,目的 IP 是 192.168.1.1,通过 socket A 将这个数据包发给协议栈。
协议栈根据数据包的目的 IP 地址,匹配路由规则,发现要从 tun0 出去。
tun0 发现自己的另一端被应用程序 B 打开了,于是将数据发给程序 B.
程序 B 收到数据后,做一些跟业务相关的操作,然后构造一个新的数据包,源 IP 是 eth0 的 IP,目的 IP 是 10.1.1.0/24 的网关 10.1.1.1,封装原来的数据的数据包,重新发给协议栈。
协议栈再根据本地路由,将这个数据包从 eth0 发出。
后续步骤,当 10.1.1.1 收到数据包后,会进行解封装,读取里面的原始数据包,继而转发给本地的主机 192.168.1.1。当接收回包时,也遵循同样的流程。
在这个流程中,应用程序 B 的作用其实是利用 tun0 对数据包做了一层隧道封装。其实 tun 设备的最大用途就是用于隧道通信的。
创建 tap / tun 设备:
ip tuntap add dev tap0 mod tap # 创建 tap
ip tuntap add dev tun0 mod tun # 创建 tun
# 创建 tap 接口:
# 等价于 tunctl -p
tunctl
# 创建 tun 接口:
tunctl -n
删除 tap / tun 设备:
ip tuntap del dev tap0 mod tap # 删除 tap
ip tuntap del dev tun0 mod tun # 删除 tun
推荐使用
ip tuntap
,一个是因为iproute2
更全更新,已经逐步在替代老旧的一些工具,另一个是因为 tunctl 在某些 Debian 类的系统上支持不全。
叶王 © 2013-2024 版权所有。如果本文档对你有所帮助,可以请作者喝饮料。