EnglishРусский Map

Проброс портов в SSH

title
Проброс портов в SSH
type
concept
summary
Четыре схемы туннелей SSH: локальный (-L), удалённый (-R), SOCKS (-D), jumphost (-J) - и сетевые задачи для каждой из них
tags
ssh, networking, security
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
Sub-pages