2

我可以看到很多程序,如 openvpn 和 Teamviewer,它们的 VPN 连接在 Windows 上创建了一个虚拟网络连接。我想为自己创建一个用于测试目的。

是否可以通过编程方式创建一个?

4

2 回答 2

3

听起来您正在寻找 Tap-Win32 驱动程序。它是 Windows 上的 OpenVPN 驱动程序,用于创建您所看到的虚拟界面,实际上是OpenVPN 软件包的一部分。这个子系统也可用于许多 *nixes。

此 TAP 驱动程序的接口在所有操作系统上大致相同。您打开一个特殊文件,并将原始以太网帧写入此文件。然后驱动程序将这些帧插入到虚拟接口中。相反,在虚拟接口上传输的任何数据包都可以作为原始以太网帧从特殊文件中读取。

大多数实现还有一个 TUN 模式,它在第 3 层而不是第 2 层运行。因此,您将读取原始 IP、IPv6 等数据包而不是以太网帧。

我在 Windows 上没有这方面的经验,所以我在这里快速浏览一下源代码。OpenVPN 在 tun.c 函数 open_tun 中完成了大部分这些步骤。您会发现此函数的多个定义,但它们是针对不同操作系统的#ifdef(因此请搜索 CreateFile)。这似乎在 Windows 上运行的基本方式是:

  1. 在启动任何操作 TAP 接口的应用程序之前,会预先创建一个或多个虚拟接口(由安装程序?)。这些接口一开始是断开的。
  2. 您的应用程序启动并在“\\.\Global\GUID.tap”上执行特殊的 CreateFile 调用。其中 GUID 替换为描述特定虚拟接口的 GUID。虚拟接口可以在注册表项中迭代,该注册表项在 OpenVPN 源代码的“tap-win32\common.h”中定义为 ADAPTER_KEY。
  3. 您的应用程序可能会执行一些 DeviceIoControl 调用。OpenVPN 多次使用它来获取驱动程序版本、获取 MTU、设置 TUN 模式和其他杂项。
  4. 此时,该界面可能在 Windows 中显示为已连接,您甚至可能正在读取您已经从 Windows 本身接收到的 DHCP 请求。OpenVPN 使用 Windows 网络 API 的其他部分通过大量的 hoopla 配置接口,但这并不特定于 TAP 驱动程序。

因此,虽然 API 实际上只是一个特殊文件,因此相当简单,但实际管理接口还有很多工作要做。但如果你只是为了测试,这可能就足够了。然后,您可以在 Windows 中手动配置您的测试界面。

于 2009-12-05T15:42:33.960 回答
0

MSDN Ras 拨号功能

这可能是朝着正确方向迈出的一步?

从页面:

除了使用点对点协议 (PPP) 的传统远程访问连接之外,远程访问服务 (RAS) 还支持虚拟专用网络 (VPN) 连接。在 VPN 连接中,VPN 数据包被封装在 IP 数据包中并通过 IP 网络(例如 Internet)发送。因此,访问 IP 网络是建立 VPN 连接的必要条件。如果客户端计算机与 IP 网络具有始终在线的连接,例如与 IP LAN 的连接,则客户端可以使用对 RasDial 函数的单个调用来建立 VPN 连接。

于 2009-12-01T02:29:45.447 回答