流量治理與報表
Aster 可以針對所有經核心處理的流量、LAN 裝置、命中的路由規則、代理節點與策略組,統計上下行、限制聚合頻寬,並套用滾動流量配額。Nikki 使用者應優先從 LuCI 的「Traffic Control」頁管理;Nikki 會把 UCI 設定注入 runtime profile,並依 MAC 從 neighbor table 更新來源位址。
不經 Aster 的 Nikki firewall bypass 流量不會被計算或限速。
最小設定
traffic-control:
enabled: true
store: traffic-control.db
checkpoint-interval: 5m
max-store-size: 67108864
portal:
listen: 0.0.0.0:7893
url: http://192.168.1.1:7893
reports:
enabled: true
hourly-retention: 31d
daily-retention: 397d
monthly-retention: 397d
orphan-retention: 90d
global:
id: global
enabled: true
download-bps: 100000000
quota:
total-bytes: 107374182400
window: 30d
overage-upload-bps: 64000
overage-download-bps: 256000
portal: true速率單位是 bit/s,流量單位是 bytes;0 或省略代表不限制。配額窗口支援 m、h、d、w,範圍為一小時至 365 天。
裝置、規則與代理
traffic-control:
enabled: true
devices:
- id: phone
name: Phone
mac: aa:bb:cc:dd:ee:ff
source-cidrs: [192.168.1.20/32]
download-bps: 20000000
rules:
- id: video-rule
type: DOMAIN-SUFFIX
payload: example.video
target: Proxy
quota:
total-bytes: 10737418240
window: 7d
targets:
- id: proxy-group
kind: group
target: Proxy
download-bps: 50000000規則以類型、正規化 matcher 與目標策略產生內容簽名,因此重排規則不會丟失歷史。修改規則內容或配額窗口會建立新的 generation。
mac 可作為 Nikki/管理端的穩定裝置識別,但核心目前不會在每條 flow 執行 neighbor lookup,也沒有 ingress MAC attribution。每個 device policy 都必須帶 source-cidrs;MAC-only 設定會被拒絕,避免看似成功卻永遠不命中。
持久化與壓縮
治理狀態與報表保存在 bbolt。一般流量每五分鐘 checkpoint;超額、重置、設定變更與正常關閉會立即提交。每個 policy/report series 以帶原始長度與 CRC32C 的 Zstandard blob 保存;啟動時會載入並解碼目前資料,報表查詢再從記憶體中的 hour/day/month map 篩選。這不是 query-time lazy segment storage。
主資料庫會建立驗證備份;損壞時可自動恢復。Nikki package 會把資料庫與備份加入 sysupgrade 保留清單。
Controller API
所有端點使用標準 Controller Bearer secret:
GET /api/aster/capabilitiesGET /api/aster/kernel-direct/statusGET /api/aster/traffic-control/statusGET/PUT /api/aster/traffic-control/policiesGET /api/aster/traffic-control/rulesPOST /api/aster/traffic-control/policies/{id}/resetGET /api/aster/traffic-control/reportsGET /api/aster/traffic-control/reports/summaryGET /api/aster/traffic-control/reports/export.csv
GET /api/aster/capabilities 的 kernel_direct 目前 schema version 為 4;deprecated_fields 含 proxy_traffic。
GET /api/aster/kernel-direct/status 除既有的 backend/fast_paths 外還回傳:
learned_sets:各 kernel-direct consumer 的 snapshot,含max_entries、max_records(domain budget,通常為max_entries × 4)、learned_addresses、direct_addresses、proxy_addresses、learned_domains、evictions。process:controller 行程pid與started_at(Unix 秒)。aster_traffic:目前所有由 Aster 處理的流量估計,包含 TUN DIRECT/default-tun fallback,不含已被 kernel-direct 繞過的 DIRECT。proxy_traffic:已棄用別名,內容與aster_traffic完全相同,不是「僅代理流量」。
learned_sets[].evictions 是行程啟動以來 address LRU 因容量上限淘汰的次數;TTL 到期、規則 reload flush 或 set collapse 不計入。
GET /api/aster/traffic-control/policies 回傳 {revision, config};PUT 必須把同一 envelope 送回,revision 過期時回 409。Controller JSON body 上限為 1 MiB。失敗的 Configure/PUT 會保留先前的 runtime、revision、store、flusher 與 portal;相同 store path 與 portal listen 會被重用,活躍 session 會切到新 generation。政策數量上限 256,每個 session 最多 128 個 report key,全域 report series 上限 4,096。
報表查詢接受 key、granularity=hour|day|month、from 與 to Unix timestamp;範圍必須為正且最多 400 天。未知 key 回傳 buckets: [],無效 granularity 即使 key 不存在也會回 400。交叉維度 key 使用 | 連接,例如 device:phone|rule:video-rule。
