代码见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_ACCEPT 或 NF_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.c、protocol_*.c、rules.c、detector.c。
这样可以先把规则与协议能力跑通,再把性能路径迁移到 DPDK。