web-dev-qa-db-fra.com

Comment créer un terminal Web à l'aide de xterm.js pour ssh dans un système sur un réseau local

Je suis tombé sur cette bibliothèque géniale xterm.js qui est également la base du terminal de Visual Studio Code. J'ai une question très générale.

Je veux accéder à une machine (ssh dans une machine) sur un réseau local via un terminal Web (qui est hors réseau, peut être sur un serveur aws). J'ai pu le faire dans un réseau local avec succès, mais je n'ai pas pu parvenir à une conclusion pour le faire à partir d'Internet -> réseau local.

Par exemple - An aws server running the application on ip 54.123.11.98 which has a GUI with a button to open terminal. I want to open terminal of a local machine which is in a local network somewhere behind some public ip on local ip 192.168.1.7.

L'exemple ci-dessus peut-il être réalisé en utilisant une sorte de solutions où je peux utiliser xterm.js afin que je ne doive pas aller pour construire un terminal basé sur le Web? Quels sont les principaux problèmes de sécurité que je dois garder à l'esprit lors de l'exposition des terminaux de cette façon?

Je pensais utiliser un serveur intermédiaire fixe entre AWS et l'IP du réseau local et utiliser une sorte de processus de tunnel ssh inverse pour le faire, mais je ne sais pas si c'est la bonne façon ou s'il pourrait y avoir une manière plus simple/meilleure pour y parvenir.

Je connais Digital Ocean, Google Cloud, ils le font tous, mais ils doivent se connecter à un ordinateur qui a une adresse IP publique alors que j'ai une machine dans un réseau local. Je ne veux pas vraiment configurer le routeur pour faire n'importe quel type d'installation.

24
Ankit Kulkarni

Après quelques recherches, le code fonctionne.

Les bibliothèques suivantes, vous devez comprendre comment son travail.

1) https://socket.io/

Cette bibliothèque est utilisée pour transmettre le package du client au serveur.

2) https://github.com/staltz/xstream

Cette bibliothèque est utilisée pour la vue du terminal.

3) https://github.com/mscdex/ssh2

Ceci est la bibliothèque principale. qui est utilisé pour établir la connexion avec votre serveur distant.

Étape 1: installez cette bibliothèque 3 dans votre dossier de projet

Setp 2: Commencez du côté du nœud créez un fichier server.js pour le socket ouvert

Étape 3: connexion du client de connexion au serveur de noeud (les deux se trouvent sur la machine locale)

La logique délicate est juste comment utiliser socket et ssh2

lors de l'émission de socket, vous devez déclencher la commande ssh à l'aide de la bibliothèque ssh2. sur la réponse de ssh2 (du serveur), vous devez transmettre le package de socket au client c'est tout

Ne pas écrire plus ici est l'exemple de code

https://github.com/ankitvadariya/ssh-client-connection

Cela comme avoir les fichiers et dossiers suivants

server.js
package.json
src/
xtream/

vous devez d'abord configurer l'adresse IP, l'utilisateur et le mot de passe de votre serveur ou le fichier cert sur server.js. et appuyez simplement sur le nœud server.js

P.S: N'oubliez pas d'exécuter npm install

Faites-moi savoir si vous avez des questions!

14
Ankit vadariya

Après quelques recherches plus tard, je suis tombé sur ce service: https://tmate.io/ qui fait parfaitement le travail. Cependant, si vous avez besoin d'un terminal Web de tmate, vous devez utiliser leurs serveurs ssh comme proxy inverse, ce qui, idéalement, ne me convenait pas. Cependant, ils fournissent tmate-server qui peut être utilisé pour héberger votre propre serveur proxy inverse, mais il manque l'interface utilisateur Web. Mais pour construire un système où vous devez accéder à un client derrière NAT via ssh sur le web, voici les étapes.

  • Installez et configurez tmate-server sur une machine cloud.
  • Installez tmate côté client et configurez pour vous connecter à une machine cloud.
  • Créez une application nodejs à l'aide de xterm.js (facile grâce à la communication basée sur WebSocket) qui se connecte à votre serveur tmate et transmet les commandes au client respectif. (Méfiez-vous des problèmes de sécurité liés à l'exposition de cette application, car vous passerez des commandes Linux).
  • Selon votre cas d'utilisation, vous pourriez avoir besoin d'un petit wrapper autour du client tmate côté client pour le démarrer/l'arrêter automatiquement ou via une interface utilisateur/action manuelle.

Remarque: j'ai également écrit un petit wrapper côté client pour démarrer/arrêter et transmettre les informations requises à un serveur API (écrit en nodejs) qui transmet ensuite les informations à une autre API qui connecte le navigateur à la session client respective . Depuis que nous avons écrit cette application, elle comprenait l'authentification ainsi que des restrictions de commande de ce qui peut être exécuté sur le terminal. Vous pouvez le personnaliser beaucoup.

0
Ankit Kulkarni