一个可以把指定程序的 TCP 连接重定向到 SOCKS5 proxy 的工具。
graftcp
可以把任何指定程序(应用程序、脚本、shell 等)的 TCP 连接重定向到 SOCKS5 代理。
对比 tsocks、proxychains 或 proxyChains-ng,graftcp
并不使用 LD_PRELOAD 技巧来劫持共享库的 connect()、getaddrinfo() 等系列函数达到重定向目的,这种方法只对使用动态链接编译的程序有效,对于静态链接编译出来的程序,例如默认选项编译的 Go 程序,proxychains-ng 就无效了。graftcp
使用 ptrace(2)
系统调用跟踪或修改任意指定程序的 connect 信息,对任何程序都有效。工作原理后面将会解释。
假设你正在运行默认地址 "localhost:1080" 的 SOCKS5 代理,首先启动 graftcp-local
:
./graftcp-local/graftcp-local
通过 graftcp
安装来自 golang.org 的 Go 包:
./graftcp go get -v golang.org/x/net/proxy
通过 graftcp
打开 Chromium
/ Chrome
/ Firefox
浏览器,网页的所有请求都会重定向到 SOCKS5 代理:
./graftcp chromium-browser
通过 graftcp
启动 Bash
/ Zsh
/ Fish
,在这个新开的 shell 里面执行的任何新命令产生的 TCP 连接都会重定向到 SOCKS5 代理:
% ./graftcp bash
$ wget https://www.google.com
要达到重定向一个 app 发起的的 TCP 连接到其他目标地址并且该 app 本身对此毫无感知(透明代理)的目的,大概需要这些条件:
fork(2)
一个新进程,通过 execv(2)
启动该 app,并使用 ptrace(2)
进行跟踪,在 app 执行每一次 TCP 连接前,捕获并拦截这次 connect(2)
系统调用,获取目标地址的参数,并通过管道传给 graftcp-local
。connect(2)
系统调用的目标地址参数为 graftcp-local
的地址,然后恢复执行被中断的系统调用。返回成功后,这个程序以为自己连的是原始的地址,但其实连的是 graftcp-local
的地址。这个就叫“移花接木”。graftcp-local
根据连接信息和目标地址信息,与 SOCKS5 proxy 建立连接,把 app 的请求的数据重定向到 SOCKS5 proxy。简单的流程如下:
+---------------+ +---------+ +--------+ +------+
| graftcp | dest host | | | | | |
| (tracer) +---PIPE----->| | | | | |
| ^ | info | | | | | |
| | ptrace | | | | | | |
| v | | | | | | |
| +---------+ | | | | | | |
| | | | connect | | connect | | connect | |
| | +--------------->| graftcp +-------->| socks5 +-------->| dest |
| | | | | -local | | proxy | | host |
| | app | | req | | req | | req | |
| |(tracee) +--------------->| +-------->| +-------->| |
| | | | | | | | | |
| | | | resp | | resp | | resp | |
| | |<---------------+ |<--------+ |<--------+ |
| +---------+ | | | | | | |
+---------------+ +---------+ +--------+ +------+
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.