通过mitmproxy运行docker集装箱

我试图通过在另一个docker集装箱运行的mitmproxy路由docker集装箱的所有stream量。 为了使mitmproxy正常工作,我必须更改原始docker集装箱的网关IP。 这里是我想要做的一个例子,但我想限制这是完全在docker集装箱内: http : //blog.philippheckel.com/2013/07/01/how-to-use-mitmproxy-to-读取和修改 – https-traffic-of-phone / 。

任何想法,我怎么能做到这一点? 此外,我想避免在特权模式下运行两个docker集装箱中的任何一个。

授予容器的默认权限集不允许容器修改networking设置。 通过在特权模式下运行,您将所有function授予容器 – 但也可以根据需要授予个别function。 在这种情况下,你需要的那个叫做CAP_NET_ADMIN(完整列表在这里: http ://man7.org/linux/man-pages/man7/capabilities.7.html),所以你可以添加--cap-add NET_ADMIN到你的docker运行命令。

请确保在启动两个容器时使用该选项,因为它们都需要进行一些networking调整以启用透明的数据包截取function。

在“代理”容器中,根据mitmproxy透明模式指令configurationiptables预路由NAT规则,然后启动mitmproxy(使用-T标志启用透明模式)。 我使用一个小的启动脚本作为代理图像的入口点,因为networking设置的改变仅在容器运行时发生,不能在Dockerfile中指定或以其他方式持久化。

在“客户端”容器中,只需使用ip route命令将默认网关更改为泊坞桥上的代理容器的IP地址。 如果这是一个设置,您将定期重复,请考虑在客户端映像上使用入口点脚本,该脚本将在容器启动时自动为您设置。 容器链接使得更容易:您可以启动代理容器,并在启动客户端容器时将其链接起来。 然后,客户端入口点脚本通过环境variables访问代理容器的IP。

顺便说一下,如果你能以非透明模式使用mitmproxy(明确地configuration客户端使用HTTP代理),我会强烈推荐它。 这是一个很难成立的头痛。

祝你好运,玩得开心!