什么是透明代理

tproxy 即 transparent(透明) proxy。这里的 transparent(透明)的有两个方面的含义:

  1. 代理对于 client 是透明的,client 端无需进行任何配置。即无需修改请求地址,也无需采用代理协议和代理服务器进行协商。与之相对比的是 socks 代理或者 http 代理,需要在 client 端设置代理的地址,在发起请求时也需要通过代理协议告知代理服务器其需要访问的真实地址。

  2. 这种系统级别的代理对于操作系统中的各个应用相当于是透明的,应用们感知不到代理的存在, 不要单独为应用指定代理。

“非透明”代理

“非透明”代理的请求和响应数据路径如下。可以看到客户端需要在 IP 数据包中把目的 IP 地址指定为代理服务器。

普通代理示意图

代理需要得到客户端访问的真实目的地,才能正确地转发请求。因此客户端需要通过代理协议将真实地址告知代理服务器。

透明代理

透明代理的请求和响应数据路径如下。客户端的 IP 数据包的目的 IP 地址是其需要访问的真实目的地址。客户端不需要和代理服务器进行握手,就好像直接访问其真实目的地一样。

透明代理示意图

在透明代理的模式下,由于客户端请求数据包的目的地址不是代理服务器,因此需要通过路由和 iptables 规则将客户端的请求发送给代理服务器处理。当目标服务器响应时,数据包同样会被透明代理截获,并被改写为原始客户端的地址后发送给客户端。整个过程对客户端是透明的,不需要进行任何额外的配置或修改。

首先将代理服务器设置为客户端的缺省网关,以将请求发送到代理服务器。请求路由到代理服务器后,还需要通过 iptables 将请求重定向到代理进程进行处理。可以有两种办法:

  1. 采用 重定向 Redirect 方式处理请求时,会修改请求 IP 数据包的目的地址和端口。代理服务器收到客户端请求后,可以通过调用 getsockopt 的 SO_ORIGINAL_DST 参数拿到原始请求的目的地址。
  2. 采用 TPROXY 来将请求发送到代理进程,这种方式不会修改请求 IP 数据包的目的地址和端口。因此代理服务器可以直接从 socket 中拿到其请求目的地。

采用 TPROXY 模式时,需要路由规则、iptables 和代理进程进行配合。

使用场景

透明代理适用于以下情况:

  • 局域网设备较多,比如说办公室、实验室、大家庭等;
  • 设备(的软件)无法/不方便设置代理,比如说 Chromecast、电视盒子等;
  • 希望设备的所有软件都走代理。

参考文档

tproxy(透明代理)