web-dev-qa-db-fra.com

Un moyen simple de créer un tunnel d'un port local à un autre?

J'ai un serveur de développement, qui n'est accessible qu'à partir de 127.0.0.1:8000, pas 192.168.1.x: 8000. En guise de hack rapide, existe-t-il un moyen de configurer quelque chose à écouter sur un autre port (par exemple, 8001) de sorte que depuis le réseau local, je puisse connecter 192.168.1.x: 8001 et qu'il tunneliserait le trafic entre le client et 127.0 .0.1: 8000?

83
waitinforatrain

L'utilisation de ssh est la solution la plus simple.

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

Ceci transfère le port local 8001 de votre poste de travail à l'adresse localhost sur le port 8000 de remote-server.com.
-g signifie que d'autres clients de mon réseau peuvent se connecter au port 8001 de mon poste de travail. Sinon, seuls les clients locaux de votre poste de travail peuvent se connecter au port redirigé.
-N signifie que tout ce que je fais est de rediriger des ports, ne démarrez pas un shell.
-f signifie fork en arrière-plan après une connexion et une connexion SSH réussies.
Le port 8001 restera ouvert pour de nombreuses connexions, jusqu'à ce que ssh meure ou soit tué. Si vous êtes sous Windows, l'excellent client SSH PuTTY peut également le faire. Utilisez 8001 comme port local et localhost: 8000 et la destination et ajoutez une redirection de port local dans les paramètres. Vous pouvez l'ajouter après une connexion réussie avec PuTTY.

48
penguin359

Avec socat sur le serveur:

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

Par défaut, socat écoutera sur TCP port 8001 sur n'importe quelle adresse IPv4 ou IPv6 (si prise en charge) sur la machine. Vous pouvez la limiter à IPv4/6 en remplaçant tcp-listen avec tcp4-listen ou tcp6-listen, ou à une adresse locale spécifique en ajoutant un ,bind=that-address.

De même pour le socket de connexion dont vous utilisez le proxy, vous pouvez utiliser n'importe quelle adresse à la place de localhost et remplacer tcp par tcp4 ou tcp6 si vous souhaitez limiter la résolution d'adresse aux adresses IPv4 ou IPv6.

Notez que pour le serveur écoutant sur le port 8000, la connexion apparaîtra comme provenant du proxy (dans le cas de localhost, ce sera localhost), pas du client d'origine. Vous devez utiliser approches DNAT (mais qui nécessite des privilèges de superutilisateur) pour que le serveur puisse dire qui est le client.

105
Stéphane Chazelas

L'utilisation du nc traditionnel est la solution la plus simple:

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

Cette version de nc est dans le netcat-traditional package sur Ubuntu. (Vous devez update-alternatives ou appelez-le nc.traditional.)

Notez que contrairement à ssh, ce n'est pas crypté. Gardez cela à l'esprit si vous l'utilisez en dehors d'un hôte.

50
not-a-user

OpenBSD netcat est disponible par défaut sous Linux et également sous 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

Une alternative qui fonctionne sur OS X bash est d'utiliser un canal bidirectionnel . Cela peut fonctionner sur d'autres Unix:

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

Citant un David Spillett 's answer on ServerFault

rinetd devrait faire le travail, et un binaire Windows pour cela peut être obtenu à partir de http://www.boutell.com/rinetd/ (pour tous ceux qui recherchent la même chose sous Linux, rinetd est dans le les référentiels standard de presque toutes les distributions peuvent donc être installés avec "apt-get install rinetd" ou "yum install rinetd" ou similaire)

C'est un simple binaire qui prend un fichier de configuration au format

bindaddress bindport connectaddress connectport

Par exemple:

192.168.1.1 8001 127.0.0.1 8000

ou

0.0.0.0 8001 127.0.0.1 8000

si vous souhaitez lier le port entrant à toutes les interfaces.

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

Il s'agit d'une nouvelle façon de tunneler deux ports UDP sur le serveur: https://github.com/9crk/udpeer

udpeer 8001 8002

Tester:

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

Basé sur la réponse de Mark A. , j'ai dû faire un petit Tweak pour le faire fonctionner pour mon Mac (au moins sur macOS Mojave Version 10.14.4)

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

Cette déclaration printf semble être cruciale. Sinon, la commande netcat pour se connecter au port 8000 n'essaiera jamais réellement de se connecter, et la commande netcat pour écouter sur le port 8001 n'écoutera jamais réellement sur le port 8001. Sans le printf, chaque fois que j'essaierais de me connecter au port 8001, j'obtiendrais Connexion rejetée.

Mon hypothèse est que netcat doit en quelque sorte bloquer sur stdin (peut-être qu'il essaie de le lire pour une raison quelconque) avant de faire des opérations Socket. Par conséquent, sans que l'instruction printf n'écrive dans fifo a, la commande netcat ne commencera jamais à écouter sur le port 8001.

Remarque: j'aurais laissé une réponse sur le post de Mark, mais je n'ai pas encore de réputation.

0
Daniel K