Подключение к SSH серверу за NAT

Вопрос или проблема

У меня есть ситуация, где целевая машина находится за стандартным домашним маршрутизатором/брандмауэром/NAT (назовем ее target), и машина с известным публичным IP-адресом (назовем ее server).

С server я хочу подключиться по SSH к target, для чего у меня есть учетные данные. Однако пользователь на target не имеет учетных данных для server. Таким образом, нет возможности для пользователя на target настроить перенаправление порта SSH на server. Если бы это было возможно, они могли бы использовать стандартный метод удаленного перенаправления порта с ssh -R. Хотя у меня есть учетные данные для target, я не имею контроля над его маршрутизатором/брандмауэром/NAT, и я должен действовать, исходя из предположения, что порт 22 не перенаправляется на NAT-адрес target.

У меня появилось три идеи:

Идея 1: Временные пользователи (я ненавижу это)

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

Идея 2: Какой-то прокси (я не знаю, как это сделать)

Я пока не могу до конца это осмыслить, но, используя все хитрости SSH, такие как перенаправление портов, прокси, nc и т. д., кажется, я должен быть способен сделать что-то, где я скажу target подключиться к порту на server и как-то превратить это в туннель, через который я могу войти на target. Эта идея в лучшем случае полусырна. Единственный способ, который я могу представить без наличия у кого-то на target учетных данных для server, это открыть порт на server, подключить target к этому порту с помощью nc, и как-то использовать это, чтобы пойти в обратном направлении и подключиться к target с server через SSH.

Идея 3: Wireguard (нужно передать публичный ключ от target к server)

Просто подключив их к одной VPN, задача была бы выполнена. Wireguard был бы легким, пока у меня есть разумный способ обмена публичными ключами между target и server. Это легко в одном направлении (распространение публичного ключа server на target), но из-за природы устройства target и его пользователей получение ключа от них возможно, но не очень удобно для пользователя.

Итак, конкретно, меня интересуют мысли по идее 2. Я могу сделать 1 или 3, но кажется, я упускаю что-то, что сделало бы возможным просто подключиться по SSH к target с server. Какие мысли? Спасибо!

Для вашей второй идеи, я полагаю, вам нужно SSH обратное перенаправление порта. Есть вопрос здесь, который спрашивает об установке этого – и ответ постера охватывает по крайней мере одно требование к конфигурации.

С использованием этой идеи, вы можете создать обратную связь двумя способами – во-первых, вы можете сделать так, чтобы SSH заходил на server для перенаправления на target, или вы можете сделать так, чтобы SSH заходил на localhost на вашей внешней системе и перенаправлялся на target. Лично я бы рекомендовал последнее, особенно учитывая, что вы явно указываете, что не контролируете правила брандмауэра server.

Имейте в виду, что если соединение от target к server или вашему внешнему хосту прервется, этот туннель станет недоступным. У меня нет хорошего решения для этой проблемы, кроме как написать скрипт, который контролирует (начальное) исходящее SSH-соединение от target и перезапускает его, если оно завершается.

Также, я считаю необходимым добавить, что если target и/или server являются рабочими машинами, это может рассматриваться как намеренное нарушение процедур безопасности, что может иметь весьма негативные последствия для вас. Однако вы лучше знаете ваше окружение, чем я, поэтому должны определить, применим ли этот последний пункт, и насколько это важно, если он применим.

(немного сбивает с толку, что вы решили назвать клиента “server”, а сервер “target” в вашем описании)

Что касается варианта с VPN… если невозможно использовать UDP (UDP с NAT может быть сложным), то это может быть плохим вариантом. Запуск TCP-соединений через TCP-VPN вроде бы работает, но возникают проблемы, когда начинают действовать алгоритмы управления перегрузками.

Использование SSH для перенаправления портов фактически является VPN – хотя и такой, где нужно запускать процесс для каждого порта. В сущности, “прокси” решение также представляет собой то же исправление без явной реализации шифрования.

Вариант 2 будет тривиален в настройке и (согласно вашим комментариям) может быть выполнен с помощью netcat – но это открывает еще одну открытую службу на хосте, обозначенном как “server”, без какой-либо аутентификации. Мне кажется, это в корне неправильно. Вы могли бы использовать механизм стука в порт, чтобы уменьшить экспозицию (в Интернете много примеров, это можно сделать всего несколькими командами iptables). В качестве альтернативы вы можете использовать туннель HTTP[s] с (например) squid на “server” и corkscrew на “target”. Это поддерживает аутентификацию для канала.

Вы не сказали, почему ненавидите SSH решение, и почему хотите быстро удалить пользователя. Учитывая, что, вероятно, не нужно устанавливать дополнительное программное обеспечение или применять настройки на “target”, это кажется наиболее подходящим решением.

.

Ответ или решение

Для подключения к SSH-серверу, который находится за NAT, и выполнения задачи, описанной в вашем вопросе, необходимо найти решение, которое позволит установить соединение между вашими машинами, не нарушая при этом ограничений безопасности. Ваша текущая ситуация подразумевает наличие устройства "target", расположенного за NAT/файерволом, и устройства "server", имеющего публичный IP-адрес. При этом у вас есть учетные данные для доступа к "target", но нет контроля над NAT, что исключает возможность использования прямого переадресации портов. Давайте подробнее рассмотрим каждый из предложенных вами вариантов решения.

Теория

Идея 1: Создание временных пользователей

Этот подход предполагает создание временного пользователя на "server" и предоставление этих данных пользователям на "target" для настройки SSH переадресации. Хотя это и функционально, вы отметили, что не хотите использовать этот метод. Основной проблемой здесь является безопасность и необходимость управления дополнительными учетными данными, что увеличивает сложность и потери времени.

Идея 2: Использование прокси или nc

Ваше второе предложение – использовать комбинацию различных SSH приемов, таких как переадресация портов и утилиты вроде nc, для создания туннеля между "server" и "target". Это решение требует тщательного подхода к безопасности и навыков в настройке различных инструментов сети.

Идея 3: Использование WireGuard

WireGuard может служить отличным решением для организации VPN-сети между "target" и "server", причем вы отметили трудности в передаче открытого ключа от "target" к "server". Однако, как только настройка произведена, это решение обеспечивает надежное и безопасное соединение.

Пример

Возвращаясь к вашему запросу о помощи с идеей 2, давайте рассмотрим концепцию SSH обратной переадресации портов. Обратная переадресация портов (ssh -R) позволяет инициировать соединение с клиентом, находящимся за NAT, так чтобы он подключался к публичному серверу, открывая необходимый порт для обратного подключения от сервера на клиент.

Пример конфигурации:

  1. На "target" запустите: ssh -R 2222:localhost:22 user@server, где 2222 – открытый порт на "server", на который можете подключаться из любого места.
  2. На сервере выполните ssh -p 2222 user@localhost, чтобы инициировать соединение с "target".

Применение

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

  1. Создание скрипта для восстановления соединения: Поскольку коннект может быть прерван ввиду проблем с сетью, рекомендуется реализовать скрипт, который будет периодически проверять состояние соединения и автоматически его восстанавливать в случае разрыва.

  2. Безопасность: Любая открытая услуга на "server" представлена в публичной сети, что может нести определенные риски. Рассмотрите применение методов аутентификации и шифрования, включая механизмы вроде port knocking или использование тоннелей на основе HTTPS с аутентификацией.

  3. Проверка соответствия политике безопасности: Предложенный метод может восприниматься как использование обходного решения для политик безопасности. Прежде чем применить его, необходимо убедиться, что он соответствует корпоративным стандартам.

  4. Установка WireGuard в качестве альтернативного решения: Если SSH-решение покажется неудовлетворительным, настройка VPN с использованием WireGuard может предоставить дополнительный уровень защищенности и надежности.

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

Таким образом, в вашем случае наиболее эффективно использовать SSH с обратной переадресацией портов, оптимально сбалансировав простоту реализации и уровень безопасности.

Оцените материал
Добавить комментарий

Капча загружается...