SSH-туннели: примеры и функции

SSH-туннелирование необходимо для обеспечения безопасности канала передачи данных посредством шифрования. Обычно, каналы устанавливаются между локальным хостом и удаленным сервером.

Структура туннелей

SSH — (secure shell) протокол, предназначенный для обеспечение удаленного управления системами. Главная особенность — наличие шифрования. Туннелирование Secure Shell (SSH) — это метод, используемый для установления безопасного соединения с удаленным компьютером. Он включает переадресацию портов SSH для передачи TCP-пакетов и преобразование заголовков IP для безопасной связи. В отличие от VPN, который позволяет передавать информацию в любом направлении, туннелирование SSH имеет определенную точку входа и выхода для связи. Поэтому важно понимать разницу между SSH и VPN при сравнении двух технологий.

Создание туннеля

Используются два ключа (приватный и открытый). На сервере хранится публичный ключ, на локальном хосте — приватный.

Ubuntu и другие дистрибутивы Linux/macOS

Терминал:

ssh-keygen -t rsa

Вывод:

Enter file in which to save the key (/home/user/.ssh/id_rsa):

По умолчанию закрытый ключ истории хранится в папке .ssh в файле id_rsa. Однако у вас есть возможность указать другое местоположение и имя файла.

Затем система предложит вам установить пароль для дополнительной защиты ключа. Это важно для предотвращения несанкционированного доступа лиц, имеющих доступ к машине. Это особенно полезно, когда несколько человек используют один и тот же компьютер. Если вам не требуется пароль, просто оставьте поле пустым и нажмите Enter.

Enter passphrase (empty for no passphrase):

После успешного создания пары ключей в терминале появится такая запись:

Your identification has been saved in /home/user/.ssh/id_rsa.

Your public key has been saved in /home/user/.ssh/id_rsa.pub.

The key fingerprint is:

476:b2:a8:7f:08:b4:c0:af:81:25:7e:21:48:01:0e:98 user@localhost

Теперь нужно скопировать публичный ключ и добавить его на удалённую машину. Можно открыть файл /home/user/.ssh/id_rsa.pub через любой текстовый редактор или вывести его содержимое в терминале:

cat ~/.ssh/id_rsa.pub

Скопируйте ключ и добавьте его на сервер. Убедитесь, что в нём нет пробелов и переносов.

Можно скопировать открытый ключ автоматически, используя команду:

ssh-copy-id user@remoteserver

Вместо использования параметра HOST соединение с сервером будет установлено с использованием его общедоступного IP-адреса. Если вы не установили пароль для дополнительной защиты закрытого ключа, вводить дополнительную информацию не требуется. Безопасность системы поддерживается за счет использования как открытых, так и закрытых ключей, которые сопоставляются для установления безопасного соединения при обнаружении.

При первом подключении вы получите предупреждение о неизвестном хосте. Система спросит, доверяете ли вы ей. Чтобы продолжить, введите «да» и нажмите клавишу ввода.

Для максимальной безопасности рекомендуется не использовать учетную запись суперпользователя для этого подключения. Кроме того, связь между терминалом локального компьютера и удаленным сервером можно сделать более безопасным, указав в команде параметр -N. Пример команды показан ниже:

ssh -N -L -g 3389:192.168.0.105:3389 user@rt.example.com

Windows

Существуют 2 способа установить туннелирование в Windows (консоль и PuTTygen).

Команда для PowerShell:

ssh-keygen -t rsa

У вас есть возможность либо защитить закрытый ключ паролем, либо оставить поле пустым и нажать Enter.

Открытый ключ по умолчанию хранится в файле ~/.ssh/id_rsa.pub, а закрытый ключ с именем id_rsa находится в том же каталоге. Вы можете получить доступ к файлу открытого ключа через текстовый редактор или с помощью команды Cat в PowerShell.

cat ~/.ssh/id_rsa.pub

Скопируйте открытый ключ, перенесите его на сервер. Выполните соединение:

ssh root@HOST

Вместо использования параметра HOST соединение с удаленным сервером будет установлено с использованием его общедоступного IP-адреса. Если вы не установили пароль для дополнительной защиты закрытого ключа, вводить дополнительную информацию не требуется. Система проверит открытый и закрытый ключи, и если они совпадут, в Windows будет установлен SSH-туннель.

При первом подключении может появиться предупреждение о неизвестном хосте. Система предложит вам подтвердить, доверяете ли вы ей. Чтобы продолжить, введите «да» и нажмите Enter.

Чтобы сгенерировать пароль с помощью PuTTygen:

  1. Нажмите кнопку Generate.
  2. Подвигайте курсором в любом направлении до тех пор, пока строка прогресса не заполнится.
  3. Сохраните публичный и приватный ключи.
  4. Откройте файл с публичным ключом. 
  5. Скопируйте публичный ключ и добавьте его на удаленный сервер.

Для подключения также можете использовать PuTTy. Запустите программу, введите исходные данные для подключения.

SSH Proxy

SSH-tunnel Proxy — инструмент для обеспечения безопасного доступа к системе. Приложения должны использовать SOCKS-proxy. Например, сотрудник, находясь в удаленной точки мира от офиса, осуществляет подключение в корпоративную сеть, используя зашифрованный туннель, чтобы никто не смог получить поток конфиденциальных данных.

Туннелирование:

ssh -D 8888 user@remoteserver

Команда запускает прокси, порт 8888 (служба работает на localhost).

google-chrome —proxy-server=»socks5://192.168.1.10:8888″

В этом случае, вы прослушиваете входящий трафик Wi-Fi/Ethernet.  

Динамический туннель

Сокет TCP на локальном хосте позволяет открыть динамический туннель SSH. Этот тип туннелирования используется в случае, если необходимо создать приватное соединение, но такой возможности нет.

Однократный выход в сеть:

ssh -D 1080 user@vps.example.com

Прокси SOCKS функционирует на порте 1080. Через динамический туннель невозможно открыть порты во внешний периметр. Чтобы настроить туннелирование в PuTTy (Connection — SSH — Tunnels).

Форвардинг портов

Открывается порт на хосте, после также открывается порт на сервере.

ssh  -L 9999:127.0.0.1:80 user@remoteserver

Перенаправление происходит через 80 порт.

Reverse-tunnel

ssh -v -R 0.0.0.0:1999:127.0.0.1:902 192.168.1.100 user@remoteserver

Перенаправление в обратном порядке (1999 порт — 902 порт). 

Удаленное выполнение команд

ssh remoteserver «cat /var/log/nginx/access.log» | grep badstuff.php

выполнение grep

Rsync

tar -cvj /datafolder | ssh remoteserver «tar -xj -C /datafolder»

Создание резервной копии, распаковка копий на другом оборудовании 

Команда для регулярного создания копий:

rsync -az /home/testuser/data proglibserver:backup/

Rsync перед изготовлением копии просматривает историю бэкапов, чтобы избежать повторения.

Запуск приложений

ssh -X remoteserver vmware

Пример команды, запускается vmware. 

Прыжки по хостам

При наличии сегментированности в сети, нужно проложить туннель через все пункты, чтобы обезопасить канал передачи данных. Параметр -J поможет установить цепочку переадресаций:

ssh -J host1,host2,host3 user@host4.internal

Локальная папка на удаленной машине

sshfs user@proglibserver:/media/data ~/data/

sshfs свяжет каталог с сервером