1 在Windows上构建Zabbix agent

概述

本节演示如何从源代码构建带或不带TLS的Zabbix Windows agent二进制文件

编译OpenSSL

以下步骤将帮助您在MS Windows 10(64位)系统上从源码编译OpenSSL。

  1. 在Windows机器上编译OpenSSL需要准备:

    1. C编译器(例如VS 2017 RC),
    2. NASM(https://www.nasm.us/),
    3. Perl(例如从http://strawberryperl.com/获取Strawberry Perl),
    4. Perl模块Text::Template(通过cpan Text::Template安装).
  2. https://www.openssl.org/获取OpenSSL源码。本文使用OpenSSL 1.1.1版本。

  3. 解压OpenSSL源码,例如解压到E:\openssl-1.1.1目录。

  4. 打开命令行窗口,例如VS 2017 RC的x64 Native Tools Command Prompt。

  5. 进入OpenSSL源码目录,例如E:\openssl-1.1.1。

    1. 验证NASM是否可用:e:\openssl-1.1.1> nasm --version NASM version 2.13.01 compiled on May 1 2017
  6. 配置OpenSSL,用于

    example:e:\openssl-1.1.1> perl E:\openssl-1.1.1\Configure VC-WIN64A no-shared no-capieng no-srp no-gost no-dgram no-dtls1-method no-dtls1_2-method --api=1.1.0 --prefix=C:\OpenSSL-Win64-111-static --openssldir=C:\OpenSSL-Win64-111-static

请确保撤销非管理员用户对OpenSSL安装目录(C:\OpenSSL-Win64-111-static)的写入权限。否则,Zabbix agent会从可能被非特权用户修改的路径加载SSL设置,导致潜在的安全漏洞。

  • 注意'no-shared'选项:如果使用'no-shared',则OpenSSL静态库libcrypto.lib和libssl.lib将具备'自包含性',生成的Zabbix二进制文件将内置OpenSSL,无需外部OpenSSL DLL。优点:Zabbix二进制文件可以复制到没有OpenSSL库的其他Windows机器上。缺点:当新的OpenSSL修复version发布时,需要重新编译和重新安装Zabbix agent。
  • 如果不使用'no-shared',则静态库libcrypto.lib和libssl.lib将在运行时使用OpenSSL DLL。优点:当新的OpenSSL修复version发布时,可能只需升级OpenSSL DLL而无需重新编译Zabbix agent。缺点:将Zabbix agent复制到其他机器时也需要复制OpenSSL DLL。
  1. 编译OpenSSL,run测试,安装:e:\openssl-1.1.1> nmake e:\openssl-1.1.1> nmake test ... All tests successful. Files=152, Tests=1152, 501 wallclock secs ( 0.67 usr + 0.61 sys = 1.28 CPU) Result: PASS e:\openssl-1.1.1> nmake install_sw'install_sw'仅安装软件组件(即库文件和头文件,不包括文档)。如需完整安装,请使用"nmake install"。

编译PCRE

  1. 下载PCRE或PCRE2(Zabbix 6.0起支持)库(https://pcre.org/)。
  2. 解压到目录E:\pcre2-10.39
  3. https://cmake.org/download/安装CMake,安装过程中选择:并确保cmake\bin在您的路径中(测试版本version 3.9.4)。
  4. 创建一个新的空构建目录,最好是源代码目录的子目录。例如,E:\pcre2-10.39\build
  5. 打开命令行窗口,例如VS 2017的x64 Native Tools Command Prompt,并从该shell环境run cmake-gui。不要尝试从Windows开始菜单启动Cmake,这可能导致错误。
  6. 分别输入E:\pcre2-10.39E:\pcre2-10.39\build作为源代码和构建目录。
  7. 点击"Configure"按钮。
  8. 在指定此项目的生成器时选择"NMake Makefiles"。
  9. 创建一个新的空安装目录。例如,E:\pcre2-10.39-install
  10. GUI将列出多个配置选项。确保选择以下选项:
    • PCRE_SUPPORT_UNICODE_PROPERTIES ON
    • PCRE_SUPPORT_UTF ON
    • CMAKE_INSTALL_PREFIX E:\pcre2-10.39-install
  11. 再次点击"Configure"。相邻的"Generate"按钮现在应该处于活动状态。
  12. 点击"Generate"。
  13. 如果出现错误,建议在尝试重复CMake构建过程之前delete CMake缓存。在CMake GUI中,可以通过选择"File > Delete Cache"来删除缓存。
  14. 构建目录现在应包含一个可用的构建系统 - Makefile
  15. 打开命令行窗口,例如VS 2017的x64 Native Tools Command Prompt,并导航到上述Makefile
  16. 运行NMake命令:E:\pcre2-10.39\build> nmake install

编译Zabbix

以下步骤将帮助您在MS Windows 10(64位)系统上从源代码编译Zabbix。无论是否启用TLS支持,编译Zabbix的主要区别仅体现在第4步。

  1. 在Linux机器上检出源代码: $ git clone https://git.zabbix.com/scm/zbx/zabbix.git $ cd zabbix $ ./bootstrap.sh $ ./configure --enable-agent --enable-ipv6 --prefix=`pwd` $ make dbschema $ make dist
  2. 将生成的压缩包(例如zabbix-4.4.0.tar.gz)复制到Windows机器并解压。
  3. 假设源代码位于e:\zabbix-4.4.0目录。打开命令行窗口(例如VS 2017 RC的x64 Native Tools Command Prompt),进入E:\zabbix-4.4.0\build\win32\project目录。
  4. 编译zabbix_get、zabbix_sender和zabbix_agent:
    • 不启用TLS: E:\zabbix-4.4.0\build\win32\project> nmake /K PCREINCDIR=E:\pcre2-10.39-install\include PCRELIBDIR=E:\pcre2-10.39-install\lib
    • 启用TLS: E:\zabbix-4.4.0\build\win32\project> nmake /K -f Makefile_get TLS=openssl TLSINCDIR=C:\OpenSSL-Win64-111-static\include TLSLIBDIR=C:\OpenSSL-Win64-111-static\lib PCREINCDIR=E:\pcre2-10.39-install\include PCRELIBDIR=E:\pcre2-10.39-install\lib E:\zabbix-4.4.0\build\win32\project> nmake /K -f Makefile_sender TLS=openssl TLSINCDIR="C:\OpenSSL-Win64-111-static\include TLSLIBDIR="C:\OpenSSL-Win64-111-static\lib" PCREINCDIR=E:\pcre2-10.39-install\include PCRELIBDIR=E:\pcre2-10.39-install\lib E:\zabbix-4.4.0\build\win32\project> nmake /K -f Makefile_agent TLS=openssl TLSINCDIR=C:\OpenSSL-Win64-111-static\include TLSLIBDIR=C:\OpenSSL-Win64-111-static\lib PCREINCDIR=E:\pcre2-10.39-install\include PCRELIBDIR=E:\pcre2-10.39-install\lib
  5. 新生成的二进制文件位于e:\zabbix-4.4.0\bin\win64目录。由于OpenSSL是以'no-shared'选项编译的,Zabbix二进制文件已内置OpenSSL,可复制到未安装OpenSSL的其他机器上运行。

使用LibreSSL编译Zabbix

该过程与使用OpenSSL编译类似,但需要对位于build\win32\project目录中的文件进行小幅修改:

  • 在Makefile_tls delete /DHAVE_OPENSSL_WITH_PSK中,即查找:

CFLAGS = $(CFLAGS) /DHAVE_OPENSSL /DHAVE_OPENSSL_WITH_PSK

and replace it with

CFLAGS = $(CFLAGS) /DHAVE_OPENSSL

       ```- 在Makefile_common.inc中添加`/NODEFAULTLIB:LIBCMT`,即查找:
       

/MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DYNAMICBASE:NO /PDB:$(TARGETDIR)$(TARGETNAME).pdb

/MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DYNAMICBASE:NO /PDB:$(TARGETDIR)$(TARGETNAME).pdb /NODEFAULTLIB:LIBCMT ```