OVPN-DCO-WIN代表“ Windows的OpenVPN数据频道卸载”。它是一个现代的Windows驱动程序,可充当虚拟网络适配器,并实现所需的功能来处理OpenVPN数据通道。当使用OVPN-DCO胜利时,OpenVPN软件不会在用户和内核空间之间来回发送数据流量(用于加密,解密和路由),但是在Windows内核中进行有效负载的操作。驾驶员正在使用现代框架-WDF和NetAdaptercx开发。因此,代码更容易阅读和维护与现有的NDIS微型驱动程序的比较。在速度方面,新驱动程序的性能与Tap-Windows 6的比较要好得多,因此它应该消除瓶颈,从而阻碍窗户上的OpenVPN的性能。
OVPN-DCO-WIN是从OpenVPN 2.6开始的默认驱动程序。
您只需安装最新的OpenVPN 2.6版本,其中包括签名驱动程序。
另外,您可以从Github获得发行版。
您可以使用DevCon工具(作为WDK的一部分)安装驱动程序:
devcon install ovpn-dco.inf ovpn-dco
该项目包括OVPN-DCO-CLI命令行工具,该工具可作为开发测试床,参考客户端和API使用示例。因此,您可以使用OVPN-DCO Linux项目的./ovpn-Cli工具在两个Windows主机之间或Windows和Linux主机之间设置VPN隧道。
要设置Windows <-> Windows隧道,在第一次主机运行时:
ovpn-dco-cli.exe udp i4 0.0.0.0 1194 192.168.100.200 1194 10.8.0.2 255.255.255.0 10.8.0.1 data64.key 0
其中“ 0.0.0.0 1194”本地IP地址/端口以绑定套接字,” 192.168.100.200 1194“远程地址/端口,” 10.8.0.2“是本地VPN IP。
在第二个Windows主机上运行:
ovpn-dco-cli.exe udp i4 0.0.0.0 1194 192.168.100.100 1194 10.8.0.1 255.255.255.0 10.8.0.1 data64.key 1
请注意,远程IP,VPN IP和密钥方向(最后0/1数字)不同。
要在Windows和Linux之间设置隧道,请在第二个(Linux)主机上运行:
# ip link add dev ovpn0 type ovpn-dco
# ip link set ovpn0 up
# ip link set mtu 1428 dev ovpn0
# ip addr add dev ovpn0 10.8.0.1/24
# tests/ovpn-cli ovpn0 new_peer 1194 0 192.168.100.100 1194 10.8.0.2
# tests/ovpn-cli ovpn0 new_key 0 aes 1 tests/data64.key
其中192.168.100.150是Linux主机IP地址,192.168.100.100是Windows主机IP地址。
建立隧道后,您应该能够ping主机(10.8.0.1 <-> 10.8.0.1)并运行IPERF测试(在第一个主机上,IPERF3 -S 10.8.0.2,IPERF3 -C 10.8.0.2 )通过VPN隧道。
请注意,在生产中使用OVPN-DCO-CLI工具是一个非常糟糕的主意,因为它不执行任何密钥谈判并使用静态密钥(Data64.key)。
要使用驱动程序,客户需要通过调用CreateFile来获取文件句柄。可以使用符号链接或设备接口获取文件路径。这是OVPN-DCO工具的示例(请参见下文):
HANDLE h = CreateFileA("\\.\ovpn-dco", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM | FILE_FLAG_OVERLAPPED, NULL);
处理后,客户端使用设备iocontrol并读取/写入调用来设置连接并发送/接收控制数据包。有关如何使用这些命令的ioctl命令列表,请参见UAPI.H。
首先,客户端需要使用ovpn_ioctl_new_peer命令初始化对等。客户端通过OVPN_NEW_PEER结构,其中包含本地/远程IP地址/端口(IPv4或IPv6)和传输协议(TCP或UDP)。
初始化对等式后,客户端传递的密码算法(支持为“无”和“ AES-GCM”),使用OVPN_IOCTL_NEW_KEY命令使用OVPN_CRYPTO_DATA结构的一部分,加密密钥和PEER-ID作为OVPN_CRYPTO_DATA结构的一部分。 OpenVPN加密的描述超出了本文档的范围。
设置加密后,客户端可以通过OVPN_IOCTL_SET_PEER命令为会话设置keepalive参数(OVPN_SET_PEER struct)。内部间隔定义了在没有传出数据流量的情况下发送特殊库存数据包的频率。在没有传入的数据流量的情况下,Keepalive超时定义何时通知用户空间(通过错误完成读取请求)。
要启动VPN会话,客户端发送OVPN_IOCTL_START_VPN命令。此信号驱动程序启动网络适配器。
启动VPN会话后,客户端设置网络适配器(IP地址,NetMask,网关)和路由。
要发送和接收控制频道数据包,客户端使用读/写入调用。建议通过将file_flag_overplapped传递到创建呼叫和重叠结构以读取/写入呼叫来使用重叠的io。 OVPN-DCO-CLI使用ASIO,它抽象了这些低级细节。
OVPN-DCO-WIN驱动程序默认使用OpenVPN从2.6版本开始。
OpenVPN3还支持最新的Master分支中的OVPN-DCO-WIN。
日志记录是通过基于ETW的Traceloging API进行的。要在目标计算机上查看日志:
traceview.exe
作为管理员4970F9cf-2c0c-4f11-b1cc-e3a1e9958833
>确定收集日志以进行分析:
wpr -start ovpn-dco-win.wprp
(wprp文件在驱动程序源树中)wpr -stop ovpn-dco-win.etl
例如,可以通过Windows Performance Analyzer( wpa.exe
)打开ETL文件。
要查看随附的DebBuger(WINDBG)中的登录,请在管理员命令提示中使用tracelog.exe
:
tracelog -start MyTrace -guid #4970F9cf-2c0c-4f11-b1cc-e3a1e9958833 -rt -kd
如果您遇到启动问题,则可能需要启用自动学会。运行ovpn-dco-autologger.reg
文件,该文件将创建Neccessary注册表键,然后重新启动。
驱动程序日志将存储在%SystemRoot%System32LogFilesWMIovpn-dco.etl
中。
OVPN-DCO-WIN的释放构建是可重现的,这意味着当您使用相同的构建环境时,您应该获得完全相同的OVPN-DCO.Sys二进制。这样,您可以验证以二进制形式发布的驱动程序确实是从该存储库中的源代码编译的。这很有用,因为微软的驾驶员签名要求使运行自相编译的驱动程序变得困难。
已发布的驱动程序是使用Windows 11 EWDK(企业Windows驱动程序套件)构建的。尽管有名称,但它也可以在Windows 10上使用。您可以在此处下载:https://docs.microsoft.com/en-us/windows-hardware/drivers/download-the-wload-the-wdk
如果您获得了ovpn-dco.sys文件,则可以如下验证它:
signtool remove /s ovpn-dco.sys
LaunchBuildEnv.cmd
。msbuild /p:platform=<arch> /p:configuration=release /p:signmode=off ovpn-dco-win.vcxproj /t:Build
Where <arch>
是Win32
, x64
, ARM
或ARM64
。<arch>/Release/ovpn-dco.sys
和步骤1的文件具有相同的SHA256哈希。请联系lev stipakov [email protected](#OpenVPN-Devel)