Материал подготовлен командой Simple-Server для администраторов VPS и выделенных серверов. Команды и пути проверяйте на тестовой машине перед production.
Кратко о задаче
SSH — это Secure Shell, защищённый сетевой протокол для удалённого управления. Он шифрует трафик и работает со всеми популярными операционными системами.
Для установки безопасного подключения к удалённой машине используется SSH-туннелирование.**** Однако под туннелем здесь подразумевается не инкапсуляция одного протокола в другом. Речь идёт о том, что администратор выполняет через SSH проброс портов.**** Технология подразумевает передачу TCP-пакетов и трансляцию IP-заголовков при передаче информации, если соблюдаются правила.
Для идентификации пользователя нужны два ключа — приватный и публичный (открытый). Открытый хранится на сервере, приватный — на локальной машине. Создание безопасного подключения**** отличается в зависимости от операционной системы.
Ubuntu и другие дистрибутивы Linux/macOS
Запустите терминал и выполните команду:
В терминале появится диалог:
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 через любой текстовый редактор или вывести его содержимое в терминале:
Скопируйте ключ и добавьте его на сервер. Убедитесь, что в нём нет пробелов и переносов.
Можно скопировать открытый ключ автоматически, используя команду:
ssh-copy-id user@remoteserverВместо user вы указываете имя пользователя, вместо remoteserver — хост или IP-адрес удалённой машины на Simple-Server или другой платформе.
Создание безопасного подключения**** завершено. Чтобы подключиться через**** SSH-port,**** выполните:
Вместо параметра HOST укажите публичный IP-адрес сервера, на который вы добавили открытый ключ. Если вы не создавали пароль для дополнительной защиты закрытой части, то вводить ничего больше не нужно. Система сверит открытый и закрытый ключи и при обнаружении соответствия установит защищенное соединение.****
При первом подключении система**** предупредит о неизвестном хосте и уточнит, доверяете ли вы ему. Введите ‘yes’ и нажмите Enter.
Чтобы сделать подключение безопаснее, не стоит использовать аккаунт с правами суперпользователя. Кроме того, можно ограничить связь между консолями локальной машины и удалённого сервера, указав параметр -N. Пример команды:
ssh -N -L -g 3389:192.168.0.105:3389 user@rt.example.comЭто исключит ситуацию, при которой пользователь случайно выполняет на удалённой машине команды, предназначенные для локального компьютера.
На Windows создать пару ключей можно двумя способами — через консоль PowerShell и с помощью программы PuTTygen (устанавливается вместе с PuTTy).
Чтобы сгенерировать ключи через PowerShell, откройте терминал и выполните:
Защитите приватный ключ паролем или оставьте поле пустым и нажмите Enter.
По умолчанию открытый ключ сохраняется в файле ~/.ssh/id_rsa.pub. Приватный ключ с именем id_rsa лежит в той же папке. Откройте файл с публичным ключом через текстовый редактор или воспользуйтесь командой cat в PowerShell:
Скопируйте публичный ключ и добавьте его на удаленный сервер.
Чтобы подключиться к серверу, выполните:
Вместо параметра HOST укажите публичный IP-адрес удаленного сервера, на который вы добавили открытый ключ. Если вы не создавали пароль для дополнительной защиты закрытого ключа, то вводить ничего больше не нужно. Система сверит открытый и закрытый ключи и при обнаружении соответствия установит SSH-туннель в Windows.****
При первом подключении ОС предупредит о неизвестном хосте и уточнит, доверяете ли вы ему. Введите ‘yes’ и нажмите Enter.
Чтобы сгенерировать пароль с помощью PuTTygen:
- Нажмите кнопку Generate.
- Подвигайте курсором в любом направлении до тех пор, пока строка прогресса не заполнится.
- Сохраните публичный и приватный ключи.
- Откройте файл с публичным ключом.
- Скопируйте публичный ключ и добавьте его на удаленный сервер.
Для подключения к удалённому серверу также можно использовать программу PuTTy. Запустите программу, в поле Host Name введите имя или IP-адрес хоста и нажмите Open.
Настроить в PuTTy SSH tunnel**** можно во вкладке Connection → SSH → Tunnels. Здесь указывается Source Port, Destination, а также параметры динамического подключения. Что это за настройки и как они влияют на соединение, рассмотрим далее.
Как использовать SSH Proxy
SSH-tunnel Proxy**** помогает организовать доступ к домашней или корпоративной системе. Важно только, чтобы приложения, которые используются для работы при подключении, поддерживали SOCKS-прокси. Один из вариантов такого использования туннелей — сотрудник подключается к рабочей сети, используя публичную сеть в другом конце мира, при этом вся информация шифруется.
Для туннелирования через прокси достаточно выполнить:
ssh -D 8888 user@remoteserverЭтой командой вы запускаете SOCKS-прокси. Порт — 8888. В этом случае служба работает на localhost. Но можно изменить команду, чтобы прослушивать Ethernet и Wi-Fi. Это позволит приложениям подключаться к прокси-серверу через Secure Shell.
Например, можно запустить браузер Google Chrome:
google-chrome --proxy-server="socks5://192.168.1.10:8888"Команда создаёт SOCKS-прокси, а также инициирует туннелирование DNS-запросов
Что такое динамический SSH-tunnel
Динамический SSH-tunnel открывает локальный сокет TCP и использует его как SOCKS4/SOCKS5-прокси. Такой туннель отвечает всем требованиям безопасности.
Динамический туннель также подходит для однократного выхода в интернет:
ssh -D 1080 user@vps.example.comSOCKS-прокси работает через порт 1080. Динамический туннель не предусматривает открытие портов во внешнюю сеть. Весь трафик проходит по нему, скрывая деятельность пользователя.
Для Windows динамический**** SSH-туннель в PuTTy настраивается на вкладке Connection → SSH → Tunnels.
Примеры использования туннелей
Рассмотрим несколько примеров использования туннелей.
Проброс портов — SSH Port Forwarding
SSH Forwarding — одна из самых распространенных операций, для которой требуется создать туннель. Вы открываете порт на локальной машине и выбираете порт на другом конце — удаленном сервере:
ssh -L 9999:127.0.0.1:80 user@remoteserverВ этой команде вы говорите, что нужно слушать порт 9999. Для проброса используется порт 80.
Туннель может работать и в обратном направлении. Для этого достаточно подключить слушающий порт к другому порту на локальной машине:
ssh -v -R 0.0.0.0:1999:127.0.0.1:902 192.168.1.100 user@remoteserverВ этом туннеле соединение идёт от удалённого сервера к порту 1999, затем к порту 902 на локальной машине.
Удалённое выполнение команд
Через Secure Shell можно создать интерфейс для выполнения команд на удалённой машине. Сами команды прописываются в качестве последнего аргумента. Пример:
ssh remoteserver "cat /var/log/nginx/access.log" | grep badstuff.phpПосле скачивания лога на удалённом сервере выполнится команда grep.
Бэкапы важных данных можно делать с помощью bzip2. Порядок простой — сначала вы сжимаете каталог на удалённом сервере, а затем распаковываете на другой стороне: на локальной машине или на другом сервере, заведённом под хранение резервных копий. Пример команды:
tar -cvj /datafolder | ssh remoteserver "tar -xj -C /datafolder"Если бэкапы нужно делать регулярно (обычно так и происходит), то проще использовать команду rsync:
rsync -az /home/testuser/data proglibserver:backup/Rsync не копирует файлы с нуля, а сравнивает отличия в разных временных точках. Это экономит время на создание бэкапов, а также помогает найти данные для восстановления при утере или повреждении.
Через SSH-туннель можно запускать GUI-приложения на удалённом сервере:
ssh -X remoteserver vmwareНесмотря на то, что приложение выполняется на удалённом сервере, его интерфейс доступен на локальной машине. Это удобно если, например, нужно больше ресурсов для работы, а локальная машина уже не справляется.
Если сеть сегментирована, то при туннелировании придётся пройти через несколько хостов. При этой рабочий сеанс должен быть полностью зашифрованным. Добиться такого результата можно с помощью параметра -J. Для установления связи с каждым следующим хостом будет использоваться переадресация:
ssh -J host1,host2,host3 user@host4.internalЛокальная папка на удаленной машине
С помощью sshfs можно примонтировать локальный каталог к удалённому серверу.
sshfs user@proglibserver:/media/data ~/data/Это удобное решение для обмена файлами и выполнения других операций.
Нужен сервер для практики? Закажите VPS на Simple-Server — root-доступ, NVMe, DDoS-защита и поддержка 24/7.