OVPN-DCO-WIN ย่อมาจาก "OpenVPN Data Channel Offload สำหรับ Windows" มันเป็นไดรเวอร์ Windows ที่ทันสมัยซึ่งทำหน้าที่เป็นอะแดปเตอร์เครือข่ายเสมือนจริงและใช้ฟังก์ชันการทำงานที่จำเป็นเพื่อจัดการช่องข้อมูล OpenVPN เมื่อใช้ OVPN-DCO-WIN ซอฟต์แวร์ OpenVPN จะไม่ส่งการรับส่งข้อมูลไปมาระหว่างพื้นที่ผู้ใช้และเคอร์เนล (สำหรับการเข้ารหัสการถอดรหัสและการกำหนดเส้นทาง) แต่การดำเนินการเกี่ยวกับน้ำหนักบรรทุกเกิดขึ้นในเคอร์เนล Windows คนขับกำลังได้รับการพัฒนาโดยใช้เฟรมเวิร์กที่ทันสมัย - WDF และ NetAdapterCx ด้วยเหตุนี้รหัสจึงง่ายต่อการอ่านและรักษาเปรียบเทียบกับไดรเวอร์ NDIS Miniport ที่มีอยู่ ความเร็วที่ชาญฉลาดไดรเวอร์ใหม่ทำงานได้ดีขึ้นอย่างมีนัยสำคัญเมื่อเทียบกับ tap-windows6 ดังนั้นจึงควรกำจัดคอขวดซึ่งเป็นอุปสรรคต่อประสิทธิภาพของ OpenVPN บน Windows
OVPN-DCO-WIN เป็นไดรเวอร์เริ่มต้นที่เริ่มต้นจาก OpenVPN 2.6
คุณสามารถติดตั้ง OpenVPN 2.6 ล่าสุดซึ่งรวมถึงไดรเวอร์ที่ลงนาม
หรือคุณอาจได้รับการเผยแพร่จาก GitHub
คุณสามารถใช้เครื่องมือ DevCon (มีอยู่เป็นส่วนหนึ่งของ WDK) เพื่อติดตั้งไดรเวอร์:
devcon install ovpn-dco.inf ovpn-dco
โครงการรวมถึงเครื่องมือบรรทัดคำสั่ง OVPN-DCO-CLI ซึ่งทำงานเป็นเตียงทดสอบการพัฒนาไคลเอนต์อ้างอิงและตัวอย่างการใช้ API ด้วยการที่คุณสามารถตั้งค่าอุโมงค์ VPN ระหว่างโฮสต์ Windows สองโฮสต์หรือระหว่างโฮสต์ Windows และ Linux โดยใช้เครื่องมือ ./OVPN-CLI จากโครงการ OVPN-DCO Linux
ในการตั้งค่า Windows <-> Windows Tunnel บนโฮสต์ครั้งแรกรัน:
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 เป็นที่อยู่ IP ของ Linux Host, 192.168.100.100 เป็นที่อยู่ IP ของโฮสต์ Windows
หลังจากที่คุณสร้างอุโมงค์แล้วคุณควรจะสามารถ 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);
หลังจากได้รับการจัดการไคลเอนต์จะใช้อุปกรณ์เรียกใช้และการอ่าน/เขียนไฟล์เพื่อตั้งค่าการเชื่อมต่อและส่ง/รับแพ็คเก็ตควบคุม ดู UAPI.H สำหรับรายการคำสั่ง IOCTL และ OVPN-DCO-CLI.CPP เกี่ยวกับวิธีการใช้งานเหล่านั้น
ขั้นแรกไคลเอนต์ต้องเริ่มต้นเพียร์ด้วยคำสั่ง ovpn_ioctl_new_peer ไคลเอนต์ผ่านโครงสร้าง OVPN_NEW_PEER ซึ่งมีที่อยู่/พอร์ต IP ในท้องถิ่น/ระยะไกล (ทั้ง IPv4 หรือ IPv6) และโปรโตคอลการขนส่ง (TCP หรือ UDP)
หลังจากเริ่มต้นเพียร์ไคลเอ็นต์ผ่านอัลกอริทึมการเข้ารหัส (รองรับคือ "ไม่มี" และ "AES-GCM"), คีย์ crypto และ peer-id ซึ่งเป็นส่วนหนึ่งของโครงสร้าง OVPN_CRYPTO_DATA โดยใช้คำสั่ง OVPN_IOCTL_NEW_KEY คำอธิบายของ OpenVPN crypto อยู่นอกเหนือขอบเขตของเอกสารนี้
หลังจากตั้งค่า crypto ไคลเอ็นต์อาจตั้งค่าพารามิเตอร์ Keepalive (OVPN_Set_Peer struct) สำหรับเซสชันผ่านคำสั่ง OVPN_IOCTL_SET_PEER ช่วงเวลา Keepalive กำหนดความถี่ในการส่งแพ็คเก็ต Keepalive พิเศษในกรณีที่ไม่มีการรับส่งข้อมูลขาออก Timeout Keepalive กำหนดเวลาที่จะแจ้งให้ผู้ใช้สเปซ (โดยการกรอกคำขออ่านด้วยข้อผิดพลาด) ในกรณีที่ไม่มีทราฟฟิกข้อมูลขาเข้า
ในการเริ่มต้นเซสชัน VPN ไคลเอนต์จะส่งคำสั่ง OVPN_IOCTL_START_VPN สัญญาณนี้ไดรเวอร์เพื่อเริ่มอะแดปเตอร์เครือข่าย
หลังจากเริ่มต้นเซสชัน VPN ไคลเอนต์จะตั้งค่าอะแดปเตอร์เครือข่าย (ที่อยู่ IP, Netmask, Gateway) และการกำหนดเส้นทาง
ในการส่งและรับแพ็คเก็ตช่องควบคุมไคลเอนต์ใช้การโทรอ่าน/เขียนไฟล์ ขอแนะนำให้ใช้ IO ที่ทับซ้อนกันโดยผ่าน file_flag_overlapped เพื่อสร้างการโทรและโครงสร้างที่ทับซ้อนกันไปยังการโทรอ่าน/writefile OVPN-DCO-CLI ใช้ ASIO ซึ่งสรุปรายละเอียดระดับต่ำเหล่านั้น
ไดรเวอร์ OVPN-DCO-WIN ใช้โดยค่าเริ่มต้น OpenVPN เริ่มต้นจากการเปิดตัว 2.6
OpenVPN3 ยังรองรับ OVPN-DCO-WIN ในสาขาหลักล่าสุด
การบันทึกจะดำเนินการผ่าน API tracelogging ซึ่งขึ้นอยู่กับ ETW หากต้องการดูบันทึกบนเครื่องเป้าหมาย:
traceview.exe
ในฐานะผู้ดูแลระบบ4970F9cf-2c0c-4f11-b1cc-e3a1e9958833
> ตกลงเพื่อรวบรวมบันทึกสำหรับการวิเคราะห์:
wpr -start ovpn-dco-win.wprp
(ไฟล์ WPRP อยู่ในแผนผังแหล่งข้อมูลไดรเวอร์)wpr -stop ovpn-dco-win.etl
ไฟล์ ETL สามารถเปิดได้เช่นโดย Windows Performance Analyzer ( wpa.exe
)
หากต้องการดูบันทึกใน Debbuger ที่แนบมา (WINDBG) ให้ใช้ tracelog.exe
ในพรอมต์คำสั่งผู้ดูแลระบบ:
tracelog -start MyTrace -guid #4970F9cf-2c0c-4f11-b1cc-e3a1e9958833 -rt -kd
หากคุณประสบปัญหาการบูตคุณอาจต้องการเปิดใช้งานเซสชัน Autologger เรียกใช้ไฟล์ ovpn-dco-autologger.reg
ซึ่งจะสร้างคีย์รีจิสทรีแบบ neccessary แล้วรีบูต
บันทึกไดรเวอร์จะถูกเก็บไว้ใน %SystemRoot%System32LogFilesWMIovpn-dco.etl
การเปิดตัวของ OVPN-DCO-WIN สามารถทำซ้ำได้ซึ่งหมายความว่าเมื่อคุณใช้สภาพแวดล้อมการสร้างเดียวกันคุณควรได้รับ OVPN-DCO.SYS Binary ที่เหมือนกัน ด้วยวิธีนี้คุณสามารถตรวจสอบได้ว่าไดรเวอร์ที่ปล่อยออกมาในรูปแบบไบนารีนั้นถูกรวบรวมจากซอร์สโค้ดในที่เก็บนี้ สิ่งนี้มีประโยชน์เนื่องจากข้อกำหนดการลงนามในไดรเวอร์ของ Microsoft ทำให้ยากต่อการเรียกใช้ไดรเวอร์ที่รวบรวมตัวเอง
ไดรเวอร์ที่ปล่อยออกมาถูกสร้างขึ้นด้วย Windows 11 EWDK (ชุดไดรเวอร์ Windows Enterprise) แม้จะมีชื่อ แต่ก็ใช้ได้กับ Windows 10 คุณสามารถดาวน์โหลดได้ที่นี่: https://docs.microsoft.com/en-us/windows-hardware/drivers/download-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
โดยที่ <arch>
คือ Win32
, x64
, ARM
หรือ ARM64
<arch>/Release/ovpn-dco.sys
และไฟล์จากขั้นตอนที่ 1 มีแฮช sha256 เดียวกันติดต่อ lev stipakov [email protected] (lev__ บน #openvpn-devel)