Введение | |
Схема подключения | |
Шаги | |
Настройка SSH сервера | |
Настройка SSH клиента | |
Проброс портов на роутере | |
Открытие сессии клиентом | |
Настройка RDP на сервере | |
Подключение по RDP с клиента | |
Проброс портов в Putty — Putty Туннель | |
Похожие статьи |
Введение
Цель – безопасно подключиться к серверу за роутером из внешней сети.
Убедитесь, что вы понимаете как создать простейший
SSH туннель, например, такой как
здесь
OLDI
Создание туннеля это довольно трудоёмкая задача, состоящая условно из шести частей.
-
Настройка SSH сервера
-
Настройка SSH клиента
-
Проброс портов на роутере
-
Открытие сессии клиентом
-
Настройка RDP на сервере
-
Подключение по RDP с клиента
Вам понадобятся роутер, putty и freesshd.
Роутер должен поддерживать
Port Forwarding
приобрести онлайн можно в магазинах:
-
Xiaomi
-
OLDI
-
https://fas.st/QaMjsd
1. Настройка SSH сервера
1.01 Установить и запустить freeSSHd.
Создайте ключ, чтобы сервер не ругался, потом поменяем его на новый ключ.
1.02) Здесь есть нюансы, в данный момент я предпочитаю выбирать «Нет»
1.03) Значок freeSSHd появляется в трее, выберите Settings
1.04) Само собой, нужно выдать разрешение бранмауэру.
1.05) В разделе Authentication, разрешить только доступ по ключам
1.06) Зайти в меню Users
1.07) Добавить нового пользователя
1.08) Вид после добавления
1.09) Запустить на сервере PuTTYgen
1.10) Сгенерировать пару ключей
1.11) Публичный ключ, который останется лежать на сервере, нужно скопировать из верхнего окна
1.12) Вставить публичный ключ в текстовый редактор, проверить чтобы он был в одну строку и начинался со слова ssh-rsa
1.13) Сохранить ключ как текстовый файл, имя должно быть такое же как и пользователя, который был ранее создан (в нашем случае – sini)
1.14) Удалить расширение
1.15) Согласиться
1.16) Показать freeSSHd путь до ключа
1.17) Сохранить приватный ключ, который затем нужно будет перенести на клиентский компьютер
В результате предыдущих манипуляций мы имеем запущенный SSH сервер и пару ключей.
2. Настройка SSH на компьютере клиенте
2.18) На клиентском компьютере нужно положить приватный ключ в заранее созданную для него папку
2.19) На клиенте запускаем PuTTY и создаем подключение с именем sini.
В поле Host Name (or IP address) указываем нужный внешний ip сервера, т.к. он за роутером, это будет ip роутера.
Меняем порт на 443 или какой-нибудь другой, только осмысленно.
2.20) В поле Auth указываем путь до приватного ключа
2.21) Выбираем ключ
2.22) Создаём туннель
Порт
3389 это стандартный порт для RDP. Порт 3391 мы будем использовать на клиенте как
«вход» в туннель.
Изображение ниже показывает, что мы поставили в соответствие
локальному порту 3391 порт 3389 на IP 192.168.0.101
2.23) Сохраняем сессию. В поле Нost Name пишем IP сервера.
На этом этапе у нас подготовлено SSH соединение, которое сервер слушает на 443 порту.
На всякий случай уточняю, что в этом примере IP сервера в локальной сети 192.168.0.101
Внешний IP сервера это IP роутера. На картинке он замазан, в Вашем случае это будет Ваш
внешний
IP, т.е. что-то похожее на 78.47.141.187
OLDI
Проброс портов на роутере
3.20) Задаём на роутере привязку
MAC
адреса сервера к какому-нибудь ip адресу
3.21) Объясняем роутеру, что когда идёт запрос по 443 порту нужно передать его именно серверу
(делаем Port Forwarding – Проброс портов)
Putty на клиенте
4.22) Открываем сессию
Настройка RDP — На сервере
5.23) Создаем пользователя sini
5.24) Обязательно создаем пароль
5.25) Разрешаем доступ по RDP
5.27) Добавляем Синего в список пользователей, которым разрешён доступ по RDP
Настройка RDP — На клиенте
6.28) Запускаем на клиенте mstsc (сперва нужно открыть SSH туннель,
если он был открыт нужно проверить не закончилась ли сессия.
Чтобы не помешать никому работать — можно проверить подключён ли кто-то
к компьютеру или нет. Сделать это можно с помощью
PSTools
инструкция находится
здесь
6.29) Подключаемся к localhost:3391
Вводим пароль
6.30) Соглашаемся
Заметка для OpenBSD
Имеем компьютер в СПб (ПК_СПб), сервер на OpenBSD в МСК (СРВ_МСК) и локальный компьютер,
подключенный к серверу в МСК (ПК_МСК). Цель — подлючиться с ПК_СПб к ПК_МСК
через ssh туннель по rdp с помощью putty из-под Windows.
Делать нужно так же как описано по ссылке, но на первой картинке отметить
Local ports accept connections from other hosts
Source port можно выбрать любым из свободных, напрмер 6789. В поле Destination указать
Локальный_ip_ПК_МСК:3389
При подключении по RDP (последняя картинка) можно указать
127.0.0.2:6789
IT | |
SSH | |
PuTTY | |
Telnet | |
PSTools | |
FreeSSHD | |
Компьютерные сети | |
Как создать туннель | |
Как сделать проброс портов |
Have you ever been in a situation where you needed to perform remote administration on a Windows Server, and the RDP port 3389 is blocked on a firewall? Did you know you can tunnel RDP over SSH with PuTTY? This particularly comes in handy when there is no VPN available to the remote network… Here is how to tunnel Remote Desktop (RDP) over SSH with PuTTY.
Proxy connections with SSH
SSH can proxy connections both forward and backwards. It creates a secure connection between a local computer and a remote machine through which services can be relayed. Because the connection is encrypted, SSH tunneling is useful for transmitting information that uses an unencrypted protocol, such as IMAP, VNC, or IRC. And RDP
SSH can proxy connections both forward and backwards, by opening a port on either the local machine running the SSH client, or the remote SSH server. If you have privileges to do so of course.
For example, if you want to connect to a remote host on RDP port 3389, but you don’t have direct access to reach that machine because of firewall or network restrictions, the SSH client can listen on a local port and pretend that it is the remote machine. All connections to that port will be sent through the SSH server to the remote host.
Reconfigure PuTTY for Remote Desktop Protocol (RDP) tunneling through ssh
To tunnel Remote Desktop Protocol over ssh using PuTTY, all you need is an account on the premises. For example a firewall or Linux server with ssh access, and PuTTY on your Windows desktop. PuTTY is a nifty ssh client for Windows that you can download here.
Once you are connected to your remote network with ssh/PuTTY, you need to reconfigure the connection to support SSH-tunneling. In the PuTTY Reconfiguration screen, go to Connection → SSH → Tunnels. This is where we can set up an SSH tunnel for Remote Desktop.
Under Source port, add your local IP address and port. Because the RDP 6+ client in Windows has issues with the loopback to TCP Port 3390, you need to use a different port. I use TCP port 3388 on IP address 127.0.0.2, and my remote internal IP address and RDP port 3389 as Destination (192.168.48.211:3389). See the image:
After clicking Apply, the SSH-tunnel for remote desktop is active, and you can connect the Remote Desktop Connection to 127.0.0.2:3388:
For Windows, PuTTY is the de-facto standard SSH client.
Tunnel RDP using OpenSSH and PowerShell in Windows 10
If you have the OpenSSH client installed in Windows 11/10, then you can use a command similar to Linux’ ssh tunnel:
Code language: CSS (css)
ssh -N -L 13389:[Windows Server RDP address]:3389 [address ssh server] -l [ssh username]
To ease the usage, I wrapped in a PowerShell script, that connects to my on-premise stepping-stone host with ssh:
Code language: JavaScript (javascript)
$remHost = (Read-host -Prompt ("RDP host: ")) Write-Output "Setting up an SSH RDP tunnel with ${remHost}" Start-Process ssh -ArgumentList "-N -L 13389:${remHost}:3389 -l [ssh username] steppingstone-host.example" -Verb open [void](Read-Host 'Press Enter to continue...') &mstsc /V:localhost:13389 /w:800 /h:600 /prompt
use this PowerShell one-liner to verify whether OpenSSH client is installed on your Windows 10 system. It should print Installed.
Code language: JavaScript (javascript)
(Get-WindowsCapability -Online | ? Name -like 'OpenSSH.Client*').State
You find more ssh tips in my post Windows 11/10 and WSL 2 DevOps environment.
How to tunnel Windows Remote Desktop (RDP) through ssh on Linux
When you are in a situation where you are on a Linux work station and need to tunnel RDP through ssh in Linux, you can use the following ssh port forwarding, or tunnel (assuming you have an on-premise Linux server to SSH into to set up the port forward):
ssh port forwarding / tunnel set-up for RDP
ssh -N -L 13389:[Windows Server RDP address]:3389 [address ssh server] -l [ssh username]
Code language: CSS (css)
Now you can connect your RDP client to 127.0.0.1:13389
as if it were the remote server.
Some Remote Desktop clients for Linux are:
- KRDC – KRDC is a client application that allows you to view or even control the desktop session on another machine that is running a compatible server. VNC and RDP is supported
- Remmina – A feature rich Remote Desktop Application for Linux and other Unixes
- rdesktop – rdesktop is an open source UNIX client for connecting to Windows Remote Desktop Services, capably of natively speaking Remote Desktop Protocol (RDP) in order to present the user’s Windows desktop
- xfreerdp – FreeRDP is a free implementation of the Remote Desktop Protocol (RDP), released under the Apache license
Or do you need to change port forwarding options in an existing ssh connection?
Tunnel ssh using sshuttle
Another great option is to tunnel ssh using sshuttle, on GNU/Linux. From its manpage:
sshuttle allows you to create a VPN connection from your machine to any remote server that you can connect to via ssh, as long as that server has python 2.3 or higher.
To work, you must have root access on the local machine, but you can have a normal account on the server.It’s valid to run sshuttle more than once simultaneously on a single client machine, connecting to a different server every time, so you can be on more than one VPN at once.
If run on a router, sshuttle can forward traffic for your entire subnet to the VPN.
If you have an on-premise host / hop / stepping stone, you can use the following sshuttle example:
Code language: CSS (css)
sshuttle -r username@steppingstone-host.example 192.168.0.0/16
This’ll easily create a VPN (Virtual Private Network) connection from your machine to any remote server that you can connect to via ssh. Unfortunately you cannot use sshuttle from Windows Subsystem for Linux (WSL) in Windows 10, yet: Command: ” iptable -L ” is not working.
More OpenSSH in Windows Server and Windows 11 / Windows 10, the series
Here on Sysadmins of the North are more posts in a series of posts about OpenSSH in Windows. Whether it’s Windows Server or Windows 11 / 10. You may find these posts interesting:
- Tunnel RDP through SSH & PuTTY
- How to share OpenSSH keys with WSL in Windows 10
- Manually install OpenSSH in Windows Server
- Retrieve SSH public key from Active Directory for SSH authentication
- Windows 11/10 and WSL 2 DevOps environment
- YubiKey support in OpenSSH for Windows 11 and Windows 10
- Connect to a KVM host through an ssh tunnel and arbitrary port in Windows 11 and WSL 2
I hope you like it, let me know.
Вы можете использовать встроенный 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.
You need to connect to the server via SSH (for servers based on Linux) or via RDP (for servers based on Windows) to manage it remotely (for example, from your local computer).
Connection via SSH
SSH protocol is used to connect to the servers running Linux. SSH protocol allows you to securely manage the server over the network.
You can connect to the server:
- using login and password from the Control panel – in this case, each time you connect to the server, you need to enter your password;
- using a pair of generated SSH keys – in this case, you do not need to enter your password, the user is identified at the first connection. A key pair is used: the public key is hosted on the server, and the private key is stored on the user’s PC. Please note that you can connect to the server via SSH only from the computer where the private SSH key is stored.
The data specified on the Operating system tab of the server page in the Control panel are used to connect to the server:
- server’s public IP address (IP field);
root
login and password for accessing the system (Username and Password fields).
Connection via SSH on Linux / macOS
To connect to the server via SSH, run the following command in the terminal:
ssh root@<server IP>
Where server IP
is server’s public IP address.
The system will request a password from the server, you need to enter it. If you have previously created a key pair, then you do not need to specify the password to connect to the server.
Connection via SSH on Windows
In Windows 10, the connection is the same as in Linux and macOS, but through the command line (cmd.exe).
In earlier versions of Windows, the server is connected using PuTTY:
- Launch PuTTY.
- Go to the Session tab. Enter the public IP address of the server in the Host Name field, enter 22 in the Port field.
- Specify the SSH connection type in the Connection type field.
- If you connect using the previously generated keys, go to the SSH — Auth tab, click Browse and select the file with a private key.
- Click Open to connect.
- Confirm the connection. In the opened console, specify the
root
login and password to log into the server. If you have previously created a key pair, then you do not need to specify a password to connect to the server.
Creating a Key Pair on Linux / macOS
To create a key pair:
- Open the terminal and run the command:
ssh-keygen -t rsa
- The following dialog will be displayed on the console:
Enter file in which to save the key (/home/user/.ssh/id_rsa):
Specify the name of the file where the keys will be saved, or use the default name and path `/.ssh/id_rsa`.
- The system will offer you to enter a passphrase for advanced protection of the SSH connection:
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
You can skip this step.
- After that, a private (
~/.ssh/id_rsa
) and public (~/.ssh/id_rsa.pub
) key will be created. The following message will be displayed on the console:
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]-----+
- To display the public key on the console, run the command:
cat ~/.ssh/id_rsa.pub
_Please note that `~/.ssh/id_rsa.pub` is the path to the file where the public key is stored. If you changed the path in step 2, specify it._
- Add the public key in the Selectel Сontrol panel. Click Change OS configuration on the Operating system tab of the server page and enter the key in the SSH public field.
After creating the keys, you can connect to the server without a password.
Creating a Key Pair on Windows
In Windows 10, you can create a key pair in the same way as in Linux and macOS, but through the command line (cmd.exe).
In earlier versions of Windows, the keys are generated using PuTTY:
- Install PuTTY and launch the PuTTYgen app.
- From the Type of key to generate menu, select the RSA key type and click Generate. Move the cursor around the screen until the keys are generated.
- After the key pair has been created, the public key will be displayed. Click Save public key and save it in a text file, for example, in a new file
id_rsa.pub
. - Enter a passphrase for additional security in the Key passphrase field. You can skip this step.
- Click Save private key to save the private key.
- Add the public key in the Selectel Сontrol panel. Click Change OS configuration on the Operating system tab of the server page and enter the key in the SSH public field.
After creating the keys, you can connect to the server without a password.
Connection via RDP
RDP stands for Remote Desktop Protocol. RDP is used to remotely connect to servers running Microsoft Windows.
The remote desktop connection feature is available in Windows by default. You do not need to create specific keys.
The following data is used to connect to the server:
- public server IP address;
- login and password for accessing the system.
Connection via RDP on Windows
To connect to a Windows server via RDP:
- In the search box (Start menu), type Connect to remote desktop.
- Enter the public IP address of the server in the Computer field in the opened window.
- Click Connect.
- Enter your login and password.
- Press OK.
Connection via RDP on Linux
To connect via RDP through the terminal, run the command:
rdesktop <server IP> -u <user> -p <password>
Where:
server IP
is the public IP address of your server;user
andpassword
are the login and password.
Connection via RDP on macOS
To connect to a server:
- Install and run Microsoft Remote Desktop.
- Click +. In the PC name field, enter the public IP address, in the Username and Password fields, enter your username and password.
- Click Save and save your changes.
- To connect to a remote server, double-click on the created connection in the list.