从 Go 连接到远程 Linux MongoDb(无身份验证)

Connect from Go to remote Linux MongoDb (no auth)

登录 Linux 框后,无需身份验证即可连接 MongoDB。

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

试过下面的代码但它抛出:"no reachable servers"

在命令提示符下,我可以 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)
    }

ssh 隧道是一种可行但有时难以保护服务的措施。

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

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

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

Side note: Make sure you have a brute force blocker like fail2ban or denyhosts installed, configured to protect MongoDB and tested if you do so.

如果上面的总和看起来太复杂,您应该非常彻底考虑您是否不应该使用托管MongoDB 服务如 MongoDB Inc's Atlas or mLab.

尽管如此,您还是可以这样做:

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

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

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

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

现在,您只需设置 &mgo.DialInfo{Addrs:[]string{"127.0.0.1:27017"}}

Note

In case it was not clear by now: I strongly (!!!) advice against using an ssh tunnel. It makes creating a replicaset rather complicated and excludes sharding pretty much. Learn how to properly manage MongoDB. MongoDB University offers free courses, and they are pretty damn good.

You. Have. Been. Warned.