代码见GitHub:项目名称: flowguard

flowguard

flowguard 是一个 Linux C 抓包/检测 MVP,用 libpcap 代替 DPDK 完成第一版链路验证。它把抓包、协议解析、规则检测、处置动作拆开,后续迁移到 DPDK 时主要替换收发包层。

已实现

  • 镜像/分光抓包:libpcap 混杂模式监听网卡。
  • HTTP 明文:识别 method、Host、URI,并检查 payload 关键词。
  • HTTPS 可见元数据:识别 TLS ClientHello SNI,不能解密 HTTPS 正文。
  • DNS:识别 UDP/53 查询域名。
  • 规则:异常 IP、违规域名、非法 URL、HTTP 关键词、本地 ICP 备案域名 allowlist。
  • 处置:告警日志;对 TCP 会话可尝试发送双向 RST;HTTP 明文可伪造 403 Forbidden 响应。

依赖

Ubuntu:

sudo apt update
sudo apt install -y build-essential cmake pkg-config libpcap-dev

编译

cmake -S . -B build
cmake --build build

运行

镜像/分光模式,只告警:

sudo ./build/flowguard -i eth0 -r rules -m mirror -a alert -v

检测到违规后尝试 TCP RST:

sudo ./build/flowguard -i eth0 -r rules -m mirror -a rst

HTTP 明文命中规则时返回 403,并对连接补发 RST:

sudo ./build/flowguard -i eth0 -r rules -m mirror -a 403

关闭 ICP allowlist 检查:

sudo ./build/flowguard -i eth0 -r rules --no-icp

自定义 BPF:

sudo ./build/flowguard -i eth0 -b "tcp port 80 or tcp port 443 or udp port 53"

日志会追加写入当前目录的 flowguard.log,每行一个 JSON。

规则文件

  • rules/keywords.txt:HTTP 明文 payload 关键词。
  • rules/bad_ips.txt:异常 IPv4 地址。
  • rules/bad_domains.txt:违规域名,支持精确域名和子域名后缀匹配。
  • rules/bad_urls.txt:HTTP URI 子串匹配。
  • rules/icp_domains.txt:本地 ICP 备案 allowlist。文件非空且未加 --no-icp 时,不在 allowlist 的域名会被判定为 icp_missing

串联部署说明

当前代码已经保留 -m inline 参数,但真正的串联转发/放行/丢弃建议下一步接 NFQUEUE

sudo iptables -I FORWARD -j NFQUEUE --queue-num 0

串联版推荐新增一个 capture_nfqueue.c,把每个包交给同一套 packet/protocol/detector/actions,根据检测结果返回 NF_ACCEPTNF_DROP。当前 -a 403 已能对 HTTP 明文请求伪造响应包;HTTPS 因为加密,不能直接跳转 403,只能 RST/阻断,除非合法部署 TLS 代理和受信证书。

DPDK 迁移点

后续迁移到 DPDK 时,优先替换:

  • src/capture_pcap.c:改为 rte_eth_rx_burst() 收包。
  • src/reset.c:改为 DPDK mbuf 构造 RST/响应包并 rte_eth_tx_burst()
  • 保留:packet.cprotocol_*.crules.cdetector.c

这样可以先把规则与协议能力跑通,再把性能路径迁移到 DPDK。