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.
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.
-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
.
Utilisez l'option -g. De la page de manuel de ssh:
-g Allows remote hosts to connect to local forwarded ports.
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
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"
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