我正在尝试使用 node.js 连接到仅允许通过 ssh 隧道连接的远程数据库。
我正在摸索如何使用 tunnel-ssh 和 mssql 进行设置,尤其是源端口和目标端口应该是什么。我现在有这样的事情:
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 期望的格式?
答案 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 密钥,您确实需要设置 user
和 privateKey
(+ passphrase
,如果有)或 password
。