docker手册( http://docs.docker.com/installation/ubuntulinux/#docker-and-ufw )指出,将UFW DEFAULT_FORWARD_POLICY设置为“ACCEPT”是必要的,因此docker集装箱可以互相访问。
在具有可公开访问的networking接口的服务器上这样做的安全含义是什么?
应该做些什么来保护这样的docker主机?
他们似乎已经解决了这个问题,至less在最新的1.4.1版本中。 我的FORWARD策略是丢弃数据包和容器间的通信,没有任何问题。
这些是docker创build的FORWARD链中的标准规则:
$ iptables -vnL FORWARD Chain FORWARD (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 6902 96M ACCEPT all -- * docker0 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED 6151 482K ACCEPT all -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0 3 180 ACCEPT all -- docker0 docker0 0.0.0.0/0 0.0.0.0/0
从下往上:
这里没有问题。 (除非你想要传出filter)
您可以愉快地将FORWARD + INPUT策略设置为DROP / REJECT。
现在,您可能想要在互联网上提供服务。 例如一个简单的web服务器:
$ docker run -d -p 80:80 dockerfile/nginx
好,现在去你的networking。 你会看到默认的nginx页面。 为什么? Docker为你添加了一些特殊的规则。
$ iptables -vn -t nat -L # NAT table, truncated for clarity Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 189 11900 DOCKER all -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL Chain DOCKER (2 references) pkts bytes target prot opt in out source destination 0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:172.17.0.15:80 $ iptables -vnL FORWARD Chain FORWARD (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.15 tcp dpt:80 6903 96M ACCEPT all -- * docker0 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED 6159 483K ACCEPT all -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0 3 180 ACCEPT all -- docker0 docker0 0.0.0.0/0 0.0.0.0/0
这些规则如果有一个容器在监听,就会绕过所有的ufw规则。 ufw在nat表中没有做任何事,而Docker在FORWARD链中的第一个地方设置了规则。 所以你不可能阻止一个IP地址或做任何forms的速率限制。
可能的解决scheme:
--iptables=false启动Docker,手动完成所有操作。 艰辛的解决scheme,因为每次你重新启动一个容器,它会得到一个新的IP(现在,他们打算改变这个)。 -p 127.0.0.1:30080:80创build你自己的iptables规则到达那里。 service docker start 。 虽然有点哈克它工作…