2013-04-27 22:14:51 +0000 2013-04-27 22:14:51 +0000
189
189

Comment rendre le tunnel ssh ouvert au public ?

Eh bien, pour en revenir à la question (https://superuser.com/questions/517143/how-to-tunnel-a-local-port-onto-a-remote-server), je lance la commande

ssh -R 8080:localhost:80 -N root@example.com

sur un Mac. Pourtant, le port qui est en train d'être 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 j'ouvre le port sur localhost sur l'ordinateur distant, mais lorsque j'essaie d'accéder à l'adresse IP publique de l'ordinateur distant depuis mon ordinateur local, le port ne semble pas être ouvert. Comment puis-je rendre le tunnel public sur l'adresse IP pour que tout le monde puisse y accéder ?

EDIT : Il semble que le côté distant ne se lie qu'à l'ordinateur local au lieu de se lier à 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.

Réponses (7)

368
368
368
2013-05-06 06:11:42 +0000

Si vous consultez la page de manuel pour ssh, vous constaterez que la syntaxe pour -R se lit :

-R [_bind\_address_:]_port_:_host_:_hostport_

Lorsque `bindaddress`_ est omis (comme dans votre exemple), le port est lié à l'interface de loopback uniquement. Afin de le rendre lié à toutes les interfaces, utilisez

ssh -R \*:8080:localhost:80 -N root@example.com

ou

ssh -R 0.0.0.0:8080:localhost:80 -N root@example.com

ou

ssh -R "[::]:8080:localhost:80" -N root@example.com

La première version se lie à toutes les interfaces individuellement. La deuxième version crée un lien général uniquement 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 à ::, ce qui signifie que le port est accessible via IPv6 en natif et via IPv4 par adresses IPv4 mappées en IPv6 (ne fonctionne pas sur Windows, OpenBSD). &nbsp ; (Vous avez besoin des guillemets parce que [::] pourrait être interprété comme un glob autrement.)

Notez que si vous utilisez le serveur OpenSSH sshd, l'option GatewayPorts du serveur doit être activée (définie à 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.

40
40
40
2013-04-28 03:34:48 +0000

Edit :

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

Ce que vous voulez c'est ceci .

Essentiellement, sur example.com, mettez GatewayPorts=clientspecified dans /etc/ssh/sshd_config.

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

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

-g Allows remote hosts to connect to local forwarded ports.
15
15
15
2013-10-29 12:09:40 +0000

Voici ma réponse pour terminer :

J'ai fini par utiliser ssh -R ... pour la construction de tunnels, et par utiliser socat en plus 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 uniquement local en plus de cela, mais je trouve cela beaucoup plus lent

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

10
10
10
2016-08-01 22:37:07 +0000

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

D'abord rediriger vers un port temporaire (par exemple 10080) sur le dispositif de bouclage de la machine distante, puis utiliser la redirection locale pour rediriger le port 10080 vers 80 sur toutes les interfaces :

ssh -A -R 10080:localhost_or_machine_from:80 user@remote.tld "ssh -g -N -L 80:localhost:10080 localhost"
8
8
8
2013-04-28 13:58:50 +0000

Utilisez l'option “ports de passerelle”.

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

Pour l'utiliser, vous devez probablement ajouter “GatewayPorts yes” au /etc/ssh/sshd_config de votre serveur.

2
2
2
2019-06-03 20:09:02 +0000

Jump hosts sont un ajout assez récent à OpenSSH. Cela nécessite un accès SSH à l'intermédiaire, mais devrait fonctionner sans configuration supplémentaire.

ssh -J root@example.com remoteuser@localhost -p 8080

Cette commande demande à SSH de se connecter d'abord à root@example.com, et ensuite, depuis cette machine, d'initier une connexion au port 8080 à localhost (c'est-à-dire le port qui est tunnelé de l'hôte de saut à l'hôte distant) sous le nom d'utilisateur remoteuser.

0
0
0
2018-08-26 15:50:49 +0000

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

Host REMOTE_HOST_NAME RemoteForward \*:8080 127.0.0.1:80

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