В этой статье мы покажем, как использовать встроенный в Windows OpenSSH сервер для проброса портов через SSH туннель (SSH туннелированние). Перенаправление портов в SSH позволяет туннелировать (пробрасывать) порты приложений с локального компьютера на удаленный сервер и наоборот. Ранее проброс портов через SSH туннель использовался только в среде Linux/Unix , но теперь вы можете воспользоваться этим возможностями и в Windows. Рассмотрим на практическом примере, как на Windows Server через SSH сервер с открытым портом TCP 22 пробросить RDP подключение.
Чаще всего проброс портов через SSH применяется в сценариях, когда нужно подключиться к удаленному компьютеру, который защищен межсетевым экраном. Например, у вас имеется сервер c Windows, на котором открыт только SSH порт (TCP 22). Все остальные порты блокируются аппаратным межсетевым экраном или брандмауэром 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 туннеля с помощью встроенного SSH клиента (встроен в Windows 10 1809 и Windows Server 2019), выполните команду:
ssh -L 8888:192.168.1.90:3389 root@192.168.1.90
Теперь, чтобы подключится к удаленному компьютеру через SSH туннель, вам нужно подключится RDP-клиентом mstsc.exe на локальный порт 8888 своего компьютера:
127.0.0.1:8888
Авторизуйтесь на удаленном компьютере и можете спокойно работать в RDP-сессии, при этом вы помните, что порт 3389 все еще закрыт в файерволе. С помощью TCPView вы можете убедиться, что RDP подключение установлено локально (RDP подключение инициировано запущенным локально SSH сервером).
Обратите внимание, что если вы перенаправляете таким образом незашифрованный трафик приложения, то по сети он передается в зашифрованном виде. Трафик в лбом случае шифруется на одном конце SSH соединения и расшифровывается на другом.
В таком режиме другие компьютеры в вашей локальной сети тоже смогут подключиться к удаленному RDP серверу, даже если у них полностью заблокирован прямой доступ к удаленному серверу (как по SSH, так и по RDP). Для этого, они должны подключиться RDP клиентом к порту 8888 на вашем компьютере, на котором создан SSH туннель:
mstsc.exe /v 10.10.1.220:8888
Переброс удаленного порта на локальную машину (Remote TCP forwarding)
Есть еще один вариант применения SSH туннеля – remote TCP forwarding. Через SSH туннель вы можете открыть доступ удаленному серверу к локальному порту на вашем компьютере или порту на другом компьютере в вашей локальной сети. Например, вы хотите, чтобы внешний сервер (192.168.1.90) получил доступ к вашему Интранет сайту (не опубликованному в Интернете). Для создания обратного туннеля, используйте такую команду:
ssh -R 8080:internalwebsever:80 user@192.168.1.90
Теперь, чтобы на удаленном SSH сервер получить доступ к веб серверу internalwebsever достаточно в браузере набрать адрес
http://localhost:8080
.
netsh interface portproxy
.С помощью SSH туннелей вы можете строить целые цепочки для форвардинга портов. Включить или отключить SSH туннелирование можно в конфигурационном файле sshd_config директивами:
AllowStreamLocalForwarding yes
AllowTcpForwarding remote
Продолжение про генерацию клиентских ключей будет?
Ага, черновик уже есть. Все работает 🙂
На след. неделе наверно опубликую.
Продолжение: аутентфикация в Windows по SSH ключам.
https://winitpro.ru/index.php/2019/11/13/autentifikaciya-po-ssh-klyucham-v-windows/
Очень интересная тема. Продолжай
Для запрета тунелирования трафика нужно еще в sshd_config добавить директиву:
PermitTunnel no
Я много лет пользуюсь CygWIn SSH. Настроил проброс 3389 порта, но год-полтора назад столкнулся с проблемой — не запускается 1C. Не видит в сети HASP. Я не шибко парился по этому поводу, потому что оно надо очень редко и всегда есть варианты обхода проблемы. Насколько я понял, при RDP подключении через проброшенный порт 1с не ищет ключ в сети или не видит. При «обычном» RDP подключении по сети 1с всё работает нормально. Интересно будет проверить OpenSSH на работоспособность с RDP+1c+HASP.
А так то удобно на флешке держать plink с ключами и подключаться удаленному рабочему столу хоть из кафешки не заморачиваясь с установкой vpn.
Что делать, если наш Windows сервер находится за неуправляемым NAT (нельзя перенаправить порты) ? Я знаю, что используют промежуточный Linux сервер с SSH и белым IP. Наш сервер держит исходящее SSH соединение на этот промежуточный сервер. Клиенты также подключаются к этому промежуточному серверу, который уже связывает их с нашим сервером за NAT. Все бы ничего, но существующие гайды подразумевают, что сервер за NAT также на Linux. Как быть в нашем случае (Windows сервером) ? Интересует решение именно с помощью SSH, не VPN.
У меня такой вопрос. Есть значит сервер на ubuntu на нём приложение , которым можно управлять через rpc порт 9009. Есть сервер , windows , на котором через putty настроен тунель для подключения к серверу на ubuntu через localhost:9999. Есть ПК подключенный к интернет, на котором установлена клиентская часть для общения с серверной частью , которая поднята на ubuntu. Как ПК подключенному к интернет обеспечить доступ к тунелю, который находится на сервере с windows?
Спасибо за статью. Всё отлично. Интересует как сделать тунель на андроиде.
Подскажите плииз.