#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-ключи.