【问题标题】:Connect from Go to remote Linux MongoDb (no auth)从 Go 连接到远程 Linux MongoDb(无身份验证)
【发布时间】:2020-02-11 05:11:39
【问题描述】:

登录Linux box后,无需认证即可连接MongoDB。

如何从 Go 代码连接到这样的 MongoDB 实例?我需要使用用户名和密码通过 SSH 连接到 Linux 机器,然后连接到 MongoDB。

尝试了下面的代码,但它抛出:“没有可达的服务器”

在命令提示符下,我可以 ping Linux 机器的 IP 地址,并且我的 IDE 也可以连接到互联网。

    mongoDBDialInfo := &mgo.DialInfo{
        Addrs:    []string{"<LINUX_IP_ADDRESS>"},
        Timeout:  60 * time.Second,
        Database: "<MONGODB_DATABASE_NAME>",
        Username: "<LINUX_USERNAME>",
        Password: "<LINUX_PASSWORD>",
    }

    mongoSession, err := mgo.DialWithInfo(mongoDBDialInfo)
    if err != nil {
        log.Fatalf("CreateSession: %s\n", err)
    }

【问题讨论】:

  • mgo.DialInfo 使用 mongo 身份验证,而不是 ssh 凭据。您的“我需要使用用户名和密码通过 SSH 连接到 Linux 机器”是 ssh 隧道。见godoc.org/golang.org/x/crypto/ssh

标签: mongodb go mgo


【解决方案1】:

ssh 隧道是一种可行的但有时很棘手的保护服务的措施。

棘手的部分是隧道可能会崩溃,当这种情况发生时您无能为力,因为隧道是在您的应用程序之外创建的。

但是,对于 MongoDB,它还带来了一些相当讨厌的副作用:您需要大量设置设置和 DNS 才能设置和运行副本,更不用说分片了。

如果您启用身份验证(这并不难)和 TLS 以及适当的安全措施会更好,然后将您的 MongoDB 服务器绑定到 0.0.0.0 0.0 或用于连接机器的 IP 地址。

附注:确保您安装了像 fail2bandenyhosts 这样的蛮力拦截器,配置为保护 MongoDB 并测试如果你这样做了。

如果上述总和看起来太复杂,您应该非常彻底考虑是否应该使用托管 MongoDB 服务,如 MongoDB Inc's Atlas 或 @987654324 @。

不过,您可以这样做:

$ ssh user@linuxhost -N -f -L 27017:127.0.0.1:27017
Password:

输入密码。该进程将进入后台,您可以通过

检查它是否仍在运行
$ ps ax | grep ssh

这将打开一个到远程主机的 ssh 隧道,打开端口 27017(运行命令的机器上的第一个端口,并通过 ssh 连接将其隧道连接到 127.0.0.1(远程主机的本地主机地址)在 27017 端口上。

现在,您可以简单地设置&amp;mgo.DialInfo{Addrs:[]string{"127.0.0.1:27017"}}

注意

如果现在还不清楚:我强烈(!!!)建议不要使用 ssh 隧道。它使创建副本集变得相当复杂,并且几乎不包括分片。了解如何正确管理 MongoDB。 MongoDB University 提供免费课程,非常棒。

你。有。是。警告。

【讨论】:

  • 如果数据库只监听本地接口,是否可以设置一个副本集? OP从未提到repset或sharding。我同意在这里使用 ssh 隧道的想法非常糟糕,应该作为最后的手段使用。
  • @Markus W Mahlberg - 太棒了,但是代码在需要连接到 Linux MongoDb 的 Windows 机器上,有什么建议吗?
  • @Test 您仍然可以使用putty 从 Windows 设置隧道。请记住,以任何方式通过 3rd 方应用程序设置隧道,您都会失去对 go 应用程序的控制。隧道不太可靠,用户有责任确保隧道正常运行并保持开放。
  • @AlexBlex 您可以使用不同的端口,并可能使用 ha-proxy 将这些端口转发到不同的主机(您必须在这些主机上做同样的事情) - 比正确的部署要复杂得多,但它会工作。并且在没有 replset 的情况下使用 MongoDB 真的没有意义。嵌入式 KV 存储将更有意义,因为开销和约束更少,并且能够根据应用程序的需求优化所有内容。
  • 副本相当昂贵。与 KV 存储相比,独立的 mongo 具有许多优势——聚合、索引、上限集合等等。我相信在很多用例中,拥有一个独立的实例是有意义的。无论如何都比使用 ssh 隧道连接到它更有意义 =)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-25
  • 1970-01-01
  • 2015-06-02
  • 2016-03-20
  • 1970-01-01
  • 1970-01-01
  • 2021-01-18
相关资源
最近更新 更多