跳转到内容

检测与抓包

[detect]
threshold = 20 # 触发次数
window = "60s" # 检测时长(滑动窗口)
alert_duration = "10m" # 持续提示时长
interval = "2s" # 扫描间隔
项 默认 说明
threshold 20 同一设备同一端口在窗口内出现的不同远端公网 IP 数量达到该值即告警
window 60s 滑动窗口长度,支持 30s / 5m / 1h 或整数秒
alert_duration 10m 持续期长度;期间只要有流量就续期,超时无流量则判定行为结束
interval 2s 定时扫描间隔,决定告警的发现延迟与 CPU 占用

三个阶段共用一条状态机:

  1. 疑似:窗口内不同对端数达到 threshold,输出 ... 的端口 40000 疑似产生PCDN行为(近 1m0s 内 27 个对端IP,累计上行 …),相关IP为: …
  2. 持续:进入持续期后,只要该端口仍有流量(任意对端,无论新旧)就刷新计时器, 不再要求窗口内数量达阈值。期间出现新的对端 IP(哪怕只有 1 个)就额外输出 持续产生PCDN行为(本轮累计 …),新增相关IP为: …
  3. 结束:持续期内没有任何流量达到 alert_duration,输出 PCDN行为结束(本轮累计 …), 结束本轮;之后可重新触发。
现象 调整
误报(正常应用被判定) 调高 threshold,或延长 window
漏检(PCDN 没被抓住) 降低 threshold,或缩短 window
告警过于频繁、日志刷屏 调大 alert_duration,或把 [log] level 保持 warn
发现太慢 调小 interval(代价是 CPU)

threshold 与网络规模强相关:设备多、应用多的网络先只开日志观察一两天,再确定取值。

[capture]
interface = "br-lan"
promisc = true
protocol = "udp"
frame_size = 2048
block_size = 65536
num_blocks = 4
snaplen = 256
项 默认 说明
interface 空(必填) 监听网卡,如 br-lan、br0、eth0
promisc true 混杂模式;关闭后只能看到发往/发出本机的帧(br-lan 等网桥接口上可以关闭,见下)
protocol udp udp / tcp / all,大小写不敏感;同时决定内核 BPF 放行范围
frame_size 2048 单帧上限,须能整除 block_size
block_size 65536 每块大小,须为页大小(4096)与 frame_size 的整数倍
num_blocks 4 块数量,≥ 1
snaplen 256 内核每包复制到用户态的最大字节数

环形缓冲合计 = block_size × num_blocks,默认 256KiB。缓冲与 snaplen 的取舍、容量估算 与预设组合见内存与性能。

  • udp(默认):只统计 UDP,PCDN 以 UDP 为主,内核过滤后处理量最小。
  • tcp:只统计 TCP。
  • all:UDP 与 TCP 都统计,同一「MAC + 端口」上的两种协议各自独立告警与封禁。

防火墙的封禁协议跟随触发报文:UDP 触发只封 UDP,TCP 触发只封 TCP。所以改了 protocol 也会同时改变封禁范围;[firewall] enabled = true 时热重载会一并原地重建防火墙后端。

设备归属按网卡自身所在网段判定(IPv4 子网 + IPv6 前缀),属于本网段 / 链路本地的算本端设备, 其余算远端对端。因此:

  • 必须部署在 LAN 侧网桥,才能看到各设备真实 MAC;
  • 只有全球可路由的远端对端被统计,内网、链路本地(fe80::/10)、ULA(fc00::/7)、 组播、环回都会被过滤;
  • 网卡没有地址时会退化为「非公网即本端」的判断;
  • 同一设备的 IPv4 与 IPv6 按「端口 + 地址族」分别统计,告警中展示的设备 IP 始终与该端口流量 所属地址族一致。

IPv6 支持完整:会跳过 Hop-by-Hop、Routing、Fragment、AH、Destination Options、Mobility 等 扩展头后再定位 TCP / UDP;非首片分片报文不会被误解析。

interval 到期时的扫描会产生告警事件;抓包层的实际生效缓冲会打在启动日志里:

抓包缓冲:frame=2048B,block=65536B × 4 块 = 256KiB,snaplen=256B(可在 [capture] 中调整)
开始监听网卡 br-lan:触发阈值=20,时长=1m0s,持续提示时长=10m0s,扫描间隔=2s

info 等级下的完整输出示例见日志、时区与隐私。