Categories: Шпаргалки

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

* в данном примере мы подключаемся к хосту server.remontka.localnet через jump.remontka.localnet . То есть, сначала наш компьютер подключится по SSH к jump.remontka.localnet , создаст туннель до server.remontka.localnet , и уже после, будет создано подключение до нужного нам узла.
** обратите внимание, что для подключения к разных хостам мы используем разные учетные записи user1 и user2 .

Если нам нужно подключиться через бастион и создать туннель, то добавим опцию -L с указанием хоста-назначения, например:

ssh -J user1@jump.remontka.localnet -L 80:192.168.1.55:80 user2@server.remontka.localnet

* мы подключимся к server.remontka.localnet через jump.remontka.localnet . А также создадим туннель до 192.168.1.55 по порту 80 .

ProxyCommand

Синтаксис:

ssh -o ProxyCommand=»ssh -W %h:%p <через кого подключаемся>» <куда подключаемся>

Пример:

ssh -o ProxyCommand=»ssh -W %h:%p user1@jump.remontka.localnet» user2@server.remontka.localnet

* аналогично Jumphost, мы подключаемся к хосту server.remontka.localnet через jump.remontka.localnet . То есть, сначала наш компьютер подключится по SSH к jump.remontka.localnet , создаст туннель до server.remontka.localnet , и уже после, будет создано подключение до нужного нам узла.
** обратите внимание, что для подключения к разных хостам мы используем разные учетные записи user1 и user2 .

Другие полезные команды

Попробуем найти более интересное применение вышерассмотренному материалу.

Копирование с помощью SCP через бастион

Команда scp полезна тем, что позволяет выполнять копирование файлов через SSH. Если путь до конечного компьютера идет через другой, то мы можем использовать его в качестве бастиона.

Пример команды:

scp -oProxyCommand=»ssh -W %h:%p remontka@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 мы подключаемся от пользователя remontka , а к конечному компьютеру от пользователя 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 .

admin

Recent Posts

Что такое Zulip

Zulip — программное обеспечение для реализации корпоративного чата. Разработан в 2012 году, в 2014 был…

10 месяцев ago

Что такое Zookeeper

Zookeeper — cервис-координатор, который позволяет обеспечить контроль синхронизации данных. Разработан на Java компанией Apache Software…

10 месяцев ago

Что такое Zimbra

Zimbra — программное обеспечение для реализации почтового сервиса или, если сказать точнее, автоматизации совместной деятельности…

10 месяцев ago

Что такое Zabbix

Zabbix — бесплатная система мониторинга. Позволяет отслеживать состояние сетевых узлов, компьютеров и серверов. Возможности: Поддержка…

10 месяцев ago

Что такое YouTube

YouTube — компания-владелец одноименного портала для просмотра и хранения видео. Чтобы пользоваться данным порталом достаточно…

10 месяцев ago

Что такое yota

Yota — провайдер, предоставляющий доступ к сети Интернет по беспроводной связи. Впервые, сервис начал работать…

10 месяцев ago