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

问题描述 投票:0回答:1

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


设置:

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

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

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

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


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

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

    ssh -L 3306:localhost:3306 Authorized_Server

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

谢谢你,

瑞安

mysql node.js ssh tunnel
1个回答
0
投票

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

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

                  <-------------------------- Data Flow ---------------------------->
  • “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 -L 3306:MySQL_Instance_IP:3306 aUser@Authorized_Server

请将

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
):

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;

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

创建一个要运行 MySQL 查询的 NodeJS 脚本。例如,在名为

app.js
的文件中,需要
mysqlConnection.js
文件并运行查询,如下所示:

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();

现在,使用以下命令运行脚本:

node app.js

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

The solution is: 2
”。

© www.soinside.com 2019 - 2024. All rights reserved.