วิธีการเชื่อมต่อกับเซิร์ฟเวอร์ mongodb ผ่านทาง ssh tunnel


17

มันง่ายสำหรับฉันที่จะเชื่อมต่อกับเซิร์ฟเวอร์ mysql ระยะไกลของฉันบน AWS โดยใช้ภาคต่อแต่ฉันพยายามทำสิ่งเดียวกันกับ MongoDB

ฉันพยายามตั้งค่า ssh tunnel ผ่าน command line ดังนี้:

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

ฉันยังลองเปลี่ยนโฮสต์ด้วยที่อยู่ IP

ความคิดคือการส่งต่อการเชื่อมต่อ MongoDB ทั้งหมดบนพอร์ต 9999 ไปยังหนึ่งในโฮสต์บนพอร์ต 27,101 .. อย่างไรก็ตามเมื่อฉันเรียกใช้คำสั่ง:

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คำสั่งทำให้คำสั่งนี้ทำงานในพื้นหลัง

คำตอบ:


23

"การ 2 ช่องทาง" และ "ช่อง 3" sshสายจาก sshdเช่นบนเซิร์ฟเวอร์ระยะไกลจะพยายามที่จะเชื่อมต่อกับพอร์ต host.com 27017 เพื่อให้บริการการเชื่อมต่ออุโมงค์และจะได้รับ "การเชื่อมต่อหมดเวลา" ข้อผิดพลาด

กล่าวอีกนัยหนึ่งsshdบนเซิร์ฟเวอร์ระยะไกลไม่สามารถเข้าถึงเป้าหมายของอุโมงค์ได้ เนื่องจากรีโมตโฮสต์นั้นยังเป็นโฮสต์ที่คุณควรจะทำการอุโมงค์ดังนั้นมันยากที่จะพูดว่าปัญหาเฉพาะคืออะไร อาจเป็นได้ว่า "host.com" สามารถแก้ไขได้มากกว่าหนึ่งที่อยู่ คุณกำลังทำการเชื่อมต่อ 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 output มันค่อนข้างชัดเจนว่าทำไมมันไม่ทำงานมาก่อน ส่วน "127.0.0.1:27017" หมายความว่า Mongodb นั้นเชื่อมโยงกับ localhost (127.0.0.1) อินเตอร์เฟสบนโฮสต์ระยะไกลโดยเฉพาะ คุณไม่สามารถติดต่ออินสแตนซ์ของ mongodb นั้นโดยตรงโดยพยายามเชื่อมต่อกับที่อยู่ IP ปกติของโฮสต์ - คุณสามารถติดต่ออินสแตนซ์ mongodb นั้นผ่านทางที่อยู่ localhost เท่านั้น และแน่นอนว่าเป็น localhost คุณสามารถติดต่อได้จากไคลเอนต์ที่ทำงานบนโฮสต์เดียวกันเท่านั้น

ดังนั้นวิธีที่คุณทำตอนนี้ - เชื่อมต่ออุโมงค์กับเซิร์ฟเวอร์ผ่าน ssh แล้วเชื่อมต่อกับ localhost จากที่นั่น - เป็นวิธีที่จะทำ


มันแปลกจริงๆ .. วิธีที่คุณใช้-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 .. แต่ผลลัพธ์เดียวกัน .. btw ฉันอัปเดตคำถามของฉันเพื่อแสดงผลลัพธ์ของฉันที่ใช้ netstat สำหรับการฟังบริการถ้าช่วยได้
abbood

หลังจากอ่านรอบ ๆที่นี่และที่นี่กลายเป็นทางของคุณเป็นวิธีที่ถูกต้อง แต่ฉันมีคำถาม .. ในลิงค์แรกผู้ชายอธิบายว่าทำไมคำสั่งของคุณเป็นสิ่งจำเป็น ->
abbood

1
ssh -L 27017: myserver: 27017 user @ myserver ควรฟังพอร์ต 27017 บน localhost จากนั้น tunnel ผ่านการเชื่อมต่อ ssh ไปยังเซิร์ฟเวอร์ของฉันแล้วกด myserver ที่พอร์ต 27017 ตอนนี้ถ้า myserver กำลังฟังบน localhost เท่านั้นสิ่งนี้จะไม่ ทำงานได้เนื่องจากชื่อโฮสต์อาจชี้ไปยังที่อยู่ IP ภายนอก หากเป็นกรณีนี้ให้ลองใช้ ssh -L 27017: localhost: 27017 user @ myserver
abbood

คุณช่วยอธิบายความหมายของสิ่งนี้ได้ไหม 'ชื่อโฮสต์ชี้เฉพาะที่อยู่ IP ภายนอก' หมายความว่าอะไร
abbood

-1

ฉันได้ทำการกำหนดค่าเล็กน้อยบนกล่อง Ubuntu 18 Vagrant ของฉันเพื่อเชื่อมต่อ MongoDB จากระยะไกลโดยใช้ Robo 3T GUI ได้สำเร็จ ฉันอธิบายในขั้นตอนต่อไปนี้แล้ว

  1. บนเซิร์ฟเวอร์ Ubuntu เพื่อเปิด mongo shell ที่รัน:
    $ mongo
    
  2. ภายใน mongo shell ให้พิมพ์คำสั่งต่อไปนี้เพื่อสร้างผู้ใช้ admin ใหม่

    > use admin;
    > db.createUser({user:"admin", pwd:"password", roles:[{ role: "root", db: "admin" }]});
    
  3. โดยค่าเริ่มต้น mongodb ถูกกำหนดค่าให้อนุญาตการเชื่อมต่อจาก localhost เท่านั้น (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

  6. Robo 3T GUI ในการตั้งค่าการเชื่อมต่อคุณต้องทำการเปลี่ยนแปลงเล็กน้อยตามที่แสดงในภาพหน้าจอด้านล่าง

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนชื่อผู้ใช้และรหัสผ่านของฐานข้อมูลผู้ดูแลระบบ mongodb ที่คุณสร้างไว้ก่อนหน้านี้

ป้อนคำอธิบายรูปภาพที่นี่

ที่นี่ฉันได้ป้อนข้อมูลประจำตัว ssh ของกล่องเครื่องมือ Vaginal ssh ของ Ubuntu 18 แล้ว

ป้อนคำอธิบายรูปภาพที่นี่

บันทึกการเปลี่ยนแปลงและกดไอคอนเชื่อมต่อเพื่อดูว่าการเชื่อมต่อทำงานได้ดีหรือไม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.