我有一个运行Docker的CentOS服务器,我试图用iptables来保护它。 而我无法弄清楚如何让容器访问互联网,而不需要从外部访问端口。
我已经停止了Docker使用'–iptables = false'命令搞乱我的iptables,现在正在努力手动configurationiptables。
我想设置防火墙,以便:
我有前两个,但无论我尝试启用第三个无效的第一!
我有两个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
这似乎允许
但是,进入这些港口是不对外开放的。
我认为我的问题是,我不明白,我已经添加到INPUT的相关/build立指令没有翻译成FORWARD。