在 node-mysql 中使用 SSH 隧道连接到 MySQL

Posted

技术标签:

【中文标题】在 node-mysql 中使用 SSH 隧道连接到 MySQL【英文标题】:Connect to MySQL using SSH Tunneling in node-mysql 【发布时间】:2014-03-20 15:46:52 【问题描述】:

使用node-mysql npm 包时,是否可以使用 SSH 密钥而不是密码连接到 MySQL 服务器?

【问题讨论】:

【参考方案1】:

您可以完全独立地执行 SSH 隧道组件,然后使用基于 SSH 的 TCP 隧道将 node-mysql(或任何其他 sql 客户端...)指向您的数据库。

像这样设置你的 SSH 隧道

ssh -N -p 22 sqluser@remoteserverrunningmysql.your.net -L 33306:localhost:3306

将其留在后台(有关详细信息,请参阅 articles like this)。

然后只需将任何 MySQL 客户端发送到 localhost 上的端口 33306。它实际上会像您在远程服务器上并使用端口 3306 一样连接。

【讨论】:

这确实有效!确保连接始终运行的最佳方法是什么? 我不确定最好的方法是什么,但this 可能是一个开始。【参考方案2】:

非常感谢史蒂夫,您的回答对我帮助很大。只是为了更清楚地使用

ssh -f user@personal-server.com -L 2000:personal-server.com:25 -N

-f 告诉 ssh 在执行命令之前进入后台。后面是您正在登录的用户名和服务器。 -L 2000:personal-server.com:25 采用 -L local-port:host:remote-port 的形式。最后 -N 指示 OpenSSH 不在远程系统上执行命令

要连接到 mongo,请使用您设置为本地端口的任何端口(在本例中端口为 2000)

例如,假设我想连接到 IP 为 192.168.0.100 的远程服务器上,而 mongo 正在端口 27017 上运行。

假设名为 elie 且密码为 eliepassword 的用户可以访问端口 22 上的 ssh,我将不得不这样做 首先在终端上运行以下命令:

ssh -f elie@192.168.0.100 -L 2002:127.0.0.1:27017 -N

在我的 mongo 连接中我会这样做:

var mongoose = require('mongoose');

mongoose.connect('mongodb://localhost:2002/mydatabase');

module.exports = mongoose.connection;

我希望这能说明问题。

【讨论】:

【参考方案3】:
const mysql = require('mysql2');
const  Client  = require('ssh2');
const sshClient = new Client();
const dbServer = 
    host: process.env.DB_HOST,
    port: process.env.DB_PORT,
    user: process.env.DB_USERNAME,
    password: process.env.DB_PASSWORD,
    database: process.env.DB_DATABASE

const tunnelConfig = 
    host: process.env.DB_SSH_HOST,
    port: 22,
    username: process.env.DB_SSH_USER,
    password: process.env.DB_SSH_PASSWORD

const forwardConfig = 
    srcHost: '127.0.0.1',
    srcPort: 3306,
    dstHost: dbServer.host,
    dstPort: dbServer.port
;
const SSHConnection = new Promise((resolve, reject) => 
    sshClient.on('ready', () => 
        sshClient.forwardOut(
        forwardConfig.srcHost,
        forwardConfig.srcPort,
        forwardConfig.dstHost,
        forwardConfig.dstPort,
        (err, stream) => 
             if (err) reject(err);
             const updatedDbServer = 
                 ...dbServer,
                 stream
            ;
            const connection =  mysql.createConnection(updatedDbServer);
           connection.connect((error) => 
            if (error) 
                reject(error);
            
            resolve(connection);
            );
);
).connect(tunnelConfig);
);

【讨论】:

以上是关于在 node-mysql 中使用 SSH 隧道连接到 MySQL的主要内容,如果未能解决你的问题,请参考以下文章

如何在 android 中连接 SSH 隧道 tcp/udp

通过 DataGrip 上的 ssh 隧道更快地连接

通过 php 中的 ssh 连接隧道请求

ssh 隧道连接在 chromeos 上被拒绝

使用 C# 建立 MySQL 连接的 SSH 隧道

DBeaver 通过 SSH 隧道连接