Как создать веб-терминал с помощью xterm.js для подключения по ssh к системе в локальной сети

Я наткнулся на эту замечательную библиотеку xterm.js, которая также является основой для терминала Visual Studio Code. У меня очень общий вопрос.

Я хочу получить доступ к машине (ssh к машине) в локальной сети через веб-терминал (который находится вне сети, может быть на сервере aws). Я смог успешно сделать это в локальной сети, но не смог сделать это из Интернета --› локальная сеть.

Например - 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.

Можно ли реализовать приведенный выше пример с помощью каких-либо решений, в которых я могу использовать xterm.js, чтобы мне не пришлось заниматься созданием веб-терминала? Какие основные проблемы безопасности следует учитывать при таком раскрытии терминалов?

Я думал о том, чтобы использовать фиксированный промежуточный сервер между AWS и IP-адресом локальной сети и использовать для этого какой-то обратный процесс ssh-туннеля, но я не уверен, что это правильный путь или может быть более простой/лучший способ для достижения этой цели.

Я знаю Digital Ocean, Google Cloud, все они делают это, но им нужно подключиться к компьютеру с общедоступным IP-адресом, в то время как у меня есть машина в локальной сети. Я действительно не хочу настраивать маршрутизатор для выполнения каких-либо настроек.


person Ankit Kulkarni    schedule 28.08.2017    source источник
comment
В xterm.js есть ошибка. Ошибка в том, что он использует выбор текстового поля вместо выбора термина.   -  person    schedule 08.04.2020


Ответы (2)


После небольшого исследования вот рабочий код.

Библиотеки:

1) https://socket.io/

Эта библиотека используется для передачи пакета от клиента к серверу.

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

Эта библиотека используется для терминального просмотра.

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

Это основная библиотека, которая используется для установления соединения с вашим удаленным сервером.

Шаг 1: Установите библиотеку 3 в папку вашего проекта.

Шаг 2: Начните со стороны узла, создайте файл server.js для открытого сокета.

Шаг 3: Сокет клиента подключения к серверу узла (оба находятся на локальной машине)

Сложная логика заключается в том, как использовать сокет и ssh2.

При выпуске сокета вам необходимо запустить команду SSH, используя библиотеку ssh2. При ответе библиотеки ssh2 (от сервера) вам необходимо передать пакет сокета клиенту. Вот и все.

Нажмите здесь, чтобы найти пример.

В этом примере будут следующие файлы и папки:

Type    Name
------------
FILE    server.js
FILE    package.json
FOLDER  src
FOLDER  xtream

Сначала вам нужно настроить IP-адрес сервера, пользователя и пароль или файл сертификата на server.js и просто запустить node server.js.

P.S.: Не забудьте запустить npm install

Дайте знать, если у вас появятся вопросы!

person Ankit vadariya    schedule 01.09.2017
comment
Спасибо, Анкит, за такую ​​​​помощь (первая часть потока была действительно полезной). Я тоже протестирую код как можно скорее и дам вам знать. Примет ответ слишком рано - person Ankit Kulkarni; 02.09.2017
comment
Конечно .. пожалуйста, дайте мне знать, если у вас есть какие-либо проблемы или вопросы. Рад был помочь. Спасибо - person Ankit vadariya; 04.09.2017
comment
Спасибо @Ankitvadariya. Код работал отлично после внесения нескольких изменений. Не могли бы вы также описать, как бы вы подошли к тому же самому, если у вас есть 1) - несколько клиентов Linux за NAT (у которых нет общедоступного IP-адреса) 2) - сервер aws 3) - клиент хочет предоставить серверу доступ к своему терминал Поскольку клиент находится за NAT, сервер не может напрямую подключиться к нему по ssh. Я думаю, что мы можем использовать клиент для подключения по ssh к серверу и использовать обратное туннелирование ssh для получения клиентского доступа, но каков будет поток процесса и как он будет работать. Можно ли это сделать, изменив приведенный выше код? - person kartik; 06.09.2017
comment
@kartik да, ты можешь это сделать. Вы должны запустить пакет сокетов в частном канале вместо глобального канала. ssh2 поддерживает почти все. github.com/mscdex/ssh2 Вам нужно просто реализовать подобную хитрую логику! - person Ankit vadariya; 06.09.2017
comment
@Ankitvadariya, не могли бы вы пролить на это немного больше света, у меня нет опыта работы с узлами. Если вы можете указать на документацию, это было бы здорово - person Ankit Kulkarni; 06.09.2017
comment
@AnkitKulkarni, конечно, пожалуйста, дайте мне знать, что вы хотите понять. я сделаю это. - person Ankit vadariya; 07.09.2017

После некоторых исследований позже я наткнулся на этот сервис: https://tmate.io/, который отлично справляется со своей задачей. Хотя, если вам нужен веб-терминал tmate, вы должны использовать их ssh-серверы в качестве обратного прокси-сервера, что в идеале меня не устраивало. Однако они предоставляют tmate-server, который можно использовать для размещения вашего собственного обратного прокси-сервера, но без веб-интерфейса. Но чтобы создать систему, в которой вам нужно получить доступ к клиенту за NAT через ssh в Интернете, выполните следующие действия.

  • Установите и настройте tmate-server на какой-нибудь облачной машине.
  • Установите tmate на стороне клиента и настройте подключение к облачному компьютеру.
  • Создайте приложение nodejs, используя xterm.js (легко из-за связи на основе WebSocket), которое подключается к вашему tmate-серверу и передает команды соответствующему клиенту. (Остерегайтесь проблем с безопасностью при раскрытии этого приложения, так как вы будете передавать команды Linux).
  • В зависимости от вашего варианта использования вам может понадобиться небольшая оболочка вокруг клиента tmate на стороне клиента, чтобы запускать/останавливать его автоматически или с помощью некоторого пользовательского интерфейса/ручного действия.

Примечание. Я также написал небольшую оболочку на стороне клиента, чтобы запускать/останавливать и передавать необходимую информацию на сервер API (написанный на nodejs), который затем передает информацию другому API, который подключает браузер к соответствующему клиентскому сеансу. . Поскольку мы написали это приложение, оно включало аутентификацию, а также ограничения команд, которые можно запускать на терминале. Вы можете настроить его много.

person Ankit Kulkarni    schedule 30.07.2019