1

我正在设置两个使用网桥连接的 docker 容器(比如 A (172.17.0.2) 和 B (172.17.0.3))。我希望将所有请求从主机容器路由到容器 A,然后是容器 B,然后再路由到 Internet。响应应遵循相反的路径。

到目前为止,我已经能够使用主机和一个容器(比如 A)来做到这一点。我已经在容器 A 上设置了以透明模式运行的 mitmproxy。我开始在端口 8080 上运行 mitmproxy(使用主机绑定,因此 A 上的端口 8080 绑定到主机上的端口 8081)。我能够通过 A 路由主机上的所有连接,然后再返回主机。我将端口 80 和 443 上的所有连接转发到 docker 容器上的端口 8080。

这些规则使用一个 docker 容器以非 root 用户身份完成路由。

iptables -I OUTPUT -t nat -p tcp --dport 80 -m owner ! --uid-owner 0 -j DNAT --to 127.0.0.1:8080
iptables -I OUTPUT -t nat -p tcp --dport 443 -m owner ! --uid-owner 0 -j DNAT --to 127.0.0.1:8080

我在容器 A 上尝试了类似的规则,方法是在端口 8500 上的容器 B 上以透明模式运行 mitmproxy。我认为这是正确的做法:

将端口 80/443 上的所有主机流量路由到容器 A 上的端口 8080 将端口 8080 上的所有容器 A 流量(此处所有流量都应该在此端口上)路由到容器 B 上的端口 8500 容器 B 应该向 Internet 发出实际请求,并且将响应发送回 A,A 将其发送回主机。

当我在容器 A 上设置如下规则时,我看到容器 B 上发出的 GET 请求无限循环

iptables -I OUTPUT -t nat -p tcp --dport 8080 -m owner ! --uid-owner 0 -j DNAT --to 172.17.0.3:8500

我认为这与 docker 在主机上设置的现有 iptables 规则有关,但我无法弄清楚如何让它工作。

感谢帮助!

4

0 回答 0