hoangtuvungcao/mango-waf

GitHub: hoangtuvungcao/mango-waf

一款基于 Go 语言的高性能七层 DDoS 防护与 Web 应用防火墙,支持 XDP/eBPF 加速、P2P 集群同步及实时监控仪表盘。

Stars: 58 | Forks: 15

# 🥭 Mango Shield v2.0 ## 📋 目录 1. [概述](#-tổng-quan) 2. [从头安装(新 VPS)](#-cài-đặt-từ-đầu-vps-mới) 3. [多域名配置](#-cấu-hình-nhiều-domain) 4. [防护模式](#️-các-chế-độ-bảo-vệ) 5. [CLI 管理](#-quản-lý-bằng-cli) 6. [仪表盘](#-dashboard) 7. [详细配置](#️-cấu-hình-chi-tiết) 8. [项目结构](#-cấu-trúc-dự-án) 9. [API Endpoints](#-api-endpoints) 10. [WAF Rules](#-waf-rules) 11. [Telegram 告警](#-cảnh-báo-telegram) 12. [Docker](#-docker) 13. [故障排除](#-xử-lý-sự-cố) Mango Shield 利用先进的 **多层防御** 模型保护您的网站免受 DDoS Layer 7 攻击: ``` Người dùng → [Mango Shield] → Website gốc (Backend) Lớp 0: XDP/eBPF Acceleration (Lớp 4) — Chặn IP ở tầng nhân/phần cứng (10M RPS) Lớp 1: TLS Early Reject (Lớp 7 sớm) — Ngắt kết nối Botnet trước khi giải mã HTTPS Lớp 2: TLS Fingerprint (JA3/JA4) — Nhận dạng và chấm điểm mức độ tin cậy của Client Lớp 3: Tình báo IP & Reputation — GeoIP, ASN, Threat Feeds (50k+ IP xấu) Lớp 4: WAF (Layer 7) — Chặn SQLi, XSS, LFI, RCE (Core 28 OWASP Rules) Lớp 5: Thử thách JS PoW — Xác minh người dùng thật, không cần CAPTCHA ngoài Lớp 6: Phân tích Hành vi (Behavior) — AI tự động nhận diện mẫu tấn công mới Lớp 7: Học thích ứng & Thoái giáng — Tự duy trì dịch vụ khi bị overload Lớp 8: Smart CDN Caching — Đệm nội dung tĩnh trên RAM (Ristretto) tăng tốc cực nhanh Lớp 9: Upstream Load Balancing — Rải tải thông minh (Round-Robin) tới nhiều Backend Lớp 10: Mango P2P Mesh — Đồng bộ Danh sách đen (Ban/Whitelist) giữa các Node không cần Redis ``` **支持:** - ✅ HTTP & HTTPS - ✅ 裸 IP & 域名 - ✅ 多域名 → 不同的后端 (Load Balancing) - ✅ WebSocket pass-through - ✅ Let's Encrypt (说明见下文) - ✅ **CDN Smart Caching** (仅缓存静态文件,对所有网站安全) - ✅ **Gossip Protocol Cluster** (运行多 VPS 集群,无需配置数据库) - ✅ 支持 Docker 和 CI/CD 的环境变量 (`viper`) ## 🚀 从头安装(新 VPS) ### 步骤 1:安装 Go(如果尚未安装) ``` # Ubuntu/Debian sudo apt update && sudo apt install -y golang-go git # 或安装最新版 Go wget https://go.dev/dl/go1.22.5.linux-amd64.tar.gz sudo rm -rf /usr/local/go sudo tar -C /usr/local -xzf go1.22.5.linux-amd64.tar.gz echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc source ~/.bashrc # 检查 go version ``` ### 步骤 2:下载源代码 ``` # 从 GitHub Clone git clone https://github.com/hoangtuvungcao/mango-waf.git /opt/mango-shield # 或从本地上传 # scp -r mango-waf/ root@YOUR_VPS_IP:/opt/mango-shield/ ``` ### 步骤 3:系统优化(推荐用于大规模 DDoS) ``` cd /opt/mango-shield # 1. 优化 Linux TCP Stack (扩展文件描述符,优化 socket) chmod +x scripts/optimize_tcp.sh sudo ./scripts/optimize_tcp.sh # 2. 安装 XDP/eBPF (支持拦截 100 万 RPS - 需要 Linux 5.10+) chmod +x xdp/setup_xdp.sh sudo ./xdp/setup_xdp.sh ``` ### 步骤 4:编译 ``` # 编译主服务器 go build -o mango-shield . # 编译管理 CLI go build -o mango-cli ./cmd/cli/ # 检查 ./mango-shield -version ``` ### 步骤 4:创建配置文件 ``` # 复制样本文件 cp config/default.yaml config/config.yaml # 编辑配置(查看下方“配置多域名”部分) nano config/config.yaml ``` ### 步骤 5:试运行 ``` # 直接运行以测试(Ctrl+C 停止) ./mango-shield -config config/config.yaml ``` ### 步骤 6:安装 systemd 服务(生产环境) ``` # 复制 service 文件 sudo cp deploy/mango-shield.service /etc/systemd/system/ # 启用并启动 sudo systemctl daemon-reload sudo systemctl enable mango-shield sudo systemctl start mango-shield # 检查状态 sudo systemctl status mango-shield # 查看实时日志 sudo journalctl -u mango-shield -f ``` ### 步骤 7:开放防火墙 ``` # UFW (Ubuntu) sudo ufw allow 80/tcp # HTTP sudo ufw allow 443/tcp # HTTPS sudo ufw allow 9090/tcp # Dashboard (nên giới hạn IP truy cập) # 或 iptables sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 9090 -j ACCEPT ``` ## 🌐 多域名配置 ### 工作原理 ``` ┌─ example.com ───────→ backend :8080 (Web chính) │ Client → Mango ───────┼─ api.example.com ──→ backend :3000 (API server) Shield (port 80/443) │ ├─ khachhang-a.com ──→ backend :8081 (Khách A) │ └─ khachhang-b.com ──→ backend :8082 (Khách B) ``` Mango Shield 从 `Host` header 自动识别域名并将其转发到正确的后端。 ### 示例 1:一个域名,一个后端 ``` # 最简单 — 1 个网站 domains: - name: "example.com" upstreams: - url: "http://127.0.0.1:8080" ``` ### 示例 2:多域名 → 多后端(供多用户使用) ``` # 每个域名/客户有独立 backend domains: # Website chính của bạn - name: "example.com" upstreams: - url: "http://127.0.0.1:8080" # API server - name: "api.example.com" upstreams: - url: "http://127.0.0.1:3000" # Website khách hàng A - name: "khachhang-a.com" upstreams: - url: "http://127.0.0.1:8081" ``` ### 示例 3:Load Balancing(多后端负载均衡) ``` # 负载均衡到多个 backend (自动 Round-Robin) domains: - name: "web.example.com" upstreams: - url: "http://localhost:8080" # Server A - url: "http://localhost:8081" # Server B - url: "http://10.0.0.5:8080" # Server Mạng nội bộ ``` ### 示例 4:裸 IP(暂无域名) ``` tls: enabled: false # Không dùng HTTPS khi dùng IP trần domains: - name: "103.77.246.172" upstreams: - url: "http://127.0.0.1:8080" ``` ### 示例 5:使用 Let's Encrypt 的 HTTPS(生产环境) ``` # 1. 安装 certbot sudo apt install certbot # 2. 暂停 Mango Shield (certbot 需要 80 端口) sudo systemctl stop mango-shield # 3. 获取证书 sudo certbot certonly --standalone \ -d example.com \ -d api.example.com \ -d khachhang-a.com # 4. 在 config.yaml 中配置 TLS: ``` ``` tls: enabled: true cert_file: "/etc/letsencrypt/live/example.com/fullchain.pem" key_file: "/etc/letsencrypt/live/example.com/privkey.pem" ``` ``` # 5. 重启 sudo systemctl start mango-shield # 6. 自动续期证书 (cron job) echo "0 3 * * * certbot renew --pre-hook 'systemctl stop mango-shield' --post-hook 'systemctl start mango-shield'" | sudo tee -a /etc/crontab ``` ### 自动模式(推荐) 系统根据 10 层防护自动对 IP 进行评分。 - **无缝模式:** 如果您是真实用户,系统将立即放行,不显示任何提示。 - **JS Challenge:** 仅当该 IP 的 RPS 升高或指纹有可疑迹象 时才启用。 - **CAPTCHA:** 仅在确凿证据表明遭受持续攻击(强力 DDoS)时出现。 ## 🕸️ 多服务器集群 为了抵御大规模 DDoS 攻击,Mango Shield 允许将多个 VPS 连接成一个同步的 Mesh 网络。 ### 1. 黑名单同步 当节点 A 封禁一个 IP 时,节点 B 和 C 将立即自动封禁该 IP,无需中央数据库。 ### 2. 会话共享 如果用户在节点 A 已通过验证,当他们切换到节点 B(由于 DNS Round-Robin)时,**无需重新完成 challenge**。这要求配置文件中的 `cookie_secret` 在所有节点上必须完全一致。 ### 3. Mesh 配置 (P2P Gossip) 在所有 VPS 上打开端口 `7946`(TCP 和 UDP),以便它们能够相互“通信”。 ``` cluster: enabled: true node_name: "vps-1" bind_port: 7946 advertise_ip: "103.77.246.172" secret_key: "AES-32-KHOA-CUA-RIENG-BAN-!!" # Giống nhau mọi Node join_peers: ["IP_CUA_NODE_DA_CO:7946"] ``` # === 识别 === fingerprint: ja3: enabled: true ja4: enabled: true http2: enabled: true # === 情报 === intelligence: geoip: enabled: true db_path: "/etc/mango/GeoLite2-City.mmdb" blocked_countries: [] # 例如:["CN","RU"] ip_reputation: enabled: true abuseipdb_key: "YOUR_KEY" # https://abuseipdb.com/register asn: enabled: true # === 检测 === detection: baseline: enabled: true learning_period: 24h anomaly: enabled: true sensitivity: 0.7 bot_classifier: enabled: true # === WAF === waf: enabled: true owasp_rules: true paranoia_level: 2 # 1=基础, 2=标准, 3=严格 # === 日志 === logging: level: "info" format: "json" file: "/var/log/mango-shield.log" # === 仪表盘 === dashboard: enabled: true listen: "127.0.0.1:9090" username: "admin" password: "strongpassword123" # === 告警 === alerts: telegram: enabled: true token: "BOT_TOKEN" # 来自 @BotFather chat_id: "CHAT_ID" # 来自 @userinfobot discord: enabled: false webhook_url: "" ``` ### 重载配置(不重启) ```bash kill -HUP $(pidof mango-shield) ``` ## 📁 项目结构 ``` mango-waf/ ├── scripts/ # TỐI ƯU HỆ THỐNG │ └── optimize_tcp.sh # Script tối ưu Sysctl cho High Concurrency ├── xdp/ # LỚP PHÒNG THỦ CỨNG │ ├── mango_xdp.c # Mã nguồn C (eBPF) │ ├── setup_xdp.sh # Script cài đặt compiler & nạp XDP │ └── SETUP_XDP.md # Hướng dẫn chi tiết XDP ├── main.go # Điểm vào — khởi tạo 10 hệ con ├── cmd/cli/main.go # CLI quản lý (tiếng Việt) │ ├── config/ │ ├── config.go # Tải YAML, hot-reload, validate │ └── deploy.yaml # Cấu hình mẫu cho VPS │ ├── core/ # LÕI HỆ THỐNG │ ├── server.go # TLS server, xử lý HTTP │ ├── pipeline.go # Pipeline bảo vệ đa tầng │ ├── xdp.go # Go manager cho eBPF Maps │ ├── proxy.go # Reverse proxy, WebSocket │ ├── challenge.go # Thử thách JS/CAPTCHA │ └── alerts.go # Telegram/Discord/Webhook alerts │ ├── fingerprint/ # NHẬN DẠNG TRÌNH DUYỆT │ ├── fingerprint.go # Kiểu dữ liệu, chấm điểm │ ├── early_reject.go # SSL Sniffing & Early Drop logic │ ├── tls_parser.go # Phân tích TLS ClientHello │ ├── h2_parser.go # Phân tích HTTP/2 frames │ ├── database.go # 100+ fingerprint Botnet & Browser │ ├── interceptor.go # Chặn kết nối TLS StdLib │ └── silent_js.go # Nhận dạng trình duyệt ẩn │ ├── intelligence/ # TÌNH BÁO IP │ ├── intelligence.go # Engine đánh giá 5 lớp │ ├── reputation.go # AbuseIPDB API │ ├── asn.go # Phân loại nhà mạng (70+) │ └── feeds.go # 8 nguồn dữ liệu mối đe dọa │ ├── detection/ # PHÁT HIỆN TẤN CÔNG │ ├── detection.go # Baseline & anomaly │ ├── behavior.go # Hành vi 6 yếu tố │ ├── classifier.go # Phân loại bot (13 chữ ký) │ ├── signatures.go # 10 mẫu tấn công │ └── adaptive.go # Tự học traffic 24h │ ├── challenge/ # THỬ THÁCH v2 │ ├── challenge.go # Manager PoW/Turnstile/reCAPTCHA │ └── templates.go # Template UI glassmorphism │ ├── rules/ # WAF ENGINE │ ├── engine.go # Rules engine, inspector │ ├── owasp.go # 28 rule OWASP CRS │ └── custom.go # Tải rule tùy chỉnh YAML │ ├── api/ │ └── dashboard.go # REST API + dashboard nhúng │ ├── perf/ # HIỆU SUẤT │ ├── pool.go # Rate limiter, memory manager │ └── hardening.go # Header bảo mật, thoái giáng │ ├── logger/ │ └── logger.go # Ghi log có cấu trúc (zap) │ ├── deploy/ │ └── mango-shield.service # Systemd service ├── Dockerfile # Docker multi-stage └── docker-compose.yml # Docker Compose ``` ## 🕸️ 安装多服务器集群 为了抵御大规模 DDoS 攻击(超过单个 VPS 的 10Gbps 带宽限制),您可以在多个不同的服务器上运行 Mango Shield。**Mango Mesh** 功能将通过 Gossip 协议连接它们(无需 Redis!)。 当 **VPS 1 (河内)** 封禁 IP `1.2.3.4` 时,它会立即通知 **VPS 2 (胡志明市)** 和 **VPS 3 (新加坡)** 在几毫秒内进行封禁。 ### 步骤 1:开放 P2P 通信端口 在**所有** VPS 上,您必须为 `TCP` 和 `UDP` 开放端口 `7946`: ``` sudo ufw allow 7946/udp sudo ufw allow 7946/tcp ``` ### 步骤 2:配置 VPS 1(主服务器 - 锚节点) 例如 VPS 1 的 IP 是 `103.77.246.172`。编辑文件 `config/deploy.yaml`: ``` cluster: enabled: true node_name: "vps-1-hanoi" bind_port: 7946 advertise_ip: "103.77.246.172" # BẮT BUỘC để báo hệ thống biết IP Public thực sự secret_key: "VUI_LONG_DOI_KHOA_BAO_MAT_NAY_THANH_32_BYTE!" # BẮT BUỘC ĐÚNG 32 BYTE & GIỐNG NHAU MỌI VPS join_peers: [] # Node đầu tiên làm mỏ neo nên không cần nối tới ai ``` ### 步骤 3:配置 VPS 2(辅助服务器 1) 例如 VPS 2 的 IP 是 `103.77.246.153`。编辑文件 `config/deploy.yaml`: ``` cluster: enabled: true node_name: "vps-2-hcm" bind_port: 7946 advertise_ip: "103.77.246.153" secret_key: "VUI_LONG_DOI_KHOA_BAO_MAT_NAY_THANH_32_BYTE!" # Phải y hệt VPS 1 (32 Byte) join_peers: - "103.77.246.172:7946" # Trỏ về IP của VPS 1 để xin gia nhập mạng lưới Mesh ``` ### 步骤 4:配置域名 DNS(2 台服务器上的 Load Balancing & Failover) 为了让您的网站能够同时利用两台服务器的计算能力,请按 **Round-Robin** 方式配置 DNS 记录(在 Cloudflare 等): - 将 **2 条 `A` 记录** 指向 Mango Mesh 集群的 2 个不同 IP。 重启两台 VPS 上的 Mango Shield:`sudo systemctl restart mango-shield`。 检查 VPS 1 上的 Dashboard API:`curl -u admin:admin123 http://103.77.246.172:9090/api/stats`,您将看到 `"mesh_nodes": 2`,表示 2 台机器已成功连接! **Cloudflare 设置示例(关闭橙色云 - 仅 DNS 灰色勾选):** | 类型 | 名称 | 内容 / IP | TTL | |---|---|---|---| | A | `@` | `103.77.246.172` | Auto | | A | `@` | `103.77.246.153` | Auto | | A | `www` | `103.77.246.172` | Auto | | A | `www` | `103.77.246.153` | Auto | **实际运行流程:** 1. 当访客访问网站时,DNS 系统会自动将流量 50-50 平均分配给每台服务器。极大地优化了 CPU。 2. 如果 1 台服务器崩溃或断网,DNS 会自动将其移除,并将访客引导至剩余的服务器。 3. P2P 交叉封禁:如果黑客对服务器 2 发起 HTTP Flood 攻击并被封禁 IP,Mango Mesh 网络将立即把该 IP 的黑名单同步到服务器 1。整个集群共享同一面盾牌! ## 📡 API Endpoints Dashboard API 默认端口 `9090`: | Endpoint | Method | 描述 | 测试命令 | |---|---|---|---| | `/` | GET | Dashboard 界面 | `curl http://IP:9090/` | | `/api/stats` | GET | 实时统计 | `curl http://IP:9090/api/stats` | | `/api/health` | GET | 健康检查 | `curl http://IP:9090/api/health` | | `/api/config` | GET | 当前配置 | `curl http://IP:9090/api/config` | | `/api/rps-history` | GET | 5 分钟 RPS 图表 | `curl http://IP:9090/api/rps-history` | ## 🧱 WAF Rules ### 内置 28 条 OWASP CRS 规则 | 类别 | 规则数 | 检测内容 | |---|:---:|---| | SQL Injection | 6 | UNION SELECT, tautology, stacked queries, comment bypass | | XSS | 4 | Script tags, event handlers, eval(), img/iframe | | LFI | 3 | Path traversal `../`, /etc/passwd, .env, .git | | RCE | 4 | Unix/Windows command injection, PHP/Node.js | | RFI | 1 | URL inclusion (http://, php://, data://) | | SSRF | 1 | 访问 127.0.0.1, 10.x, 192.168.x, metadata | | Scanner | 2 | Nikto, sqlmap, nuclei, Burp Suite | | Protocol | 3 | HTTP smuggling, invalid methods, null bytes | ### 添加自定义规则 创建文件 `custom-rules.yaml`: ``` rules: - id: "CUSTOM-001" name: "Block WP login brute force" category: "custom" severity: "high" targets: ["URL"] operator: "contains" pattern: "/wp-login.php" action: "challenge" enabled: true - id: "CUSTOM-002" name: "Block admin paths" category: "custom" severity: "medium" targets: ["URL"] operator: "rx" pattern: "/(admin|phpmyadmin|manager)" action: "block" enabled: true ``` 配置: ``` waf: custom_rules_path: "/opt/mango-shield/custom-rules.yaml" ``` ## 🔔 Telegram 告警 ### 设置方法 ``` 1. Mở Telegram → tìm @BotFather 2. Gửi /newbot → đặt tên → nhận TOKEN 3. Mở @userinfobot → nhận CHAT_ID 4. Điền vào config: ``` ``` alerts: telegram: enabled: true token: "123456:ABC-DEF..." # Token từ @BotFather chat_id: "5805939083" # Chat ID từ @userinfobot ``` ### 收到的告警样本 ``` 🚨 CẢNH BÁO TẤN CÔNG DDoS ━━━━━━━━━━━━━━━━━━━━━ ⏰ Thời gian: 10:00:00 — 05/03/2026 🌐 Domain: example.com 📊 RPS hiện tại: 500 req/s ⚡ Ngưỡng cảnh báo: 200 req/s 📈 Vượt ngưỡng: 2.5x 🔴 Trạng thái: Đang bị tấn công 🛡️ Hành động: Tự động nâng cấp bảo vệ ━━━━━━━━━━━━━━━━━━━━━ 🥭 Mango Shield v2.0 ``` ## 🐳 Docker ``` # 构建镜像 docker build -t mango-shield . # 运行容器 docker run -d --name mango-shield \ -p 443:443 -p 80:80 -p 9090:9090 \ -v ./config:/app/config:ro \ -v ./certs:/app/certs:ro \ --cap-add NET_ADMIN \ mango-shield # 或使用 Docker Compose docker-compose up -d # 查看日志 docker logs -f mango-shield ``` ## 🔧 故障排除 ### 服务器无法启动 — 端口被占用 ``` # 查找占用端口的进程 ss -tlnp | grep ':80\|:443\|:9090' # 释放端口 sudo kill $(sudo lsof -t -i:80) # 或关闭正在运行的 nginx/apache sudo systemctl stop nginx sudo systemctl stop apache2 ``` ### Bad Gateway — 后端无响应 ``` # 检查 backend 是否运行 curl -v http://127.0.0.1:8080 # 检查 Mango Shield 日志 tail -50 /var/log/mango-shield.log # 确保 config 中的 backend URL 正确 # 错误: backend: "127.0.0.1:8080" (缺少 http://) # 正确: backend: "http://127.0.0.1:8080" ``` ### 重新加载配置(无需重启) ``` kill -HUP $(pidof mango-shield) ``` ### 完全重启 ``` sudo systemctl restart mango-shield ``` ### 健康检查 ``` curl http://127.0.0.1:9090/api/health # 预期: {"status":"healthy","version":"2.0.0",...} # CLI ./mango-cli health ``` ### 查看攻击日志 ``` sudo journalctl -u mango-shield -f --grep="attack\|blocked\|banned" ``` ## 📜 许可证 MIT License — 由 Mango Team 用 ❤️ 构建。
标签:AI行为分析, AppImage, Bot检测, CDN加速, CISA项目, DDoS防护, Docker, EVTX分析, Golang, JA3指纹, L7防御, P2P网格, Radare2, SQL注入防护, TLS指纹, WAF, Web应用防火墙, XDP, XSS防护, 代码生成, 仪表盘, 反向代理, 威胁情报, 安全编程, 安全防御评估, 开发者工具, 日志审计, 流量清洗, 渗透测试工具, 滥用缓解, 网络安全, 请求拦截, 负载均衡, 配置错误, 防御深度, 隐私保护