使用iptables在Docker容器中实现的代理拒绝连接问题

154次阅读
没有评论

问题描述

在Docker容器中使用iptables实现代理时遇到了问题。他想要通过仅使用iptables在一个容器中实现代理,使得其他容器的所有流量都经过这个代理容器访问互联网。此外,他希望这个代理容器能够阻止访问yahoo.com域名的流量,允许其他流量通过。用户在一个Windows主机上的Oracle VM Box中运行了一个Ubuntu虚拟机,虚拟机中安装了Docker并有4个使用Ubuntu镜像的容器。

用户的要求是,来自avant3、avant4或avant2的任何流量都应该通过avant1作为代理来访问互联网。avant1应该仅通过iptables规则来实现TCP代理。

用户在avant1容器中以交互模式执行了一些命令,如下所示:

iptables --table nat --append POSTROUTING --out-interface eth0 -j MASQUERADE
iptables --append FORWARD --in-interface eth1 -j ACCEPT

然后,在avant3容器中执行了curl命令,指定avant1作为代理,但遇到了连接问题。

解决方案

注意:以下操作中可能涉及到版本差异,使用之前请确保备份数据。

问题分析

用户尝试在avant1容器中使用iptables实现代理,但在avant3容器中使用curl时遇到了连接问题。他希望通过avant1作为代理来实现特定的流量控制和代理访问。

解决方案1:使用自定义网关和iptables规则

一种方法是将avant1作为所有本地网络和测试网络桥接网络中容器的网关,并使用iptables规则进行流量控制。以下是实现步骤:

  1. 在创建本地网络和测试网络桥接网络时,指定自定义网关,例如172.18.0.2和172.19.0.3。
  2. 在avant1容器中添加iptables规则,以阻止访问yahoo.com域名的流量。

以下是具体步骤:

步骤1:创建桥接网络

创建本地网络和测试网络的桥接网络,同时指定自定义网关:

docker network create --driver=bridge --subnet=172.18.0.0/16 --gateway=172.18.0.2 localnet
docker network create --driver=bridge --subnet=172.19.0.0/16 --gateway=172.19.0.3 testnet

步骤2:配置iptables规则

进入avant1容器,在其中添加iptables规则以阻止访问yahoo.com域名的流量:

docker exec -it avant1 /bin/bash
iptables --append FORWARD -d yahoo.com -j DROP

步骤3:配置容器路由

进入需要访问互联网的容器(如avant3),使用ip route命令替换默认网关:

docker exec -it avant3 /bin/bash
ip route replace default via 172.19.0.3 dev eth0

步骤4:测试流量

在avant3容器中,执行curl命令来测试流量是否受到规则的影响:

curl yahoo.com -I

解决方案2:代理设置调整

如果你仍然遇到连接问题,你可以检查代理设置是否正确,特别是avant3容器中的curl命令是否正确指定了代理。确保代理地址和端口正确。

注意事项

  • 请确保在执行iptables规则或更改网络设置之前备份数据,以防止意外问题。
  • 根据你的环境和需求,可能需要进行适当的调整和修改。

这里提供的是解决问题的思路和方法,具体操作可能会因为环境、版本和网络设置的不同而有所差异。如果问题仍然存在,建议进一步检查配置和日志,以便找到准确的解决方案。

参考链接:Transparent Proxying and Filtering HOWTO

以上是针对你提供的问题描述和回复的解决方案。如果你有任何进一步的问题或需要更多帮助,请随时提问。

正文完