SSH к домашнему Linux без белого IP

Как зайти по SSH на домашний Linux с ноутбука из другой сети: закрытый канал DevProxy, отдельные ключи и проверка отпечатка сервера.

Обновлено:

Содержание

Вы оставили дома компьютер с Linux и хотите поработать с ним с ноутбука. SSH дома уже настроен, но провайдер не даёт белый IP или у вас нет доступа к роутеру. Установите DevProxy на оба компьютера и соедините их закрытым каналом. После этого на ноутбуке можно открыть терминал домашнего Linux обычной командой ssh.

Оба компьютера должны быть вашими, и на каждом нужен DevProxy. Публичный TCP и внешний порт здесь не нужны: канал закрыт, а ноутбук получает собственный ключ и явное разрешение на этот канал.

Что понадобится

  • Домашний компьютер с Linux, где OpenSSH уже работает и у вас есть обычная учётная запись.
  • Ноутбук с Windows, Linux или macOS.
  • DevProxy на обоих компьютерах. Установка и первый запуск описаны в статье «Начать пользоваться DevProxy».
  • Два обычных ключа DevProxy: один для домашней машины, второй для ноутбука.
  • Свободные ресурсы тарифа. На Free сейчас доступны три канала, две выдачи доступа и 5 ГиБ трафика в месяц. Эти значения общие для пространства и учитывают уже созданные каналы.

Роутер, брандмауэр и настройки SSH-сервера в этой инструкции не меняются. SSH остаётся доступен на самом домашнем компьютере, а наружу его выводит DevProxy через закрытый канал.

Если SSH ещё не установлен, начните с официальной инструкции Ubuntu. Дальше мы будем подключаться к уже работающему SSH на самом домашнем компьютере. В примере он использует порт 22.

Сначала проверьте вход дома

Туннель не поможет, если SSH не работает на самом домашнем компьютере. Откройте на нём терминал и войдите на него же по локальному адресу:

ssh linuxuser@127.0.0.1

linuxuser замените на имя своей учётной записи Linux. После входа по паролю или SSH-ключу появится приглашение вида linuxuser@home:~$. Значит, локальный вход работает. Выйдите командой exit.

Если вместо этого сразу приходит Connection refused, сервер SSH не запущен или слушает другой порт. Проверьте состояние службы и порт. Когда SSH работает на другом порту, запомните его: в настройках канала ниже нужно будет заменить число 22.

Теперь запишите отпечаток ключа домашнего сервера. Он понадобится при первом подключении с ноутбука:

sudo ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub

В ответе будет строка вида 256 SHA256:... root@home (ED25519). Сохраните её или сфотографируйте экран. Если сервер использует другой тип ключа, возьмите соответствующий файл, например ssh_host_rsa_key.pub. Отпечаток нужен, чтобы убедиться, что ноутбук разговаривает именно с этим компьютером.

Создайте два ключа DevProxy

В кабинете откройте «Ключи доступа» и создайте два обычных ключа.

Первый, для домашней машины, назовите «Домашний Linux». Выберите готовый вариант «Удалённый стол или TCP-сервис» и убедитесь, что включено право «Публиковать TCP-сервисы». Пункт «Публичный TCP-порт» и права управления пространством не нужны.

Второй, для ноутбука, назовите «Ноутбук». Выберите «Подключение к частному сервису» и оставьте право «Подключаться к частным сервисам».

Общая форма ключа для публикации TCP-сервиса
Общая форма ключа для публикации TCP-сервиса

На картинке показан общий пример с удалённым рабочим столом. Для SSH нужна та же роль с правом публикации TCP-сервиса, а название можно взять своё.

Каждый ключ показывается один раз, поэтому сразу сохраните его. Ключ ноутбука не заменяет SSH-пароль и не даёт входа в Linux. DevProxy разрешает добраться до нужного компьютера. Затем SSH отдельно проверяет имя пользователя и пароль или SSH-ключ.

Настройте канал на домашнем Linux

Откройте файл настроек DevProxy. Обычно в Linux это ~/.config/devproxy/devproxy.yml. Команда devproxy init показывает фактический путь, создаёт файл, если его ещё нет, и сохраняет существующий. Если в файле уже есть рабочие каналы, не стирайте их: добавьте новую запись в список tunnels.

Для чистого файла подойдёт такой пример:

server: https://control.devtunnels.ru
reconnect: true
tunnels:
  - name: home-ssh
    kind: tcp
    local: tcp://127.0.0.1:22
    privateRelay: true
    transport: relay
    token: КЛЮЧ_ДОМА

name задаёт имя канала, local указывает, куда DevProxy подключается на домашнем компьютере. Здесь это локальный SSH на порту 22. Если sshd слушает другой порт, замените 22 на фактическое число. privateRelay: true делает канал закрытым, а transport: relay передаёт трафик через сервер DevProxy. Вместо КЛЮЧ_ДОМА вставьте первый ключ.

Сохраните файл и запустите:

devproxy start

В разделе «Туннели» появится канал home-ssh с отметкой, что он в сети, и адрес вида relay://home-ssh.ваше-пространство.devtunnels.ru. Имя и адрес копируйте из кабинета: если канал назван иначе, используйте своё значение.

Выдайте доступ ключу ноутбука

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

В разделе «Туннели» найдите блок «Доступ к частным туннелям». В поле «Туннель» выберите home-ssh, в поле «Ключ» выберите ключ «Ноутбук» и нажмите «Выдать доступ». В списке появится новая запись с этим каналом и ключом.

Общая форма выдачи доступа к закрытому каналу
Общая форма выдачи доступа к закрытому каналу

Иллюстрация общая: на ней показан канал rdp и другой ключ. В вашей форме должны быть home-ssh и ключ ноутбука.

Настройте ноутбук и войдите

На ноутбуке откройте его файл настроек. Обычно в Windows это %APPDATA%\DevProxy\devproxy.yml, а в Linux и macOS ~/.config/devproxy/devproxy.yml. Фактический путь можно посмотреть командой devproxy init.

Добавьте запись в список connectors. Существующие записи сохраните:

server: https://control.devtunnels.ru
reconnect: true
connectors:
  - kind: tcp
    host: home-ssh.ваше-пространство.devtunnels.ru
    localPort: 2222
    transport: relay
    token: КЛЮЧ_НОУТБУКА

В host вставьте адрес канала без relay://, без косой черты и без пути. Значение localPort: 2222 задаёт вход на самом ноутбуке, через который SSH попадёт в закрытый канал. Порт домашнего сервера здесь не указывается. Вместо КЛЮЧ_НОУТБУКА вставьте второй ключ.

Запустите devproxy start и на ноутбуке. В окне программы дождитесь сообщения, что локальное подключение готово и слушает порт 2222.

Теперь откройте терминал на ноутбуке и выполните:

ssh -o HostKeyAlias=home-linux-devproxy -p 2222 linuxuser@127.0.0.1

Здесь 127.0.0.1 и порт 2222 относятся к ноутбуку: на этом адресе слушает DevProxy. Вместо linuxuser укажите имя учётной записи домашнего Linux. Логин от кабинета DevProxy сюда не подходит. HostKeyAlias даёт этой машине постоянное имя при проверке ключа хоста. Без него SSH запомнил бы ключ просто для 127.0.0.1:2222 и мог бы перепутать его с другим каналом на том же порту. Это не отключение проверки, а понятное имя для неё.

При первом подключении SSH покажет отпечаток и спросит, доверять ли хосту. Сравните его с тем, что записали на домашнем компьютере. Если строки SHA256: совпадают, введите yes. Если отличаются, введите no и остановитесь: вместо вашего сервера ответило что-то другое.

Затем SSH попросит пароль вашей учётной записи Linux или использует настроенный SSH-ключ. После успешного входа появится приглашение домашнего Linux. Дальше работают привычные команды.

Если что-то не работает

  • Дома команда `ssh linuxuser@127.0.0.1` отвечает `Connection refused`. Проблема в самом SSH, до DevProxy. Проверьте, запущена ли служба, и тот ли порт указан в local. Установка описана в инструкции Ubuntu, настройки роутера здесь не нужны.
  • DevProxy показывает Reconnect или отказ доступа. Проверьте три вещи: канал home-ssh в сети, в host указан адрес без relay://, и для ключа ноутбука выдано разрешение именно на home-ssh. Без разрешения сервер сообщает, что нужен доступ к туннелю.
  • SSH пишет `Permission denied (publickey,password)`. Соединение дошло до Linux, значит канал работает. Проверьте имя учётной записи, пароль или SSH-ключ. Не отключайте проверку пользователя ради обхода ошибки. Вход по заранее настроенному SSH-ключу тоже подходит.
  • SSH предупреждает, что ключ хоста изменился. Остановитесь и сравните отпечаток с домашним компьютером. Причина может быть в переустановке системы или в другом устройстве на том же порту. Не удаляйте known_hosts и не добавляйте StrictHostKeyChecking=no: так проверка подлинности просто исчезнет.
  • Порт 2222 на ноутбуке занят. Выберите другой, например 2223, поменяйте localPort и -p в команде ssh. Оба числа должны совпадать.

После работы

Закройте сеанс командой exit или сочетанием Ctrl+D. Для следующего входа DevProxy должен работать на обоих компьютерах. Сон или выключение любого из них прерывает подключение.

Если доступ больше не нужен, отзовите разрешение для ключа ноутбука или сам ключ. В следующий раз понадобятся запущенный DevProxy с обеих сторон и действующее разрешение.

Схема рассчитана на терминал SSH. Для графического рабочего стола нужен другой сценарий. Скорость и задержка зависят от двух интернет-соединений и от компьютеров, постоянная работа круглосуточно не обещается. Публичный TCP здесь не требуется, зато DevProxy должен быть установлен на обоих компьютерах.

Попробуйте бесплатно

Бесплатного тарифа хватает на все сценарии из инструкций.

Создать аккаунт

Другие инструкции