Вы можете использовать встроенный OpenSSH сервер в Windows для проброса портов через SSH-туннель (SSH туннелирования). Перенаправление портов в SSH позволяет туннелировать (пробрасывать) порты приложений с локального компьютера на удаленный сервер и наоборот. Проброс портов через SSH туннель широко используется в среде Linux/Unix, а теперь вы можете воспользоваться этим возможностями и в Windows. В этом примере мы покажем, как пробросить RDP подключение через OpenSSH на хосте Windows Server.
Содержание:
- Для чего нужны SSH-туннели?
- Защищенный доступ к RDP через SSH туннель (local TCP forwarding)
- SSH туннель в Windows с помощью Putty
- Переброс удаленного порта на локальную машину (Remote TCP forwarding)
Для чего нужны SSH-туннели?
SSH-туннель обеспечивает защищенное шифрованный TCP соединение локальных хостом и удалённым сервером SSH. SSH Port Forwarding позволяет туннелировать поверх SSH подключение к локальному порту на локальном компьютере к любому TCP порту на удаленном сервере (или наоборот)
Порт форвардинг в SSH-туннелях применяются для:
- Обхода межсетевых экранов;
- Открытия бэкдоров в частные сети;
- Организации простых VPN/прокси сценариев для безопасного удаленного подключения;
- Защиты трафика устаревших приложений (протоколов), которые передают данные в открытом тексте (без шифрования).
Вы можете перенаправить в SSH туннель только TCP трафик/порт (UDP и ICMP протоколы не поддерживаются).
Проброс портов через SSH туннель можно использовать в сценариях, когда нужно подключиться к удаленному компьютеру, который защищен межсетевым экраном. Например, у вас имеется сервер c Windows, на котором наружу открыт только SSH порт (TCP 22). Все остальные порты блокируются аппаратным межсетевым экраном или Windows Defender Firewall Windows. Ваша задача подключиться к рабочему столу этого Windows сервера с помощью клиента RDP. Казалось бы, невозможная задача, т.к. порт RDP 3389 блокируется брандмауэром. Однако вы можете получить доступ к любому открытому порты на удаленном хосте через SSH-тунель.
Чаще всего используются следующие сценарии проброса через SSH:
- Local TCP forwarding — проброс локального порта на удаленный сервер;
- Remote TCP forwarding — проброс удаленного порта на локальный компьютер;
- Двойной SSH туннель – позволяет соединить между собой через SSH сервер компьютеры без выделенных белых IP адресов или находящиеся за NAT (если не подходит решение с OpenVPN)
Защищенный доступ к RDP через SSH туннель (local TCP forwarding)
В этом режиме вы создаете на своем компьютере локальный TCP порт, подключения к которому перенаправляются через SSH туннель на указанный порт удаленного сервера. В этом примере мы создадим локальный порт 8888, при подключении к которому выполняется перенаправление на RDP порт 3389 на удаленном компьютере. Общая схема подключения выглядит так:
Для проброса портов нам потребуется SSH клиент. Можно использовать сторонний клиент (например, Putty), но я буду использовать встроенный SSH клиент в Windows. Чтобы установить клиенте OpenSSH, выполните в консоли PowerShell команду:
Get-WindowsCapability -Online | ? Name -like 'OpenSSH.Client*'
Чтобы создать SSH туннель с удаленным компьютером 192.168.1.90, выполните команду:
ssh -L 8888:192.168.1.90:3389 [email protected]
В этом примере используется формат
LOCAL_PORT:DESTINATION:DESTINATION_PORT
и
USER@DEST_SERVER_IP
(имя пользователя и адрес удаленного SSH сервера)
Чтобы SSH туннель работал в фоновом режиме, нужно добавит параметр –f.
Теперь, чтобы подключится к удаленному компьютеру по RDP через SSH туннель, вам запустить RDP-клиент (mstsc.exe) и подключиться на локальный порт 8888 своего компьютера:
127.0.0.1:8888
Выполните аутентификацию на удаленном компьютере и можете спокойно работать в RDP-сессии. С помощью команды Get-NetTCPConnection или утилиты TCPView вы можете убедиться, что RDP подключение установлено локально (RDP подключение инициировано запущенным локально SSH сервером):
Get-NetTCPConnection -State Established|where {$_.localport -eq "3389"}|fl
При этом порт TCP/3389 на сервере не доступен с удаленного компьютера. Вы можете проверить доступность порта с помощью командлета Test-NetConnection:
Test-NetConnection 192.168.1.90 -port 3389
TcpTestSucceeded : False
Обратите внимание, что если вы перенаправляете таким образом незашифрованный трафик приложения, то по сети он передается в зашифрованном виде. Трафик шифруется на одном конце SSH соединения и расшифровывается на другом.
Другие компьютеры в вашей локальной сети смогут одновременно подключиться к удаленному RDP серверу Windows, даже если у них полностью заблокирован прямой доступ к удаленному серверу (как по SSH, так и по RDP). Для этого, они должны подключиться RDP клиентом к порту 8888 на компьютере, на котором создан SSH туннель:
mstsc.exe /v 10.10.1.220:8888
Защита RDP подключения с помощью SSH туннеля может быть хорошей альтернативой VPN для доступа к публичным Windows хостам в Интернете. В этом случае вам не нужно открывать прямой доступ к порту RDP/3389 из Интернета к хосту Windows. Достаточно открыть только порт SSH/22, что защитит вас от атак подбора пароля по RDP и эксплуатации 0-day RDP уязвимостей.
Для автоматического ввода пароля для подключения к SSH можно использовать утилиту sshpass. Ее можно запустить через подсистему WSL2 для Windows.
Установите sshpass в Ubuntu WSL:
$ sudo apt-get -y install ssphass
Запустите клиент Remote Desktop Connection (mstsc.exe) и сохраните в Windows RDP файл с настройками подключения:
Computer : localhost:8888 User name : remoteusername
Для автоматического подключения к удаленном RDP хосту с сохранённым паролем SSH, используйте такой bat файл:
start /min wsl sshpass -p "password" ssh -L 8888:192.168.31.90:3389 [email protected]
powershell sleep 5
start mstsc C:\rdp\localhost-33389.rdp
Или (предпочтительно) настройте SSH аутентификацию по ключам.
SSH туннель в Windows с помощью Putty
Рассмотрим, как настроить SSH туннель в Windows с помощью популярного SSH клиента Putty.
- Запустите PuTTY и перейдите в раздел Connection -> SSH -> Tunnels;
- В поле Source port укажите локального порта (в нашем примере это 8888);
- Укажите IP адрес сервера SSH и порт на удаленном хосте, на который нужно выполнить переадресацию:
192.168.31.90:3389
- Выберите Local в качестве Destination и нажмите Add;
- Чтобы не открывать shell удаленного хоста при подключении через туннель, включите опцию Don’t start a shell or command at all в разделе SSH;
- Вернитесь на вкладку Session, укажите имя или IP адрес удаленного SSH хоста и порт подключения (по умолчанию порт 22). Чтобы сохранить настройки подключения, укажите имя сессии в поле Saved Session и нажмите Save;
- Теперь вы можете запустить сохраненный SSH туннель в Putty прямо и панели задач Windows.
Переброс удаленного порта на локальную машину (Remote TCP forwarding)
Есть еще один вариант применения SSH туннеля – remote TCP forwarding. Через SSH туннель вы можете открыть доступ удаленному серверу к локальному порту на вашем компьютере или порту на другом компьютере в вашей локальной сети. Например, вы хотите, чтобы внешний сервер (192.168.1.90) получил доступ к вашему Интранет сайту (не опубликованному в Интернете). Для создания обратного туннеля, используйте такую команду:
ssh -R 8080:internalwebsever:80 [email protected]
Теперь, чтобы на удаленном SSH сервер получить доступ к веб серверу internalwebsever достаточно в браузере набрать адрес
http://localhost:8080
.
С помощью SSH туннелей вы можете строить целые цепочки для форвардинга портов. Включить или отключить SSH туннелирование можно в конфигурационном файле OpenSSH (sshd_config) с помощью директив:
AllowStreamLocalForwarding yes
AllowTcpForwarding remote
PermitTunnel no
Данные опции неприменимы для текущей версии OpenSSH в Windows.
SSH-туннели нужны для установки защищенных каналов между локальной машиной и удалённым сервером. Через них можно, например, передавать и редактировать файлы, запускать приложения, сохранять резервные копии.
Как устроен туннель
SSH — это Secure Shell, защищённый сетевой протокол для удалённого управления. Он шифрует трафик и работает со всеми популярными операционными системами.
Для установки безопасного подключения к удалённой машине используется SSH-туннелирование. Однако под туннелем здесь подразумевается не инкапсуляция одного протокола в другом. Речь идёт о том, что администратор выполняет через SSH проброс портов. Технология подразумевает передачу TCP-пакетов и трансляцию IP-заголовков при передаче информации, если соблюдаются правила.
cloud
Как создать туннель
Для идентификации пользователя нужны два ключа — приватный и публичный (открытый). Открытый хранится на сервере, приватный — на локальной машине. Создание безопасного подключения отличается в зависимости от операционной системы.
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
Вместо user вы указываете имя пользователя, вместо remoteserver
— хост или IP-адрес удалённой машины на timeweb.cloud или другой платформе.
Создание безопасного подключения завершено. Чтобы подключиться через SSH-port, выполните:
ssh root@HOST
Вместо параметра HOST
укажите публичный IP-адрес сервера, на который вы добавили открытый ключ. Если вы не создавали пароль для дополнительной защиты закрытой части, то вводить ничего больше не нужно. Система сверит открытый и закрытый ключи и при обнаружении соответствия установит защищенное соединение.
При первом подключении система предупредит о неизвестном хосте и уточнит, доверяете ли вы ему. Введите ‘yes’ и нажмите Enter.
Чтобы сделать подключение безопаснее, не стоит использовать аккаунт с правами суперпользователя. Кроме того, можно ограничить связь между консолями локальной машины и удалённого сервера, указав параметр -N
. Пример команды:
ssh -N -L -g 3389:192.168.0.105:3389 user@rt.example.com
Это исключит ситуацию, при которой пользователь случайно выполняет на удалённой машине команды, предназначенные для локального компьютера.
Windows
На Windows создать пару ключей можно двумя способами — через консоль PowerShell и с помощью программы PuTTygen (устанавливается вместе с PuTTy).
Чтобы сгенерировать ключи через PowerShell, откройте терминал и выполните:
ssh-keygen -t rsa
Защитите приватный ключ паролем или оставьте поле пустым и нажмите Enter.
По умолчанию открытый ключ сохраняется в файле ~/.ssh/id_rsa.pub
. Приватный ключ с именем id_rsa
лежит в той же папке. Откройте файл с публичным ключом через текстовый редактор или воспользуйтесь командой cat
в PowerShell:
cat ~/.ssh/id_rsa.pub
Скопируйте публичный ключ и добавьте его на удаленный сервер.
Чтобы подключиться к серверу, выполните:
ssh root@HOST
Вместо параметра 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.com
SOCKS-прокси работает через порт 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.
Rsync через SSH
Бэкапы важных данных можно делать с помощью 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/
Это удобное решение для обмена файлами и выполнения других операций.
Заключение
В этой статье мы узнали, что такое SSH-туннель, как им пользоваться, как его настроить на Linux, macOS и Windows, какие у него есть особенности и параметры конфигурации. Несколько распространенных сценариев также описаны в примерах использования.
Запоминать все команды и аргументы не нужно. Основные операции вы быстро начнёте делать на автомате, а более сложные случаи всегда можно посмотреть в справке или нашем руководстве на timeweb.cloud
SSH-туннелирование устанавливает защищенный канал связи между локальным рабочим узлом и удаленным сервером. Разбираемся, как можно создавать SSH-туннели, какие полезные для системного администратора функции они имеют и почему важно помнить о безопасности интернет-соединения.
Любые важные данные следует передавать по защищенным каналам информации. Но это не всегда легко реализовать, особенно когда пользователю нужно совершить срочные операции на удаленном сервере, а подключиться к интернету можно только через публичный незащищенный Wi-Fi. В таком случае используют SSH-туннелирование, устанавливающее защищенный канал связи между локальным рабочим узлом и удаленным сервером. С помощью него можно не только передавать или редактировать файлы дистанционно, но и запускать GUI-приложения, делать бэкап, передавать пароли и даже организовывать потоковое вещание.
Как устроены SSH-туннели
Создание, условия применения и польза для сисадминов
Ситуация, когда требуется срочный доступ к домашнему компьютеру или внутренней корпоративной сети, знакома каждому. К сожалению, качество и безопасность общественных сетей часто оставляют желать лучшего. Важную информацию по таким сетям лучше не передавать. Кроме того, для организации доступа часто требуется внешнее ПО (Team Viewer и другие). Для системного администрирования существует способ использования публичных сетей и при этом создания безопасного подключения к необходимым узлам без использования того же VPN. Речь о SSH-туннелировании.
SSH (от англ. Secure Shell — «безопасная оболочка») — сетевой протокол, который используется для удаленного управления ОС и проксировании TCP-соединений. Выполняет шифрование всего трафика (сюда же относятся пароли и другие важные для корпоративной безопасности данные). SSH-серверы работают с большинством сетевых операционных систем, представленных на рынке.
Подключиться по этому протоколу можно практически к любому серверу. Для организации безопасного соединения можно использовать так называемые SSH-туннели. Но с точки зрения терминологии — это не те туннели, о которых обычно идет речь, когда говорят о системном администрировании. Само наименование, SSH tunnel, сформировалось среди сисадминов для простоты обозначения технологии — SSH Port Forwarding (проброса портов). В ней реализовано сразу несколько возможностей сетевого протокола SSH, а именно — передача TCP-пакетов и трансляция IP-заголовка во время передачи информации при условии существования заранее заданного правила.
Главное отличие SSH tunnels от их аналогов с VPN — передача информации не происходит в любом направлении. Такой канал связи имеет одну точку входа и работает исключительно с TCP-пакетами. Создание SSH-туннелей скорее напоминает проброс портов поверх протокола, нежели туннелирование в чистом виде.
Как создать SSH-туннель и настроить его параметры
Для того, чтобы идентифицировать пользователя, требуется два ключа. Открытый ключ размещается непосредственно на сервере, а закрытый ключ создается и хранится на компьютере пользователя.
Создание ключа и установление соединения с удаленным сервером занимает несколько минут.
Создание SSH-ключа в Linux (Ubuntu)/MacOS. Пошаговая инструкция:
1. Для создания ключа требуется ввести следующую команду:
ssh-keygen -t rsa
2. После введения команды на экране управляющей консоли появится диалог:
Enter file in which to save the key (/home/user/.ssh/id_rsa):
3. Чтобы дополнительно защитить соединение, система предложит пользователю придумать и ввести специальное кодовое слово (фразу).
Enter passphrase (empty for no passphrase):
4. Разумеется, пункт № 3 можно пропустить, нажав Enter. То же самое следует сделать, отвечая на следующий вопрос.
5. Завершив создание двух типов ключей (публичного и закрытого), можно переходить к установке связи по SSH. На консоли появится сообщение:
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
The key's randomart image is:
+---[RSA 2048]----+
| ..o o |
| .. * * = . |
| . o O o B .|
| . . + = = o |
| oo S o = . .|
| .. B . = . . |
| . B o = ..|
| . .o.o.. o .. .|
| .oooE o. |
+----[SHA256]-----+
6. На следующем этапе в терминале необходимо ввести команду, которая покажет открытый ключ:
cat ~/.ssh/id_rsa.pub
7. Публичный ключ необходимо ввести в панели управления. Внимательно проверяйте корректность введения ключа.
8. Остается последний этап. Для создания SSH-туннеля к удаленному серверу достаточно выполнить одну команду:
ssh root@HOST
Параметр HOST ― публичный IP-адрес сервера.
Добавим, что введение дополнительных паролей не требуется. А при использовании сервера Selectel можно использовать свой скрипт (bash) для быстрой настройки.
Для удобства пользователей ОС Windows 10 можно создать SSH-туннель в эмуляторе под Windows (MinGW64).
Инструкция для создания SSH-туннеля в Windows 10 выглядит аналогичным образом:
1. Для генерации пары ключей используется команда:
ssh-keygen -t rsa
2. Желательно защитить приватный ключ паролем (или нажать Enter, если он не нужен):
3. Ключи сгенерированы:
4. Открытый ключ хранится в файле ~/.ssh/id_rsa.pub. Приватный ключ находится в файле id_rsa и должен храниться в секрете:
5. Чтобы посмотреть содержимое публичного ключа, используется команда:
cat ~/.ssh/id_rsa.pub
6. Этот ключ (всю строку, начинающуюся с ssh-rsa) необходимо вставить в панели управления Selectel, в поле Операционная система / SSH-ключ выбранного сервера. При установке ОС он будет скопирован в файл .ssh/authorized_keys. При смене ключа в панели управления Selectel текущий образ ОС будет пересоздан, а данные на сервере — утеряны.
7. Для подключения к серверу по SSH используется команда:
ssh root@84.38.187.48 (IP-адрес сервера будет другим).
8. При первом подключении утилита SSH сообщает о неизвестном хосте и спрашивает, уверены ли вы, что доверяете ему. Если ответ положительный (следует ответить yes), IP-адрес и открытый сертификат этого сервера будут добавлены в файл ~/.ssh/known_hosts на локальной машине:
9. Если ранее при генерации пары ключей был задан пароль, утилита SSH попросит ввести его:
10. После ввода пароля и нажатия Enter устанавливается зашифрованное соединение с сервером:
Еще один вариант, как можно использовать этот тип соединения, — создание канала связи по протоколу RDP. Этот вариант подходит, когда пользователь не может подключиться к узлу из-за отсутствия доступа к нему из сети. Зато у него есть доступ к маршрутизатору. Этого достаточно, чтобы использовать данный тип туннелирования.
Параметры канала связи устанавливает инициатор подключения. На втором конце канала связи всегда расположен целевой сервер. Так, клиентом может оказаться VPS-сервер, а точкой выхода — компьютер сисадмина. Точка входа может быть создана с любой стороны туннеля: именно через нее принимаются подключения. Обратная сторона туннеля — точка выхода — способна лишь на маршрутизацию пакетов информации с учетом установленных правил. Отдельная опция — соединение с удаленной машиной, на которой запущен модуль Docker (SSH Docker). Подробнее об этом мы расскажем в следующих публикациях.
Аналогичным образом проходит процесс установки соединения с определенным сервером. В качестве примера возьмем целевой сервер с адресом 192.168.0.105. При этом для пользователя доступен только маршрутизатор (192.168.0.1). В качестве точки входа прописывается 127.0.0.1:3389. Кроме того, задается правило трансляции, определяющее узел, принимающий данные на выходе из SSH-туннеля. В нашем случае в качестве правила указывается 192.168.0.105:3389. Проследите, чтобы указанный адрес действительно существовал, иначе вам не удастся подключиться к целевому серверу.
После того, как вы зададите исходные данные, появится TCP-сокет, который создает служба SSH. Этот локальный сокет следит за тем, когда начнутся подключения на порт 3389. Точкой назначения прописывается localhost (127.0.0.1). Отметим, что RDP-клиент не владеет информацией о настоящем назначении получателя пакета. Клиент только открывает динамический порт, чтобы отправить пакет данных, у которого задан адрес назначения (точка входа) и источника (127.0.0.1:61256).
Пакет с информацией следует от входной точки SSH tunnel на его противоположный конец. Адрес трансляции поменяется. Теперь там значится 192.168.0.105:3389. На следующем этапе SSH-сервер просто поставит свой адрес вместо адреса источника. Вся информация, которая передается внутри канала, будет отправлена поверх протокола. А RDP-клиент оперирует исключительно локальным сокетом. Важно, что вся информация внутри туннеля защищена — она шифруется. Но соединение между SSH- и RDP-серверами остается обычным. Разумеется, этот фактор стоит учитывать, если пользователь работает с небезопасными протоколами.
SSH Proxy: как организовать доступ к любой системе (обращение к проксируемому серверу)
С помощью SSH-туннеля можно воспользоваться домашней (или корпоративной) сетью, даже используя ненадежный бесплатный Wi-Fi. Для этого пользователю потребуется запустить SSH-прокси, а затем по аналогичному принципу создать туннель в целевую сеть (например, можно подключиться к домашней сети).
Важно, чтобы приложения, которые потребуются инициатору подключения для работы, поддерживали SOCKS-прокси. С помощью туннеля сетевые службы станут доступны для удаленной работы. Другой вариант: пользователь сможет выйти в интернет, используя домашнее подключение, но сидя при этом в другом конце мира и используя публичную сеть. Вся передаваемая через туннель информация будет зашифрована.
Это не единственный способ практического применения SSH-туннелирования. Один из самых популярных кейсов — SSH Proxy — открывает доступ к желаемой системе, если она доступна для удаленного сервера. При этом для туннелирования через прокси-сервер потребуется ввести всего одну команду:
localhost:~$ ssh -D 8888 user@remoteserver
localhost:~$ netstat -pan | grep 8888
tcp 0 0 127.0.0.1:8888 0.0.0.0:* LISTEN 23880/ssh
Команда выше показывает, что пользователь запускает SOCKS-прокси. Портом для работы назначается 8888. Кроме того, необходимо проверить, активен ли этот TCP-порт (используется режим прослушивания). Служба работает исключительно на localhost (127.0.0.1). Если немного видоизменить команду, то можно прослушивать все интерфейсы (в том числе ethernet или Wi-Fi). Это позволяет приложениям подключаться к прокси-серверу через SSH-прокси:
localhost:~$ ssh -D 0.0.0.0:8888 user@remoteserver
Чтобы браузер работал корректно, необходимы настройки. Например, чтобы запустить Chrome с активированным SOCKS-прокси, потребуется команда:
localhost:~$ google-chrome --proxy-server="socks5://192.168.1.10:8888"
Она создает SOCKS-прокси, а также инициирует туннелирование DNS-запросов. Утилита tcpdump проверяет, видны DNS-запросы или нет.
Кроме браузеров, многие современные приложения работают с SOCKS-прокси: достаточно изменить их параметры, чтобы активировать прокси-сервер. Отдельно применяются инструменты, которые помогают приложениям использовать эту важную функцию — к примеру, proxychains позволяет запустить через SOCKS-прокси Microsoft RDP.
Зачем нужны динамические SSH tunnels
Динамический SSH tunnel отличается от рассмотренных выше типов соединений. Он открывает локальный TCP-сокет для его использования в качестве SOCKS4/SOCKS5 прокси. Обычно его применяют, когда требуется VPN, а его развертывание невозможно. Такой тип SSH-туннеля также отвечает необходимым требованиям безопасности.
Кроме того, создание динамического туннеля удобно, когда пользователю необходимо выйти в интернет однократно:
ssh -D 1080 user@vps.example.com
SOCKS-прокси работает через порт 1080.
Помимо этого, динамический туннель не предусматривает открытие дополнительных портов во внешнюю сеть. Весь трафик будет проходить исключительно через SSH-соединение, скрывая тем самым характер интернет-деятельности пользователя.
Команды и практическое применения функций SSH-туннелей
Рассмотрим несколько практических примеров применения SSH-туннелирования.
Проброс (перенаправление) портов — Port Forwarding
Чтобы осуществить проброс портов, потребуется создание SSH tunnel. Для этого в локальной системе открывается порт, а для создания канала связи пользователь должен выбрать порт на другом конце туннеля:
localhost:~$ ssh -L 9999:127.0.0.1:80 user@remoteserver
Команда устанавливает прослушку на порт 9999. Порт 80 используется для проброса. Для Port Forwarding также используются прокси-серверы или TCP-службы.
Автоматизация копирования публичного (открытого) ключа
Традиционно пользователю приходится копировать открытые ключи вручную. SSH-протокол существенно ускоряет этот процесс:
localhost:~$ ssh-copy-id user@remoteserver
Эта команда выполняет копирование публичного ключа по умолчанию или из директории ~/.ssh/id_rsa.pub в ~/.ssh/authorized_keys (она находится на удаленном сервере).
Обратный SSH-туннель (SSH reverse tunnel)
Очевидно, что SSH tunnel можно создать и в обратном направлении. Достаточно подключить прослушивающий порт к другому локальному порту:
localhost:~$ ssh -v -R 0.0.0.0:1999:127.0.0.1:902 192.168.1.100 user@remoteserver
Данный туннель работает следующий образом: от порта 1999 к remoteserver, а уже после этого обращается к порту 902 на локальном клиенте.
Удаленное выполнение команд с помощью SSH
SSH-команда позволяет создать интерфейс для работы с командами на удаленном хосте. Они прописываются в качестве последнего параметра:
localhost:~$ ssh remoteserver "cat /var/log/nginx/access.log" | grep badstuff.php
После скачивания лога grep можно запустить на удаленной стороне.
Копирование, функция rsync-копирования (rsync через SSH)
Чтобы создать дубликат папки на удаленном сервере, достаточно сначала сжать папку с помощью bzip2, а после извлечь поток bzip2 на другой стороне. Команда для этой операции следующая:
localhost:~$ tar -cvj /datafolder | ssh remoteserver "tar -xj -C /datafolder"
Для регулярных бэкапов важной информации используется rsync:
localhost:~$ rsync -az /home/testuser/data proglibserver:backup/
Функция rsync позволяет копировать отличия, сравнивая информацию в разных временных точках. Таким образом, можно восстановить важные данные в случае неудачного сеанса передачи.
GUI-приложения: удаленный запуск через SSH
SSH-туннель поддерживает функцию, позволяющую запускать GUI-приложения удаленно:
localhost:~$ ssh -X remoteserver vmware
Отметим: несмотря на то, что GUI выполняется на удаленном сервере, окно отображается на локальном рабочем столе. В примере для работы запущена консоль виртуальной машины VMware Workstation. Но для успешной реализации команды требуются пакеты X11 и YES для X11Forwarding в файле sshd_config.
Редактирование текстовых файлов
Метод редактирования файлов одной командой предусматривает создание файла в /tmp, а затем копирование в заданную директорию:
localhost:~$ vim scp://user@remoteserver//etc/hosts
Прыжки по хостам
Туннелирование предусматривает переход через несколько хостов, если пользователь сталкивается с сегментацией сети:
localhost:~$ ssh -J host1,host2,host3 user@host4.internal
Параметр -J использует переадресацию для установления сеанса с каждым следующим хостом в цепочке. При этом рабочий сеанс полностью зашифрован — от localhost и до host4.
Фильтрация трафика с помощью iptables
Утилита iptables позволяет устанавливать правила для блокировки или разрешения прохождения трафика: INPUT, FORWARD и OUTPUT. В случае если пользователь не задал никаких правил, этот межсетевой экран будет выполнять заданную по умолчанию фильтрацию. Для установления связи с целевым сервером утилита сравнит IP-адрес инициатора подключения с тем списком, что есть в правилах INPUT, а затем либо даст доступ к серверу, либо запретит его.
Однако работа с iptables требует определенной осторожности. Причина проста: если неверно задать правило фильтрации, удаленный доступ может оказаться просто невозможным до тех пор, пока пользователь не снимет ограничения, получив физический доступ к компьютеру.
Реализация SSH tunnels в Windows
Возможности туннелирования доступны и для тех, кто использует Windows 10: под эту ОС существует ряд SSH-клиентов. Один из самых применяемых — PuTTY. Запуск сервера под Windows — более сложная задача, которая требует от пользователя специализированной квалификации.
PuTTY настраивается достаточно просто: для этого во вкладке Connection открываем SSH Tunnels, где необходимо прописать базовые настройки соединения — Source port (точка входа), Destination (назначение); радиопереключатели Local — Remote — Dynamic определяют тип будущего канала связи. Адрес целевого узла указывается в другом разделе — Session.
Открытия дополнительных портов или развертывания VPN не требуется.
Безопасны ли SSH-туннели
Как мы уже отмечали, одна из их задач — создание безопасного соединения с удаленной машиной. Однако не стоит забывать о «побочных эффектах» таких туннелей. Кроме соединения с удаленным сервером, пользователь получает консоль, которая открывается на сервере.
Если пользователь забудет о своем подключении, то может выполнить те команды, которые изначально были предназначены к выполнению на локальном узле. Чтобы избежать подобной ошибки (особенно если пользователь имеет права суперпользователя), при запуске канала связи следует указывать параметр -N:
ssh -N -L -g 3389:192.168.0.105:3389 user@rt.example.com
Кроме того, не стоит использовать при подключении к удаленной машине аккаунт суперпользователя, для этих целей подойдет учетная запись с обычными правами. И не забывайте про то, что по завершении работы требуется удалить SSH-туннель.
You can use the built-in OpenSSH server on Windows to forward ports through an SSH tunnel (SSH tunneling). Port forwarding in SSH allows you to tunnel (forward) application ports from your local computer to a remote server and vice versa. Port forwarding over an SSH tunnel is widely used in Linux/Unix environments, and now you can take advantage of this feature in Windows as well. In this example, we will show how to tunnel an RDP connection traffic over OpenSSH on a Windows Server host.
Contents:
- Securing RDP with the SSH Tunnel (Local TCP Forwarding)
- How to Create SSH Tunnel on Windows with Putty?
- Remote TCP Forwarding (Reverse SSH) to a Local Computer
What is an SSH Tunneling?
An SSH tunnel provides a secure, encrypted TCP connection between a local host and a remote SSH server. SSH Port Forwarding allows you to tunnel a connection from a local port on your local machine to any TCP port on a remote server (or vice versa) over SSH.
Port forwarding in SSH tunnels is used for:
- Bypass firewalls;
- Opening backdoors to private networks;
- VPN scenarios replacements for secure remote connection;
- Protect traffic of legacy applications (protocols) that transmit data in clear text (without encryption).
You can only forward TCP traffic/port to the SSH tunnel (UDP and ICMP protocols are not supported).
SSH tunneling is mostly used in scenarios when you need to connect to a remote computer behind the firewall. For example, you have a Windows Server with only SSH port open (TCP 22). All other ports are blocked by a hardware firewall or Windows Defender Firewall. Your task is to connect to the Windows Server using the RDP client. It would seem an impossible task because the Remote Desktop port 3389 is blocked by the firewall. However, you can access any ports on a remote host through an SSH tunnel.
Here are the typical usage scenarios of SSH tunneling:
- Local TCP forwarding is a local port forwarding to a remote server;
- Remote TCP forwarding is a remote port forwarding to a local computer;
- Double SSH tunnel – allows connecting computers without allocated pubic IP addresses or behind NAT/firewall through an SSH server (if OpenVPN server solution is not applicable).
Securing RDP with the SSH Tunnel (Local TCP Forwarding)
In this mode, you create a local TCP port on your computer. All connections to this port will be forwarded to the specified port on a remote server via the SSH tunnel. In this example, we will create a local port 8888, and the connection to it will be redirected to RDP port 3389 on a remote Windows host. The general connection diagram looks like this:
We need an SSH client for port forwarding. You can use a third-party client (like Putty), but I will use the built-in SSH client on Windows. Run the following command in the PowerShell console to install the OpenSSH client on Windows 10/11 or Windows Server 2022/2019:
Get-WindowsCapability -Online | ? Name -like 'OpenSSH.Client*'
To create an SSH tunnel with a remote host 192.168.1.90, run the command:
ssh -L 8888:192.168.1.90:3389 [email protected]
The following connection string is used in this example: LOCAL_PORT:DESTINATION_IP:DESTINATION_PORT
and USER@DESTINATION_IP
(the username and address of the remote SSH server)
To make the SSH tunnel run in the background, add the –f parameter.
To connect to a Remote Desktop via the SSH tunnel, you need to connect to the local port 8888 of your computer using the RDP client (mstsc.exe):
127.0.0.1:8888
Login to the remote computer and work safely in the RDP session. You can use the Get-NetTCPConnection cmdlet or the TCPView tool to make sure that the RDP connection has been established locally (the RDP connection was initiated by the SSH server running locally):
Get-NetTCPConnection -State Established|where {$_.localport -eq "3389"}|fl
You can check that the TCP/3389 port on the server is not directly accessible from your computer. You can check the availability of a port using the Test-NetConnection cmdlet:
Test-NetConnection 192.168.1.90 -port 3389
TcpTestSucceeded : False
Other computers of your local network can also use this tunnel to simultaneously connect to an RDP server even if the direct connection is not allowed (both via SSH and RDP). To do it, they must use the RDP client to connect to port 8888 on your computer (with the SSH tunnel created):
mstsc.exe /v 10.10.1.220:8888
Securing an RDP connection with an SSH tunnel can be a good VPN alternative for accessing public Windows hosts. In this case, you don’t need to directly open the RDP/3389 port on the Windows host. It is enough to open only the SSH/22 port, which will protect you from RDP brute force attacks and the exploitation of 0-day RDP vulnerabilities.
You can use the sshpass tool to provide password automation for SSH login. You can run this tool through the WSL2 subsystem for Windows.
Install the sshpass in Ubuntu WSL:
$ sudo apt-get -y install ssphass
Run the Remote Desktop Connection client (mstsc.exe) and save the connection settings to the localhost-3389.rdp file:
Computer: localhost:8888 User name: remoteusername
To automatically connect to a remote RDP host with a saved SSH password, use the following bat file:
start /min wsl sshpass -p "password" ssh -L 8888:192.168.31.90:3389 [email protected]
powershell sleep 5
start mstsc C:\script\localhost-3389.rdp
Or (preferably) set up SSH key authentication.
How to Create SSH Tunnel on Windows with Putty?
Let’s look at how to create an SSH tunnel on Windows using the popular SSH client Putty.
- Run PuTTY and navigate to Connection -> SSH -> Tunnels;
- Specify the local port number in the Source port (in our example, it is 8888);
- Specify the IP address of the SSH server and the port on the remote host to forward the connection:
192.168.31.90:3389
- Select Local destination and click Add;
- To avoid opening a remote host shell when connecting through a tunnel, enable the Don’t start a shell or command at all option in the SSH section;
- Return to the Session tab, specify the name or IP address of the remote SSH host and the connection port number (22 by default). Specify the session name in the Saved Session field and click Save;
- Now you can start the saved SSH tunnel in Putty directly from the Windows 10 taskbar.
Remote TCP Forwarding (Reverse SSH) to a Local Computer
There is another SSH tunnel use case — remote TCP forwarding. You can allow a remote server to access a local port on your computer or a port on another computer on your local network through an SSH tunnel. For example, you want an external server (192.168.1.90) to access your Intranet site (not published on the Internet). To create a reverse tunnel, use the following command:
ssh -R 8080:internalwww:80 [email protected]
Now, to access the internal website from a remote SSH server, just type the address http://localhost:8080
in the browser.
On all Windows versions, you can create the port forwarding rules using the netsh interface portproxy
command.
With SSH tunnels, you can create port forwarding chains. You can enable or disable SSH tunneling in the OpenSSH configuration file (sshd_config) using the following directives:
AllowStreamLocalForwarding yes AllowTcpForwarding remote PermitTunnel no
These configuration directives aren’t available in the current version of OpenSSH for Windows.
Уровень сложностиПростой
Время на прочтение10 мин
Количество просмотров45K
Как гласит википедия, «SSH — сетевой протокол прикладного уровня, позволяющий производить удалённое управление операционной системой и туннелирование TCP-соединений (например, для передачи файлов). Схож по функциональности с протоколами Telnet и rlogin, но, в отличие от них, шифрует весь трафик, включая и передаваемые пароли. SSH допускает выбор различных алгоритмов шифрования. SSH-клиенты и SSH-серверы доступны для большинства сетевых операционных систем». Когда в первый раз знакомишься с ним, то, скорее всего, он представляется как средство для доступа к удалённому серверу. В первую очередь, так оно и есть. Однако его возможности намного шире.
Что может протокол SSH:
-
заменить telnet — обеспечить доступ к терминалу удалённой машины по шифрованному каналу;
-
заменить ftp — обеспечить обмен файлами с удалённой машиной по шифрованному каналу и без необходимости обходить ограничения, которые присущи ftp при работе через NAT и прокси;
-
обеспечить проброс портов — обеспечить доступ к портам с локальной машины или её сети на порты, которые доступы удалённой машине;
-
socks-прокси — обеспечить локальное устройство или целую сеть socks-прокси через удалённую машину;
-
выполнение команд на удалённой машине из скриптов локальной машины.
Самое главное, что SSH обеспечивает безопасность соединения с удалённой машиной с помощью современных алгоритмов шифрования. Вся пересылаемая информация между узлами находится внутри зашифрованного туннеля.
Часть функционала ssh-сервера может быть отключена, при необходимости через файл конфигурации.
Как работает SSH
SSH, работает в режиме точка-многоточка. В этом режиме есть некоторый узел, к которому могут подключаться другие узлы — сервер. Все клиенты подключаются к этому серверу.
В Linux системах обычно используется OpenSSH, где сервер обозначается sshd
, что означает SSH демон (Daemon). Клиент SSH — ssh
. Все необходимые настройки для клиента и сервера, в Linux системах, обычно хранятся в директории /etc/ssh/
. По префиксу имени файла можно догадаться к клиенту или серверу имеет отношение файл настройки. Все настройки имеют глобальный характер, т.е. актуальны для всех пользователей устройства.
Кроме глобальных настроек, каждый из пользователь может хранить свою конфигурацию в домашней директории в папке ~/.ssh/
. Файлы используются как клиентом SSH, так и при подключении к серверу из папки пользователя, который указан при подключении.
Пользовательские Файлы настроек SSH
Как уже было сказано ранее, файлы настроек хранятся по пути ~/.ssh/
.
Файл config
— файл настройки клиента. Позволяет настраивать параметры соединений, чтобы не было необходимости каждый раз указывать опции для каждого конкретного сервера.
Файл authorized_keys
содержит список ключей для доступа к этому пользователю через сервер sshd
на этой машине. Обычно этот файл отсутствует, но если вы хотите использовать при подключении к данной машине под данным пользователем не только имя пользователя и пароль, но и ключ, то этот файл должен быть создан, и содержать публичные необходимые публичные ключи.
Файл known_hosts
содержит список ключей для хостов, к которым ранее уже было произведено подключение. Это один из инструментов безопасности. При первом подключении к серверу вы получаете подпись его ключа доступа, которую в дальнейшем будете использовать для проверки легитимности хоста. При повторном подключении эти данные позволяют проверить, что это именно тот сервер, к которому вы подключались ранее. Если вы при подключении к серверу получаете ошибку, возможно в ваш сеанс подключения желает кто-то вклиниться с целью дешифровки передаваемых данных. Если вы не перестраивали сервер, то это будет для вас знаком, что доверять серверу нельзя.
Файлы id_*
содержат закрытые ключи доступа для текущего устройства. Вместо *
в имени файла присутствует имя используемого алгоритма шифрования. Ключей может быть несколько, для каждого запрошенного алгоритма шифрования. Эти файлы должны храниться в полной секретности. Никому их передавать нельзя. На ключи доступа можно установить пароль, без которого невозможно будет воспользоваться этим ключом. В таком случае даже в случае утечки ключа, воспользоваться им будет невозможно без знания пароля.
Файлы id_*.pub
содержат публичные ключи доступа, которые используются для подключения к другим устройствам. Вместо *
в имени файла присутствует имя используемого алгоритма шифрования, которые предоставляет удалённое устройство при подключении. Ключей может быть несколько, для каждого доступного алгоритма шифрования.
Кроме этого, имена публичных ключей шифрования могут быть любыми. В этом случае при подключении нужно прямо указать какой файл вы будете использовать при подключении к удалённой машине. Сделать это можно через параметры командной строки или через файл конфигурации config
.
Удалённое управление через SSH
Для того, чтобы подключиться к нужной машине, запустите команду ssh
с указанием имени хоста и, при необходимости, имени пользователя. Если пользователь не указан, то будет использовано имя текущего пользователя в системе.
ssh user@host
После этого, при успешном подключении, вам будет предложено ввести пароль пользователя. При вводе правильного пароля вы сможете управлять удалённой машиной.
Копирование файлов на удалённый хост и обратно через SSH
Для копирования файлов через ssh существует свой аналог утилиты cp
— scp
. Работает она аналогично, однако в качестве источника или получателя может быть указан файл или директория на удалённом хосте. Например, чтобы передать файл my_file в домашнюю папку пользователя на удалённом хосте необходимо выполнить команду:
scp my_file user@host:~/
user@host
может быть сокращено до host
, тогда будет использован текущий пользователь.
Socks прокси через SSH
Практически любой ssh сервер можно превратить в socks прокси. Для этого необходимо указать ключ -D
и указать номер порта:
ssh user@host -D 1080
После успешного входа на сервер на локальной машине по адресу 127.0.0.1:1080
будет доступен socks-сервер. Его можно использовать с любыми программами, которые его поддерживают. Кроме номера порта можно указать адрес, который следует использовать для открытия порта. При указании вместо адреса *
, порт будет открыт на всех доступных адресах на хосте.
Перенаправление портов через SSH
SSH позволяет перенаправить трафик как с удалённой машины на локальную, так и локальный порт на удалённую машину.
Для получения доступа к удалённому порту необходимо использовать опцию -L
. Кроме протокола IP, доступ можно получить также и к Unix-сокетам на удалённой машине. Для доступа к порту IP команда имеет следующий формат:
ssh -L [bind_address:]port:host:hostport user@host
IP адрес bind_address
можно не указывать. В таком случае будет открыт порт по адресу 127.0.0.1
. port
должен содержать номер порта. host
— адрес, к которому имеет доступ удалённая машина, hostport
— соответствующий порт. Адрес сервера SSH указывается аналогично другим командам.
Например, если есть необходимость подключиться к PostgreSQL сервер на удалённой машине, то можно выполнить следующую команду:
ssh -L 5433:127.0.0.1:5432 user@host
После подключения к серверу можно использовать порт 127.0.0.1:5433 на локальной машине для доступа к PostgreSQL на удалённой машине.
Для того, чтобы предоставить удалённой машине доступ к порту, который доступен с вашей машины, необходимо использовать опцию -R
:
ssh -R [bind_address:]port:host:hostport user@host
В этом случае bind_address
также не обязателен, а вместе с port
они теперь указывают на адрес и порт на удалённой машине. host
и hostport
указывают на хост и порт, который вам доступен с вашей машины.
Например, если вы хотите, чтобы на удалённой машине могли подключиться к вашему веб-серверу, то выполните команду:
ssh -R 8080:127.0.0.1:80 user@host
В этом случае на удалённой машине по адресу 127.0.0.1:8080
будет доступен веб-сервер в вашей машины.
Обратите внимание, что ssh клиент не может использовать порты ниже 1024, поскольку они являются привилегированными и доступны только пользователю root
.
Выполнение команд на удалённой машине через SSH
SSH позволяет выполнять команды на удалённом сервере. При этом весь их вывод может быть перенаправлен в консколь текущей машины. Например, выполним дамп базы данных PostgreSQL с помощью команды pg_dump gitea -Fc
на удалённой машине.
ssh user@host "pg_dump gitea -Fc" > gitea.pg.dump
Команда создания дампа будет выполнена на удалённой машине, то всё выводимое ей будет доступно локально и может быть перенаправлено, например, в файл gitea.pg.dump
, стандартными методами.
Использование ключей
Самый простой способ аутентификации при соединении — использование пароля. Однако есть более безопасный способ — использование ключей. Для того, чтобы сформировать свою пару ключей можно воспользоваться утилитой ssh-keygen
. По умолчанию она создаёт ключи rsa. Сейчас рекомендуется использовать ключи формата ed25519. Они более компактные и обеспечивают достаточный уровень защищённости. Создайте пару ключей с помощью команды
ssh-keygen -t ed25519
Во время создания ключа будет уточнено куда сохранять пару ключей и какой пароль использовать для доступа к ключу. Можно не указывать пароль, но в таком случае, в случе утечки вашего закрытого ключа, злоумышленники легко смогут им воспользоваться. Конечно, вводить пароль при каждом использовании ключа неудобно и есть соблазн не использовать его. Но эту проблему легко решить с помощью ssh-agent
, о чём будет рассказано далее. Поэтому при создании ключа смело указывайте пароль.
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/user/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_ed25519
Your public key has been saved in /home/user/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:Q8iNlV3kFMGi40OrqOLIn/PPHWKuj/ccom6hs8U1coA user@alpha
The key's randomart image is:
+--[ED25519 256]--+
| .o +*o |
| .. =. oo. |
| E .+ o. .. |
| ..+ |
| . *So |
| ..+ =. |
| .+.= + |
|+ ++.B.= o |
|o+o=B*==.+ |
+----[SHA256]-----+
После этих действий будет создано два файла: один с приватным ключом, другой с открытым (имя файла имеет расширение .pub
). Теперь, чтобы использовать ключ при подключении к удалённым машинам, необходимо скопировать открытый ключ на нужный узел. После этого вы сможете подключаться на него используя ваш приватный ключ. Скопировать ключ можно просто копируя содержимое файла id*.pub
в файл authorized_keys
в папке нужного вам пользователя на удалённой машиной. Кроме этого, свой публичный ключ можно скопировать с помощью команды
ssh-copy-id user@host
Естественно, у вас должен быть доступ на эту машину на момент копирования, например, с помощью пароля. Если вы имеете несколько пар ключей, то вы можете указать какой конкретно ключ необходимо использовать:
ssh-copy-id -i ~/.ssh/id_ed25519 user@host
После запуска команды она попытается загрузить ключ на удалённую машину. Если ваш ключ был успешно загружен, то вы сможете его использовать при новых подключениях. Вход по паролю на удалённую машину теперь можно отключить совсем.
Диагностика ошибок подключения
Если есть проблема с подключением, можно активировать вывод диагностических сообщений:
ssh -v gitea@gitea.example
Это позволит подробнее изучить то, что происходит при подключении и выявить проблему.
Подробнее о файле конфигурации ~/.ssh/config
Файл конфигурации ssh клиента представляет из себя текстовый файл, где перечисляются настройки для различных хостов. Директива Host
указывает, что далее идут настройки для определённого хоста или нескольких хостов. Далее можно указать какое имя хоста использовать для подключения, какой порт использовать, какой файл ключа, а также, например, использовать только аутентификацию по ключу:
Host my_server
Hostname fd12::8
Port 8022
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
В данном случае при выполнении команды ssh my_server
с такими настройками будет произведено подключение к хосту по протоколу IPv6 на адрес fd12::8
и порт 8022. Будет использован ключ ~/.ssh/id_ed25519
. Идентификация по паролю не будет использована.
Можно сделать аналогичные настройки для всех необходимых для вас хостов.
Файл конфигурации лучше скрыть от глаз других пользователей машины установив права доступа 600
и убедиться, что файл принадлежит вашему пользователю:
chmod 600 ~/.ssh/config
chown $USER ~/.ssh/config
Подробная информация о доступных опциях файла конфигурации доступна в man ssh_config
.
ssh-agent
Как уже было сказано ранее, свой закрытый ключ лучше защитить паролем, чтобы в случае его утечки было сложно им воспользоваться. Но, при этом, при каждом новом подключении по ssh необходимо вводить пароль. Решить эту проблему может ssh-agent. Это сервис, который хранит ваши ключи в расшифрованном виде после первого использования. При первом использовании ключа необходимо будет ввести пароль, после чего сервис запомнит ключ и будет в дальнейшем использовать его не требуя от вас пароля.
Чтобы воспользоваться этим сервисом необходимо его предварительно запустить. Сделать это можно автоматически при каждом входе в систему, например, с помощью systemd-юнита. Для этого создайте файл ~/.config/systemd/user/ssh-agent.service
со следующим содержимым:
[Unit]
Description=SSH key agent
[Service]
Type=simple
Environment=SSH_AUTH_SOCK=%t/ssh-agent.socket
ExecStart=/usr/bin/ssh-agent -D -a $SSH_AUTH_SOCK
[Install]
WantedBy=default.target
Далее необходимо создать или добавить в файл ~/.config/environment.d/ssh_auth_socket.conf
:
SSH_AUTH_SOCK="${XDG_RUNTIME_DIR}/ssh-agent.socket"
После этого можно активировать сервис и запустить его:
systemctl --user enable --now ssh-agent
Теперь можно вручную добавлять необходимые ключи с помощью ssh-add
. Однако это не очень удобно. Чтобы ключи автоматически добавлялись в агент, необходимо в файле настройки клиента ~/.ssh/config
добавить следующую строчку:
AddKeysToAgent yes
После этого любой используемый ключ будет автоматически добавлен в агента.
Кроме этого, агент умеет пробрасывать ключ на удалённые машины, если необходимо соединиться с другими машинами. Разрешить это можно с помощью добавления ForwardAgent yes
в файле настроек ~/.ssh/config
:
Host my_server
ForwardAgent yes
Настройка сервера SSH
Сервер SSH хранит свои настройки глобально в директории /etc/ssh/
. Однако при подключениях клиентов используются ключи, которые хранятся в домашней директории пользователя, от имени которого происходит подключение.
Все дальнейшие настройки необходимо выполнить в файле /etc/ssh/sshd_config
. Но в современных дистрибутивах этот файл рекомендуется оставлять без изменений, а необходимые настройки выполнить с помощь файлов в директории /etc/ssh/sshd_config.d/
с расширением .conf
. Например, 10-my.conf
.
Настройка по умолчанию обычно достаточно безопасна, но, скорее всего, включен доступ по паролю. Также может быть разрешён удалённый вход для пользователя root
. После настроек доступа по ключу, лучше отключить возможность входа по паролю.
Явно укажем, что аутентификацию нужно делать по ключам, отключим аутентификацию по паролю, запретим вход пользователю root
:
PubkeyAuthentication yes
PasswordAuthentication no
PermitRootLogin no
Кроме этого, нужно установить или убедиться, что установлено в вашей системе:
KbdInteractiveAuthentication no
Этот параметр разрешает интерактивный вход в систему с помощью клавиатуры. Кроме простого запроса пароля, ваш сервер может использовать дополнительные способы аутентификации реализуя двухфакторную аутентификацию. В современных дистрибутивах Ubuntu и Fedora он установлен в no
по умолчанию. Ранее этот параметр назвался ChallengeResponseAuthentication
, но это имя признано устаревшим и может быть удалено в новых версиях OpenSSH.
Если вы не хотите отключать вход по паролю, то стоит запретить использование пустого пароля:
PermitEmptyPasswords no
Заключение
SSH является достаточно мощным и безопасным средством управления удалёнными системами. Однако широкие возможности требуют внимательной настройки. Если вы даёте доступ по ssh другим пользователям, то изучите как отключить лишний функционал ssh-сервера и ограничить пользователей только функционалом, им необходимым. В конфигурации по умолчанию подключенные пользователи могут беспрепятственно пользоваться всеми ресурсами вашей сети!
Если эта публикация вас вдохновила и вы хотите поддержать автора — не стесняйтесь нажать на кнопку