docker手册( http://docs.docker.com/installation/ubuntulinux/#docker-and-ufw)声明将UFW DEFAULT_FORWARD_POLICY设置为“ACCEPT”是必要的,因此docker容器可以相互连接.

>在具有可公开访问的网络接口的服务器上执行此操作的安全含义是什么?
>如何保护这样的码头主机?

他们似乎已经解决了这部分问题,至少在最新版本1.4.1中已经解决了.我的FORWARD策略是丢弃数据包和容器间通信工作没有问题.

这些是docker创建的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,只接受“回答”数据包.

这里没问题. (除非你想要传出过滤器)

您可以愉快地将FORWARD INPUT策略设置为DROP / REJECT.

现在,您可能想要在互联网上提供服务.例如.简单的网络服务器:

$docker run -d -p 80:80 dockerfile/nginx

好的,现在去yourserver.com.您将看到默认的nginx页面.为什么? Docker为你在iptables中添加了一些特殊规则.

$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地址或进行任何类型的速率限制.

可能的解决方案:

>使用–iptables = false启动Docker并手动执行所有操作.艰苦的解决方案,因为每次重新启动容器时,它都会获得一个新的IP(目前,他们计划更改它).>使用-p 127.0.0.1:30080:80绑定localhost上的所有端口并创建自己的iptables规则以实现目标.>以某种方式修改ufw?>不要使用任何防火墙框架.我现在这样做.我的所有规则都以iptables命令保存在单独的脚本中.重新启动并启动每个服务泊坞窗后执行此脚本.有点hacky它有效…