Проброс портов в SSH
- title
- Проброс портов в SSH
- type
- concept
- summary
- Четыре схемы туннелей SSH: локальный (-L), удалённый (-R), SOCKS (-D), jumphost (-J) - и сетевые задачи для каждой из них
- tags
- ssh, networking, security
- sources
- ssh-cheatsheet-grahamhelton
- created
- 2026-05-21
- updated
- 2026-05-21
- lang
- ru
- translation_of
- ssh-port-forwarding
- source_updated
- 2026-05-21
- translated
- 2026-09-01
- translator
- lllm/antigravity/gemini-3.7-flash-medium
SSH передаёт произвольный TCP-трафик параллельно с каналом шелла. Четыре флага определяют направление трафика и способ его публикации на каждом конце. Названия флагов подсказывают, где в паре адресов находится локальный порт: -L ставит его слева (Left), -R - справа (Right).
Local (-L)
ssh -N -f -L <local_port>:<remote_host>:<remote_port> user@ssh_server
SSH-клиент открывает listener на порту <local_port> машины оператора. Подключения к нему туннелируются через SSH-сервер и уходят к <remote_host>:<remote_port> с точки зрения SSH-сервера. Классический случай: веб-сервис слушает 127.0.0.1:80 на SSH-сервере, а на ноутбуке к нему обращаются через localhost:1337.
Хостом <remote_host> не обязательно должен быть сам SSH-сервер - это может быть любой узел, доступный с SSH-сервера. Это превращает -L в двухшаговый прокси: оператор -> SSH-сервер -> произвольный внутренний хост.
Remote (-R)
ssh -N -f -R <remote_port>:<local_host>:<local_port> user@ssh_server
В этом случае listener открывает SSH-сервер. Подключения к <remote_port> на SSH-сервере пробрасываются обратно через уже установленное соединение и уходят к <local_host>:<local_port> с точки зрения клиента. Применяется, чтобы опубликовать сервис из сети клиента в сети, куда клиент иначе достучаться не может.
По умолчанию в OpenSSH listener'ы для -R привязываются к 127.0.0.1 на сервере; параметр GatewayPorts yes в sshd_config расширяет привязку до 0.0.0.0.
Dynamic (-D, SOCKS proxy)
ssh -N -f -D <local_port> user@ssh_server
Клиент становится SOCKS5-прокси. Любая программа с поддержкой SOCKS - proxychains, Firefox, curl с --proxy socks5://... - направляет свой трафик через SSH-сервер. В отличие от -L, адрес назначения выбирается клиентом для каждого соединения отдельно, поэтому один и тот же туннель подходит для любых хостов, доступных с SSH-сервера.
Передача DNS через SOCKS зависит от настроек клиента. В Firefox есть опция "Proxy DNS when using SOCKS V5", в proxychains - параметр proxy_dns в конфигурации. Без этого запросы обрабатывает локальный резолвер: это приводит к утечке DNS-запросов и может вернуть адреса, недоступные с SSH-сервера.
Jumphost (-J)
ssh -J user1@hop1,user2@hop2 user3@target
Выстраивает цепочку SSH-соединений через промежуточные хосты, не открывая шелл оператора на промежуточных узлах. Аутентификация на каждом шаге проходит отдельно. По результату идентично вложенным конструкциям с ProxyCommand, но читается в одну строку. Соответствует директиве ProxyJump в конфиге.
Gateway mode (-g)
Модификатор для -L (и через него для -D). Флаг -g заставляет локальный listener слушать 0.0.0.0 вместо 127.0.0.1, открывая проброс для всех в локальной сети оператора. Удобно, если оператор хочет сделать свой ноутбук общим узлом доступа (pivot) для команды; небезопасно, если локальная сеть враждебна.
When to use which
| Сетевой сценарий | Что использовать |
|---|---|
| Есть SSH к целевому хосту, а сервис на нём слушает только loopback | -L |
| До целевого хоста не достучаться, но целевой хост видит оператора | -R |
| Нужен доступ из браузера или CLI ко множеству ресурсов за одним хостом | -D |
| Нужно пройти через N промежуточных узлов до конечного шелла | -J |
| Нужно открыть проброс для других участников в локальной сети | добавить -g |
Runtime forwards
Escape-последовательность ~C в активной SSH-сессии открывает командную строку клиента. Команда -D 8080 в ней добавляет динамический проброс к уже запущенной обычной сессии без разрыва соединения. Работает и в обратную сторону: -KD 8080 отменяет проброс. Удобно, если новые цели обнаруживаются прямо во время работы и перезапускать подключение нежелательно из-за лишнего шума.
See also
- ssh-port-forwarding-cheatsheet - шпаргалка Хелтона с наглядными примерами
- ssh-agent-forwarding-risk - независимый флаг
-Aи почему он небезопасен по умолчанию - living-off-the-land - SSH как эталонный предустановленный инструмент для горизонтального перемещения
- bypassing-dpi-with-ebpf - когда блокируется сам протокол SSH