anujs-27/SpectreGate
GitHub: anujs-27/SpectreGate
SpectreGate 是一个基于 Rust 和 libpcap 的零套接字端口敲门网关,通过被动嗅探加密敲门包并动态修改 nftables 规则来隐藏和保护敏感端口。
Stars: 0 | Forks: 0
# SpectreGate - 一款使用 Rust 编写的异步、零套接字、隐蔽端口授权工具🦀
## 架构
### > 客户端
#### 当客户端创建 payload 时,它最初是这样的:
```
packet-beta
0-7: "Timestamp (8 bytes)"
8-9: "Port (2 bytes)"
10-17: "Padding length prefix (8 bytes)"
```
#### 但为了防止网络指纹识别,会添加随机字节填充,使其大小达到 64 字节。
```
---
title: "Raw Padded Payload Structure"
---
packet-beta
0-7: "Timestamp (8 bytes)"
8-9: "Port (2 bytes)"
10-17: "Padding length prefix (8 bytes)"
18-63: "Random bytes (46 bytes)"
```
#### 随后,使用 ChaCha20Poly1305 AEAD 算法和 32 字节长的密钥对该数据包进行加密。此后,传输线路上的数据如下所示:
```
packet-beta
0-11: "NONCE (12 bytes)"
12-75: "Cipher text (64 bytes)"
76-91: "Auth tag (16 bytes)"
```
### > Daemon 端
#### daemon 在用户空间中持续运行,并使用 libpcap 和 BPF 循环嗅探数据包。它作为网络接口卡 (NIC) 上的被动监听分接,读取原始网络层帧。它会切开帧以提取 IPv4 地址,分离出 UDP 流量头部和原始的加密 payload。它会丢弃损坏或无效的互联网帧。
#### 如果密文被顺利解密且密钥通过验证,则会将时间戳与设定的时间漂移(即 15 秒)进行比较,随后修改 nftables,使该端口在 10 秒的时间窗口内可访问,在此期间,客户端可以访问它。
## 安全措施
- 零 socket 占用:Daemon 不绑定到 socket,以减少暴露面。
- 固定大小 payload:降低网络指纹识别的风险。
- 存储 NONCE:将已见的 NONCE 存储起来,以防止重放攻击。
## 工具链
### Rust
- 稳定版 Rust 工具链
- cargo 和 rustc
### Crate 依赖:
| Crate | 版本 | 特定架构用途 |
| :--- | :--- | :--- |
| **`serde`** | `1.0` | 为原生 Rust 结构体提供序列化框架宏 (`#[derive(Serialize, Deserialize)]`)。 |
| **`bincode`** | `1.3.3` | 使用显式的尾字节容错配置,处理紧凑、低开销的二进制编码和解码。 |
| **`chrono`** | `0.4` | 管理两个主机节点之间的实时时钟捕获和 epoch 验证格式化。 |
| **`chacha20poly1305`** | `0.10` | 实现认证加密与关联数据 (AEAD) 标准,以实现防篡改的数据隐私。 |
| **`tokio`** | `1.35` | 为异步多线程运行时引擎提供动力,解锁并发的数据包流处理通道。 |
| **`rand`** | `0.10.1` | 提供 安全的随机数生成子系统,用于生成 nonce 和 payload 混淆填充。 |
| **`clap`** | `4.6.1` | 将声明式命令行输入和参数解析为运行时的类型化配置。 |
| **`pcap`** | `2.4.0` | 直接与系统底层的 `libpcap` 库交互,绑定基于原始事件的捕获流。 |
| **`futures`** | `0.3` | 扩展异步原语操作,支持异步流处理和数据包迭代。 |
| **`etherparse`** | `0.20.2` | 执行零拷贝的网络数据包头部切片,以最高效率提取内部的第 4 层数据块。 |
### 系统依赖
- libpcap 开发头文件
### Linux 权限
- CAP_NET_RAW 和 CAP_NET_ADMIN
或
- Root 权限
## 命令行参数
### Daemon 二进制文件
#### ```--interface```:目标网卡名称。
#### ```--port ```:BPF 过滤器监听的端口。
#### ```--key ```:共享密钥的路径。
### Client 二进制文件
#### ```--server ```:目标主机的 IP 地址。
#### ```--port ```:指定的 UDP 敲击端口。
#### ```--open-port```:你想要解锁的端口。
#### ```--key ```:共享密钥的路径。
## 自行测试
#### 创建测试环境:
```
# 初始化一个用于测试的隔离 'client_ns' network namespace 和 veth 对
sudo bash ./test/test_env.sh
```
#### 运行目标服务(主机工作区)
```
nc -nvlp 22 -s 10.0.0.1
```
#### 运行 daemon(主机工作区)
```
# 生成 32 字节长的 secret key
dd if=/dev/urandom of=./secret.key bs=1 count=32
# 运行 daemon
sudo ./target/release/spectregate-daemon \
--interface veth_server \
--port 4192 \
--key ./secret.key
```
#### 运行并使用客户端测试
```
# 向 daemon 发送 knock
sudo ip netns exec client_ns ./target/release/spectregate-client \
--server 10.0.0.1 \
--port 4192 \
--open-port 22 \
--key ./secret.key
# 使用 nmap 进行测试
sudo ip netns exec client_ns nmap -sU -sS -p U:4192,T:22 10.0.0.1
```
## 限制
标签:DNS 反向解析, nftables, Rust, 可视化界面, 目录遍历, 端口敲门, 网络安全, 网络流量审计, 网络隐身, 通知系统, 隐私保护