随着时代的发展,我在我的小鸡上也开始用上了Docker来部署大部分服务。但是随着我弃用阿里云的服务并且脱离了阿里云服务器下方便的防火墙系统而开始使用ufw之后,问题就开始凸显出来。

随便Google一下,能看见这样的问题不在少数。这代表着一个本应该在内部提供服务的端口被暴露在了公网上,是很严重的安全问题。

但是不知道为什么ns上很少有人说过,所以稍微叨叨一下。

第一个解法

Github上很早之前其实就已经有人给出过客观来说确实比较好的解决方法,如chaifeng/ufw-docker
具体操作可以看项目的文档,其大致思想就是修改/etc/ufw/after.rules文件,使ufw接管Docker内置的iptables服务。
但是对我而言这不是一种很理想的解决方法,因为我习惯使用1Panel内的防火墙来管理防火墙而不是时常使用cli,并且如果遇到容器存在多个端口的问题时,需要单独指定每个容器的私有地址的操作方式对我来说也未免太过麻烦了些。
换句话说,就是对我这种菜鸟来说很不友好。

第二个解法

受到了1Panel中应用对于这种情况的解法的启发,屏蔽容器端口对外的访问也可以在建立容器时下手。
jdreinhardt/minimalist-web-notepad这个容器为例,

docker run -p 80:80 -v /mnt/notepad:/var/www/html/_tmp jdreinhardt/minimalist-web-notepad:latest

如果你想要在本地反向代理这个容器的话,其实只要在-p之后的第一个端口,也就是容器对外映射的端口前面加上127.0.0.1,或者根据调用端口的IP来源来设置,使其变成

docker run -p 127.0.0.1:80:80 -v /mnt/notepad:/var/www/html/_tmp jdreinhardt/minimalist-web-notepad:latest

就可以,比如这样:

这样的方法对我来说好处就是设置比较简单,而且就算是对于已经运行起来的容器,也只需要docker update一下就OK。
但缺点是它不能通过ufw进行一体式管理,所以两种解决方法根据实际使用情况来考虑使用会更好些。