独立使用 Tor 的流量混淆插件

Tor 项目中的传输插件 (Pluggable Transports) 一直以来都只用于网桥的防探测,避开网络设备的深度包检测。这些协议中不乏优秀的混淆或伪装算法,例如 obfs 系列以及 meek 等。而很多插件并不提供独立使用的接口,限制了它们的应用场景。

经过研究 Tor 的 Pluggable Transport 协议,我写了一个简单的包装脚本来将其实用化:https://github.com/gumblex/ptproxy

这些传输插件只负责传输 TCP 流量,必须要有实际应用服务器部署,例如转发 SSH、HTTP 代理流量。推荐使用 obfs4,并将 iat-mode 设为 1 或 2(隐藏发包的时间特征,服务端在第一次运行后修改 obfs4_state.json)。注意:有些传输插件并不带有加密,请仔细阅读这些插件的文档。

运行包装脚本只要执行 python3 ptproxy.py [-c|-s] [config.json]-c, -s 覆盖配置文件的角色设置。运行服务端后会打印出客户端所需要指定的 "ptargs" 值(这些值通常是密钥和加密参数)。配置文件是一个 JSON 文件:(实际使用要将带 # 的行去掉)(如果不指定配置文件,使用 Python 脚本开头的设置)

{
    // client|server 客户端或服务器
    "role": "server",
    // 状态文件储存位置
    "state": ".",
    // 转发服务器的什么地址
    // (例如 HTTP 代理服务器地址,不必对外监听)
    // 或监听客户端的什么地址
    "local": "127.0.0.1:1080",
    // 监听服务器的什么地址(对外监听端口)
    // 或连接服务器的地址
    "server": "0.0.0.0:23456",
    // 执行传输插件的命令行(这里是 obfs4)
    "ptexec": "obfs4proxy -logLevel=ERROR -enableLogging=true",
    // 传输插件名称
    "ptname": "obfs4",
    // [客户端] 传输插件参数
    "ptargs": "cert=AAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA;iat-mode=0",
    // [可选][服务器] 传输插件参数
    // 格式 <key>=<value> [;<key>=<value> ...]
    "ptserveropt": "",
    // [可选][客户端] 传输插件的前置代理
    // 格式 <proxy_type>://[<user_name>][:<password>][@]<ip>:<port>
    "ptproxy": ""
}

Bash 版 ptproxy.sh 是之前的版本,因为 socat 没有对 SOCKS5 协议的完整支持,无法与一些传输插件通信。Python 版的重新实现支持 SOCKS4/5 协议,并改善了进程管理和 TCP 服务器。

关于这些传输插件的具体解释和比较可参见 A Child's Garden of Pluggable Transports (Tor Wiki)