我正在运行一个应用程序,该应用程序由 Digital Ocean Droplet A 上的 PostgreSQL/PostGIS 数据库和 Droplet B 上的另外三个组件组成(均在一个 VPC 内连接)。这个问题仅与液滴 B 上发生的情况有关。
这三个组件各自在上述 Droplet 上同一 Docker 主机上的自己的容器中运行:
整个设置在本地运行得非常好(当然 - 它总是如此),并且在启动三个容器实例后我还可以让它在服务器上运行。
我的问题是:我不希望瓦片服务器暴露给外界,因为那里有一些机密和 PII 数据。访问端口 7800 上的 Droplet 会暴露这一点。端口 3001 上的后端也是如此,尽管我可以在那里阻止路由。所以这主要是为了保护切片服务器。
我对 Web 开发和分布式 Docker 设置相当陌生。我喜欢一切可能,并且对运行设置感到非常满意,但我似乎不知道如何防止这种对磁贴服务器的直接访问。我的第一个想法是建立一个防火墙(在我的例子中是 Ubuntu 上的 UFW),这开启了 Docker 和 UFW(不)如何协同工作的整个主题。使用chaifeng的方法,我能够保护所有内容并拒绝对除前端nginx(端口80)之外的所有内容的所有访问,但这似乎也破坏了前端和后端以及后端之间的通信和平铺服务器。
所以现在我想知道如何进行此设置。当前端引用后端时,我使用本地IP、Droplet的内部IP还是外部IP?同样,当提到平铺服务器时,如何防止来自外部的访问?
我希望我的设置是清楚的,否则我将尝试更详细地描述它。如果有帮助的话,我还可以提供详细的设置。但我想我更多地寻求有关设置此类多层 Web 应用程序的一般建议,同时保持一定程度的安全性 - 就我而言,至少是保护文件服务器免受外部访问。
我在 Digital Ocean Droplet 上设置了 Docker,加载了三个带有切片服务器(在端口 7800 上公开)、后端 (3001) 和前端 (80) 的镜像,这些镜像工作正常,并且三个容器能够进行通信。使用 UFW 和 uff-docker 确定对图块服务器 (7800) 和后端 (3001) 的外部访问是有效的,因为两者都无法从外部访问,但这也破坏了内部通信。
要从前端访问后端,需要在URL中使用容器名称,而不是
localhost
。因此,您应该使用 http://localhost:3001/endpoint
,而不是 http://backend:3001/endpoint
。 Docker 自动为同一网络上的容器设置 DNS,允许您使用容器名称作为主机名。
并确保您的后端服务正在监听
0.0.0.0:3001
而不仅仅是 localhost:3001
。这允许后端接受来自其他容器的连接。