diff --git a/README.md b/README.md new file mode 100644 index 0000000..37c68ba --- /dev/null +++ b/README.md @@ -0,0 +1,151 @@ +# anti-syktsu-proxy + +Локальный HTTP/HTTPS proxy-сервер для Windows: + +- принимает подключения на `127.0.0.1:8888` (с Basic auth), +- проксирует трафик через системный upstream proxy (PAC/WPAD/IE/WinHTTP), +- поддерживает принудительный upstream через `UPSTREAM_PROXY`, +- логирует подключения и ошибки в консоль. + +Проект предназначен для сценария: +`приложение -> локальный proxy -> корпоративный proxy (например CNTLM/AD)`. + +## Требования + +- Windows 10/11 или Windows Server +- .NET SDK 6.0+ (для сборки) +- Доступ к корпоративному proxy (например `proxy.syktsu.ru:3128`) + +Важно: проект использует WinHTTP API (`winhttp.dll`), поэтому запуск только на Windows. + +## Быстрый старт + +1. Клонировать репозиторий. +2. Открыть `cmd`/PowerShell в папке проекта. +3. (Опционально, рекомендуется) задать принудительный upstream proxy. +4. Запустить `dotnet run` или собрать `.exe` через `dotnet publish`. + +## Конфигурация + +### 1) Локальная авторизация клиента (вход в локальный proxy) + +Сейчас логин/пароль захардкожены в `Program.cs`: + +- `user` +- `pass` + +Их использует клиент при подключении к `127.0.0.1:8888`. + +### 2) Upstream proxy (корпоративный) + +Рекомендуемый режим для стабильной работы в закрытой сети: + +- `UPSTREAM_PROXY` - адрес корпоративного proxy (например `proxy.syktsu.ru:3128`) +- `UPSTREAM_USER` - логин для upstream proxy (если нужен) +- `UPSTREAM_PASS` - пароль для upstream proxy (если нужен) + +Если `UPSTREAM_PROXY` задан, он имеет приоритет и используется для всех запросов. + +Пример (cmd): + +```bat +set UPSTREAM_PROXY=proxy.syktsu.ru:3128 +set UPSTREAM_USER=my_user +set UPSTREAM_PASS=my_password +``` + +Если `UPSTREAM_PROXY` не задан, приложение пытается резолвить системный proxy через WinHTTP/IE config (PAC/WPAD/static). + +## Запуск из исходников + +```bat +dotnet run --project anti-syktsu-proxy.csproj +``` + +## Сборка `.exe` + +### Framework-dependent (меньше размер, нужен установленный .NET Runtime) + +```bat +dotnet publish anti-syktsu-proxy.csproj -c Release -r win-x64 --self-contained false -o .\publish\win-x64 +``` + +Файл: + +`.\publish\win-x64\anti-syktsu-proxy.exe` + +### Self-contained (больше размер, .NET Runtime на машине не нужен) + +```bat +dotnet publish anti-syktsu-proxy.csproj -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true -o .\publish\win-x64-sc +``` + +Файл: + +`.\publish\win-x64-sc\anti-syktsu-proxy.exe` + +## Использование в клиентах + +Указывайте в приложениях локальный proxy: + +- `http://user:pass@127.0.0.1:8888` + +Примеры проверки: + +```bat +curl -x http://user:pass@127.0.0.1:8888 http://example.com -v +curl -x http://user:pass@127.0.0.1:8888 https://example.com -k -v +``` + +## Что логируется + +- старт сервера и адрес прослушивания +- входящие подключения (`[conn:N] accepted`) +- метод/target (`CONNECT ...`, `GET ...`) +- выбранный upstream proxy +- ошибки парсинга, сети, WinHTTP +- закрытие соединения + +## Типовые проблемы + +### `WinHttpGetProxyForUrl failed ... (Win32=12006)` + +Обычно проблема PAC URL (часто `file://...`) или недоступность auto-proxy в текущей среде. +Решение: задать `UPSTREAM_PROXY` явно. + +### `502 Bad Gateway` + +Локальный proxy не смог подключиться к upstream или upstream отклонил CONNECT. +Проверьте `UPSTREAM_PROXY`, сетевую доступность и auth (`UPSTREAM_USER/PASS`). + +### `407 Proxy Authentication Required` от upstream + +Нужны корректные `UPSTREAM_USER`/`UPSTREAM_PASS` (или внешняя авторизация, например CNTLM). + +### `stream closed` / `operation aborted` + +Часто это штатное закрытие одной стороны туннеля. Смотрите соседние строки лога по тому же `conn:N`: +там обычно есть первичная причина (`407/403/502`, таймаут, reset и т.д.). + +## Полезные команды Windows + +Показать WinHTTP proxy: + +```bat +netsh winhttp show proxy +``` + +Сбросить WinHTTP proxy: + +```bat +netsh winhttp reset proxy +``` + +## Ограничения прототипа + +- упрощенный HTTP parser (первые 8192 байт) +- нет полноценного streaming больших body/chunked +- нет connection pooling +- нет graceful shutdown + +Проект инженерный, ориентирован на диагностику и контролируемый proxy-chaining. diff --git a/anti-syktsu-proxy.csproj b/anti-syktsu-proxy.csproj new file mode 100644 index 0000000..3634452 --- /dev/null +++ b/anti-syktsu-proxy.csproj @@ -0,0 +1,10 @@ + + + Exe + net6.0 + disable + disable + anti-syktsu-proxy + AntiSyktsuProxy + + diff --git a/build.bat b/build.bat new file mode 100644 index 0000000..2c5e1b1 --- /dev/null +++ b/build.bat @@ -0,0 +1,17 @@ +@echo off +setlocal + +set "PROJECT=anti-syktsu-proxy.csproj" +set "RUNTIME=win-x64" +set "CONFIG=Release" +set "OUTDIR=publish\%RUNTIME%" + +echo [build] Publishing %PROJECT%... +dotnet publish "%PROJECT%" -c %CONFIG% -r %RUNTIME% --self-contained false -o "%OUTDIR%" +if errorlevel 1 ( + echo [build] FAILED + exit /b 1 +) + +echo [build] OK: %OUTDIR%\anti-syktsu-proxy.exe +exit /b 0 diff --git a/run.bat b/run.bat new file mode 100644 index 0000000..b45f0f7 --- /dev/null +++ b/run.bat @@ -0,0 +1,21 @@ +@echo off +setlocal + +set "EXE=publish\win-x64\anti-syktsu-proxy.exe" + +if not exist "%EXE%" ( + echo [run] EXE not found: %EXE% + echo [run] Run build.bat first. + exit /b 1 +) + +set "UPSTREAM_PROXY=proxy.syktsu.ru:3128" +set "UPSTREAM_USER=%USERDOMAIN%\%USERNAME%" +set "UPSTREAM_PASS=" + +echo [run] UPSTREAM_PROXY=%UPSTREAM_PROXY% +echo [run] UPSTREAM_USER=%UPSTREAM_USER% +echo [run] UPSTREAM_PASS is empty +echo [run] Starting proxy... + +"%EXE%"