从 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.
登录 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.