Le tunnel SSH inverse fonctionne pour SSH mais pas pour HTTP

Ce qui fonctionne

J'ai la configuration suivante:

server <-NAT-> VPS <-> client 

J'ai configuré ssh sur mon server via un tunnel inverse et les parameters suivants:

  • sur VPS,

GatewayPorts yes

  • sur le server:

autossh -f -M 57575 -N -R <VPS ip>:9991:localhost:<server ssh port> vps

Avec cette configuration, je peux simplement ssh -p 9991 <server user>@<VPS ip> et me connecter au server à partir du client.

Ce qui ne l'est pas

  • sur VPS,

GatewayPorts yes , et sinon configuration identique au cas SSH

  • sur le server:

autossh -f -M 57576 -N -R <VPS ip>:9992:localhost:8988 vps

python -m http.server 8988 pour démarrer le server http. Je peux confirmer qu'il se lie à 0.0.0.0 et je peux y accéder sur la machine locale.

Cependant, quand j'essaye d'accéder au site Web via http://<VPS ip>:9992 j'obtiens un ERR_EMPTY_RESPONSE.

En regardant netstat, les deux situations semblent identiques. Sur VPS:

tcp 0 0 0.0.0.0:9992 0.0.0.0:* LISTEN -

tcp 0 0 0.0.0.0:9991 0.0.0.0:* LISTEN -

Sur le server:

tcp 0 0 0.0.0.0:8988 0.0.0.0:* LISTEN 21003/python

tcp 0 0 0.0.0.0:<ssh port> 0.0.0.0:* LISTEN 550/sshd

tcpdump montre qu'une connection est établie avec le port 9992 sur le VPS, mais rien n'atteint le port 8988 sur le server . La connection est FIN ned immédiatement sur le VPS.

Pourquoi ce travail ne fonctionne-t-il pas lorsque la situation SSH est exactement la même?

Vous devez d'abord démarrer le server, puis initier le transfert du port distant. Pas l'inverse.

Je ne sais pas pourquoi, mais évidemment, cela résout le problème.