# tun/tap

tun/tap 是 linux 提供的一种用户空间网络的特性。它允许用户空间的程序看见原始网络流量（在 ethernet 或 ip 层），并可以对这些网络流量进行操作。

tun 设备和 tap 设备有什么不同呢？

tun 设备的输出是 ip 数据包。典型的应用场景就是做 ip 通道，比如下图中 OpenVPN 的实现：

![图1. OpenVPN 使用 tun 设备](https://2865871795-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M5vy-1hCf-joDzM5tqK%2F-M6K0Ulu3-vJM_uC7-PQ%2F-M6KHltGkE3On1MOHKP3%2Ftun-use-case-openvpn.png?alt=media\&token=59f31b86-3649-43ce-afd4-73690755adb4)

Host A 用户空间的程序的数据包被转发到 tun0 设备上，然后被 OpenVPN 读取出来加密，最后从 eth0 出去，到达 Host B。Host B 上的 OpenVPN 从 eth0 读取并解密，并通过 tun0 传输到用户空间的程序。

tap 设备的输出是 ethernet 帧。通常可以用在虚拟网络上。虚拟机通过 tap 设备来读取 ethernet 帧，从而可以在链接层连接到物理网络上。如下图所示：

![图2 tap 在虚拟机网络上的使用案例](https://2865871795-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M5vy-1hCf-joDzM5tqK%2F-M6K0Ulu3-vJM_uC7-PQ%2F-M6N145HFYdVjaxw468Q%2Ftap-use-case.png?alt=media\&token=965779e0-9375-4cea-97a7-fc3ecf1a3819)

### 参考资料

* \[Tun/Tap Interface]\(<https://hechao.li/2018/05/21/Tun-Tap-Interface/>)
* \[Tun/Tap interface tutorial]\(<https://backreference.org/2010/03/26/tuntap-interface-tutorial/>)
