
Практичний посібник із SSH-тунелів: локальне та віддалене переспрямування портів
Практичний посібник з SSH-тунелів від iximiuz Labs: як локальне переспрямування (-L) дістає сервіси за бастіоном, як -R відкриває локальний сервіс назовні та як -D перетворює SSH-клієнт на SOCKS-проксі.
SSH — давня технологія, яка не збирається зникати, і її тунелі досі роблять однією командою те, що новіші інструменти ледве наздоганяють: дістатися внутрішнього сервісу VPC через публічний бастіон, відкрити localhost-порт віддаленої dev-VM у браузері або виставити локальний сервер назовні. Практичний посібник Івана Величка на iximiuz Labs розбирає локальне, віддалене й динамічне переспрямування портів; лабораторії працюють на полігоні з чотирьох хостів і трьох мереж.
Локальне переспрямування портів
Прапорець -L запускає переспрямування на боці клієнта: SSH-клієнт слухає локальний порт, і трафік із нього йде на remote_addr:remote_port, досяжний із машини, до якої ви підключилися. Синтаксис — ssh -L [local_addr:]local_port:remote_addr:remote_port [user@]sshd_addr, а ssh -f -N -L запускає сесію у фоні. У першій лабораторії вебсервер, прив'язаний до 127.0.0.1:80 віддаленого хоста, недоступний із мережі; після ssh -f -N -L 8080:localhost:80 203.0.113.30 та сама сторінка відповідає на локальному порту 8080.
Команда може переспрямовувати й на іншу машину, не лише на SSH-сервер. У ssh -L 8081:172.16.0.40:80 203.0.113.30 бастіон приймає з'єднання і відкриває другий крок до приватного хоста VPC. Порти, прив'язані лише до loopback, потребують додаткового прийому, бо переспрямування розв'язує бастіон і не бачить 127.0.0.1 на цілі. Прапорець -J «стрибає» крізь бастіон і завершує сесію на самій цілі: ssh -f -N -J 203.0.113.30 -L 8082:localhost:9000 172.16.0.40 робить невидимий для мережі debug-порт доступним локально.
Віддалене переспрямування портів
Зворотний випадок — виставити локальний сервіс через публічний шлюз — використовує ssh -R [remote_addr:]remote_port:local_addr:local_port [user@]gateway_addr, де додатковий порт відкриває вже sshd. Пастка: за замовчуванням тунель прив'язується лише до localhost шлюзу, тож сервіс доступний тільки зсередини нього; щоб опублікувати його на всіх інтерфейсах, у sshd_config потрібно GatewayPorts yes. Із цим налаштуванням ssh -f -N -R 0.0.0.0:8080:localhost:80 203.0.113.30 відкриває для мережі вебсервер ноутбука, доступний лише на localhost. Варіант дозволяє SSH-клієнту самому стати jump-хостом і виставити пристрій домашньої мережі, недосяжний для шлюзу.
Динамічне переспрямування: SSH як SOCKS-проксі
Замість прив'язки одного локального порту до одного призначення ssh -D [local_addr:]local_port перетворює SSH-клієнт на локальний SOCKS-проксі. Кожне з'єднання саме називає своє призначення, а розв'язує його SSH-сервер, тож один проксійований порт дістає всі хости й порти за бастіоном: достатньо curl --socks5-hostname localhost:1080 172.16.0.40:80, якщо клієнт уміє SOCKS. Якщо прибрати призначення з -R, ідея дзеркалиться на боці сервера: sshd сам стає SOCKS-проксі, і для цього потрібен OpenSSH 7.6 або новіший на клієнті.
Як запам'ятати прапорці
Підсумок Величка короткий: -L відкриває віддалений сервіс на локальному порту, -R — локальний сервіс на віддаленому порту, -D це локальний SOCKS-проксі, а -R без призначення — проксі на сервері. Мнемоніка: ssh -L local:remote і ssh -R remote:local — новий порт завжди відкриває ліва частина.
SiTech — веброзробка з підтримкою AI
Створюємо швидкі та сучасні сайти й інтегруємо AI у бізнес-процеси. Маєте проєкт чи запитання? Із задоволенням допоможемо.