【问题标题】:Virtual networking devices in LinuxLinux 中的虚拟网络设备
【发布时间】:2014-10-27 19:05:21
【问题描述】:
谁能详细解释一下 veth pair 和 tap 接口的区别以及这些设备是如何连接到 linux bridge 或 openvswitch 的。
我发现了这个:
“veth 是一种特殊的网络设备,它是成对创建的,我认为它是一种改变流量方向的方法,即当向外的流量从 Linux 协议栈发送到 veth 设备时,它会被发送到另一个它的镜像veth 设备,因此镜像设备将其视为方向流量并将其放回 Linux 协议栈以供进一步使用。
Tap 设备是逻辑网络设备,但与其他任何设备不同:它允许用户空间程序直接将流量注入 Linux 协议栈,也可以从堆栈中检索流量。它在用户空间的第 2 层(或第 3 层的 tun 设备)打开一条通往 Linux 协议栈的隧道,该协议栈会将来自用户空间的数据视为方向流量”
但它并没有给我完整的画面。
提前致谢!
【问题讨论】:
标签:
linux
networking
virtual
tap
【解决方案1】:
使用 ip tuntap 创建的 Linux tap 接口不能用于将网络命名空间附加到 linuxbridges 或 openvswitch,因此我们需要依赖 veth pair。
虚拟以太网接口成对出现,它们像管子一样连接在一起——一个 veth 接口中的任何东西都会从另一个对等 veth 接口中出来。
因此,您可以使用 veth 接口将网络命名空间通过“默认”或“全局”命名空间连接到外部世界,其中物理
接口存在。
TAP 设备(例如 vnet0)是 KVM 和 Xen 等管理程序实现虚拟网络接口卡(通常称为 VIF 或 vNIC)的方式。
客户机操作系统接收到发送到 TAP 设备的以太网帧。
【解决方案2】:
这些虚拟网络工件的目的是相似的。但存在细微差别,因此它们在不同的情况下使用:
TAP:用户空间应用程序/VM 可以读取或写入一个以太网帧到 tap 接口,它会到达主机内核,在那里它会像任何其他以太网一样被处理通过物理(例如 eth0)端口到达内核的帧。您可以将其添加到软件桥(例如 linux-bridge)
VETH:通常在您尝试连接两个实体时使用,这些实体想要“获取”(因为缺少更好的短语)一个接口来转发/接收帧。这些实体可能是容器/网桥/ovs-switch 等。假设您要将 docker/lxc 容器连接到 OVS。您可以创建一个 veth 对并将第一个接口推送到 docker/lxc(例如,作为 phys 接口)并将另一个接口推送到 OVS。 TAP 无法做到这一点。
请注意,我们不应该误解我们需要使用 VETH 而不是在使用 OVS 时点击。我们总是可以在 OVS 中创建内部端口,其行为与 tap 接口完全相同。但这并不总是可行的,例如,当您想要连接到无法合成类似点击界面的实体时。即:
$ ovs-vsctl add-port ovs-switch-name tap0
现在您可以像我们使用点击界面一样使用tap0。