Здравствуйте! Мир удаленного доступа с использованием SSH, вам интересно? В прошлых записях мы обсуждали генерацию SSH-ключей, основные команды доступа и локальную переадресацию портов (-L
опция). На этот раз мы сосредоточимся на другой мощной функции SSH - реверсивной переадресации портов, то есть на опции -R
.
Если -L
опция "прокладывает туннель из моего компьютера для доступа к внешним ресурсам", то -R
опция делает наоборот. Она позволяет "проложить туннель с внешнего компьютера на мой компьютер для доступа к внутренним ресурсам", как бы создавая дверь в стене.
Что такое реверсивная переадресация портов? (Обзор опции -R)
В общем, трудно получить прямой доступ к локальному компьютеру (Client B) с удаленного сервера (Server A). Это связано с тем, что Client B может использовать частный IP-адрес, находиться за файрволом или не иметь фиксированного IP-адреса.
В таком случае использование реверсивной переадресации портов (-R
опция) позволяет Client B попытаться подключиться к Server A по SSH и одновременно открыть туннель для передачи запросов, приходящих на определенный порт Server A, на определенный порт Client B.
Проще говоря:
- Client B (мой компьютер) пытается подключиться к Server A (внешнему серверу) по SSH.
- При этом используется опция
-R
, чтобы сообщить: "Перенаправь запросы, приходящие на X-й порт Server A, на Y-й порт моего компьютера (Client B)!". - Теперь, когда другой внешний пользователь подключается к X-му порту Server A, этот запрос будет передан на Y-й порт Client B через SSH-туннель.
Это похоже на то, как Client B просит Server A: "Создай мне дверь, через которую можно подключиться".
-R
конструкция команды
Основной формат команды реверсивной переадресации портов выглядит следующим образом.
ssh -R [удаленный_порт]:[целевой_хост]:[целевой_порт] [пользователь_удаленного_сервера]@[адрес_удаленного_сервера]
Давайте подробнее рассмотрим каждый компонент.
ssh
: команда для запуска SSH-клиента.-R
: опция реверсивной переадресации портов.[удаленный_порт]
: номер порта удаленного сервера (Server A), через который будет установлен туннель. Когда внешние пользователи подключаются к этому порту, они будут связаны с ресурсами Client B.[целевой_хост]
:[пользователь_удаленного_сервера]@[адрес_удаленного_сервера]
- имя хоста или IP-адрес ресурса, к которому нужно получить доступ внутри Client B (моего компьютера). В большинстве случаев это будетlocalhost
(т.е. сам Client B).[целевой_порт]
: номер порта сервиса, открытого внутри Client B (моего компьютера). Это место, куда в конечном итоге будет отправлен запрос из внешнего источника.[пользователь_удаленного_сервера]@[адрес_удаленного_сервера]
: учетная запись и адрес внешнего сервера (Server A), с которым будет установлено соединение через туннель. Это путь, по которому Client B подключается к Server A.
Пример:
Когда я хочу получить доступ к веб-серверу на порту 8080 на моем локальном компьютере (Client B) через порт 8888 удаленного сервера (Server A):
# Выполняется на Client B (моем компьютере)
ssh -R 8888:localhost:8080 user@server_a_public_ip
Если эта команда выполнится успешно, я буду подключен по SSH к server_a_public_ip
. В этом случае, когда кто-то подключается к http://server_a_public_ip:8888
, на самом деле они попадают на 8080-й порт Client B (моего компьютера).
Когда полезна реверсивная переадресация портов? (Использование в процессе разработки)
Реверсивная переадресация портов оказывается очень мощным инструментом в ситуациях, которые трудно решить обычным SSH-подключением. Она особенно полезна в процессе разработки.
1. Публикация локального сервера разработки за NAT/фаерволом
- Проблема: У вас есть веб-приложение, разрабатываемое в домашней или корпоративной сети (например, запущенное на
localhost:3000
), и вы хотите показать его членам команды или клиентам, но локальный компьютер использует частный IP-адрес и не может быть доступен извне. Настройки маршрутизатора или фаервола корпоративной сети могут быть сложными и требовать одобрения администраторов. - Решение: Через внешний сервер с публичным IP-адресом (например, экземпляр AWS EC2, VPS) можно выставить локальный сервер разработки наружу.
# Выполняется на моей локальной машине (Client B)
ssh -R 80:localhost:3000 your_user@your_public_server.com
# или, поскольку порт 80 требует прав root, используйте другой порт (например, 8080)
ssh -R 8080:localhost:3000 your_user@your_public_server.com
После этого, при подключении к `your_public_server.com:8080`, фактически будет доступно ваше веб-приложение, работающее на вашей локальной машине (`localhost:3000`). Теперь вы можете в реальном времени показывать свои разработки внешним участникам.
2. Тестирование вебхуков (Webhook)
- Проблема: Вы хотите протестировать события вебхуков, происходящие в таких системах, как платежные системы, репозитории Git (GitHub/GitLab), платформы обмена сообщениями и т.д., на локальном сервере разработки. Но вебхуки могут быть отправлены только на публичный URL.
- Решение: Реверсивная переадресация портов позволяет сопоставить локальный вебхука-эндпоинт (например,
localhost:5000/webhook
) с определенным URL на публичном сервере.
# Выполняется на моей локальной машине (Client B)
ssh -R 5000:localhost:5000 your_user@your_public_server.com
Теперь вы можете ввести `http://your_public_server.com:5000/webhook` в настройках вебхука, и события вебхука будут переданы на ваш локальный сервер для тестирования.
3. Прямой доступ к определенному порту удаленного сервера (обход защищенной сети)
- Проблема: Вы хотите получить доступ к базе данных или внутреннему инструменту управления, установленному на определенном сервере удаленного (Client B) (например, работает на
localhost:9000
), но доступ к этому серверу заблокирован файрволом или находится внутри частной сети. Однако, Client B может подключаться по SSH к публичному серверу (Server A). - Решение: Client B, подключаясь к Server A по SSH, может запросить реверсивную переадресацию портов, сказав Server A: "Создай туннель для моего 9000-го порта".
# Выполняется на Client B (сервере за файрволом)
ssh -R 9000:localhost:9000 your_user@server_a_public_ip
Теперь, когда вы подключаетесь к `server_a_public_ip:9000` с вашего компьютера (или другого внешнего компьютера), вы получите доступ к сервису 9000 порта Client B.
4. Временная демонстрация или обмен
- Проблема: Вы хотите показать коллеге, как работает конкретное приложение, запущенное на вашем локальном компьютере, или временно открыть его для получения обратной связи.
- Решение: Простая реверсивная переадресация портов позволяет выставить локальный сервис на публику на ограниченный срок. После завершения демонстрации можно завершить SSH-сеанс, чтобы заблокировать доступ.
Указания по использованию реверсивной переадресации портов
-
GatewayPorts yes
: Открытые удаленные порты в реверсивной переадресации портов по умолчанию доступны только на той машине, где работает SSH-сервер (server_a_public_ip
). Если вы хотите, чтобы другие компьютеры вне SSH-сервера также имели доступ к этому порту, вам нужно добавить настройкуGatewayPorts yes
в файлsshd_config
на SSH-сервере и перезапустить службу SSH. (Эта настройка может повлиять на безопасность, поэтому будьте осторожны при ее использовании.) -
Безопасность: Реверсивная переадресация портов открывает определенные порты внутри локальной сети для доступа извне, поэтому используйте это только с надежными серверами. Необходимо предварительно проверить уязвимости выставляемого сервиса.
-
Поддержка SSH-сеанса: Туннель реверсивной переадресации портов действителен только на время существования SSH-сеанса. Чтобы запустить его в фоновом режиме, обычно используют опции
ssh -fN -R ...
, сf
(фоновой запуск) иN
(без выполнения удаленной команды).
В заключение
SSH реверсивная переадресация портов (-R
опция) - это очень полезная функция, когда необходимо выставить определенные сервисы наружу в сложных сетевых условиях или за фаерволом. Особенно во время разработки она может стать мощным инструментом для обмена локальной средой или тестирования вебхуков.
Если это понятие показалось вам сложным, лучше всего самому попробовать и закрепить его. Активно используйте реверсивную переадресацию портов SSH в вашем рабочем процессе развития!
Если у вас есть вопросы, не стесняйтесь задавать их в комментариях!
Комментариев нет.