容器的全局 http 代理

容器的全局 http 代理

我的 docker 容器中有一些应用程序发出 http(s) 请求。我该如何配置容器,让所有这些请求都通过外部 http 代理?

Docker 文档建议设置HTTP_PROXY环境变量,但是,据我了解,这是一个建议设置,容器中的应用程序不会强制使用它。

我无法更改主机系统上的任何内容,因此我正在寻找一些巧妙的 docker 或容器操作系统配置。容器操作系统是 ubuntu:18.04。

答案1

如果要强制使用代理,则需要在网络级别拦截流量。这总是有缺点,因为您需要通过受信任的 CA 扮演中间人角色,因此 HTTPS 流量不容易被拦截。

如果 HTTPS 不是问题(因为您决定忽略它,或者因为您决定将自己的 CA 部署到每个容器的证书信任存储区),那么想到几个拦截流量的位置:

  1. Docker 主机系统(又称容器的默认网关)
  2. docker 主机系统的默认网关

无论哪种情况,您都需要利用iptables(或类似的防火墙工具集)来重定向来自您的容器的流量port 80443如果是 HTTPS)以通过代理进行重定向。

使用iptables它可能看起来像

sudo iptables -t nat -A PREROUTING -i eth1 -s 192.168.1.0/24 -p tcp --dport 80 -j REDIRECT --to-port 3129

3129例如,SQUID 可能监听 http 连接的端口在哪里。

更多信息可以在 SQUID 配置示例中找到:https://wiki.squid-cache.org/ConfigExamples/Intercept/LinuxRedirect

答案2

设置环境变量会强制容器内的所有应用程序使用配置的代理。

docker run 示例:

--env HTTP_PROXY="http://127.0.0.1:3001"
--env HTTPS_PROXY="https://127.0.0.1:3001"

相关内容