Як підключитися до сервера mongodb через тунель ssh


17

Мені було легко підключитися до мого віддаленого сервера mysql на AWS за допомогою секвелпро , однак я намагаюся зробити те ж саме з mongodb.

Я спробував налаштувати ssh тунель за допомогою командного рядка так:

ssh -fN -l root -i path/to/id_rsa -L 9999:host.com:27017 host.com

Я також спробував це, замінивши хост на IP-адресу

ідея полягає в тому, щоб переслати всі підключення mongodb на порт 9999 до того, що знаходиться на хості на порту 27101 .. однак, коли я запускаю команду:

mongo --host localhost --port 9999

з'єднання не вдається, я отримую це замість цього:

MongoDB shell version: 2.6.0
connecting to: localhost:9999/test
channel 2: open failed: connect failed: Connection timed out
channel 3: open failed: connect failed: Connection timed out
2014-05-22T14:42:01.372+0300 DBClientCursor::init call() failed
2014-05-22T14:42:01.374+0300 Error: DBClientBase::findN: transport error: localhost:9999 ns: admin.$cmd query: { whatsmyuri: 1 } at src/mongo/shell/mongo.js:148
exception: connect failed

якщо я запускаю, sudo netstat -plntотримую наступне (що здається в порядку):

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name   
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      4242/node           
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1342/httpd2-prefork 
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      2552/sshd           
tcp        0      0 0.0.0.0:25              0.0.0.0:*               LISTEN      2505/master         
tcp        0      0 127.0.0.1:27017         0.0.0.0:*               LISTEN      11719/mongod        
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      16561/redis-server  

будь-яка ідея, що я роблю неправильно?

оновлення: ось як виглядає остаточна функціональна команда (кредит йде до kenster ):

ssh -fN -i ~/path/to/id_rsa -L 6666:localhost:27017 root@remote.server.com

де -fNкоманда змушує цю команду виконуватись у фоновому режимі

Відповіді:


23

Рядки "канал 2" та "канал 3" походять від ssh. sshdПримірник на віддаленому сервері намагається підключитися до host.com порту 27017 для обслуговування тунельного з'єднання, і це отримання «тайм - аут підключення» помилки.

Іншими словами, sshdна віддаленому сервері не можна досягти цілі тунелю. Оскільки віддалений хост є також хостом, до якого ви нібито тунелюєтесь, важко сказати, у чому конкретна проблема. Можливо, що "host.com" вирішує більше ніж одна IP-адреса. Ви встановлюєте SSH-з'єднання з одним сервером кластера, а потім інший сервер кластера вибирається в якості тунельної цілі. Ви можете спробувати змінити ціль тунелю на "localhost" замість "host.com":

ssh -fN -l root -i path/to/id_rsa -L 9999:localhost:27017 host.com

Оновлення:

"-L 9999: localhost: 27017" означає, що sshклієнт на локальному сервері прослуховує з'єднання на порту 9999. Коли він отримує з'єднання, він тунелює з'єднання до sshdекземпляра на віддаленому сервері. Віддалений sshdекземпляр звідти підключається до localhost: 27017. Тож "localhost" тут з точки зору віддаленого сервера.

З вихідним показником netstat трохи зрозуміліше, чому він не працював раніше. Частина "127.0.0.1:27017" означає, що Mongodb спеціально пов'язаний з інтерфейсом localhost (127.0.0.1) на віддаленому хості. Ви не можете зв’язатися безпосередньо з цим екземпляром mongodb, намагаючись підключитися до звичайної IP-адреси хоста - ви можете зв’язатися лише з цим екземпляром mongodb через адресу localhost. І звичайно, оскільки це localhost, ви можете зв’язатися лише з клієнтом, який працює на тому ж хості.

Отже, те, як ви це робите зараз - тунельне підключення до сервера через ssh, а потім звідти підключення до localhost - це спосіб зробити це.


це дійсно дивно .. спосіб, яким ви користуєтеся, -Lздається, суперечить сторінці ssh man: -L [bind_address:]port:host:hostport Specifies that the given port on the local (client) host is to be forwarded to the given host and port on the remote side.там прямо написано, що hostце хост віддаленого сервера .. ви використовуєте його для локальних?
абат

Я спробував ту саму команду з ip адресою .. але тим самим результатом .. btw Я оновив своє запитання, щоб показати результат мене запустив netstat для служб прослуховування, якщо це допоможе
abbood

після прочитання тут і тут виявляється ваш шлях - правильний шлях. Однак у мене є питання .. У першому посиланні хлопець пояснює, чому потрібна ваша команда ->
abbood

1
ssh -L 27017: myserver: 27017 user @ myserver Повинен слухати порт 27017 на localhost, потім тунель через ssh-з'єднання до мого сервера, а потім натиснути myserver на порт 27017. Тепер, якщо myserver слухає лише localhost, це не буде робота, тому що ім'я хоста може вказувати на зовнішню IP-адресу. Якщо це так, спробуйте цей ssh ​​-L 27017: localhost: 27017 user @ myserver
abbood

чи можете ви поясніть, що це означає? що означає "ім'я хоста лише на зовнішню IP-адресу"?
абат

-1

Я зробив декілька конфігурацій на моїй коробці Ubuntu 18 Vagrant, щоб успішно підключити MongoDB дистанційно за допомогою графічного інтерфейсу Robo 3T. Я пояснив у наступних кроках.

  1. На сервері Ubuntu, щоб відкрити запуск оболонки mongo:
    $ mongo
    
  2. Всередині оболонки mongo введіть наступну команду, щоб створити нового користувача адміністратора.

    > use admin;
    > db.createUser({user:"admin", pwd:"password", roles:[{ role: "root", db: "admin" }]});
    
  3. За замовчуванням mongodb налаштований так, щоб дозволити з'єднання лише з localhost (IP 127.0.0.1). Нам потрібно дозволити віддалені з'єднання з будь-якої ip адреси. Наступні зміни слід зробити лише на вашому сервері розробки. Відкрийте файл etc / mongod.conf та виконайте наступні зміни.

    # network interfaces
        net:
            port: 27017
            bindIp: 0.0.0.0   #default value is 127.0.0.1
    

    Також у тому ж файлі mongod.conf параметр захисту відмежування і додайте параметр авторизації, як показано нижче.

    security:
        authorization: enabled
    
  4. Збережіть і закрийте файл mongod.conf та перезапустіть сервер mongodb.

    $ sudo servcie mongod restart
    
  5. Завантажте та встановіть інструмент графічного інтерфейсу Robo 3T.

  6. На графічному інтерфейсі Robo 3T у налаштуваннях підключення потрібно зробити кілька змін, як показано на знімках екрана нижче.

введіть тут опис зображення

Введіть MongoDB адміністратора ім'я користувача і пароль , який ви створили раніше бази даних.

введіть тут опис зображення

Тут я ввів свої облікові дані скриньки для скриньки Ubuntu 18 Vagrant.

введіть тут опис зображення

Збережіть зміни та натисніть піктограму підключення, щоб побачити, чи добре працює з'єднання.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.