web-dev-qa-db-fra.com

Comment rendre le tunnel SSH ouvert au public?

En revenant à this question, je lance la commande

ssh -R 8080:localhost:80 -N [email protected]

sur un Mac. Pourtant, le port sous tunnel ne fonctionne pas publiquement. J'exécute une telle commande pour que le port local puisse être ouvert sur l'ordinateur distant. Et cela fonctionne lorsque vous ouvrez le port sur l'hôte local sur l'ordinateur distant, mais lorsque j'essaie d'accéder à l'adresse IP publique de l'ordinateur distant à partir de mon ordinateur local, le port ne semble pas être ouvert. Comment pourrais-je rendre le tunnel public sur l'IP pour que n'importe qui puisse y accéder?

EDIT: Il semble que le côté distant se lie uniquement à localhost et non à toutes les interfaces.

EDIT 2: le client est Mac OS X 10.6 et le serveur est Linux Mint, mais ils sont tous deux OpenSSH.

159
Trevor Rudolph

Si vous consultez la page de manuel relative à ssh, vous constaterez que la syntaxe de -R se lit comme suit:

-R [bind_address:]port:Hôte:port hôte

Lorsque bind_address est omis (comme dans votre exemple), le port est lié à l'interface de bouclage uniquement. Afin de le lier à toutes les interfaces, utilisez

ssh -R \*:8080:localhost:80 -N [email protected]

ou

ssh -R 0.0.0.0:8080:localhost:80 -N [email protected]

ou

ssh -R "[::]:8080:localhost:80" -N [email protected]

La première version se lie à toutes les interfaces individuellement. La deuxième version crée une liaison générale réservée à IPv4, ce qui signifie que le port est accessible sur toutes les interfaces via IPv4. La troisième version est probablement techniquement équivalente à la première, mais là encore, elle ne crée qu'une seule liaison avec ::, ce qui signifie que le port est accessible via IPv6 en mode natif et via IPv4 via adresses IPv6 mappées par IPv4 (ne fonctionne pas sous Windows, OpenBSD). (Vous avez besoin des guillemets, car [::] pourrait autrement être interprété comme un glob.)

Notez que si vous utilisez OpenSSH sshd server, l'option GatewayPorts du serveur doit être activée (défini sur yes ou clientspecified) pour que cela fonctionne (vérifiez le fichier /etc/ssh/sshd_config sur le serveur). Sinon (la valeur par défaut de cette option est no), le serveur forcera toujours le port à être lié à l'interface de bouclage uniquement.

325
Stefan Seidel

Modifier:

-g fonctionne pour les ports transférés locaux, mais ce que vous voulez, c'est un port transféré inverse/distant, qui est différent.

Ce que tu veux, c'est ça .

Essentiellement, sur example.com, définissez GatewayPorts=clientspecified dans /etc/ssh/sshd_config.

--- réponse précédente (incorrecte) ---

Utilisez l'option -g. De la page de manuel de ssh:

-g     Allows remote hosts to connect to local forwarded ports.
36
snapshoe

Voici ma réponse pour l'achèvement:

J'ai fini par utiliser ssh -R ... pour la tunnellisation et par socat pour rediriger le trafic réseau vers 127.0.0.1:

tunnel lié à 127.0.0.1: ssh -R mitm:9999:<my.ip>:8084 me@mitm

socat: mitm$ socat TCP-LISTEN:9090,fork TCP:127.0.0.1:9999

Une autre option est de faire un tunnel local uniquement en plus de cela, mais je trouve cela beaucoup plus lent

mitm$ ssh -L<mitm.ip.address>:9090:localhost:9999 localhost

13
Miguel Ping

Vous pouvez également utiliser un double transfert si vous ne voulez pas ou ne pouvez pas modifier/etc/ssh/sshd_config.

Commencez par transférer vers le port temporaire (par exemple 10080) sur le périphérique de bouclage sur la machine distante, puis utilisez le transfert local sur cette redirection pour rediriger les ports 10080 vers 80 sur toutes les interfaces:

ssh -A -R 10080:localhost_or_machine_from:80 [email protected] "ssh -g -N -L 80:localhost:10080 localhost"
9
panticz.de

Utilisez l'option "ports de passerelle".

ssh -g -R REMOTE_PORT:Host:PORT ...

Afin de l'utiliser, vous devrez probablement ajouter "GatewayPorts yes" au /etc/ssh/sshd_config de votre serveur.

Si vous souhaitez mettre la configuration dans votre ~/.ssh/config au lieu d'utiliser des paramètres de ligne de commande, vous pouvez essayer quelque chose comme:

Host REMOTE_Host_NAME RemoteForward \*:8080 127.0.0.1:80

N'oubliez pas de laisser le pare-feu de votre hôte distant autoriser les connexions à 8080 et vous assurer que l'option GatewayPorts de votre /etc/ssh/sshd config n'est pas définie sur no

0
Brad Mostert