dyber-pqc/DyberVPN

GitHub: dyber-pqc/DyberVPN

一款基于 Rust 的自托管后量子 VPN 与零信任网络访问平台,通过 NIST 标准化抗量子算法保护基础设施通信安全。

Stars: 1 | Forks: 0

![DyberVPN logo banner](https://static.pigsec.cn/wp-content/uploads/repos/cas/8e/8e24ffb2149b0aba5a946300d282640636abc3c4fa1720ea44143b7491b6ef06.svg) # DyberVPN **后量子 VPN 与零信任网络访问** [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/39/39faa54be350a1dab8afd3b2fb8c1c83e4d9cff84abfef2374d19a18053687c4.svg)](https://github.com/dyber-pqc/DyberVPN/actions/workflows/ci.yml) [![Desktop CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/87/878900ceb87ef87d35b17039d4ed090bb8fe46eee4bbf0b169e0545c5caaa563.svg)](https://github.com/dyber-pqc/DyberVPN/actions/workflows/desktop-ci.yml) [![Security](https://static.pigsec.cn/wp-content/uploads/repos/cas/dc/dcfbf35b487cda580176c7692efaffeabf92fb84e3cceab4db74d4b0fb368510.svg)](https://github.com/dyber-pqc/DyberVPN/actions/workflows/security-audit.yml) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE) [![Rust](https://img.shields.io/badge/rust-1.75%2B-orange.svg)](https://www.rust-lang.org/) [![Tests](https://img.shields.io/badge/tests-123%20passing-brightgreen.svg)](#testing) DyberVPN 是一个开源、自托管的后量子 VPN 与零信任网络访问 (ZTNA) 平台,专为无法通过第三方云服务商路由流量的组织而构建。它实现了 NIST 标准化的后量子算法 (ML-KEM-768, ML-DSA-65),同时保持与 WireGuard 协议的兼容性,并添加了完整的 ZTNA 架构,包含云/自托管的 Broker、网络内部的 Connector 以及远程客户端 (Client) —— 从而无需在私有网络上配置入站防火墙规则。 ## 状态 DyberVPN 支持在三种操作模式(classic、hybrid、pq-only)下使用 ML-DSA-65 签名的**完整后量子身份验证**,包含 Broker 中继、Connector 代理和 Client 访问的完整 **ZTNA 后端** —— 所有这些都具备逐包策略执行、密钥撤销和结构化审计日志记录 —— 以及使用 Tauri 构建的**跨平台桌面客户端**。目前已有 123 个测试在 6 个 crate 中通过。 ## 功能 ### 核心 VPN - **后量子安全**:混合 ML-KEM-768 + X25519 密钥交换可防御“现在收集,以后解密”攻击 - **PQ 身份验证**:使用 ML-DSA-65 签名进行抗量子的双向身份验证(pq-only 模式) - **符合 NIST 标准**:使用 FIPS 203 (ML-KEM) 和 FIPS 204 (ML-DSA) 标准化算法 - **兼容 WireGuard**:数据面采用标准 WireGuard 封装 - **自托管**:完全在您的基础设施上运行,零外部依赖 - **高性能**:使用 Rust 构建,从 Cloudflare 的 BoringTun 分支而来 - **多节点服务器**:具备分流功能的进程内点对点路由 - **热重载**:通过 SIGHUP 触发配置重载,且不会中断现有连接 - **自动化配置**:通过 Enrollment API 实现零接触节点接入 ### 零信任网络访问 (ZTNA) - **Broker 中继**:云或自托管的中继服务器,负责终结来自 Client 和 Connector 的 WireGuard 隧道,完全在用户空间执行会话缝合(解密 → 策略检查 → 重新加密) - **Connector 代理**:部署在私有网络内部的轻量级代理,仅向 Broker 发起出站连接,并通告本地 CIDR 路由 —— 无需入站防火墙规则 - **Client 访问**:远程用户通过标准 WireGuard 握手连接到 Broker;Broker 根据最长前缀匹配的目标查询将流量路由到正确的 Connector - **会话缝合**:Broker 解密来自一个节点 Tunn 的数据包,评估逐包策略,然后通过目标节点的 Tunn 重新加密 —— Broker 上无需 TUN 设备 - **服务注册表**:动态 CIDR 到 Connector 的映射,支持最长前缀匹配路由,并在 Connector 断开连接时自动清理 - **控制面**:基于 NDJSON-over-TCP 协议实现 Connector 注册、心跳保活和优雅断开连接 - **过期节点清理**:基于可配置的超时时间,自动清理闲置的 Client 和 Connector ### 企业级安全 - **零信任访问控制**:对每个数据包执行基于节点角色的策略执行(L3/L4 检测) - **密钥撤销与生命周期**:CRL 管理、暂停、恢复、自动过期(可通过 `key_max_age_hours` 配置) - **合规审计日志**:适用于 SOC 2、FedRAMP、HIPAA 的 NDJSON 结构化事件(支持 SIEM) - **ML-DSA 双向身份验证**:在 hybrid/pq-only 模式下,对 Connector 注册进行后量子签名验证 - **撤销执行**:在 VPN 握手和 ZTNA Connector 注册阶段均会拒绝已撤销的密钥 - **设备安全状况评估**:检查操作系统版本、防火墙、磁盘加密、杀毒软件和屏幕锁定,并提供合规性评分 ### 桌面客户端 - **跨平台**:单一代码库支持 Windows (.exe/.msi)、macOS (.dmg)、Linux (.deb/.AppImage) - **隧道管理**:导入 TOML 配置,支持连接/断开,并显示实时流量统计、运行时间和延迟 - **密钥生成界面**:一键生成 hybrid、PQ-only 或 classic 密钥对 - **设置仪表板**:Kill switch、DNS 泄露保护、分流、MTU/端口配置、加密模式选择 - **集中管理**:设备注册、密钥撤销/暂停、合规审计日志查看器 - **设备安全状况**:实时操作系统安全评估(防火墙、加密、杀毒软件) - **系统托盘**:最小化到托盘,双击恢复,快速连接/断开 - **单实例**:防止重复启动应用程序 - **自动连接**:可选择在应用启动时自动连接 - **优雅关闭**:退出时干净地拆除所有隧道 - **演示模式**:无需 Tauri 后端即可在任何浏览器中运行完整的 UI 进行开发 ## 快速开始 ### 安装 ``` # 克隆和构建 git clone https://github.com/dyber-pqc/DyberVPN.git cd dybervpn cargo build --release # 安装(可选) sudo cp target/release/dybervpn /usr/local/bin/ ``` ### 生成密钥 ``` # 生成混合(ML-KEM + X25519)密钥对 dybervpn genkey -m hybrid # 生成纯 PQ(ML-KEM + ML-DSA)密钥对 dybervpn genkey -m pqonly ``` ### 服务器设置 创建 `server.toml`: ``` [interface] name = "dvpn0" listen_port = 51820 address = "10.200.200.1/24" mode = "pqonly" # or "hybrid" for Ed25519 auth private_key = "" pq_private_key = "" mldsa_private_key = "" # Required for pqonly mode [[peer]] public_key = "" pq_public_key = "" mldsa_public_key = "" # Required for pqonly mode allowed_ips = "10.200.200.2/32" ``` 启动服务器: ``` sudo dybervpn up -c server.toml -f ``` ### 客户端设置 创建 `client.toml`: ``` [interface] name = "dvpn1" address = "10.200.200.2/24" mode = "pqonly" private_key = "" pq_private_key = "" mldsa_private_key = "" [[peer]] public_key = "" pq_public_key = "" mldsa_public_key = "" allowed_ips = "10.200.200.0/24" endpoint = "server_ip:51820" persistent_keepalive = 25 ``` 连接: ``` sudo dybervpn up -c client.toml -f ``` ### 测试连通性 ``` ping 10.200.200.1 # From client to server ``` ## ZTNA 设置 DyberVPN 的零信任网络访问模式使用三个组件: ``` Client ──(outbound)──> Broker <──(outbound)── Connector │ │ Policy Engine Private Network Audit Logger (10.1.0.0/16) ``` ### Broker 设置 创建 `broker.toml`: ``` [broker] listen_udp = "0.0.0.0:51820" listen_control = "0.0.0.0:51821" private_key = "" mode = "hybrid" max_clients = 1000 session_timeout_secs = 300 heartbeat_timeout_secs = 120 [access_control] enabled = true default_action = "deny" [security] crl_path = "/etc/dybervpn/revoked-keys.json" [audit] enabled = true path = "/var/log/dybervpn/broker-audit.jsonl" ``` 启动 Broker: ``` dybervpn broker -c broker.toml ``` ### Connector 设置 创建 `connector.toml`: ``` [interface] name = "dvpn-conn0" mode = "hybrid" private_key = "" pq_private_key = "" [connector] broker_endpoint = "broker.example.com:51820" broker_control = "broker.example.com:51821" broker_public_key = "" advertised_routes = ["10.1.0.0/16", "192.168.1.0/24"] service_name = "corp-network" heartbeat_interval = 30 ``` 启动 Connector: ``` dybervpn connect -c connector.toml ``` Connector 仅发起出站连接 —— 无需入站防火墙规则。 ### Client 访问 客户端使用标准的 WireGuard 配置连接到 Broker,并将 Broker 作为它们的节点。Broker 会根据目标 IP 透明地将流量路由到正确的 Connector。 ## 操作模式 | 模式 | 密钥交换 | 身份验证 | 适用场景 | |------|--------------|----------------|----------| | `hybrid`(默认) | ML-KEM-768 + X25519 | Ed25519 | 生产环境 — 纵深防御 | | `pqonly` | ML-KEM-768 + X25519 | ML-DSA-65 | 最高级别的抗量子能力 | | `classic` | X25519 | Ed25519 | WireGuard 兼容性 | ## CLI 参考 ``` # Core VPN dybervpn genkey -m # Generate key pairs (hybrid, pqonly, classic) dybervpn up -c -f # Start VPN tunnel (foreground) dybervpn up -c # Start VPN tunnel (daemon) dybervpn down # Stop VPN tunnel dybervpn status # Show tunnel status dybervpn check -c # Validate configuration dybervpn version # Show version and crypto info dybervpn benchmark -i 100 # Run crypto benchmarks dybervpn self-test # Run FIPS crypto self-tests dybervpn reload # Hot-reload config and CRL # ZTNA dybervpn broker -c broker.toml # Start ZTNA Broker relay dybervpn connect -c connector.toml # Start Connector agent # Peer 管理 dybervpn add-peer -c -n -k -a dybervpn remove-peer -c -p dybervpn list-peers -c dybervpn enroll -c -t # Automated provisioning # Key 生命周期 dybervpn revoke-key -c -p -r dybervpn suspend-key -c -p -e 24h dybervpn reinstate-key -c -p dybervpn list-revoked -c [--json] # ML-DSA 签名 dybervpn sign-keygen -m pqonly # Generate ML-DSA key pair dybervpn sign -k -m # Sign a message dybervpn verify -k -m -s # Verify signature ``` ## 企业级功能 DyberVPN 包含三项专为受监管环境设计的企业级安全功能: | 功能 | 配置部分 | 目的 | |---------|---------------|---------| | **零信任访问控制** | `[access_control]` | 对每个数据包执行基于节点的策略 | | **密钥生命周期管理** | `[security]` | 撤销、暂停、过期、轮换 | | **结构化审计日志** | `[audit]` | 用于 SOC 2 / FedRAMP / HIPAA 的 NDJSON 事件 | ``` # 在 server.toml 中启用: [access_control] enabled = true default_action = "deny" # Zero Trust [security] crl_path = "/etc/dybervpn/revoked-keys.json" [audit] enabled = true path = "/var/log/dybervpn/audit.jsonl" ``` 有关完整的文档、合规性映射和示例配置,请参阅 `docs/enterprise-features.md`。 ## 性能 在典型硬件上的基准测试(release 构建): | 算法 | 操作 | 时间 | |------------|-----------|---------| | ML-KEM-768 | keygen | ~88 µs | | ML-KEM-768 | encaps | ~77 µs | | ML-KEM-768 | decaps | ~91 µs | | ML-DSA-65 | keygen | ~291 µs | | ML-DSA-65 | sign | ~328 µs | | ML-DSA-65 | verify | ~166 µs | | X25519 | DH | ~45 µs | | Ed25519 | sign | ~29 µs | | Ed25519 | verify | ~31 µs | **完整混合握手:~250-300 µs** **完整 PQ-only 握手:~2-3 ms**(包含 ML-DSA 签名) ## 测试 所有 123 个测试在 6 个 crate 中通过: ``` cargo test --release --all # 结果: # boringtun: 37 个通过(PQ handshake, ML-DSA auth, tunnel 测试) # dybervpn-protocol: 15 个通过 + 1 个文档测试 # dybervpn-tunnel: 2 个通过 # dybervpn-broker: 16 个通过(ZTNA 集成测试) # dybervpn-cli: 49 个通过(CLI + 企业功能测试) # dybervpn-metrics: 3 个通过 ``` 关键测试领域: - **PQ-only 模式**:隧道创建、握手发起、完整的双向 ML-DSA 身份验证、数据传输、无效签名拒绝 - **ZTNA Broker**:Connector 注册/心跳、拒绝已撤销节点、会话缝合、策略拒绝、多 Connector 路由、过期节点清理、配置解析 - **企业级**:策略引擎规则、CRL 撤销/暂停/恢复、审计事件记录、热重载 ## 架构 ### 点对点 VPN ``` ┌───────────────────────────────────────────────────────┐ │ DyberVPN Node │ │ ┌───────────┐ ┌───────────────┐ ┌───────────────┐ │ │ │ TUN/TAP │ │ PQ Handshake │ │ WireGuard │ │ │ │ Interface │──│ Engine │──│ Data Plane │ │ │ │ │ │ (ML-KEM + │ │ (ChaCha20- │ │ │ │ │ │ ML-DSA) │ │ Poly1305) │ │ │ └───────────┘ └───────────────┘ └───────────────┘ │ │ │ │ │ ┌─────────────┐ ┌────┴────────┐ ┌───────────────┐ │ │ │ Policy │ │ Crypto │ │ Audit Logger │ │ │ │ Engine │ │ ml-kem/dsa │ │ (NDJSON) │ │ │ │ (L3/L4) │ │ x25519/ed │ │ │ │ │ └─────────────┘ └─────────────┘ └───────────────┘ │ └───────────────────────────────────────────────────────┘ ``` ### ZTNA(Broker 模式) ``` ┌──────────┐ ┌────────────────────────────────┐ ┌──────────────┐ │ Client │ UDP │ Broker │ UDP │ Connector │ │ │────────>│ │<────────│ │ │ Tunn(C↔B)│ │ Tunn(C) Tunn(Conn) │ │ Tunn(Conn↔B) │ └──────────┘ │ │ │ │ └──────┬───────┘ │ ▼ ▼ │ │ │ Decrypt → Policy → Re-encrypt │ Private Network │ Engine │ (10.1.0.0/16) │ │ │ ┌────────────┐ ┌────────────┐ │ │ │ Service │ │ Revocation │ │ │ │ Registry │ │ Engine │ │ │ │ (CIDR→Conn)│ │ (CRL) │ │ │ └────────────┘ └────────────┘ │ │ │ │ TCP Control Plane (NDJSON) │ │ ├─ Register / RegisterAck │ │ ├─ Heartbeat / HeartbeatAck │ │ └─ Disconnect │ └────────────────────────────────┘ ``` ## 安全模型 - **混合密钥交换**:必须同时破解 ML-KEM-768 和 X25519 才能破坏机密性 - **PQ 身份验证**:ML-DSA-65 签名提供抗量子的节点身份验证 - **纵深防御**:如果 PQ 算法存在未发现的弱点,经典算法可提供后备支持 - **前向保密**:每次握手都会生成临时密钥 - **符合 CNSA 2.0**:算法选择满足 NSA 商业国家安全算法套件 2.0 的要求 - **零信任**:没有隐式信任 —— 每个数据包在转发前都会在 Broker 处进行策略评估 - **无需入站防火墙规则**:Connector 和 Client 均向 Broker 发起出站连接 - **会话缝合隔离**:Client 和 Connector 之间的流量会在 Broker 处被解密、检查并重新加密 —— 双方各自拥有独立的 WireGuard 会话 - **重放保护**:ML-DSA 注册签名包含时间戳,并在 300 秒的窗口内进行验证 ## 项目结构 ``` dybervpn/ ├── crates/ │ ├── dybervpn-protocol/ # Core crypto, types, config parsing │ ├── dybervpn-tunnel/ # TUN device, daemon, event loop, connector mode │ │ └── src/ │ │ ├── daemon.rs # Daemon with VPN + Connector modes │ │ ├── connector.rs # Connector agent (control plane client) │ │ ├── policy.rs # L3/L4 policy engine + packet inspection │ │ ├── revocation.rs # CRL-based key revocation │ │ └── audit.rs # NDJSON structured audit logger │ ├── dybervpn-broker/ # ZTNA Broker relay server │ │ └── src/ │ │ ├── broker.rs # Main async event loop (UDP + session stitching) │ │ ├── control.rs # TCP control plane (Connector registration) │ │ ├── session.rs # Session stitching (decrypt → policy → re-encrypt) │ │ ├── registry.rs # Service registry (CIDR → Connector routing) │ │ ├── peer.rs # BrokerPeer management (Client/Connector) │ │ ├── auth.rs # ML-DSA signature verification │ │ ├── config.rs # BrokerConfig + TOML parsing │ │ └── error.rs # Error types │ ├── dybervpn-cli/ # Command-line interface (all subcommands) │ └── dybervpn-metrics/ # Prometheus metrics ├── boringtun/ # Forked WireGuard + PQ extensions │ └── src/noise/ │ ├── mod.rs # Tunn (encapsulate/decapsulate) │ ├── handshake.rs # Classical Noise handshake │ ├── hybrid_handshake.rs # ML-KEM/ML-DSA types │ └── hybrid_integration.rs # PQ state machines ├── desktop/ # Tauri desktop client │ ├── src/ # React frontend (JSX, CSS modules) │ │ ├── pages/ # Tunnels, Keys, Settings, About │ │ ├── components/ # 15+ reusable UI components │ │ ├── hooks/ # useUptime, useTraffic │ │ └── lib/ # Tauri invoke bridge, persistent store │ └── src-tauri/ # Rust backend (Tauri 2.0) │ └── src/main.rs # 20+ Tauri commands, system tray, stats emitter ├── deploy/ │ ├── Dockerfile │ ├── docker-compose.yml │ ├── dybervpn.service # systemd unit │ └── install.sh └── test-configs/ ├── pqonly-server.toml # Example PQ-only server └── pqonly-client.toml # Example PQ-only client ``` ## 从源码构建 ### 环境要求 - Rust 1.75+ - Node.js 20+(用于桌面客户端) - Linux、macOS 或 Windows - 需要 Root/sudo 权限以创建 TUN 设备 (CLI) ### 构建 CLI ``` cargo build --release ``` ### 构建桌面应用 ``` cd desktop npm install npm run tauri build ``` 安装程序将输出到 `desktop/src-tauri/target/release/bundle/`。 ### 在开发环境中运行桌面应用 ``` cd desktop npm run tauri dev ``` ### 运行测试 ``` cargo test --release --all ``` ## 部署 ### systemd ``` sudo cp deploy/dybervpn.service /etc/systemd/system/ sudo systemctl daemon-reload sudo systemctl enable dybervpn sudo systemctl start dybervpn ``` ### Docker ``` docker build -t dybervpn:latest -f deploy/Dockerfile . docker-compose -f deploy/docker-compose.yml up -d ``` ## 企业级安全 DyberVPN 包含用于生产部署的企业安全功能,适用于点对点 VPN 和 ZTNA Broker 模式: ``` # Zero Trust — 默认拒绝,按角色允许 [access_control] enabled = true default_action = "deny" # Key 生命周期 — CRL、自动过期、强制轮换 [security] crl_path = "/etc/dybervpn/revoked-keys.json" key_max_age_hours = 720 # 审计 — 用于 SIEM 摄取的 NDJSON 事件 [audit] enabled = true path = "/var/log/dybervpn/audit.jsonl" events = ["connection", "handshake", "policy", "key_management", "admin"] ``` 在 ZTNA 模式下,这些功能在 Broker 上运行: - **策略引擎**在转发前检查每个缝合的数据包(源/目标 IP、协议、端口) - **撤销引擎**拒绝来自已撤销密钥的 VPN 握手和 Connector 注册 - **审计记录器**记录所有 Broker 事件,包括 Connector 注册、Client 连接、策略决策和会话缝合 密钥管理 CLI: ``` dybervpn revoke-key -c server.toml -p alice -r employee_departed -b admin@co.com dybervpn suspend-key -c server.toml -p bob -e 24h dybervpn reinstate-key -c server.toml -p bob dybervpn list-revoked -c server.toml --json ``` 完整文档:[docs/enterprise-security.md](docs/enterprise-security.md) ## 合规性 - **NIST FIPS 203**:ML-KEM(基于模块格的密钥封装机制) - **NIST FIPS 204**:ML-DSA(基于模块格的数字签名算法) - **CNSA 2.0**:NSA 商业国家安全算法套件 2.0 - **SOC 2**:结构化审计日志 (CC6.1, CC6.2, CC6.3, CC7.2) - **FedRAMP**:访问控制 + 审计跟踪 (AC-2, AC-3, AU-2, AU-3) - **HIPAA**:访问控制 + 审计控制 (§164.312) ## 路线图 - [x] 混合 ML-KEM-768 + X25519 密钥交换 - [x] ML-DSA-65 签支持 - [x] 完整的 ML-DSA 握手身份验证(pq-only 模式) - [x] 包含 genkey、up、down、status、check 的 CLI - [x] PID 文件管理和守护进程化 - [x] 从 TOML 配置加载 ML-DSA 密钥 - [x] 零信任访问控制(基于节点的策略引擎) - [x] 密钥撤销与暂停生命周期管理 - [x] 结构化审计日志(NDJSON,SOC 2 / FedRAMP / HIPAA) - [x] 具备点对点转发的多节点服务器 - [x] 针对配置和 CRL 更改的热重载 - [x] 用于自动化配置的 Enrollment API - [x] 具备会话缝合的 ZTNA Broker 中继 - [x] 具备仅出站控制面的 Connector 代理 - [x] 具备最长前缀匹配路由的服务注册表 - [x] 用于 Connector 注册的 ML-DSA 双向身份验证 - [x] 具有可配置超时的过期节点清理 - [x] 通过 WireGuard 握手解析提取 Client 身份 - [x] 通过学习到的 IP 映射进行反向路由 - [x] 具备完整企业子系统集成的 Broker CLI 命令 - [x] 带有系统托盘、自动连接和集中管理功能的 Tauri 桌面应用 - [x] 跨平台桌面构建 - [x] 设备安全状况评估与合规性评分 - [x] 使用 GitHub Actions 的 CI/CD(后端、桌面、基准测试、安全审计) - [x] 带有 GHCR 发布的 Docker 多阶段构建 - [ ] QUAC 100 硬件加速 - [ ] FIPS 140-3 验证的加密模块 - [ ] iOS/Android 客户端 ## 许可证 - **新代码**:Apache 2.0 - **BoringTun 派生代码**:BSD-3-Clause WireGuard® 是 Jason A. Donenfeld 的注册商标。DyberVPN 未获得 Jason A. Donenfeld 的赞助或认可。 ## 贡献 欢迎贡献!请阅读我们的贡献指南并提交 pull request。 ## 支持 - GitHub Issues:错误报告和功能请求 - 安全问题:security@dyber.org(用于负责任的漏洞披露)
标签:Rust, VPN, WireGuard, 可视化界面, 后量子密码学, 网络安全, 网络流量审计, 通知系统, 隐私保护, 零信任网络