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