Turn any pluggable transport for Tor into an obfuscating TCP tunnel.
This script is compatible with PT protocol version 1 without Extended ORPort and is independent from Tor.
Python version
python3 ptproxy.py [-c|-s] [config.json]
- No external programs needed.
- PySocks is included for SOCKS4/5 communication with PTs.
-c|-s
is for overriding the role
in the config file.
The JSON config file is explained below or in the head of
ptproxy.py
. It MUST NOT contain the comment lines. The file must be in UTF-8 encoding.{
// Role: client|server
"role": "server",
// Where to store PT state files
"state": ".",
// For server, which address to forward (must be an IP)
// For client, which address to listen
"local": "127.0.0.1:1080",
// For server, which address to listen (must be an IP)
// For client, the server address to connect
"server": "0.0.0.0:23456",
// The PT command line
"ptexec": "obfs4proxy -logLevel=ERROR -enableLogging=true",
// The PT name, must be only one
"ptname": "obfs4",
// [Client] PT arguments
"ptargs": "cert=AAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA;iat-mode=0",
// [Optional][Server] PT options
// <key>=<value> [;<key>=<value> ...]
"ptserveropt": "",
// [Optional][Client] Which outgoing proxy must PT use
// <proxy_type>://[<user_name>][:<password>][@]<ip>:<port>
"ptproxy": ""
}
Note:When the server starts successfully, it will print out
ptargs
. Copy and paste this value to your client config file.
ptproxy.sh
.
Original Bash version:
Deprecated:
socat
doesn't have full SOCKS5 support at present.Usage
./ptproxy.sh {-c|-s} [server] [bind_ip] [bind_port] [pt_args]
-c
for client-s
for server
Before executing the script, you need to first edit the variables listed in the script. Some can be overriden on the command line.
Dependencies
- bash, awk
socat
(client)- the Pluggable Transport you need
Note
This only operates as a TCP proxy. If you need a HTTP/SOCKS/etc. proxy, first install related softwares on the server.
The security or obfuscation provided fully depends on the Pluggable Transport you choose. This script is only a wrapper, and is provided AS IS with ABSOLUTELY NO WARRANTY.
PTProxy
将任何用于 Tor 的传输插件做成 TCP 混淆隧道。
这个脚本兼容 Tor 传输插件协议版本 1,不支持 Extended ORPort。该脚本独立于 Tor。
Python 版
python3 ptproxy.py [-c|-s] [config.json]
- 不需要外部程序。
- 已包含 PySocks 与传输插件通信。
使用
-c|-s
参数可覆盖配置文件中 role
的值。
以下是对 JSON 配置文件的解释(在
ptproxy.py
的头部也有)。配置文件中不能包含注释行,必须使用 UTF-8 编码。{
// 指定工作模式: client|server 客户端或服务器
"role": "server",
// 传输插件状态文件储存位置
"state": ".",
// 对于服务器,指定要转发的地址
// 对于客户端,指定本地监听地址
"local": "127.0.0.1:1080",
// 对于服务器,指定服务端监听地址
// 对于客户端,指定要连接的服务端地址
"server": "0.0.0.0:23456",
// 传输插件的命令行
"ptexec": "obfs4proxy -logLevel=ERROR -enableLogging=true",
// 传输插件名称,只能有一个
"ptname": "obfs4",
// [客户端] 传输插件的参数
"ptargs": "cert=AAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA;iat-mode=0",
// [可选][服务端] 传输插件的选项
// <键>=<值> [;<键>=<值> ...]
"ptserveropt": "",
// [可选][客户端] 传输插件前置代理
// <代理类型>://[<用户名>][:<密码>][@]<IP>:<端口>
"ptproxy": ""
}
注意:服务端成功启动后,会输出
ptargs
参数。请复制粘贴该值到客户端配置文件。
ptproxy.sh
.
原始 Bash 版:
已废弃:
socat
目前对 SOCKS5 支持不完整。用法
./ptproxy.sh {-c|-s} [server] [bind_ip] [bind_port] [pt_args]
-c
客户端-s
服务端
在执行该脚本之前,你需要编辑脚本中列出的变量。一些变量可以用命令行参数覆盖。
依赖
- bash, awk
socat
(客户端)- 你需要的传输插件
注意
这个项目仅能作为 TCP 连接代理。如果你需要一个 HTTP/SOCKS 等代理,请先在服务器上安装相应的软件。
该脚本提供的安全性或混淆程度完全依赖于你选用的传输插件,它只作为一层包装。
from https://github.com/gumblex/ptproxy
相关帖子:http://briteming.blogspot.com/2015/08/obfs4proxy-shadowsocks.html
-------------------------------------------------------------------------
-------------------------------------------------------------------------
独立使用 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)。
from https://gumble.pw/ptproxy.html