SSH туннель представляет собой сетевой протокол, который позволяет удалённо управлять операционной системой и выполнять туннелирование TCP-соединений для передачи данных. В статье расскажем, что такое SSH туннели, как их создавать, настраивать и где применять.
Как устроены SSH-туннели
Туннель через SSH – стандарт, обеспечивающий безопасный удаленный доступ в систему и передачу файлов по защищённым сетям. Кроме того, он защищает трафик данных приложения за счёт переадресации портов, обычно это туннелирование произвольного порта TCP/IP через SSH. То есть трафик направляется на поток внутри зашифрованного SSH-соединения и не может быть перехвачен извне. SSH-туннелирование особенно актуально, если требуется обеспечить безопасность устаревших приложений, которые не поддерживают шифрование.
В рамках SSH-туннелирования устанавливается соединение между клиентом и сервером, оно зашифровывается и тем самым позволяет защитить конфиденциальность и целостность данных.
Приложение соединяется с сервером приложений по SSH, связываясь с портом на локальном хосте. Данные приложения в зашифрованном виде перенаправляются по туннелю на сервер, подключенный к фактическому серверу приложений. Благодаря SSH-туннелированию связь приложения остаётся защищённой, при этом не требуется менять рабочие процессы.
SSH-туннели применяются для:
- Предоставления зашифрованных каналов для протоколов, использующих открытый текст
- Открытия бэкдоров в частные сети
- Обхода сетевых экранов
Создание и настройка SSH-туннеля
Переадресация портов SSH может осуществляться по трём типам:
- Перенаправление локального порта. Соединение перенаправляется с клиентского хоста на SSH-сервер и впоследствии на порт хоста назначения.
- Перенаправление удаленного порта. Соединение перенаправляется с хоста сервера на клиентский хост и впоследствии на порт хоста назначения.
- Динамическая переадресация портов. В данном случае создается прокси-сервер SOCKS, который в свою очередь обеспечивает связь через ряд портов.
Переадресация локального порта
Перенаправление порта SSH-клиента (на локальном компьютере), на порт SSH-сервера (удаленного компьютера) и далее на порт, расположенный на конечном компьютере. Тот в свою очередь может являться удаленным SSH-сервером или каким-либо иным компьютером.
Перенаправление локальных портов требуется для подключения к удаленной службе во внутренней сети. Это может быть, к примеру, база данных или системы удалённого доступа.
В Linux, MacOS и прочих юниксовых системах, для установки локальной переадресации портов нужно использовать следующую команду:
ssh -L [LOCAL_IP:]LOCAL_PORT:DESTINATION:DESTINATION_PORT [USER@]SSH_SERVER
Понадобятся такие параметры:
[LOCAL_IP:]LOCAL_PORT – IP-адрес и номер порта локального компьютера. Если локальный IP не указан, SSH-клиент привязывается к локальному хосту.
DESTINATION:DESTINATION_PORT – IP/имя хоста и порт машины назначения.
[USER@]SERVER_IP – Удаленный пользователь и IP-адрес сервера.
В качестве LOCAL_PORT вы можете использовать любой номер порта больше, чем 1024. Значения меньше 1024 являются привилегированными портами и могут использоваться только пользователем root. Если SSH-сервер прослушивает не 22-й порт, который стоит по умолчанию, используйте опцию -p [PORT_NUMBER].
Имя хоста назначения должно иметь разрешение с сервера SSH.
Переадресация удаленного порта
Перенаправление удаленного порта является противоположным случаю с портом локальным. Здесь можно перенаправить порт на удаленном компьютере (ssh-сервер) на порт локального компьютера (ssh-клиент), а затем на порт конечного компьютера.
Для перенаправления нужно:
ssh -R [REMOTE:]REMOTE_PORT:DESTINATION:DESTINATION_PORT [USER@]SSH_SERVER
Понадобятся такие параметры:
[REMOTE:]REMOTE_PORT – IP-адрес и номер порта удаленного SSH-сервера. Если значение REMOTE не выставлено, удаленный SSH-сервер свяжется сразу со всеми интерфейсами.
DESTINATION:DESTINATION_PORT – IP/имя хоста и порт машины назначения.
[USER@]SERVER_IP – Удаленный пользователь SSH и IP-адрес сервера.
Удаленная переадресация портов в основном используется, чтобы предоставить кому-то извне доступ к одной из внутренних служб.
Динамическая переадресация портов
Динамическая переадресация портов даёт возможность создать сокет на локальном компьютере (SSH-клиент), который выступает в качестве прокси-сервера SOCKS. Когда клиент подсоединяется к данному порту, соединение перенаправляется на удаленный компьютер(SSH-сервер), который далее идёт на динамический порт компьютера назначения.
Для создания переадресации динамического порта:
ssh -D [LOCAL_IP:]LOCAL_PORT [USER@]SSH_SERVER
Понадобятся такие параметры:
[LOCAL_IP:]LOCAL_PORT – IP-адрес и номер порта локального компьютера. Если LOCAL_IP не указан, SSH-клиент привязывается к localhost.
[USER@]SERVER_IP – Удаленный пользователь SSH и IP-адрес сервера.
Типовым примером динамической переадресации будет туннелирование трафика браузера через SSH-сервер.
Чтобы создать туннель SOCKS на порту 9090, нужно ввести следующую команду:
ssh -D 9090 -N -f user@remote.host
После установки туннелирования можно настроить приложение для его применения. Перенаправление портов нужно настраивать отдельно для каждого приложения, траффик с которого вы хотите перенаправить по SSH-туннелю.
Настройка SSH-туннелирования в Windows
На Windows туннели SSH создаются с помощью клиента PuTTY. Запустите его и укажите IP-адрес SSH-сервера в поле Host name.
В разделе Connection разверните SSH и выберите Tunnels. Чтобы настроить локальную переадресацию, выберите Local, для удалённой – Remote и Dynamic для динамической переадресации портов.
- При настройке локальной переадресации, введите локальный порт переадресации в поле Source Port field и хост назначения и IP-адрес в поле Destination, например, localhost:5901.
- Для перенаправления удаленного порта введите порт перенапраaвления удаленного SSH-сервера в поле Source Port и целевой хост и IP-адрес в поле Destination, например localhost:3000.
- При настройке динамического перенаправления введите в поле Source Port только локальный порт SOCKS.
Нажмите на кнопку Add
Вернитесь на страницу Session и сохраните настройки, чтобы каждый раз не вводить их заново. Введите имя сеанса в поле Saved Session и нажмите Save. В следующий раз можно будет просто открывать сохраненную сессию.
Практическое применения функций SSH-туннелей
Далее разберём, как можно использовать функции SSH.
Автоматизация копирования ключа SSH
Чтобы не копировать файлы вручную, можно автоматизировать этот процесс с помощью специальной команды. С её помощью можно копировать с вашей системы ключ по умолчанию ~/.ssh/id_rsa.pub в ~/.ssh/authorized_keys
на удалённом сервере.
localhost:~$ ssh-copy-id user@remoteserver
Удалённое выполнение команд
Вы можете связать команду ssh
с другими командам. Для этого вставьте название команды, которую нужно удалённо запустить, вместо последнего параметра в кавычках.
localhost:~$ ssh remoteserver "cat /var/log/nginx/access.log" | grep badstuff.php
Это позволяет выполнить grep
на локальной системе после скачивания лога по ssh-каналу.
Копирование папки по SSH с локального сервера на удалённый
С помощью этой команды можно сжать папку в bzip2
, а затем извлекает данные на удалённом компьютере за счёт создания там дубликата папки:
localhost:~$ tar -cvj /datafolder | ssh remoteserver "tar -xj -C /datafolder"
Редактирование текстовых файлов
Команда, которая понравится пользователям vim. Вы сможете редактировать файлы по scp всего одной командой. Файл создаётся локально в /tmp
, а когда происходит его сохранение из vim, копируется обратно.
localhost:~$ vim scp://user@remoteserver//etc/hosts
Что лучше SSH или VPN
Всё зависит от целей и задач. В целом, оба варианта обеспечивают надёжное шифрование и защиту данных.
VPN сложнее в настройке, но проще в использовании, а SSH – наоборот.
VPN позволяет зашифровать информацию о сетевом трафике, а значит, избежать отслеживания. Туннели SSH для этого нужно каждый раз настраивать вручную.