it-swarm.it

Modo semplice per creare un tunnel da una porta locale a un'altra?

Ho un server di sviluppo, accessibile solo da 127.0.0.1:8000, non 192.168.1.x: 8000. Come hack rapido, c'è un modo per impostare qualcosa da ascoltare su un'altra porta (diciamo, 8001) in modo che dalla rete locale potrei connettere 192.168.1.x: 8001 e tunnel il traffico tra il client e 127.0 .0.1: 8000?

83
waitinforatrain

L'uso di ssh è la soluzione più semplice.

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

Ciò inoltra la porta locale 8001 sulla workstation all'indirizzo localhost sulla porta 8000 remote-server.com.
-g significa consentire ad altri client sulla mia rete di connettersi alla porta 8001 sulla mia workstation. In caso contrario, solo i client locali sulla workstation possono connettersi alla porta inoltrata.
-N significa che tutto ciò che sto facendo è inoltrare le porte, non avviare una Shell.
-f indica il fork in background dopo una connessione SSH e l'accesso riusciti.
La porta 8001 rimarrà aperta per molte connessioni, fino a quando ssh muore o viene ucciso. Se ti capita di trovarti su Windows, anche l'eccellente client SSH PuTTY può farlo. Utilizzare 8001 come porta locale e localhost: 8000 e destinazione e aggiungere un port forwarding locale nelle impostazioni. Puoi aggiungerlo dopo una connessione riuscita con PuTTY.

48
penguin359

Con socat sul server:

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

Per impostazione predefinita, socat ascolterà TCP porta 8001 su qualsiasi indirizzo IPv4 o IPv6 (se supportato) sulla macchina. Puoi limitarlo a IPv4/6 sostituendo tcp-listen con tcp4-listen o tcp6-listen o a un indirizzo locale specifico aggiungendo un ,bind=that-address.

Lo stesso vale per la presa di connessione a cui si esegue il proxy, è possibile utilizzare qualsiasi indirizzo al posto di localhost e sostituire tcp con tcp4 o tcp6 se si desidera limitare la risoluzione dell'indirizzo agli indirizzi IPv4 o IPv6.

Si noti che per il server in ascolto sulla porta 8000, la connessione apparirà come proveniente dal proxy (nel caso di localhost, che sarà localhost), non dal client originale. Dovresti usare approcci DNAT (ma che richiede i privilegi di superutente) affinché il server sia in grado di dire chi è il client.

105

L'uso del tradizionale nc è la soluzione più semplice:

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

Questa versione di nc si trova nel netcat-traditional pacchetto su Ubuntu. (Devi update-alternatives o chiamalo nc.traditional.)

Si noti che, diversamente da ssh, questo non è crittografato. Tienilo a mente se lo usi al di fuori di un host.

50
not-a-user

Netcat OpenBSD è disponibile per impostazione predefinita su Linux e anche su 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

Un'alternativa che funziona su OS X bash è usare un bidirezionale pipe . Potrebbe funzionare su altri Unix:

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

Citando un David Spillett 's risposta su ServerFault

rinetd dovrebbe fare il lavoro, e un binario di Windows per esso può essere ottenuto da http://www.boutell.com/rinetd/ (per chiunque cerchi la stessa cosa sotto Linux, rinetd è nel repository standard di quasi tutte le distro, quindi possono essere installati con "apt-get install rinetd" o "yum install rinetd" o simili)

È un semplice binario che accetta un file di configurazione nel formato

bindaddress bindport connectaddress connectport

Per esempio:

192.168.1.1 8001 127.0.0.1 8000

o

0.0.0.0 8001 127.0.0.1 8000

se si desidera associare la porta in entrata a tutte le interfacce.

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

Questo è un nuovo modo per eseguire il tunneling di due porte udp sul server: https://github.com/9crk/udpeer

udpeer 8001 8002

Testare:

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

Sulla base della risposta Mark A. , ho dovuto fare un piccolo Tweak per farlo funzionare sul mio Mac (almeno su macOS Mojave versione 10.14.4)

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

Questa affermazione printf sembra essere cruciale. Altrimenti il ​​comando netcat per connettersi alla porta 8000 non proverà mai effettivamente a connettersi, e il comando netcat per ascoltare sulla porta 8001 non ascolterà mai effettivamente sulla porta 8001. Senza lo printf, ogni volta che proverei a connettermi alla porta 8001 otterrei connessione rifiutata.

La mia ipotesi è che netcat debba in qualche modo bloccare su stdin (forse sta cercando di leggerlo per qualche motivo) prima di eseguire effettivamente qualsiasi operazione Socket. Pertanto, senza l'istruzione printf che scrive in fifo a, il comando netcat non inizierà mai l'ascolto sulla porta 8001.

Nota: avrei lasciato una risposta sul post di Mark, ma non ho ancora la reputazione.

0
Daniel K