AlexMelanFromRingo/norn-rs

GitHub: AlexMelanFromRingo/norn-rs

一个用 Rust 编写的高安全性分布式网格路由守护进程,通过创新路由和加密技术提供私密、抗审查的通信网络。

Stars: 0 | Forks: 0

# norn-rs 基于 Rust 编写的下一代网格路由守护进程。 命名源自北欧命运三女神——诺恩三姐妹:乌尔德(Urd)、薇尔丹蒂(Verðandi)、诗寇蒂(Skuld)——她们编织命运。该协议使用以她们命名的**K=3生成树**,由此赋予了守护进程其名称与架构。 ## 名称由来? 诺恩三姐妹编织万物命运。此协议在三棵平行的生成树(Urd、Verdandi、Skuld)间编织路由路径,每棵树根植于不同的地标节点,以实现冗余与负载分配。名称反映了其核心架构选择:三棵树,而非一棵。 ## 功能概述 norn-rs 创建一个加密的 IPv6 网格网络。每个节点获得一个从其 ed25519 公钥确定性派生的唯一 `200::/7` IPv6 地址。节点之间通过任何底层传输(IPv4 **或** IPv6 上的 TCP)相互连接,并能通过其 IPv6 地址访问网格中的任何其他节点,即使没有直接连接。 **`listen` 地址是底层传输地址**(物理网络),而非覆盖层地址。覆盖层 IPv6 地址(`200::/7`)从公钥派生,与传输层独立。此设计与 Yggdrasil 和 cjdns 相同。 ## 功能特性 | 特性 | 状态 | |------|------| | K=3生成树(Urd/Verdandi/Skuld) | ✅ | | 双曲几何路由(Kleinberg/Sarkar) | ✅ | | Cuckoo 过滤器 gossip 协议(2字节指纹,FPR 0.012%) | ✅ | | ChaCha20-Poly1305 会话加密 | ✅ | | X25519 + ML-KEM-768 后量子混合会话密钥 | ✅ | | 每日 ML-KEM 长期密钥对轮换(后量子前向安全) | ✅ | | 每次发送 X25519 密钥轮换(经典前向安全) | ✅ | | 轮换洋葱临时密钥(后量子中继前向安全) | ✅ | | 固定大小洋葱单元(1280 B,Tor 风格) | ✅ | | 每中继洋葱重放 LRU 缓存 | ✅ | | 主动路由验证探测器(Cuckoo 反污染) | ✅ | | 基于对端信任评分的路由偏好 | ✅ | | 双曲坐标一致性检查 | ✅ | | 认证 TCP 握手(NRN1 magic) | ✅ | | 基于每密钥工作量证明的 Sybil 抵抗(可配置位数) | ✅ | | 恒定时间公钥/路由标签比较 | ✅ | | 持久化已知对端缓存(重启后保留) | ✅ | | Prometheus `/metrics` 端点 | ✅ | | `nornctl` 管理 CLI 及 Shell 补全 | ✅ | | 基于属性的解析器模糊测试(proptest) | ✅ | | 反放大审计 + 大小固定测试 | ✅ | | QUIC 传输(`quic://`)与 TCP 并行 | ✅ | | mDNS / DNS-SD `_norn._tcp.local` 发现 | ✅ | | 声誉 gossip(TYPE 0x0D)用于跨网格信任共识 | ✅ | | HolePunch(TYPE 0x0E)用于对称 NAT 穿透 | ✅ | | Docker 镜像 + systemd 级加固 | ✅ | | 网络命名空间端到端 CI 测试工具 | ✅ | | 会话握手的 ProVerif 形式化模型 | ✅ | | 滑动窗口重放保护(64 个槽位) | ✅ | | 源隐私(加密的 enc_header) | ✅ | | 目标隐藏(路由标签 + enc_header) | ✅ | | 载荷填充(256 字节块) | ✅ | | 转发抖动(0–49ms,抵抗流量分析) | ✅ | | 掩护流量(随机 DUMMY 包) | ✅ | | 洋葱路由(Sphinx 启发式,N 跳 AEAD 层) | ✅ | | TUN 适配器(IPv6 覆盖层,Linux) | ✅ | | TCP 传输(IPv4 + IPv6 底层) | ✅ | | 多播对端发现(局域网) | ✅ | | 管理 JSON 套接字(`getSelf`, `getPeers`, `addPeer`) | ✅ | | SigRes 签名验证(RTT 防欺骗) | ✅ | | 重连去重(防止写入循环) | ✅ | ## 协议设计 ### 地址派生 每个节点的 IPv6 地址从其 ed25519 公钥派生: ``` addr[0] = 0x02 | (leading_zeros_count << 1) addr[1..] = public_key_bits_after_leading_zeros ``` 地址落在 `200::/7` 范围内。只要私钥不变,地址就是**永久**的。更改私钥会改变地址。 ### 传输层与覆盖层 - **传输地址**(配置中的 `listen`, `peers`):节点接受 TCP 连接的物理网络地址。可以是 IPv4(`tcp://1.2.3.4:9001`)或 IPv6(`tcp://[::1]:9001`)。这是节点在互联网上相互发现的方式。 - **覆盖地址**(`200::/7`):从公钥派生的逻辑网格地址。这是应用程序使用的地址,独立于物理网络。 ### 路由 流量路由使用 **Cuckoo 过滤器 gossip**:每个节点向其邻居广播一个包含所有可达地址的紧凑概率集合。中间节点将数据包转发给其过滤器中包含目标路由标签的对端。不交换完整的路由表——仅交换 4096 字节的类布隆过滤器。 路由标签是 `BLAKE2b("norn:route" || dest_pub_key)[..16]`——一个隐私保护标识符,防止中间节点学习目标公钥。 ### 安全性 - **端到端加密**:所有数据在发送方和接收方之间使用 ChaCha20-Poly1305 加密。中间节点仅看到密文。 - **源和目标隐藏**:`enc_header` 字段加密了源和目标身份。中间节点无法确定谁在与谁通信。 - **洋葱路由**:数据包可以被包装在 N 层同心的 AEAD 层中(每个中继一层)。每个中继剥离一层并进行转发,而不了解完整路径。 - **防重放**:64 槽位滑动窗口防止重放攻击,同时容忍乱序传递。 - **流量分析抵抗**:载荷填充、随机转发抖动和掩护流量抵御时间与大小相关性攻击。 ## 构建 ``` # 无 TUN 支持(仅路由,无内核接口) cargo build # 有 TUN 支持(在 Linux 上创建 norn0 接口) cargo build --features tun-support ``` ## 运行 ``` # 生成包含新私钥的配置 nornd genconfig > norn.toml # 启动守护进程 nornd -c norn.toml # 有 TUN(TUN 接口需要 root 或 CAP_NET_ADMIN 权限) sudo nornd -c norn.toml ``` ## 配置 ``` # 您的节点 ed25519 私钥(32 字节,十六进制)。 # 请妥善保管此密钥。它决定了您的 IPv6 地址。 private_key = "..." # 用于接受传入对等连接的 TCP 地址。 # 可以是 IPv4 或 IPv6。 listen = ["tcp://0.0.0.0:9001"] # 启动时要拨号连接的对等节点。 peers = ["tcp://peer.example.com:9001"] # TUN 接口名称。省略则禁用 TUN(纯路由模式)。 tun_name = "norn0" # 管理套接字路径。 admin_socket = "/var/run/norn.sock" # 局域网对等节点发现。 multicast_enabled = true multicast_port = 9001 # 日志记录:error | warn | info | debug | trace log_level = "info" ``` ## 管理 API 管理套接字使用换行符分隔的 JSON: ``` # 获取节点身份 echo '{"method":"getSelf"}' | nc -U /var/run/norn.sock # 列出已连接的对等节点 echo '{"method":"getPeers"}' | nc -U /var/run/norn.sock # 在运行时添加对等节点 echo '{"method":"addPeer","uri":"tcp://1.2.3.4:9001"}' | nc -U /var/run/norn.sock ``` ## 实际测试结果 在 Linux 上使用两个节点通过虚拟链路连接,在隔离的网络命名空间中进行了测试: ``` Node 1: 200:1cb8:c754:7af0:e2b6:ba5e:1177:69c0 Node 2: 200:bd10:1247:9dd6:a86a:186e:5b8d:90d1 5 packets transmitted, 5 received, 0% packet loss rtt min/avg/max/mdev = 4.0/4.1/4.7/0.1 ms ``` ## 回滚标签 | 标签 | 描述 | |------|------| | `v0.2.0-production-ready` | TCP 传输、TUN、发现、管理、源隐私 | | `v0.2.1-dest-privacy` | + enc_header、routing_tag、填充、抖动、掩护流量 | | `v0.2.2-onion-routing` | + 洋葱路由,所有关键安全修复 |
标签:ChaCha20-Poly1305, Cuckoo过滤器, IPv6, ML-KEM-768, PowerShell, Rust语言, X25519, 信任评分, 分布式系统, 加密通信, 双曲几何路由, 可视化界面, 后量子密码学, 响应大小分析, 密钥轮换, 对等网络, 洋葱路由, 生成树, 网格网络, 网络安全, 覆盖网络, 请求拦截, 路由协议, 路由验证, 通知系统, 隐私保护