MySQL与nodejs的“隧道跳转”连接

Rya*_*Lee 5 mysql ssh tunnel node.js

这可能是重复的,但我找不到该用例的任何内容。


设置:

  • MySQL 实例 - 只有白名单上的 IP 可以通过 ip/user/pass 连接。没有操作系统/SSH 访问权限。

  • 授权服务器 - 我有 root 访问权限。位于 MySQL 实例的白名单中。可以通过 mysql -h -u -p 进入MySQL实例。

  • 开发笔记本电脑 - Windows 笔记本电脑。无法列入动态 dhcp 的白名单。可以通过 SSH 连接到授权服务器。

这是所有 IT 基础设施,无法更改。


  • 我使用 DBeaver 并设置“使用 SSH 隧道”通过授权服务器隧道进入 MySQL 实例,没有问题。

  • 我也可以使用适用于 Windows 的 git bash 从开发笔记本电脑隧道进入授权服务器。(但这对我没有任何帮助)

    ssh -L 3306:localhost:3306 Authorized_Server

Dev Laptop 如何在 MySQL 实例上运行 nodejs mysql 查询?

谢谢你,

瑞安

Von*_*onC 1

如果我正确理解你的配置,你确实有类似的东西:

+--------------+     SSH Tunnel      +-------------------+    MySQL Connection         +----------------+
|              |  ---------------->  |                   |  ------------------------>  |                |
|  Dev Laptop  |  (localhost:3306)   | Authorized Server |   (MySQL_Instance_IP:3306)  | MySQL Instance |
|              |  <----------------  |                   |  <------------------------  |                |
+--------------+                     +-------------------+                             +----------------+

                  <-------------------------- Data Flow ---------------------------->
Run Code Online (Sandbox Code Playgroud)
  • “Dev Laptop”代表您启动 SSH 隧道的开发笔记本电脑。
  • “授权服务器”是被列入白名单的可以访问MySQL实例的服务器。
  • “MySQL实例”是托管MySQL数据库的最终目的地。
  • “SSH Tunnel (localhost:3306)”表示您的开发笔记本电脑和授权服务器之间建立的 SSH 隧道,将本地端口 3306 转发到授权服务器。
  • “MySQL连接(MySQL_Instance_IP:3306)”表示授权服务器通过标准MySQL端口(3306)连接到MySQL实例。

为了设置“隧道跳转”连接,以便您的开发笔记本电脑可以通过 NodeJS 应用程序与 MySQL 实例交互,您需要设置到授权服务器的本地 SSH 隧道,并从那里建立到MySQL 实例。

在您的开发笔记本电脑上,您可以设置 SSH 隧道以将本地主机端口 3306 转发到授权服务器上的端口 3306:

+--------------+     SSH Tunnel      +-------------------+    MySQL Connection         +----------------+
|              |  ---------------->  |                   |  ------------------------>  |                |
|  Dev Laptop  |  (localhost:3306)   | Authorized Server |   (MySQL_Instance_IP:3306)  | MySQL Instance |
|              |  <----------------  |                   |  <------------------------  |                |
+--------------+                     +-------------------+                             +----------------+

                  <-------------------------- Data Flow ---------------------------->
Run Code Online (Sandbox Code Playgroud)

请替换MySQL_Instance_IP为 MySQL 实例的 IP 地址以及Authorized_Server授权服务器的 IP 地址或主机名。

这与将ssh -L 3306:localhost:3306 Authorized_Server流量从开发笔记本电脑上的端口 3306 转发到授权服务器本地主机上的端口 3306 不同:如果 MySQL 服务器在授权服务器本身上运行,并且正在侦听本地主机 (127.0.0.1) 上的端口 3306,这个设置会起作用。
但是,由于您的 MySQL 实例位于不同的服务器上,因此该隧道不便于连接到 MySQL 实例;因此你提到它“对我没有任何帮助”。

ssh -L 3306:MySQL_Instance_IP:3306 aUser@Authorized_Server将设置一条 SSH 隧道,通过授权服务器将流量从开发笔记本电脑上的端口 3306 转发到 MySQL 实例上的端口 3306。这将有效地创建一条从您的开发笔记本电脑通过授权服务器到达 MySQL 服务器的隧道,允许您与 MySQL 实例交互,就像它在您的开发笔记本电脑上本地运行一样。

aUser代表具有通过 SSH 登录所需权限的服务帐户。建议使用具有完成手头任务所需的最少权限的用户帐户,以遵守最小权限原则 (PoLP)并增强安全性。


在您的 NodeJS 应用程序中,使用 localhost 和端口 3306 设置 MySQL 连接(因为 SSH 隧道通过授权服务器将此本地端口转发到 MySQL 实例端口)。使用以下命令创建文件(例如mysqlConnection.js):

ssh -L 3306:MySQL_Instance_IP:3306 aUser@Authorized_Server
Run Code Online (Sandbox Code Playgroud)

'your_mysql_username''your_mysql_password'、 和'your_database_name'分别替换为您的 MySQL 实例用户名、密码和数据库名称。

创建一个要运行 MySQL 查询的 NodeJS 脚本。例如,在名为 的文件中app.js,需要该mysqlConnection.js文件并运行查询,如下所示:

const mysql = require('mysql');

const connection = mysql.createConnection({
  host: 'localhost',
  user: 'your_mysql_username',
  password: 'your_mysql_password',
  database: 'your_database_name',
  port: 3306
});

connection.connect(error => {
  if (error) {
    console.error('Error connecting to the database: ' + error.stack);
    return;
  }
  console.log('Connected to the database as ID ' + connection.threadId);
});

module.exports = connection;
Run Code Online (Sandbox Code Playgroud)

现在,运行脚本:

const connection = require('./mysqlConnection');

connection.query('SELECT 1 + 1 AS solution', (error, results, fields) => {
  if (error) throw error;
  console.log('The solution is: ', results[0].solution);
});

connection.end();
Run Code Online (Sandbox Code Playgroud)

该脚本应该运行 MySQL 查询来添加 1 + 1,然后控制台记录解决方案。The solution is: 2如果一切设置正确,您应该在控制台中看到“ ”。