透明代理技术总结–Linux

1. iptables REDIRECT/TPROXY

在linux网络堆栈上实现透明代理,功能上最强大,最完美。具体可以有以下三种方式:

  • global, 即全局透明代理
  • network namespace,在网络命名空间中透明代理,主机网络相当于中间路由器,具体实现参考 ~/Scripts/ns-proxy.sh
  • net_cls, only in cgroup v1,对特定cgroup进行透明代理, 参考 example
  • iptables cgroup2 path match

监听REDIRECT/TPROXY端口的技术实现:

  • redsocks link
  • v2ray dokodemo-door link
  • gost -L red://:12345 link

未来会出现基于bpf技术,以最小的footprint,实现透明代理

linux内核的bpf技术正在快速发展

2. proxychains-ng

原理是利用LD_PRELOAD,挂钩(hook)网络相关的libc函数,因此只对动态链接的程序有用,例如不支持go程序(静态编译),不支持脚本等。只支持tcp。

配置和使用相当的简单。

3. cgproxy

基于cgroup2和TPROXY的透明代理,支持cgroup级别、进程级别的控制。

支持tcp和udp。

可以代理任何程序,可全局代理、网关代理。

4. graftcp

可以通过ptrace跟踪或修改任何给定程序的网络连接,因此它可用于任何程序。

只支持tcp,暂不支持ipv6,issue


some tests

see Dokodemo-door and v2ray tproxy config,

note v2ray redirect only work in ipv4

experiments result following:

  • v2ray tproxy + no root
    • tcp REDIRECT ✓
    • tcp TPROXY ✗
    • udp TPROXY ✗
  • v2ray redirect + no root
    • tcp REDIRECT ✓
    • tcp TPROXY ✗
    • udp TPROXY ✗
  • v2ray tproxy + root ✓
  • v2ray redirect + root ✓

结论:

  1. REDIRECT总是可用, 而TPROXY需要root才能使用
  2. 在not root下只能代理透明代理tcp

一些代理软件

  • gost
  • clash
  • v2ray
  • trojan

Updated: