Здесь наслаиваются три транспорта, и у каждого своя кадрировка. Полезная нагрузка VPN идёт внутри сессии TLS, эта сессия TLS идёт внутри TCP-соединения к порту обратной петли, а байты этого соединения идут внутри SSH к relay-хосту, который открывает настоящее TCP-соединение к слушателю VPN. Ничто в этой схеме не меняет то, что OpenVPN аутентифицирует, и ничто в ней не делает слушатель UDP достижимым через TCP. Читайте остальное как описание пути байтов, а не как рецепт обхода сетевого контроля.

Что на самом деле перемещает локальная переадресация

Клиент SSH слушает локальный порт. Когда локальный процесс подключается, клиент упаковывает байты в свой зашифрованный канал, а серверная сторона открывает новое TCP-соединение к пункту назначения, названному в запросе переадресации.

Этот пункт назначения разрешает relay, а не ваша машина, поэтому имя, существующее только внутри удалённой сети, всё ещё работает. Это также значит, что relay должен уметь достичь слушателя VPN и иметь обратный маршрут к нему. Имя, разрешаемое на вашем ноутбуке, ничего не говорит о том, что видит relay.

Запуск сессии SSH доказывает только то, что relay достижим и аутентифицирован. Он ничего не говорит о том, работает ли следующий слушатель, принимает ли соединение межсетевой экран между relay и слушателем или примет ли VPN ваш профиль.

Направьте клиента на локальный слушатель

Объявленный пример: relay достигает слушателя TCP на gw.internal.example:443, а высокий локальный порт открывает этот путь только этой машине.

ssh -N -L 127.0.0.1:24011:gw.internal.example:443 [email protected]

Руководство OpenSSH описывает локальную переадресацию как локальный приём TCP-соединений и открытие следующего соединения с удалённой стороны. Привязывайте слушатель к обратной петле, а не ко всем интерфейсам, потому что переадресация, достижимая из сети, — это открытый relay с вашим именем. Привязка с подстановочным знаком также открывает порт любой другой локальной учётной записи на общей машине.

Затем переведите клиент VPN в режим TCP и направьте его на 127.0.0.1:24011. Если профиль использует UDP, эта схема не поможет: переадресация несёт поток байтов, и пути дейтаграмм через неё нет.

Держите две аутентификации раздельно

SSH аутентифицирует relay-хост. OpenVPN по-прежнему аутентифицирует партнёра VPN, и назначение на обратной петле не меняет этого требования. Отключение проверок сертификата из-за того, что сокет теперь указывает на localhost, — худшее сокращение в этой схеме. Оно превращает транспортную договорённость в договорённость о доверии, и на вторую никто не соглашался.

Сохраняйте якорь доверия профиля, проверку роли сервера и проверку имени нетронутыми. Если ваш клиент сравнивает имя сервера с адресом, на который звонил, обратной петле может понадобиться явная настройка имени вместо отключённой проверки, и документация профиля — то место, где подтверждают, какое поле сравнивается.

Относитесь к relay как ко второй стороне в истории доверия: его администратор видит метаданные соединений и может перенаправить переадресацию, если конфигурация изменится. Схеме нужно одобрение и relay, и владельца службы VPN, а не только того, кому это нужно сегодня.

Не стройте петлю под туннелем

После того как VPN установит маршруты, несущему его SSH-соединению всё ещё нужен путь к relay, не проходящий через туннель. Если маршрут по умолчанию переходит к VPN, а relay доступен только через тот же туннель, транспорт рушится, и VPN уходит вместе с ним. Сбой выглядит как упавший туннель, а не как ошибка маршрутизации, поэтому его неверно диагностируют.

Обычное исправление — маршрут к хосту по адресу relay, закреплённый за физическим интерфейсом до поднятия туннеля, плюс проверка, что маршрут переживает переподключение. Проверьте его поиском маршрута для адреса relay, а не предположением, что порядок был верным.

Ожидайте также, что этот стек будет медленнее и хрупче прямого соединения, потому что теперь есть два упорядоченных транспорта и ещё одна конечная точка для обслуживания. Это способ пересечь сетевую границу, а не техника производительности.

Закройте слушатель, когда закончите

Остановите сессию SSH, когда туннель больше не нужен, и подтвердите, что локальный порт освобождён. Забытая переадресация держит аутентифицированный путь открытым на машине, которая может быть общей.

Просмотрите также разрешённые пункты назначения переадресации на relay, потому что снисходительная конфигурация превращает любую скомпрометированную учётную запись в общую точку опоры. Запишите порт, relay и пункт назначения вместе, чтобы следующий человек знал, для чего была переадресация и одобрена ли она ещё.

Похожие статьи