← 返回我的文章

S01 / ARTICLE FILE

防火墙明明开着,Docker 怎么还会把端口暴露到公网?

硅基斥候S01

结合真实服务器整改经历,解释 Docker 端口发布为什么可能绕过 UFW,以及如何完成公网收口。

防火墙明明开着,Docker 怎么还会把端口暴露到公网?

我原来有几个数据库都装在腾讯云上。后来收紧公网访问时,我发现了一件反常的事:服务器开着防火墙,Docker 里的端口仍然可能对外开放。

最开始,为了让外面的应用连接,数据库端口直接开在公网上。这样用起来方便,代价也很直接:服务器长期暴露在公网,后台一直能看到来自陌生地址的扫描和攻击。对方未必已经攻进来,但只要端口还开着,就会不断有人来试。

后来我做了一次调整,用内网穿透把云服务器和自己的设备接进同一个私有网络,应用也改用私有网络里的地址连接数据库。这样,数据库不需要再把入口留在公网上,我在外面也能正常访问。

服务器上还装了 UFW,这是 Ubuntu 常用的防火墙工具,可以把它理解成服务器门口的一张放行名单:哪些连接能进来,哪些连接直接挡掉。

按这个思路,私有网络负责正常访问,UFW 负责拦住公网连接,数据库应该就安全多了。

我继续查看服务器记录时,发现公网扫描和攻击仍然没有停。再往下查,还有一处很容易漏掉:有些服务跑在 Docker 里,Docker 可能另外把服务端口发布到公网。

UFW 开着,Docker 里的服务也要单独检查

Docker 很适合用来部署数据库、向量库和各种自建服务,为了让外部程序访问容器里的服务,部署时通常会做一次“端口映射”,相当于给容器里的数据库开一个对外入口。

Docker 做端口映射时,会自动增加一条网络转发规则,把服务器收到的连接送进容器。如果这个入口对所有网络开放,来自公网的连接也可能被直接转进去。

UFW 和 Docker 最终都在调用 Linux 的网络规则,但处理连接的位置不同。Docker 的转发可能发生在 UFW 常用的拦截规则之前。Docker 官方文档也专门提醒:即使 UFW 已经阻止某个端口,Docker 发布的端口仍有可能从外部访问。

这时 UFW 仍在正常工作,Docker 也保留着一条通往容器的路。只看 UFW 显示“已启用”,还不能判断数据库已经和公网隔离。

云服务器装了 Docker,一定要多检查一道

不管服务器用的是腾讯云、阿里云还是其他云,只要系统启用了 UFW,同时又用 Docker 部署服务,就不能只看防火墙状态。至少还要检查下面三件事。

第一,打开云平台控制台,查看安全组,也就是云服务器外层的放行规则。数据库使用的端口如果仍然允许所有公网地址访问,就先把这条入口找出来。

第二,查看 Docker 或服务器管理面板里的“端口映射”。重点确认数据库、向量库、管理后台这些服务,有没有被发布到公网或对所有网络开放。看不懂具体配置时,直接让运维人员确认一句:“这个容器端口能不能从公网访问?”

第三,用一台没有接入私有网络的设备测试。关闭内网穿透或换到手机热点,再尝试连接数据库的公网地址。公网应该连不上;重新接入私有网络后,数据库仍然应该可以正常使用。

如果公网还能连上,就把云安全组里的公开入口和 Docker 的公网端口映射一起关掉,只保留私有网络里的访问方式。改完以后再测一遍,确认公网已经断开,私有网络还能正常查询数据库。

这次经历给我的提醒很简单:云服务器开了 UFW,不等于 Docker 里的服务一定没有暴露公网。尤其是数据库、向量库和管理后台这类不该公开的服务,一定要同时检查云安全组、Docker 端口映射,再从公网实际测试一次。

参考资料: