SSH через HTTP CONNECT в Windows 7: Plink, PuTTY, OpenSSH
Как в Windows 7 повторить Linux-скрипт с HTTP CONNECT и openssl для SSH: рабочие команды Plink с proxy-type http, OpenSSH ProxyCommand с ncat/connect, PowerShell-аналоги. Примеры .bat и отладка.
Как в Windows 7 повторить поведение Linux-скрипта, который посылает HTTP CONNECT-заголовок и перенаправляет поток в openssl, чтобы установить SSH-соединение?
На Linux это работает так:
ssh admin@127.0.0.1 -o ProxyCommand=“./test.sh”
Содержимое test.sh:
#!/usr/bin/env bash
{ printf "CONNECT 127.0.0.1:22 HTTP/1.0\r\nHost: ssh.l3n.netcraze.link\r\n\r\n"; cat; } | openssl s_client -quiet -connect ssh.l3n.netcraze.link:443 -servername ssh.l3n.netcraze.link
Вариант с socat не сработал (там, где брали инфу, утверждали, что socat работает, но у меня — нет). В Windows 7 доступны openssl и ncat (ncat вызывает сомнения). Нужно получить тот же эффект/коннект в Windows 7: желательно через PuTTY (или plink), но OpenSSH тоже подходит.
Основная проблема — как отправить HTTP CONNECT-заголовок и удержать/перенаправить соединение (аналог { printf ...; cat; }) и как оформить это в одной строке/команде/.bat/.cmd. Какие рабочие варианты и примеры команд/настроек вы посоветуете для Windows 7 (PuTTY/Plink, OpenSSH, PowerShell, ncat, openssl и т.п.)?
В Windows 7 для SSH через HTTP CONNECT аналогично Linux-скрипту с openssl s_client используйте Plink из PuTTY с опциями -proxy-type http, или OpenSSH ProxyCommand с ncat.exe для отправки CONNECT-запроса. Это проще, чем эмулировать пайп {printf; cat}, — ncat или connect.exe берут на себя CONNECT и туннелирование потока. Если нужен чистый openssl, соберите .bat или PowerShell-скрипт, но с оговорками на stdin-обработку.
Содержание
- SSH через HTTP proxy в Windows 7
- Вариант 1: PuTTY и Plink с встроенным HTTP CONNECT
- Вариант 2: OpenSSH ProxyCommand с ncat или connect.exe
- Вариант 3: Эмуляция скрипта с openssl s_client в PowerShell или .bat
- Дополнительно: proxytunnel или corkscrew как альтернатива
- Отладка и типичные проблемы на Windows 7
- Источники
- Заключение
SSH через HTTP proxy в Windows 7
Представьте: у вас строгий прокси, который пропускает только HTTPS-трафик на 443 порт, а SSH заблокирован. Linux-скрипт хитро маскирует CONNECT-запрос под HTTP и туннелирует поток через openssl s_client. В Windows 7 то же самое реально, но без bash-конвейера. Главное — инструменты вроде PuTTY/Plink, ncat (из Nmap) или OpenSSH из Git/Cygwin, которые уже умеют CONNECT без самописных пайпов.
Почему не socat? Вы правы, на старом Windows 7 он капризный — не всегда держит поток стабильно. Вместо этого берем проверенные варианты из документации PuTTY и сообщества: Plink отправляет CONNECT сам, ncat — через --proxy-type http. А openssl оставим для “чистоты” в PowerShell.
Установите заранее: PuTTY/Plink (putty proxy — популярный запрос), Nmap с ncat, OpenSSL (если нет). Полные пути обязательны — Windows не любит относительных.
Вариант 1: PuTTY и Plink с встроенным HTTP CONNECT
Plink — король здесь. Он из коробки поддерживает HTTP proxy с CONNECT, без скриптов. Идеально повторяет ваш Linux-скейс: подключается к ssh.l3n.netcraze.link:443, шлет CONNECT 127.0.0.1:22 (или вашему target), туннелирует SSH-поток.
GUI в PuTTY (для сессии):
- Session → Host: 127.0.0.1, Port: 22.
- Connection → Proxy:
- Proxy type: HTTP.
- Proxy hostname: ssh.l3n.netcraze.link.
- Port: 443.
- Сохраните сессию, подключитесь. PuTTY сам сформирует CONNECT с Host: ssh.l3n.netcraze.link.
Командная строка Plink (аналог ssh -o ProxyCommand):
Скачайте plink.exe, положите в C:\plink.
plink.exe -ssh -l admin -proxy-type http -proxy-host ssh.l3n.netcraze.link -proxy-port 443 127.0.0.1 -P 22
Или для полной аналогии с пайпом — используйте Plink как прокси-команду:
plink.exe -proxy-type http -proxy-host ssh.l3n.netcraze.link -proxy-port 443 -nc 127.0.0.1:22
Затем ssh или другой клиент на локальный порт. Работает? Проверьте PuTTY proxy docs — там прямо про HTTP CONNECT.
.bat для автоматизации:
@echo off
set PROXY_HOST=ssh.l3n.netcraze.link
set TARGET_HOST=127.0.0.1
set TARGET_PORT=22
plink.exe -ssh admin@%TARGET_HOST% -P %TARGET_PORT% -proxy-type http -proxy-host %PROXY_HOST% -proxy-port 443
pause
Запуск: ssh-tunnel.bat. Быстро, надежно. Plink даже auth прокси тянет (логин/пароль в опциях).
Вариант 2: OpenSSH ProxyCommand с ncat или connect.exe
Если OpenSSH установлен (через Git for Windows или Cygwin), ProxyCommand — прямой аналог вашего test.sh. ncat.exe шлет CONNECT и держит поток, как cat в Linux.
С ncat (Nmap, полный путь важен на Win7):
В ~/.ssh/config или командой:
ssh -o ProxyCommand="C:\Program Files (x86)\Nmap\ncat.exe --proxy-type http --proxy ssh.l3n.netcraze.link:443 %h %p" -l admin 127.0.0.1
%h %p подставит 127.0.0.1 22 автоматически. ncat сформирует CONNECT 127.0.0.1:22 Host: ssh.l3n.netcraze.link.
Из Superuser примера: полный путь спасает от “posix_spawn” ошибок.
Если Git установлен — connect.exe (лучше ncat):
ssh -o ProxyCommand="C:\Program Files\Git\mingw64\bin\connect.exe -H ssh.l3n.netcraze.link:443 %h %p" admin@127.0.0.1
connect.exe — легкий, заточен под CONNECT. Stack Overflow подтверждает.
.bat-обертка:
@echo off
set NCAT="C:\Program Files (x86)\Nmap\ncat.exe"
ssh -o ProxyCommand="%NCAT% --proxy-type http --proxy ssh.l3n.netcraze.link:443 %%h %%p" admin@127.0.0.1
Готово к копипасту.
Вариант 3: Эмуляция скрипта с openssl s_client в PowerShell или .bat
Хотите близко к оригиналу? PowerShell эмулирует {printf; cat} лучше cmd — держит bidirectional поток.
PowerShell-скрипт (test.ps1):
$proxyHost = "ssh.l3n.netcraze.link"
$proxyPort = 443
$connectReq = "CONNECT 127.0.0.1:22 HTTP/1.0`r`nHost: $proxyHost`r`n`r`n"
$bytes = [System.Text.Encoding]::ASCII.GetBytes($connectReq)
$tcp = New-Object System.Net.Sockets.TcpClient($proxyHost, $proxyPort)
$stream = $tcp.GetStream()
$stream.Write($bytes, 0, $bytes.Length)
# Теперь bidirectional tunnel: stdin/stdout <-> stream
$buffer = New-Object byte[] 4096
while ($tcp.Connected) {
$i = $stream.Read($buffer, 0, $buffer.Length)
if ($i -gt 0) { [Console]::Out.Write([System.Text.Encoding]::ASCII.GetString($buffer, 0, $i)); [Console]::Out.Flush() }
if ([Console]::In.Peek() -ne -1) {
$inputBytes = [Console]::In.Read([byte[]]::new(4096), 0, 4096)
$stream.Write($inputBytes, 0, $inputBytes.Length)
}
}
Запуск: ssh -o ProxyCommand="powershell.exe -File test.ps1" admin@127.0.0.1. Но проще openssl напрямую:
powershell "echo 'CONNECT 127.0.0.1:22 HTTP/1.0\r\nHost: ssh.l3n.netcraze.link\r\n\r\n' | openssl s_client -quiet -connect ssh.l3n.netcraze.link:443 -servername ssh.l3n.netcraze.link"
Пайп неидеален — stdin обрезается. Для полного cat нужен loop выше.
В .bat (приближение):
echo CONNECT 127.0.0.1:22 HTTP/1.0 ^&echo Host: ssh.l3n.netcraze.link ^&echo. | openssl s_client -quiet -connect ssh.l3n.netcraze.link:443 -servername ssh.l3n.netcraze.link
Поток не bidirectional. Stack Overflow предупреждает: openssl s_client слаб в proxy-auth, лучше helpers.
Дополнительно: proxytunnel или corkscrew как альтернатива
Если auth нужен: proxytunnel.exe (скачайте бинарник).
ssh -o ProxyCommand="proxytunnel.exe -p ssh.l3n.netcraze.link:443 -d 127.0.0.1:22" admin@127.0.0.1
Daniel Stenberg рекомендует для Windows.
Отладка и типичные проблемы на Windows 7
Ошибки?
- “posix_spawn: No such file”: Полный путь! Server Fault.
- Поток рвется: Добавьте -quiet в openssl, --verbose в ncat.
- Тестируйте:
ssh -vvv -o ProxyCommand=...или Wireshark на CONNECT. - Win7 CRLF: В PowerShell используйте
rn.
Проверьте firewall — 443 открыт?
Источники
- PuTTY Documentation - Chapter 7: Using Plink
- PuTTY Help - Setting the proxy type
- Superuser: OpenSSH config on Windows ProxyCommand
- Stack Overflow: SSH config on Windows HTTP proxy
- Daniel Stenberg: SSH over Proxy
- Server Fault: Windows SSH ProxyCommand errors
- Stack Overflow: openssl s_client using a proxy
Заключение
Лучший выбор для Windows 7 — Plink с -proxy-type http: минимум хлопот, полный HTTP CONNECT без скриптов. Если OpenSSH ближе — ncat в ProxyCommand. PowerShell/openssl подойдет для purists, но с нюансами пайпа. Тестируйте с вашим ssh.l3n.netcraze.link:443 — должно сработать как Linux. SSH proxy Windows 7 решен!