我试图了解不同类型的(虚拟)接口(例如 TUN/TAP、veth 等)之间的区别,并在容器的上下文中研究其中一些类型。
是否可以仅使用 TUN/TAP 接口在容器(在其自己的网络名称空间中)向主机的网络名称空间发送数据包,或者是否需要一对 veth(每个名称空间中的一端)来执行此操作?
据我了解,TUN/TAP 接口只能用于从/从该接口的网络命名空间对应的网络堆栈向/从用户空间发送/接收数据包,而不能在网络命名空间之间发送数据包。这个对吗?
我试图了解不同类型的(虚拟)接口(例如 TUN/TAP、veth 等)之间的区别,并在容器的上下文中研究其中一些类型。
是否可以仅使用 TUN/TAP 接口在容器(在其自己的网络名称空间中)向主机的网络名称空间发送数据包,或者是否需要一对 veth(每个名称空间中的一端)来执行此操作?
据我了解,TUN/TAP 接口只能用于从/从该接口的网络命名空间对应的网络堆栈向/从用户空间发送/接收数据包,而不能在网络命名空间之间发送数据包。这个对吗?
tun/tap 接口始终属于某个应用程序:发送到该接口的数据包被应用程序读取,应用程序写入的数据包通过该接口进入内核网络堆栈。
通常,您将使用虚拟以太网对 (veth) 连接网络命名空间。他们只是将数据包转发到该对的另一个接口。
没有什么能阻止您编写一个完全执行此操作的应用程序:打开两个 tun/tap 接口,从一个读取数据包并将其转发到另一个,反之亦然。您还可以使用现成的应用程序来执行此操作,例如
socat
.你甚至可以编写两个应用程序,每个应用程序都打开一个 tun/tap 接口,应用程序之间使用其他方式进行通信,并以这种方式实现转发。基本上所有 VPN 应用程序都以这种方式工作(尽管对于 VPN 应用程序“通过其他方式”通常是“通过现有网络连接”,所以它并不算数)。
所以是的,使用正确的应用程序,您可以将命名空间与 tun/tap 接口连接起来。但是,通常这样做并没有多大意义,因为您必须编写这样的应用程序,而且它的效率会低于仅使用 veth-pair。
编辑
我尝试将一个 tun 接口移动
socat
到ns0
我创建的网络命名空间中,尽管socat
在主网络命名空间中运行,但它可以正常工作:然后您必须再次设置
tun0b
移动后的地址。因此,“交叉”是通过将一个(或两个)tun/tap 网络接口置于与进程不同的命名空间中而发生的。