mongoDB白名单IP

问题描述 投票:0回答:7

我看到类似的帖子,但没有一个能帮助我解决我的问题。

按照从头开始构建 MERN 应用程序的 Udemy 教程,我陷入了 mongoose 连接。

这是我的index.js代码:

const express = require("express");
const mongoose = require("mongoose");

const app = express();

app.use(express.json());

app.listen(5000, () => console.log("Server started on port 5000"));

app.use("/snippet", require("./routers/snippetRouter"));

mongoose.connect("mongodb+srv://snippetUser:_password_@
  snippet-manager.sometext.mongodb.net/main?retryWrites=
  true&w=majority", {
    useNewUrlParser: true,
    useUnifiedTopology: true
}, (err) => {
  if (err) return console.log("error here " + err);
  console.log("Connected to MongoDB");
});

这是我收到的错误:

Server started on port 5000
error here MongooseServerSelectionError: Could not connect to any 
servers in your MongoDB Atlas cluster. One common reason is 
that you're trying to access the database from an IP that isn't 
whitelisted. Make sure your current IP address is on your Atlas 
cluster's IP whitelist:
https://docs.atlas.mongodb.com/security-whitelist/ 

如上所述,我看到与未列入白名单的 IP 相关的类似错误。

但是,在我的mongoDB帐户中,似乎我的IP已经列入白名单:

在上面的屏幕截图中,空白部分是我的 IP 所在位置(就在“包括您当前的 IP 地址”之前)。

既然我的IP被列在那里,这是否意味着我的IP已被列入白名单?

如果没有,如何将我的 IP 列入白名单?

mongodb express mongoose mern whitelist
7个回答
7
投票

经过几天的挫折,我进入 Mongo Atlas,然后进入网络访问并将设置更改为“允许从任何地方访问”(如下所示

0.0.0.0/0
)。它删除了我的 IP 地址并将其更改为通配符 IP 地址。

这与我在 Udemy 上遵循的教程有所不同,但它确实有效,我终于可以继续课程的其余部分。


2
投票

这是我在其他地方留下的答案。希望它可以帮助遇到此问题的人:

此脚本将根据我的要点

保持最新

为什么

mongo atlas 提供了对托管 mongo DB 的价格合理的访问。托管容器的 CSP 对其托管的 mongo DB 收费过高。他们都建议设置一个不安全的 CIDR (

0.0.0.0/0
) 以允许容器访问集群。这显然是荒谬的。

这个入口点脚本是维持最低特权访问的外科手术。仅服务当前托管的 IP 地址被列入白名单。

用法

  • 设置为
    Dockerfile
  • 的入口点
  • 如果不使用容器,则在云初始化/虚拟机启动中运行(并删除最后一行
    exec "$@"
    ,因为这仅适用于容器

行为

使用 mongo atlas 项目 IP 访问列表端点

  • 将检测容器的托管 IP 地址并使用 mongo atlas API 将其列入集群白名单
  • 如果服务没有白名单条目,则会创建它
  • 如果服务具有与当前 IP 匹配的现有白名单条目,则不更改
  • 如果服务 IP 已更改,旧条目将被删除并创建新条目

创建白名单条目后,服务会休眠 60 秒以等待 atlas 将访问传播到集群

环境

设置

  1. 为组织创建 API 密钥
  2. 将API密钥添加到项目
  3. 复制公钥(
    MONGO_ATLAS_API_PK
    )和秘钥(
    MONGO_ATLAS_API_SK
    )
  4. 进入项目设置页面并复制项目ID (
    MONGO_ATLAS_API_PROJECT_ID
    )

在容器服务的env中提供以下值

  • SERVICE_NAME
    :用于创建/更新(删除旧的)白名单条目的唯一名称
  • MONGO_ATLAS_API_PK
    :步骤3
  • MONGO_ATLAS_API_SK
    :步骤3
  • MONGO_ATLAS_API_PROJECT_ID
    :步骤4

部门

# alpine / apk
apk update \
  && apk add --no-cache \
     bash \
     curl \
     jq
     
# ubuntu / apt
export DEBIAN_FRONTEND=noninteractive \
  && apt-get update  \
  && apt-get -y install \
     bash \
     curl \
     jq

脚本

#!/usr/bin/env bash

# -- ENV -- #
# these must be available to the container service at runtime
#
# SERVICE_NAME
#
# MONGO_ATLAS_API_PK
# MONGO_ATLAS_API_SK
# MONGO_ATLAS_API_PROJECT_ID
#
# -- ENV -- #

set -e

mongo_api_base_url='https://cloud.mongodb.com/api/atlas/v1.0'

check_for_deps() {
  deps=(
    bash
    curl
    jq
  )

 for dep in "${deps[@]}"; do
   if [ ! "$(command -v $dep)" ]
   then
    echo "dependency [$dep] not found. exiting"
    exit 1
   fi
 done
}

make_mongo_api_request() {
  local request_method="$1"
  local request_url="$2"
  local data="$3"

  curl -s \
    --user "$MONGO_ATLAS_API_PK:$MONGO_ATLAS_API_SK" --digest \
    --header "Accept: application/json" \
    --header "Content-Type: application/json" \
    --request "$request_method" "$request_url" \
    --data "$data"
}

get_access_list_endpoint() {
  echo -n "$mongo_api_base_url/groups/$MONGO_ATLAS_API_PROJECT_ID/accessList"
}

get_service_ip() {
  echo -n "$(curl https://ipinfo.io/ip -s)"
}

get_previous_service_ip() {
  local access_list_endpoint=`get_access_list_endpoint`

  local previous_ip=`make_mongo_api_request 'GET' "$access_list_endpoint" \
                    | jq --arg SERVICE_NAME "$SERVICE_NAME" -r \
                    '.results[]? as $results | $results.comment | if test("\\[\($SERVICE_NAME)\\]") then $results.ipAddress else empty end'`

  echo "$previous_ip"
}

whitelist_service_ip() {
  local current_service_ip="$1"
  local comment="Hosted IP of [$SERVICE_NAME] [set@$(date +%s)]"

  if (( "${#comment}" > 80 )); then
    echo "comment field value will be above 80 char limit: \"$comment\""
    echo "comment would be too long due to length of service name [$SERVICE_NAME] [${#SERVICE_NAME}]"
    echo "change comment format or service name then retry. exiting to avoid mongo API failure"
    exit 1
  fi
  
  echo "whitelisting service IP [$current_service_ip] with comment value: \"$comment\""

  response=`make_mongo_api_request \
            'POST' \
            "$(get_access_list_endpoint)?pretty=true" \
            "[
              {
                \"comment\" : \"$comment\",
                \"ipAddress\": \"$current_service_ip\"
              }
            ]" \
            | jq -r 'if .error then . else empty end'`

  if [[ -n "$response" ]];
  then
    echo 'API error whitelisting service'
    echo "$response"
    exit 1
  else
    echo "whitelist request successful"
    echo "waiting 60s for whitelist to propagate to cluster"
    sleep 60s
  fi 
}

delete_previous_service_ip() {
  local previous_service_ip="$1"

  echo "deleting previous service IP address of [$SERVICE_NAME]"

  make_mongo_api_request \
    'DELETE' \
    "$(get_access_list_endpoint)/$previous_service_ip"
}

set_mongo_whitelist_for_service_ip() {
  local current_service_ip=`get_service_ip`
  local previous_service_ip=`get_previous_service_ip`

  if [[ -z "$previous_service_ip" ]]; then
    echo "service [$SERVICE_NAME] has not yet been whitelisted"

    whitelist_service_ip "$current_service_ip"
  elif [[ "$current_service_ip" == "$previous_service_ip" ]]; then
    echo "service [$SERVICE_NAME] IP has not changed"
  else  
    echo "service [$SERVICE_NAME] IP has changed from [$previous_service_ip] to [$current_service_ip]"

    delete_previous_service_ip "$previous_service_ip"
    whitelist_service_ip "$current_service_ip"
  fi
}

check_for_deps
set_mongo_whitelist_for_service_ip

# run CMD
exec "$@"

0
投票

如果您使用免费的 MongoDB Atlas,请确保您的集群没有意外暂停 enter image description here


0
投票

删除您当前的 IP 地址并重新添加


0
投票

转到您的 MongoDB Atlas 帐户

登录后转到以下网址 https://cloud.mongodb.com/v2/your_cluster_id#/security/network/accessList

然后在IP访问列表选项卡

中添加IP

然后点击 + 添加 IP 地址

因此您可以从该特定 IP 访问数据库。

==================== 或 ============================== =

进入网络访问

然后在IP访问列表选项卡

中添加IP

然后点击 + 添加 IP 地址

因此您可以从该特定 IP 访问数据库。


0
投票

您应该在连接链接中输入集群密码--

mongodb+srv://snippetUser:_password_@
snippet-manager.sometext.mongodb.net/main?retryWrites=true&w=majority

通过删除 password 字段

输入集群密码

0
投票

检查您的IP白名单:

转到 MongoDB Atlas 仪表板。 导航到您的集群并单击左侧边栏中的“网络访问”。 确保您当前的IP地址已添加到IP白名单中。如果没有,您需要添加它。

将您的IP地址添加到白名单:

单击“添加 IP 地址”按钮。 添加运行 Node.js 服务器的计算机的 IP 地址。 如果您在本地运行服务器,您可以使用“我的 IP 是什么”等服务来获取您当前的公共 IP 地址。

更新连接字符串:

修改 Node.js 代码中的 MongoDB 连接字符串以使用您的实际用户名、密码和数据库名称。替换为您的实际密码。 确保连接字符串中没有换行符。

    mongoose.connect("mongodb+srv://snippetUser:<password>@snippet-manager.sometext.mongodb.net/main?retryWrites=true&w=majority", {
    useNewUrlParser: true,
    useUnifiedTopology: true
}, (err) => {
    if (err) return console.log("error here " + err);
    console.log("Connected to MongoDB");
});

确保替换为您的实际密码。

重试: 进行这些更改后,重新启动 Node.js 服务器并查看问题是否解决。

© www.soinside.com 2019 - 2024. All rights reserved.