ข้อกำหนดพื้นฐานคือ:
- ServerB ต้องสามารถเข้าถึงได้จาก ServerA เท่านั้น คุณไม่ได้เชื่อมต่อโดยตรง
- ServerA ต้องเปิดใช้งาน TCP Tunneling
- ServerA ต้องสามารถเข้าถึงได้จากคุณ
คุณตั้งค่าการเชื่อมต่อกับ ServerB ผ่าน Jumphost (ใน .ssh/config
):
โฮสต์เซิร์ฟเวอร์ ข
ProxyJump ServerA
ซึ่งถือว่าถ้าคุณเข้า เซิร์ฟเวอร์ sshA
คุณจะลงเอยที่ ServerA และหากคุณอยู่ที่ ServerA ให้ป้อน เซิร์ฟเวอร์ sshB
คุณจะจบลงที่ ServerB เช่น. ชื่อ "ServerB" ควรจะแก้ไขได้บน ServerA แต่จะไม่สนใจว่าจะสามารถแก้ไขได้ในฝั่งของคุณหรือไม่ อาจเป็นชื่อโฮสต์หรือ "ทาก" (ชื่อเล่น) ในกรณีหลังนี้ คุณเชื่อมโยงชื่อโฮสต์หรือที่อยู่ IP อีกครั้งใน .ssh/config
:
เซิร์ฟเวอร์โฮสต์ ก
ชื่อโฮสต์ ip.add.re.ss
โฮสต์เซิร์ฟเวอร์ ข
ProxyJump ServerA
ชื่อโฮสต์ host.na.me
คุณยังสามารถระบุชื่อผู้ใช้ที่จะใช้สำหรับพร็อกซีโฮสต์:
เซิร์ฟเวอร์โฮสต์ ก
พร็อกซีผู้ใช้
ชื่อโฮสต์ ip.add.re.ss
โฮสต์เซิร์ฟเวอร์ ข
ProxyJump ServerA
ชื่อโฮสต์ host.na.me
หลังจากนั้นคุณเข้าสู่ เซิร์ฟเวอร์ sshB
. OpenSSH เชื่อมต่อกับ ServerA และใช้พอร์ตสุ่มเพื่อส่งต่อผ่านการเชื่อมต่อนี้ไปยังที่อยู่ของ ServerB พอร์ต 22 การเชื่อมต่อนี้ถูกแยกเป็นพื้นหลัง OpenSSH เชื่อมต่อกับพอร์ตที่ส่งต่อแบบสุ่มนี้ทันที (ไปยัง localhost แต่จริงๆ แล้วตรวจสอบคีย์เข้า .ssh/known_hosts
กับชื่อ "ServerB" และที่อยู่ IP ที่ระบุใน HostName หากมี) ดังนั้นคุณจะลงเอยที่ ServerB โดยตรง หากคุณพิมพ์ว่า "ใคร" ระบบจะบอกว่าคุณเชื่อมต่อจากที่อยู่ ServerA ใครก็ตามที่อยู่ระหว่างคุณกับ ServerA จะไม่มีทางรู้ว่าคุณกำลังคุยกับ ServerB จริงๆ
คุณสามารถใช้ตัวเลือกบรรทัดคำสั่ง SSH ซึ่งจะใช้สำหรับ เซิร์ฟเวอร์B การเชื่อมต่อ (ทำผ่านพอร์ตส่งต่อ) เช่น. ถ้าคุณใช้ ssh -D 12345 user@ServerB
โดยจะเชื่อมต่อกับ ServerA ในฐานะผู้ใช้พร็อกซีโดยมีพอร์ตส่งต่อไปยัง ServerB:22 จากนั้นเชื่อมต่อกับพอร์ตนั้นและรับรองความถูกต้องกับ ServerB ในฐานะผู้ใช้ และจะติดตั้งพร็อกซี SOCKS5 บนพอร์ต 12345ที่อยู่ทางออกสำหรับ SOCKS5 นั้นจะเป็น ServerB เช่น หากคุณใช้พร็อกซีนั้น (เช่น ในเบราว์เซอร์) ฝ่ายที่อยู่ห่างไกลจะเห็นว่าคุณกำลังเชื่อมต่อจากที่อยู่ของ ServerB
คุณสามารถสแต็ค Jumphosts ได้มากขึ้น มันจะใช้ได้เช่นกัน:
โฮสต์เซิร์ฟเวอร์ ข
ProxyJump ServerA
ค. โฮสต์เซิร์ฟเวอร์
เซิร์ฟเวอร์ ProxyJump
และ เซิร์ฟเวอร์ ssh
จะเชื่อมต่อกับ ServerA ก่อนด้วยการส่งต่อพอร์ตไปยัง ServerB:22 จากนั้นจะเชื่อมต่อผ่านการส่งต่อนั้นไปยัง ServerB ด้วยพอร์ตอื่นที่ส่งต่อไปยัง ServerC จากนั้นเชื่อมต่อกับพอร์ตอื่นและคุณจะได้เชลล์ ServerC
สังเกตว่าคุณจะถูกถามรหัสผ่านสำหรับ แต่ละ การเชื่อมต่อ. มันค่อนข้างยุ่งยาก ดีกว่ามีการตั้งค่าและใช้งานการยืนยันตัวตนด้วยคีย์ ssh-ตัวแทน
.