SSH к машине за NAT

Время · ~5 мин Уровень · Начальный Протокол · SSH (любой TCP)

Вам нужна оболочка на машине без публичного IP — компьютер в офисе, Raspberry Pi дома, сервер на линии с carrier-grade NAT — а вы сидите за своим ноутбуком, тоже за NAT. Ни одна из сторон не может принять входящее соединение. С LRO это не проблема: оба агента устанавливают исходящие соединения, и вы подключаетесь по SSH к локальному порту на ноутбуке, который ведёт на удалённую машину.

Роли для этой задачи: удалённая машина, на которой работает sshd — это Client (эндпоинт живёт на ней); ваш ноутбукSupport (он открывает локальный порт, к которому вы подключаетесь по ssh). Если названия кажутся перевёрнутыми, см. выбор роли агента. Всё это в новинку? Начните с вашего первого туннеля.

  1. Убедитесь, что SSH работает на удалённой машине

    На машине, к которой нужен доступ, демон SSH должен слушать локально — по умолчанию на порту 22. Ничего из этого не должно смотреть в интернет; LRO подключается к нему с той же машины.

    $ ss -ltn | grep :22 # sshd listening on 127.0.0.1:22 or 0.0.0.0:22

    Удалённая машина запускает агента LRO в режиме Client, а ваш ноутбук — в режиме Support; зарегистрируйте обоих, как в вашем первом туннеле, если ещё не сделали этого.

  2. Добавьте SSH-эндпоинт на агенте-клиенте

    В панели — Endpoints → Create endpoint (эндпоинты → создать эндпоинт). Выберите клиентского агента (удалённую машину), назовите его, например, Office SSH, и задайте target (цель) 127.0.0.1 и port (порт) 22.

    Endpoints list with an Office SSH endpoint pointing at 127.0.0.1:22
    Рис. 1. SSH-эндпоинт живёт на агенте-клиенте — цель 127.0.0.1:22.
  3. Откройте туннель со своей машины

    Tunnels → Add tunnel (туннели → добавить туннель). Выберите свой ноутбук как саппорт-агента, выберите эндпоинт Office SSH и задайте listen port (локальный порт) — любой свободный локально, например 2222. Создайте его; через мгновение он станет Active (активен).

    Tunnels table with an active SSH tunnel listening on 0.0.0.0:2222
    Рис. 2. Активный SSH-туннель — ваша машина слушает на 2222 и пересылает на удалённый 127.0.0.1:22.
  4. Подключитесь по SSH к локальному порту

    На своём ноутбуке подключитесь по SSH к локальному порту. Соединение попадает на sshd удалённой машины через зашифрованный туннель:

    $ ssh user@127.0.0.1 -p 2222
    Terminal showing an SSH session established through the LRO tunnel
    Рис. 3. Настоящая оболочка на удалённой машине — через порт, который существует только на вашем ноутбуке.

    Всё, что работает поверх SSH, работает так же, будучи направленным на локальный порт:

    $ scp -P 2222 file.tar.gz user@127.0.0.1:/tmp/ $ sftp -P 2222 user@127.0.0.1 $ rsync -e 'ssh -p 2222' -a ./dir user@127.0.0.1:/srv/

    Чтобы не вводить порт каждый раз, добавьте блок host в ~/.ssh/config:

    # ~/.ssh/config Host office HostName 127.0.0.1 Port 2222 User user

    … и тогда достаточно ssh office.

Заметки

Достучитесь до своей машины, не открыв ни единого входящего порта.

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