如何使用 node.js 通过 SSH 隧道连接到 AWS MSSQL 数据库?

时间:2021-02-23 16:13:29

标签: javascript sql-server amazon-web-services ssh amazon-rds

我正在尝试使用 node.js 连接到仅允许通过 ssh 隧道连接的远程数据库。

我正在摸索如何使用 tunnel-sshmssql 进行设置,尤其是源端口和目标端口应该是什么。我现在有这样的事情:

require("dotenv").config()

const sql = require("mssql")
const tunnel = require("tunnel-ssh")

const tnl = tunnel(
  {
    host: process.env.SSH_HOST,
    port: process.env.SSH_PORT,
    username: process.env.SSH_USER,
    privateKey: require("fs").readFileSync(process.env.SSH_KEYFILE_PATH),

    // more needed here?
  },
  (error, tnl) => {
    if (error) console.log(error)
    const db = mssql
    .connect(
      `mssql://${process.env.DB_USER}:${process.env.DB_PASS}@${process.env.DB_HOST}/${process.env.DB_NAME}`
    )
    .then(() => {
      const result = mssql.query`SELECT * FROM INFORMATION_SCHEMA.TABLES`
      console.log(result)
    })
    .catch(err => console.log(err))
  }
)

目前 tunnel-ssh 抱怨 ConfigError: dstPort 未设置,但我不确定源端口和目标端口实际上应该是什么?

我也尝试过使用 ssh2 而不是 tunnel-ssh

我希望在普通端口 (22) 上建立 ssh 连接,而我的数据库正在侦听端口 1433 上的连接。

如何映射到源和目的地?


更新:啊哈!我已经成功地使用命令行 ssh 客户端完成了这项工作。

更多信息:我正在通过堡垒跳箱连接到 aws rds 实例。

现在,我只是模糊地理解这些词的意思,但我已经设法使用这样的命令使 ssh 隧道工作:

ssh -f -N -L 1433:my-db.1234566.eu-west-2.rds.amazonaws.com:1433 ec2-user@bastion.ec2.ip.here -v

我如何将此命令转换为隧道 ssh 期望的格式?

1 个答案:

答案 0 :(得分:0)

我认为您误解了 SSH 隧道的性质。它的重点是将系统上的端口映射到另一个系统上的远程端口。因此,在本地端口上完成的任何连接都将转发到远程服务器上的目标端口。

这是他们存储库中的 example configurations

<块引用>

我希望我的 ssh 连接在普通端口 (22) 上,我的数据库是 侦听端口 1433 上的连接。

好吧,你可以...

    var config = {
      username:'root',
      password:'secret',
      host:sshServer,
      port:22,
      dstHost:destinationServer,
      dstPort:1433,
      localHost:'127.0.0.1',
      localPort:22
    };

但我相信,如果您只使用与数据库 (1433) 相同的端口,它会更合适。请记住,您的 MSSQL 客户端必须连接到端口 22 和 localhost。与 localhost:22 的任何其他连接都将在 MSSQL 数据库服务中结束。

端口的一些解释:

port:远程 SSH 服务器运行的端口。

localPort:将连接转发到远程端口的本地端口。

dstPort:连接结束的远程端口。

或者,也可以在您的操作系统上使用 SSH 客户端完成相同的操作:

ssh -L 22:localhost:1433 yourSSHhost

它可以让您通过 localhost 端口 22 连接到您的 MSSQL 服务器。

更新

使用此隧道:

ssh -f -N -L 1433:my-db.1234566.eu-west-2.rds.amazonaws.com:1433 ec2-user@bastion.ec2.ip.here -v

您可以使用 tunnel-ssh 库这样做:

应该是:

    var config = {
      username:"ec2-user",
      password:"yourpasswordhere",
      host:"bastion.ec2.ip.here",
      port:22,
      dstHost:"my-db.1234566.eu-west-2.rds.amazonaws.com",
      dstPort:1433,
      localHost:"127.0.0.1",
      localPort:1433
    };

如果不使用 SSH 密钥,您确实需要设置 userprivateKey(+ passphrase,如果有)或 password

相关问题