web-dev-qa-db-fra.com

Comment transférer un port d'une machine à une autre?

Considérez la situation suivante:

Chez moi, j'ai un routeur (qui est connecté à Internet), un serveur (S) et ma machine principale (M). S est accessible depuis Internet (il a une adresse IP statique), et il est disponible 24h/24 et 7j/7, tandis que M ne l'est pas.

Parfois, je veux rendre une application (qui écoute sur un port sur M, par exemple 8888) accessible depuis Internet externe.

Pour cela, je voulais configurer un port sur S (2222) pour le transmettre au port 8888 de M, afin que quiconque accédant à S: 2222 se sente comme s'il accédait à M: 8888.

J'ai essayé d'utiliser la redirection de port ssh, ma meilleure tentative était la suivante:

ssh -L 2222:M:8888 -N M

Mais cela ne me permet d'accéder au port 2222 qu'à partir du serveur lui-même, pas à partir d'autres machines.

Existe-t-il un moyen de le faire correctement? De préférence, j'aimerais que ce soit une commande simple, que je serais en mesure de démarrer et d'arrêter avec ^ C lorsque je n'aurai plus besoin de ce transfert.

21
Rogach

Oui, cela s'appelle GatewayPorts dans SSH. Un extrait de ssh_config(5):

GatewayPorts
        Specifies whether remote hosts are allowed to connect to local
        forwarded ports.  By default, ssh(1) binds local port forwardings
        to the loopback address.  This prevents other remote hosts from
        connecting to forwarded ports.  GatewayPorts can be used to spec‐
        ify that ssh should bind local port forwardings to the wildcard
        address, thus allowing remote hosts to connect to forwarded
        ports.  The argument must be “yes” or “no”.  The default is “no”.

Et vous pouvez utiliser localhost au lieu de M dans le transfert, car vous transférez vers la même machine que celle vers laquelle vous vous connectez - si je comprends bien votre question.

Ainsi, la commande deviendra ceci:

ssh -L 2222:localhost:8888 -N -o GatewayPorts=yes hostname-of-M

et ressemblera à ceci dans netstat -nltp:

tcp        0      0    0.0.0.0:2222   0.0.0.0:*  LISTEN  5113/ssh

Désormais, toute personne accédant à cette machine sur le port 2222 TCP va en fait parler à localhost: 8888 comme vu dans la machine M. Notez que ce n'est pas la même chose que le transfert simple vers le port 8888 de M.

16
gertvdijk

Il y a une autre manière. Vous pouvez configurer la redirection de port de S: 2222 vers W: 8888 avec iptables. Commande unique:

iptables -t nat -A PREROUTING -p tcp --dport 2222 \
         -j DNAT --to-destination 1.2.3.4:8888

où 1.2.3.4 est l'adresse IP de M. Il s'appelle NAT (traduction d'adresse réseau).

12
Gevial

Autres alternatives: netcat (traditionnel) ou socat

Sur le serveur (S):

socat tcp-listen:2222,reuseaddr,fork tcp:M:8888

ou

nc -l -p 2222 -c 'nc M 8888'

Voir détails dans: n moyen simple de créer un tunnel d'un port local à un autre?

6
simohe