Как пробросить порт между хостами с разными ОС через консоль?

«Как пробросить порт между хостами с разными ОС через консоль?» — вопрос из категории Сети, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для проброса портов между системами (например, Linux-сервер и Windows-клиент) я использую SSH-туннелирование — это стандартный и безопасный способ.

Основные типы туннелей:

1. Локальный проброс порта (-L): Пробрасываю порт с локальной машины (клиента) на удалённый сервер.

# Команда выполняется на клиенте (например, в PowerShell с установленным OpenSSH или WSL2)
ssh -L <локальный_порт>:<целевой_хост_с_сервера>:<целевой_порт> <пользователь>@<ssh_сервер>

Пример: Мне на локальной Windows-машине нужен доступ к внутренней БД PostgreSQL (port 5432) на сервере db.internal, доступ к которому есть только с jump-хоста bastion.example.com.

ssh -L 55432:db.internal:5432 user@bastion.example.com

Теперь я могу подключиться к БД на локальной машине как localhost:55432.

2. Удалённый проброс порта (-R): Пробрасываю порт с удалённого сервера на локальную машину (клиент). Полезно для отладки или предоставления временного доступа.

ssh -R <порт_на_сервере>:<локальный_хост>:<локальный_порт> <пользователь>@<ssh_сервер>

Пример: На моём локальном компьютере запущено dev-приложение на порту 3000. Мне нужно, чтобы коллега мог его временно увидеть через общий сервер dev-share.example.com.

ssh -R 8080:localhost:3000 user@dev-share.example.com

Теперь на сервере dev-share.example.com обращение к localhost:8080 будет перенаправлено на мой локальный порт 3000.

Ключевые моменты для DevOps:

  • На стороне SSH-сервера в /etc/ssh/sshd_config должны быть разрешены опции AllowTcpForwarding yes (по умолчанию включено) и для удалённого проброса — GatewayPorts (если нужно слушать на всех интерфейсах, а не только localhost).
  • Для постоянных туннелей можно использовать autossh или systemd-сервисы для автоматического переподключения.
  • В Windows для одноразовых задач можно использовать встроенный OpenSSH-клиент (доступен в PowerShell), а для сложных сценариев — WSL2 или PuTTY (где туннели настраиваются в графическом интерфейсе).