返回更新列表
新发布Aug 1, 2026

maltrail v2.2

基于公开黑名单、静态恶意软件痕迹和启发式分析的实时恶意流量检测系统,用于识别DNS、HTTP和IP流量中的威胁。

分享

Maltrail

License Sensor Server Trails X

Maltrail

Maltrail 是一个网络流量检测系统,用于识别与已知恶意基础设施的通信,并报告选定的流量异常。它会将网络中观察到的域名、URL、IP 地址、IP:port 对以及 User-Agent 值与一组称为 trails 的指标进行匹配。

检测结果会记录为单个事件,其中包含源地址、目标地址、协议、匹配的 trail、分类以及 trail 来源:```text "2026-08-07 09:14:22.117034" gw 10.13.13.2 57809 1.1.1.1 53 UDP DNS malware.bakewithdavid.com "asyncrat (malware)" (static)

Maltrail 专为基于指标的网络监控而设计。其启发式检测补充了特征匹配,但并不能替代端点遥测或通用入侵防御系统。

## Features

- 完整特征构建,包含超过 3,000 个捆绑静态文件、42 个公共源集成,以及可选的运维人员提供的特征。
- 一个多线程 Rust 传感器,使用 libpcap,并提供可选的 Linux `PACKET_FANOUT` 捕获工作线程。
- 一个 Python 服务器,提供报告界面、事件接收和 HTTP API。
- 纯文本自定义特征和白名单,可审查并纳入版本控制。
- 针对扫描、DNS 耗尽、类 DGA 查询、可疑下载、代理探测、可疑 User-Agent 值及相关网络活动的启发式检测。
- 本地事件日志、远程 Maltrail 日志、基于 syslog 的 CEF 以及 Logstash JSON 输出。
- 通过 `maltrail-sensor -T` 进行部署验证,并提供可选的 Prometheus 指标。

## Contents

- [架构](#architecture)
- [性能](#performance)
- [安装](#installation)
  - [安装程序](#installer)
  - [从源码构建](#building-from-source)
  - [Systemd](#systemd)
  - [Docker](#docker)
- [配置](#configuration)
- [特征](#trails)
- [事件和 API](#events-and-api)
- [运维](#operations)
  - [监控](#monitoring)
  - [事件保留](#event-retention)
- [文档](#documentation)
- [贡献](#contributing)
- [项目](#project)
  - [许可证](#license)
  - [维护者](#maintainers)
  - [赞助者](#sponsors)
  - [演示与出版物](#presentations-and-publications)
  - [衍生黑名单](#derived-blacklist)
  - [第三方集成](#third-party-integrations)
  - [致谢](#acknowledgements)

## 架构

Maltrail 由两个独立的进程组成,它们可以运行在同一台主机上,也可以运行在不同主机上:```text
   ┌──────────┐   events (UDP or file)   ┌──────────┐
   │  sensor  │ ───────────────────────► │  server  │ ◄── browser
   └──────────┘                          └──────────┘
    Rust                                  Python
    libpcap + PACKET_FANOUT               reporting UI + API
    trail matching + heuristics

传感器捕获流量,执行轨迹匹配和启发式分析,并产生事件。 它可以本地写入事件(LOG_DIR),将其发送到远程 Maltrail 服务器(LOG_SERVER),或两者兼做。它还可以通过 syslog 发送 CEF(SYSLOG_SERVER),并将 JSON 发送到 Logstash(LOGSTASH_SERVER)。

服务器接收并存储远程事件,提供本地可用的事件日志,并提供 Web 界面和 API。

性能

性能取决于处理器、流量组成、轨迹集大小、捕获驱动程序和网络接口。下图测量的是传感器数据包处理路径的隔离性能;它们不是端到端的实时捕获测量结果。

在启用启发式功能并拥有 150 万行轨迹集的 AMD Ryzen 7 PRO 4750U 上的代表性测量结果:

流量每数据包耗时
ICMP 回显,58 字节101 ns
TCP SYN,70 字节302 ns
批量 TLS,1,473 字节402 ns
带热缓存的 DNS 查询,93 字节452 ns
混合流量,平均 866 字节552 ns
HTTP 请求,169 字节602 ns
带唯一名称的 DNS 查询,93 字节1,102 ns

使用相同生成的捕获、配置和轨迹集进行的离线对比运行测得,在测试的系统中,稳态每数据包成本比已退役的 Python 传感器低 14–37 倍。对比工具会单独报告整个进程的时间,因为轨迹加载在短时重放中占主导地位。它还会打印事件数量;功能一致性由一致性语料库独立测试。

在目标系统上运行对比:```bash python3 sensor/tools/bench_compare.py --packets 300000
--trails ~/.maltrail/trails.csv --repeat 3

默认使用一个捕获工作进程。增加工作进程可以提高捕获容量,但 Linux 流哈希会在工作进程之间划分每个源的状态,从而降低某些扫描启发式规则的灵敏度。在记录在案的测试中,单工作进程的启发式警报在使用两个工作进程时保留了 91%,使用四个时保留了 86%,使用八个时保留了 65%。精确轨迹匹配保持不变。仅当捕获丢弃指标表明有必要时,才增加 `CAPTURE_FANOUT`。

基准测试方法、硬件结果、性能分析器输出、内存测量以及实时 fanout 检查已记录在 [`sensor/docs/REPORT.md`](https://github.com/stamparm/maltrail/blob/HEAD/sensor/docs/REPORT.md) 中。

## 安装

### 安装程序

安装程序支持 Debian、Ubuntu、Raspberry Pi OS、RHEL、Fedora 和 openSUSE:```bash
curl -fsSL https://raw.githubusercontent.com/stamparm/maltrail/master/install.sh | sudo sh

它会安装依赖项,在 /opt/maltrail 下创建受管检出目录,验证预构建传感器的校验和,创建非特权 maltrail 账户,安装 systemd 单元,准备日志和状态目录,然后启动传感器和服务器。重新运行安装程序会升级该受管检出目录。

在提升权限运行脚本之前,请先审阅该脚本。从现有检出目录中,试运行会显示命令而不更改系统:```bash sh install.sh --dry-run

常见安装程序选项:```bash
sh install.sh --role sensor      # Install only the sensor
sh install.sh --ref 3.1.1        # Install a release tag instead of master
sh install.sh --no-service       # Install without changing systemd
sh install.sh --dry-run          # Print commands without applying them
sh install.sh --uninstall        # Remove the managed installation; keep logs and state

安装后,仪表板可在 http://127.0.0.1:8338 访问。请注意,随附的 HTTP_ADDRESS0.0.0.0,因此可在 每个 接口上访问,而不仅仅是回环接口 — 并且 默认凭据为 admin / changeme!。请更改 USERS,并将 HTTP_ADDRESS 设置为 127.0.0.1(或将服务器置于启用 TLS 的反向代理之后), 以免主机接入不受信任的网络。

初始 trail 构建可能需要几分钟。传感器不会检测 trail 匹配,直到 有效的 trail 集可用为止。systemd 单元会在启动前运行传感器的 -T 验证, 因此缺失权限、日志目录不可写或 trail 集无效都会导致启动 明显失败。

安装程序测试工具集涵盖 Ubuntu、Debian、Fedora、openSUSE 和 Alpine 容器。Alpine 使用 musl 且不使用预构建的 glibc 传感器二进制文件;请在那里从源码构建传感器。

从源码构建

传感器需要 Rust 1.74 或更高版本、libpcap 开发头文件以及系统的 capability 工具。服务器和 trail 更新器需要 Python 3.6 或更高版本。

安装发行版软件包:```bash

Debian / Ubuntu / Raspberry Pi OS

sudo apt-get install cargo libpcap-dev libcap2-bin python3

RHEL / Fedora

sudo dnf install cargo libpcap-devel libcap python3

openSUSE / SLES

sudo zypper install cargo rust libpcap-devel libcap-progs python311

然后构建并验证传感器:```bash
git clone --depth 1 https://github.com/stamparm/maltrail.git
cd maltrail

cargo build --release --manifest-path sensor/Cargo.toml

sudo setcap cap_net_raw,cap_net_admin=eip \
  sensor/target/release/maltrail-sensor

sudo install -d -o "$USER" -g "$(id -gn)" -m 750 /var/log/maltrail

sensor/target/release/maltrail-sensor -T
sensor/target/release/maltrail-sensor

在另一个终端或另一台主机上启动服务器:```bash python3 server.py

预构建的 `x86_64` 和 `aarch64` 传感器二进制文件随当前版本提供,并带有 SHA-256
校验和。它们面向 glibc 2.28,并在运行时需要 libpcap。在基于 musl 的系统(如
Alpine Linux)上,请从源码构建。

已退役的 Python 传感器仅用于比较与一致性工具。这些工具还
要求 `pcapy-ng` 和 Python 开发头文件,如
[`sensor/docs/INSTALL.md`](https://github.com/stamparm/maltrail/blob/HEAD/sensor/docs/INSTALL.md) 中所述。

### Systemd

提供的 `maltrail-server.service` 和 `maltrail-sensor.service` 单元以
非特权 `maltrail` 用户身份运行这两个进程。Systemd 会创建 `/var/log/maltrail` 和 `/var/lib/maltrail`,限制
文件系统访问,并授予传感器 `CAP_NET_RAW` 和 `CAP_NET_ADMIN`。

安装程序会自动配置这些单元。对于现有的源码安装,请按照
[`sensor/docs/INSTALL.md`](https://github.com/stamparm/maltrail/blob/HEAD/sensor/docs/INSTALL.md) 中的手动服务流程操作。

使用以下命令检查服务状态和日志:```bash
systemctl status maltrail-sensor maltrail-server
journalctl -u maltrail-sensor -f

Docker

使用以下命令启动随附的 Compose 部署:```bash docker compose -f docker/docker-compose.yml up -d

容器配置、存储、特权及健康检查记录于
[`docker/README.md`](https://github.com/stamparm/maltrail/blob/HEAD/docker/README.md)。

## 配置

Maltrail 读取 `maltrail.conf`,其中包含独立的 `[Sensor]` 和 `[Server]` 设置。安装程序将受管配置放置在 `/etc/maltrail.conf`。

常用的传感器选项包括:

| Option | Purpose |
| --- | --- |
| `MONITOR_INTERFACE` | 捕获接口或接口列表;`any` 选择所有受支持的接口 |
| `CAPTURE_FILTER` | BPF 捕获过滤器 |
| `CAPTURE_FANOUT` | Linux 捕获套接字数量;默认为一 |
| `LOG_DIR` | 本地事件日志目录 |
| `TRAILS_FILE` | 生成的 trail 数据库 |
| `LOG_SERVER` | 远程 Maltrail 事件服务器 |
| `SYSLOG_SERVER` | CEF syslog 目标或目标列表 |
| `LOGSTASH_SERVER` | Logstash JSON 目标或目标列表 |
| `STATS_ADDRESS` | Prometheus 指标监听器;除非配置,否则禁用 |
| `UPDATE_PERIOD` | Trail 刷新间隔 |
| `USER_WHITELIST` | 不应触发告警的操作员管理指标 |
| `CUSTOM_TRAILS_DIR` | 操作员管理的 trail 目录 |

`PROCESS_COUNT` 适用于已退役的 Python 传感器。Rust 传感器的捕获工作进程应改用 `CAPTURE_FANOUT` 配置。

更改配置后,请运行部署检查:```bash
sensor/target/release/maltrail-sensor -T

该检查会验证配置、痕迹、白名单条目、捕获过滤器、权限、日志 存储、更新支持和工作线程设置。成功的检查会包含非零的痕迹和白名单 计数,而不仅仅是确认文件存在。

痕迹

痕迹以纯文本指示符形式存储:```text trails/static/malware/ malware-related static trails trails/static/malicious/ malicious infrastructure trails/static/suspicious/ suspicious infrastructure and behavior trails/feeds/*.py public feed integrations

在 `CUSTOM_TRAILS_DIR` 下添加本地指标。将永远不应生成警报的指标添加
到 `USER_WHITELIST`。将自定义数据保留在受管检出之外可防止升级
覆盖它。

更新程序根据已启用的数据源、捆绑的静态 trail 和自定义 trail 重新构建 `TRAILS_FILE`。只有
在构建成功后才以原子方式发布新文件。空数据源或失败的数据源会被报告,因此运行中的部署不会静默
依赖过期或已停用的数据源。

Trail 贡献应包含指标、分类和可验证的来源。在提交拉取请求之前,请参阅
[Contributing](#contributing)。

## 事件与 API

Maltrail 每次检测记录一个以空白字符分隔的事件,使用 CSV 引用来处理值
包含空格的情况:```text
"<time>" <sensor> <src_ip> <src_port> <dst_ip> <dst_port> <proto> <type> <trail> "<info>" <reference>

type 字段标识匹配的内容,包括 DNSIPIPORTURLPATHHTTPUAPORTCERTinfo 字段包含轨迹分类,reference 标识产生该结果的静态列表、订阅源、自定义来源或启发式规则。

指标查询

使用 /check 查询一个域名、IP 地址或 URL:```bash curl 'http://127.0.0.1:8338/check?q=www.sub.evil.example'

请提供需要翻译的Markdown内容。```json
{
  "query": "www.sub.evil.example",
  "found": true,
  "trail": "evil.example",
  "info": "asyncrat (malware)",
  "reference": "(static)"
}

子域查询可以匹配其列出的父域。URL 查询会先检查 host/path,然后再单独检查 主机。服务器读取内存映射的 trail 数据库,无需重启即可观察到 trail 更新。

公共静态和 feed trail 无需身份验证即可使用,与远程传感器使用的 /trails 端点一致。自定义 trail 需要授权会话;未授权的仅自定义查询 会被报告为未命中。事件数据始终保持需认证状态。

操作

监控

使用 maltrail-sensor -T 作为部署和配置门禁。随附的 systemd 单元将其 作为 ExecStartPre 运行。

配置了 STATS_ADDRESS 时,至少监控以下 Prometheus 指标:

指标操作含义
maltrail_up == 0没有捕获工作进程在运行
Increasing maltrail_capture_dropped_total捕获环形缓冲区正在丢弃数据包
Increasing maltrail_local_log_errors_total事件已产生但无法写入本地
Increasing maltrail_remote_log_errors_total事件无法传送到远程接收端;启用 DISABLE_LOCAL_LOG_STORAGE 时这些事件将丢失
maltrail_trail_generation 不推进活动 trail 集未被刷新
maltrail_log_dir_free_bytes本地事件存储的剩余容量
Increasing maltrail_state_saturations_total已达到某个启发式状态限制
Increasing maltrail_throttle_evictions_total事件节流表已达上限,事件比配置的时间更早被聚合

状态饱和会影响相应的启发式逻辑;精确 trail 匹配仍然有效。

发送 SIGHUP 或使用 systemctl reload maltrail-sensor 请求重新加载 trail。由其他进程更新的 trail 文件会被自动检测并发布到工作进程,而无需 重启传感器。

精简可观察存储(USE_CONDENSED_STORAGE, meta.sqlite)支持服务器的 novelty 和 retro-hunt 视图。与已退役传感器的兼容性记录在 sensor/docs/COMPATIBILITY.md 中。

事件保留

Maltrail 不会轮转或删除事件日志。运营人员负责根据存储要求和组织策略定义保留、 归档和删除。

推荐做法:

  • 使用 LOG_SERVERSYSLOG_SERVERLOGSTASH_SERVER 将持久事件副本发送到远程 Maltrail 服务器 或 SIEM。
  • 针对 maltrail_log_dir_free_bytes 设置告警,并为预期事件速率预留足够余量。
  • 使用外部工具轮转、归档或删除本地每日日志。
  • 将报告界面所需的文件以未压缩形式保留在 LOG_DIR 中;将压缩文件 归档到其他位置。

当日志文件系统已满时,传感器无法追加事件。事件日志还可能包含在某些司法管辖区被认定为个人数据的 IP 地址和域名;保留策略 应考虑适用的要求。

文档

文档内容
sensor/docs/INSTALL.md安装、权限、配置和故障排除
sensor/docs/ARCHITECTURE.md传感器内部结构和数据流
sensor/docs/COMPATIBILITY.md与已退役的 Python 传感器在刻意设计上的差异
sensor/docs/REPORT.md测量、配置文件和测试结果
sensor/docs/ROADMAP.md待处理的传感器工作
old/README.md已退役的 Python 传感器,保留作为对等一致性参考

贡献

欢迎提交 trail 新增、feed 维护、错误报告、文档和传感器改进。 trail 提交应包含可靠的来源,并使用最窄的适当 分类。

在提交代码之前运行相关检查。完整的传感器门禁为:```bash bash sensor/tools/check.sh

它运行格式化、Clippy(禁止警告)、调试与发布测试,以及针对已退役 Python 传感器的奇偶校验回放。使用以下命令运行 Python 服务器套件:```bash
bash tests/run.sh python3

项目

许可证

Maltrail 在 MIT 许可证下分发。参见 LICENSE

维护者

赞助商

演示与出版物

  • 第 47 届 TF-CSIRT 会议,布拉格,2016 (幻灯片)
  • 《使用 Maltrail 检测网络攻击》,《Linux Magazine》,2022 (文章)
  • 《最佳网络威胁情报源》,Silent Push,2022 (评测)
  • 《基于 Maltrail 的网络恶意流量检测系统研究》,《Nanotechnology Perceptions》,2024 (论文)

衍生黑名单

trails/static/malware 派生的仅域名列表发布在 maltrail-malware-domains.txt。 它可用作 DNS 过滤系统的输入,但操作员在启用拦截前应审查并测试它。 威胁情报列表可能包含误报或不适用于所有环境的指标。

第三方集成

致谢

  • Thomas Kristner
  • Eduardo Arcusa Les
  • James Lay
  • Ladislav Baco (@laciKE)
  • John Kristoff (@jtkdpu)
  • Michael Münz (@mimugmail)
  • David Brush
  • @Godwottery
  • Chris Wild (@briskets)
  • Keith Irwin (@ki9us)
  • Simon Szustkowski (@simonszu)

分类