3. 实验环境搭建与源码编译

Snort 3 与 Snort 2 在构建体系上有本质差异:Snort 2 使用 Autotools(configure/make),而 Snort 3 改用 CMake,并依赖一批第三方库完成数据包捕获、规则解析、HTTP 解析、Lua 配置、PCRE 正则匹配等功能。因此本节的核心任务不是“敲几条命令”,而是理解“哪些库解决什么问题、CMake 如何找到它们、编译产物装到哪里、如何用最小流量验证安装成功”。

一、依赖库准备:先分清“必需”与“可选”

在 Ubuntu 22.04 环境下,Snort 3 的构建依赖可分为四类。第一类是编译工具链:gcc、g++、make、cmake、pkg-config、flex、bison。第二类是数据包捕获与网络层:libpcap-dev 负责抓包,libdnet-dev 提供底层网络接口操作,libdaq-dev 是 Snort 3 的数据采集抽象层,负责把 pcap、afpacket、nfq 等采集方式统一成 DAQ 实例。第三类是协议解析与规则匹配:libpcre2-dev 提供 PCRE2 正则引擎,zlib1g-dev 用于解压规则包,liblzma-dev 支持 xz 压缩,libssl-dev 用于 TLS/哈希相关功能。第四类是配置与脚本:liblua5.3-dev 或 liblua5.4-dev,因为 Snort 3 的配置文件 snort.lua 本身就是 Lua 脚本。

安装命令可一次性执行:

sudo apt update
sudo apt install -y build-essential cmake pkg-config flex bison \
  libpcap-dev libdnet-dev libdaq-dev libpcre2-dev zlib1g-dev \
  liblzma-dev libssl-dev liblua5.3-dev libhwloc-dev libnuma-dev \
  libluajit-5.1-dev libunwind-dev

其中 libhwloc-dev 与 libnuma-dev 用于多线程与 NUMA 亲和性绑定,libunwind-dev 用于崩溃回溯。若编译时提示找不到某个库,优先用 pkg-config --modversion 库名 确认版本,而不是盲目重装。

二、源码获取与目录规划

Snort 3 源码托管在 GitHub,推荐使用固定版本标签而非 main 分支,便于复现。示例采用 3.1.78.0:

mkdir -p ~/snort3-src && cd ~/snort3-src
git clone https://github.com/snort3/libdaq.git
git clone https://github.com/snort3/snort3.git
cd libdaq && git checkout v3.0.16 && cd ..
cd snort3 && git checkout 3.1.78.0 && cd ..

注意 libdaq 必须先于 snort3 编译安装,因为 snort3 的 CMake 会通过 pkg-config 查找 daq 模块。若顺序颠倒,CMake 配置阶段会报 Could NOT find DAQ。

三、编译选项与安装部署

libdaq 的构建:

cd ~/snort3-src/libdaq
./bootstrap.sh
./configure --prefix=/usr/local
make -j$(nproc)
sudo make install
sudo ldconfig

snort3 的构建使用 CMake,关键选项如下:-DCMAKE_INSTALL_PREFIX=/usr/local/snort 指定安装前缀;-DENABLE_STATIC=OFF 使用动态链接;-DCMAKE_BUILD_TYPE=Release 开启优化;-DBUILD_DAQ=OFF 表示不重复构建 DAQ。示例命令:

cd ~/snort3-src/snort3
mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/snort \
  -DCMAKE_BUILD_TYPE=Release -DENABLE_STATIC=OFF
make -j$(nproc)
sudo make install
sudo ldconfig

安装完成后,/usr/local/snort 下会形成清晰的目录结构:bin/ 存放 snort 主程序;lib/ 存放插件动态库(如 snort_http_inspect.so);include/ 存放开发头文件;etc/ 存放默认配置;share/ 存放规则与文档。理解这一结构对后续排障很关键:插件加载失败通常查 lib/,配置解析失败通常查 etc/。

Snort 3 构建与部署链路 依赖库 libpcap / libdnet libdaq(DAQ 抽象层) libpcre2 / zlib / lzma libssl / liblua5.3 hwloc / numa / unwind 源码获取 git clone libdaq git clone snort3 checkout 固定 tag libdaq 先编译 snort3 后编译 CMake 编译 -DCMAKE_INSTALL_PREFIX -DCMAKE_BUILD_TYPE=Release -DENABLE_STATIC=OFF make -j$(nproc) make install 安装目录 /usr/local/snort/bin /usr/local/snort/lib /usr/local/snort/etc /usr/local/snort/share ldconfig 刷新缓存 最小可运行验证 snort -V 版本与插件列表 snort -c snort.lua -T 配置语法自检 -r test.pcap -A alert_fast 离线回放触发告警 结果判读 ✓ 输出 “Commencing packet processing” ✓ alert_fast.txt 出现告警行 ✗ 报 “can't load DAQ” → 检查 libdaq 安装

四、最小可运行验证:三步确认

安装完成后不要急着加载完整规则集,先用三步最小验证确认“程序能跑、配置能读、流量能过”。

第一步,版本与插件自检:

/usr/local/snort/bin/snort -V

正常输出会打印 Snort++ Version 3.1.78.0,并列出已加载的插件模块,如 http_inspect、stream_tcp、daq_pcap。若插件列表为空,说明 lib/ 下的动态库未被正确加载,需检查 LD_LIBRARY_PATH 或 ldconfig。

第二步,配置语法自检:

/usr/local/snort/bin/snort -c /usr/local/snort/etc/snort/snort.lua -T

-T 表示 test mode,只解析配置不抓包。若输出 Snort successfully validated the configuration,说明 Lua 配置、模块参数、规则路径均正确。常见错误是 IPS 模式下未指定 daq 变量,或 rules 路径不存在。

第三步,离线 pcap 回放:

/usr/local/snort/bin/snort -c /usr/local/snort/etc/snort/snort.lua \
  -r /tmp/test.pcap -A alert_fast -q

这里 -r 读取离线包,-A alert_fast 指定告警输出格式,-q 静默模式。若 /tmp/test.pcap 中包含一条匹配 alert icmp any any -> any any 的 ICMP 包,则会在当前目录生成 alert_fast.txt,内容形如 [**] [1:1000001:0] ICMP test [**]。看到该行即证明“抓包—解码—规则匹配—告警输出”整条链路贯通。

若 -r 回放无告警,先确认规则是否真正加载:在 snort.lua 中检查 ips = { rules = [[/usr/local/snort/etc/rules/local.rules]] } 路径,并用 snort -c ... --warn-all 查看规则加载警告。

五、常见编译与部署问题定位

CMake 阶段报 Could NOT find DAQ,通常是 libdaq 未安装或 PKG_CONFIG_PATH 未包含 /usr/local/lib/pkgconfig,可执行 export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH 后重新 cmake。运行阶段报 can't load DAQ module,说明 daq 插件目录未注册,需确认 /usr/local/lib/daq 存在且 ldconfig 已执行。若启动即报 Lua error,优先检查 snort.lua 中是否误用了 Snort 2 的语法,例如把 var HOME_NET 直接写入 Lua 配置。

完成本节后,应能独立回答三个问题:每个依赖库解决什么问题;CMake 如何找到 DAQ 与 PCRE2;如何用 -V、-T、-r 三步确认安装可用。这三步也是后续规则编写、性能调优与排障的基线环境。