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:
- Нажмите кнопку Generate.
- Подвигайте курсором в любом направлении до тех пор, пока строка прогресса не заполнится.
- Сохраните публичный и приватный ключи.
- Откройте файл с публичным ключом.
- Скопируйте публичный ключ и добавьте его на удаленный сервер.
Для подключения также можете использовать 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 свяжет каталог с сервером