Créer SSH sur HTTP entre ordinateurs de différents réseaux sans IP publique

0

J'ai un serveur non root avec une adresse IP publique qui accepte uniquement les requêtes HTTP (pas seulement une restriction de port) et deux ordinateurs locaux avec une adresse IP privée sur des réseaux différents. J'aimerais établir une connexion SSH entre ces ordinateurs locaux, probablement via le serveur.

Y a-t-il un moyen de faire cela sans réécrire le client / serveur SSH?

andrew
la source

Réponses:

0

Aucun moyen sauf si vous configurez un service supplémentaire sur le serveur.

Indépendamment du pare-feu, le principal problème est que HTTP ferme la connexion à chaque fois que la demande est satisfaite, alors que SSH nécessite une connexion ouverte en permanence.

Putnik
la source
Mais HTTP n'a pas à répondre à la demande. J'ai entendu dire que le logiciel de suivi de site Web calculait combien de temps une personne restait sur une page. Demandez à une page Web de charger un pixel transparent, mais ne terminez pas le téléchargement du fichier et le client maintiendra la connexion HTTP ouverte, généralement jusqu'à ce que l'utilisateur demande au navigateur Web de passer à une autre page.
TOOGAM
Est-il possible que je simule le client / serveur TCP local dans l'autre extrémité du tunnel SSH et utilise d'autres programmes (connectés à un serveur HTTP public) pour transférer les messages dans les deux sens? SSH peut être et sont généralement construits sur TCP non?
andrew
Le navigateur @TOOGAM a un délai de connexion et il est généralement de 60 secondes, ce qui est une méthode très inutile par rapport aux autres.
Putnik
@andrew vous devez avoir deux choses: 1) un logiciel de discussion sur le nœud http 2) un convertisseur qui écoute le port ssh, convertit les données reçues en base64 puis les poste sur le chat. Une autre boîte avec le même convertisseur écoute la discussion, décode en base64 et envoie à ssh, la même chose avec réponse.
Putnik
1
@Putnik Désolé, j'ai résolu le problème. Je décodais le bloc en base64 mais je stockais dans utf8 ... Maintenant, ça marche, merci pour l'instruction
andrew
0

Vous pourriez être intéressé par Tunneling HTTP .

Voir Puis-je tunneler un autre protocole via un proxy HTTP?

RedGrittyBrick
la source
La réponse de Putnik mentionnait le fait que SSH utilise un socket semi-ouvert (à la fois sur le client et sur le serveur?), Et à ma connaissance, il s’agit d’un élément d’information supplémentaire du message TCP. Par conséquent, je devrais être capable de trouver un moyen de reconfigurer la réaction du serveur HTTP à la méthode CONNECT, non? (Concernant votre lien vers l'autre question)
andrew
@andrew: le fait qu'un serveur HTTP ferme ou non une connexion après avoir répondu à une demande dépend de la version des options HTTP et HTTP spécifiées par le client et prises en charge par le serveur. Les serveurs HTTP peuvent garder les connexions ouvertes pour répondre à plusieurs requêtes consécutives ou pour renvoyer plusieurs réponses au client. Cependant, réaliser ce que vous voulez peut impliquer un travail important.
RedGrittyBrick
0

J'ai réussi à le faire même sans serveur HTTP (au sens strict):

tout ce que j’utilisais était node.js sur les deux côtés du client (un client ssh, un serveur ssh) ainsi que firebase pour stocker les tampons (convertis en chaînes) lus à partir du flux TCP et sous l’instruction générale de la réponse / commentaires de @ Putnik en gardant à l'esprit d'utiliser le allowHalfOpen option), le programme fonctionne avec peu de retard. Graphiquement, la connexion ressemble à ceci:

client1 (client ssh) & lt; = = gt; localhost1 (tcp, serveur fake-ssh)

client2 (serveur ssh) & lt; = = gt; localhost2 (tcp, fake-ssh client (s))

localhost1 & lt; => gt; firebase (ou un vrai serveur HTTP) & lt; = = gt; localhost2

Veuillez noter que des hôtes locaux aux serveurs Firebase / Server, on peut encoder / décoder les tampons comme on le souhaite - à condition qu'il s'agisse d'une paire de conversions sans perte. Par conséquent, le lien vers l’autre question de la réponse de @ RedGrittyBrick (en utilisant HTTP CONNECT ) devrait également fonctionner à condition que le privilège sur ce serveur soit suffisant et potentiellement plus rapide.

Bien sûr, il y a beaucoup de choses dans le code qui peuvent être améliorées, mais je pense qu'en termes de sécurité, cela ne devrait pas être moins sécurisé qu'une connexion directe utilisant openSSH. Corrigez-moi si j'ai tort, s'il-vous plait.

andrew
la source