设置透明 SSL 代理

bad*_*unk 15 ssl https man-in-the-middle iptables transparent-proxy

我有一个装有 2 个网卡的 linux 机器,用于检查通过端口 80 的流量。一张网卡用于上网,另一张卡连接到网络交换机。关键是为了调试目的,能够检查连接到该交换机的设备上的所有 HTTP 和 HTTPS 流量。

我已经为 iptables 编写了以下规则:

nat

-A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.2.1:1337
-A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 1337

-A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE
Run Code Online (Sandbox Code Playgroud)

在 192.168.2.1:1337,我有一个使用 Charles ( http://www.charlesproxy.com/ ) 进行录制的透明 http 代理。

对于端口 80 一切正常,但是当我为指向端口 1337 的端口 443 (SSL) 添加类似的规则时,我通过 Charles 收到有关无效消息的错误。

我之前与 Charles ( http://www.charlesproxy.com/documentation/proxying/ssl-proxying/ )在同一台计算机上使用过 SSL 代理,但由于某种原因透明地执行它没有成功。我在谷歌上搜索的一些资源说这是不可能的 - 如果有人可以解释原因,我愿意接受它作为答案。

请注意,我可以完全访问所描述的设置,包括连接到子网的所有客户端 - 因此我可以接受 Charles 的自签名证书。解决方案不必特定于 Charles,因为理论上,任何透明代理都可以。

谢谢!

编辑:在玩了一会儿之后,我能够让它为特定的主机工作。当我将 iptables 修改为以下内容时(并在 charles 中打开 1338 进行反向代理):

nat

-A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.2.1:1337
-A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 1337

-A PREROUTING -i eth1 -p tcp -m tcp --dport 443 -j DNAT --to-destination 192.168.2.1:1338
-A PREROUTING -i eth1 -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 1338

-A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE
Run Code Online (Sandbox Code Playgroud)

我能够得到响应,但没有目标主机。在反向代理中,如果我只是指定从 1338 开始的所有内容都转到我想要访问的特定主机,它会正确执行握手,我可以打开 SSL 代理来检查通信。

设置不太理想,因为我不想假设 1338 的所有内容都转到该主机 - 知道为什么要剥离目标主机吗?

再次感谢

Bru*_*uno 12

您看到的问题与阻止在单个 IP 地址/端口(不使用服务器名称指示)上使用多个证书的问题相同。

在纯 HTTP 中,您的透明代理可以通过查看Host标头来判断客户端想要连接到哪个主机。

当 HTTPS MITM 透明代理收到请求时,它无法知道客户端首先请求的是哪个主机名。(我什至不确定它是否可以通过这些规则获取 IP 地址,这可能至少允许它使用反向 DNS 查找进行猜测,即使它在一般情况下不太可能起作用。)

  • 为了获得预期的主机名,MITM 代理必须读取HostHTTP 消息中的标头,这只能在成功握手后发生。
  • 为了成功握手,MITM 代理需要生成与预期主机名匹配的欺骗证书。

因此,MITM 代理在握手之前无法知道要生成哪个证书。

这可以与非透明 MITM 代理一起使用,因为您至少可以通过 HTTPCONNECT方法获得预期的主机名。