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?
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.
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.
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.
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
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.
iptables -t nat -A PREROUTING -p tcp --dport <Origin-port> -j REDIRECT --to-port <destination-port>
service iptables save
service iptables restart
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
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.