设置UFW default_forward_policy接受的安全含义?

docker手册( http://docs.docker.com/installation/ubuntulinux/#docker-and-ufw )指出,将UFW DEFAULT_FORWARD_POLICY设置为“ACCEPT”是必要的,因此docker集装箱可以互相访问。

  1. 在具有可公开访问的networking接口的服务器上这样做的安全含义是什么?

  2. 应该做些什么来保护这样的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 

从下往上:

  • 第三条规则是docker – docker通讯,没有任何限制。
  • 第二条规则是docker – >任何地方(但不是docker),这也是没有限制的接受。
  • 第一个规则是任何地方 – >docker工人,只有“回答”数据包被接受。

这里没有问题。 (除非你想要传出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规则到达那里。
  • 修改ufw莫名其妙?
  • 不要使用任何防火墙框架。 我现在就这样做。 我的所有规则都作为iptables命令保存在一个单独的脚本中。 这个脚本是在重启之后执行的,每个service docker start 。 虽然有点哈克它工作…