ฉันชอบอธิบายเรื่องนี้ผ่านการสร้างภาพ :-)
คิดว่าการเชื่อมต่อ SSH ของคุณเป็นหลอด หลอดใหญ่ โดยปกติคุณจะต้องผ่านท่อเหล่านี้เพื่อเรียกใช้เชลล์บนคอมพิวเตอร์ระยะไกล เชลล์รันในเทอร์มินัลเสมือน (tty) แต่คุณรู้ส่วนนี้แล้ว
คิดว่าอุโมงค์ของคุณเป็นหลอดภายในหลอด คุณยังคงมีการเชื่อมต่อ SSH ขนาดใหญ่ แต่ตัวเลือก -L หรือ -R ช่วยให้คุณสามารถตั้งค่าหลอดที่เล็กกว่าภายใน
หลอดทุกหลอดมีจุดเริ่มต้นและจุดสิ้นสุด ท่อขนาดใหญ่การเชื่อมต่อ SSH ของคุณเริ่มต้นด้วยไคลเอนต์ SSH ของคุณและจบลงที่เซิร์ฟเวอร์ SSH ที่คุณเชื่อมต่อ หลอดที่เล็กกว่าทั้งหมดมีจุดปลายเดียวกันยกเว้นว่าบทบาทของ "เริ่มต้น" หรือ "ปลาย" จะถูกกำหนดโดยไม่ว่าคุณจะใช้-L
หรือ-R
(ตามลำดับ) เพื่อสร้าง
(คุณยังไม่ได้พูด แต่ฉันจะสมมติว่าเครื่อง "ระยะไกล" ที่คุณพูดถึงซึ่งอยู่หลังไฟร์วอลล์สามารถเข้าถึงอินเทอร์เน็ตโดยใช้ Network Address Translation (NAT) นี่เป็นสิ่งสำคัญ โปรดแก้ไขข้อสมมติฐานนี้หากเป็นเท็จ)
เมื่อคุณสร้างอุโมงค์คุณระบุที่อยู่และพอร์ตที่จะรับและที่อยู่และพอร์ตที่จะส่งมอบ -L
ตัวเลือกบอกอุโมงค์ที่จะตอบในด้านท้องถิ่นของอุโมงค์ (เจ้าภาพที่ทำงานลูกค้าของคุณ) -R
ตัวเลือกบอกอุโมงค์ที่จะตอบในด้านระยะไกล (เซิร์ฟเวอร์ SSH)
ดังนั้น ... เพื่อให้สามารถใช้ SSH จากอินเทอร์เน็ตไปยังเครื่องที่อยู่หลังไฟร์วอลล์คุณต้องมีเครื่องที่ต้องสงสัยเพื่อเปิดการเชื่อมต่อ SSH ไปยังโลกภายนอกและรวมถึง-R
อุโมงค์ที่มี "รายการ" ชี้อยู่ด้าน "ระยะไกล" ของ การเชื่อมต่อของเขา
จากสองรุ่นที่แสดงด้านบนคุณต้องการรุ่นทางด้านขวา
จากโฮสต์ไฟร์วอลล์:
ssh -f -N -T -R22222:localhost:22 yourpublichost.example.com
สิ่งนี้บอกลูกค้าของคุณในการสร้างอุโมงค์ที่มี-R
จุดเข้า emote สิ่งใดก็ตามที่เชื่อมต่อกับพอร์ต 22222 ที่ปลายสุดของอุโมงค์จริง ๆ แล้วจะถึง "localhost พอร์ต 22" โดยที่ "localhost" มาจากมุมมองของจุดออกของอุโมงค์ (เช่นไคลเอนต์ ssh ของคุณ)
ตัวเลือกอื่น ๆ :
-f
บอก ssh ให้แบ็คกราวน์หลังจากที่มันรับรองความถูกต้องแล้วดังนั้นคุณไม่ต้องนั่งทำงานอะไรบนเซิร์ฟเวอร์ระยะไกลเพื่อให้อุโมงค์ยังมีชีวิตอยู่
-N
บอกว่าคุณต้องการการเชื่อมต่อ SSH แต่คุณไม่ต้องการเรียกใช้คำสั่งระยะไกลใด ๆ หากสิ่งที่คุณกำลังสร้างคืออุโมงค์ดังนั้นการรวมตัวเลือกนี้จะช่วยประหยัดทรัพยากร
-T
ปิดใช้งานการจัดสรรแบบหลอกซึ่งเหมาะเพราะคุณไม่ได้พยายามสร้างเชลล์แบบโต้ตอบ
จะมีการท้าทายด้วยรหัสผ่านหากคุณไม่ได้ตั้งค่าคีย์ DSA หรือ RSA สำหรับการลงชื่อเข้าใช้แบบไม่มีรหัสผ่าน
โปรดทราบว่าขอแนะนำอย่างยิ่งให้คุณใช้บัญชีที่มีการโยนทิ้ง (ไม่ใช่การเข้าสู่ระบบของคุณเอง) ที่คุณตั้งค่าสำหรับช่องสัญญาณ / ลูกค้า / เซิร์ฟเวอร์นี้
ตอนนี้จากเชลล์บนyourpublichostให้สร้างการเชื่อมต่อกับโฮสต์ไฟร์วอลล์ผ่านช่องสัญญาณ:
ssh -p 22222 username@localhost
คุณจะได้รับรหัสโฮสต์ที่ท้าทายเนื่องจากคุณอาจไม่เคยเจอโฮสต์นี้มาก่อน จากนั้นคุณจะได้รับรหัสผ่านที่ท้าทายสำหรับusername
บัญชี (เว้นแต่คุณได้ตั้งค่าคีย์สำหรับการเข้าสู่ระบบแบบไม่ใช้รหัสผ่าน)
หากคุณกำลังจะเข้าถึงโฮสต์นี้เป็นประจำคุณสามารถทำให้การเข้าถึงง่ายขึ้นโดยการเพิ่มสองสามบรรทัดใน~/.ssh/config
ไฟล์ของคุณ:
host remotehostname
User remoteusername
Hostname localhost
Port 22222
ปรับremotehostname
และremoteusername
ให้เหมาะสม remoteusername
ฟิลด์จะต้องตรงกับชื่อผู้ใช้ของคุณบนเซิร์ฟเวอร์ระยะไกล แต่remotehostname
สามารถเป็นชื่อโฮสต์ใด ๆ ที่เหมาะสมกับคุณมันไม่ได้มีเพื่อให้ตรงกับสิ่งที่ resolvable
(ในการเปิดเผยปลายทางย้อนกลับของIP ที่ไม่ใช่ localhostโปรดดูที่โพสต์นี้ )