开发协议插件
使用 Go 或 Rust 创建独立 Wasm 项目,无需修改 NetFlowScout 源码。宿主负责网络重组、连接生命周期、归因、规则和输出;你的插件实现分帧、协议状态机和请求响应关联。
创建 Go 插件
开发机安装官方 Go ≥ 1.24 和可在本机运行的 NetFlowScout CLI,不需要 TinyGo:
netflowscout plugin init --language go --directory ./acme-tcp --template tcp --port 19090
cd acme-tcp
sh build.sh
NETFLOWSCOUT=/absolute/path/netflowscout sh test.sh在 init() 中调用 plugin.Register(process),通过 plugin.Emit / EmitJSON 输出。构建使用 wasip1/wasm -buildmode=c-shared;reactor 初始化不调用 main。不要使用后台 goroutine、sleep 或 I/O。SDK 在回调后推进 runtime 调度;升级 SDK 需要重新编译 Wasm。
创建 Rust 或 UDP 插件
netflowscout plugin init --directory ./acme-udp --template udp --port 19091
cd acme-udp
rustup target add wasm32-unknown-unknown
sh build.sh
sh test.shRust 是默认语言。使用 export_plugin!(process)、emit_json 和 quote;模板 SDK 不依赖外部 crate。目标目录必须不存在,名称须匹配 [a-z][a-z0-9_]{0,39};默认由目录名将连字符转下划线。
项目结构和开发循环
| 文件 | 修改内容 |
|---|---|
main.go / parser.go 或 src/lib.rs | 解析状态机、方向、关联队列 |
sdk/ | 自带独立 SDK 及 API 文档;可以整体搬移项目 |
manifest.json | 唯一协议、端口、版本、资源和可选识别签名 |
schema.json | 记录类型、string/number/bool 字段和敏感性 |
fixtures/ | 虚构回放输入和人工确认的 expected 结果 |
rules.nfs / netflowscout.json | 隔离的开发规则和配置 |
dist/ | build 后可安装的 manifest、Wasm 和 schema |
TCP 模板按 LF 分行,必须覆盖半包、粘包、双向交错、缺口、关闭及上限。UDP 按完整报文解析,包括空报文。模板是最小文本协议示例,不能当作任意生产协议语义。
test.sh 执行正式 Wasm 黄金回放,比较 type、fields、incomplete、truncated,不创建队列或向外投递。expected 是明文,使用虚构或去敏数据;不要用被测解析器自动覆盖黄金文件。
安装和激活
sudo netflowscout plugin install --source ./dist \
--directory /usr/local/lib/netflowscout/plugins/acme_tcp
sudo netflowscout check --config /etc/netflowscout/netflowscout.json将安装目录或父目录加入生产 plugins,添加所需规则。不要用开发配置覆盖生产配置。
- 首次引入 schema 或修改字段类型/敏感性:协调重启主服务和分析器。
- 同 schema 的兼容更新:递增版本,build/test/install/check 后 reload 分析器。
sudo systemctl reload netflowscout-analyzer.service
netflowscout plugin info --config /etc/netflowscout/netflowscout.jsonreload 成功只表示信号发出;确认运行摘要和新请求。新连接使用新版本,老连接固定旧版本直到排空。失败保留旧集合;可以 plugin rollback --directory ... 后 check/reload 回退。
接入 TLS 明文
设置主配置 application_source=endpoint,端点配置 plugins 指向同一目录。默认模板使用端口路由;可靠魔数可加入 manifest detection,供未知 TCP 端口及端点识别。更新签名后重启 discovery。TLS 探针负责取得明文,解析插件本身不解密 TLS。
更多生命周期、资源及输出要求见插件契约。插件由管理员审核安装,当前不提供公共市场或签名信任链。