为 Web 服务器 (Apache2) 设置 HTTP/HTTPS 中间人代理

为 Web 服务器 (Apache2) 设置 HTTP/HTTPS 中间人代理

为了记录特定应用程序的所有 http/https 请求,我们使用中间人代理(设置为 http 或 SOCKS5 代理)。在我们的本地 Windows 和 Mac 机器上,我们通常会“代理”应用程序或临时设置系统范围的代理。这对于我们能想到的任何应用程序都很有效。在我们的远程 Linux 机器上,真正的系统范围的代理会导致连接问题(并且在非桌面环境中实现相同的结果也有些困难)。所以我们决定只在那里使用代理单独的应用程序。

为此,我们目前使用 mitmproxy + tsocks/proxychains。这对于普通应用程序来说再次非常有效。然而,我们目前遇到的问题是,我们似乎无法让它与我们的 apache2/php 服务一起工作。过去几天,我们一直在寻找解决方案,但很难找到不将 Web 服务器本身转变为特定 URL 的反向代理的选项。我们想要的是监控 Web 服务器执行的任何远程 http/https 请求(PHP 应用程序的出站请求)。我们考虑在 Docker 中运行 Web 服务器并为容器设置代理,但这意味着我们必须在容器中重新设置所有内容,这感觉像是一个糟糕的解决方案,它本身就带来了麻烦。

实际问题: 我们如何通过 MITM 代理路由 Web 服务器的所有 http/https 流量,以便我们可以看到对远程 http/https 主机的所有请求?

欢迎提供替代/更好的解决方案来实现相同的目标。

答案1

感谢 Bob 为我指明了正确的方向。有时候,只要你知道要找什么,只需通过 Google 搜索就能​​找到答案。

@鲍勃评论道:

对于不支持代理设置的应用程序,运行代理的一种相当传统的方法是使用防火墙规则将所有以 Web 端口为目的地的传出流量重写到透明代理。对于普通的 http 来说相当简单,但对于 https 来说则稍微复杂一些。

我们不需要在操作系统的代理设置中设置代理,而是可以配置 iptables 将端口 80 和 443 上的所有内容路由到我们的代理(步骤取自docs.mitmproxy.org

启用 IP 转发并禁用 ICMP 重定向:

sudo sysctl -w net.ipv4.ip_forward=1
sudo sysctl -w net.ipv6.conf.all.forwarding=1
sudo sysctl -w net.ipv4.conf.all.send_redirects=0

跳过手册的第 3 步和第 4 步,因为我们想要重定向来自机器本身的流量。

为此,创建一个用户来运行 mitmproxy 以将流量路由到:

sudo useradd --create-home mitmproxyuser
sudo -u mitmproxyuser -H bash -c 'cd ~ && pip install --user mitmproxy'

最后是 iptables 规则(代理在端口 8080 上运行):

sudo iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner mitmproxyuser --dport 80 -j REDIRECT --to-port 8080
sudo iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner mitmproxyuser --dport 443 -j REDIRECT --to-port 8080
sudo ip6tables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner mitmproxyuser --dport 80 -j REDIRECT --to-port 8080
sudo ip6tables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner mitmproxyuser --dport 443 -j REDIRECT --to-port 8080

最后,以新用户身份运行 mitmproxy:

sudo -u mitmproxyuser -H bash -c 'mitmproxy --mode transparent --showhost --set block_global=false'

mitmproxy 提供的手册就到此为止了。至此,我们已经完成了设置,但我们需要安装一个新证书(任何来自mitm.it不管用)。

首次运行后,将在/主页/mitmproxy用户/.mitmproxy/mitmproxy-ca-cert.pem。我们需要将其转换为 crt 并安装它:

sudo openssl x509 -in /home/mitmproxyuser/.mitmproxy/mitmproxy-ca-cert.pem -inform PEM -out /home/mitmproxyuser/.mitmproxy/mitmproxy-ca-cert.crt
sudo cp /home/mitmproxyuser/.mitmproxy/mitmproxy-ca-cert.crt /usr/share/ca-certificates/extra/mitmproxy-ca-cert.crt
sudo dpkg-reconfigure ca-certificates

此时,您几乎已设置完毕,但 Apache2/PHP 仍然不信任我们的代理证书,因此外部请求无法通过。我尝试了一堆 apache.conf SSL 配置,但都不起作用。结果,我不得不取消注释以下行/etc/php/7.4/apache2/php.ini并将其链接到我们创建的 crt 文件:

openssl.cafile=/home/mitmproxyuser/.mitmproxy/mitmproxy-ca-cert.crt

别忘了重启 apache2/php7.4-fpm,就这么简单!我们的 PHP 应用程序现在通过代理路由。您可能还需要在浏览器中信任生成的 crt 文件,以消除常见的警告。

相关内容