65.9K
CodeProject 正在变化。 阅读更多。
Home

适用于 Windows XP 的 OpenVPN

starIconstarIconstarIconstarIconstarIcon

5.00/5 (6投票s)

2022年1月29日

GPL3

27分钟阅读

viewsIcon

12933

OpenVPN v2.5.4 补丁适用于 Windows XP 和 Windows Server 2003

主题概述

  1. 引言
  2. 必备组件
  3. 构建机设置
  4. 构建 OpenSSL v1.1.1m
  5. 构建 LZO v2.10 DLL
  6. 构建 PKCS11-Helper v1.28 DLL
  7. 构建 OpenVPN v2.5.4 头文件
  8. 构建 OpenVPN v2.5.4
  9. 构建 OpenVPN-GUI v11.26 头文件
  10. 构建 OpenVPN-GUI v11.26
  11. 构建 TAP-Driver v9.9.2
  12. 构建 NSIS-Installer
  13. OpenVPN 配置文件更改以适应 Windows XP
  14. 测试 OpenVPN 是否正常工作
  15. OpenVPN v2.5.4 Windows XP SP3 错误
  16. 版本和下载链接
  17. 历史

1. 引言

OpenVPN v2.3.18 是最后一款正式支持 Windows XP 和 Windows Server 2003 的版本。最近,我们需要使用更新的 OpenVPN 版本 2.5.4 来支持更强的加密算法,例如 AES-256-CBC。因此,我们决定从头开始重新构建整个软件包,以使其兼容 Windows XP 和 Windows Server 2003。以下文章详细介绍了如何为这些旧操作系统重新构建 OpenVPN v2.5.4。构建过程是一段漫长的旅程,因为似乎所有官方构建说明在很大程度上都无济于事,并且大多数时候都导向死胡同。例如,官方说明指出 OpenVPN for Windows 是在 Linux 上交叉编译的,这完全不正确。我们检查了二进制文件,可以肯定地说它是原生的 Windows Visual Studio 构建!

这个新版本的好处包括:

  • 支持更强的加密算法,例如 AES-256-CBC
  • 新的 TAP-Driver,网络速度为 1 GBit/s,而不是 10 MBit/s
  • 解决了 Windows XP SP3 中无法连接 VPN 服务器的严重 bug

如果您不关心构建步骤,只需在 Windows XP 和 Windows Server 2003 上运行此压缩包根目录下的安装程序包“OpenVPN-v2.5.4.exe”来安装 OpenVPN v2.5.4。

重要提示:以下构建 OpenVPN 的步骤可以完全在离线模式下进行。您根本不需要互联网连接。

2. 先决条件

我们在下载的压缩包中包含了所有必需的软件包,但操作系统、编译器套件以及 7-Zip 压缩包解压器除外。我们使用以下列出的软件包来构建依赖项。

OpenSSL v1.1.1m

  • 操作系统:Windows 10 x64 Build 21H2
  • 编译器套件:Visual Studio 2019
  • OpenSSL_v1.1.1m\ActivePerl-5.20.2.2002-MSWin32-x86-64int-299195.msi
  • OpenSSL_v1.1.1m\dmake-4.11.20080107.ppd
  • OpenSSL_v1.1.1m\dmake-4.11.20080107.tar.gz
  • OpenSSL_v1.1.1m\nasm-2.15.05-installer-x86.exe
  • OpenSSL_v1.1.1m\openssl-v1.1.1m.7z

LZO v2.10 DLL

  • 操作系统:Windows 10 x64 Build 21H2
  • 编译器套件:Visual Studio 2019
  • LZO_v2.10\lzo-2.10.7z

PKCS11-Helper v1.28 DLL

  • 操作系统:Windows 10 x64 Build 21H2
  • 编译器套件:Visual Studio 2019
  • PKCS11-Helper_v1.28.0\pkcs11-helper-1.28.0.7z

OpenVPN v2.5.4 头文件

  • 操作系统:Windows 10 x64 Build 21H2
  • 编译器套件:Visual Studio 2019
  • OpenVPN_v2.5.4\openvpn-2.5.4.7z

OpenVPN v2.5.4

  • 操作系统:Windows 10 x64 Build 21H2
  • 编译器套件:Visual Studio 2019
  • OpenVPN_v2.5.4\block_dns.c
  • OpenVPN_v2.5.4\config-msvc-version.h
  • OpenVPN_v2.5.4\openvpn-2.5.4.7z
  • OpenVPN_v2.5.4\route.c
  • OpenVPN_v2.5.4\tap-windows.h
  • OpenVPN_v2.5.4\tap-windows-master_for_XP.7z
  • OpenVPN_v2.5.4\tun.c
  • OpenVPN_v2.5.4\versionhelpers.h

OpenVPN-GUI v11.26 头文件

  • 操作系统:Windows 10 x64 Build 21H2
  • 编译器套件:Visual Studio 2019
  • MSYS2\msys2-i686-20160205.exe
  • MSYS2\packages_20160205.7z
  • OpenVPN-GUI_v11.26\openvpn-gui-11.7z

OpenVPN-GUI v11.26

  • 操作系统:Windows 10 x64 Build 21H2
  • 编译器套件:Visual Studio 2019
  • OpenVPN-GUI_v11.26\config.h
  • OpenVPN-GUI_v11.26\openvpn-gui-11.7z
  • OpenVPN-GUI_v11.26\versionhelpers.h

TAP-Driver v9.9.2

  • 操作系统:Windows XP SP3 或 Windows Server 2003 R2 SP2
  • 编译器套件:Windows Driver Development Kit v7.1.0 (7600.16385.1)
  • NSIS-Installer\nsis-2.50-setup.exe
  • TAP-Driver_v9.9.2\tap-windows-master_for_XP.7z

NSIS-Installer for OpenVPN v2.5.4

  • 操作系统:Windows XP SP3 或 Windows Server 2003 R2 SP2
  • NSIS-Installer\nsis-2.50-setup.exe
  • NSIS-Installer\openvpn.nsi
  • NSIS-Installer\openvpn-build-release-2.3.7z
  • NSIS-Installer\OpenVPN-v2.3.18_last_version_for_XP.exe
  • NSIS-Installer\VC-Redistributable_v14.27.29114.0_x86.exe

3. 构建机设置

我们需要两台机器来构建 OpenVPN v2.5.4。第一台机器运行“Windows XP SP3 x86”或“Windows Server 2003 R2 SP2 x86”并安装“Windows Driver Development Kit v7.1.0 (7600.16385.1)”,第二台机器运行“Windows 10 x64 Build 21H2”并安装“Visual Studio Enterprise 2019 Version 16.0.1”。两台机器都需要 7-Zip 压缩包解压器。

在第一台机器上构建的软件包

  • TAP-Driver v9.9.2
  • NSIS-Installer for OpenVPN v2.5.4

在第二台机器上构建的软件包

  • OpenSSL v1.1.1m
  • LZO v2.10 DLL
  • PKCS11-Helper v1.28 DLL
  • OpenVPN v2.5.4 头文件
  • OpenVPN v2.5.4
  • OpenVPN-GUI v11.26 头文件
  • OpenVPN-GUI v11.26

在第二台机器上安装 Visual Studio 2019,并选择以下工作负载

  • C++桌面开发
  • 在右侧的“安装详细信息”下,勾选
    • MSVC v141 - VS 2017 C++ x64/x86 构建工具 (v14.16)
  • 选择“单个组件”选项卡,并在左侧“编译器、构建工具和运行时”类别下选择以下项
    • C++ Windows XP 支持 VS 2017 (v141) 工具 [已弃用]

4. 构建 OpenSSL v1.1.1m

  • 操作系统:Windows 10 x64 Build 21H2
  • 编译器套件:Visual Studio 2019
  • 将“OpenSSL_v1.1.1m\ActivePerl-5.20.2.2002-MSWin32-x86-64int-299195.msi”安装到“C:\Perl
  • 将“OpenSSL_v1.1.1m\nasm-2.15.05-installer-x86.exe”安装到“C:\Program Files (x86)\NASM
  • 将“OpenSSL_v1.1.1m\dmake-4.11.20080107.ppd”复制到“C:\dmake-4.11.20080107.ppd
  • 将“OpenSSL_v1.1.1m\dmake-4.11.20080107.tar.gz”复制到“C:\dmake-4.11.20080107.tar.gz
  • 解压“OpenSSL_v1.1.1m\openssl-v1.1.1m.7z”到“C:\openssl-v1.1.1m
  • 要构建共享发行版,请打开一个管理员命令提示符并键入以下命令
REM change directory to root of drive C:
cd C:\

REM install DMAKE Perl package
ppm install dmake-4.11.20080107.ppd

REM run VS2019 x86 command line and set correct variables
"C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars32.bat"

REM add NASM assembler to path variable
set "PATH=C:\Program Files (x86)\NASM;%PATH%"

REM change current directory to OpenSSL source code directory
cd C:\openssl-v1.1.1m

REM We have to use the configure parameter "-D_WIN32_WINNT=0x0501" for Windows XP and Windows
REM Server 2003.
perl Configure VC-WIN32 -D_WIN32_WINNT=0x0501 --prefix=C:\openssl-v1.1.1m-shared

REM starts the build process and compiles all OpenSSL libraries and files
nmake

REM tests the inner workings of the OpenSSL libraries, this should be run mandatory to be sure
REM that everything works as designed later on
nmake test

REM After this command the installation can be found in the directory "C:\Program Files\OpenSSL".
nmake install

完成这些步骤后,OpenSSL 文件将出现在您在 perl Configure 命令中用“--prefix”参数指定的目录中。在我们的例子中,OpenSSL 的共享发行版 DLL 位于“C:\openssl-v1.1.1m-shared”目录中。我们需要的头文件位于“C:\openssl-v1.1.1m-shared\include\openssl”。我们需要的库文件位于“C:\openssl-v1.1.1m-shared\lib”。我们将整个目录打包到名为“OpenSSL_v1.1.1m\openssl-v1.1.1m-shared.7z”的包含压缩包中。

5. 构建 LZO v2.10 DLL

  • 操作系统:Windows 10 x64 Build 21H2
  • 编译器套件:Visual Studio 2019
  • 将“LZO_v2.10\lzo-2.10.7z”解压到“C:\lzo-2.10”
  • 要构建 DLL 发行版,请打开一个管理员命令提示符并键入以下命令
REM run VS2019 x86 command line and set correct variables
"C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars32.bat"

REM change current directory to LZO source code directory
cd C:\lzo-2.10

REM This will build the shared DLLs.
B\win32\vc_dll.bat

我们将整个目录打包到名为“LZO_v2.10\lzo-2.10-shared-DLL.7z”的包含压缩包中。

6. 构建 PKCS11-Helper v1.28 DLL

  • 操作系统:Windows 10 x64 Build 21H2
  • 编译器套件:Visual Studio 2019
  • 将“PKCS11-Helper_v1.28.0\pkcs11-helper-1.28.0.7z”解压到“C:\pkcs11-helper-1.28.0
  • 要构建 DLL 发行版,请打开一个管理员命令提示符并键入以下命令
REM run VS2019 x86 command line and set correct variables
"C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars32.bat"

REM change current directory to PKCS11-Helper source code directory
cd C:\pkcs11-helper-1.28.0\lib

REM starts the build process and compiles the PKCS11-Helper library
nmake -f Makefile.w32-vc OPENSSL=1 OPENSSL_HOME=C:\openssl-v1.1.1m-shared

我们将整个目录打包到名为“PKCS11-Helper_v1.28.0\pkcs11-helper-1.28.0-shared-DLL.7z”的包含压缩包中。我们使用的 DLL 位于“PKCS11-Helper_v1.28.0\pkcs11-helper-1.28.0-shared-DLL.7z\lib\libpkcs11-helper-1.dll”。

7. 构建 OpenVPN v2.5.4 头文件

头文件 config-msvc-version.h 是由 OpenVPN 的 Visual Studio 解决方案自动生成的。标准的 OpenVPN 源代码不包含此文件,但它对于构建 OpenVPN 至关重要。在接下来的步骤中,我们将描述如何生成 config-msvc-version.h 文件。通过此过程生成的头文件已存在于“OpenVPN_v2.5.4”目录中。

  • 操作系统:Windows 10 x64 Build 21H2
  • 编译器套件:Visual Studio 2019
  • 将“OpenVPN_v2.5.4\openvpn-2.5.4.7z”解压到“C:\openvpn-2.5.4
  • 要构建“config-msvc-version.h”文件,请打开一个管理员命令提示符并键入以下命令
REM change current directory to OpenVPN msvc-generate source code directory
cd C:\openvpn-2.5.4\build\msvc\msvc-generate

REM run the java script file with parameters
cscript //Nologo msvc-generate.js --config="C:\openvpn-2.5.4\version.m4" 
                                  --input="C:\openvpn-2.5.4\config-msvc-version.h.in" 
                                  --output="C:\openvpn-2.5.4\config-msvc-version.h"

完成这些步骤后,生成的文件位于“C:\openvpn-2.5.4\config-msvc-version.h”。

请注意:此文件包含错误! 似乎 PRODUCT_VERSION_PATCH 的值错误
为“.4”而不是简单的“4”。因此,PACKAGE_VERSIONPRODUCT_VERSION 也错误,
两者都等于“2.5..4”。此错误由“C:\openvpn-2.5.4\version.m4”文件触发,其中包含以下 define

define([PRODUCT_VERSION_PATCH], [.4])

如果我们更正此行并删除小数点,我们会在 config-msvc-version.h 文件中遇到另一个错误。在此更改后,PACKAGE_STRING 为“OpenVPN 2.54”,缺少小数点,但 PACKAGE_VERSIONPRODUCT_VERSION 都是正确的。我们已经在包含的文件“OpenVPN_v2.5.4\config-msvc-version.h”中手动更正了这些错误。

文件 tap-windows.h 从压缩包“OpenVPN_v2.5.4\tap-windows-master_for_XP.7z\src\tap-windows.h”复制而来。文件 versionhelpers.h 从 Visual Studio 2019 附带的 Windows 10 SDK 版本 10.0.17763.0 复制而来。我们对其进行了轻微修改,使其在没有 winapifamily.h 等其他头文件的情况下也能工作。安装 Visual Studio 2019 后,原始文件位于“C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um\VersionHelpers.h”。

8. 构建 OpenVPN v2.5.4

  • 操作系统:Windows 10 x64 Build 21H2
  • 编译器套件:Visual Studio 2019
  • 将“OpenVPN_v2.5.4\openvpn-2.5.4.7z”解压到“C:\openvpn-2.5.4
    如果您之前编译了 OpenVPN v2.5.4 头文件,则此步骤不是必需的!
  • 启动 Visual Studio 2019 > 创建新项目 > 空项目 > 下一步 >
    项目名称:openvpn
    位置:C:\Users\Public
    解决方案名称:openvpn
    勾选“将解决方案和项目放在同一目录中”
    > 创建
  • 将“C:\openvpn-2.5.4\src\openvpn”中的所有文件和目录复制到“C:\Users\Public\openvpn”。
    不要覆盖“openvpn.vcxproj”和“openvpn.vcxproj.filters”文件。
  • 从“C:\Users\Public\openvpn”目录中删除以下文件
    Makefile.am
    Makefile.in
  • 将“C:\openvpn-2.5.4\config-msvc.h”文件复制到“C:\Users\Public\openvpn
  • 将“C:\openvpn-2.5.4\include\openvpn-msg.h”文件复制到“C:\Users\Public\openvpn
  • 将“C:\openvpn-2.5.4\include\openvpn-plugin.h”文件复制到“C:\Users\Public\openvpn
  • 将“OpenVPN_v2.5.4\block_dns.c”文件复制到“C:\Users\Public\openvpn”并覆盖现有文件。
    这个新创建的 C 源文件包含支持 Windows XP DNS 泄漏阻止的代码。
  • 将“OpenVPN_v2.5.4\config-msvc-version.h”文件复制到“C:\Users\Public\openvpn”。
  • 将“OpenVPN_v2.5.4\route.c”文件复制到“C:\Users\Public\openvpn”并覆盖现有文件。
    这会更改 get_default_gateway_ipv6 函数,并简单地返回,因为 Windows XP 在没有双栈组合 IPv4 的情况下根本无法正确支持 IPv6。我们可以完全忽略这一点,直接从函数返回。Windows XP 中 GetBestRoute 的实现根本不支持 IPv6。
  • 将“OpenVPN_v2.5.4\tap-windows.h”文件复制到“C:\Users\Public\openvpn”。
  • 将“OpenVPN_v2.5.4\tun.c”文件复制到“C:\Users\Public\openvpn”并覆盖现有文件。
    这会更改 windows_set_mtu 函数,以便在 Windows XP 上编译。该补丁和函数根本不起作用。我们尝试了多种方法来设置 MTU,但均未成功。有关更多详细信息,请阅读代码中的注释。
  • 将“OpenVPN_v2.5.4\versionhelpers.h”文件复制到“C:\Users\Public\openvpn”。
  • 将“C:\openssl-v1.1.1m-shared”复制到“C:\Users\Public\openvpn\OpenSSL_v1.1.1m”。
  • 删除以下目录
    C:\Users\Public\openvpn\OpenSSL_v1.1.1m\bin
    C:\Users\Public\openvpn\OpenSSL_v1.1.1m\html
  • 将“C:\lzo-2.10”复制到“C:\Users\Public\openvpn\lzo-2.10”。
  • 删除“C:\Users\Public\openvpn\lzo-2.10”文件夹中的所有文件和目录,但保留“include”、“lzo2.dll”和“lzo2.lib”。
  • 将“C:\pkcs11-helper-1.28.0”复制到“C:\Users\Public\openvpn\pkcs11-helper-1.28.0”。
  • 删除“C:\Users\Public\openvpn\pkcs11-helper-1.28.0”文件夹中的所有文件和目录,但保留“include”和“lib”。
  • 删除以下文件
    C:\Users\Public\openvpn\pkcs11-helper-1.28.0\include\Makefile.am
    C:\Users\Public\openvpn\pkcs11-helper-1.28.0\include\Makefile.in
    C:\Users\Public\openvpn\pkcs11-helper-1.28.0\include\pkcs11-helper-1.0\Makefile.am
    C:\Users\Public\openvpn\pkcs11-helper-1.28.0\include\pkcs11-helper-1.0\Makefile.in
    C:\Users\Public\openvpn\pkcs11-helper-1.28.0\include\pkcs11-helper-1.0\pkcs11h-version.h.in
  • 删除“C:\Users\Public\openvpn\pkcs11-helper-1.28.0\lib”文件夹中的所有文件,但保留“libpkcs11-helper-1.dll”和“pkcs11-helper.dll.lib”。
  • 在 VS2019 解决方案资源管理器中,右键单击 openvpn 的“头文件”>添加 > 现有项... > 在“文件名”字段中输入“*.h”并按Enter > 选择第一个头文件。按住 Shift 键并单击最后一个头文件 > 添加
  • 右键单击“资源文件” > 添加 > 现有项... > 选择“openvpn_win32_resources.rc” > 添加
  • 右键单击“源文件” > 添加 > 现有项... > 在“文件名”字段中输入“*.c”并按Enter > 选择第一个 C 源文件,按住 Shift 键并单击最后一个 C 源文件 > 添加
  • 在解决方案资源管理器中,右键单击“解决方案 'openvpn' (1 个项目)” > 添加 > 新建项目... >
    空项目 > 下一步 >
    项目名称:compat
    位置:C:\Users\Public
    > 创建
  • 将“C:\openvpn-2.5.4\src\compat”中的所有文件复制到“C:\Users\Public\compat”。
    不要覆盖“openvpn.vcxproj”和“openvpn.vcxproj.filters”文件。
  • 从“C:\Users\Public\compat”目录中删除以下文件
    Debug.props
    Makefile.am
    Makefile.in
    PropertySheet.props
    Release.props
  • 将“C:\openvpn-2.5.4\config-msvc.h”文件复制到“C:\Users\Public\compat”。
  • 将“OpenVPN_v2.5.4\config-msvc-version.h”文件复制到“C:\Users\Public\compat
  • 在 VS2019 解决方案资源管理器中,右键单击 compat 的“头文件”>添加 > 现有项... > 在“文件名”字段中输入“*.h”并按Enter > 选择第一个头文件,按住 Shift 键并单击最后一个头文件 > 添加
  • 右键单击 compat 的“源文件”>添加 > 现有项... > 在“文件名”字段中输入“*.c”并按Enter > 选择第一个 C 源文件,按住 Shift 键并单击最后一个 C 源文件 > 添加
  • 在解决方案资源管理器中,选择compat > 菜单 > 项目 > 属性 > 选择配置
    所有配置 > 平台所有平台,并更改以下值
    配置属性 > 常规
    • 平台工具集:Visual Studio 2017 - Windows XP (v141_xp)
    • 配置类型:静态库 (.lib)
    配置属性 > C/C++ > 预处理器
    • 预处理器定义 > 选择箭头 > > 输入
      _CRT_SECURE_NO_WARNINGS
      > OK
    配置属性 > C/C++ > 命令行
    • 其他选项 > 输入
      /D_WIN32_WINNT=0x0501
    配置属性 > 链接器 > 清单文件
    • 生成清单:否 (/MANIFEST:NO)
      > OK
  • 打开“C:\Users\Public\compat\config-msvc.h”文件,并将第 1 行代码从
    #include <config-msvc-version.h>
    to
    #include "config-msvc-version.h"
    此外,在第 172 行之前添加一个新行并插入以下代码
    #define _WIN32_WINNT_VISTA 0x0600
  • 要解决警告“支持面向 Windows XP 已弃用,并且不会出现在 Visual Studio 的未来版本中。”,请执行以下步骤
    解决方案资源管理器中,选择compat > 菜单 > 视图 > 属性管理器 > 右键单击“compat” > 添加新的项目属性表... > 添加 > 展开“compat” > 展开“Debug | Win32” > 右键单击PropertySheet > 属性 > 通用属性 > 用户宏 > “添加宏”按钮
    名称:XPDeprecationWarning
    值:false
    > 2 x OK
    此属性表会自动添加到每个构建配置中。
  • 在解决方案资源管理器中,选择openvpn > 菜单 > 项目 > 属性 > 选择配置:所有配置 > 平台:所有平台,并更改以下值
    配置属性 > 常规
    • 平台工具集:Visual Studio 2017 - Windows XP (v141_xp)
    配置属性 > VC++ 目录
    • 包含目录 > 选择箭头 > > 为列出的每个值选择新行 > 输入
      ..\compat
      $(SolutionDir)\lzo-2.10\include
      $(SolutionDir)\OpenSSL_v1.1.1m\include
      $(SolutionDir)\pkcs11-helper-1.28.0\include

      > OK
    • 库目录 > 选择箭头 > > 为列出的每个值选择新行 > 输入
      $(OutDir)
      这用于 compat.lib 静态库,否则找不到该库。
      $(SolutionDir)\lzo-2.10
      $(SolutionDir)\OpenSSL_v1.1.1m\lib
      $(SolutionDir)\pkcs11-helper-1.28.0\lib

      > OK
    配置属性 > C/C++ > 常规
    • 警告级别:级别 2 (/W2)
      这将抑制 238 个警告。开发人员在原始 openvpn VS2019 解决方案中也这样做。
    配置属性 > C/C++ > 预处理器
    • 预处理器定义 > 选择箭头 > > 输入
      _CRT_NONSTDC_NO_DEPRECATE
      _CRT_SECURE_NO_WARNINGS

      > OK
    配置属性 > C/C++ > 命令行
    • 其他选项 > 输入
      /D_WIN32_WINNT=0x0501
    配置属性 > 链接器 > 输入
    • 其他依赖项 > 选择箭头 > > 输入
      compat.lib
      libssl.lib
      libcrypto.lib
      lzo2.lib
      pkcs11-helper.dll.lib
      gdi32.lib
      ws2_32.lib
      wininet.lib
      crypt32.lib
      iphlpapi.lib
      winmm.lib
      rpcrt4.lib
      setupapi.lib
      advapi32.lib
      > OK
    配置属性 > 链接器 > 清单文件
    • 生成清单:否 (/MANIFEST:NO)
    > OK
  • 在解决方案资源管理器中,选择openvpn > 菜单 > 项目 > 项目依赖项... > 依赖项选项卡 > 项目:选择 openvpn > 依赖于:勾选 compat > OK
  • 打开“C:\Users\Public\openvpn\config-msvc.h”文件,并将第 1 行代码从
    #include <config-msvc-version.h>
    to
    #include "config-msvc-version.h"
    此外,在第 172 行之前添加一个新行并插入以下代码
    #define _WIN32_WINNT_VISTA 0x0600
  • 打开文件“C:\Users\Public\openvpn\tun.h”,并将第 29 行代码从
    #include <tap-windows.h>
    to
    #include "tap-windows.h"
  • 打开文件“C:\Users\Public\openvpn\win32.c”,并将第 50 行代码从
    #include <versionhelpers.h>
    to
    #include "versionhelpers.h"
  • 打开文件“C:\Users\Public\openvpn\syshead.h”,并将第 586 行代码从
    #define ENABLE_CRYPTOAPI
    to
    //#define ENABLE_CRYPTOAPI
  • 打开文件“C:\Users\Public\openvpn\console_systemd.c”,并将第 30 行代码从
    #include "config.h"
    to
    //#include "config.h"
  • 打开文件“C:\Users\Public\openvpn\ssl_ncp.h”,并将第 53 行代码从
    check_pull_client_ncp(struct context *c, int found);
    to
    check_pull_client_ncp(struct context *c, const int found);
  • 打开文件“C:\Users\Public\openvpn\auth_token.c”,并将第 62 行代码从
    const char *state;
    to
    const char *state = "Invalid";
  • 打开文件“C:\Users\Public\openvpn\pkcs11-helper-1.28.0\include\pkcs11-helper-1.0\pkcs11.h”,并将第 1213 行代码从
    struct ck_interface **interface,
    to
    struct ck_interface **Interface,
  • 要解决“对 Windows XP 的支持已弃用,并且在 Visual Studio 的未来版本中将不再提供。”的警告,请执行以下步骤
    在解决方案资源管理器中,选择openvpn > 菜单 > 视图 > 属性管理器 > 右键单击“openvpn” > 添加新的项目属性表... > 添加 > 展开“openvpn” > 展开“Debug | Win32” > 右键单击PropertySheet > 属性 > 通用属性 > 用户宏 > “添加宏”按钮
    名称:XPDeprecationWarning
    值:false
    > 2 x OK
    此属性表会自动添加到每个构建配置中。
  • 选择菜单 > 生成 > 配置管理器... > 活动解决方案配置:Release > 活动解决方案平台:x86 > 关闭
  • 在解决方案资源管理器中,选择 compat > 菜单 > 项目 > 属性 > 选择配置:Active(Release) > 平台:Active(Win32),并更改以下值
    配置属性 > C/C++ > 优化
    • 优化:最大优化(有利于大小)(/O1)
    • 启用内在函数:否
    • 有利于大小或速度:有利于小型代码 (/Os)
    > OK
  • 在解决方案资源管理器中,选择openvpn > 菜单 > 项目 > 属性 > 选择配置Active(Release) > 平台Active(Win32),并更改以下值
    配置属性 > C/C++ > 优化
    • 优化:最大优化(有利于大小)(/O1)
    • 启用内在函数:否
    • 有利于大小或速度:有利于小型代码 (/Os)
    链接器 > 调试
    • 生成调试信息:否
    > OK
  • 选择菜单 > 生成 > 重新生成解决方案

我们现在可以编译 Windows XP 的调试和发布配置,而没有任何错误或警告。
最终源代码包位于“OpenVPN_v2.5.4\openvpn_v2.5.4_20220123_for_XP.7z”。

9. 构建 OpenVPN-GUI v11.26 头文件

头文件 config.h 在 Linux 平台上是自动生成的。标准的 OpenVPN-GUI 源代码不包含此文件,但它对于构建 OpenVPN-GUI 至关重要。在接下来的步骤中,我们将描述如何生成 config.h 文件。通过此过程生成的头文件已存在于“OpenVPN-GUI_v11.26”目录中。

  • 操作系统:Windows 10 x64 Build 21H2
  • 编译器套件:Visual Studio 2019
  • 将“MSYS2\msys2-i686-20160205.exe”安装到“C:\msys32” > 安装完成后取消勾选“立即运行 MSYS2 32 位” > 完成
    注意:安装 MSYS2 及所有必需的软件包,我们在 C 盘至少需要 2 到 3 GB 的可用空间!
  • 将“MSYS2\packages_20160205.7z”解压到“C:\packages_20160205”。
  • 将“C:\packages_20160205\all-in-one”目录中的所有软件包复制到“C:\msys32\var\cache\pacman\pkg”目录。
  • 以管理员身份运行“C:\msys32\mingw32_shell.bat”。
  • 在 MINGW32 shell 中运行以下命令
pacman -S autoconf automake libtool make mingw-w64-i686 
mingw-w64-i686-toolchain mingw-w64-x86_64 mingw-w64-x86_64-toolchain nasm pkg-config

按 4 次 Enter 和 'Y' 来安装所有软件包。
这将安装 pkg 目录中的所有 129 个软件包。

  • 现在我们可以删除“C:\msys32\var\cache\pacman\pkg”目录中的所有文件
  • 将“OpenVPN-GUI_v11.26\openvpn-gui-11.7z”解压到“C:\msys32\home\UserName\openvpn-gui
  • 在 MINGW32 shell 中运行以下命令
cd openvpn-gui
autoreconf -i -v
./configure --prefix=/ --host=i686-w64-mingw32 --build=i686-pc-mingw32 
--program-prefix='' OPENSSL_CRYPTO_CFLAGS="-I /home/UserName/openssl-v1.1.1m/include/" 
OPENSSL_CRYPTO_LIBS="-L /home/UserName/openssl-v1.1.1m/lib/ -lcrypto"

对于 configure 命令,OpenSSL 目录是否存在并不重要。在此 configure 命令之后,将创建“C:\msys32\home\UserName\openvpn-gui\config.h”文件。如果我们只想在 Visual Studio 2019 上构建 OpenVPN-GUI,我们可以到此为止。建议在此停止,不要尝试使用 MSYS2 构建 OpenVPN-GUI,因为即使我们设法获得了一个可执行文件,其大小至少是使用 Visual Studio 2019 构建的 Windows 可执行文件大小的两倍。

文件 versionhelpers.h 从 Visual Studio 2019 附带的 Windows 10 SDK 版本 10.0.17763.0 复制而来。我们对其进行了轻微修改,使其在没有 winapifamily.h 等其他头文件的情况下也能工作。安装 Visual Studio 2019 后,原始文件位于“C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um\VersionHelpers.h”。

10. 构建 OpenVPN-GUI v11.26

  • 操作系统:Windows 10 x64 Build 21H2
  • 编译器套件:Visual Studio 2019
  • 将“OpenVPN-GUI_v11.26\openvpn-gui-11.7z”解压到“C:\openvpn-gui”。
  • 启动Visual Studio 2019 > 创建新项目 > 空项目 > 下一步 >
    项目名称:openvpn-gui
    位置:C:\Users\Public
    解决方案名称:openvpn-gui
    勾选“将解决方案和项目放在同一目录中”
    > 创建
  • 将“C:\openvpn-gui”中的所有文件和目录复制到“C:\Users\Public\openvpn-gui”。
  • 从“C:\Users\Public\openvpn-gui”目录中删除以下文件
    aclocal.m4
    compile
    config.guess
    config.h.in
    config.sub
    configure
    configure.ac
    COPYING
    COPYRIGHT.GPL
    depcomp
    install-sh
    Makefile.am
    Makefile.in
    missing
  • 将“C:\Users\Public\openvpn-gui\res”目录中的所有文件移动到“C:\Users\Public\openvpn-gui”。
  • 删除“C:\Users\Public\openvpn-gui\res”目录。
  • 将“OpenVPN-GUI_v11.26\config.h”文件复制到“C:\Users\Public\openvpn-gui”。
  • 将“OpenVPN-GUI_v11.26\versionhelpers.h”文件复制到“C:\Users\Public\openvpn-gui”。
  • 如果“C:\OpenSSL_v1.1.1m”目录存在,请删除它。
  • 将“OpenSSL_v1.1.1m\openssl-v1.1.1m-shared.7z”解压到“C:\OpenSSL_v1.1.1m”。
  • 将“C:\OpenSSL_v1.1.1m”复制到“C:\Users\Public\openvpn-gui\OpenSSL_v1.1.1m”。
  • 删除以下目录
    C:\Users\Public\openvpn-gui\OpenSSL_v1.1.1m\bin
    C:\Users\Public\openvpn-gui\OpenSSL_v1.1.1m\html
  • 在 VS2019 解决方案资源管理器中,右键单击 openvpn-gui 的“头文件”>添加 > 现有项... > 在“文件名”字段中输入“*.h”并按Enter > 选择第一个头文件,按住 Shift 键并单击最后一个头文件 > 添加
  • 右键单击“资源文件” > 添加 > 现有项... > 选择“openvpn-gui-res.rc” > 添加
  • 右键单击“源文件” > 添加 > 现有项... > 在“文件名”字段中输入“*.c”并按Enter > 选择第一个 C 源文件,按住 Shift 键并单击最后一个 C 源文件 > 添加
  • 在解决方案资源管理器中,选择 openvpn-gui > 菜单 > 项目 > 属性 > 选择配置:所有配置 > 平台:所有平台,并更改以下值
    配置属性 > 常规
    • 平台工具集:Visual Studio 2017 - Windows XP (v141_xp)
    • 字符集:使用 Unicode 字符集
    配置属性 > VC++ 目录
    • 包含目录 > 选择箭头 > > 选择新行 > 输入
      $(SolutionDir)\OpenSSL_v1.1.1m\include
      > OK
    • 库目录 > 选择箭头 > > 选择新行 > 输入
      $(SolutionDir)\OpenSSL_v1.1.1m\lib
      > OK
    配置属性 > C/C++ > 预处理器
    • 预处理器定义 > 选择箭头 > > 输入
      _CRT_NONSTDC_NO_DEPRECATE
      _CRT_SECURE_NO_WARNINGS
      > OK
    配置属性 > C/C++ > 命令行
    • 其他选项 > 输入
      /D "HAVE_CONFIG_H" /D "WIN32_LEAN_AND_MEAN" /D_WIN32_WINNT=0x0501
    配置属性 > 链接器 > 输入
    • 其他依赖项 > 选择箭头 > > 输入
      ws2_32.lib
      libcrypto.lib
      libssl.lib
      secur32.lib
      netapi32.lib
      comctl32.lib
      wininet.lib
      wtsapi32.lib
      crypt32.lib
      shlwapi.lib
      winhttp.lib

      > OK
    配置属性 > 链接器 > 清单文件
    • 生成清单:否 (/MANIFEST:NO)
    配置属性 > 链接器 > 系统
    • 子系统:Windows (/SUBSYSTEM:WINDOWS)
    配置属性 > 资源 > 命令行
    • 其他选项 > 输入
      /D "HAVE_CONFIG_H"
    > OK
  • 菜单 > 生成 > 重新生成解决方案 > 菜单 > 视图 > 错误列表
  • 单击所有错误“无法打开包含文件: 'config.h': No such file or directory”并将行从
    #include <config.h>
    to
    #include "config.h"
  • 单击所有错误“'wcstok': 函数调用参数太少”并将第一个代码位置从
    pch = wcstok(buf, L"\r\n");
    to
    wchar_t *state;
    pch = wcstok(buf, L"\r\n", &state);
    更改第二个代码位置从
    pch = wcstok(NULL, L"\r\n");
    to
    pch = wcstok(NULL, L"\r\n", &state);
  • 菜单 > 生成 > 重新生成解决方案 > 菜单 > 视图 > 错误列表
  • 单击所有错误“'wcstok': 函数调用参数太少”并将第一个代码位置从
    LPWSTR token = wcstok(proxy_str, delim);
    to
    wchar_t *state;
    LPWSTR token = wcstok(proxy_str, delim, &state);
    更改第二个代码位置从
    token = wcstok(NULL, delim);
    to
    token = wcstok(NULL, delim, &state);
  • 单击错误“'AURL_ENABLEURL': 未声明的标识符”并将代码从
    SendMessage(hmsg, EM_AUTOURLDETECT, AURL_ENABLEURL, 0);
    to
    #define AURL_ENABLEURL 1
    SendMessage(hmsg, EM_AUTOURLDETECT, AURL_ENABLEURL, 0);
  • 单击两个错误“无法打开包含文件 'versionhelpers.h': No such file or directory”并将代码位置从
    #include <versionhelpers.h>
    to
    #include "versionhelpers.h"
  • 单击错误“无法打开包含文件 'combaseapi.h': No such file or directory”并将代码位置从
    #include <combaseapi.h>
    to
    //#include <combaseapi.h>
  • 菜单 > 生成 > 重新生成解决方案 > 菜单 > 视图 > 错误列表
  • 单击警告“形式参数 2 与声明不同”右键单击函数 IsUserInGroup > 转到声明 > 更改代码位置从
    static BOOL IsUserInGroup(PSID sid, PTOKEN_GROUPS token_groups, const WCHAR *group_name);
    to
    static BOOL IsUserInGroup(PSID sid, const PTOKEN_GROUPS token_groups, 
    const WCHAR *group_name);
  • 单击警告“'CompareStringOrdinal' 未定义;假定为返回 int 的 extern”并将代码位置从
    int cmp = CompareStringOrdinal(nameval1, (int)len1, nameval2, (int)len2, ignore_case);
    to
    //int cmp = CompareStringOrdinal(nameval1, (int)len1, nameval2, (int)len2, ignore_case);
    int cmp = wcsncmp(nameval1, nameval2, (len1 > len2 ? len2 : len1));
  • 单击警告“'=': 从 'DWORD' 转换为 'LANGID',可能丢失数据”并将代码位置从
    gui_language = ( value != 0 ? value : GetUserDefaultUILanguage() );
    to
    gui_language = (LANGID)( value != 0 ? value : GetUserDefaultUILanguage() );
  • 单击警告“形式参数 2 与声明不同”并将代码位置从
    LoadLocalizedStringBuf(PTSTR buffer, int bufferSize, const UINT stringId, ...)
    to
    LoadLocalizedStringBuf(PTSTR buffer, const int bufferSize, const UINT stringId, ...)
  • 单击警告“'function': 从 'DWORD' 转换为 'u_short',可能丢失数据”并将代码位置从
    c->manage.skaddr.sin_port = htons(o.mgmt_port_offset + config);
    to
    c->manage.skaddr.sin_port = htons((u_short)o.mgmt_port_offset + config);
  • 单击警告“'RegGetValueW' 未定义;假定为返回 int 的 extern”并将代码位置从
    if (RegGetValueW (regkey, NULL, L"version", RRF_RT_REG_BINARY, NULL, v, &len)
    to
    //if (RegGetValueW (regkey, NULL, L"version", RRF_RT_REG_BINARY, NULL, v, &len)
    if (RegQueryValueEx(regkey, L"version", NULL, NULL, (LPBYTE)v, &len)
  • 单击警告“'RegCopyTree' 未定义;假定为返回 int 的 extern”并将代码位置从
    status = RegCopyTree (regkey_nilings, NULL, regkey_proxy);
    to
    //status = RegCopyTree (regkey_nilings, NULL, regkey_proxy);
    status = SHCopyKey(regkey_nilings, NULL, regkey_proxy, 0);
  • 单击警告“'RegDeleteTree' 未定义;假定为返回 int 的 extern”并将代码位置从
    RegDeleteTree (HKEY_CURRENT_USER, GUI_REGKEY_HKCU); /* delete all values and subkeys */
    to
    //RegDeleteTree (HKEY_CURRENT_USER, GUI_REGKEY_HKCU); /* delete all values and subkeys */
    SHDeleteKey(HKEY_CURRENT_USER, GUI_REGKEY_HKCU); /* delete all values and subkeys */
  • 转到 C 源文件 registry.c 的开头,并在 <shlobj.h> 之后放置以下包含
    #include <shlwapi.h>
  • 菜单 > 生成 > 重新生成解决方案 > 菜单 > 视图 > 错误列表
  • 单击错误“'TTI_ERROR_LARGE': 未声明的标识符”并将代码位置从
    bt.ttiIcon = TTI_ERROR_LARGE;
    to
    #define TTI_ERROR_LARGE 6
    bt.ttiIcon = TTI_ERROR_LARGE;
  • 单击错误“'IID_IFileOpenDialog': 未声明的标识符”,注释掉整个函数“BrowseFolder”并添加以下替换函数
    INT CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lp, LPARAM pData)
    {
        if (uMsg == BFFM_INITIALIZED) SendMessage(hwnd, BFFM_SETSELECTION, TRUE, pData);
        return 0;
    }
    
    static BOOL BrowseFolder(const WCHAR * initial_path, 
                             WCHAR * selected_path, size_t selected_path_size)
    {
        HRESULT initResult = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
        if (FAILED(initResult))
        {
            return false;
        }
    
        BROWSEINFO br;
        ZeroMemory(&br, sizeof(BROWSEINFO));
        br.lpfn = BrowseCallbackProc;
        br.ulFlags = BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE;
        br.hwndOwner = NULL;
        br.lParam = (LPARAM)initial_path;
    
        LPITEMIDLIST pidl = NULL;
        if ((pidl = SHBrowseForFolder(&br)) != NULL)
        {
            wchar_t path[MAX_PATH];
            if (SHGetPathFromIDList(pidl, path))
            {
                wcsncpy(selected_path, path, wcslen(path));
            }
        }
    
        CoUninitialize();
    
        return true;
    }
  • 菜单 > 生成 > 重新生成解决方案 > 菜单 > 视图 > 错误列表
  • 单击错误“无法打开包含文件 '../openvpn-gui-res.h'。”并将代码位置从
    #include "../openvpn-gui-res.h"
    to
    #include "openvpn-gui-res.h"
  • 单击警告“'function': 从 'time_t' 转换为 'unsigned int',可能丢失数据”并将代码位置从
    srand(time(NULL));
    to
    srand((unsigned int)time(NULL));
  • 单击警告“'initializing': 从 'unsigned __int64' 转换为 'double',可能丢失数据”并将代码位置从
    double x = c;
    to
    double x = (double)c;
  • 单击警告“'function': 从 'time_t' 转换为 'unsigned int',可能丢失数据”并将代码位置从
    srand(time(NULL));
    to
    srand((unsigned int)time(NULL));
  • 单击警告“'function': 'const' 限定符不同”并将代码位置从
    void *tmp = realloc(options->auto_connect, sizeof(wchar_t *)*options->max_auto_connect);
    to
    void *tmp = realloc((void*)options->auto_connect, 
                sizeof(wchar_t *)*options->max_auto_connect);
  • 要解决警告“对 Windows XP 的支持已弃用,并且在 Visual Studio 的未来版本中将不再提供。”,请执行以下步骤
    菜单 > 视图 > 属性管理器 > 右键单击“openvpn-gui” > 添加新的项目属性表... > 添加 > 展开“openvpn-gui” > 展开“Debug | Win32” > 右键单击PropertySheet > 属性 > 通用属性 > 用户宏 > “添加宏”按钮
    名称:XPDeprecationWarning
    值:false
    > 2 x OK
    此属性表会自动添加到每个构建配置中。
  • 选择菜单 > 生成 > 配置管理器... > 活动解决方案配置:Release > 活动解决方案平台:x86 > 关闭
  • 在解决方案资源管理器中,选择 openvpn-gui > 菜单 > 项目 > 属性 > 选择配置:Active(Release) > 平台:Active(Win32),并更改以下值
    配置属性 > C/C++ > 优化
    • 优化:最大优化(有利于大小)(/O1)
    • 启用内在函数:否
    • 有利于大小或速度:有利于小型代码 (/Os)
    链接器 > 调试
    • 生成调试信息:否
    > OK
  • 选择菜单 > 生成 > 重新生成解决方案

我们现在可以编译 Windows XP 的调试和发布配置,而没有任何错误或警告。
最终源代码包位于“OpenVPN-GUI_v11.26\openvpn-gui_v11.26_20220123_for_XP.7z”。

11. 构建 TAP-Driver v9.9.2

我们必须为 Windows XP 重新构建 TAP-Driver,因为 OpenVPN v2.3.18 的原始驱动程序仅支持 10 MBit/s 的速度。这极大地限制了我们的连接。因此,我们实现了一个补丁来支持 1 GBit/s,尽管理论上的 VPN 限制约为 250 到 300 MBit/s。

  • 操作系统:Windows XP SP3 或 Windows Server 2003 R2 SP2
  • 编译器套件:Windows Driver Development Kit v7.1.0 (7600.16385.1)
  • 安装“NSIS-Installer\nsis-2.50-setup.exe
  • 将“TAP-Driver_v9.9.2\tap-windows-master_for_XP.7z”解压到“C:\tap
  • 打开文件“C:\tap\src\tapdrvr.c”,并将第 1142 行代码从
    l_Query.m_Long = 100000; // rate / 100 bps
    to
    l_Query.m_Long = 10000000; // rate / 100 bps
  • 要构建发行版驱动程序,请打开一个管理员命令提示符并键入以下命令
    REM change current directory to TAP-Driver source code directory
    cd C:\tap
    
    REM configure TAP-Driver
    configure.bat
    
    REM build TAP-Driver
    build.bat
    
  • 生成的 NSIS-Installer 包位于“C:\tap\tap-windows-9.9.2.exe”。

最终源代码包位于“TAP-Driver_v9.9.2\tap_v9.9.2_20220123_for_XP.7z”。

12. 构建 NSIS-Installer

  • 操作系统:Windows XP SP3 或 Windows Server 2003 R2 SP2
  • 安装“NSIS-Installer\nsis-2.50-setup.exe
  • 创建目录“C:\nsis
  • 将“NSIS-Installer\OpenVPN-v2.3.18_last_version_for_XP.exe”解压到“C:\nsis\OpenVPN-v2.3.18
  • 将“NSIS-Installer\openvpn-build-release-2.3.7z”解压到“C:\nsis\openvpn-build-release-2.3
  • 将“C:\nsis\openvpn-build-release-2.3\windows-nsis\install-whirl.bmp”复制到“C:\nsis
  • 将“C:\nsis\openvpn-build-release-2.3\windows-nsis\nsProcess.dll”复制到“C:\nsis
  • 将“C:\nsis\openvpn-build-release-2.3\windows-nsis\nsProcess.nsh”复制到“C:\nsis
  • 将“NSIS-Installer\VC-Redistributable_v14.27.29114.0_x86.exe”复制到“C:\nsis”
  • 删除目录“C:\nsis\OpenVPN-v2.3.18\$PLUGINSDIR
  • 删除文件“C:\nsis\OpenVPN-v2.3.18\$TEMP\tap-windows.exe
  • 删除“C:\nsis\OpenVPN-v2.3.18\bin”文件夹中的所有文件和目录,但保留“openvpnserv.exe
  • 将“OpenSSL_v1.1.1m\openssl-v1.1.1m-shared.7z”解压到“C:\OpenSSL_v1.1.1m
  • 将“C:\OpenSSL_v1.1.1m\bin\libcrypto-1_1.dll”复制到“C:\nsis\OpenVPN-v2.3.18\bin
  • 将“C:\OpenSSL_v1.1.1m\bin\libssl-1_1.dll”复制到“C:\nsis\OpenVPN-v2.3.18\bin
  • 将“C:\OpenSSL_v1.1.1m\bin\openssl.exe”复制到“C:\nsis\OpenVPN-v2.3.18\bin
  • 将“PKCS11-Helper_v1.28.0\pkcs11-helper-1.28.0-shared-DLL.7z”解压到“C:\pkcs11-helper-1.28.0
  • 将“C:\pkcs11-helper-1.28.0\lib\libpkcs11-helper-1.dll”复制到“C:\nsis\OpenVPN-v2.3.18\bin
  • 将“LZO_v2.10\lzo-2.10-shared-DLL.7z”解压到“C:\lzo-2.10
  • 将“C:\lzo-2.10\lzo2.dll”复制到“C:\nsis\OpenVPN-v2.3.18\bin”
  • 将“OpenVPN_v2.5.4\openvpn_v2.5.4_20220123_for_XP.7z”解压到“C:\openvpn_v2.5.4_20220123_for_XP
  • 将“C:\openvpn_v2.5.4_20220123_for_XP\bin\openvpn.exe”复制到“C:\nsis\OpenVPN-v2.3.18\bin
  • 将“OpenVPN-GUI_v11.26\openvpn-gui_v11.26_20220123_for_XP.7z”解压到“C:\openvpn-gui_v11.26_20220123_for_XP
  • 将“C:\openvpn-gui_v11.26_20220123_for_XP\bin\openvpn-gui.exe”复制到“C:\nsis\OpenVPN-v2.3.18\bin
  • 将“C:\tap\tap-windows-9.9.2.exe”复制到“C:\nsis\OpenVPN-v2.3.18\$TEMP\tap-windows.exe
  • 删除目录“C:\nsis\openvpn-build-release-2.3
  • 将“NSIS-Installer\openvpn.nsi”复制到“C:\nsis\openvpn.nsi
  • 开始 > 程序 > NSIS > 编译 NSI 脚本
  • 菜单 > 文件 > 加载脚本... > 选择文件“C:\nsis\openvpn.nsi” > 打开 > NSI 脚本会自动编译,编译结束时不应看到任何错误 > 关闭 > 关闭 NSIS 编译器窗口

新创建的 OpenVPN 安装程序位于“C:\nsis\OpenVPN-v2.5.4.exe”。最终源代码包位于“NSIS-Installer\NSIS_Installer_Package_20220123_for_XP.7z”。

13. OpenVPN 配置文件更改以适应 Windows XP

我们应该更改 OpenVPN 配置文件中的以下三个参数以适应 Windows XP

  • block-outside-dns
  • route-ipv6 ::/0
  • auth-nocache

参数“block-outside-dns”用于阻止 DNS 流量并消除潜在的 DNS 泄漏。如果此参数在您的 VPN 配置文件中被注释掉了,您应该启用它。

为了完全禁用 IPv6 路由,我们应该注释掉参数“route-ipv6 ::/0”。否则,
我们将看到以下错误消息

ERROR: Windows route add ipv6 command failed: returned error code 1

我们也应该启用附加参数“auth-nocache”。这会禁用内存中的密码缓存。没有此参数,我们会在日志中看到以下错误消息

WARNING: this configuration may cache passwords in memory 
-- use the auth-nocache option to prevent this

一个正确的示例配置文件部分将如下所示

block-outside-dns
#route-ipv6 ::/0
auth-nocache

14. 测试 OpenVPN 是否正常工作

为了测试 OpenVPN 的正常工作,我们可以使用以下三个网站

  • https://hide.me/en/check
    检查 IP 地址和使用此地址的提供商。这应该只显示您的 VPN 网络中的服务器。

  • https://www.dnsleaktest.com
    检查 DNS 泄漏。如果流量未正确路由,DNS 泄漏可能会显示互联网浏览历史记录。

  • https://ipleak.net
    检查 DNS 泄漏和 WebRTC 泄漏。

要禁用浏览器中潜在的 WebRTC 泄漏,请根据您的浏览器执行以下步骤

  • Mozilla Firefox:在地址栏中键入“about:config”,向下滚动到“media.peerconnection.enabled”,双击将其设置为false
  • Google Chrome:安装 Google 官方扩展 WebRTC Network Limiter
  • Opera:在地址栏中键入“about:config”或转到“设置”,选择“显示高级设置”并单击“隐私与安全”。在“WebRTC”下,选择“禁用非代理 UDP”。

15. OpenVPN v2.5.4 Windows XP SP3 错误

OpenVPN v2.5.4 在 Windows XP SP3 上存在一个严重 bug。如果我们尝试连接到 VPN 服务器,我们会在日志文件中看到以下缓冲区大小错误

2022-01-09 14:24:02 open_tun
2022-01-09 14:24:02 MANAGEMENT: Client disconnected
2022-01-09 14:24:02 fatal buffer size error, size=2089877947
2022-01-09 14:24:02 Exiting due to fatal error

2089877947 的缓冲区大小可能随机变化。此错误是由源文件“tun.c”和函数“get_device_instance_id_interface”引起的。对 CM_Get_Device_Interface_List_Size 的调用返回 CR_SUCCESS 和一个随机的接口列表大小,这是无效的,并且基于函数入口时变量 dev_interface_list_size 的值。这就是为什么接下来调用 alloc_buf_gc 会失败,因为指定的缓冲区大小过大。要解决此问题,我们只需更改第 3672 行代码

ULONG dev_interface_list_size;

to

ULONG dev_interface_list_size = 0;

这会将设备接口列表大小初始化为零,在 Windows XP SP3 上,空列表的返回列表大小为 1。错误不会出现在 Windows Server 2003 R2 SP2 上,它会在没有任何问题的情况下返回一个有效的列表大小。

16. 版本和下载链接

所有必需文件的完整 OpenVPN 包可从 Sourceforge 下载,因为我们未能将 450 MB 的数据上传到 CodeProject。

感谢您的关注和对该主题的兴趣。
致以 Kai Schtrom

历史记录

  • 2022 年 1 月 23 日:版本 1.0
© . All rights reserved.