我最近发现了 Linux TUN/TAP 接口的存在,并且仍在尝试理解它们。我想我明白了基本概念 - 创建模拟网络接口的伪设备,并且不是将数据传递到硬件,而是传递到用户空间程序。
您将如何指导不相关的程序使用该隧道?
例如,在创建隧道之前,我的系统仅包含 eth0 和 lo、普通以太网接口(连接到我的本地网络)和环回接口。程序创建并配置隧道后,我有一个新接口 gr0,我给了它一个位于本地网络上的 IP 地址,但未使用(因此我们都在同一子网上)。我如何让一个不相关的程序利用这个“隧道”?假设我有一个简单的 Python 消息传递客户端/服务器应用程序,它利用 TCP 连接,我如何配置它以使用隧道?
如果我错过了一些基本的东西,我深表歉意,但像往常一样,我在事情的计划中使自己感到困惑。同样,我想要的只是让一个简单的 TCP 程序利用这个隧道。
谢谢!
答案1
它并不总是“隧道”。 TUN/TAP只是特定的网卡驱动程序。从网络堆栈的角度来看,它们充当任何其他网络接口:它们可以具有 IP 地址,可以是点对点或广播接口。路由规则也适用于它们。但是,写入该网络接口之一的所有流量都会进入某个用户空间程序进行处理,并且由用户空间程序直接写入的所有数据看起来/dev/tunX
都像是网络堆栈的传入数据包。
在通常的隧道设置中,服务器和客户端都有分配了地址的 TUN 设备。两者上配置的路由表将所需流量定向到该 TUN 设备。当数据包路由到 tun0 时,内核将其发送到用户空间程序(客户端),用户空间程序通过 TCP 连接等方式将该数据包发送到远程计算机(服务器)上的其他程序。在远程计算机上,其他程序(服务器)从客户端接收数据包并将其写入自己的/dev/tunX
设备,将该数据包“注入”到网络堆栈中。隧道数据包的处理方式与其他数据包一样。