mieru协议
mieru(見える)是Go写的SOCKS5/HTTP/HTTPS翻墙代理:客户端mieru,服务端mita。同类对标Shadowsocks/V2Ray,但设计目标更激进——无流量特征、抗主动探测。
1.设计要点
| 特性 | 说明 |
|---|---|
| 不用TLS | 不需要域名、证书、伪装站点 |
| 加密算法 | XChaCha20-Poly1305(AEAD,nonce固定24字节) |
| 密钥生成 | PBKDF2(username+password+时间盐),每2分钟轮换一次 |
| 抗探测 | 随机填充(padding 0/1/2)调节信息熵,探测包解密失败则静默丢弃、不回应 |
| 多用户 | 同一台mita可服务多账号;nonce尾部4字节是username+nonce前16字节的SHA-256摘要,加速用户查找 |
| 双协议 | TCP(快,但更容易被嗅探)/ UDP(无握手,需更多解密尝试,更抗探测) |
2.密钥生成
1 | # 第1步:哈希密码 |
要点:密钥含时间维度。服务端最多试3个时间窗口(过去/当前/未来),所以客户端与服务端时钟差必须<4分钟。
3.数据段格式
每个segment(所有多字节字段大端序):
| padding 0 | nonce | 加密metadata | metadata认证tag | padding 1 | 加密payload | payload认证tag | padding 2 |
|---|---|---|---|---|---|---|---|
| 随机 | 0或24B | 固定32B | 16B | 随机 | 变长 | 16B | 随机 |
- 只有第一段(TCP每个方向一次)携带24字节nonce;之后nonce逐次+1滚动。
- 单片最大32768字节(低熵模式32为32764)。
- 3段padding的作用:即使内容相同,包长也不同,抹平流量指纹。
4.metadata(固定32字节,三种)
| 类型 | protocol type取值 | 用途 | 载荷上限 |
|---|---|---|---|
| Session | 2开/3开确认/4关/5关确认 | 会话建立与释放 | 1024B |
| Data | 6客户端→服务端/7反向/8/9是ACK | 数据传输+流控 | MTU内 |
| Data低熵扩展 | 10/11 | 对低熵载荷(如HTTP文本)二次编码 | 见下 |
Data metadata里的sequence number/unack sequence number/window size自成一套流控+ACK机制——UDP协议下等于自己造了个可靠层。
低熵扩展的思路:密文本身熵已满,padding再大也”像噪声”;但对低熵明文,用mask把有效位打进64位块(mode 32=每块4字节有效,膨胀2.0x;mode 56=7字节,膨胀≈1.15x),让载荷熵也”随机化”,进一步抗统计探测。
5.TCP vs UDP协议对比
| 维度 | TCP | UDP |
|---|---|---|
| 握手 | 有session开/关 | 无握手 |
| 速度 | 快(官方称可快2~5倍) | 需多次解密尝试,慢 |
| 可靠性 | 传输层保证 | 应用层自己ACK+窗口流控 |
| 抗嗅探 | 弱(TCP特征明显) | 强(无连接状态) |
| 单包约束 | 32768B分片 | 必须<MTU |
| 官方建议 | 多数场景首选 | 高对抗环境 |
6.与同类的架构对比
| Shadowsocks | V2Ray | mieru | |
|---|---|---|---|
| 传输伪装 | 可选TLS | 走TLS+混淆 | 完全不伪装,纯靠加密+熵调节 |
| 密钥 | 静态 | 静态 | 时间轮换(2min窗口) |
| 抗主动探测 | 中 | 低-中 | 高(探测包解密失败即丢弃) |
| 域名/证书 | 可选 | 通常需要 | 不需要 |
| 依赖 | - | - | 客户端/服务端时钟同步 |
mieru = XChaCha20-Poly1305 + 时间盐密钥轮换 + 随机padding熵伪装 + UDP自建可靠层。