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)