วิธีการเปิด ssh tunnel สู่สาธารณะ?


147

ดีอ้างกลับไป นี้ คำถามฉันกำลังรันคำสั่ง

ssh -R 8080:localhost:80 -N root@example.com

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

แก้ไข: ดูเหมือนว่าด้านระยะไกลผูกเฉพาะใน localhost แทนการเชื่อมต่อทั้งหมด

แก้ไข 2: ไคลเอ็นต์คือ Mac OS X 10.6 และเซิร์ฟเวอร์คือ Linux Mint แต่ทั้งคู่เป็น OpenSSH


IP สาธารณะหมายถึงอะไร หากคุณพยายามเชื่อมต่อกับเครื่องคอมพิวเตอร์ผ่านเราเตอร์และผ่านอินเทอร์เน็ตเราเตอร์ส่วนใหญ่จะไม่อนุญาตให้ใช้ลูปแบ็ค
harrymc

คำตอบ:


305

หากคุณตรวจสอบหน้าคนสำหรับ ssh คุณจะพบว่าไวยากรณ์สำหรับ -R อ่าน:

-R [ bind_address :]  ท่าเรือ :  เจ้าภาพ :  hostport 

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

ssh -R \*:8080:localhost:80 -N root@example.com

หรือ

ssh -R 0.0.0.0:8080:localhost:80 -N root@example.com

หรือ

ssh -R "[::]:8080:localhost:80" -N root@example.com

เวอร์ชันแรกผูกกับอินเตอร์เฟสทั้งหมดทีละรายการ เวอร์ชันที่สองสร้างการเชื่อม IPv4 เท่านั้นโดยทั่วไปซึ่งหมายความว่าพอร์ตนั้นสามารถเข้าถึงได้บนทุกอินเตอร์เฟสผ่าน IPv4 รุ่นที่สามอาจเทียบเท่ากับรุ่นแรกในทางเทคนิค แต่อีกครั้งจะสร้างเพียงผูกเดียว ::ซึ่งหมายความว่าพอร์ตนั้นสามารถเข้าถึงได้ผ่าน IPv6 อย่างเป็นทางและผ่าน IPv4 ถึง ที่อยู่ IPv6 ที่แมป IPv4 (ไม่ทำงานบน Windows, OpenBSD) (คุณต้องการคำพูดเพราะ [::] อาจตีความได้ว่าเป็นแบบกลม)

สังเกตได้ว่า ถ้าคุณใช้ OpenSSH sshd เซิร์ฟเวอร์ของเซิร์ฟเวอร์ GatewayPorts ต้องเปิดใช้งานตัวเลือก (ตั้งค่าให้ yes หรือ clientspecified ) เพื่อให้ใช้งานได้ (ตรวจสอบไฟล์ /etc/ssh/sshd_config บนเซิร์ฟเวอร์) มิฉะนั้น (ค่าเริ่มต้นสำหรับตัวเลือกนี้คือ no ) เซิร์ฟเวอร์จะบังคับให้พอร์ตถูกผูกไว้บนส่วนต่อประสานย้อนกลับเท่านั้น


10
โอ้พระเจ้าของฉันมันทำงาน !!!!! ฉันทำอย่างนั้นไปแล้ว 1 ล้านครั้ง !! ฉันลืมไปเลย * ในทุบตีจะให้ไฟล์และฉันต้องการ \*
Trevor Rudolph

3
ใช่นั่นคือเหตุผลที่ฉันชอบเสมอ 0.0.0.0 - เป็น IPv4 เท่านั้น แต่จะทำเวลาส่วนใหญ่ :)
Stefan Seidel

23
GatewayPorts ใช่แก้ไขปัญหาของฉัน
Sunry

4
GatewayPorts = ใช่ (ในการกำหนดค่า sshd ระยะไกล) แก้ไขให้ฉันด้วย
Phil_1984_

3
"GatewayPorts ใช่" ทำให้วันของฉันขอบคุณ @StefanSeidel
karser

35

แก้ไข:

-g ใช้งานได้กับพอร์ตที่ฟอร์เวิร์ดภายใน แต่สิ่งที่คุณต้องการคือพอร์ตที่ส่งต่อแบบย้อนกลับ / ระยะไกลซึ่งต่าง

สิ่งที่คุณต้องการคือ นี้ .

เป็นหลักบน example.comชุด GatewayPorts=clientspecified ใน /etc/ssh/sshd_config.

--- คำตอบก่อนหน้า (ไม่ถูกต้อง) ---

ใช้ตัวเลือก -g จากหน้าคนของ ssh:

-g     Allows remote hosts to connect to local forwarded ports.

ดูเหมือนจะไม่ทำงาน ... มันเริ่มต้นขึ้น แต่ฉันไม่สามารถเชื่อมต่อจากระยะไกลได้
Trevor Rudolph

1
ลองวิ่ง netstat -elnpt จาก tty แยกเพื่อหาว่าพอร์ตใดถูกผูกไว้กับที่อยู่ใด ไม่มี -gพอร์ตควรถูกผูกไว้กับ 127.0.0.1:PORT. กับ -gมันควรจะถูกผูกไว้กับ 0.0.0.0:PORTซึ่งทำให้สามารถเข้าถึงได้จากระยะไกล
snapshoe


1
GatewayPorts=clientspecified หรือ GatewayPorts clientspecified
Trevor Rudolph

และฉันจะเพิ่มที่ลูกค้าหรือระยะไกล?
Trevor Rudolph

10

นี่คือคำตอบของฉันให้เสร็จสมบูรณ์:

ฉันสิ้นสุดการใช้ ssh -R ... สำหรับการขุดอุโมงค์และการใช้ socat ด้านบนของสิ่งนั้นสำหรับเปลี่ยนเส้นทางเครือข่ายไปยัง 127.0.0.1:

อุโมงค์ผูกติดกับ 127.0.0.1: ssh -R mitm:9999:<my.ip>:8084 me@mitm

socat: mitm$ socat TCP-LISTEN:9090,fork TCP:127.0.0.1:9999

ตัวเลือกอื่นคือทำช่องสัญญาณภายในเครื่องเท่านั้น แต่ฉันพบสิ่งนี้ มาก ช้าลง

mitm$ ssh -L<mitm.ip.address>:9090:localhost:9999 localhost


ฉันชอบความจริงที่ว่าฉันไม่ต้องจัดการกับการกำหนดค่า sshd และฉันสามารถทำได้ทั้งหมดโดยไม่ต้อง sudo นอกจากนี้ฉันได้เรียนรู้ว่ามี socat อยู่ ขอบคุณ!
BrutusCat

8

ใช้ตัวเลือก "เกตเวย์พอร์ต"

ssh -g -R REMOTE_PORT:HOST:PORT ...

ในการใช้งานคุณอาจต้องเพิ่ม " GatewayPorts yes "ไปยังเซิร์ฟเวอร์ของคุณ /etc/ssh/sshd_config.


อันนี้ใช้งานได้จริง สิ่งที่ฉันทำคือฉันใช้อินสแตนซ์ EC2 เป็นตัวส่งต่อไปยังเซิร์ฟเวอร์ REST ของฉัน ด้วยวิธีนี้ฉันไม่จำเป็นต้องติดเซิร์ฟเวอร์ของฉันใน DMZ และฉันไม่ต้องการ IP สาธารณะ ตลกพอมีอินสแตนซ์ EC2 แรกที่ฉันสร้าง ssh -R remote_port: localhost: port xxx @ ec2xxx ทำงานได้ดี แต่จากนั้นฉันต้องสร้างอินสแตนซ์อื่นในภายหลังด้วยเหตุผลบางอย่างและจากจุดนั้นฉันได้รับเสมอ: การเชื่อมต่อ ปฏิเสธ. ใช้ tcpdump เพื่อดูสิ่งที่ฉันได้รับและไม่มีข้อมูลมากนัก -g บวก GatewayPort ใช่ทำเคล็ดลับ
E.T

8

นอกจากนี้คุณยังสามารถใช้การฟอร์เวิร์ดสองครั้งหากคุณไม่ต้องการหรือสามารถเปลี่ยน / etc / ssh / sshd_config

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

ssh -A -R 10080:localhost_or_machine_from:80 user@remote.tld "ssh -g -N -L 80:localhost:10080 localhost"

1
ใช้งานได้จริงเพื่อข้ามกฎการส่งต่อ!
Michael Schubert

รักทางออกนี้ วิธีแก้ปัญหาที่ยอดเยี่ยมเมื่อคุณไม่ต้องการเปลี่ยนแปลงการกำหนดค่าบนเครื่อง
Grezzo

0

หากคุณต้องการที่จะนำการกำหนดค่าในคุณ ~/.ssh/config แทนที่จะใช้พารามิเตอร์บรรทัดคำสั่งคุณสามารถลองได้เช่นกัน

Host REMOTE_HOST_NAME RemoteForward \*:8080 127.0.0.1:80

อย่าลืมว่าคุณมีไฟร์วอลล์ของรีโมตโฮสต์ให้คุณเชื่อมต่อกับ 8080 และตรวจสอบให้แน่ใจว่า GatewayPorts ตัวเลือกของคุณ /etc/ssh/sshd config ไม่ได้ถูกตั้งค่าเป็น no

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