代码之家  ›  专栏  ›  技术社区  ›  JohnSk

为什么需要在AWS EC2安全组中打开MongoDB端口27017?

  •  1
  • JohnSk  · 技术社区  · 7 年前

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

    我刚刚成功地将MEANjs应用程序部署到EC2上的Bitnami MEAN实例,如下所示 Ahmed Haque's excellent tutorial on scotch.io . 作为教程/部署的一部分,我修改了AWS安全组,将端口27017包含在MongoDB流量中。端口27017的CIDR表示法为0.0.0.0/0,这表示AFAIK“允许从任何IP地址访问”。

    问题:为什么需要在AWS EC2中打开MongoDB端口27017 “生产”型环境的安全组?当然,这是直接将DB暴露在 互联网唯一应该和Mongo谈谈的是 “/服务器/api”代码,该代码正在同一实例上运行- 因此不需要打开端口。

    如果我通过关闭27017来更改端口27017的安全组规则,将源更改为:localhost、内部IP地址、公共IP地址,或将CIDR破解为与其中任何一个等效,则web应用程序将挂起(静态内容返回,但不对db支持的api调用作出响应)。将SG规则更改回0.0.0.0/0几乎可以立即“修复”挂起。

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

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

    我错过了什么?

    提前谢谢-John

    1 回复  |  直到 7 年前
        1
  •  2
  •   JohnSk    7 年前

    好的,经过进一步的调查和通宵/红酒反思,我想对于像我这样的学习者,我有了一个答案,他们遵循了上述教程(或类似教程)。遵循“完成”意味着“在生产环境中工作代码”的敏捷原则,作为一名试图在代表性的生产环境(不需要打开不必要的端口)中工作代码的开发人员,我试图理解最后5米——这个答案就是从这个角度写的。(赢得更聪明读者的欢迎。)

    发生了什么事

    本教程中的步骤(a)将Mongo bind IP地址从127.0.0.1更改为0.0.0.0,以及(b)指定使用同一实例的外部IP地址的连接URL,似乎有两种效果:

    1. 它使您正在配置的实例上的MongoDB可能对其他实例可用(0.0.0.0告诉Mongo“侦听所有可用的网络接口”。)
    2. 这意味着来自同一实例上的平均应用程序/服务器组件的IP流量将与Mongo通信,就像来自非实例一样(即使它位于同一实例上)。因此,安全组需要打开端口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,
      • 在其他应用程序/实例连接字符串中使用Mongo服务器的专用IP地址
      • 添加EC2安全组CIDR规则 private IP address/24, or private IP address/16 允许在指定的内部IP地址范围内跨实例访问。

    以上是开发人员的“黑客行为”,不是对良好实践的建议。