Ответ
Для проброса портов между системами (например, 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 (где туннели настраиваются в графическом интерфейсе).