Membalikkan Terowongan SSH

8

Saya mencoba untuk meneruskan lalu lintas web dari server jauh ke mesin lokal saya untuk menguji beberapa integrasi API (tropo, paypal, dll). Pada dasarnya, saya mencoba mengatur sesuatu yang mirip dengan apa yang disediakan oleh tunnlr.com.

Saya telah menginisiasi ssh tunnel dengan perintah

$ssh –nNT –R :7777:localhost:5000 user@server

Maka saya dapat melihat server yang sekarang mendengarkan pada port 7777 dengan

user@server:$netstat -ant | grep 7777

tcp        0      0 127.0.0.1:7777          0.0.0.0:*               LISTEN     
tcp6       0      0 ::1:7777                :::*                    LISTEN  


$user@server:curl localhost:7777
Hello from local machine

Jadi itu berfungsi dengan baik. Permintaan curl sebenarnya dilayani dari mesin lokal.

Sekarang, bagaimana cara mengaktifkan server.com:8888 untuk dialihkan melalui terowongan itu?

Saya sudah mencoba menggunakan nginx seperti:

upstream tunnel {
    server 0.0.0.0:7777;
}
server {
  listen 8888;
  server_name server.com;
  location / {
    access_log /var/log/nginx/tunnel-access.log;
    error_log /var/log/nginx/tunnel-error.log;
    proxy_pass http://tunnel;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_redirect off;
  }
}

Dari log kesalahan nginx saya melihat:

[error] 11389#0: *1 connect() failed (111: Connection refused)

Saya sudah mencari cara untuk menggunakan iptables, tetapi belum membuat kemajuan. iptablessepertinya solusi yang lebih elegan daripada menjalankan nginx hanya untuk tunneling. Setiap bantuan sangat dihargai. Terima kasih!

EDIT (menambahkan info server)

Detail server: Ubuntu 10.10 maverick (instalasi standar)

EDIT (opsi nginx)

Opsi nginx bekerja dengan mengubah 0.0.0.0:7777 menjadi 127.0.0.1:7777 seperti yang disarankan @Marcel G. Masih mencari solusi non-nginx.

EDIT (pembaruan pada solusi akhir)

Seperti yang ditunjukkan oleh @sciurus, pastikan itu ada GatewayPorts yesdi file sshd_config Anda. Saya awalnya memiliki baris ini di file konfigurasi, tapi saya perlu mengeluarkan /etc/init.d/ssh reloadbukan restart(setidaknya sepertinya begitu di ubuntu).

Perintah terakhir yang digunakan pada mesin lokal: ssh -nNT -R '*:8888:localhost:5000' user@server

Maka server harus mengindikasikan sedang mendengarkan pada *: 8888 dengan lsof -i tcp:888

user@server:~$ sudo lsof -i tcp:8888
COMMAND   PID     USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
sshd    14711 user    8u  IPv4 1791013      0t0  TCP *:8888 (LISTEN)
sshd    14711 user    9u  IPv6 1791014      0t0  TCP *:8888 (LISTEN)
chris
sumber

Jawaban:

9

Tidak perlu menggunakan nginx.

Dalam konfigurasi daemon ssh Anda (seharusnya / etc / ssh / sshd_config ) atur GatewayPorts ke klien yang ditentukan dan muat ulang. Ini diperlukan agar sistem lain dapat terhubung ke terowongan Anda. Tanpa itu, hanya program yang berjalan di server Anda yang dapat menggunakannya.

Sekarang yang perlu Anda lakukan adalah memodifikasi perintah ssh Anda untuk mendengarkan pada port 8888 bukan port 7777. Ini bisa terlihat seperti

ssh -nNT -R '*:8888:localhost:5000' user@server

Tanda bintang memberitahu sshd untuk mendengarkan port 8888 pada semua antarmuka, bukan hanya antarmuka loopback. Ini akan gagal jika Anda belum mengubah GatewayPorts .

sciurus
sumber
Ok, saya beralih ke saran Anda dan ketika saya curl http://server.com:8888, saya mendapatkan kesalahan curl: (7) couldn't connect to host. Saya masih bisa meringkuk localhost: 8888 dari shell server dan hits mesin lokal.
chris
btw, saya berhenti nginx sebelum mencoba perintah baru yang Anda berikan.
chris
@chris apakah GatewayPorts diaktifkan di sshd_config server Anda? Jika tidak, aktifkan. Setelah memulai terowongan, pastikan ssh mendengarkan lebih dari sekedar alamat loopback; Anda dapat mengganti netstat dan grep dengan lsof -i tcp:8888.
sciurus
Luar biasa! Jadi saya punya GatewayPorts yesdi sshd_config dan saya pikir saya hanya melakukan /etc/init.d/ssh restart, tapi kali ini saya lakukan reload. Saya tidak yakin apa bedanya, tapi sekarang benar-benar berfungsi !! Terima kasih sejuta @sciurus.
chris
1

Saya menjawab sciurus kedua, tetapi jika karena alasan tertentu Anda perlu menggunakan nginx ... tebakan saya adalah definisi hulu Anda rusak.

Cara Anda membuat ssh reverse tunnel hanya mendengarkan di localhost (127.0.0.1 dan :: 1), jadi Anda mungkin ingin mencoba memberikan definisi upstream berikut:

upstream tunnel {
    server 127.0.0.1:7777;
}

Sebagai catatan: Saya belum pernah mengkonfigurasi nginx saya sendiri jadi ini hanya tebakan.

Marcel G
sumber
Terima kasih! Ini sebenarnya membuatnya bekerja. Jika memungkinkan, saya masih lebih suka tidak menggunakan nginx hanya untuk membuat tunneling bekerja, tetapi senang mengetahui bahwa itu mungkin
chris