it-swarm-id.com

Cara sederhana untuk membuat terowongan dari satu port lokal ke yang lain?

Saya memiliki server pengembangan, yang hanya dapat diakses dari 127.0.0.1:8000, bukan 192.168.1.x: 8000. Sebagai peretasan cepat, apakah ada cara untuk mengatur sesuatu untuk mendengarkan pada port lain (katakanlah, 8001) sehingga dari jaringan lokal saya dapat menghubungkan 192.168.1.x: 8001 dan itu akan menyalurkan lalu lintas antara klien dan 127.0 .0.1: 8000?

83
waitinforatrain

Menggunakan ssh adalah solusi termudah.

ssh -g -L 8001: localhost: 8000 -f -N [email protected]

Ini meneruskan port lokal 8001 pada workstation Anda ke alamat localhost pada port remote-server.com 8000.
-g berarti mengizinkan klien lain di jaringan saya untuk terhubung ke port 8001 di workstation saya. Kalau tidak, hanya klien lokal di workstation Anda yang dapat terhubung ke port yang diteruskan.
-N berarti yang saya lakukan hanyalah meneruskan port, jangan memulai Shell.
-f berarti bercabang ke latar belakang setelah koneksi SSH berhasil dan masuk.
Port 8001 akan tetap terbuka untuk banyak koneksi, sampai ssh mati atau terbunuh. Jika Anda kebetulan menggunakan Windows, klien SSH Putty yang sangat baik dapat melakukan ini juga. Gunakan 8001 sebagai port lokal dan localhost: 8000 dan tujuan dan tambahkan penerusan port lokal di pengaturan. Anda dapat menambahkannya setelah koneksi yang sukses dengan Putty.

48
penguin359

Dengan socat di server:

socat tcp-listen:8001,reuseaddr,fork tcp:localhost:8000

Secara default, socat akan mendengarkan pada TCP port 8001 pada setiap alamat IPv4 atau IPv6 (jika didukung) pada mesin. Anda dapat membatasi ke IPv4/6 dengan mengganti tcp-listen dengan tcp4-listen atau tcp6-listen, atau ke alamat lokal tertentu dengan menambahkan ,bind=that-address.

Sama dengan soket penghubung yang Anda gunakan untuk proxy, Anda dapat menggunakan alamat apa pun sebagai ganti localhost, dan ganti tcp dengan tcp4 atau tcp6 jika Anda ingin membatasi resolusi alamat ke alamat IPv4 atau IPv6.

Perhatikan bahwa untuk server mendengarkan pada port 8000, koneksi akan muncul sebagai berasal dari proksi (dalam kasus localhost, itu akan menjadi localhost), bukan klien asli. Anda harus menggunakan pendekatan DNAT (tetapi yang membutuhkan hak superuser) agar server dapat memberi tahu siapa kliennya.

105

Menggunakan nc tradisional adalah solusi termudah:

nc -l -p 8001 -c "nc 127.0.0.1 8000"

Versi nc ini ada di dalam netcat-traditional paket di Ubuntu. (Kamu harus update-alternatives atau sebut saja nc.traditional.)

Perhatikan bahwa berbeda dengan ssh ini tidak dienkripsi. Ingatlah itu jika Anda menggunakannya di luar satu Host.

50
not-a-user

OpenBSD netcat tersedia secara default di Linux dan juga pada OS X.

OSX:

mkfifo a
mkfifo b
nc 127.0.0.1 8000 < b > a &
nc -l 8001 < a > b &

Linux:

mkfifo backpipe
nc -l 12345 0<backpipe | nc www.google.com 80 1>backpipe

Alternatif yang berfungsi pada OS X bash adalah dengan menggunakan bidirectional pipe . Ini dapat bekerja pada Unix lain:

nc 127.0.0.1 8000 <&1 | nc -l 8001 >&0
27
Mark A.

Mengutip David Spillettjawab pada ServerFault

rinetd harus melakukan pekerjaannya, dan binary Windows untuk itu dapat diperoleh dari http://www.boutell.com/rinetd/ (untuk siapa pun yang mencari hal yang sama di Linux, rinetd ada di repositori standar dari hampir setiap distro sehingga dapat diinstal dengan "apt-get install rinetd" atau "yum install rinetd" atau serupa)

Ini adalah biner sederhana yang mengambil file konfigurasi dalam format

bindaddress bindport connectaddress connectport

Sebagai contoh:

192.168.1.1 8001 127.0.0.1 8000

atau

0.0.0.0 8001 127.0.0.1 8000

jika Anda ingin mengikat port yang masuk ke semua antarmuka.

4
psychowood
iptables -t nat -A PREROUTING -p tcp --dport <Origin-port> -j REDIRECT --to-port <destination-port>

service iptables save
service iptables restart
3
Santanu Dey

Ini adalah cara baru untuk melakukan tunnel dua port udp di server: https://github.com/9crk/udpeer

udpeer 8001 8002

Untuk mengetes:

nc -u xxxx.com 8001
nc -u xxxx.com 8002
0
9crk

Berdasarkan Mark A. jawaban, saya harus membuat Tweak kecil untuk membuatnya berfungsi untuk Mac saya (setidaknya pada macOS Mojave Versi 10.14.4)

mkfifo a
mkfifo b
nc 127.0.0.1 8000 < b > a &
nc -l 8001 < a > b &
printf "" > a

Pernyataan printf itu tampaknya sangat penting. Kalau tidak, perintah netcat untuk terhubung ke port 8000 tidak akan pernah benar-benar mencoba untuk terhubung, dan perintah netcat untuk mendengarkan pada port 8001 tidak akan pernah benar-benar mendengarkan pada port 8001. Tanpa printf, setiap kali saya akan mencoba untuk terhubung ke port 8001 saya akan mendapatkan koneksi ditolak.

Asumsi saya adalah bahwa netcat entah bagaimana harus memblokir stdin (mungkin ini mencoba membacanya untuk beberapa alasan) sebelum benar-benar melakukan operasi Socket. Dengan demikian, tanpa pernyataan printf menulis ke fifo a, perintah netcat tidak akan pernah mulai mendengarkan pada port 8001.

Catatan: Saya akan meninggalkan jawaban pada posting Markus, tetapi saya belum memiliki reputasi.

0
Daniel K