Skip to content

ocftw/srtt

Repository files navigation

SRTT - DNS Analyzer (ocf-srtt)

專為資安分析設計的 即時 DNS 流量監控系統 (Real-time DNS Traffic Analyzer)。 採用 Monorepo 架構,結合 DNS Proxy 攔截與現代化前端視覺化技術,提供隱私優先、無狀態的網路可觀測性。


技術棧 (Tech Stack)

Backend (Golang)

  • 核心: Go 1.24+, miekg/dns(DNS Proxy 模式,監聽 UDP/TCP :53)
  • 通訊: gorilla/websocket 即時資料推送(支援跨裝置 Subscribe 切換監控目標)
  • 富化: geoip2-golang (MaxMind) 地理位置(Country/City/Subdivision/Coords)與 ASN/ISP 標記
  • 識別引擎: 三層識別邏輯(Exact Match → Regex → Heuristic)
  • 路徑追蹤: MTR (mtr --report --json) 整合三階段地理修正(延遲啟發式 → rDNS PoP → ccTLD)
  • 架構: In-Memory Ring Buffer,無資料庫設計(RAM Only)
  • 開發: Air (Hot Reload)

Frontend (React Ecosystem)

  • 核心: React 19, TypeScript 5.9+, Vite 7
  • 樣式: Tailwind CSS v4, Lucide Icons
  • 狀態: Zustand 5(2 個 Store:DNS、Traceroute)
  • 視覺化: MapLibre GL 5(CyberMap + TraceMap),Recharts 3(流量圖表),TanStack Table 8(資料表格)
  • 多國語言: i18next(中/英切換)
  • 導覽: react-joyride 引導式導覽

Deployment

  • 容器化: Docker, Docker Compose(Multi-stage build)
  • 環境分離: 獨立的開發 (dev.yml) 與生產 (prod.yml) 配置
  • 網路模式: 生產環境使用 Docker host 模式以獲取真實 Client IP
  • 反向代理: Nginx + HTTPS (Let's Encrypt)

目錄結構

.
├── backend/                # Go 核心服務
│   ├── cmd/                # 程式進入點 (main.go)
│   ├── internal/           # 核心邏輯
│   │   ├── api/            # HTTP 路由、WebSocket Hub、Traceroute Handler
│   │   ├── auth/           # Token Store (UUID ↔ IP)
│   │   ├── buffer/         # Per-IP Ring Buffer
│   │   ├── dns/            # DNS Proxy (miekg/dns)、Enrichment Pipeline
│   │   ├── geoip/          # MaxMind MMDB 查詢 (Country/City/ASN)
│   │   ├── osfingerprint/  # OS 指紋辨識
│   │   ├── ratelimit/      # Rate Limiter + Semaphore
│   │   ├── recognition/    # 三層應用識別引擎
│   │   ├── traceroute/     # MTR 執行、GeoIP 修正、快取
│   │   └── types/          # 共用 struct 定義
│   ├── data/               # 靜態資源 (MMDB + app.json)
│   └── .air.toml           # Hot Reload 設定
├── frontend/               # React 前端應用
│   ├── src/
│   │   ├── components/     # UI 元件 (CyberMap, LiveTable, HopTable, TraceMap...)
│   │   ├── stores/         # Zustand stores
│   │   ├── hooks/          # Custom hooks (WebSocket, Mock, SharedReport, Tour)
│   │   └── utils/          # 工具函式 (geo, cloudProvider, appInfo...)
│   └── nginx.conf          # 生產環境 Nginx 設定
├── doc/                    # arc42 架構文件
├── docker-compose.dev.yml  # 開發環境
├── docker-compose.prod.yml # 生產環境
└── README.md

快速啟動 (Quick Start)

1. 準備資料庫

本專案依賴 MaxMind GeoLite2 資料庫,請自行下載以下檔案並放置於 backend/data/ 目錄:

  • GeoLite2-City.mmdb
  • GeoLite2-ASN.mmdb

2. 選擇運行模式

開發環境 (Development)

支援 Hot Reload。修改 Go 或 React 程式碼後自動更新,無需重啟容器。

docker compose -f docker-compose.dev.yml up --build

生產環境 (Production)

使用編譯後的 Go Binary 與 Nginx 靜態服務,啟用 host 網路模式。

docker compose -f docker-compose.prod.yml up -d --build

雲端部署指南 (GCP/AWS)

1. 基礎設施準備

  • VM 規格: 建議 e2-medium (2 vCPU, 4GB RAM) 以上
  • 防火牆規則: 開啟 UDP:53, TCP:53, TCP:80, TCP:443

2. 打包與上傳

# 本機打包
tar -czf deploy.tar.gz --exclude='node_modules' --exclude='.git' --exclude='frontend/dist' .

# 上傳至 VM (GCP 範例)
gcloud compute scp deploy.tar.gz <VM_NAME>:~

# VM 內解壓與啟動
ssh <VM_NAME>
mkdir srtt && tar -xzf deploy.tar.gz -C srtt/
cd srtt
sudo docker compose -f docker-compose.prod.yml up -d --build

3. DNS 測試

dig @<PUBLIC_IP> google.com

系統特性

核心與隱私

  • 隱私優先: 數據純 In-Memory(Ring Buffer),服務重啟即銷毀
  • 真實 IP 還原: 生產環境 Docker host 模式,直接讀取 Layer 3 IP Header
  • 跨裝置監控: 支援從電腦 Dashboard 監控手機等其他裝置的 DNS 流量(透過 WebSocket Subscribe 動態切換目標 IP,解決 Dual-stack 網路下 IPv4/IPv6 位址不匹配問題)
  • 智慧緩衝管理: 單一 IP 限制 5000 筆紀錄,背景 GC 每分鐘清理閒置 10 分鐘的 Session
  • 三層快取: DNS 回應(30s)、Probe 結果(10min)、Traceroute 結果(5min)

智慧分析

  • 三層識別引擎: Exact Match → Regex Pattern → Heuristic Guessing
  • GeoIP 城市級精度: 透過 MaxMind City DB 取得 Country、City、Subdivision、ASN/ISP
  • OS 指紋辨識: 根據 DNS 查詢模式識別 Android/iOS/Windows
  • 境外流量偵測: GeoIP 國家比對 + ICMP Ping 延遲驗證

視覺化戰情室

  • CyberMap: MapLibre GL 世界地圖,整合 DNS 查詢點與 Traceroute 路徑視覺化,節點 Hover 顯示 IP/城市/ISP/延遲
  • LiveTable: 即時 DNS 查詢列表,Cloud Provider badge,Country · City 顯示,點擊觸發 MTR 追蹤(IPv6 自動改用 Domain)。合併重複 toggle(預設關):開啟後同 appName 的紀錄全部折成一列(識別失敗則回退到 domain),並顯示出現次數 badge × N
  • MTR 路徑追蹤:
    • 支援 TCP/ICMP 模式切換
    • TraceMap / CyberMap 路徑: 只渲染「起點→終點」兩節點 + 一條連線(中間 hop 因 CDN/anycast 地理常失真,故不在地圖上呈現;完整 hop 仍由 HopTable 顯示)。延遲漸變色 + 流向動畫
    • HopTable: Loss%/Avg/Best/Worst/StDev 統計,Country · City 顯示,所有 hop 完整可見
    • 三階段地理修正(延遲啟發式 → rDNS PoP → ccTLD)
    • 支援 URL 壓縮分享

報告與分享

  • ReportModal: 分析報告產生,統計國內外流量佔比
  • URL 壓縮分享: pako deflate → Base64 編碼,無需後端儲存

環境變數

Backend

變數 說明 預設值
LOCAL_COUNTRY 本地國碼(境外流量偵測)
NETWORK_INTERFACE 網路介面 eth0
ASN_DB_PATH ASN MMDB 路徑 data/GeoLite2-ASN.mmdb
GEOIP_DB_PATH GeoIP City/Country MMDB 路徑 data/GeoLite2-City.mmdb
RULES_PATH 應用識別規則路徑 data/app.json
DNS_UPSTREAMS 上游 DNS(逗號分隔) 1.1.1.1:53,8.8.8.8:53,...
TRUSTED_PROXIES 信任的代理 IP
ALLOWED_ORIGINS WebSocket 允許來源

Backend / GeoIP 來源(MaxMind 為主、RIPE IPmap 可切換)

位置查詢預設走 MaxMind GeoLite2;RIPE IPmap 作為可切換的替代來源保留下來。主來源失敗且另一邊仍 enabled 時會自動 fallback。MaxMind ASN DB 一律負責 ASN/ISP 標籤(RIPE 不提供)。詳見 doc/ripe-ipmap-integration.md

變數 說明 預設值
GEOIP_PROVIDER 位置主來源:maxmindripe maxmind
MAXMIND_LOCATION_ENABLED 是否載入 MaxMind City/Country DB(即使非 primary 也可作 fallback) true
MAXMIND_ASN_ENABLED 是否載入 MaxMind ASN DB 補 ASN/ISP true
RIPE_IPMAP_ENABLED 是否啟用 RIPE IPmap(可作主或 fallback) true
RIPE_IPMAP_BASE_URL RIPE API base URL(測試 / 私有 mirror 可改) https://ipmap-api.ripe.net
RIPE_IPMAP_TIMEOUT_MS 單次查詢上限(ms) 800
RIPE_IPMAP_CACHE_TTL_OK 成功結果快取 TTL 24h
RIPE_IPMAP_CACHE_TTL_MISS 失敗 / location=null 快取 TTL(短,因應 RIPE active engines lazy 觸發) 1m
RIPE_IPMAP_USER_AGENT 出口 User-Agent srtt-dns-analyzer/1.0

Frontend

變數 說明 預設值
VITE_USE_MOCK 啟用 Mock 資料 false

API 端點

Endpoint Method Auth 用途
/ws WebSocket Token 即時 DNS 記錄串流(支援 subscribe 訊息切換監控 IP)
/api/token GET None 取得 session token
/api/traceroute GET Token 執行 MTR 路徑追蹤
/health GET None 健康檢查

架構文件

完整的 arc42 架構文件位於 doc/ 目錄。


授權 (License)

MIT License. GeoIP data provided by MaxMind. Icons provided by Lucide.

About

數位服務韌性檢測工具 (SRTT, Service Resilience Testing Tool)

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages