Шпаргалка по созданию SSH-туннелей в командной строке (UNIX-shell / PowerShell)
С помощью SSH-туннелей можно легко получить сетевой доступ к внутренним ресурсам, которые доступы за SSH-хостом. В сети есть уже много инструкций с подробным описанием синтаксиса и ключей, которые можно использовать для создания туннеля. В данной инструкции мы сконцентрируемся на простых примерах, которые можно держать под рукой в качестве шпаргалки.
Синтаксис для создания SSH-туннелей
Примеры использования
Бастионы
Дополнительные примеры использования туннелей
Решение возможных проблем
Дополнительные материалы
Синтаксис
Кратко опишем синтаксис подключения. Мы можем строить туннель с пробросом порта как на локальном компьютере, так и удаленном. Рассмотрим оба варианта.
Local
Данный туннель создается с помощью опции -L. В результате будет поднят прослушиватель на локальном компьютере с пробросом на удаленный хост:
ssh -L [locat_server_ip:]local_port:destination_server_ip:remote_port ssh_server_hostname
* в данном примере локальный компьютер начнет слушать порт local_port, и если мы к нему подключимся, то нас перекинет на destination_server_ip:remote_port через узел ssh_server_hostname.
Remote
Для создания данного типа туннеля используется опция -R. В результате на удаленном узле будет поднять прослушиватель, который будет отправлять запрос на наш локальный компьютер:
ssh -R remote_port:localhost:local_port ssh_server_hostname
* в нашем примере на узле ssh_server_hostname будет создан прослушиватель на порту remote_port. Если к нему подключиться, запрос будет отправлен на наш локальный компьютер порт local_port.
Примеры
Рассмотрим, как мы можем применить туннели в работе. По мере надобности, данный список будет пополняться.
1. Проброс порта RDP (3389 -> 3389):
ssh -L 3389:192.168.0.15:3389 root@1.2.3.4
* в примере:
- подключаемся по SSH к узлу 1.2.3.4 пользователем root.
- локальный компьютер начинает слушать на порту 3389.
- если подключиться к локальному хосту по порту 3389 нас кинет на 192.168.0.15 порт 3389, который находится за узлом 1.2.3.4.
2. Проброс http-порта (81 -> 80):
ssh -L 81:192.168.0.15:80 root@1.2.3.4
* в примере:
- подключаемся по SSH к узлу 1.2.3.4 пользователем root.
- локальный компьютер начинает слушать на порту 81.
- если подключиться к локальному хосту по порту 81 нас кинет на 192.168.0.15 порт 80, который находится за узлом 1.2.3.4.
3. Проброс https-порта (81 -> 443):
ssh -L 81:192.168.0.15:443 root@1.2.3.4
* в примере:
- подключаемся по SSH к узлу 1.2.3.4 пользователем root.
- локальный компьютер начинает слушать на порту 81.
- если подключиться к локальному хосту по порту 81 нас кинет на 192.168.0.15 порт 443, который находится за узлом 1.2.3.4.
4. Несколько туннелей через одно подключение:
ssh -L 4443:192.168.0.15:443 -L 2222:192.168.0.15:22 root@1.2.3.4
* в примере:
- подключаемся по SSH к узлу 1.2.3.4 пользователем root.
- локальный компьютер начинает слушать на портах 4443 и 2222.
- если подключиться к локальному хосту по порту 4443 нас кинет на 192.168.0.15 порт 443, который находится за узлом 1.2.3.4.
- если подключиться к локальному хосту по порту 2222 нас кинет на 192.168.0.15 порт 22, который находится за узлом 1.2.3.4.
5. Проброс порта без подключения к консоли SSH:
Если добавить опцию -N, то мы создадим туннель, но не провалимся в SSH консоль:
ssh -N -L 3389:192.168.0.15:3389 root@1.2.3.4
6. Туннель для проброса 80 порта с подключением по нестандартному порту SSH:
ssh -L 80:127.0.0.1:80 -p8022 root@1.2.3.4
* в данном примере мы будет подключаться к хосту 1.2.3.4 по SSH-порту 8022. Порт 80 будет проброшен на машину, к которой мы и подключились.
SSH бастион
Дополнительно рассмотрим еще один прием, который можно использовать при подключении по SSH — так называемый, бастион. По сути, это частный случай быстрого создания туннеля для подключения по SSH. Или, если сказать по-другому, мы подключаемся по SSH к хосту через какой-то другой хост (бастион).
Есть два способа для такого подключения: более современный с использованием jumphost или универсальный при помощи опции ProxyCommand. Рассмотрим их оба.
Jumphost
Синтаксис:
ssh -J <через кого подключаемся> <куда подключаемся>
Пример:
ssh -J user1@jump.dmosk.localnet user2@server.dmosk.localnet
* в данном примере мы подключаемся к хосту server.dmosk.localnet через jump.dmosk.localnet. То есть, сначала наш компьютер подключится по SSH к jump.dmosk.localnet, создаст туннель до server.dmosk.localnet, и уже после, будет создано подключение до нужного нам узла.
** обратите внимание, что для подключения к разных хостам мы используем разные учетные записи user1 и user2.
Если нам нужно подключиться через бастион и создать туннель, то добавим опцию -L с указанием хоста-назначения, например:
ssh -J user1@jump.dmosk.localnet -L 80:192.168.1.55:80 user2@server.dmosk.localnet
* мы подключимся к server.dmosk.localnet через jump.dmosk.localnet. А также создадим туннель до 192.168.1.55 по порту 80.
ProxyCommand
Синтаксис:
ssh -o ProxyCommand="ssh -W %h:%p <через кого подключаемся>" <куда подключаемся>
Пример:
ssh -o ProxyCommand="ssh -W %h:%p user1@jump.dmosk.localnet" user2@server.dmosk.localnet
* аналогично Jumphost, мы подключаемся к хосту server.dmosk.localnet через jump.dmosk.localnet. То есть, сначала наш компьютер подключится по SSH к jump.dmosk.localnet, создаст туннель до server.dmosk.localnet, и уже после, будет создано подключение до нужного нам узла.
** обратите внимание, что для подключения к разных хостам мы используем разные учетные записи user1 и user2.
Другие полезные команды
Попробуем найти более интересное применение вышерассмотренному материалу.
Копирование с помощью SCP через бастион
Команда scp полезна тем, что позволяет выполнять копирование файлов через SSH. Если путь до конечного компьютера идет через другой, то мы можем использовать его в качестве бастиона.
Пример команды:
scp -oProxyCommand="ssh -W %h:%p dmosk@1.2.3.4" root@192.168.1.5:~/file ./
* в данном примере:
- выполняем копирование файла file, который находится в домашнем каталоге пользователя root на 192.168.1.5.
- подключение к 192.168.1.5 выполняется через бастион 1.2.3.4.
- к 1.2.3.4 мы подключаемся от пользователя dmosk, а к конечному компьютеру от пользователя root.
Решение проблем
Рассмотрим некоторые проблемы, с которыми можно столкнуться при работе с туннелями SSH.
Bind Permission denied
При создании туннеля мы подключаемся по SSH, но видим ошибку:
bind [127.0.0.1]:80: Permission denied
channel_setup_fwd_listener_tcpip: cannot listen to port: 80
Could not request local forwarding.
Причина: отсутствие прав для настройки сетевых параметров у пользователя, под которым создается туннель.
Решение: либо повышаем привилении одной из команд:
sudo su
su -
Либо выполняем создание туннеля с повышением привилегий, например:
sudo ssh -L 80:127.0.0.1:80 root@1.2.3.4
Читайте также
Это может быть интересно:
1. Как использовать команду SCP в UNIX без пароля.
2. Настройка быстрого подключения по SSH в Linux.
3. Как разрешить пользователю root заходить по SSH в системах Linux.
4. Настройка домашнего каталога SFTP или SSH Chroot.
5. Настройка SSH на CentOS с аутентификацией через Active Directory.