Bagaimana cara membuat ssh tunnel terbuka untuk umum?


174

Nah, merujuk kembali ke pertanyaan ini , saya menjalankan perintah

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

pada Mac. Namun pelabuhan yang sedang digali tidak berfungsi secara publik. Saya menjalankan perintah seperti itu untuk membuatnya sehingga port lokal dapat dibuka di komputer jarak jauh. Dan itu berfungsi ketika membuka port pada localhost di komputer jarak jauh, tetapi ketika saya mencoba mengakses alamat IP publik dari komputer jarak jauh dari komputer lokal saya port sepertinya tidak terbuka. Bagaimana saya membuat terowongan publik pada IP untuk diakses siapa pun?

EDIT: Sepertinya sisi jarak jauh hanya mengikat pada localhost alih-alih ke semua antarmuka.

EDIT 2: Klien adalah Mac OS X 10.6 dan servernya adalah Linux Mint, tetapi keduanya adalah OpenSSH.


Apa arti IP publik? Jika Anda mencoba menghubungkan ke komputer lokal melalui router dan melalui Internet, sebagian besar router tidak akan mengizinkan loopback tersebut.
harrymc

Jawaban:


351

Jika Anda memeriksa halaman manual untuk ssh, Anda akan menemukan bahwa sintaks untuk -Rdibaca:

-R [ bind_address :] port : host : hostport

Ketika bind_addressdihilangkan (seperti pada contoh Anda), port terikat pada antarmuka loopback saja. Untuk membuatnya mengikat ke semua antarmuka, gunakan

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

atau

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

atau

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

Versi pertama mengikat semua antarmuka satu per satu. Versi kedua membuat ikatan IPv4-only umum, yang berarti bahwa port dapat diakses pada semua antarmuka melalui IPv4. Versi ketiga mungkin secara teknis setara dengan yang pertama, tetapi sekali lagi ia hanya membuat satu ikatan ::, yang berarti bahwa port dapat diakses melalui IPv6 secara asli dan melalui IPv4 melalui IPv4 yang dipetakan alamat IPv6 (tidak berfungsi pada Windows, OpenBSD) . (Anda memerlukan tanda kutip karena [::]bisa ditafsirkan sebagai gumpalan sebaliknya.)

Perhatikan bahwa jika Anda menggunakan sshdserver OpenSSH , opsi server GatewayPortsharus diaktifkan (disetel ke yesatau clientspecified) agar ini berfungsi (periksa file /etc/ssh/sshd_configdi server). Jika tidak (nilai default untuk opsi ini adalah no), server akan selalu memaksa port untuk terikat pada antarmuka loopback saja.


12
OH ALLAH SAYA ITU BEKERJA !!!!! Saya telah melakukan persis itu 1 juta kali !! Saya hanya lupa bahwa *dalam bash akan memberikan file dan saya butuhkan\*
Trevor Rudolph

4
Ya, itulah mengapa saya selalu lebih suka 0.0.0.0- ini hanya IPv4, tetapi itu akan melakukan sebagian besar waktu :)
Stefan Seidel

34
GatewayPorts ya menyelesaikan masalah saya.
Sunry

4
GatewayPorts = ya (pada konfigurasi sshd jarak jauh) memperbaikinya juga untuk saya
Phil_1984_

3
"GatewayPorts ya" membuat hari saya, terima kasih @StefanSeidel
karser

37

Sunting:

-g berfungsi untuk port penerusan lokal, tetapi yang Anda inginkan adalah port penerusan terbalik / jauh, yang berbeda.

Yang kamu inginkan adalah ini .

Pada dasarnya, pada example.com, mengatur GatewayPorts=clientspecifieddi /etc/ssh/sshd_config.

--- jawaban sebelumnya (salah) ---

Gunakan opsi -g. Dari halaman manual ssh:

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

sepertinya tidak berfungsi ... itu dimulai tetapi saya tidak dapat terhubung dari jarak jauh
Trevor Rudolph

2
Coba jalankan netstat -elnptdari tty yang terpisah untuk mencari tahu port apa yang terikat ke alamat apa. Tanpa -g, port harus terikat 127.0.0.1:PORT. Dengan -g, itu harus terikat 0.0.0.0:PORT, yang membuatnya dapat diakses dari jarak jauh.
snapshoe


2
GatewayPorts=clientspecifiedatauGatewayPorts clientspecified
Trevor Rudolph

dan apakah saya menambahkannya ke klien atau jarak jauh?
Trevor Rudolph

14

Inilah jawaban saya untuk penyelesaian:

Saya akhirnya menggunakan ssh -R ...untuk tunneling, dan menggunakan socatdi atas itu untuk mengarahkan lalu lintas jaringan ke 127.0.0.1:

terowongan diikat ke 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

Pilihan lain adalah membuat terowongan hanya-lokal di atas itu, tetapi saya menemukan ini jauh lebih lambat

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


Saya suka fakta bahwa saya tidak harus berurusan dengan konfigurasi sshd dan saya bisa melakukan semuanya tanpa sudo. Ditambah lagi saya belajar bahwa socat ada. Terima kasih!
BrutusCat

+ sampai Anda pergi pak baik. Saya mencoba untuk memberitahu ssh untuk mengikat ke 0.0.0.0 tanpa hasil .. kemudian melihat sintaks *, mencobanya, tidak ada dadu. Saya membayangkan itu mungkin semacam fitur keamanan pada sshd config atau sesuatu yang tidak mengizinkannya. Akhirnya melihat posting ini dan socatbekerja dengan luar biasa. Sangat berguna, meletakkan ini di saku punggungku;]
Jaime

10

Anda juga dapat menggunakan maju ganda jika Anda tidak atau dapat mengubah / etc / ssh / sshd_config.

Penerusan pertama ke port sementara (mis. 10080) pada perangkat loopback pada mesin jarak jauh, kemudian gunakan penerusan lokal di sana untuk mengarahkan ulang port 10080 ke 80 pada semua antarmuka:

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

1
Ini sebenarnya berfungsi untuk mem-bypass aturan penerusan!
Michael Schubert

Cintai solusi ini. Solusi hebat ketika Anda tidak ingin mengubah konfigurasi pada mesin
Grezzo

8

Gunakan opsi "gateway port".

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

Untuk menggunakannya, Anda mungkin perlu menambahkan " GatewayPorts yes" ke server Anda /etc/ssh/sshd_config.


Sebenarnya ini berhasil. Apa yang saya lakukan adalah saya menggunakan instance EC2 sebagai penerusan ke server REST saya. Dengan cara ini, saya tidak perlu menempel server saya di DMZ dan saya tidak perlu IP publik. Cukup lucu, dengan instance EC2 pertama yang saya buat, ssh -R remote_port: localhost: port xxx @ ec2xxx bekerja dengan baik tetapi kemudian saya harus membuat instance lain kemudian untuk beberapa alasan dan sejak saat itu, saya selalu mendapatkan: koneksi menolak. Digunakan tcpdump untuk melihat apa yang saya dapatkan dan tidak ada banyak info. -g plus GatewayPorts ya berhasil.
ET

1

Jump hosts adalah tambahan yang cukup baru untuk OpenSSH. Ini membutuhkan akses SSH ke perantara, tetapi harus berfungsi tanpa konfigurasi tambahan.

ssh -J root@example.com remoteuser@localhost -p 8080

Perintah ini menginstruksikan SSH untuk pertama kali terhubung ke root@example.com, dan kemudian, dari mesin itu, untuk memulai koneksi ke port 8080 di localhost(yaitu, port yang disalurkan dari host melompat ke host jarak jauh) di bawah remoteusernama pengguna.


0

Jika Anda ingin meletakkan konfigurasi di dalam Anda ~/.ssh/configdaripada menggunakan parameter baris perintah, Anda dapat mencoba sesuatu seperti

Host REMOTE_HOST_NAME RemoteForward \*:8080 127.0.0.1:80

Ingatlah untuk membuat firewall jarak jauh Anda mengizinkan koneksi ke 8080 dan memastikan bahwa GatewayPortsopsi /etc/ssh/sshdkonfigurasi Anda tidak disetel keno

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.