为什么需要在AWS EC2 Security Group中开放MongoDB端口27017?

Why does MongoDB port 27017 need to be opened in AWS EC2 Security Group?

(我搜索过 SO、AWS 支持和更广泛的搜索,但没有成功。)

我刚刚在 Ahmed Haque's excellent tutorial on scotch.io 之后成功地将 MEANjs 应用程序部署到 EC2 上的 Bitnami MEAN 实例。作为 tutorial/deployment 的一部分,我更改了 AWS 安全组以包含用于 Mongo 数据库流量的端口 27017。端口 27017 的 CIDR 表示法是 0.0.0.0/0 - AFAIK 表示 'allow access from any IP address'.

Question: Why does MongoDB port 27017 need to be opened in AWS EC2 Security Group for a 'production' type environment? Surely this is directly exposing the DB to the Internet. The only thing that should be talking to Mongo is the "/server/api" code, which is running on the same instance - and so shouldn't need the port opening.

If I change the Security Group rule for port 27017 by closing off 27017, changing the source to: localhost, the internal IP address, the public IP address, or hack a CIDR to be equivalent to any of those - then the web app hangs (static content returns but no responses to db backed api calls). Changing the SG rule back to 0.0.0.0/0 almost immediately 'fixes' the hang.

我的安装在其他方面都很不错。我已经关闭了安全组中的 3000 端口(节点应用程序),并且正在使用 Apache 将端口 80 流量代理到端口 3000。这样设置,不需要在安全组中打开端口 3000;对我来说,这意味着实例流量不需要向外部公开端口 - 那么 Mongo 端口为什么不是这样?

我在直接与 Mongo 对话的“/client”代码中看不到任何内容。

我错过了什么?

提前致谢 - 约翰

OK,经过进一步调查和 overnight/red wine 反思,我想对于像我这样遵循上述教程(或类似教程)的学习者,我有了答案。遵循 'done' 意味着 'working code in a production environment' 的敏捷原则,我试图理解最后 5 米作为开发人员试图让代码在代表性生产环境中工作(不会打开不必要的端口) - 这个答案是从那个角度写的。 (受到更聪明的读者的欢迎。)

发生了什么事

教程中的步骤 (a) 将 Mongo 绑定 IP 地址从 127.0.0.1 更改为 0.0.0.0,并且 (b) 指定使用外部 IP 的连接 URL同一实例的地址,似乎有两个作用:

  1. 它使您正在配置的实例上的 MongoDB 可能对其他实例可用(0.0.0.0 告诉 Mongo 到 "listen on all available network interfaces"。)
  2. 这意味着来自同一实例上的 MEAN 应用程序/服务器组件的 IP 流量将与 Mongo 通信,就好像它来自 off-instance(即使它在同一实例上) .因此,安全组需要打开端口 27017 以允许此流量流动。 (这是 MEANjs 堆栈组件交互方面的问题所在。

修复

  • 在单个实例 MEANjs 服务器上,如果将 Mongo 绑定 IP 地址更改回 127.0.0.1 并将 Mongo 连接 url 更改为 127.0 .0.1:27017 然后您可以关闭 EC2 安全组中的端口 27017,该应用程序仍然可以运行。

  • 要在多个 MEANjs 应用程序服务器之间共享一个 MongoDB(不想误入 serverfault 领域):

    • 将 Mongo 绑定 IP 地址更改为 0.0.0.0,
    • 在其他 app/instance 连接字符串中使用 Mongo 服务器的私有 IP 地址
    • 添加 private IP address/24, or private IP address/16 的 EC2 安全组 CIDR 规则以允许跨指定内部 IP 地址范围内的实例访问。

以上是开发者 'hack',不是良好做法的推荐。