Назад | Перейти на главную страницу

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

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

есть идеи, что я делаю не так?

Обновить: так выглядит финальная функциональная команда (заслуга Кенстер):

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

где -fN команда запускает эту команду в фоновом режиме

Строки "канал 2" и "канал 3" взяты из ssh. В sshd Экземпляр на удаленном сервере пытается подключиться к порту 27017 host.com, чтобы обслуживать туннельное соединение, и выдает ошибку «время ожидания соединения истекло».

Другими словами, 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 instance подключается оттуда к localhost: 27017. Итак, «localhost» здесь с точки зрения удаленного сервера.

С выводом netstat становится немного понятнее, почему он раньше не работал. Часть «127.0.0.1:27017» означает, что Mongodb специально привязан к интерфейсу localhost (127.0.0.1) на удаленном хосте. Вы не можете напрямую связаться с этим экземпляром mongodb, пытаясь подключиться к обычному IP-адресу хоста - вы можете связаться с этим экземпляром mongodb только через адрес localhost. И, конечно же, поскольку это localhost, вы можете связываться только с клиентом, работающим на том же хосте.

Итак, как вы это делаете сейчас - туннелируете соединение с сервером через ssh, а затем подключаетесь оттуда к localhost - вот способ сделать это.

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

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

    > use admin;
    > db.createUser({user:"admin", pwd:"password", roles:[{ role: "root", db: "admin" }]});
    
  3. По умолчанию mongodb настроен на разрешение подключений только с локального хоста (IP 127.0.0.1). Нам нужно разрешить удаленные подключения с любого IP-адреса. Следующее изменение следует делать только на вашем сервере разработки. Открыть и т.д. / 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 GUI.

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

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

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

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