为加强业务主机安全,都会用Linux自带防火墙配置对外服务端口控制,比如Ubuntu系统默认使用ufw程序。但当安装业务服务是使用Docker发布的,默认的ufw防火墙就无法管理了,具体原因网上很多解释的,这里就不再赘述了。 直接说怎么解决。使用Github上一位大神制作的工具ufw-docker即可。项目地址:https://github.com/chaifeng/ufw-docker下载源码包后解压,找到ufw-docker文件,拷贝到ubuntu系统/usr/local/bin/下,然后chmod +x /usr/local/bin/ufw-docker给执行权限即可。其实这步的核心操作就是在ufw防火墙的核心配置文件/etc/ufw/after.rules 里添加了一些docker-user链的规则,底层还是调用了iptables的docker-user链来实现的功能,只是进行了一键操作,方便高效!
# BEGIN UFW AND DOCKER*filter:ufw-user-forward - [0:0]:ufw-docker-logging-deny - [0:0]:DOCKER-USER - [0:0]-A DOCKER-USER -j ufw-user-forward-A DOCKER-USER -j RETURN -s 10.0.0.0/8-A DOCKER-USER -j RETURN -s 172.16.0.0/12-A DOCKER-USER -j RETURN -s 192.168.0.0/16-A DOCKER-USER -p udp -m udp --sport 53 --dport 1024:65535 -j RETURN-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 192.168.0.0/16-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 10.0.0.0/8-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 172.16.0.0/12-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 192.168.0.0/16-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 10.0.0.0/8-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 172.16.0.0/12-A DOCKER-USER -j RETURN-A ufw-docker-logging-deny -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW DOCKER BLOCK] "-A ufw-docker-logging-deny -j DROPCOMMIT# END UFW AND DOCKER
注意:ufw-docker项目作者做的这个配置,主要是针对互联网访问控制的,所以他默认放通了私网地址,对应配置如下截图
如果是想在局域网内进行控制的,就需要将这三行注释掉。
这步很重要,我这边也是在这里坑了一下!!
3、使用
使用ufw-docker的好处就是配置逻辑和系统自带的ufw一样的,只用配置放通端口,其他就默认拒绝。
首先要区分下要放通的业务端口是本地服务还是docker提供的服务,本地服务就直接用ufw操作就可以,docker提供的服务就用ufw-docker来添加。
ufw-docker主要用法:
ufw-docker allow 容器名称 容器内部端口/协议
其他用法参考github说明,以下拿一个场景举例
如图,有3个docker业务,都是做了端口转发的。
如果我们只希望放通web这个容器的访问端口
ufw-docker allow web 80/tcpufw-docker reload
特别强调下,这里写的端口是容器内部端口,不是转发后的!原理其实就是ufw-docker调用iptables拦截容器的业务端口不做转发,同时,ufw-docker是基于ufw的,所以需要ufw enable。当ufw disable后,docker容器的所有端口是会被拦截的,这个要注意!
4、总结
这个工具能很方便的完成docker业务的端口控制,使用逻辑和传统linux防火墙基本一致,方便上手操作。