Bagaimana saya tahu jika terowongan ssh saya berhasil dibuat?

21

Saya mengandalkan skrip berikut yang tunnel.shditulis oleh orang lain untuk menjaga terowongan ssh tetap hidup:

#!/bin/bash
export SSH_HOST=tim@server 

if [ ! -f /tmp/.tunnel ] 
then
echo "Creat SSH tunnel"
ssh -f -D 9999 $SSH_HOST "if [ -f ~/.tunnel ]; then rm ~/.tunnel; fi; while [ ! -f ~/.tunnel ]; do echo > /dev/null; done" & 
touch /tmp/.tunnel 
else
echo "Close SSH tunnel"
ssh $SSH_HOST "touch ~/.tunnel" 
rm /tmp/.tunnel 
fi
exit

Untuk membuat terowongan ssh persisten, saya hanya mengeluarkan tunnel.sh. Terowongan tidak akan ditutup sampai saya mengeluarkan tunnel.shlagi.

Saya bertanya-tanya bagaimana saya bisa memverifikasi apakah terowongan ssh memang berhasil dibuat?

Penggunaan utama saya dari terowongan adalah untuk mencetak dokumen ke beberapa printer di LAN yang sama dengan server, dan printer hanya dapat diakses dari dalam LAN. Setelah membuat terowongan, sekarang pencetakan tidak melaporkan masalah, tetapi karena saya tidak ada secara fisik di sana, saya tidak dapat memeriksa apakah dokumen sudah dicetak.

Saya pikir karena saya sekarang di LAN berkat terowongan, IP eksternal saya harus sama dengan server. Tetapi sebenarnya mereka tidak sama (saya menemukannya pada wget -q -O - checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//'). Kenapa ya? Ketika saya terhubung ke beberapa situs web di internet dengan terowongan hidup, bukankah server titik tengah antara saya dan situs web internet dalam koneksi, karena terowongan antara saya dan server?

Tim
sumber

Jawaban:

25

Itu jauh lebih rumit daripada yang seharusnya :-)

Mulai terowongan:

ssh -f -N -D 9999 -M -S /tmp/ssh_tunnel_%h.sock -o ExitOnForwardFailure=yes $SSH_HOST && \
echo "ssh tunnel started successfully" || \
echo "ssh tunnel failed to start"

Hentikan terowongan:

ssh -S /tmp/ssh_tunnel_%h.sock -O exit $SSH_HOST

.

Itu semua yang perlu Anda lakukan. Jika Anda menginginkan detailnya, lewati di bawah ini.

Untuk pertanyaan kedua Anda, IP satu. Tidak, IP Anda tidak berubah. Yang Anda lakukan hanyalah membuat proxy SOCKS melalui host jarak jauh. Sistem Anda tidak secara otomatis menggunakan proxy ini kecuali Anda memberi tahu.

Penjelasan SSH
Argumen untuk memulai terowongan
-f:: Katakan ssh ke latar belakang itu sendiri. Ini hanya akan menjadi latar belakang jika berhasil dijalankan (bekerja sama dengan -oargumen di bawah).
-o ExitOnForwardFailure=yes: Ini memberitahu ssh untuk keluar jika tidak dapat mengatur proxy SOCKS.
-N: Jangan jalankan perintah. Kami hanya ingin melakukan tunnel, tidak melakukan apapun pada remote host.
-D 9999: Proksi SOCKS Anda.
-M: Ini diperlukan untuk argumen -S untuk bekerja di sini.
-S /tmp/ssh_tunnel_%h.sock: Ini memberitahukannya untuk menggunakan /tmp/ssh_tunnel_HOSTNAME.sock untuk soket kontrolnya. The menggunakan nama host dari remote host sebagai bagian dari nama file. -M pilihan mengatakan bahwa kebutuhan ssh untuk mengatur socket ini dan tidak perintah masalah untuk ssh lain sudah mendengarkan pada soket. Anda dapat menggunakan soket ini untuk mengatur terowongan tambahan setelah ssh sudah berjalan. Itu%h

Argumen untuk menghentikan terowongan
-S /tmp/ssh_tunnel_%h.sock:: Ini harus jelas. Namun karena kita tidak mengeluarkan -M, itu artinya ssh harus terhubung ke soket yang sudah ada dan katakan apa yang harus dilakukan daripada melakukan apa pun itu sendiri.
-O exit: Ini adalah bagian dari -S. Kami memberi tahu ssh mendengarkan pada soket untuk keluar.
The $SSH_HOSTmasih diperlukan di sini. Bahkan jika Anda harus menentukan jalur soket absolut, tanpa menggunakan %hnama file, ssh masih ingin host jarak jauh ditentukan. Inilah mengapa saya memasukkan %hargumen. Lebih baik menggunakannya jika ssh akan meminta tuan rumah, dan itu membuat semuanya teratur.

Patrick
sumber
5

Jenis terowongan ini tidak mengubah informasi alamat ip Anda. Yang perlu dilakukan adalah memberi tahu komputer Anda untuk membuka port 9999, dan meneruskan koneksi ke port tersebut ke mesin jarak jauh (tim @ server) melalui koneksi ssh Anda. Cara termudah untuk menguji apakah koneksi sudah habis, adalah dengan telnet ke port yang telah dibuat oleh forward (dalam contoh Anda 9999):

$ telnet localhost 9999
Mencoba server ...
Terhubung ke server.
Karakter melarikan diri adalah '^]'.

Jika Anda menerima "Terhubung ke server." pesan, itu berarti terowongan Anda sudah habis. Jika, sebaliknya Anda mendapatkan: "Tidak dapat terhubung ke host jarak jauh: Sambungan ditolak" terowongan Anda tidak aktif.

Mengenai pertanyaan kedua Anda, untuk peramban Anda, peramban Anda tidak akan menggunakan terowongan, kecuali jika Anda memberi tahu. Di pengaturan jaringan browser, Anda dapat mengonfigurasi pengaturan proxy, dan menentukan localhost: 9999 sebagai proxy socks5 dan kemudian koneksi web Anda harus menggunakan ssh tunnel dan tampaknya berasal dari alamat IP server.

kawan
sumber
+1 Terima kasih! (1) Ketika saya mencetak ke printer di LAN, bagaimana ia tahu pergi ke port 9999 yaitu menggunakan terowongan? Tidak ada yang lain? (2) Apakah ada jenis terowongan yang mengubah informasi alamat ip saya?
Tim
@Tim kemungkinan, printer tertentu telah dikonfigurasikan untuk mencetak ke alamat IP dan port tertentu. Ini tergantung pada bagaimana pengaturan printer Anda. Biasanya, Anda dapat menentukan keduanya saat menentukan printer. Ya, ada beberapa jenis terowongan yang akan memiliki informasi IP sendiri yang terkait dengannya. Secara umum untuk ini Anda membuat antarmuka tun / ketuk terpisah en.wikipedia.org/wiki/TUN/TAP yang akan memiliki alamat IP sendiri yang melekat padanya, dan semua lalu lintas yang keluar dari alamat itu akan tampak berasal dari jaringan yang berbeda .
gabe.
Terima kasih! Dalam preferensi Firefox saya, dalam pengaturan lanjutan -> koneksi ->, saya memilih konfigurasi proxy manual, dan ketik "localhost" untuk HTTP Proxy dan "9999" untuk port-nya. Setelah itu saya tidak dapat terhubung ke situs web apa pun di Firefox. Kenapa ya?
Tim
@Tim itu agak membingungkan ... hal yang tepat untuk ditetapkan adalah: SOCKS Host, dan bukan HTTP Proxy. Saya memiliki masalah yang sama saat pertama kali saya mencoba ini.
gabe.
1

Dalam kasus saya (Google Chrome di Ubuntu 14.10), alamat eksternal saya berubah, setidaknya di dalam browser. Hanya google "Apa alamat IP saya?" dengan dan tanpa koneksi proxy.

Juga, setelah Anda menyiapkan proxy, coba hancurkan terowongan dan lihat apakah Anda masih bisa mendapatkan lalu lintas. Ketika saya melakukan ini, chrome mengembalikan kesalahan "Tidak dapat terhubung ke server proxy".

Cara lain: setelah melakukan tunneling ke host jarak jauh, buat sesi ssh baru dan jalankan tcpdump -A dst port 80. Kemudian telusuri ke beberapa halaman dan Anda akan melihat lalu lintas terkait di terminal.

onlyanegg
sumber