ย้อนกลับพอร์ตอุโมงค์


59

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

ติดอยู่กับความล่าช้านี้และไม่ต้องการผลักดันสิ่งทั้งหมดไปยังเซิร์ฟเวอร์ที่เหมาะสมฉันมีความคิดที่บ้า: ฉันสามารถส่งต่อพอร์ตไปยังเซิร์ฟเวอร์ภายนอกผ่าน SSH ได้หรือไม่

ฉันเคยทำพอร์ตอุโมงค์มาก่อน แต่โดยปกติฉันจะทำถูกวิธี:

  • ฉันเชื่อมต่อกับกล่องระยะไกลและขอให้พอร์ต 12345 แสดงขึ้นบนเครื่องท้องถิ่นของฉันที่พอร์ต 12345
  • ฉันเริ่มอะไรบางอย่างบน P12345 บนเครื่องระยะไกล
  • ฉันสามารถเข้าถึงได้ผ่าน localhost: 12345

สิ่งที่ฉันต้องการจะทำ:

  • เชื่อมต่อกับพีซีระยะไกลและถามว่าP12345 ในเครื่องของตนดึงข้อมูลจาก P12345 ท้องถิ่นของฉัน (ข้ามอุโมงค์)
  • ฉันเริ่มบางสิ่งบางอย่างบนเครื่องคอมพิวเตอร์ของฉันที่ P12345
  • คนอื่น ๆ สามารถเข้าถึงจากระยะไกล: 12345 และดู localhost ของฉัน: 12345

คำตอบ:


96

คำสั่งสำหรับการส่งต่อพอร์ต 80 จากเครื่องโลคัลของคุณ ( localhost) ไปยังรีโมตโฮสต์บนพอร์ต 8000 คือ:

ssh -R 8000:localhost:80 oli@remote-machine

ต้องมีการปรับแต่งเพิ่มเติมบนเซิร์ฟเวอร์ SSH เพิ่มบรรทัดลงใน/etc/ssh/sshd_config:

Match User oli
   GatewayPorts yes

sudo reload sshถัดไปโหลดการตั้งค่าโดยเซิร์ฟเวอร์การดำเนินการ

การตั้งค่าGatewayPorts yesทำให้ SSH เชื่อมโยงพอร์ต 8000 บนที่อยู่ของสัญลักษณ์แทนดังนั้นจึงสามารถใช้งานได้กับที่อยู่สาธารณะของremote-machine( remote-machine:8000)

หากคุณจำเป็นต้องมีตัวเลือกที่ไม่ได้มีผลผูกพันทุกอย่างที่เกี่ยวกับที่อยู่ตัวแทนเปลี่ยนไปGatewayPorts yes GatewayPorts clientspecifiedเนื่องจากsshเชื่อมโยงกับที่อยู่ลูปแบ็คตามค่าเริ่มต้นคุณต้องระบุที่ว่างbind_addressสำหรับผูกที่อยู่ไวด์การ์ด:

ssh -R :8000:localhost:80 oli@remote-machine

:ก่อนที่จะ8000มีผลบังคับใช้ในกรณีที่GatewayPortsมีการตั้งค่าและคุณต้องการที่จะช่วยให้ประชาชนเข้าถึงclientspecifiedremote-machine:8000

ข้อความที่ตัดตอนมาจากคู่มือที่เกี่ยวข้อง:

SSH (1)

-R [bind_address:] พอร์ต: host: hostport
ระบุว่าพอร์ตที่กำหนดในโฮสต์ระยะไกล (เซิร์ฟเวอร์) จะถูกส่งต่อไปยังโฮสต์และพอร์ตที่กำหนดในด้านท้องถิ่น สิ่งนี้ทำงานโดยการจัดสรรซ็อกเก็ตเพื่อฟังพอร์ตทางด้านระยะไกลและเมื่อใดก็ตามที่มีการเชื่อมต่อกับพอร์ตนี้การเชื่อมต่อจะถูกส่งต่อผ่านช่องทางที่ปลอดภัยและทำการเชื่อมต่อกับโฮสต์พอร์ตพอร์ตจากเครื่องท้องถิ่น โดยค่าเริ่มต้นซ็อกเก็ตการฟังบนเซิร์ฟเวอร์จะถูกผูกไว้กับอินเทอร์เฟซย้อนกลับเท่านั้น สิ่งนี้อาจถูกเขียนทับโดยการระบุ bind_address bind_address ว่างเปล่าหรือที่อยู่ '*' บ่งชี้ว่าซ็อกเก็ตระยะไกลควรฟังในทุกอินเตอร์เฟส การระบุ bind_address ระยะไกลจะทำได้ก็ต่อเมื่อตัวเลือก GatewayPorts ของเซิร์ฟเวอร์เปิดใช้งาน (ดู sshd_config (5))

sshd_config (5)

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

ดูสิ่งนี้ด้วย:


7
GatewayPortsเป็นสัญลักษณ์แห่งเวทมนตร์ที่นี่ ฉันชอบที่คุณพบรุ่นที่สามารถอนุญาตให้ฉัน จำกัด เทคนิคที่มีประสิทธิภาพเป็นธรรมนี้สำหรับผู้ใช้บางคน
Oli

1
สิ่งที่ทำให้ฉันสับสนก็คือต้องตั้งค่า GatewayPorts บนเครื่องที่รันคำสั่ง ssh จริงเพื่อเริ่มต้นอุโมงค์ย้อนกลับ (ในเครื่อง) ในใจของฉันมันเป็นตรรกะมากกว่าที่ปลายอีกด้านหนึ่ง (ระยะไกล) จะจัดการกับที่ที่จะยอมรับการเชื่อมต่อจากนั้นเป็นที่ที่คุณเชื่อมต่อและถูกเปลี่ยนเส้นทางจาก เอาทุกเพศทุกวัยฉันจะได้รับรอบที่
Ars Magika

2
@ArsMagika ฉันไม่แน่ใจว่าฉันเข้าใจคุณหรือไม่ ต้องตั้งค่า GatewayPorts บนเซิร์ฟเวอร์ SSH ไม่ใช่ในเครื่องท้องถิ่นที่รันsshคำสั่ง มันกำหนดค่าว่าลูกค้ารายอื่นสามารถสื่อสารกับพอร์ตที่ส่งต่อบนเซิร์ฟเวอร์
Lekensteyn

ข้อเสียของการแก้ปัญหานี้: คุณสูญเสียความสามารถในการระบุที่อยู่ IP ของลูกค้าในบันทึกการเข้าถึงของเว็บเซิร์ฟเวอร์ มีวิธีใดที่จะแก้ปัญหาความรำคาญเช่นกัน?
Twonky

@Twonky หากคุณไม่จำเป็นต้องทราบที่อยู่ IP ที่แน่นอนของลูกค้า (เพียงแค่นั้นเป็นที่อยู่ระยะไกลและไม่ใช่ "localhost") และเซิร์ฟเวอร์ในพื้นที่ของคุณกำลังฟังที่อยู่ตัวแทน (เช่นรับการเชื่อมต่อจากที่อยู่ใด ๆ ) จากนั้นคุณสามารถลองส่งต่อไปยัง-R :8000:127.0.1.1:80(หรือ127.x.x.xที่อยู่อื่น ๆ) ไม่เช่นนั้นคุณจะไม่สามารถเรียนรู้ที่อยู่ IP ระยะไกลได้
Lekensteyn

14

หากเซิร์ฟเวอร์มีGatewayPorts noคุณสามารถบรรลุผลลัพธ์เดียวกันโดยดำเนินการssh -g -L 8001:localhost:8000 oli@remote-machineบนเซิร์ฟเวอร์เมื่อคุณดำเนินการssh -Rคำสั่งบนไคลเอนต์ สิ่งนี้จะทำให้ลูปแบ็คพอร์ต 8000 บนเซิร์ฟเวอร์สามารถเข้าถึงได้บนทุกอินเตอร์เฟสบนพอร์ต 8001

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