Сети

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 и отладка.

1 ответ 4 просмотра

Как в Windows 7 повторить поведение Linux-скрипта, который посылает HTTP CONNECT-заголовок и перенаправляет поток в openssl, чтобы установить SSH-соединение?

На Linux это работает так:

ssh admin@127.0.0.1 -o ProxyCommand=“./test.sh”

Содержимое test.sh:

bash
#!/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

Представьте: у вас строгий прокси, который пропускает только 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 не любит относительных.


Plink — король здесь. Он из коробки поддерживает HTTP proxy с CONNECT, без скриптов. Идеально повторяет ваш Linux-скейс: подключается к ssh.l3n.netcraze.link:443, шлет CONNECT 127.0.0.1:22 (или вашему target), туннелирует SSH-поток.

GUI в PuTTY (для сессии):

  1. Session → Host: 127.0.0.1, Port: 22.
  2. Connection → Proxy:
  • Proxy type: HTTP.
  • Proxy hostname: ssh.l3n.netcraze.link.
  • Port: 443.
  1. Сохраните сессию, подключитесь. 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 для автоматизации:

batch
@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-обертка:

batch
@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):

powershell
$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 (приближение):

batch
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 открыт?


Источники

  1. PuTTY Documentation - Chapter 7: Using Plink
  2. PuTTY Help - Setting the proxy type
  3. Superuser: OpenSSH config on Windows ProxyCommand
  4. Stack Overflow: SSH config on Windows HTTP proxy
  5. Daniel Stenberg: SSH over Proxy
  6. Server Fault: Windows SSH ProxyCommand errors
  7. 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 решен!

Авторы
Проверено модерацией
Модерация
SSH через HTTP CONNECT в Windows 7: Plink, PuTTY, OpenSSH