Вы можете использовать встроенный 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
и
[email protected]_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:rdplocalhost-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-туннели, какие полезные для системного администратора функции они имеют и почему важно помнить о безопасности интернет-соединения.
Любые важные данные следует передавать по защищенным каналам информации. Но это не всегда легко реализовать, особенно когда пользователю нужно совершить срочные операции на удаленном сервере, а подключиться к интернету можно только через публичный незащищенный Wi-Fi. В таком случае используют SSH-туннелирование, устанавливающее защищенный канал связи между локальным рабочим узлом и удаленным сервером. С помощью него можно не только передавать или редактировать файлы дистанционно, но и запускать GUI-приложения, делать бэкап, передавать пароли и даже организовывать потоковое вещание.
Создание, условия применения и польза для сисадминов
Ситуация, когда требуется срочный доступ к домашнему компьютеру или внутренней корпоративной сети, знакома каждому. К сожалению, качество и безопасность общественных сетей часто оставляют желать лучшего. Важную информацию по таким сетям лучше не передавать. Кроме того, для организации доступа часто требуется внешнее ПО (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 устанавливается зашифрованное соединение с сервером:
Подробнее о создании SSH-туннелей можно прочитать в Базе знаний.
Еще один вариант, как можно использовать этот тип соединения, — создание канала связи по протоколу 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-туннель.
Перейти к содержанию
На чтение 3 мин Опубликовано 15.01.2019
Системы Windows претерпели много улучшений, поэтому вам не нужно устанавливать инструмент, но вы можете использовать доступные средства.
В этом уроке мы узнаем, как подключить Linux-машину из Windows с помощью встроенных инструментов.
Содержание
- Что нужно знать о SSH
- 2) Соединение SSh с Windows Powershell и командной строкой
- а) SSh из Windows Powershell
- б) SSH из командной строкой
Что нужно знать о SSH
Secure Shell – это защищенный и зашифрованный протокол соединения, позволяющий осуществлять удаленный и безопасный вход по незащищенным соединениям.
Соединение работает в режиме клиент-сервер, поэтому соединение устанавливается клиентом SSH, подключающимся к серверу SSH.
SSH предлагает несколько вариантов аутентификации пользователя, и наиболее распространенными являются пароли и методы аутентификации с открытым ключом:
- Пароль: SSH работает как обычный процесс для локального компьютера, что означает, что вам нужно иметь имя пользователя и пароль существующей учетной записи на сервере.
- Открытый ключ: принцип состоит в том, чтобы иметь пару открытый ключ криптографического ключа и закрытый ключ, где открытый ключ сконфигурирован на сервере, чтобы разрешить доступ и предоставить любому, у кого есть копия закрытого ключа, доступ к серверу.
1) Установить функцию OpenSSH в Windows 10 клиенте
Компьютеры с Windows теперь позволяют вам использовать собственные инструменты для установки SSH-соединения, но сначала вам нужно убедиться, что установлена функция Openssh Windows Client.
Обычно он не устанавливается по умолчанию, поэтому сначала вам нужно будет это сделать
Зайдите в Windows -> Settings -> Apps -> Manage optional feature
Нажмите Add a feature
Выберите OpenSSH Client и установите
2) Соединение SSh с Windows Powershell и командной строкой
Теперь вы можете использовать командную строку или Windows PowerShell для доступа к вашему Linux-серверу через ssh.
а) SSh из Windows Powershell
Собственный инструмент Windows Powershell позволяет удаленно подключаться к серверу через ssh.
Вы просто должны открыть его с Windows + R, а затем нажмите клавишу A
Теперь введите команду ssh для подключения к удаленному серверу Linux: ssh root@hostname-or-ip-address
б) SSH из командной строкой
Чтобы удаленно получить доступ к вашему серверу с помощью команды, вам просто нужно запустить его с помощью комбинации клавиш Windows + r и затем ввести cmd
Теперь в командной строке вы можете использовать команду ssh, как в случае с powershell
Теперь вы знаете, как можно подключиться к удаленному серверу Linux с помощью SSH с помощью встроенных в Windows инструментов.
Вы также можете использовать инструмент putty, но теперь проще и удобнее использовать инструменты, предлагаемые по умолчанию.
Пожалуйста, не спамьте и никого не оскорбляйте.
Это поле для комментариев, а не спамбокс.
Рекламные ссылки не индексируются!
В последних билдах Windows 10 появился встроенный SSH сервер и клиент на базе OpenSSH. Это значит, что теперь вы можете удаленно подключаться к компьютеру Windows 10/11 (Windows Server 2019/2022) с помощью любого SSH клиента, как к Linux. В этой статье мы покажем, как настроить OpenSSH в Windows 10 и подключится к нему с помощью putty или любого другого SSH клиента.
Убедитесь, что ваша версия Windows 10 1809 или выше. Проще всего это сделать, выполнив команду:
winver
Совет. Если у вас более старая версия Windows 10 вы можете обновить ее через Windows Update или с помощью ISO образа с более новой версией Windows 10 (можно создать его с помощью Media Creation Tool). Если вы не хотите обновлять Windows 10, вы можете вручную установить порт OpenSSH для Windows с GitHub — Win32-OpenSSH (https://github.com/PowerShell/Win32-OpenSSH).
Вы можете включить OpenSSH сервера в Windows 10 через панель Параметры:
- Перейдите в Settings -> Apps -> Optional features;
- Нажмите Add a feature, выберите OpenSSH Server и нажмите Install;
Также вы можете установить sshd сервер в Windows с помощью PowerShell:
Add-WindowsCapability -Online -Name OpenSSH.Server*
Или с помощью DISM:
dism /Online /Add-Capability /CapabilityName:OpenSSH.Server~~~~0.0.1.0
Если вы хотите убедитесь, что OpenSSH сервер установлен, выполните следующую команду:
Get-WindowsCapability -Online | ? Name -like 'OpenSSH.Server*'
Name : OpenSSH.Server~~~~0.0.1.0 State : Installed
Проверьте статус служб ssh-agent и sshd с помощью командлета Get-Service:
Get-Service -Name *ssh*
Как вы видите, обе службы находятся в состоянии Stopped и не добавлены в автозагрузку. Чтобы запустить службы и настроить для них автозапуск, выполните команды:
Start-Service sshd
Set-Service -Name sshd -StartupType 'Automatic'
Start-Service ‘ssh-agent’
Set-Service -Name ‘ssh-agent’ -StartupType 'Automatic'
Также нужно разрешить входящие подключения на порт TCP 22 в Windows Defender Firewall:
netsh advfirewall firewall add rule name="SSHD service" dir=in action=allow protocol=TCP localport=22
Теперь вы можете подключиться к Windows 10 с помощью любого SSH клиента. Для подключения из Linux используете команду:
ssh -p 22 admin@192.168.1.90
где, admin – имя локального пользователя Windows, под которым вы хотите подключиться
192.168.1.90 – ip адрес вашего компьютера с Windows 10
После этого откроется окно командной строки Windows.
Совет. Чтобы вместо оболочки cmd.exe при подключении к Windows 10 через SSH запускалась консоль PoweShell, нужно выполнить команду:
New-ItemProperty -Path "HKLM:SOFTWAREOpenSSH" -Name DefaultShell -Value "C:WindowsSystem32WindowsPowerShellv1.0powershell.exe" -PropertyType String –Force
Так вы измените оболочку, которая стартует через OpenSSH. Теперь при подключении к Windows по SSH у вас будет сразу открываться консоль PowerShell вместо командной строки cmd.exe.
Если вы хотите использовать key-based ssh authentification вместо парольной аутентификации, нужно на вашем клиенте сгенерировать ключ с помощью ssh-keygen.exe.
Затем содержимое файла id_rsa.pub нужно скопировать в файл c:usersadmin.sshauthorized_keys в Windows 10.
После этого вы сможете подключаться с вашего Linux клиента к Windows 10 без пароля. Используйте команду:
ssh -l admin@192.168.1.90
Вы можете настроить различные параметры OpenSSH сервера в Windows с помощью конфигурационного файла %programdata%sshsshd_config
Например, вы можете отключить аутентификацию по паролю и разрешить вход только по ключу:
PubkeyAuthentication yes PasswordAuthentication no
Как включить и использовать SSH-команды Windows 10
Microsoft объявила о том, что в 2015 году к Windows будет подключен клиент OpenSSH. Они, наконец, сделали это, и внедрили клиент SSH в обновлении Windows 10 Fall Creators. Теперь Вы можете подключиться к серверу Secure Shell из Windows без установки PuTTY или любого другого стороннего программного обеспечения.
Это все еще бета-функция, поэтому Вам может быть лучше пользоваться PuTTY, пока она не станет стабильной. Согласно отслеживанию ошибок проекта на GitHub , интегрированный клиент SSH поддерживает только ключи ed25519.
Как установить клиент SSH для Windows 10
Клиент SSH входит в состав Windows 10, но это «дополнительная функция», которая по умолчанию не установлена. Чтобы установить его, откройте «Параметры» > «Приложения» и нажмите «Управление дополнительными компонентами» в разделе «Приложения и возможности».
Нажмите «Добавить компонент» в верхней части списка установленных функций. Если у Вас уже установлен клиент SSH, он появится в списке.
Прокрутите страницу вниз, нажмите кнопку «OpenSSH Client (Beta)» и нажмите «Установить».
Windows 10 также предлагает сервер OpenSSH, который Вы можете установить, если хотите запустить SSH-сервер на своем ПК. Вы должны установить это только в том случае, если Вы действительно хотите запустить сервер на своем ПК, а не просто подключиться к серверу, работающему в другой системе.
Как использовать SSH-клиент в Windows 10
Теперь Вы можете использовать SSH-клиент, запустив команду ssh . Это работает либо в окне PowerShell, либо в окне командной строки, поэтому используйте то, что Вам нравится.
Чтобы запустить Windows PowerShell откройте поиск и введите «Windows PowerShell» и нажмите на результат поиска.
Чтобы просмотреть синтаксис команды ssh, просто запустите ее:
1
ssh
Если Вы видите сообщение об ошибке, сообщающее, что команда не найдена, Вам нужно будет выйти и снова войти в систему. Перезагрузка компьютера также будет работать. Это не обязательно, но это бета-функция.
Читайте также Следует ли отключать службы Windows для ускорения работы ПК?
Эта команда работает так же, как подключение к SSH-серверу с помощью команды ssh в других операционных системах, таких как macOS или Linux. Его синтаксис или параметры командной строки одинаковы.
Например, чтобы подключиться к SSH-серверу на ssh.example.com с именем пользователя «user», Вы должны запустить:
ssh user@ssh.example.com -p 7777
Как и в случае с другими клиентами SSH, Вам будет предложено принять ключ хоста при первом подключении. Затем Вы получите среду командной строки, которую Вы можете использовать для запуска команд в удаленной системе.
Windows 10
ssh
NOTE: If you’re not yet using Windows 10 Fall Creators Update, please follow this article instead.
The recent OS X High Sierra iamroot vulnerability reminded me just how many people don’t secure their remote desktop connections. While Windows Remote Desktop is more secure than VNC, neither RDP, ADP nor VNC should be directly exposed to the Internet.
Securing RDP
My favorite way to secure RDP is RD Gateway which uses SSL for encryption.
But another way to secure remote connections is SSH tunneling. SSH Tunneling is not as complex as it sounds; setup is basically this:
- Setup an SSH Server, be it on Windows, OS X or Linux
- Setup port forwarding on your router to that SSH port
- Setup your SSH client to forward a local port (12345) to a remote port (sql2016:3389)
- Connect Remote Desktop Client to localhost:12345 which connects to sql2016
In order to introduce the concept, we’ll set this up using Windows which now includes OpenSSH! Once you’re comfortable with the concept, you’re free to branch out to use other versions of OpenSSH Server, like the ones that come with OS X or Linux.
Install OpenSSH on Windows 10 Fall Creators Update
How cool, OpenSSH Server and Client is now built-in to Windows 10 Fall Creators Update! So let’s install them. Hit Start then type Optional
Now install both the Server and the Client
Once you click Install, nothing will really happen. Click the arrow in the upper left hand corner and it’ll take you back to the previous page where you can see the features being installed.
Once the Server and Client have finished installing, you must reboot.
Configure OpenSSH
Gotta say I’m super thankful for Chris K’s blog post «Enabling the hidden OpenSSH server in Windows 10 Fall Creators Update (1709) — and why it’s great!», otherwise this would have taken me far longer to figure out.
So next, Run PowerShell As Administrator, then generate a key.
cd C:windowssystem32OpenSSH ssh-keygen -A
Now, we’ve got to tighten permissions and start the service. Note that if you try to skip this step, the SSH Server will fail to start with «The sshd service terminated unexpectedly.»
$filename = «$env:windirSystem32OpenSSHssh_host_ed25519_key»
$permission = «NT Servicesshd», «Read», «Allow»
$account = New-Object System.Security.Principal.NTAccount(«NT Service», «sshd»)
$accessRule = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList $permission
$acl = Get-Acl -Path $filename
foreach ($access in $acl.access) {
$null = $acl.RemoveAccessRule($access)
}
$null = $acl.SetOwner($account)
$null = $acl.AddAccessRule($accessRule)
$null = Set-Acl -Path $filename -AclObject $acl
Get-Service *ssh* | Start-Service
If you encounter issues and need to troubleshoot, Event Viewer won’t be of much help. Try C:windowssystem32OpenSSHLogs instead.
Security
There doesn’t seem to be a lot of documentation on the web on this specific implementation of OpenSSH Server, unfortunately. There is an sshd_config in the OpenSSH directory but I couldn’t figure out how to edit it (kept getting access denied).
That being said, I didn’t make my usual changes to the config file and, since it’s all commented it, I don’t even know what configuration it’s running with, so I’m trusting Microsoft on this for now.
Set up port forwarding on your router
An in-depth tutorial on how to do this is out of scope for this article. Note that whatever you do, don’t use the default SSH port, meaning don’t forward external 22 to internal 22.
Bots bang on port 22 all day, every day. This can fill up your logs and maybe even break a shitty password but hopefully you’re using a solid password.
Configuring OpenSSH client
Usually, I do this part with PuTTY but here, we’ll use the newly available OpenSSH Client.
Now let’s say your external IP is 24.0.175.222 (my first broadband IP back in ’97), you’ve forwarded port 22222 to your Windows 10 port 22 and you’d like to connect to domain computer sql2016’s RDP port (3389).
ssh -f [email protected] -p 22222 -L 12345:sql2016:3389 -N
Let’s break this down (thanks to Frank Wiles for the simplified tutorial).
- -f sends the ssh command to the background so that you don’t have to keep PS open
- «chrissy» is a local Windows account on the Windows 10 workstation
- 24.0.175.222 is the public IP
- 22222 is the public port you’ve published SSH to
- -L is local port, so localhost:12345 will be forwarded sql2016:3389
- -N instructs OpenSSH to not execute a command on the remote system
Once you’ve made a successful connection, fire up Remote Desktop Connection!
Remote Desktop Connection
Now for your RDC/mstsc, use localhost:12345 as the hostname. If you recall, this will forward the connection to sql2016:3389.
Next, the hostname will be mismatched, of course. So accept it.
And voilà! MAGIC!
Now imagine all of the possibilities of encrypting insecure protocols! You can even jump to an OSX VNC server from here. And it’s nice and secure that you just have to open one (encrypted) port to securely gain access to your network.
In conclusion
If you’ve been exposing insecure protocols to the net, please consider wrapping them in the loving arms of SSH 💞👍