Bagaimana saya bisa melakukan tunnel semua lalu lintas jaringan saya melalui SSH?

117

Setiap kali saya menggunakan internet dari lokasi yang tidak aman (seperti wifi publik) saya suka menggunakan ssh tunnel ( ssh -D port host) untuk memastikan lalu lintas saya tidak dapat diendus. Sayangnya, tampaknya ada banyak aplikasi yang tidak menyediakan cara untuk menentukan proxy (Flash adalah salah satu contoh utama).

Rasanya seperti harus ada cara untuk menggunakan terowongan untuk semua lalu lintas jaringan dari komputer saya, tapi saya sama sekali tidak tahu bagaimana melakukan ini. Bantuan apa pun akan sangat dihargai.

Jeremy Banks
sumber
16
Tentu saja Anda tidak dapat terowongan secara harfiah SEMUA lalu lintas Anda melalui ssh, karena itu berarti menggali ssh sendiri, tetapi kami tahu apa yang Anda maksudkan. :)
CarlF
1
ini adalah ide yang bagus tetapi Anda hanya terlindungi antara komputer dan titik akhir ssh Anda. setelah itu, lalu lintas Anda di hapus (kecuali jika tidak dilindungi, mis. SSL). memang, itu jauh lebih mungkin untuk melewati kawat, tetapi masih ... Anda tidak bisa benar-benar percaya kabel yang tidak Anda kendalikan.
quack quixote
6
Tetapi ketika Anda keluar di Internet yang luas, Anda memiliki keamanan untuk menjadi salah satu dari miliaran paket, bukan? Ketika Anda terhubung ke Wi-Fi publik, Anda adalah salah satu dari mungkin 3 koneksi, Anda dapat diidentifikasi secara pribadi, dll.
endolith

Jawaban:

62

Untuk melakukan apa yang Anda inginkan, saya sarankan sshuttle .

Anda menggunakannya seperti ini:

./sshuttle -r username@sshserver 0.0.0.0/0 -vv

Ini akan menyalurkan semua lalu lintas TCP Anda secara otomatis untuk Anda. Anda dapat menambahkan --dnsargumen agar terowongan juga mengarahkan lalu lintas DNS Anda. Server jarak jauh hanya perlu menginstal Python.

Jika Anda hanya ingin melakukan tunnel program tertentu, saya akan merekomendasikan rantai proxy .

Setelah terinstal, jalankan proxy ssh socks Anda seperti ini:

ssh -fND 127.0.0.1:<local port> username@sshserver

Ini akan memulai mendengarkan proxy "SOCKS" di <port lokal>.

Kemudian edit /etc/proxychains.conf untuk menunjuk ke port yang sama dengan <port lokal>.

Akhirnya mulailah program Anda yang Anda inginkan seperti proxy-ed:

proxychains <program name>

Seharusnya berfungsi. Namun, beberapa program akan mengalami kesulitan bekerja dengan Proxy Chains. Juga perlu diingat, bahwa dengan Firefox, Anda harus mengubah item tambahan di bawah about: config untuk memaksanya melakukan pencarian DNS melalui proxy alih-alih memintasinya.

Sebagai catatan tambahan, di browser web. Jika mereka mendukung proxy kaus kaki, Anda tidak perlu melakukan apa pun tambahan untuk membuatnya menggunakan terowongan ssh yang disebutkan di atas, cukup masukkan 127.0.0.1 untuk server proxy SOCKS dan <port lokal> untuk port proxy.

EDIT 3/29/16

Karena posting ini masih melihat beberapa pembaruan, saya pikir saya akan memperbaruinya. Proxychains masih di sebagian besar repo Linux dan masih berfungsi di Linux. Namun, proyek ini secara efektif ditinggalkan dan tidak berfungsi di OSX. Untuk Linux atau OSX, saya sangat menyarankan untuk meningkatkan ke garpu yang masih dipertahankan: proxychains-ng: https://github.com/rofl0r/proxychains-ng

Selain bekerja di Linux dan OSX, mudah dikompilasi, dan juga memiliki dukungan yang jauh lebih baik untuk tunneling DNS.

Saya juga harus menyebutkan opsi lain, yaitu redsocks. Ia bekerja mirip dengan proxychains (-ng) dan juga mungkin di repo dist Anda: https://github.com/darkk/redsocks

shellster
sumber
Catatan untuk sistem Linux yang lebih baru menggunakan sshuttle: pada saat penulisan ada bug kernel yang akan memberi Anda pipa yang rusak. Dalam hal ini, gunakan:sshuttle -r root@host -x host 0/0
aggregate1166877
49

man sshmemberikan contoh persis ini. Vpn berbasis ssh:

SSH-BASED VIRTUAL PRIVATE NETWORKS
     ssh contains support for Virtual Private Network (VPN) tunnelling using
     the tun(4) network pseudo-device, allowing two networks to be joined
     securely.  The sshd_config(5) configuration option PermitTunnel controls
     whether the server supports this, and at what level (layer 2 or 3 traf-
     fic).

     The following example would connect client network 10.0.50.0/24 with
     remote network 10.0.99.0/24, provided that the SSH server running on the
     gateway to the remote network, at 192.168.1.15, allows it:

       # ssh -f -w 0:1 192.168.1.15 true
       # ifconfig tun0 10.0.50.1 10.0.99.1 netmask 255.255.255.252

~~ snip ~~

     Since a SSH-based setup entails a fair amount of overhead, it may be more
     suited to temporary setups, such as for wireless VPNs.  More permanent
     VPNs are better provided by tools such as ipsecctl(8) and isakmpd(8).

Setelah Anda memiliki antarmuka baru, Anda hanya perlu menjadikannya rute default, yang merupakan pertanyaan yang berbeda.

PriceChild
sumber
1
Bisakah Anda jelaskan lebih banyak? Perintah ifconfig membuat antarmuka baru bernama tun0, kan? Atau apakah tun0 dibuat oleh ssh dan hanya dikonfigurasi lebih lanjut oleh ifconfig? Mungkin menambahkan contoh yang relevan dengan pertanyaan?
Tidak seorang pun
6

Cari opsi "Tunnel" di ssh. Ini menciptakan perangkat terowongan tempat Anda dapat menetapkan alamat IP, dan kemudian Anda mengubah rute default untuk menggunakan terowongan itu.

Peter Eisentraut
sumber
4

Saya telah mengembangkan perangkat lunak yang memungkinkan Anda untuk meneruskan semua TCP dan secara opsional UDP melalui proxy SOCKS5, untuk seluruh sistem.

http://code.google.com/p/badvpn/wiki/tun2socks

Itu bahkan dapat diinstal pada router untuk meneruskan semua koneksi dari komputer di LAN.

Ambroz Bizjak
sumber
0

SSH-BASED VIRTUAL PRIVATE NETWORKS ssh berisi dukungan untuk tunneling Virtual Private Network (VPN) menggunakan perangkat pseudo-tun (4) jaringan, memungkinkan dua jaringan untuk bergabung dengan aman. Opsi konfigurasi sshd_config (5) PermitTunnel mengontrol apakah server mendukung ini, dan pada level apa (layer 2 atau 3 lalu lintas).

 The following example would connect client network 10.0.50.0/24 with
 remote network 10.0.99.0/24 using a point-to-point connection from
 10.1.1.1 to 10.1.1.2, provided that the SSH server running on the gateway
 to the remote network, at 192.168.1.15, allows it.

 On the client:

       # ssh -f -w 0:1 192.168.1.15 true
       # ifconfig tun0 10.1.1.1 10.1.1.2 netmask 255.255.255.252
       # route add 10.0.99.0/24 10.1.1.2

 On the server:

       # ifconfig tun1 10.1.1.2 10.1.1.1 netmask 255.255.255.252
       # route add 10.0.50.0/24 10.1.1.1

 Client access may be more finely tuned via the /root/.ssh/authorized_keys
 file (see below) and the PermitRootLogin server option.  The following
 entry would permit connections on tun(4) device 1 from user “jane” and on
 tun device 2 from user “john”, if PermitRootLogin is set to
 “forced-commands-only”:

   tunnel="1",command="sh /etc/netstart tun1" ssh-rsa ... jane
   tunnel="2",command="sh /etc/netstart tun2" ssh-rsa ... john

 Since an SSH-based setup entails a fair amount of overhead, it may be
 more suited to temporary setups, such as for wireless VPNs.  More perma‐
 nent VPNs are better provided by tools such as ipsecctl(8) and
 isakmpd(8).
Kristian Hermansen
sumber
1
tolong tambahkan sumber untuk informasi Anda. Catatan: ini adalah pertanyaan lama.
Lorenzo Von Matterhorn
-2

Hanya ingin menjernihkan bahwa (ssh -D port host) bukan cara yang aman 100% untuk lalu lintas yang tidak diendus. Menambahkan (ssh -D -c blowfish port host) akan menjadi pilihan yang lebih baik karena Anda setidaknya menambahkan enkripsi ke sesi Anda. Ada lebih banyak opsi yang dapat Anda tambahkan tetapi cukup mudah untuk cukup mengetik "man ssh" di terminal Anda atau Google untuk daftar lengkap.

Opsi yang saya pikir Anda cari adalah menyiapkan VPN (Virtual Private Network)

Lihat artikel ini untuk mendapatkan pemahaman tentang perbedaan antara keduanya ( SSH vs VPN ) atau versi ringkasan yang baik , sebelum Anda menangani pengaturan VPN Anda sendiri. Jika Anda memutuskan untuk memilih rute VPN, saya sarankan OpenVPN , gratis dan banyak dokumentasi dan dukungan.

ricbax
sumber
6
saran yang buruk. "blowfish" adalah sandi SSH-1; itu cepat, pikir aman (pada 1999: unixhelp.ed.ac.uk/CGI/man-cgi?ssh+1 ), tapi tetap saja. Anda mungkin ingin ssh -2 -C -D [...](memaksa SSH2, gunakan kompresi) dan jatuhkan -c. menurut sistem saya man sshdaftar cipher di SSH2 default untuk aes128-cbc,3des-cbc,blowfish-cbc,[etc]. maksud saya adalah, jika Anda meminta -c blowfishAnda mungkin berakhir dengan SSH1, yang jauh lebih tidak aman daripada SSH2.
Quack quixote
2
Benar, tetapi Jeremy berada di bawah kesan bahwa koneksi aman dengan hanya -D 8080, saya hanya menyatakan itu lebih baik daripada apa yang dia gunakan. Anda membuat poin yang valid dan itulah sebabnya saya menyebutkan manual untuk opsi lainnya.
ricbax
Mungkin Anda harus mengubah jawaban Anda, karena ini sangat membantu.
endolith
Lupa saya bertanya ini, jangan gunakan situs ini secara teratur. Terima kasih atas klarifikasi ... Saya mendapat kesan kuat bahwa SSH aman secara default.
Jeremy Banks
9
WTF bukan SSH menggunakan enkripsi secara default ??
LatinSuD
-3

Gunakan contoh-contoh ini:

  • Meneruskan port 80 dari host jarak jauh ke 8888 di localhost Anda

    ssh -fnN -L8888: localhost: 80 user @ server

    Gunakan ini untuk mengakses layanan pada host jarak jauh yang hanya tersedia di sana

  • Meneruskan port 80 dari host lokal Anda ke 8888 pada host jarak jauh

    ssh -fnN -R8888: localhost: 80 user @ server

    Gunakan ini untuk memungkinkan pengguna lain mengakses layanan Anda: server web, atau apa pun.

Tepuk tangan! :)

kolypto
sumber
Komentar yang bagus, tetapi sama sekali tidak terkait dengan apa yang kita bicarakan di sini. Reverse ssh memungkinkan SERVER untuk meminta rute KLIEN SATU port lalu lintas ke sana. Diperlukan lebih banyak konfigurasi untuk mengarahkan rute lalu lintas ke internet. Anda juga harus menyiapkan terowongan SSH untuk setiap port. DAN itu harus dimulai dari server, bukan klien - yang mengapa Anda pernah melakukan itu kecuali Anda harus melakukannya?
Beachhouse