#proxy #reverse-proxy #transparent #redirect #traffic #cgroup #tcp-udp

app cproxy

基于cgroup net_cls的透明代理

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网络编程

Download history 63/week @ 2024-03-30 20/week @ 2024-04-06

每月71次下载

AGPL-3.0-or-later

25KB
435

cproxy

CI

cproxy 可以将程序产生的TCP和UDP流量重定向到代理,无需程序支持代理。

你可以用 cproxy 实现的事情:例如在 V2Ray指南 中列出的所有功能,包括如反向代理用于NAT穿越的高级配置,并且你可以 为不同的应用程序应用不同的代理

与许多现有的复杂透明代理设置相比,cproxy 的使用方法与 proxychains 一样简单,但与 proxychains 不同,它可以在任何程序(包括静态链接的Go程序)上工作,并重定向DNS请求。

注意:cproxy 使用的代理应是一个透明代理端口(例如V2Ray的 dokodemo-door 入站和shadowsocks ss-redir)。好消息是,即使你只有SOCKS5或HTTP代理,也有工具可以帮你将其转换为透明代理(例如,transocksipt2socksip2socks-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)请求。由于它使用 ptracegraftcp 还会对底层程序产生性能影响。
  • proxychains:易于使用,但不适用于静态链接程序(如 Go 程序)。
  • proxychains-ng:类似于 proxychains。
  • cgproxycgproxy 也使用 cgroup 进行透明代理,其思想与 cproxy 类似。在 UX 和系统要求方面有一些差异
    • cgproxy 需要 system cgroup v2 支持,而 cproxy 与 v1 和 v2 都兼容。
    • cgproxy 需要 background daemon process cgproxyd 运行,而 cproxy 则不需要。
    • cgproxy 需要 tproxy,而 cproxy 中是可选的。
    • cgproxy 可以用于全局代理,而 cproxy 并不支持全局代理。

依赖项

约 10–19MB
约 242K SLoC