ssh ผ่านเราเตอร์โดยไม่มีการส่งต่อพอร์ต


11

ฉันมีเซิร์ฟเวอร์ linux และฉันต้องการติดตั้งไว้ในเครือข่ายภายในบ้านหลังเราเตอร์ ฉันต้องการ ssh ไปยังเซิร์ฟเวอร์นี้บางครั้งจากภายนอก แต่ฉันไม่ต้องการตั้งค่าการส่งต่อพอร์ตเนื่องจากฉันไม่สามารถเข้าถึงเราเตอร์ได้และฉันก็ไม่รู้ ip ของเราเตอร์ด้วย

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

ขอบคุณมาก

คำตอบ:


24

สิ่งที่คุณต้องการทำคือ ssh จาก "เซิร์ฟเวอร์ลินุกซ์" ของคุณกับบางสิ่งที่อยู่ด้านนอกเช่น "my_other_server" หรืออย่างอื่นที่เซิร์ฟเวอร์ทั้งสองสามารถเข้าถึงได้

คุณจะใช้การส่งต่อพอร์ตระยะไกล ssh
[user@linux_server]$ ssh -R8022:localhost:22 my_other_server.com
คำอธิบาย: เชื่อมต่อกับ my_other_server และเปิดพอร์ต 8022 ที่นั่นซึ่งจะส่งต่อกลับไปที่พอร์ต 22

จาก my_other_server.com คุณจะสามารถ ssh ไปยัง localhost บนพอร์ต 8022 และให้ทราฟฟิกของคุณถูกส่งต่อไปยัง linux_server piggybacking บน linux_server -> อุโมงค์ my_other_server คำอธิบาย [user@linux_server]$ ssh -p8022 localhost
: เชื่อมต่อกับตัวเองในพอร์ต 8022 ซึ่งถูกส่งต่อไปยัง linux_server

หากคุณมีปัญหากับอุโมงค์ linux_server เริ่มต้น -> my_other_server หลุดออกมาคุณสามารถสร้างสคริปต์เพื่อให้สคริปต์เปิดอยู่ปรับการตั้งค่าแบบ keepalive หรือใช้ autossh


1
ขอบคุณที่ใช้งานได้ดี! ฉันต้องการใช้สคริปต์เพื่อให้มันเปิดอยู่ คำถามอื่นคือถ้าฉันมี 'เซิร์ฟเวอร์ลินุกซ์' 1,000 รายการและมีเพียงหนึ่ง 'my_other_server' ฉันจะสามารถใช้วิธีนี้ได้หรือไม่ ฉันคิดว่าพวกเขาต้องการพอร์ตที่แตกต่างกันและมีวิธีที่ดีกว่าในการทำเช่นนั้นหรือไม่?
Jiechao Li

ดีขึ้นอยู่กับว่า ตอนนี้คุณอยู่ใน linux_server คุณสามารถ ssh ไปที่ linux_server2 และ linux_server3 จากที่นั่นได้หรือไม่ นั่นจะเป็นวิธีที่ง่ายที่สุด ใช่คุณสามารถทำสิ่งนี้ได้หลายครั้งแทนที่จะใช้ 8022 คุณจะใช้ 8023, 8024 ถ้าคุณไปเส้นทางนั้นให้สร้างไฟล์ ~ / .ssh / config บน "my_other_server" ที่มีหมายเลขพอร์ตทั้งหมดดังนั้น คุณเพียงแค่ ssh [นามแฝง] แทน ssh [พอร์ต] localhost นั่นจะกลายเป็นเรื่องยุ่งยาก
MattPark

1
เป็นไปได้ไหมที่จะตั้งค่านี้ด้วยเครื่องจักรเพียงสองเครื่อง? เชื่อมต่อ B กับ A, A กลับไปที่ B ผ่านตัวเองหรือไม่
adamyonk

1
ฉันแค่ทำมัน สามารถยืนยันได้ว่ามันใช้งานได้ \ o /
adamyonk

ใช่มนุษย์ --- เห็นได้ชัดว่าคุณคิดออก คุณสามารถใช้สิ่งที่ต้องการ autosshเปิดไว้
MattPark

3

คุณสามารถใช้ VPN ได้ทุกประเภทเพื่อให้ทำงานได้ แต่จะต้องมีเซิร์ฟเวอร์ที่เซิร์ฟเวอร์ที่เข้าถึงไม่ได้สามารถเข้าถึงได้ จากนั้นคุณสามารถตั้งค่า OpenVPN บนเซิร์ฟเวอร์พีซีของคุณและเซิร์ฟเวอร์ไฟร์วอลล์เปิดใช้client-to-clientงานและคุณทำเสร็จแล้ว http://openvpn.net/howto.html


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

เผง คุณกำหนดค่าเซิร์ฟเวอร์เป็น "เซิร์ฟเวอร์" จากนั้นลูกค้าสองรายที่คุณต้องการเชื่อมต่อเข้าด้วยกันเป็น "ลูกค้า" ในการกำหนดค่า แม้ว่า SSH แบบย้อนกลับที่ระบุไว้ข้างต้นดูเหมือนจะง่ายสำหรับคุณ
นาธาน C

3

คำตอบนี้ขึ้นอยู่กับคำตอบที่ได้รับการยอมรับ แต่การเพิ่มรายละเอียดที่ทำให้ฉันสามารถทำได้ ฉันขอโทษสำหรับคำอธิบายของคนเดินเท้าเนื่องจากนี่ไม่ใช่ความเชี่ยวชาญของฉัน

สมมติว่าคุณมีคอมพิวเตอร์สองเครื่องและA Bคุณต้องการsshจากAถึงBและคุณไม่สามารถทำการส่งต่อพอร์ตใด ๆ ในเราเตอร์ที่เชื่อมต่อกับพวกเขา

ในฐานะที่เป็นรัฐตอบรับที่ยอมรับคุณต้องมีเซิร์ฟเวอร์Sในการทำสิ่งนี้: ในคอมพิวเตอร์Bคุณจะอนุญาตให้มีsshการเชื่อมต่อที่มาจากS; และจากคอมพิวเตอร์ของAคุณจะเข้าถึงอุโมงค์ว่าในการเข้าถึงSB

แต่คุณจะรับเซิร์ฟเวอร์นั้นได้Sอย่างไร ฉันพบserveo(ลิงก์: https://serveo.net/ ) มันใช้ง่ายมาก คุณไม่ต้องติดตั้งอะไรหรือลงทะเบียนและมันฟรี ตามเว็บไซต์ขั้นตอนในการติดตามคือ:

  1. Bคิดว่านามแฝงสำหรับคอมพิวเตอร์ ตัวอย่างเช่นcomputer_B_alias.

  2. ในเครื่องคอมพิวเตอร์ของรันBssh -R computer_B_alias:22:localhost:22 serveo.net

  3. ตอนนี้คุณสามารถเข้าถึงคอมพิวเตอร์Bจากคอมพิวเตอร์Aโดยการดำเนินการต่อไปในเครื่องคอมพิวเตอร์A: ssh -J serveo.net user@computer_B_aliasที่คุณต้องทดแทนโดยใช้ชื่อของผู้ใช้ในคอมพิวเตอร์userB

PS: แน่นอนคุณทำให้จุดที่ 2 Bเป็นงานอัตโนมัติเมื่อเริ่มต้นคอมพิวเตอร์ของคุณ

PSS: ก่อนที่จะลองสิ่งนี้ตรวจสอบให้แน่ใจว่าsshได้ติดตั้งในคอมพิวเตอร์ทั้งสอง สำหรับ Ubuntu sudo apt-get install sshจะทำงาน


1
ขอบคุณนี่คือลิงค์ที่ขาดไปที่ฉันต้องการเช่นกัน ดูเหมือนว่าเซอร์โวโน้ตจะไม่ทำงาน ฉันพบว่าทั้งสองทางเลือกมีประโยชน์มากกว่า: ngrok & localhost.run !
DannyDannyDanny

1

ใช้เวลานานในการตอบคำถามการเปิดใช้งานอาจช่วยให้ใครบางคนที่กำลังมองหาสิ่งเดียวกันอยู่ในขณะนี้

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

เครื่องมือทั้งสองข้างต้นสมมติว่าคุณมีสิทธิ์เข้าถึงเครื่อง linux เพื่อติดตั้งเครื่องลูกข่ายประโยชน์ที่ได้รับคือ:

  • ทั้งสองอย่างให้คุณเข้าถึงเทอร์มินัลโดยใช้เว็บอินเตอร์เฟส
  • คุณไม่จำเป็นต้องใช้โฮสต์การย้อนกลับระดับกลางของคุณเอง
  • ติดตั้งง่ายมาก
  • ทั้งคู่เป็นโอเพ่นซอร์ส

ฉันชอบมากกว่า tmate เพราะคุณสามารถโฮสต์เซิร์ฟเวอร์ tmateบนเซิร์ฟเวอร์ระดับกลางของคุณเอง (สำหรับ reverse ssh) ในขณะที่ teleconsole สามารถเชื่อมต่อกับเซิร์ฟเวอร์ของตนเองเพื่อ reverse ssh เท่านั้น


1

คุณสามารถใช้ngrok กระบวนการนี้ง่าย:

  1. ลงทะเบียนบนเว็บไซต์ของพวกเขา
  2. wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip
  3. เปิดเครื่องรูด ngrok-stable-linux-amd64.zip
  4. ./ngrok authtoken <คีย์เฉพาะจากบัญชี ngrok ของคุณ>
  5. ./ngrok tcp 22
  6. บนพีซีระยะไกลคุณสามารถเชื่อมต่อเช่นนี้:
    1. ssh username@0.tcp.ngrok.io -p 11000
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.