docker会默认开启iptables NAT规则,如果使用-p port:port这种形式暴露端口是得不到ufw的防护的。
因为ufw操作的实际上是filter规则链,并没有提供简单的操作nat链的方案。
经过一番google之后,终于解决这个问题,现总结如下。
两步走
第一步,禁用docker操作iptables的功能
编辑/etc/default/docker文件,修改DOCKER_OPTS="--iptables=false",等同于给docker启动参数添加--iptables=false选项,此选项会禁用docker添加iptables规则。
相关参考文档:http://blog.viktorpetersson.com/post/101707677489/the-dangers-of-ufw-docker
第二步,编辑ufw默认规则链
编辑/etc/ufw/before.rules这个文件,在文件末尾追加以下内容:
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE
COMMIT
之后重启一下ufw规则即可:
sudo ufw disable
sudo ufw enable
相关参考文档:https://svenv.nl/unixandlinux/dockerufw
之后就可以通过ufw allow这种形式添加对docker容器的访问权限了。
如:
docker run -p 27017:27017 mongo # 启动mongodb服务,并映射到本机的*:27017这个端口上
sudo ufw allow from 114.114.0.0/16 to any port 27017
只允许114.114.0.0/16这个网段的主机访问本机27017端口(mongodb默认监听端口)
Ubuntu ufw防火墙规则顺序问题:http://www.linuxdiyf.com/linux/15781.html
Ubuntu下的防火墙Gufw-ufw:http://www.linuxdiyf.com/linux/10875.html
Ubuntu防火墙-the Uncomplicated Firewall(ufw):http://www.linuxdiyf.com/linux/5412.html
Linux主机如何用ssh去登录docker容器的步骤:http://www.linuxdiyf.com/linux/14643.html
如何在Fedora 22上面配置Apache的Docker容器:http://www.linuxdiyf.com/linux/12948.html