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
2
3
4
5
6
7
8
9
10
11
# 第1步:哈希密码
hashedPassword = SHA256(password + b'\x00' + username)

# 第2步:时间盐(关键:按2分钟取整)
unixTime = 当前Unix秒
unixTime = unixTime - unixTime % 120 # 取整到最近的2分钟
timeSalt = SHA256(uint64(unixTime).bigendian)

# 第3步:PBKDF2派生32字节密钥
key = PBKDF2(hashedPassword, salt=timeSalt,
iterations=64, keyLen=32, hash=SHA256)

要点:密钥含时间维度。服务端最多试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自建可靠层。