Как создать веб-терминал с помощью 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-адрес, пока у меня есть машина в локальной сети. Я действительно не хочу настраивать маршрутизатор для выполнения каких-либо настроек.
1 ответ
После нескольких исследований здесь работает код.
Следуя библиотекам, нужно понимать, как это работает.
Эта библиотека используется для передачи пакета от клиента к серверу.
2) https://github.com/staltz/xstream
Эта библиотека используется для просмотра терминала.
3) https://github.com/mscdex/ssh2
Это главная библиотека. который используется для установления соединения с вашим удаленным сервером.
Шаг 1: Установите эту 3 библиотеку в папку вашего проекта
Setp 2: начать со стороны узла создать файл server.js для открытого сокета
Шаг 3: Подключение клиентского сокета к серверу узла (оба находятся на локальной машине)
Хитрая логика заключается в том, как использовать сокет и SSH2
на выходе из сокета вам нужно запустить команду ssh с помощью библиотеки ssh2. при ответе ssh2 (с сервера) необходимо передать пакет сокета клиенту, вот и все
Не пишите больше, вот пример кода, который я загрузил для вас
Это как иметь следующие файлы и папки
server.js
package.json
src/
xtream/
Для начала вам необходимо настроить IP-адрес сервера, пользователя и пароль или файл сертификата на server.js. и просто нажмите на узел server.js
PS: не забудьте запустить npm install
Дайте мне знать, если у вас есть какие-либо вопросы!
Позже после некоторого исследования я наткнулся на этот сервис: https://tmate.io/, который отлично справляется со своей задачей. Хотя, если вам нужен веб-терминал tmate, вы должны использовать их ssh-серверы в качестве обратного прокси, что в идеале мне было неудобно. Однако они предоставляют tmate-server, который можно использовать для размещения вашего собственного обратного прокси-сервера, но не имеет веб-интерфейса. Но для создания системы, в которой вам нужно получить доступ к клиенту за NAT через ssh в Интернете, выполните следующие действия.
- Установите и настройте tmate-server на какой-нибудь облачной машине.
- Установите tmate на стороне клиента и настройте подключение к облачной машине.
- Создайте приложение nodejs с помощью xterm.js(легко из-за связи на основе WebSocket), которое подключается к вашему tmate-серверу и передает команды соответствующему клиенту. (Остерегайтесь проблем безопасности при раскрытии этого приложения, поскольку вы будете передавать команды Linux).
- В зависимости от вашего варианта использования вам может потребоваться небольшая оболочка вокруг клиента tmate на стороне клиента, чтобы запускать / останавливать его автоматически или с помощью пользовательского интерфейса / ручного действия.
Примечание: я написал небольшую оболочку на стороне клиента, а также для запуска / остановки и передачи необходимой информации серверу API (написанному на nodejs), который затем передает информацию другому API, который подключает браузер к соответствующему сеансу клиента.. Поскольку мы написали это приложение, оно включало аутентификацию, а также ограничения команд для того, что можно запускать на терминале. Вы можете многое настроить.