如何从用户程序利用TUN / TAP隧道?


9

我最近发现了Linux TUN / TAP接口的存在,并且仍在尝试了解它们。我想我得到了基本概念-创建伪设备来模拟网络接口,而不是将数据传递给硬件,而是将其传递给用户空间程序。

您将如何引导无关的程序来利用此隧道?

例如,在创建隧道之前,我的系统仅包含eth0和lo,普通的以太网接口(连接到我的本地网络)和回送接口。程序创建并配置隧道后,我有了一个新接口gr0,该接口提供了一个位于本地网络上但未使用的IP地址(因此我们都在同一子网中)。我如何使不相关的程序利用此“隧道”?假设我有一个简单的Python消息传递客户端/服务器应用程序,该应用程序使用TCP连接,如何配置它以使用隧道?

如果我缺少一些基本知识,我深表歉意,但是像往常一样,我设法使自己迷失了。再说一次,我只想拥有一个使用此隧道的简单TCP程序。

谢谢!

Answers:


7

它并不总是“隧道”。TUN / TAP只是特定的NIC驱动程序。从网络堆栈的角度来看,它们充当任何其他网络接口:它们可以具有IP地址,可以是点对点或广播接口。路由规则也适用于它们。但是所有写入该网络接口之一的流量都将流向某个用户空间程序进行处理,而所有由用户空间程序写入的数据直接/dev/tunX看起来像是网络堆栈的传入数据包。

在通常的隧道设置中,服务器和客户端都为TUN设备分配了地址。在它们两个上配置的路由表将所需的流量定向到该TUN设备。当数据包路由到tun0时,内核将其发送到用户空间程序(客户端),该程序通过(例如)TCP连接将此数据包发送到远程计算机(服务器)上的其他程序。在远程计算机上,其他程序(服务器)从客户端接收数据包并将其写入其自己的/dev/tunX设备,然后将该数据包“注入”到网络堆栈中。隧道数据包将像其他任何数据包一样进行处理。


1
因此(出于我的目的)答案是配置路由表以将流量定向到这些接口。那就是我所缺少的重点,但是现在我应该能够找到解决方案。另外,我很欣赏这种解释,因为它可以解决所有问题。谢谢!
Shickadance先生11年

2
我最终使用了“ route add <TUN IP ADDR> dev gr0”。这使我可以通过新界面重定向流量。再次感谢!
Shickadance先生,2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.