configurationiptables让Docker容器访问

我有一个运行Docker的CentOS服务器,我试图用iptables来保护它。 而我无法弄清楚如何让容器访问互联网,而不需要从外部访问端口。

我已经停止了Docker使用'–iptables = false'命令搞乱我的iptables,现在正在努力手动configurationiptables。

我想设置防火墙,以便:

  • input被删除,除非我特别打开它们
  • 容器可以通过本地主机连接相互通信
  • 容器可以连接到互联网下载代码等

我有前两个,但无论我尝试启用第三个无效的第一!

我有两个testing容器。 一个httpd容器转发其web输出端口3333 – 另一个运行Debian的容器。

IPTables被configuration为

iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT iptables -A INPUT -i lo -j ACCEPT 

所以从外面我不能访问我的服务器:3333。 但是我可以从主机运行:curl localhost:3333并有权限访问。

然后我补充说:

 iptables -A INPUT -i docker0 -j ACCEPT 

现在我可以运行在我的debiantesting容器curl172.17.0.1:3333,并且工作正常。

但是,如果我在testing容器中,并尝试:curl httpbin.org/ip我没有得到任何回应。

我正在阅读https://fralef.me/docker-and-iptables.html并试着build议:

 iptables-A FORWARD -i docker0 -o eth0 -j ACCEPT iptables-A FORWARD -i eth0 -o docker0 -j ACCEPT 

有了这些,我现在可以从testing容器中剔除,但这也向世界开放了3333! 如何configurationiptables允许容器访问,但阻止访问?

默认的防火墙行为将很好地为您服务。 要限制传出访问,请在目标域上使用带有ACL的代理。 你甚至可以限制基于容器的访问; 上周我做了一些function来使用Squid的ident ACLtypes和一个返回容器名称的自定义ident服务器。

详情请参阅https://distracted-it.blogspot.co.nz/2017/11/provisioning-limited-access-via-squid.html

您还需要防止您的容器服务器直接进行连接,而无需通过代理。

我find的解决scheme,似乎提供了我想要的是:

 iptables -A INPUT -i docker0 -j ACCEPT iptables -A FORWARD -i docker0 -o eth0 -j ACCEPT iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 

这似乎允许

  • docker集装箱之间的通信
  • 从容器到互联网的通信(通过我的服务器上的eth0)
  • 沟通回应(相关/build立)

但是,进入这些港口是不对外开放的。

我认为我的问题是,我不明白,我已经添加到INPUT的相关/build立指令没有翻译成FORWARD。