Herstellen einer Verbindung zum Mongodb-Server über SSH-Tunnel

16

Es war einfach für mich, mit einem Sequelpro eine Verbindung zu meinem Remote-MySQL-Server unter AWS herzustellen , aber ich habe Mühe, mit Mongodb dasselbe zu tun.

Ich habe versucht, einen SSH-Tunnel über die Befehlszeile wie folgt einzurichten:

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

Ich habe es auch mit dem Ersetzen des Hosts durch eine IP-Adresse versucht

Die Idee ist, alle Mongodb-Verbindungen auf Port 9999 an den Host auf Port 27101 weiterzuleiten. Wenn ich jedoch den Befehl ausführe:

mongo --host localhost --port 9999

die verbindung schlägt fehl, ich bekomme stattdessen folgendes:

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

wenn ich laufe sudo netstat -plntbekomme ich folgendes (was in ordnung zu sein scheint):

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  

Hast du eine Ahnung, was ich falsch mache?

update: so sieht der letzte funktionale befehl aus ( gutschrift geht an kenster ):

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

Wobei der -fNBefehl diesen Befehl im Hintergrund ausführen lässt

Abbood
quelle

Antworten:

22

Die Leitungen "Kanal 2" und "Kanal 3" kommen von ssh. Die sshdInstanz auf dem Remoteserver versucht, eine Verbindung zum host.com-Port 27017 herzustellen, um eine Tunnelverbindung herzustellen, und es wird der Fehler "Zeitüberschreitung der Verbindung" angezeigt.

Mit anderen Worten, sshdauf dem Remote-Server kann das Ziel des Tunnels nicht erreicht werden. Da der Remote-Host auch der Host ist, zu dem Sie angeblich tunneln, ist es schwierig, das spezifische Problem zu bestimmen. Möglicherweise wird "host.com" in mehr als eine IP-Adresse aufgelöst. Sie stellen eine SSH-Verbindung zu einem Server im Cluster her, und dann wird ein anderer Server im Cluster als Tunnelziel ausgewählt. Sie können versuchen, das Tunnelziel in "localhost" anstelle von "host.com" zu ändern:

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

Aktualisieren:

"-L 9999: localhost: 27017" bedeutet, dass der sshClient auf dem lokalen Server auf Verbindungen an Port 9999 wartet. Wenn eine Verbindung hergestellt wird, wird die Verbindung zur sshdInstanz auf dem Remoteserver getunnelt . Die Remote- sshdInstanz verbindet sich von dort mit localhost: 27017. "Localhost" ist hier also aus der Sicht des Remote-Servers.

Mit der netstat-Ausgabe ist ein bisschen klarer, warum es vorher nicht funktioniert hat. Der Teil "127.0.0.1:27017" bedeutet, dass Mongodb speziell an die Schnittstelle localhost (127.0.0.1) auf dem Remote-Host gebunden ist. Sie können diese Instanz von mongodb nicht direkt kontaktieren, indem Sie versuchen, eine Verbindung zur regulären IP-Adresse des Hosts herzustellen. Sie können diese Instanz von mongodb nur über die localhost-Adresse kontaktieren. Und da es sich um localhost handelt, können Sie natürlich nur von einem Client aus Kontakt aufnehmen, der auf demselben Host ausgeführt wird.

So, wie Sie es jetzt tun - tunneln Sie eine Verbindung zum Server über ssh und stellen Sie dann von dort aus eine Verbindung zu localhost her - ist der Weg, dies zu tun.

Kenster
quelle
Das ist wirklich seltsam. Die Art und Weise, wie Sie sie verwenden, -Lscheint der SSH-Manpage zu widersprechen. -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.Sie sagt ausdrücklich, dass dies hostder Host des Remote-Servers ist.
Abbood
Ich habe versucht , den gleichen Befehl mit einer IP - Adresse .. aber gleiche Ergebnis .. btw aktualisiert ich meine Frage das Ergebnis von mir zu zeigen , netstat laufen für Dienstleistungen zu hören , wenn das hilft
abbood
Nach dem Lesen hier und hier stellt sich heraus, dass Ihr Weg der richtige ist. allerdings habe ich eine
frage
1
ssh -L 27017: myserver: 27017 user @ myserver Sollte Port 27017 auf localhost abhören, tunneln Sie über die ssh-Verbindung zu meinem Server und drücken Sie dann myserver auf Port 27017. Wenn myserver nur localhost abhört, wird dies nicht durchgeführt funktionieren, da der Hostname möglicherweise auf die externe IP-Adresse verweist. Wenn dies der Fall ist, versuchen Sie Folgendes: ssh -L 27017: localhost: 27017 user @ myserver
Abbood
Kannst du bitte erklären, was das bedeutet? Was bedeutet "Hostname zeigt nur auf externe IP-Adresse"?
Abbood
0

Ich habe auf meiner Ubuntu 18 Vagrant-Box nur wenige Konfigurationen vorgenommen, um MongoDB über die Robo 3T-Benutzeroberfläche aus der Ferne erfolgreich zu verbinden. Ich habe in den folgenden Schritten erklärt.

  1. Auf dem Ubuntu-Server, um die Mongo-Shell zu öffnen, gehen Sie wie folgt vor:
    $ mongo
    
  2. Geben Sie in der Mongo-Shell den folgenden Befehl ein, um einen neuen Administratorbenutzer zu erstellen.

    > use admin;
    > db.createUser({user:"admin", pwd:"password", roles:[{ role: "root", db: "admin" }]});
    
  3. Standardmäßig ist mongodb so konfiguriert, dass nur Verbindungen von localhost (IP 127.0.0.1) zugelassen werden. Wir müssen Remoteverbindungen von jeder IP-Adresse zulassen. Die folgende Änderung sollte nur auf Ihrem Entwicklungsserver vorgenommen werden. Öffnen Sie die Datei etc / mongod.conf und nehmen Sie die folgenden Änderungen vor.

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

    Deaktivieren Sie in derselben mongod.conf- Datei die Sicherheitsoption und fügen Sie die unten gezeigte Berechtigungsoption hinzu .

    security:
        authorization: enabled
    
  4. Speichern und beenden Sie die Datei mongod.conf und starten Sie den mongodb-Server neu.

    $ sudo servcie mongod restart
    
  5. Laden Sie das Robo 3T-GUI-Tool herunter und installieren Sie es.

  6. Auf der Robo 3T-Benutzeroberfläche müssen Sie in den Verbindungseinstellungen nur wenige Änderungen vornehmen, wie in den folgenden Screenshots gezeigt.

Bildbeschreibung hier eingeben

Geben Sie den Benutzernamen und das Kennwort der mongodb admin- Datenbank ein, die Sie zuvor erstellt haben.

Bildbeschreibung hier eingeben

Hier habe ich meine Ubuntu 18 Vagrant Box ssh Zugangsdaten eingetragen.

Bildbeschreibung hier eingeben

Speichern Sie die Änderungen und drücken Sie auf das Verbindungssymbol, um zu prüfen, ob die Verbindung ordnungsgemäß funktioniert.

Krishna
quelle