Il se peut que vous avez une machine hébergeant un service (prenons le cas simple du service Web), mais derrière un NAPT.
Du coup, vous ne pouvez pas accéder directement à votre service sur cette machine, sans devoir configurer ce NAPT.
Or, vous avez accès à un serveur distant, avec un service sshd.
"Super, ça va être facile", vous dites-vous -- en tout cas, c'est ce que je me suis dit -- car vous connaissez l'option -R, pour remote.
Et c'est là qu'on se rend compte qu'il suffit simplement de (re)lire le man (man 1 ssh) pour voir que déjà, il y a la réponse à nos question :
sous l'option -R [bind_address:]port:host:hostport
(Note : remarquez le contre sens qu'il y a entre la première phrase, et la troisième...) « By default, the listening socket on the server will be bound to the loopback interface only. This may be overridden by specifying a bind_address. An empty bind_address, or the address ‘*’, indicates that the remote socket should listen on all interfaces. Specifying a remote bind_address will only succeed if the server's GatewayPorts option is enabled (see sshd_config(5)). »
Ainsi, je détaille un peu :
Dans le fichier de configuration du service sshd sur le serveur distant (souvent /etc/ssh/sshd_config), il faut activer l'option GatewayPorts avec la valeur "clientspecified" :
GatewayPorts clientspecified
Et sur la machine qui héberge le service derrière le NAPT, faites donc :
ssh user@server_distant -N -R *:<port_serveur>:localhost:<port_service_web>
serveur_distant représente le nom de domaine ou l'adresse IP du serveur qui n'est pas derrière le NAPT.
'*', c'est pour indiquer sur quel interface et/ou adresse écouter du serveur distant ; on peut donc spécifier 0.0.0.0 pour écouter sur toutes les adresses IPv4, [::] pour uniquement les adresses IPv6, "localhost" pour écouter uniquement sur l'interface "loopback" (contrairement à ce qui est indiqué, ce n'est pas par défaut avec GatewayPorts sur "clientspecified"), ou une adresse IP spécifique. (voire si possible, à une interface spécifique, mais je n'arrive plus à remettre la main sur la RFC en question)
<port_serveur>, c'est donc le port, toujours du serveur distant qui exécute le service sshd, sur lequel vous écouterez les connexions. Ainsi, ce n'est pas forcément le port du service web configuré dans le configuration du service.
<port_service_web>, le port du service derrière le NAPT. (donc, 80 pour un service web par défaut).
Ainsi, depuis votre navigateur web, vous n'aurez plus qu'à entrer l'URL suivante :
http://serveur_distant:port_serveur/
Conclusion :
Même si vous connaissez déjà une option dans un outil (comme -R dans ssh), (re)vérifier le man, il y a sûrement la solution.
PS : Vérifiez aussi dans /etc/ssh/sshd_config que l'option AllowTcpForwarding est sur "yes" (ce qui est par défaut)