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

17

Мне было легко подключиться к моему удаленному серверу mysql в AWS с помощью sequelpro , однако я пытаюсь сделать то же самое с 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команда заставить эту команду работать в фоновом режиме

abbood
источник

Ответы:

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, а затем соединиться с локальным хостом - это способ сделать это.

Kenster
источник
это действительно странно ... то, как вы используете, -Lкажется, противоречит справочной странице ssh: -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это хост удаленного сервера ... вы используете его для локального?
abbood
Я попробовал ту же команду с IP-адресом .. но с тем же результатом .. Кстати, я обновил свой вопрос, чтобы показать результат моего запуска netstat для служб прослушивания, если это поможет
abbood
после прочтения здесь и здесь оказывается, ваш путь является правильным путем. однако у меня есть вопрос .. в первой ссылке парень объясняет, почему ваша команда необходима ->
abbood
1
ssh -L 27017: myserver: 27017 user @ myserver Должен прослушивать порт 27017 на локальном хосте, затем туннелировать соединение ssh с моим сервером, а затем подключиться к myserver на порту 27017. Теперь, если myserver прослушивает только локальный хост, это не будет работать, потому что имя хоста может указывать на внешний IP-адрес. Если это так, попробуйте этот ssh -L 27017: localhost: 27017 user @ myserver
abbood
не могли бы вы объяснить, что это значит? что означает «имя хоста указывает только на внешний IP-адрес»?
Abbood
-1

Я выполнил несколько настроек на своем Ubuntu 18 Vagrant, чтобы успешно подключить MongoDB удаленно с помощью Robo 3T GUI. Я объяснил в следующих шагах.

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

    > use admin;
    > db.createUser({user:"admin", pwd:"password", roles:[{ role: "root", db: "admin" }]});
    
  3. По умолчанию mongodb настроен на разрешение соединений только с локального хоста (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
    

    Также в том же параметре безопасности uncomment файла mongod.conf и добавьте параметр авторизации, как показано ниже.

    security:
        authorization: enabled
    
  4. Сохраните и выйдите из файла mongod.conf и перезапустите сервер mongodb.

    $ sudo servcie mongod restart
    
  5. Загрузите и установите Robo 3T GUI tool.

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

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

Введите имя пользователя и пароль базы данных mongodb admin, которые вы создали ранее.

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

Здесь я ввел свои учетные данные SSH Ubuntu 18 Vagrant box.

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

Сохраните изменения и нажмите значок подключения, чтобы увидеть, работает ли подключение нормально.

Кришна
источник