ssh ถึง private-ip


18

ฉันมีคอมพิวเตอร์ที่มี CentOS (คอมพิวเตอร์ A) ที่มีการกำหนดค่าเช่นเดียวกับ IP ส่วนตัว 10.150.5.141 (มีไฟร์วอลล์ จำกัด ) สามารถเข้าถึงอินเทอร์เน็ตและ ArchLinux VPS (คอมพิวเตอร์ B) ของฉันด้วย ip จริง wxyz

ฉันจะสร้าง pc อีกเครื่อง (คอมพิวเตอร์ C) ที่สามารถเข้าถึงคอมพิวเตอร์ B เพื่อเชื่อมต่อกับคอมพิวเตอร์ A ได้ แต่คอมพิวเตอร์ C ไม่สามารถเชื่อมต่อกับคอมพิวเตอร์ A โดยตรง (เพราะเป็นเครือข่ายส่วนตัวของ A)

ฉันรู้ว่าอุโมงค์สามารถเปิดพอร์ตในเครื่องไปยังคอมพิวเตอร์เครื่องอื่น: พอร์ต แต่จะทำอย่างไรตรงกันข้าม

ฉันต้องการเข้าถึงคอมพิวเตอร์ A โดยใช้sshคอมพิวเตอร์ B แต่คอมพิวเตอร์ B ไม่สามารถเข้าถึงคอมพิวเตอร์ A ได้เนื่องจากเครือข่ายในคอมพิวเตอร์ A มีข้อ จำกัด (สามารถออกไปข้างนอก แต่ไม่สามารถเข้าได้เพราะฉันไม่มีสิทธิ์เข้าถึงเราเตอร์)

ฉันต้องการสิ่งนี้:

ssh -connect-to w.x.y.z:22 -open-port vvv -forward-to 10.150.5.141 -port 22

เพื่อที่ว่าเมื่อฉันssh w.x.y.z:vvvจากคอมพิวเตอร์ C 10.150.5.141:22ก็จะส่งต่อไปยังเครือข่ายส่วนตัว

คำตอบ:


14

สิ่งที่คุณกำลังมองหาเรียกว่าอุโมงค์ย้อนกลับ sshให้มันผ่าน-Rสวิตช์:

-R [bind_address:]port:host:hostport
       Specifies that the given port on the remote (server) host is to 
       be forwarded to the given host and port on the local side.  This 
       works by allocating a socket to listen to port on the remote side, 
       and whenever a connection is made to this port, the connection is
       forwarded over the secure channel, and a connection is made to host 
       port hostport from the local machine.

เมื่อ OP ค้นพบพร้อมคำตอบไวยากรณ์จะเป็นดังนี้:

$ ssh -f -N -R vvv:localhost:22 w.x.y.z

ตัวอย่าง

ผมมี 2 เครื่องคอมพิวเตอร์ในเครือข่ายและlappy remoteyดังนั้นฉันเรียกใช้คำสั่งต่อไปนี้ในlappy:

$ ssh -f -N -R 12345:localhost:22 remotey

ฉันสามารถยืนยันได้ว่ามันใช้งานได้:

$ ps -eaf|grep "[l]ocalhost:22"
saml     27685     1  0 11:10 ?        00:00:00 ssh -f -N -R 12345:localhost:22 remotey

ตอนนี้ถ้าฉันsshแยกไปยังระบบรีโมตremoteyและรันคำสั่งนี้ฉันจะเห็นว่าตอนนี้ยอมรับการเชื่อมต่อบนพอร์ต 12345 บนอินเตอร์เฟสของระบบรีโมต:

$ netstat -an|grep :12345
tcp        0      0 127.0.0.1:12345             0.0.0.0:*                   LISTEN      
tcp        0      0 ::1:12345                   :::*                        LISTEN      

ทดสอบการเชื่อมต่อ

คุณจะเห็นว่าอุโมงค์ ssh กลับทำงานได้ดังต่อไปนี้

  1. ลงชื่อเข้าใช้ remotey

    [user@lappy ~]$ ssh remotey
    
  2. ทดสอบพอร์ตอุโมงค์ย้อนกลับ

    [user@remotey ~]$ ssh -p 12345 localhost
    
  3. ตอนนี้น่าจะกลับมามีความสุข

    user@localhost's password: 
    Last login: Thu Aug  1 17:53:54 2013
    /usr/bin/xauth:  creating new authority file /home/user/.Xauthority
    [user@lappy ~]$ 
    

พอร์ตบนอินเตอร์เฟสนอกเหนือจาก localhost ( lo)?

คุณอาจจะเกาหัวของคุณหากคุณลองใช้คำสั่งแบบนี้และมันไม่ทำงานหรือผูกกับพอร์ตบน localhost ( lo) อินเตอร์เฟส

ตัวอย่างเช่น:

lappy$ ssh -f -N -R remotey:12345:lappy:22 remotey

หมายเหตุ:คำสั่งนี้จะเปิดพอร์ต 12345 @ remotey และทำการเชื่อมต่อช่องสัญญาณใด ๆ กับพอร์ต 22 @ lappy

จากนั้นในระยะไกล:

remotey$ netstat -an|grep 12345
tcp        0      0 127.0.0.1:12345              0.0.0.0:*                   LISTEN   

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

การเปิดใช้งาน GatewayPorts

remotey$ grep GatewayPorts /etc/ssh/sshd_config
#GatewayPorts no

หากต้องการเปิดใช้งานให้แก้ไขไฟล์นี้/etc/ssh/sshd_config:

GatewayPorts clientspecified

และรีสตาร์ทsshd:

remotey$ sudo service sshd restart

ลองอีกครั้งแล้วเราจะเห็นผลหลังจาก:

lappy$ ssh -f -N -R remotey:12345:lappy:22 remotey

และตรวจสอบอีกครั้งในการรีโมทนี้:

remotey$ netstat -anp | grep 12345
tcp        0      0 192.168.1.3:12345           0.0.0.0:*                   LISTEN      9333/sshd

หมายเหตุ:ในข้างต้นเราจะเห็นว่าsshdกระบวนการตอนนี้กำลังฟังบนอินเทอร์เฟซที่มีที่อยู่ IP 192.168.1.3 สำหรับการเชื่อมต่อที่พอร์ต 12345

ทดสอบการเชื่อมต่อ (ส่วนที่สอง)

ขณะนี้มีการเปลี่ยนแปลงการตั้งค่าเมื่อเราทดสอบในครั้งนี้ ความแตกต่างหลักคือเราไม่ต้องเชื่อมต่อกับ localhost!

  1. ลงชื่อเข้าใช้ remotey

    [user@lappy ~]$ ssh remotey
    
  2. ทดสอบการเชื่อมต่อย้อนกลับ

    [user@remotey ~]$ ssh -p 12345 remotey
    
  3. ตอนนี้น่าจะกลับมามีความสุข

    root@remotey's password: 
    Last login: Wed Aug 21 01:49:10 2013 from remotey
    [user@lappy ~]$ 
    

อ้างอิง


มีวิธีสร้างช่องสัญญาณจาก 0.0.0.0:12346 ถึง 127.0.0.1:12345 ในเครื่องเดียวกันหรือไม่?
Kokizzu

1
@ Kokizzu - ฉันลองตั้งค่านี้และฉันได้รับการห่อรอบแกนในสิ่งที่คุณขอ ฉันพบนี้ซึ่งเสียงเหมือนสิ่งที่คุณต้องการanattatechnologies.com/q/2012/08/chaining-ssh-tunnels ฉันจะลองและทำงานมันในคืนนี้อย่าลังเลที่จะเล่นกับมันและแจ้งให้เราทราบหากคุณดำเนินการใด ๆ กับมัน
slm

นั่นไม่ใช่สิ่งที่ฉันหมายถึงฉันต้องการให้มันผูกกับ wxyz: vvv2 แทนที่จะเป็น 127.0.0.1 (บนคอมพิวเตอร์ B) ดังนั้นคนอื่น ๆ ก็สามารถใช้มันได้เช่นกัน ..
Kokizzu

1
@Kokizzu - ดูอัปเดต
slm

2

เนื่องจากคอมพิวเตอร์ B ไม่สามารถเข้าถึงคอมพิวเตอร์ A คุณจะต้องเปิดช่องทางระยะไกลจากคอมพิวเตอร์ A ก่อน

ssh user@computerB -R vvv:localhost:22

ขอบคุณ แต่มีวิธีเปิดพอร์ตบน IP ของ eth0 ที่ส่งต่อไปยังบริการที่รับฟัง localhost หรือไม่
Kokizzu

1

ไม่เป็นไรฉันพบคำตอบ:

ssh -f -N -R vvv:localhost:22 w.x.y.z

จากคอมพิวเตอร์ A

แก้ไข: TL; DR แก้ปัญหาที่ถูกต้อง:

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