คัดลอกข้อมูลผ่านอุโมงค์ SSH บนหลาย ๆ ฮ็อพ


14

เรามีคำถามหลักสองข้อเกี่ยวกับสภาพแวดล้อม:

การพัฒนาและควบคุมคุณภาพ

แต่ละสภาพแวดล้อมมีเซิร์ฟเวอร์สองเครื่อง:

  • กล่องกระโดด
  • แอปพลิเคชันเซิร์ฟเวอร์

ในการเชื่อมต่อกับเซิร์ฟเวอร์แอปพลิเคชันคุณต้องเชื่อมต่อกับกล่องกระโดดก่อนจากนั้น SSH ไปยังเซิร์ฟเวอร์แอปพลิเคชัน

มีกฎอยู่สองสามข้อที่ได้รับความอนุเคราะห์จากไฟร์วอลล์:

  • คุณต้องเชื่อมต่อกับเซิร์ฟเวอร์แอปพลิเคชันผ่านทางกล่องกระโดด
  • แอปพลิเคชันเซิร์ฟเวอร์ไม่สามารถเชื่อมต่อกับกล่องกระโดด
  • กล่องกระโดดอยู่ในเครือข่ายย่อยเดียวกันและสามารถพูดคุยกันได้

ปัญหาของเรา

เรามีจำนวนมากของเนื้อหา (670 GB) ในที่และเราจำเป็นต้องได้รับนี้ไปDEVELOPMENT APPLICATION SERVERQA APPLICATION SERVER

การคัดลอกข้อมูลนี้ไปยังกล่องข้ามไม่ใช่ตัวเลือกเนื่องจากไม่มีเนื้อที่เพียงพอ

ฉันค้นคว้ามาแล้วและเรียนรู้ว่าเราสามารถทำชุดข้อมูลอุโมงค์ผ่านเซิร์ฟเวอร์เหล่านี้เพื่อให้เราสามารถสตรีมข้อมูลจากเซิร์ฟเวอร์แอปหนึ่งไปยังอีกเครื่องโดยตรงผ่านอุโมงค์ อย่างไรก็ตามปัญหาที่เราไม่สามารถเชื่อมต่อกับกล่องกระโดดจากเซิร์ฟเวอร์แอปพลิเคชัน

พวกเรามีตัวเลือกอะไรบ้าง? นี่จะเป็นสถานการณ์ที่สิ้นหวังและเวลาเป็นสิ่งสำคัญ เราไม่มีเวลาดาวน์โหลดข้อมูลและอัปโหลดอีกครั้ง การคัดลอกข้ามเครือข่ายบนเซิร์ฟเวอร์จะไปอย่างรวดเร็วเนื่องจากเป็นการเชื่อมต่อกิกะบิต


2
เมื่อสร้างการเชื่อมต่อแล้วคุณสามารถคัดลอกได้ทั้งวิธี: $ devel_host $ tar -cf - | ssh -t jumbox 'ssh app_serv "tar -xf -"' หรือวิธีอื่นรอบ ๆ tar
Alex_www

เพื่อให้เราสามารถเชื่อมต่อจากกล่อง dev กระโดดไปยังเซิร์ฟเวอร์แอพ dev แต่ไม่ใช่วิธีอื่น หากเรามีการเชื่อมต่อที่จัดตั้งขึ้นเราสามารถคัดลอกวิธีใด วิธีที่ดีที่สุดในการย้ายเนื้อหานี้ไปยังเซิร์ฟเวอร์แอพอื่นโดยไม่บันทึกลงในกล่องกระโดดคืออะไร?
Barry Chapman

"piping" "tar" นั้นเป็นทางออกที่ง่ายที่สุด
Alex_www

คำตอบ:


15

เท่าที่ผ่านมาวิธีที่ง่ายที่สุดคือเพียงแค่คัดลอกผ่าน scp นอกจากนี้ไวยากรณ์นี้ใช้งานได้จริงไม่เหมือนกับคำแนะนำอื่น ๆ

คุณไม่สามารถเอาชนะไวยากรณ์นี้เพื่อความสะดวก อนุญาตให้คุณคัดลอก rsync ซ้ำหรือสิ่งที่คุณต้องการโดยไม่ต้องยุ่งยากในการพิจารณาท่อที่ซับซ้อน ไวยากรณ์นี้มีความชัดเจนอย่างสังหรณ์ใจจะสามารถใช้งานได้ง่ายกว่าโดย Sys Admins ที่ติดตามคุณและไม่ใช้แมวอย่างไร้ประโยชน์

scp -3 devappserver:/path/to/copy/from qaappserver:/path/to/copy/to

จากหน้า scp : -3สำเนาระหว่างโฮสต์ระยะไกลสองเครื่องจะถูกถ่ายโอนผ่านโลคัลโฮสต์ หากไม่มีตัวเลือกนี้ข้อมูลจะถูกคัดลอกโดยตรงระหว่างโฮสต์ระยะไกลสองแห่ง โปรดทราบว่าตัวเลือกนี้จะปิดการใช้งานเครื่องวัดความคืบหน้า

ในตัวอย่างด้านล่าง

  • เวิร์กสเตชันของคุณชื่อ MacBook-Pro
  • Dev Jump Box ชื่อ devjumpserver
  • Dev Application Server ชื่อ devapplicationserver
    • อยู่ในโซน DNS ของ LAN ชื่อ. local
  • QA Jump Box มีชื่อว่า qajumpserver
  • QA Application Server มีชื่อว่า qaapplicationserver
    • อยู่ในโซน LAN DNZ ชื่อ. local
  • เราจะทำการทดสอบสำเนาของไฟล์ 670GB / etc / hosts ;-)
  • สันนิษฐานว่าคุณมีการรับรองความถูกต้องของคีย์สาธารณะ SSH



นี่คือไฟล์ ~ / .ssh / config ที่ตั้งค่าการเข้าถึงโดยตรงจากเวิร์กสเตชันของคุณไปยังเซิร์ฟเวอร์แอปพลิเคชันผ่านการข้ามที่เหมาะสม (aka bastion เซิร์ฟเวอร์)

MacBook-Pro: ~ barrychapman $ cat ~ / .ssh / config
โฮสต์ *
  ServerAliveInterval 60
โฮสต์ devapplicationsever
  HostName devapplicationserver.local
  ProxyCommand ssh -i ~ / .ssh / id_rsa barrychapman@devjumpserver.example.com -W% ​​h:% p
  ผู้ใช้ barrychapman
โฮสต์ qaapplicationserver
  ชื่อโฮสต์ qaapplicationserver.local
  ProxyCommand ssh -i ~ / .ssh / id_rsa barrychapman@qajumpserver.example.com -W% ​​h:% p
  ผู้ใช้ barrychapman

MacBook-Pro: ~ barrychapman $



การทดสอบการมีไฟล์บนเซิร์ฟเวอร์เป้าหมายจะไม่อยู่ที่นั่น

MacBook-Pro: ~ barrychapman $ ssh qaapplicationserver ls / tmp / hosts
ls: ไม่สามารถเข้าถึง / tmp / hosts: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว
ฆ่าโดยสัญญาณ 1
MacBook-Pro: ~ barrychapman $



ทีนี้ลองคัดลอกไฟล์จากเซิร์ฟเวอร์ Dev Application ไปยัง QA Application ผ่านเวิร์กสเตชันของคุณ

MacBook-Pro: ~ barrychapman $ scp -3 devapplicationserver: / etc / โฮสต์ qaapplicationserver: / tmp /
ฆ่าโดยสัญญาณ 1
ฆ่าโดยสัญญาณ 1
MacBook-Pro: ~ barrychapman $



ทีนี้ลองตรวจสอบว่ามีไฟล์ที่ถูกคัดลอกไว้ใน QA Application Server หรือไม่ มันจะมีเวลานี้

MacBook-Pro: ~ barrychapman $ ssh qaapplicationserver ls / tmp / hosts
/ tmp / hosts
ฆ่าโดยสัญญาณ 1
MacBook-Pro: ~ barrychapman $ 

บันทึก

เมื่อปิดการเชื่อมต่อ ProxyCommand คุณจะเห็นข้อความเตือน "ฆ่าโดยสัญญาณ 1" นี่คือ SSH ที่ขาดการเชื่อมต่อ ProxyCommand และไม่มีอะไรน่าตกใจ คุณสามารถกำจัดมันได้โดยเพิ่มLogLevel Quietไปที่ bastion host config stanza ของคุณ


ไชโยนี่ช่วยแก้ปัญหาของเราได้ สุขสันต์วันคริสต์มาส!
Barry Chapman

คุณหมายถึงอะไรโดย "bastion host config stanza" ?? @BraveNewCurrency หรือไม่
Andrew Wolfe

ฉันพิจารณาแต่ละบรรทัด "โฮสต์" และการตั้งค่าภายใต้เป็นบท (เช่นในบทกวี) ถ้าคุณเพิ่ม "LogLevel Quiet" ภายใต้บรรทัด "Host" ป้อมปราการของคุณมันจะใช้กับโฮสต์นั้นเท่านั้น
BraveNewCurrency

8

ท่อ!

หากอินเทอร์เน็ตเป็นชุดของท่อ Unix เป็นชุดของท่อ - สิ่งที่ชอบ:

cat ginormous-file | ssh user@host1 "cat | ssh user@host2 \"cat >out\" "

ควรทำงาน.

หากคุณจำเป็นต้องสำรวจเจ้าภาพมากขึ้นเพิ่มท่อมากขึ้น (และชั้นที่ซ้อนกันมากขึ้นของ\ใบเสนอราคา -escaped) ตามความจำเป็น (โปรดทราบว่าหากท่อส่ง / การหลบหนีซับซ้อนมากคุณต้องวาดไดอะแกรมหรือรีสอร์ตเพื่อนับนิ้วของคุณเพื่อกำหนดจำนวนครั้งที่คุณต้องหลบหนีเป็นสองเท่าอาจถึงเวลาที่ต้องยอมรับความพ่ายแพ้และตั้งค่า VPN ที่เหมาะสม !)


1
ในฐานะที่เป็นAlex_www ชี้ให้เห็นในความคิดเห็นของเขาหากคุณไม่ต้องการไฟล์ระดับกลางสำหรับสิ่งใดคุณก็สามารถส่งออกtarไปรอบ ๆ (นอกจากนี้ในที่คุณไม่จำเป็นต้องcatในช่วงกลางของท่อ - sshมีความสุขที่จะกิน stdin และถ่ายทอดมัน. catเพียงแค่ทำให้ฉันรู้สึกดีขึ้นและเป็นตัวยึดสำหรับคำสั่งที่มีประโยชน์อื่น ๆ ที่คุณอาจต้องการที่จะใช้เช่นtee.)
voretaq7

ฉันคิดว่าปัญหาของ OP คือไม่มีเครื่องที่ทั้งคู่มีข้อมูลและสามารถทำการเชื่อมต่อได้และไม่มีเครื่องใดเครื่องหนึ่งที่สามารถเห็นทุกอย่างและทุกคน (ทำหน้าที่เป็นตัวเชื่อมต่อสำหรับท่อทั้งหมด)
MadHatter

1
@MadHatter หากเป็นกรณีที่การรวมกันของสองคำตอบของเราจะใช้งานได้ (เชื่อมต่อกับเซิร์ฟเวอร์ dev ส่งต่อพอร์ตกลับไปที่พอร์ต SSH ของเซิร์ฟเวอร์กระโดดจากนั้นเรียกใช้ขั้นตอน SSH ผ่านพอร์ตนั้น) แน่นอนว่านี่เป็นวิธีการแก้ปัญหาที่น่าขยะแขยงมากขึ้นเรื่อย ๆ จนถึงจุดที่ผู้คนจะเริ่มประท้วงนอกสำนักงานของคุณด้วยสัญญาณขนาดใหญ่ที่พูดถึงVPN! NOW!พวกเขา ...
voretaq7

ทำไมถึงใช่. ใช่พวกเขาจะ หวังว่า!
MadHatter

การทำเช่นนี้หมายความว่าเซิร์ฟเวอร์ระดับกลาง (ในกรณีนี้user@host1) จะมีที่cat ginormous-fileเก็บข้อมูลเต็มหรือไม่? หรือข้อมูลเพิ่งส่งโดยตรงไปยังuser@host2? หรือมันเป็นกระแสอย่างใด มีtarความเกี่ยวข้องกับสิ่งนี้อย่างไร ฉันเดาว่ามันเกี่ยวข้องกับคำถามที่สองถึงคำถามสุดท้ายที่ฉันถาม คำถามเหล่านี้ไม่มีคำถามเชิงโวหาร btw ...
hello_there_andy

1

หากฉันเข้าใจอย่างถูกต้องคุณมีเซิร์ฟเวอร์กระโดดสองเครื่อง (jump-qa และ jump-dev) ปกป้องเซิร์ฟเวอร์แอปสองเครื่อง (app-qa และ app-dev); เซิร์ฟเวอร์กระโดดสามารถ ssh ซึ่งกันและกัน; ไม่มีกล่องอื่นนอกเหนือจากเซิร์ฟเวอร์กระโดดที่เกี่ยวข้องสามารถ ssh ไปยังเซิร์ฟเวอร์แอพที่เกี่ยวข้อง เซิร์ฟเวอร์แอปสามารถ ssh ถึง noone ไฟล์จะถูกโอนจาก app-dev ไปยัง app-qa เซิร์ฟเวอร์กระโดดทั้งสองไม่มีพื้นที่สำหรับการคัดลอกข้อมูลชั่วคราว

คุณสามารถแก้ปัญหานี้ได้ด้วย ssh tunneling เราตั้งค่าการเชื่อมต่อกับเซิร์ฟเวอร์แอประยะไกลหนึ่งตัวถืออุโมงค์ระยะไกลที่เชื่อมต่อกลับไปยังพอร์ตที่ไม่ได้ใช้บนเซิร์ฟเวอร์กระโดด เราตั้งค่าการเชื่อมต่อที่สองจากเซิร์ฟเวอร์กระโดดหนึ่งไปยังเซิร์ฟเวอร์กระโดดอื่นถืออุโมงค์ที่หยิบปลายห้อยต่องแต่งของพอร์ตส่งต่อจากระยะไกลจากอุโมงค์หนึ่งและส่งไปยังพอร์ต ssh ของเซิร์ฟเวอร์แอปอื่น

ตั้งค่าอุโมงค์ (แต่ละคำสั่งเหล่านี้จะต้องทำงานในหน้าต่างแยกต่างหากjump-qa):

jump-qa% ssh app-qa -R 2345:localhost:2346
jump-qa% ssh jump-dev -L 2346:app-dev:22

คุณควรพบว่าใน app-qa คุณสามารถทำได้telnet localhost 2345และรับแบนเนอร์ ssh ของ app-dev จากนั้นคุณสามารถคัดลอกไฟล์ข้อมูล:

app-qa% scp -P 2345 localhost:/path/on/app-dev/data.dat data.dat

มีกล่องกระโดดสองกล่อง - หนึ่งอยู่ด้านหน้าของเซิร์ฟเวอร์แอป QA และอีกหนึ่งอยู่ข้างหน้าเซิร์ฟเวอร์แอป DEV กล่องกระโดดสามารถสื่อสารกับแต่ละอื่น ๆ
Barry Chapman

ไคลเอนต์มีพื้นที่สำหรับสำเนาชั่วคราวหรือไม่?
MadHatter

ไม่มีที่ว่างไม่เพียงพอ
Barry Chapman

เมื่อคุณพูดว่าลูกค้าคุณหมายถึงเซิร์ฟเวอร์ใด
Barry Chapman

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