Forwarder port TCP/UDP yang aman dan multipleks menggunakan server perpipaan oleh @nwtgck sebagai relai. Dirancang terutama untuk koneksi p2p antara rekan-rekan di belakang (beberapa) NAT/firewall.
Untuk kasus khusus IPFS , lihat #contoh di bawah.
ID: Setiap node diberi ID unik (base64) -
tunnel -i
ID terikat pada perangkat keras (alamat MAC) dan variabel lingkungan USER, HOME, dan HOSTNAME. Bagikan dengan rekan-rekan Anda untuk selamanya. Catatan: dua pengguna di mesin yang sama diberikan ID node terpisah karena variabel USER dan HOME mereka berbeda.
Mode server: Paparkan port lokal Anda ke rekan yang Anda bagikan string rahasia apa pun -
tunnel [options] [-u] [-k < shared-secret > ] < local-port >
Mode klien: Meneruskan port lokal Anda ke port lokal rekan yang terekspos -
tunnel [options] [-u] [-k < shared-secret > ] [-b < local-port > ] [-I < IP > ] < peer-ID:peer-port >
Jika tidak ada port lokal yang disediakan menggunakan opsi -b
, tunnel
akan menggunakan port acak yang tidak digunakan. Port yang digunakan, selalu dilaporkan di stdout.
Opsi -I
berguna ketika klien berjalan di laptop yang kadang-kadang terhubung ke LAN tempat server berada. Ketika server dapat ditemukan di LAN dengan IP pribadi = <IP>
, tunnel
terhubung melalui LAN.
Client dan server harus menggunakan rahasia yang sama untuk dapat terhubung satu sama lain. String rahasia juga dapat diteruskan menggunakan variabel lingkungan TUNNEL_KEY
. Rahasia yang diteruskan dengan -k
diutamakan.
-u
flag menunjukkan penggunaan UDP dan bukan TCP default. Jika digunakan, harus digunakan oleh kedua rekannya.
Semua log berada di stderr secara default. Namun, dengan opsi -l <logfile>
, seseorang dapat meluncurkan tunnel
di latar belakang ( mode daemon ) dengan log yang dibuang di <logfile>
. ID proses daemon ditampilkan kepada pengguna selama peluncuran sehingga dia dapat mematikan daemon kapan saja dengan
tunnel -K < procID >
Pilihan:
Untuk daftar opsi selengkapnya, lihat: tunnel -h
Unduh dengan:
curl -LO https://raw.githubusercontent.com/SomajitDey/tunnel/main/tunnel
Jadikan itu dapat dieksekusi:
chmod +rx ./tunnel
Kemudian instal seluruh sistem dengan:
./tunnel -c install
Jika Anda tidak memiliki hak istimewa sudo
, Anda dapat menginstal secara lokal:
./tunnel -c install -l
Untuk memperbarui kapan saja setelah instalasi:
tunnel -c update
Program ini hanyalah sebuah skrip bash
yang dapat dieksekusi tergantung pada alat standar GNU termasuk socat
, openssl
, curl
, mktemp
, cut
, awk
, sed
, flock
, pkill
, dd
, xxd
, base64
dll. yang tersedia di distro Linux standar.
Jika sistem Anda tidak memiliki alat-alat ini, dan Anda tidak memiliki hak sudo
yang diperlukan untuk menginstalnya dari repositori paket asli (misalnya sudo apt-get install <package>
), coba unduh biner portabel dan instal secara lokal di ${HOME}/.bin
.
SSH :
Rekan A mengekspos port SSH lokal -
tunnel -k " ${secret} " 22
Rekan B terhubung -
tunnel -b 67868 -k " ${secret} " -l /dev/null " ${peerA_ID} :22 " # Daemon due to -l
ssh -l " ${login_name} " -p 67868 localhost
IPFS :
Biarkan rekan A memiliki IPFS-peer-ID: 12orQmAlphanumeric
. Daemon IPFS-nya mendengarkan pada port TCP default 4001. Dia mengeksposnya dengan -
tunnel -k " ${swarm_key} " ipfs
swarm_key
hanyalah string rahasia apa pun yang dapat digunakan oleh rekan A untuk mengontrol siapa yang dapat terhubung secara segerombolan dengannya menggunakan tunnel
.
Rekan B sekarang terhubung dengan rekan A untuk berbagi file atau pubsub atau p2p -
tunnel -k " ${swarm_key} " 12orQmAlphanumeric
Perintah terakhir ini gerombolan terhubung ke rekan A melalui relai server perpipaan dan terus menghubungkan gerombolan setiap beberapa detik di latar belakang untuk menjaga koneksi tetap hidup.
tunnel
memulai daemon IPFS di latar belakang jika belum aktif.
Jalur ke repo IPFS dapat dilalui dengan opsi -r
. Jika tidak, variabel lingkungan IPFS_PATH
atau jalur default ~/.ipfs
digunakan seperti biasa. Contoh: tunnel -r ~/.ipfs -i
memberikan ID rekan IPFS.
Cangkang Jarak Jauh :
Misalkan Anda secara teratur perlu meluncurkan perintah di kotak Linux tempat kerja Anda dari mesin rumah Anda. Dan Anda tidak ingin/tidak dapat menggunakan SSH melalui tunnel
karena alasan tertentu.
Di komputer tempat kerja, buka beberapa port TCP lokal acak, misalnya 49090 dan sambungkan shell ke port tersebut:
tunnel -l " /tmp/tunnel.log " -k " your secret " 49090 # Note the base64 node id emitted
socat TCP-LISTEN:49090,reuseaddr,fork SYSTEM: ' bash 2>&1 '
Kembali ke rumah Anda:
tunnel -l " /dev/null " -b 5000 -k " your secret " " node_id_of_workplace:49090 "
rlwrap nc localhost 5000
Menggunakan rlwrap bukanlah suatu keharusan. Namun hal ini membuat pengalaman menjadi lebih manis karena menggunakan GNU Readline dan mengingat riwayat masukan (dapat diakses dengan tombol panah atas/bawah yang serupa dengan sesi bash lokal Anda).
Redis :
Perlu terhubung ke instance Redis jarak jauh yang dihosting oleh rekan atau Anda sendiri? Di host jarak jauh, tampilkan port TCP tempat redis-server
berjalan (default: 6379), dengan tunnel
.
Di mesin lokal Anda, gunakan tunnel
untuk meneruskan port TCP ke port jarak jauh. Arahkan redis-cli
Anda ke port lokal yang diteruskan.
Di bawah ini adalah beberapa kasus penggunaan acak yang dapat saya pikirkan untuk tunnel
. Secara umum, apa pun yang melibatkan traversal NAT/firewall (misalnya WebRTC tanpa TURN) atau bergabung dengan LAN jarak jauh, akan bermanfaat bagi tunnel
. Beberapa ide berikut ini agak samar, belum diuji sama sekali, dan mungkin tidak berhasil, namun tetap didokumentasikan di sini, setidaknya untuk saat ini, hanya demi inspirasi. Jika Anda menemukan salah satu dari ini berguna, atau tidak berguna, atau Anda telah menemukan aplikasi baru untuk tunnel
, silakan posting di diskusi. Kasus-kasus yang telah saya uji diberi label "berfungsi".
tunnel
.tunnel
di Heroku (gratis) dan teruskan port yang disimpan dalam variabel lingkungan PORT
ke port lokal yang ingin Anda ekspos. Dan Anda memiliki URL publik Anda sebagai: https://nama-aplikasi-Anda.herokuapp.com.tunnel
. tunnel
mengenkripsi semua lalu lintas antara peer dan relai dengan TLS, jika relai menggunakan https. Tidak ada enkripsi ujung ke ujung antara rekan-rekan itu sendiri. Namun, relai server perpipaan diklaim tanpa penyimpanan .
Rekan klien dapat terhubung dengan rekan yang melayani hanya jika mereka menggunakan kunci rahasia yang sama (TUNNEL_KEY). Kuncinya terutama digunakan untuk penemuan rekan pada tahap relai. Untuk setiap koneksi baru ke port lokal yang diteruskan, klien mengirimkan kunci sesi acak ke rekan yang melayani. Rekan-rekan tersebut kemudian membentuk koneksi baru di titik relai lain berdasarkan kunci acak ini agar transfer data sebenarnya dapat terjadi. Orang luar, mis. aktor jahat yang tidak mengetahui TUNNEL_KEY seharusnya tidak dapat mengganggu aliran ini.
Namun, rekan yang jahat dapat melakukan hal berikut. Karena dia mengetahui TUNNEL_KEY dan ID node dari rekan yang melayani, dia dapat meniru identitas rekan yang melayani. Oleh karena itu, data dari rekan penghubung yang tidak menaruh curiga akan diteruskan ke peniru identitas, sehingga membuat server asli kelaparan. Pembaruan/implementasi tunnel
di masa depan harus menangani ancaman ini menggunakan kripto kunci publik. [Dalam hal ini, kunci sesi acak yang dihasilkan untuk setiap koneksi baru yang akan diteruskan, hanya dapat didekripsi oleh server asli].
Mengingat bahwa tunnel
pada dasarnya adalah lapisan transport, poin-poin di atas tidak boleh membuat kita putus asa, karena sebagian besar aplikasi seperti SSH dan IPFS mengenkripsi data pada lapisan aplikasi. Mengenkripsi tunnel
secara end-to-end untuk semua transfer data hanya akan menambah latensi. Namun, Anda selalu dapat membuat terowongan SSH setelah membuat peering tingkat rendah dengan tunnel
, jika Anda mau.
Relai default yang digunakan oleh tunnel
adalah https://ppng.io. Anda juga dapat menggunakan relay publik lain dari daftar ini atau menghosting instance Anda sendiri di layanan gratis seperti yang ditawarkan oleh Heroku. Tak perlu dikatakan lagi, untuk terhubung, dua rekan harus menggunakan relay yang sama.
Jika Anda memilih demikian, Anda juga dapat menulis relay Anda sendiri untuk digunakan oleh tunnel
menggunakan alat sederhana seperti sertain. Pastikan layanan relai Anda memiliki API yang sama dengan server perpipaan. Jika kode relai Anda bersifat open source, Anda dipersilakan untuk memperkenalkannya pada diskusi.
soket g; ipfs p2p dengan sirkuit-relay diaktifkan; go-piping-dupleks ; pipeto.me ; tautan naik; localhost.jalankan; ngrok ; terowongan lokal; sshreach.me ( uji coba gratis untuk jangka waktu terbatas saja ); lagi
Catatan:
tunnel
dan server perpipaan, Anda cukup menerapkan instance relai Anda sendiri, membagikan URL publiknya dengan rekan-rekan Anda untuk selamanya, export
URL yang sama seperti TUNNEL_RELAY
ke dalam .bashrc
dan Anda siap melakukannya. Selain itu, beberapa server perpipaan publik tersedia untuk redundansi.IPFS (Selesai):
Menghubungkan ke IPFS akan jauh lebih sederhana:
tunnel -k <secret> ipfs
untuk mengekspos dan tunnel -k <secret> <IPFS_peerID>
untuk terhubung.
Ini akan meluncurkan daemon IPFS sendiri, jika offline. Perintah terakhir akan berulang kali mengerumuni koneksi ke rekan tertentu dengan interval 30 detik. ID rekan IPFS akan digunakan sebagai ID simpul, sehingga rekan tidak perlu lagi membagikan ID simpulnya secara terpisah. Jalur repo IPFS non-default dapat diteruskan dengan opsi -r
. atau IPFS_PATH
.
SSH:
Membuat terowongan SSH antara port lokal dan port peer semudah:
tunnel -k <secret> ssh
untuk mengekspos &
tunnel -sk <secret> -b <local-port> <peerID>:<peer-port>
untuk membuat.
Perhatikan bahwa, saat menghubungkan, seseorang tidak perlu lagi memberikan nama login. ${USER}
dari node yang melayani diambil sebagai nama login secara default. Namun, jika diperlukan, nama login non-default selalu dapat diteruskan menggunakan variabel atau opsi lingkungan.
GPG:
Mesin virtual, seperti yang digunakan oleh cloud-shell dan dynos, tidak memiliki alamat perangkat keras yang unik dan persisten. Oleh karena itu, ID node terus berubah dari sesi ke sesi untuk VM semacam itu. tunnel
masa depan akan memiliki opsi -g
yang akan meneruskan kunci pribadi GPG ke tunnel
. ID node akan dihasilkan dari sidik jari kunci ini, serupa dengan yang dilakukan IPFS. Hal ini juga akan membuat tunnel
lebih aman.
Argon2:
Opsi [ -a
] untuk menggunakan argon2 untuk hashing TUNNEL_KEY sebelum digunakan, sehingga rahasia yang lebih lemah tidak terlalu rentan.
Silakan laporkan bug pada masalah. Posting pemikiran, komentar, ide, kasus penggunaan, dan permintaan fitur Anda di diskusi. Beri tahu saya bagaimana hal ini membantu Anda, jika memang membantu.
Juga jangan ragu untuk menulis kepada saya secara langsung tentang apa pun mengenai proyek ini.
Jika naskah kecil ini bermanfaat bagi Anda, bintang akan sangat memberi semangat bagi saya.
Terima kasih ! ?