Как я могу подключиться к базе данных AWS MSSQL через SSH-туннель, используя node.js ?

#javascript #sql-server #amazon-web-services #ssh #amazon-rds

#javascript #sql-сервер #amazon-веб-сервисы #ssh #amazon-rds

Вопрос:

я пытаюсь подключиться к удаленной базе данных, которая разрешает подключения только через ssh-туннель, используя node.js .

я ломаю голову, как это настроить, используя 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 .

я хочу, чтобы мое ssh-соединение было подключено к обычному порту (22), и моя база данных прослушивает соединения на порту 1433.

как это соотносится с источником и пунктами назначения?


ОБНОВЛЕНИЕ: ага! мне удалось заставить это работать, используя ssh-клиент командной строки.

немного больше информации: я подключаюсь к экземпляру aws rds через окно перехода bastion.

теперь я лишь смутно понимаю, что означают эти слова, но мне удалось заставить ssh-туннель работать, используя такую команду:

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

как я могу преобразовать эту команду в формат, который ожидает tunnel-ssh?

Комментарии:

1. Почему бы вам не создать его с ssh помощью SO вместо использования node?

2. итак = ос? я собираюсь заняться другими вещами после того, как подключу lol — в конечном итоге это станет основой веб-приложения

3. Да, ОС. Туннель может существовать в течение всего сеанса (например, до тех пор, пока используется операционная система).

Ответ №1:

Я думаю, вы неправильно понимаете природу туннеля SSH. Смысл этого в том, чтобы сопоставить порт в вашей системе с удаленным портом в другой системе. Таким образом, любые соединения, выполняемые на локальном порту, будут перенаправлены на порт назначения на удаленном сервере.

Вот примеры конфигураций для этого в их репозитории.

я хочу, чтобы мое ssh-соединение было подключено к обычному порту (22), и моя база данных прослушивает соединения на порту 1433.

Ну, ты можешь…

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

Но я считаю, что было бы лучше, если бы вы просто использовали тот же порт, что и ваш database one ( 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 помощью library:

Было бы:

     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
    };
 

Вам нужно настроить user and privateKey ( passphrase , если он у вас есть) или password if, не используя SSH-ключи.