Шпаргалка по созданию SSH-туннелей в командной строке (UNIX-shell / PowerShell)

Обновлено Обновлено: Опубликовано Опубликовано:

С помощью 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.

# Linux # Безопасность # Сети
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет