วิธีการตั้งค่า ssh tunnel เพื่อส่งต่อ ssh?


13

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

ฉันเหนื่อย:

ssh -N user@my_server -L 22/localhost/8090

แต่มันบอกว่า:

bind: Address already in use
channel_setup_fwd_listener: cannot listen to port: 22
Could not request local forwarding.

คำตอบ:


18

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

ฉันคิดว่าสิ่งที่คุณกำลังมองหาคือการส่งต่อระยะไกล การแทนที่-L 22:localhost:8090ด้วย-R 8090:localhost:22จะบอกให้รีโมตโฮสต์รับฟังพอร์ต 8090 และส่งต่อคำขอไปยังเซิร์ฟเวอร์ SSH ของคุณ

หากคุณออกจากการเชื่อมต่อเพื่อให้คุณสามารถเข้าใช้งานได้ในภายหลังจากไซต์ระยะไกลคุณจะต้องแน่ใจว่าการเชื่อมต่อไม่หมดเวลาเนื่องจากไม่มีการใช้งานโดยเพิ่มตัวเลือกที่เกี่ยวข้อง ( -o TCPKeepAlive=yesหรือ-o ServerAliveInterval=30)

ดังนั้นคุณจะจบลงด้วยสิ่งที่ชอบ:

ssh -N user@my_server -R 8090:localhost:22 -o ServerAliveInterval=30

นอกจากนี้หากหนึ่งในเครือข่าย hops ระหว่างคุณและเซิร์ฟเวอร์หยุดทำงาน ณ จุดใด ๆ การเชื่อมต่อจะลดลงแม้จะมีตัวเลือก KeepAlive ที่คุณระบุดังนั้นคุณอาจต้องการเพิ่มคำสั่งนี้ใน inittab หรือดูแพคเกจ daemontools หรือ distro's เทียบเท่าเพื่อให้มันเริ่มต้นเสมอในการบูตและรีสตาร์ทเมื่อออกจากเหตุผลอื่น ๆ แล้วปิดระบบ (หรือคุณสามารถเรียกใช้จากเชลล์สคริปต์ที่ลูปไม่ จำกัด แต่ init หรือ daemontools เป็นโซลูชั่นที่สะอาดกว่า)


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

3
หากคุณเพิ่มที่อยู่สาธารณะของเซิร์ฟเวอร์หรือไวด์การ์ดลงในนิยามการส่งต่อพอร์ต (-R 111.222.333.444:8090:localhost:22 หรือ -R *: 8090: localhost: 22) แต่นั่นอาจใช้ได้ สามารถปิดการใช้งานบนเซิร์ฟเวอร์ หากเซิร์ฟเวอร์เป็นเซิร์ฟเวอร์ที่คุณควบคุมตรวจสอบให้แน่ใจว่าเปิดใช้งานตัวเลือก GatewayPorts ใน sshd_config
David Spillett

ฉันเขียนสคริปต์ที่ช่วยให้ฉันทำ ssh tunneling คุณสามารถตรวจสอบได้ที่: github.com/gdbtek/ssh-tunneling
Nam Nguyen

การเพิ่มGatewayPorts Yesลงใน sshd_config ของฉันช่วยให้ฉันเปิดพอร์ตสู่สาธารณะ
อดัม F

8

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

# netstat -lep --tcp

นี่จะแสดงรายการซ็อกเก็ตการฟังทั้งหมดดังนั้นหากพอร์ตไม่อยู่ในรายการแสดงว่าไม่มีค่าใช้จ่าย


3

ฉันใช้ lsof -i: คำสั่ง PortNumber เพื่อตรวจสอบว่าพอร์ตว่างหรือไม่:

# lsof -i :2272

ถ้าพอร์ตว่างคุณจะไม่เห็นผลลัพธ์ใด ๆ

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