关于梯子的那些基本知识
姿势很多,我们今天主要聊聊与之相关的技术。
透明代理
大多数的软件,打开之后,就会自动的将所有的请求都通过代理转发,这个一般被称之为 透明代理
因为使用者并不需要给应用挨个的配置代理地址。
传统代理如下图
一般来说会有一个访问代理服务器,经过代理服务的 NAT
之后的请求,不过麻烦的更多是需要人工配置。
但是透明代理
在透明代理的模式下,由于客户端请求数据包的目的地址不是代理服务器,因此需要通过路由和 iptables 规则将客户端的请求发送给代理服务器处理。
首先将代理服务器设置为客户端的缺省网关,以将请求发送到代理服务器。请求路由到代理服务器后,还需要通过 iptables 将请求重定向到代理进程进行处理。可以有两种办法:
1.采用 DNAT 将请求重定向到代理进程,这种方式会修改请求 IP 数据包的目的地址和端口。代理服务器收到客户端请求后,可以通过调用 getsockopt 的 SO_ORIGINAL_DST 参数拿到原始请求的目的地址。
2.采用 TPROXY 来将请求发送到代理进程,这种方式不会修改请求 IP 数据包的目的地址和端口。因此代理服务器可以直接从 socket 中拿到其请求目的地。
采用 TPROXY 模式时,需要路由规则、iptables 和代理进程进行配合。
FROM tproxy(透明代理)
不过具体的实现上不仅仅只有上面说的一些方式,本质上我们需要让系统自动将流量打到代理,让代理自行处理。所以下面介绍一些基本的知识
Netfilter
Linux
使用 Netfilter
来管理网络,Netfilter
模型如下:
不过我个人更喜欢这个
iptables
使用 table
来组织规则,根据用来做什么类型的判断标准,将规则分为不同 table
。例如,如果规则是处理 网络地址转换
的,那会放到 nat table
;如果是判断是否允许包继续向前,那可能会放到 filter table
。
但是从时序上理解,主要还是从链上执行
PREROUTING
: 由 NF_IP_PRE_ROUTING hook 触发INPUT
: 由 NF_IP_LOCAL_IN hook 触发FORWARD
: 由 NF_IP_FORWARD hook 触发OUTPUT
: 由 NF_IP_LOCAL_OUT hook 触发POSTROUTING
: 由 NF_IP_POST_ROUTING hook 触发
这里有个完整的图
配置方式
Iptables
的配置方式如下
1 | iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型] |
表名、链名
:指定iptables命令所操作的表和链,未指定表名时将默认使用filter表;管理选项
:表示iptables规则的操作方式,比如:插入、增加、删除、查看等;匹配条件
:指定要处理的数据包的特征,不符合指定条件的数据包不处理;控制类型
:指数据包的处理方式,比如:允许accept、拒绝reject、丢弃drop、日志LOG等;
1 | iptables 命令的常用管理选项 |
实践一下
环境准备
我们准备一个 Linux
环境,配置好代理服务,我们使用代理就可以访问
1 | $ http_proxy="socks://127.0.0.1:1080" https_proxy="socks://127.0.0.1:1080" curl -v www.google.com |
在开始透明流量之前,我们先要理解,此时的模式是 Proxy
的正向代理,因此单纯的将流量劫持是不生效的,需要先开始代理的透明代理模式
1 | sslocal -b "127.0.0.1:60080" --protocol redir -s "[::1]:8388" -m "aes-256-gcm" -k "hello-kitty" --tcp-redir "redirect" --udp-redir "tproxy" |
这里我们就看到了 60080 的监听了
1 | $ netstat -lt |
劫持所有流量
1 | iptables -t nat -N Proxy # 新建一个名为 Proxy 的链 |