Настройка туннеля SSH (переадресация портов) в Windows

Вы можете использовать встроенный сервер OpenSSH в Windows для перенаправления портов через SSH-туннель (SSH tunneling). Переадресация портов в SSH позволяет туннелировать (перенаправлять) порты приложений с вашего локального компьютера на удаленный сервер и наоборот. Переадресация портов через SSH-туннель широко используется в средах Linux/Unix, а теперь вы можете воспользоваться этой функцией и в Windows. В этом примере мы покажем, как туннелировать трафик RDP-соединения через OpenSSH на хосте Windows Server.

Что такое SSH-туннелирование?

SSH-туннель обеспечивает безопасное, зашифрованное TCP-соединение между локальным хостом и удаленным SSH-сервером. SSH Port Forwarding позволяет туннелировать соединение с локального порта на локальной машине на любой TCP-порт удаленного сервера (или наоборот) по SSH.

Переадресация портов в туннелях SSH используется для:

  • Обхода брандмауэров;
  • Открытие черных ходов в частные сети;
  • Замена сценариев VPN для безопасного удаленного соединения;
  • Защита трафика устаревших приложений (протоколов), передающих данные открытым текстом (без шифрования).
В туннель SSH можно направлять только трафик/порт TCP (протоколы UDP и ICMP не поддерживаются).

SSH-туннелирование в основном используется в сценариях, когда вам нужно подключиться к удаленному компьютеру за брандмауэром. Например, у вас есть Windows Server, на котором открыт только порт SSH (TCP 22). Все остальные порты заблокированы аппаратным брандмауэром или Windows Defender Firewall. Ваша задача — подключиться к Windows Server с помощью клиента RDP. Это кажется невыполнимой задачей, поскольку порт 3389 Remote Desktop заблокирован брандмауэром. Однако вы можете получить доступ к любым портам удаленного узла через SSH-туннель.

Вот типичные сценарии использования SSH-туннеля:

  • Локальная переадресация TCP это локальная переадресация портов на удаленный сервер;
  • Удаленная переадресация TCP это удаленная переадресация портов на локальный компьютер;
  • Двойной SSH-туннель — позволяет подключать компьютеры без выделенных публичных IP-адресов или за NAT/брандмауэром через SSH-сервер (если серверное решение OpenVPN неприменимо).

Защита RDP с помощью туннеля SSH (локальная переадресация TCP)

В этом режиме вы создаете локальный TCP-порт на своем компьютере. Все соединения с этим портом будут перенаправляться на указанный порт удаленного сервера через SSH-туннель. В этом примере мы создадим локальный порт 8888, и соединение с ним будет перенаправлено на порт RDP 3389 на удаленном хосте Windows. Общая схема подключения выглядит следующим образом:

туннель ssh в windows 10windows 10 ssh туннель

Для проброса портов нам понадобится SSH-клиент. Вы можете использовать сторонний клиент (например, Putty), но я буду использовать встроенный SSH-клиент в Windows. Выполните следующую команду в консоли PowerShell, чтобы установить клиент OpenSSH на Windows 10/11 или Windows Server 2022/2019:

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_IP:DESTINATION_PORT и USER@DESTINATION_IP (имя пользователя и адрес удаленного SSH-сервера)

Чтобы SSH-туннель работал в фоновом режиме, добавьте параметр -f параметр.

windows 10 подключение rsp через ssh туннелированиеwindows 10 подключить rsp через ssh туннелирование

Чтобы подключиться к удаленному рабочему столу через SSH-туннель, необходимо подключиться к локальному порту 8888 вашего компьютера с помощью RDP-клиента (mstsc.exe):

127.0.0.1:8888

mstsc rdp port forwardingпереадресация портов mstsc rdp

Войдите на удаленный компьютер и безопасно работайте в сеансе RDP. Вы можете использовать команду Get-NetTCPConnection или инструмент TCPView, чтобы убедиться, что RDP-соединение было установлено локально (RDP-соединение было инициировано SSH-сервером, запущенным локально):

Get-NetTCPConnection -State Established|where {$_.localport -eq "3389"}|fl

проверка ip и порта источника соединения в windowsпроверка ip и порта источника соединения в windows

Вы можете проверить, что порт TCP/3389 на сервере не доступен напрямую с вашего компьютера. Проверить доступность порта можно с помощью команды Test-NetConnection:

Test-NetConnection 192.168.1.90 -port 3389

TcpTestSucceeded       : False

Другие компьютеры вашей локальной сети также могут использовать этот туннель для одновременного подключения к RDP-серверу, даже если прямое подключение запрещено (как через SSH, так и через RDP). Для этого они должны использовать RDP-клиент для подключения к порту 8888 на вашем компьютере (с созданным SSH-туннелем):

mstsc.exe /v 10.10.1.220:8888

mstsc rdp port forwarding via ssh tunnel on windows 10mstsc rdp проброс портов через ssh-туннель на windows 10

Защита RDP-соединения с помощью SSH-туннеля может быть хорошей альтернативой VPN для доступа к публичным хостам Windows. В этом случае вам не нужно напрямую открывать порт RDP/3389 на хосте Windows. Достаточно открыть только порт SSH/22, который защитит вас от атак грубой силы на RDP и эксплуатации 0-дневных уязвимостей RDP.

Вы можете использовать sshpass инструмент для автоматизации ввода паролей для входа в систему SSH. Вы можете запустить этот инструмент через подсистему WSL2 для Windows.

Установите sshpass в Ubuntu WSL:

$ sudo apt-get -y install ssphass

Запустите клиент Remote Desktop Connection (mstsc.exe) и сохраните настройки подключения в файле localhost-3389.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:\script\localhost-3389.rdp

Или (предпочтительнее) настройте аутентификацию с помощью ключа SSH.

Как создать SSH-туннель в Windows с помощью Putty?

Давайте рассмотрим, как создать SSH-туннель в Windows с помощью популярного SSH-клиента Putty.

  1. Запустите PuTTY и перейдите по адресу Соединение -> SSH -> Туннели;
  2. Укажите номер локального порта в поле Порт источника (в нашем примере это 8888);
  3. Укажите IP-адрес SSH-сервера и порт на удаленном хосте для переадресации соединения: 192.168.31.90:3389
  4. Выберите Местный назначение и нажмите Добавить;создание ssh-туннеля с переадресацией порта в puttyсоздать переадресованный порт ssh-туннеля в putty
  5. Чтобы не открывать оболочку удаленного хоста при подключении через туннель, включите опцию Не запускать оболочку или команду вообще опция в разделе SSH;putty Не запускать оболочку или команду вообщеputty Не запускать оболочку или команду вообще
  6. Вернитесь на вкладку Сессия, укажите имя или IP-адрес удаленного SSH-хоста и номер порта подключения (по умолчанию 22). Укажите имя сеанса в поле Сохраненный сеанс и нажмите кнопку Сохранить;
  7. Теперь вы можете запустить сохраненный SSH-туннель в Putty прямо с панели задач Windows 10.putty запустить сохраненную сессиюputty run saved session

Удаленная переадресация TCP (обратный SSH) на локальный компьютер

Существует еще один вариант использования SSH-туннеля — удаленная переадресация TCP. Вы можете разрешить удаленному серверу доступ к локальному порту на вашем компьютере или порту на другом компьютере в локальной сети через SSH-туннель. Например, вы хотите, чтобы внешний сервер (192.168.1.90) получил доступ к вашему интранет-сайту (не опубликованному в Интернете). Чтобы создать обратный туннель, выполните следующую команду:

ssh -R 8080:internalwww:80 [email protected]

Теперь, чтобы получить доступ к внутреннему сайту с удаленного SSH-сервера, просто введите адрес http://localhost:8080 в браузере.

Во всех версиях Windows правила проброса портов можно создать с помощью команды netsh interface portproxy команду.

С помощью SSH-туннелей можно создавать цепочки переадресации портов. Вы можете включить или отключить SSH-туннели в конфигурационном файле OpenSSH (sshd_config) с помощью следующих директив:

AllowStreamLocalForwarding yes
AllowTcpForwarding remote
PermitTunnel no
Эти директивы недоступны в текущей версии OpenSSH для Windows.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *