bagaimana menghubungkan ke server mongodb melalui ssh tunnel

16

Itu mudah bagi saya untuk terhubung ke server mysql jauh saya di AWS menggunakan sequelpro , namun saya berjuang dengan melakukan hal yang sama dengan mongodb.

Saya mencoba mengatur terowongan ssh melalui baris perintah seperti ini:

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

Saya juga mencobanya dengan mengganti host dengan alamat ip

idenya adalah untuk meneruskan semua koneksi mongodb pada port 9999 ke yang di host pada port 27101 .. namun ketika saya menjalankan perintah:

mongo --host localhost --port 9999

koneksi gagal, saya mendapatkan ini sebagai gantinya:

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

jika saya menjalankan sudo netstat -plntsaya mendapatkan yang berikut (yang tampaknya dalam urutan):

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  

tahu apa yang saya lakukan salah?

pembaruan: beginilah bentuk perintah fungsional akhir (kredit diberikan ke kenster ):

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

di mana -fNperintah membuat perintah ini berjalan di latar belakang

abbood
sumber

Jawaban:

22

Baris "saluran 2" dan "saluran 3" berasal dari ssh. The sshdcontoh pada remote server sedang mencoba untuk menyambung ke host.com pelabuhan 27.017 untuk layanan koneksi terowongan, dan itu mendapatkan "koneksi timed out" error.

Dengan kata lain, sshdpada server jarak jauh tidak dapat mencapai target terowongan. Karena host jarak jauh juga merupakan host yang seharusnya Anda tuju, sulit untuk mengatakan apa masalahnya. Bisa jadi "host.com" memutuskan untuk lebih dari satu alamat IP. Anda sedang membuat koneksi SSH ke satu server di cluster, dan kemudian server yang berbeda di cluster dipilih sebagai target terowongan. Anda dapat mencoba mengubah target terowongan menjadi "localhost" alih-alih "host.com":

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

Memperbarui:

"-L 9999: localhost: 27017" berarti bahwa sshklien pada server lokal mendengarkan koneksi pada port 9999. Ketika mendapat koneksi, itu akan menghubungkan koneksi ke sshdinstance pada server jarak jauh. sshdInstance jarak jauh terhubung dari sana ke localhost: 27017. Jadi "localhost" di sini adalah dari perspektif server jarak jauh.

Dengan output netstat, sedikit lebih jelas mengapa tidak bekerja sebelumnya. Bagian "127.0.0.1 .: 7017" berarti bahwa Mongodb secara khusus terikat ke antarmuka localhost (127.0.0.1) pada host jarak jauh. Anda tidak dapat menghubungi instance mongodb secara langsung dengan mencoba menyambungkan ke alamat IP reguler host - Anda hanya dapat menghubungi instance mongodb melalui alamat localhost. Dan tentu saja, karena itu adalah host lokal, Anda hanya dapat menghubungi jika dari klien yang menjalankan host yang sama.

Jadi, cara Anda melakukannya sekarang - tunnel koneksi ke server melalui ssh dan kemudian terhubung ke localhost dari sana - adalah cara untuk melakukannya.

Kenster
sumber
itu benar-benar aneh .. cara Anda menggunakan -Ltampaknya bertentangan dengan halaman manual 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.itu secara eksplisit mengatakan itu hostadalah host server jauh .. Anda menggunakannya untuk lokal?
abbood
Saya mencoba perintah yang sama dengan alamat ip .. tetapi hasil yang sama .. btw Saya memperbarui pertanyaan saya untuk menunjukkan hasil saya menjalankan netstat untuk mendengarkan layanan jika itu membantu
abbood
setelah membaca di sini dan di sini ternyata jalan Anda adalah cara yang benar. namun saya punya pertanyaan .. di tautan pertama, pria itu menjelaskan mengapa perintah Anda perlu ->
abbood
1
ssh -L 27017: myserver: 27017 user @ myserver Seharusnya mendengarkan pada port 27017 di localhost, kemudian tunnel melalui koneksi ssh ke server saya dan kemudian tekan myserver pada port 27017. Sekarang, jika myserver hanya mendengarkan localhost, ini tidak akan berfungsi, karena nama host mungkin menunjuk ke alamat IP eksternal. Jika itu masalahnya, coba ssh -L 27017 ini: localhost: 27017 user @ myserver
abbood
dapatkah Anda menjelaskan apa artinya ini? apa arti 'hostname hanya menunjuk ke alamat IP eksternal'?
abbood
0

Saya telah melakukan beberapa konfigurasi pada kotak Ubuntu 18 Vagrant saya agar berhasil menghubungkan MongoDB dari jarak jauh menggunakan Robo 3T GUI. Saya sudah menjelaskan dalam langkah-langkah berikut.

  1. Di server Ubuntu, untuk membuka menjalankan mongo shell:
    $ mongo
    
  2. Di dalam mongo shell, ketik perintah berikut untuk membuat pengguna admin baru.

    > use admin;
    > db.createUser({user:"admin", pwd:"password", roles:[{ role: "root", db: "admin" }]});
    
  3. Secara default mongodb dikonfigurasi untuk memungkinkan koneksi hanya dari localhost (IP 127.0.0.1). Kami perlu mengizinkan koneksi jarak jauh dari alamat ip apa pun. Perubahan berikut hanya boleh dilakukan di server pengembangan Anda. Buka file etc / mongod.conf dan lakukan perubahan berikut.

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

    Juga di opsi mongod.conf file uncomment keamanan yang sama dan tambahkan opsi otorisasi seperti yang ditunjukkan di bawah ini.

    security:
        authorization: enabled
    
  4. Simpan dan keluar dari file mongod.conf dan restart server mongodb.

    $ sudo servcie mongod restart
    
  5. Unduh dan instal alat Robo 3T GUI.

  6. Pada Robo 3T GUI, dalam pengaturan koneksi, Anda perlu melakukan beberapa perubahan seperti yang ditunjukkan pada tangkapan layar di bawah ini.

masukkan deskripsi gambar di sini

Masukkan nama pengguna dan kata sandi database admin mongodb yang telah Anda buat sebelumnya.

masukkan deskripsi gambar di sini

Di sini, saya telah memasukkan kredensial kotakshsh Ubuntu 18 saya ssh.

masukkan deskripsi gambar di sini

Simpan perubahan dan tekan ikon hubungkan untuk melihat apakah koneksi berfungsi dengan baik.

Krishna
sumber