17个稳定版本 (4个主要版本)
4.1.6 | 2021年10月25日 |
---|---|
4.1.5 | 2021年8月31日 |
4.1.3 | 2021年4月19日 |
3.0.1 | 2021年3月22日 |
0.1.0 | 2021年2月24日 |
#1331 在 网络编程
每月71次下载
25KB
435 行
cproxy
cproxy
可以将程序产生的TCP和UDP流量重定向到代理,无需程序支持代理。
你可以用 cproxy
实现的事情:例如在 V2Ray指南 中列出的所有功能,包括如反向代理用于NAT穿越的高级配置,并且你可以 为不同的应用程序应用不同的代理。
与许多现有的复杂透明代理设置相比,cproxy
的使用方法与 proxychains
一样简单,但与 proxychains
不同,它可以在任何程序(包括静态链接的Go程序)上工作,并重定向DNS请求。
注意:cproxy
使用的代理应是一个透明代理端口(例如V2Ray的 dokodemo-door
入站和shadowsocks ss-redir
)。好消息是,即使你只有SOCKS5或HTTP代理,也有工具可以帮你将其转换为透明代理(例如,transocks , ipt2socks 和 ip2socks-go)。
安装
你可以通过从 发布页面 下载二进制文件或使用 cargo
进行安装
cargo install cproxy
chown root:root $(which cproxy) && chmod +s $(which cproxy)
用法
简单用法:就像 proxychains
你可以使用 cproxy
启动新的程序
cproxy --port <destination-local-port> -- <your-program> --arg1 --arg2 ...
所有TCP连接请求都将被代理。如果你的本地透明代理支持DNS地址覆盖,你还可以使用 --redirect-dns
重定向DNS流量
cproxy --port <destination-local-port> --redirect-dns -- <your-program> --arg1 --arg2 ...
有关示例配置,请参阅 wiki。
简单用法:使用iptables tproxy
如果您的系统支持 tproxy
,您可以使用 tproxy
并使用 --mode tproxy
cproxy --port <destination-local-port> --mode tproxy -- <your-program> --arg1 --arg2 ...
# or for existing process
cproxy --port <destination-local-port> --mode tproxy --pid <existing-process-pid>
使用 --mode tproxy
,有一些不同之处
- 所有 UDP 流量都会被代理,而不仅仅是 DNS UDP 流量到端口 53。
- 您的 V2Ray 或 shadowsocks 服务应该在入站端口上启用
tproxy
。对于 V2Ray,您需要"tproxy": "tproxy"
,如V2Ray 文档中所示。对于 shadowsocks,您需要-u
,如shadowsocks 手册页所示。
示例设置可以在这里找到这里。
注意,当您使用 tproxy
模式时,您可以使用 cproxy --mode tproxy --override-dns <your-dns-server-addr> ...
覆盖 DNS 服务器地址。当您想为特定应用程序使用不同的 DNS 服务器时,这非常有用。
高级用法:代理现有进程
使用 cproxy
,您甚至可以代理现有的进程。当您想代理现有的系统服务,如 docker
时,这非常方便。要这样做,只需运行
cproxy --port <destination-local-port> --pid <existing-process-pid>
只要这个 cproxy
命令在运行,目标进程就会被代理。您可以按 Ctrl-C 停止代理。
高级用法:使用 iptables LOG 目标调试程序的网络活动
使用 cproxy
,您可以轻松地使用 netfilter 调试程序的网络流量。只需用以下方式运行程序
cproxy --mode trace <your-program>
您将在 dmesg
中看到日志。请注意,这需要足够的内核和 iptables。
它是如何工作的?
cproxy
为代理程序创建一个唯一的 cgroup
,并使用数据包规则重定向其流量。
限制
cproxy
需要root权限来修改cgroup
。- 目前仅在 Linux 上测试过。
类似的项目
有一些非常出色的现有工作
- graftcp:在大多数程序上工作,但不能代理 UDP(如 DNS)请求。由于它使用
ptrace
,graftcp
还会对底层程序产生性能影响。 - proxychains:易于使用,但不适用于静态链接程序(如 Go 程序)。
- proxychains-ng:类似于 proxychains。
- cgproxy:
cgproxy
也使用 cgroup 进行透明代理,其思想与cproxy
类似。在 UX 和系统要求方面有一些差异cgproxy
需要 systemcgroup
v2 支持,而cproxy
与 v1 和 v2 都兼容。cgproxy
需要 background daemon processcgproxyd
运行,而cproxy
则不需要。cgproxy
需要tproxy
,而cproxy
中是可选的。cgproxy
可以用于全局代理,而cproxy
并不支持全局代理。
依赖项
约 10–19MB
约 242K SLoC