Шпаргалка по созданию 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.

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.

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.

Читайте также

Это может быть интересно:

1. Как использовать команду SCP в UNIX без пароля.

2. Настройка быстрого подключения по SSH в Linux.

3. Как разрешить пользователю root заходить по SSH в системах Linux.

4. Настройка домашнего каталога SFTP или SSH Chroot.

5. Настройка SSH на CentOS с аутентификацией через Active Directory.

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

Да            Нет