Linux 使用ip tuntap命令点击接口和/dev/net/tun设备

Linux 使用ip tuntap命令点击接口和/dev/net/tun设备,linux,networking,network-programming,tap,tun,Linux,Networking,Network Programming,Tap,Tun,我正在使用ip-tuntap创建一个tap界面,如下所示: $ sudo ip tuntap add mode tap tap0 之后,我设置了接口,并使用公共IP命令对其进行寻址。然后,我可以通过一个简单的ifconfig查看我的界面并对其进行寻址 现在,一位老师告诉我,通过创建一个tap接口(在这种情况下称为tap0),我将找到一个/dev/net/tap0节点,我将能够在其中写入或读取它。然而,我找不到它。我“只是”有一个/dev/net/tun 我必须处理这个tun节点吗,或者我真的应

我正在使用
ip-tuntap
创建一个tap界面,如下所示:

$ sudo ip tuntap add mode tap tap0
之后,我设置了接口,并使用公共IP命令对其进行寻址。然后,我可以通过一个简单的
ifconfig
查看我的界面并对其进行寻址

现在,一位老师告诉我,通过创建一个tap接口(在这种情况下称为tap0),我将找到一个
/dev/net/tap0
节点,我将能够在其中写入或读取它。然而,我找不到它。我“只是”有一个
/dev/net/tun


我必须处理这个tun节点吗,或者我真的应该有一个tap0节点吗?

您需要使用命令激活该链接

ip链接已设置为0
之后你就可以使用它了。

这个问题已经问了很长时间了,但我认为发布一个实际答案以供将来参考是个好主意

Tap接口和tun接口都是内核中的tun/Tap设备驱动程序提供的虚拟接口。该驱动程序最初提供的唯一接口是问题中提到的字符设备
/dev/net/tun

通过发布:

$ sudo ip tuntap add mode tap tap0
我们指示
ip-tuntap
创建一个名为
tap0
的网络接口,正如我们所观察到的那样,通过对上述设备文件
/dev/net/tun
的正确调用来与底层的tun/TAP设备驱动程序进行对话

其中一个
ioctl(2)
调用(带有
TUNSETIFF
选项的调用,首先被调用)返回与创建的新虚拟接口相关联的文件描述符,该接口可供进程使用


总结起来:

我必须处理这个tun节点,还是我真的应该有一个tap0节点

/dev/net/tun
设备文件仅作为用户空间实用程序(如
iproute2
)创建tap和tun接口的起点。在这个问题的上下文中,没有必要处理它,因为
ip-tuntap
为我们做这项工作


任何额外的
/dev/net/tap0
设备文件都是不需要的,也不希望为使用tap接口的进程创建这些文件。

这对我不起作用,我认为需要更多解释为什么需要这些文件。当您描述您的案例、内核、模块等时,这会很好。自2013年以来,许多事情都发生了变化。也许您尝试在docker上实现此功能?“不需要或不希望为使用tap接口的进程创建任何额外的/dev/net/tap0设备文件。”为什么?如果没有设备文件或文件描述符,我将如何使用该设备?@VoidStar这取决于具体情况。正如您可能已经注意到的那样,如果您在我的回答中确实遵循了
ip tuntap
的源代码链接,那么如果您以编程方式创建tap接口,您实际上拥有一个文件描述符——它是通过
open(2)
打开
/dev/net/tun
设备并使用来执行相应的
ioctl(2)得到的
呼叫。如果不以编程方式创建它,则可以将tap接口视为网络接口,非常类似于
eth0
。是否需要文件描述符来“使用”
eth0
?如何“使用”网络接口?您可以将其连接到网桥,设置路由规则等。如果我使用
ip tuntap add
,我不会直接操作
/dev/net/tun
ioctl(2)
,因此我并不真正理解这是如何相关的。内核似乎知道该设备,但同样,用户空间程序如何访问它?@VoidStar任何其他进程都可以使用它,就像它使用主机上的其余网络接口一样。为tap接口分配一个地址,对其进行适当配置,例如设置路由规则、iptables规则等,并一如既往地使用它,例如使用套接字。与主机上的其他网络接口相比,以非编程方式使用tap接口没有什么特别之处。@VoidStar配置网络接口显然超出了原始问题的范围,但您可以在本网站或其他博客上找到大量关于它的资源,文章和论坛,当然还有手册页。如果你有一个特定的问题,如规则所建议的,请考虑发布一个新的问题。