jak połączyć się z serwerem mongodb przez tunel ssh

17

To było łatwe dla mnie, aby połączyć się z serwerem zdalnym mysql na AWS wykorzystaniem sequelpro jednak mam zmaga się robić to samo z MongoDB.

Próbowałem skonfigurować tunel ssh za pomocą wiersza poleceń:

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

Próbowałem też, zastępując host adresem IP

Chodzi o to, aby przekazać wszystkie połączenia mongodb na porcie 9999 do połączenia na hoście na porcie 27101 .. jednak po uruchomieniu polecenia:

mongo --host localhost --port 9999

połączenie nie powiedzie się, zamiast tego otrzymuję:

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

jeśli uruchomię sudo netstat -plnt, otrzymam następujące (co wydaje się w kolejności):

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  

jakiś pomysł, co robię źle?

aktualizacja: tak wygląda końcowe polecenie funkcjonalne ( podziękowania dla Kenstera ):

ssh -fN -i ~/path/to/id_rsa -L 6666:localhost:27017 [email protected]

gdzie -fNpolecenie powoduje, że to polecenie działa w tle

abbood
źródło

Odpowiedzi:

23

Linie „kanał 2” i „kanał 3” pochodzą z ssh. sshdInstancja na serwerze zdalnym próbuje połączyć się host.com porcie 27017 w celu obsługi połączenia tunelu, i to coraz „Przekroczono limit czasu połączenia” błąd.

Innymi słowy, sshdna zdalnym serwerze nie można osiągnąć celu tunelu. Ponieważ host zdalny jest również hostem, do którego rzekomo tunelujesz, ciężko powiedzieć, na czym polega konkretny problem. Może się zdarzyć, że „host.com” rozpoznaje więcej niż jeden adres IP. Nawiązujesz połączenie SSH z jednym serwerem w klastrze, a następnie wybierany jest inny serwer w klastrze jako cel tunelu. Możesz spróbować zmienić cel tunelu na „localhost” zamiast „host.com”:

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

Aktualizacja:

„-L 9999: localhost: 27017” oznacza, że sshklient na serwerze lokalnym nasłuchuje połączeń na porcie 9999. Po otrzymaniu połączenia tuneluje połączenie z sshdinstancją na serwerze zdalnym. Zdalna sshdinstancja łączy się stamtąd z hostem lokalnym: 27017. Tak więc „localhost” jest tutaj z perspektywy zdalnego serwera.

Dzięki wyjściu netstat jest nieco bardziej zrozumiałe, dlaczego wcześniej nie działało. Część „127.0.0.1:27017” oznacza, że ​​Mongodb jest ściśle powiązany z interfejsem localhost (127.0.0.1) na hoście zdalnym. Nie możesz skontaktować się bezpośrednio z tym wystąpieniem mongodb, próbując połączyć się ze zwykłym adresem IP hosta - możesz skontaktować się tylko z tym wystąpieniem mongodb poprzez adres localhost. I oczywiście, ponieważ jest to host lokalny, możesz skontaktować się tylko z klientem działającym na tym samym hoście.

Tak więc sposób, w jaki to robisz teraz - tunelowanie połączenia z serwerem przez ssh, a następnie połączenie się z localhost stamtąd - jest sposobem na to.

Kenster
źródło
to naprawdę dziwne ... sposób, w jaki używasz -Lwydaje się być sprzeczny ze stroną podręcznika 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.wyraźnie mówi, że hostjest to host zdalnego serwera .. używasz go do lokalnego?
abbood
Próbowałem tego samego polecenia z adresem IP ... ale ten sam wynik .. btw Zaktualizowałem moje pytanie, aby pokazać wynik mojego działania programu netstat dla usług nasłuchiwania, jeśli to pomaga
opis
po przeczytaniu tutaj i tutaj okazuje się, że twoja droga jest właściwa. jednak mam pytanie .. w pierwszym linku facet wyjaśnia, dlaczego twoje polecenie jest konieczne ->
abbood
1
ssh -L 27017: mój serwer: 27017 użytkownik @ mój serwer Powinien nasłuchiwać na porcie 27017 na hoście lokalnym, następnie tunelować połączenie ssh z moim serwerem, a następnie uderzyć mój serwer na porcie 27017. Teraz, jeśli mój serwer nasłuchuje tylko na lokalnym hoście, to nie będzie działa, ponieważ nazwa hosta może wskazywać na zewnętrzny adres IP. W takim przypadku spróbuj użyć ssh -L 27017: localhost: 27017 user @ myserver
abbood
czy możesz wyjaśnić, co to znaczy? co oznacza „nazwa hosta wskazuje tylko na zewnętrzny adres IP”?
abbood
-1

Przeprowadziłem kilka konfiguracji na moim pudełku Ubuntu 18 Vagrant, aby pomyślnie połączyć MongoDB zdalnie za pomocą graficznego interfejsu użytkownika Robo 3T. Wyjaśniłem w następujących krokach.

  1. Na serwerze Ubuntu, aby otworzyć uruchamianie powłoki mongo:
    $ mongo
    
  2. Wewnątrz powłoki mongo wpisz następujące polecenie, aby utworzyć nowego użytkownika administratora.

    > use admin;
    > db.createUser({user:"admin", pwd:"password", roles:[{ role: "root", db: "admin" }]});
    
  3. Domyślnie mongodb jest skonfigurowany tak, aby zezwalał na połączenia tylko z hosta lokalnego (IP 127.0.0.1). Musimy zezwalać na zdalne połączenia z dowolnego adresu IP. Poniższej zmiany należy dokonać tylko na serwerze programistycznym. Otwórz plik etc / mongod.conf i wykonaj następujące zmiany.

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

    Również w tej samej opcji bezpieczeństwa odkomentowania pliku mongod.conf i dodaj opcję autoryzacji , jak pokazano poniżej.

    security:
        authorization: enabled
    
  4. Zapisz i zamknij plik mongod.conf i zrestartuj serwer mongodb.

    $ sudo servcie mongod restart
    
  5. Pobierz i zainstaluj narzędzie GUI Robo 3T.

  6. W interfejsie graficznym Robo 3T w ustawieniach połączenia musisz wprowadzić kilka zmian, jak pokazano na poniższych zrzutach ekranu.

wprowadź opis zdjęcia tutaj

Wprowadź nazwę użytkownika i hasło administratora bazy danych mongodb , które wcześniej utworzyłeś.

wprowadź opis zdjęcia tutaj

Tutaj wprowadziłem dane uwierzytelniające ssh dla Ubuntu 18 Vagrant.

wprowadź opis zdjęcia tutaj

Zapisz zmiany i naciśnij ikonę połączenia, aby sprawdzić, czy połączenie działa poprawnie.

Kryszna
źródło