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, 信任评分, 分布式系统, 加密通信, 双曲几何路由, 可视化界面, 后量子密码学, 响应大小分析, 密钥轮换, 对等网络, 洋葱路由, 生成树, 网格网络, 网络安全, 覆盖网络, 请求拦截, 路由协议, 路由验证, 通知系统, 隐私保护