我正在尝试通过mitmproxy
在另一个 docker 容器中运行来路由 docker 容器的所有流量。为了mitmproxy
工作,我必须更改原始 docker 容器的网关 IP。
这是我想做的一个例子,但我想限制它完全在docker
容器内。
关于我如何能够做到这一点的任何想法?另外,我想避免在特权模式下运行两个 docker 容器中的任何一个。
我正在尝试通过mitmproxy
在另一个 docker 容器中运行来路由 docker 容器的所有流量。为了mitmproxy
工作,我必须更改原始 docker 容器的网关 IP。
这是我想做的一个例子,但我想限制它完全在docker
容器内。
关于我如何能够做到这一点的任何想法?另外,我想避免在特权模式下运行两个 docker 容器中的任何一个。
授予容器的默认功能集不允许容器修改网络设置。通过在特权模式下运行,您可以将所有功能授予容器——但也可以根据需要授予单个功能。在这种情况下,您需要的是 CAP_NET_ADMIN(此处为完整列表:http://man7.org/linux/man-pages/man7/capabilities.7.html ),因此您可以添加--cap-add NET_ADMIN
到您的 docker run 命令中。
确保在启动两个容器时都使用该选项,因为它们都需要进行一些网络调整以启用透明数据包拦截。
在“proxy”容器中,根据mitmproxy
透明模式说明配置iptables pre-routing NAT 规则,然后启动mitmproxy
(带有-T
开启透明模式的标志)。我使用一个小的启动脚本作为代理映像的入口点,因为网络设置更改仅发生在容器运行时,并且不能在 Dockerfile 中指定或以其他方式保留。
在“客户端”容器中,只需使用ip route
命令将默认网关更改为 docker 桥上代理容器的 IP 地址。如果这是您将定期重复的设置,请考虑在客户端映像上使用入口点脚本,该脚本将在容器启动时自动为您设置。容器链接使这更容易:您可以启动代理容器,并在启动客户端容器时链接它。然后客户端入口点脚本可以通过环境变量访问代理容器的 IP。
顺便说一句,如果您可以在非透明模式下使用 mitmproxy(明确配置客户端以使用 HTTP 代理),我强烈推荐它。设置起来不那么令人头疼。
祝你好运,玩得开心!