SSH — это ещё один пример древней технологии, которая до сих пор повсюду. Автор считает, что выучить пару трюков с SSH в долгосрочной перспективе полезнее, чем осваивать десяток Cloud Native инструментов или AI-агентов, которые устареют в следующем квартале. Его любимая фишка — SSH-туннели. С помощью стандартных утилит и одной команды можно получить доступ к сервису за бастионом, пробросить порт наружу или использовать SOCKS-прокси.
В статье разобраны четыре типа туннелей на практических примерах с четырьмя хостами. Локальная переадресация (ssh -L) делает удалённый сервис доступным на локальном порту. Например, вы заходите на remote по SSH и привязываете его localhost:80 к своему localhost:8080 — теперь можете обращаться к сервису, который висит только на loopback удалённой машины. Если нужно достучаться до хоста в приватной VPC, remote выступает бастионом: команда ssh -L 8081:172.16.0.40:80 remote пробрасывает порт через шлюз к целевому серверу.
Удалённая переадресация (ssh -R) работает наоборот: вы открываете наружу сервис, запущенный у вас локально. Чтобы внешний мир мог обращаться к вашему порту через шлюз, на сервере нужно включить GatewayPorts yes. Без этого порт будет висеть только на loopback самого шлюза. Команда ssh -R 0.0.0.0:8080:localhost:80 remote публикует ваш localhost:80 на всех интерфейсах удалённой машины.
Динамическая локальная переадресация (ssh -D) превращает ваш SSH-клиент в SOCKS-прокси. Вы не привязываетесь к одному адресу: ssh -D 1080 remote поднимает прокси на localhost:1080, и любое приложение, умеющее SOCKS (например, curl --socks5-hostname), может через него ходить к любым хостам, доступным с remote. Это избавляет от создания отдельного туннеля под каждый сервис.
Динамическая удалённая переадресация (ssh -R без указания destination) — зеркальный вариант. Прокси запускается уже на стороне SSH-сервера, а трафик туннелируется обратно к клиенту и разрешается с его точки зрения. Например, команда ssh -R 0.0.0.0:1080 remote открывает SOCKS-прокси на remote, через который можно обращаться к любым хостам из домашней или офисной сети, к которой имеет доступ ваш ноутбук. Эта фича требует OpenSSH 7.6+ на клиенте.
Автор даёт простую мнемонику: ssh -L — local:remote, ssh -R — remote:local. Левая часть команды всегда указывает, на чьей стороне открывается новый порт.