tap

tap #

  • TAP​​:模拟以太网设备,处理 ​​ 二层帧 ​​(含 MAC 头),适用于桥接、虚拟交换机等场景。
  • TUN​​:模拟点对点设备,处理 ​​ 三层 IP 包 ​​(无 MAC 头),适用于路由、VPN 隧道(如 OpenVPN)。

  • 作为网络设备,tap/tun 也需要配套相应的驱动程序才能工作。

  • tap/tun 驱动程序包括两个部分

    • 字符设备驱动
      • 字符驱动负责数据包在内核空间和用户空间的传送
    • 网卡驱动
      • 网卡驱动负责数据包在 TCP/IP 网络协议栈上的传输和处理
  • tap / tun 对应的字符设备文件分别为:

    • tap: /dev/tap0
    • tun: /dev/net/tun
  • 物理网卡一端是连接物理网络,而 tap/tun 虚拟网卡一般连接到用户空间。

基于上图,我们看看数据包的流程:

  1. 应用程序 A 构造数据包,目的 IP 是 192.168.1.1,通过 socket A 将这个数据包发给协议栈。

  2. 协议栈根据数据包的目的 IP 地址,匹配路由规则,发现要从 tun0 出去。

  3. tun0 发现自己的另一端被应用程序 B 打开了,于是将数据发给程序 B.

  4. 程序 B 收到数据后,做一些跟业务相关的操作,然后构造一个新的数据包,源 IP 是 eth0 的 IP,目的 IP 是 10.1.1.0/24 的网关 10.1.1.1,封装原来的数据的数据包,重新发给协议栈。

  5. 协议栈再根据本地路由,将这个数据包从 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 类的系统上支持不全。


本文访问量

本站总访问量

本站总访客数