一种把指定程序的 TCP 流量重定向到代理的方法

2018-08-03 14:43:53 +08:00
 gleport

graftcp

一个可以把指定程序的 TCP 连接重定向到 SOCKS5 proxy 的工具。

简介

graftcp 可以把任何指定程序(应用程序、脚本、shell 等)的 TCP 连接重定向到 SOCKS5 代理。

对比 tsocksproxychainsproxyChains-nggraftcp 并不使用 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 本身对此毫无感知(透明代理)的目的,大概需要这些条件:

简单的流程如下:

+---------------+             +---------+         +--------+         +------+
|   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   |      |
|  |         |<---------------+         |<--------+        |<--------+      |
|  +---------+  |             |         |         |        |         |      |
+---------------+             +---------+         +--------+         +------+

更多信息: https://github.com/hmgle/graftcp

5313 次点击
所在节点    分享创造
29 条回复
friskfly
2018-08-05 15:22:00 +08:00
我用 Proxifier, 不知道是不是一样的原理
gleport
2018-08-05 19:32:37 +08:00
lyztonny
2018-08-06 00:03:31 +08:00
这和 tsocks 有什么功能上的差异吗?
forgetandnew
2018-08-06 03:34:58 +08:00
牛皮
gleport
2018-08-06 09:57:15 +08:00
@lyztonny tsocks 功能类似,但无法实现重定向静态链接程序的 TCP 流量功能,graftcp 对这点做了改进。
fournoas
2018-08-06 12:07:10 +08:00
跟 windows 上的这类软件类似
uzumaki
2018-08-08 03:09:11 +08:00
好东西
mjikop1231
2018-08-08 16:01:57 +08:00
还没怎么看评论,先丢两个问题。
1.和 proxychains 的比较?
2.支持 golang 的程序么?
gleport
2021-07-07 21:26:12 +08:00
@mjikop1231 和 proxychains 的主要差别是支持 golang 的程序。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/476594

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX