Linux中的虚拟网络设备

时间:2014-09-03 10:08:55

标签: linux networking virtual tap

有人可以详细解释一下veth对和tap接口的区别以及这些设备如何连接到linux bridge或openvswitch。

我发现了这个: " Veth是一对特殊的网络设备,我认为它是改变流量方向的一种方法,也就是说,当从Linux协议栈向veth设备发送out方向流量时,它被发送到另一个镜像设备,因此镜像将其视为一个方向流量并将其放回Linux协议栈以供进一步使用。

Tap设备是逻辑网络设备,但与任何其他设备不同:它允许用户空间程序直接将流量注入Linux协议栈,以及它可以从堆栈中检索流量。它在用户空间的2级(或3级的tun设备)打开了一个到Linux协议栈的隧道,堆栈将把用户空间的数据视为方向流量"

但它并没有给我全局。

提前感谢!

2 个答案:

答案 0 :(得分:15)

使用ip tuntap创建的Linux tap接口不能用于将网络命名空间连接到linuxbridges或openvswitch,因此我们需要依赖于veth对。

虚拟以太网接口成对出现,它们像管子一样连接 - 一个veth接口中出现的任何东西都会出现在另一个对等的veth接口上。 因此,您可以使用veth接口通过“默认”或“全局”命名空间将网络命名空间连接到外部世界 接口存在。

TAP设备(如vnet0)是虚拟机管理程序(如KVM和Xen)实现虚拟网络接口卡(通常称为VIF或vNIC )的方式。 发送到TAP设备的以太网帧由客户操作系统接收。

答案 1 :(得分:13)

这些虚拟网络工件的目的是类似的。但是存在微妙的差异,因此它们在不同的情况下使用:

  1. TAP :用户空间应用程序/ VM可以读取或写入以太网帧到tap接口,它将到达主机内核,在那里它将像任何其他以太网一样处理通过物理(例如eth0)端口到达内核的帧。您可以将其添加到软件桥(例如linux-bridge)

  2. VETH :当您尝试连接两个想要“掌握”(缺少更好的短语)的实体时,通常会使用转发/接收帧的接口。这些实体可以是容器/桥/ ovs-switch等。假设您要将docker / lxc容器连接到OVS。您可以创建一个veth对并将第一个接口推送到docker / lxc(例如,作为phys接口),并将另一个接口推送到OVS。你不能用TAP做到这一点。

  3. 请注意,我们不应该误解我们需要使用VETH而不是在使用OVS时点击。我们总是可以在OVS中创建内部端口,其行为与tap接口完全相同。但这并不总是可行的,例如当您想要连接到无法合成类似tap的界面的实体时。即:

    $ ovs-vsctl add-port ovs-switch-name tap0
    

    现在您可以使用tap0,就像我们使用tap接口一样。