SSH ผ่านหลายโฮสต์โดยใช้ ProxyCommand?


11

ฉันมีรายการใน ~ / .ssh / config บนคอมพิวเตอร์ที่บ้านซึ่งมีลักษณะดังนี้:

host foo bar
    ProxyCommand ssh -x -a -q gateway.example.com nc %h 22

ที่gateway.example.comเป็นเซิร์ฟเวอร์ในที่ทำงานที่เชื่อมต่อกับอินเทอร์เน็ตสาธารณะและเครือข่ายภายใน กล่องเกตเวย์แก้ปัญหา foo และ bar โดยใช้รายการใน / etc / hosts

ปัญหาของฉันคือว่าผมต้องไปถึงกล่องที่มีอยู่ในด้านอื่น ๆ fooของ ลองเรียกมันว่า "baz" โฮสต์ "baz" อยู่ในเครือข่ายส่วนตัวอื่นที่เชื่อมต่อกับ foo แต่ไม่เชื่อมต่อกับ "เกตเวย์"

ฉันได้ลองใช้สิ่งนี้:

host baz
    ProxyCommand ssh -x -a -q gateway/example.com ssh foo nc %h 22

แต่นั่นไม่ได้ผลและฉันก็ค่อนข้างลึก ฉันจะทำสิ่งนี้ได้อย่างไร

ฉันไม่คิดว่ามันจะสำคัญ แต่ฉันทำสิ่งนี้ใน Ubuntu 10

คำตอบ:


13

ง่าย.

สมมติว่าการตั้งค่าเครือข่ายต่อไปนี้:

ตัวอย่างการตั้งค่าเครือข่าย

คุณควรใช้ไฟล์ ~ / .ssh / config ที่มีลักษณะดังนี้:

host foo bar
    ProxyCommand ssh -x -a -q gateway.example.com nc %h 22

host baz
    ProxyCommand ssh -x -a -q foo nc %h 22

ความคิดที่นี่คือว่า SSH ของคุณไม่ทราบวิธีการที่จะได้รับ "foo" ดังนั้น SSH มีจะประสบความสำเร็จ และจากตรงนั้นคุณสามารถ "nc" ถึง baz และหากมีโฮสต์อื่นในเครือข่ายส่วนตัวภายในข้าง "baz" คุณสามารถเพิ่มพวกเขาไปยังบรรทัด "host baz"

สิ่งนี้จะถือว่าโฮสต์ "foo" เป็นเกตเวย์ไปยัง "baz" เช่นเดียวกับ "เกตเวย์" เป็นเกตเวย์ไปยัง "foo"

ชัดเจน?


13

เกี่ยวกับคำตอบของ Ghoti: แทนการใช้ netcat ( "ssh ... nc %h 22") เริ่มต้นด้วย OpenSSH 5.4 "ssh -W %h:22 ..."คุณสามารถทำได้โดยตรงกับ: ด้วยวิธีนี้คุณไม่ต้องกังวลว่าจะติดตั้ง netcat ในตำแหน่งที่ถูกต้องหรือไม่


1
จุดที่ดีขอบคุณ นี่เป็นคำถามเก่า แต่ฉันก็อาจจะอธิบายได้ชัดเจนว่าในขณะที่ฉันใช้ Ubuntu บนเวิร์กสเตชันของฉันเซิร์ฟเวอร์ "เกตเวย์" เป็น Busybox Linux เก่าที่มี OpenSSH 5.3 และเซิร์ฟเวอร์ "foo" และ "baz" เป็น FreeBSD (OpenSSH 5.4) ดังนั้นฉันต้องการ netcat อย่างน้อยหนึ่งตัวอยู่แล้ว
เกรแฮม

@ เกรแฮมไม่มันเป็นเพียงลูกค้าที่ต้องทำงานตั้งแต่ 5.4 ขึ้น-Wไป มันอาศัยรหัสการส่งต่อพอร์ตทางฝั่งเซิร์ฟเวอร์ซึ่งเก่ากว่ามาก
kasperd

1

ใช้ไพรเวตคีย์ที่เก็บไว้ในเครื่องคอมพิวเตอร์ของคุณป้อนคำสั่งนี้โดยใช้ไพรเวตคีย์พา ธ ชื่อผู้ใช้เชลล์และชื่อโฮสต์ / ที่อยู่ IP เปลี่ยนเป็น local-> gateway-> ssh ของคุณต้องการ

โปรดทราบว่า ProxyCommand เป็นที่ต้องการมากกว่า Agent Forwarding เพื่อลดความเสี่ยงของการรับรองความถูกต้องของไพรเวตคีย์ (โดยใช้การเชื่อมต่อเกตเวย์และเอเจนต์ ssh ท้องถิ่นเพื่อประนีประนอมกับโฮสต์เพิ่มเติมราวกับว่านักจี้มีไพรเวทคีย์) เมื่อเกตเวย์ / jumperbox

คำสั่งเดียวกับพร็อกซี SSH ไปยังเซิร์ฟเวอร์ (เก็บคีย์ส่วนตัวไว้ในเครื่องคอมพิวเตอร์):

sudo ssh -i dest_private_key.pem -o "ProxyCommand ssh -W %h:%p -i gate_private_key.pem gate_user@gate_IP" dest_user@dest_IP 

0

นี่คือสิ่งที่ฉันทำเพื่อกระโดดออกจากเครือข่ายที่ได้รับการป้องกันสู่อินเทอร์เน็ต

ฉันใช้แล็ปท็อปของฉันที่จะทำงานร่วมกับรหัสที่สร้าง เนื่องจากการสร้างถูก จำกัด จากการเข้าถึงอินเทอร์เน็ตเพื่อคัดลอก repo จาก github.com ฉันต้องข้ามไปที่กล่องเครื่องมือซึ่งไม่สามารถเข้าถึงอินเทอร์เน็ตได้เช่นกัน แต่มันสามารถเข้าถึงgwซึ่งมีอินเทอร์เน็ต

แบบนี้:

SSH กระโดดแผนผัง

.ssh/configในการสร้างของฉัน:

Host gw
  ProxyCommand ssh -A -W %h:%p toolbox

Host github.com
  ProxyCommand ssh -A -W %h:%p gw

คำอธิบาย

  1. จุดของมุมมองจากการสร้าง ไม่มีการกำหนดค่าบนเซิร์ฟเวอร์อื่น ๆ
  2. ครั้งแรกผมประกาศว่าจะได้รับGWที่คุณต้องทำผ่านทางกล่องเครื่องมือ
  3. ประการที่สองผมประกาศว่าจะได้รับgithub.comคุณจะต้องทำอย่างนั้นผ่านgw ภายใน SSH ใช้กฎก่อนหน้า
  4. ในที่สุดgit clone git@github.com:aRepo/Thereก็ใช้งานได้!

ชัดเจน?

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