我正在设置使用桥连接的两个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
我通过在端口8500的容器B上以透明模式运行mitmproxy来对容器A尝试类似的规则。我认为这是正确的方法:
将端口80/443上的所有主机流量路由到容器A上的端口8080 将端口8080上的所有容器A的流量(所有流量都应在此端口上)路由到容器B上的端口8500 容器B应该向互联网提出实际的请求,然后将响应发送回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规则有关,但是我无法弄清楚如何使其工作。
感谢帮助!