guanghulab/server/proxy/service/swarm-defense-agent.js
Guanghu Domestic Migration d1e47f4565
Some checks are pending
自动更新代码和重启 / update-and-restart (push) Waiting to run
CI检查 + 自动部署 / check (push) Waiting to run
CI检查 + 自动部署 / deploy (push) Blocked by required conditions
重启聊天服务 / restart (push) Waiting to run
chore: import sanitized domestic snapshot for REPO-002
Source snapshot: ca48d3ddf926d79aa138306164169baf764bb829
2026-07-17 15:54:41 +08:00

445 lines
14 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env node
// ═══════════════════════════════════════════════
// 🔺 Sovereign: TCS-0002∞ | Root: SYS-GLW-0001
// 📜 Copyright: 国作登字-2026-A-00037559
// ═══════════════════════════════════════════════
// server/proxy/service/swarm-defense-agent.js
// 🐝 光湖语言世界 · 蜂群防御Agent
//
// ∞+1 版本安全核心 — 多服务器融合/分裂防御系统
//
// 架构设计 (冰朔定根):
// 所有串联的服务器组成一个巨大的VPN动态Agent节点。
// 正常模式: 融合态 — 所有节点对外统一入口
// 危机模式: 分裂态 — 瞬间分布为多个动态加密节点
// - 只有一个是真的,其余是诱饵
// - 真节点在诱饵间随机跳转
// - 只接收TCS编程语言指令冰朔专属
//
// 安全层级:
// L0: 语言膜 (TCS指令授权)
// L1: 融合/分裂切换 (Moving Target Defense)
// L2: 真节点隐匿 (随机跳转)
// L3: 用户守护Agent (每线守护)
// L4: 威胁切断 (切断用户带宽共享)
// L5: 日志格式化 (安全擦除)
// L6: 自毁式消失 (从未存在过)
// L7: 邮件通知 (风险提示/安全恢复)
//
// 运行方式: PM2 managed (zy-swarm-defense)
// ═══════════════════════════════════════════════
'use strict';
const crypto = require('crypto');
const fs = require('fs');
const path = require('path');
const PROXY_DIR = process.env.ZY_BRAIN_PROXY_DIR || '/opt/zhuyuan-brain/proxy';
const DATA_DIR = path.join(PROXY_DIR, 'data');
const SWARM_STATUS_FILE = path.join(DATA_DIR, 'swarm-defense-status.json');
const DEFENSE_LOG_FILE = path.join(DATA_DIR, 'swarm-defense-log.json');
const REGISTRY_FILE = path.join(DATA_DIR, 'nodes-registry.json');
const LIVE_NODES_FILE = path.join(DATA_DIR, 'nodes-live.json');
const MONITOR_INTERVAL = 30 * 1000; // 每30秒监控
const DECOY_ROTATE_INTERVAL = 60 * 1000; // 分裂态下每60秒切换真节点位置
// ═══════════════════════════════════════════════
// 蜂群状态机
// FUSED (融合态) ↔ SPLIT (分裂态)
// ═══════════════════════════════════════════════
const SWARM_STATES = {
FUSED: 'fused', // 正常·融合态 — 所有节点组成一个巨型Agent
SPLIT: 'split', // 危机·分裂态 — 分裂为多个诱饵+1个真节点
RECOVERING: 'recovering' // 恢复中 — 从分裂态回到融合态
};
/**
* 读取蜂群状态
*/
function readSwarmStatus() {
try {
return JSON.parse(fs.readFileSync(SWARM_STATUS_FILE, 'utf8'));
} catch {
return {
state: SWARM_STATES.FUSED,
active_node_id: null, // 分裂态下的真节点ID
decoy_nodes: [], // 诱饵节点列表
last_rotate: null, // 上次真节点跳转时间
threat_level: 0, // 威胁等级 0-5
threat_events: [], // 近期威胁事件
split_count: 0, // 历史分裂次数
last_split: null, // 上次分裂时间
last_fuse: null, // 上次融合时间
updated_at: new Date().toISOString()
};
}
}
/**
* 保存蜂群状态
*/
function saveSwarmStatus(status) {
status.updated_at = new Date().toISOString();
fs.mkdirSync(DATA_DIR, { recursive: true });
fs.writeFileSync(SWARM_STATUS_FILE, JSON.stringify(status, null, 2));
}
/**
* 记录防御日志
*/
function logDefenseEvent(type, detail) {
let log;
try {
log = JSON.parse(fs.readFileSync(DEFENSE_LOG_FILE, 'utf8'));
} catch {
log = { events: [] };
}
log.events.push({
type,
detail,
time: new Date().toISOString()
});
if (log.events.length > 100) {
log.events = log.events.slice(-100);
}
fs.mkdirSync(DATA_DIR, { recursive: true });
fs.writeFileSync(DEFENSE_LOG_FILE, JSON.stringify(log, null, 2));
}
// ═══════════════════════════════════════════════
// 🔗 融合态管理
// ═══════════════════════════════════════════════
/**
* 获取所有已注册节点
*/
function getRegisteredNodes() {
try {
const data = JSON.parse(fs.readFileSync(REGISTRY_FILE, 'utf8'));
return data.nodes || [];
} catch {
return [];
}
}
/**
* 获取活跃节点
*/
function getLiveNodes() {
try {
const data = JSON.parse(fs.readFileSync(LIVE_NODES_FILE, 'utf8'));
return data.nodes || [];
} catch {
return [];
}
}
/**
* 融合态状态报告
* 所有节点组成一个统一的巨型Agent
*/
function getFusedStatus() {
const nodes = getLiveNodes();
const registered = getRegisteredNodes();
return {
mode: 'MEGA-NODE',
description: '所有服务器融合为统一VPN动态Agent节点',
live_nodes: nodes.length,
registered_nodes: registered.length,
unified_entry: true,
smart_routing: nodes.length > 1 ? 'url-test' : 'single'
};
}
// ═══════════════════════════════════════════════
// ⚡ 分裂态管理 (Moving Target Defense)
// ═══════════════════════════════════════════════
/**
* 触发分裂 — 从融合态切换到分裂态
* @param {string} reason 分裂原因
* @returns {{ success: boolean, active_node: string, decoy_count: number }}
*/
function triggerSplit(reason) {
const status = readSwarmStatus();
if (status.state === SWARM_STATES.SPLIT) {
return { success: false, error: '已处于分裂态' };
}
const nodes = getLiveNodes();
if (nodes.length === 0) {
return { success: false, error: '无可用节点' };
}
// 随机选择一个真节点
const activeIndex = crypto.randomInt(0, nodes.length);
const activeNode = nodes[activeIndex];
// 其余为诱饵
const decoyNodes = nodes
.filter((_, i) => i !== activeIndex)
.map(n => ({
id: n.id,
name: n.name,
type: 'decoy',
decoy_since: new Date().toISOString()
}));
status.state = SWARM_STATES.SPLIT;
status.active_node_id = activeNode.id;
status.decoy_nodes = decoyNodes;
status.last_rotate = Date.now();
status.threat_level = Math.min((status.threat_level || 0) + 2, 5);
status.split_count = (status.split_count || 0) + 1;
status.last_split = new Date().toISOString();
status.split_reason = reason;
status.threat_events = status.threat_events || [];
status.threat_events.push({
type: 'split_triggered',
reason,
active_node: activeNode.id,
decoy_count: decoyNodes.length,
time: new Date().toISOString()
});
// 只保留最近20条威胁事件
if (status.threat_events.length > 20) {
status.threat_events = status.threat_events.slice(-20);
}
saveSwarmStatus(status);
logDefenseEvent('SPLIT', `分裂触发: ${reason} | 真节点: ${activeNode.id} | 诱饵: ${decoyNodes.length}`);
console.log(`🐝 蜂群分裂! 原因: ${reason}`);
console.log(` 真节点: ${activeNode.id} (${activeNode.name})`);
console.log(` 诱饵节点: ${decoyNodes.length}`);
return {
success: true,
active_node: activeNode.id,
decoy_count: decoyNodes.length
};
}
/**
* 真节点随机跳转 — 在分裂态下切换真节点位置
* 只在分裂态下有效
*/
function rotateActiveNode() {
const status = readSwarmStatus();
if (status.state !== SWARM_STATES.SPLIT) {
return { rotated: false, reason: '非分裂态' };
}
const nodes = getLiveNodes();
if (nodes.length <= 1) {
return { rotated: false, reason: '节点不足' };
}
// 当前真节点变为诱饵
const oldActiveId = status.active_node_id;
// 从所有节点中排除当前真节点,随机选新的
const candidates = nodes.filter(n => n.id !== oldActiveId);
if (candidates.length === 0) {
return { rotated: false, reason: '无候选节点' };
}
const newActive = candidates[crypto.randomInt(0, candidates.length)];
// 更新状态
status.active_node_id = newActive.id;
status.last_rotate = Date.now();
// 重建诱饵列表
status.decoy_nodes = nodes
.filter(n => n.id !== newActive.id)
.map(n => ({
id: n.id,
name: n.name,
type: 'decoy',
decoy_since: new Date().toISOString()
}));
saveSwarmStatus(status);
logDefenseEvent('ROTATE', `真节点跳转: ${oldActiveId}${newActive.id}`);
return { rotated: true, old: oldActiveId, new: newActive.id };
}
/**
* 触发融合 — 从分裂态恢复到融合态
* @param {string} reason 融合原因 (如: 危机解除)
* @returns {{ success: boolean }}
*/
function triggerFuse(reason) {
const status = readSwarmStatus();
if (status.state === SWARM_STATES.FUSED) {
return { success: false, error: '已处于融合态' };
}
status.state = SWARM_STATES.FUSED;
status.active_node_id = null;
status.decoy_nodes = [];
status.threat_level = 0;
status.last_fuse = new Date().toISOString();
status.fuse_reason = reason;
status.threat_events = status.threat_events || [];
status.threat_events.push({
type: 'fuse_triggered',
reason,
time: new Date().toISOString()
});
saveSwarmStatus(status);
logDefenseEvent('FUSE', `融合恢复: ${reason}`);
console.log(`🐝 蜂群融合! 原因: ${reason}`);
console.log(' 所有节点重新组成统一巨型Agent');
return { success: true };
}
/**
* 提升威胁等级
* @param {number} increment 增量 (默认1)
* @param {string} reason 原因
*/
function escalateThreat(increment, reason) {
const status = readSwarmStatus();
const oldLevel = status.threat_level || 0;
status.threat_level = Math.min(oldLevel + (increment || 1), 5);
status.threat_events = status.threat_events || [];
status.threat_events.push({
type: 'threat_escalation',
old_level: oldLevel,
new_level: status.threat_level,
reason,
time: new Date().toISOString()
});
if (status.threat_events.length > 20) {
status.threat_events = status.threat_events.slice(-20);
}
saveSwarmStatus(status);
logDefenseEvent('ESCALATE', `威胁升级: L${oldLevel}→L${status.threat_level} | ${reason}`);
// 威胁等级3以上自动触发分裂
if (status.threat_level >= 3 && status.state === SWARM_STATES.FUSED) {
console.log('⚠️ 威胁等级 ≥ 3自动触发蜂群分裂');
triggerSplit(`自动分裂: 威胁等级${status.threat_level} - ${reason}`);
}
return status.threat_level;
}
/**
* 获取当前蜂群完整状态
*/
function getSwarmReport() {
const status = readSwarmStatus();
const nodes = getLiveNodes();
const registered = getRegisteredNodes();
return {
state: status.state,
threat_level: status.threat_level || 0,
live_nodes: nodes.length,
registered_nodes: registered.length,
active_node: status.state === SWARM_STATES.SPLIT ? status.active_node_id : null,
decoy_count: status.state === SWARM_STATES.SPLIT ? status.decoy_nodes.length : 0,
split_count: status.split_count || 0,
last_split: status.last_split,
last_fuse: status.last_fuse,
updated_at: status.updated_at
};
}
// ═══════════════════════════════════════════════
// 🔄 定时监控 (PM2运行时)
// ═══════════════════════════════════════════════
let rotateTimer = null;
function startSwarmMonitor() {
console.log('🐝 蜂群防御Agent启动');
const status = readSwarmStatus();
console.log(` 当前状态: ${status.state}`);
console.log(` 威胁等级: L${status.threat_level || 0}`);
console.log(` 历史分裂: ${status.split_count || 0}`);
// 主监控循环
setInterval(() => {
try {
const s = readSwarmStatus();
// 分裂态下执行真节点随机跳转
if (s.state === SWARM_STATES.SPLIT) {
const timeSinceRotate = Date.now() - (s.last_rotate || 0);
if (timeSinceRotate >= DECOY_ROTATE_INTERVAL) {
const result = rotateActiveNode();
if (result.rotated) {
console.log(`🔄 真节点跳转: ${result.old}${result.new}`);
}
}
}
// 融合态下监控异常 (基础检查)
if (s.state === SWARM_STATES.FUSED) {
const nodes = getLiveNodes();
if (nodes.length === 0) {
console.warn('⚠️ 融合态无活跃节点');
}
}
} catch (err) {
console.error('[蜂群] 监控异常:', err.message);
}
}, MONITOR_INTERVAL);
}
// ═══════════════════════════════════════════════
// 导出API
// ═══════════════════════════════════════════════
module.exports = {
// 状态查询
readSwarmStatus,
getSwarmReport,
getFusedStatus,
getLiveNodes,
getRegisteredNodes,
// 分裂/融合操作
triggerSplit,
triggerFuse,
rotateActiveNode,
// 威胁管理
escalateThreat,
// 日志
logDefenseEvent,
// 常量
SWARM_STATES
};
// PM2直接运行
if (require.main === module) {
startSwarmMonitor();
}