WARP WireProxy Manager — неинтерактивный установщик и менеджер для схемы:
3x-ui / Xray → socks5://127.0.0.1:40000 → wireproxy → Cloudflare WARP → internet
Проект рассчитан на VPS с Linux + systemd. Цель — быстро поднять Cloudflare WARP как локальный SOCKS5 outbound для 3x-ui/Xray, автоматически подобрать рабочий WARP endpoint и поддерживать его живым через один scheduler: cron или systemd timer.
Alpine/OpenRC как отдельный init-режим не поддерживается: для автозапуска нужен
systemctl.
Этот проект не должен превращать весь VPS в WARP-VPN клиент. WARP используется только через wireproxy и локальный SOCKS5 127.0.0.1:40000.
Не запускай WARP-конфиг через wg-quick:
wg-quick up warp
systemctl enable --now wg-quick@warpЕсли системный wg-quick@warp поднимет full-tunnel WARP, входящие подключения могут сломаться: SSH/443 приходят на обычный интерфейс VPS, а ответы уходят через WARP. Это выглядит как «сервер в интернете не отвечает», хотя пакеты до него доходят.
Начиная с warpwp v1.2.1 и warp-wireproxy-native.sh v1.1.4 добавлена защита:
warpwp --fix-routingотключает опасный системный WARP full-tunnel и не трогаетwireproxySOCKS5;warpwp --doctorпоказывает routing guard:ip rule,table 51820,interface warp,wg-quick@warp;warpwp --install,--check,--quick-scan,--deep-scanперед работой очищают конфликтующий system-WARP routing;/etc/wireguard/warp.confсоздаётся как guard-файл: случайныйwg-quick up warpзавершится ошибкой до добавления full-tunnel маршрутов;- рабочий конфиг для
wireproxyостаётся/etc/wireguard/proxy.conf.
Аварийное восстановление после сломанного WARP routing:
warpwp --fix-routing
ip route get 1.1.1.1
ip route get <твой-admin-ip>Нормально, когда ответы идут через основной интерфейс VPS, например ens3, а не через warp / table 51820.
Репозиторий:
https://github.com/Kuzz007/WARP_WireProxy_Manager
Текущая версия:
warpwp v1.3.0
warp-wireproxy-native.sh v1.2.0
Установить менеджер:
bash <(curl -fsSL "https://raw.githubusercontent.com/Kuzz007/WARP_WireProxy_Manager/main/warpwp.sh?nocache=$(date +%s)") --install-managerЕсли raw-кэш GitHub отдаёт старую версию, поставить через GitHub API:
curl -fsSL \
-H "Accept: application/vnd.github.raw" \
"https://api.github.com/repos/Kuzz007/WARP_WireProxy_Manager/contents/warpwp.sh?ref=main" \
-o /usr/local/bin/warpwp
chmod +x /usr/local/bin/warpwpУстановить/обновить WARP + wireproxy + cron:
warpwp --installПроверить состояние:
warpwp --doctor
warpwp --status-jsonПочинить опасную системную WARP-маршрутизацию:
warpwp --fix-routing| Команда | Что делает |
|---|---|
warpwp |
Открыть меню |
warpwp --install |
Установить/обновить WARP + wireproxy + cron |
warpwp --install-cron |
Включить cron и отключить timer |
warpwp --install-timer [минуты] |
Включить timer и отключить cron |
warpwp --timer-status |
Показать статус systemd timer |
warpwp --scheduler-status |
Показать активный scheduler |
warpwp --status |
Показать состояние |
warpwp --status-json |
Показать JSON-статус |
warpwp --doctor |
Расширенная диагностика + routing guard |
warpwp --fix-routing |
Убрать системный WARP full-tunnel, не трогая wireproxy SOCKS5 |
warpwp --check |
Обычный ремонт endpoint, scan-count=25 |
warpwp --quick-scan |
Быстрый ремонт endpoint, scan-count=15 |
warpwp --deep-scan |
Глубокий ремонт endpoint, scan-count=150 |
warpwp --warpscout-scan |
Независимый deep scan через установленный WARPSCOUT |
warpwp --check --scanner auto |
Сначала WARPSCOUT, при неудаче встроенный scanner |
warpwp --check --node HEL,ARN |
Выбирать только указанные Cloudflare colo |
warpwp --check --avoid-node DME |
Исключить указанные Cloudflare colo |
warpwp --check --country DE,NL |
Выбирать указанные выходные страны (loc) |
warpwp --check --avoid-country RU |
Исключить указанные выходные страны (loc) |
warpwp --xray |
Показать блоки для 3x-ui/Xray |
warpwp --zapret |
Показать строки для zapret4rocket |
warpwp --wg-paste |
Вставить WireGuard .conf в терминал и получить JSON |
warpwp --wg-json FILE |
Конвертировать WireGuard .conf в JSON для 3x-ui/Xray |
warpwp --wg-convert FILE |
Алиас для --wg-json |
warpwp --logs |
Показать логи |
warpwp --memo |
Показать полную памятку |
warpwp --update |
Обновить локальные скрипты |
warpwp --version |
Показать версию менеджера |
warpwp --remove |
Безопасно удалить компоненты менеджера |
warpwp --purge |
Жёстко удалить WARP/wireproxy/wgcf/warp-cli/fscarmen-следы |
И --remove, и --purge удаляют из /etc/wireguard только файлы этого проекта
(warp.conf, warp.wireproxy.conf, proxy.conf, warp-account.json,
warp-private.key, кэши endpoint'ов). Посторонние конфиги вроде wg0.conf
остаются на месте, сам каталог удаляется только если стал пустым.
============================================================
WARP + wireproxy manager v1.3.0
============================================================
1) Установить / обновить WARP + wireproxy + cron
2) Проверить состояние
3) Проверить и починить endpoint
4) Обновить локальные скрипты
5) Безопасно удалить WARP Manager
6) Показать логи
7) Показать команды
8) Показать полную памятку
9) Doctor / расширенная диагностика
10) PURGE / жёсткая очистка WARP-следов
11) Включить cron/check и отключить timer
12) Показать блоки для 3x-ui / Xray
13) Показать строки для zapret4rocket
14) Quick scan endpoint
15) Deep scan endpoint
16) Показать JSON-статус
17) Включить systemd timer и отключить cron
18) Статус systemd timer
19) Удалить systemd timer
20) Scheduler status
21) Вставить WireGuard .conf и получить JSON для 3x-ui
22) Конвертировать WireGuard .conf файл в JSON для 3x-ui
23) Fix routing / убрать системный WARP full-tunnel
0) Выход
============================================================
Cron и systemd timer вызывают native-скрипт в режиме --check:
warp-wireproxy-native.sh --check --scan-count 25Режим --check делает лёгкую проверку уже установленных команд и не запускает apt update / apt install. Это важно для cron/timer, чтобы каждые 10 минут не дёргать пакетный менеджер.
Пересканирование запускается только когда быстрая проверка не увидела warp=on, то есть когда туннель уже лежит. Поэтому здесь важно время восстановления.
Перебор останавливается, как только набрано 3 стабильных endpoint'а, соответствующих policy. Новый endpoint проверяется серией из 5 запросов: допускается одна случайная потеря, но две финальные ошибки подряд считаются teardown. Лучший выбирается по доле неудачных HTTP-проб, затем по среднему времени ответа. Это не ICMP packet loss: метрика показывает стабильность реального трафика через wireproxy. Раньше проверялись все кандидаты подряд, и --deep-scan прогонял 150 полных проверок даже если рабочий нашёлся на первой.
Сколько рабочих набирать, можно задать:
warp-wireproxy-native.sh --check --scan-count 150 --enough-good 1Первыми всегда проверяются текущий endpoint и кэш warp-endpoints.good, отсортированный по времени ответа, поэтому обычное восстановление укладывается в несколько попыток. Полный проход всех кандидатов остаётся только для случая, когда не работает вообще ничего.
Если рабочий endpoint не нашёлся, в proxy.conf возвращается тот, что стоял до сканирования. Раньше там оставался последний проверенный случайный адрес.
colo из Cloudflare trace — код edge-узла, а loc — страна, которую видят внешние сайты. Это разные параметры:
# Разрешить HEL или ARN, но исключить российский выходной регион
warpwp --check --node HEL,ARN --avoid-country RU
# Исключить DME и предпочитать выход через DE/NL
warpwp --deep-scan --avoid-node DME --country DE,NLПо умолчанию используется --policy-mode prefer: если подходящий endpoint не найден, Manager может взять любой стабильный рабочий. Для жёсткого запрета:
warpwp --check --avoid-node DME --policy-mode strictДоступные параметры native-скрипта: --node, --avoid-node, --country, --avoid-country, --policy-mode prefer|strict и --stability-probes N.
Если бинарник warpscout уже установлен, Manager может искать endpoint в отдельных userspace-туннелях, не переписывая боевой proxy.conf на каждом кандидате:
warpwp --warpscout-scan
warpwp --deep-scan --scanner auto --avoid-node DME--scanner warpscoutтребует WARPSCOUT и завершится ошибкой, если тот не нашёл endpoint.--scanner autoсначала пробует WARPSCOUT, затем возвращается к встроенному scanner.- Временный WARPSCOUT account собирается из существующих
warp-account.jsonиwarp-private.key, содержит только tunnel keys без API token/id, имеет права0600и удаляется после запуска. - Найденный endpoint всё равно проверяется через реальный
wireproxyперед сохранением. - Manager передаёт WARPSCOUT только положительный
--node: параметр-countryу WARPSCOUT означает страну расположения узла, а у Manager--country— выходнойloc. Country/deny-policy проверяется финальным trace; в--scanner autoнесовпадение передаётся native scanner. - Сейчас интеграция использует только
-p wg: AmneziaWG и MASQUE требуют другого SOCKS backend и вwireproxyне подставляются.
Путь и параллелизм можно переопределить:
warpwp --deep-scan --scanner warpscout \
--warpscout-bin /usr/local/bin/warpscout \
--warpscout-jobs 6Из файла:
warpwp --wg-json /root/wg0.confВставкой прямо в терминал:
warpwp --wg-pasteОбычный WireGuard config:
[Interface]
PrivateKey = CLIENT_PRIVATE_KEY
Address = 10.0.0.2/32
Address = fd00::2/128
DNS = 1.1.1.1
MTU = 1280
[Peer]
PublicKey = SERVER_PUBLIC_KEY
Endpoint = 1.2.3.4:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25Будет преобразован в формат:
{
"protocol": "wireguard",
"settings": {
"mtu": 1280,
"secretKey": "CLIENT_PRIVATE_KEY",
"address": [
"10.0.0.2/32",
"fd00::2/128"
],
"workers": 2,
"peers": [
{
"publicKey": "SERVER_PUBLIC_KEY",
"allowedIPs": [
"0.0.0.0/0",
"::/0"
],
"endpoint": "1.2.3.4:51820",
"keepAlive": 25
}
],
"noKernelTun": false
}
}Конвертер поддерживает несколько строк Address, поэтому IPv4 и IPv6 не теряются.
После создания outbound задай tag, например:
WG
И используй routing на:
{
"type": "field",
"domain": [
"domain:openai.com",
"domain:chatgpt.com"
],
"outboundTag": "WG"
}Cron и systemd timer взаимоисключающие.
Включить cron-режим:
warpwp --install-cronВключить timer-режим:
warpwp --install-timerПередать интервал сразу без вопроса:
warpwp --install-timer 15Проверить активный scheduler:
warpwp --scheduler-statuswarpwp --status-jsonJSON включает:
manager_version
native_version
healthy
scheduler
service
socks5
warp
selection (time_total, probe_loss_percent, stable, scanner, checked_at)
routing_guard
cron
timer
logs
cache
warpwp --xrayRouting вести на:
"outboundTag": "WARP"Не направляй routing напрямую на WARP-socks5; этот outbound используется как промежуточный.
warpwp --zapretРекомендуемая строка:
NFQWS_PORTS_UDP=443,2408,1843,1010,500,1701,4500,4443,8443,8095Локальный порт 40000 — это SOCKS5 wireproxy. Его в zapret добавлять не нужно.
warpwp --doctor
warpwp --status-json
curl -m 10 -s -x socks5h://127.0.0.1:40000 https://www.cloudflare.com/cdn-cgi/trace | grep -E 'ip=|colo=|loc=|warp='Хороший результат:
warp=on
Для маршрутизации должно быть чисто:
ip rule
ip route show table 51820
ip link show warpХорошее состояние:
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
warpwp --updateЧерез GitHub API, если raw-кэш отдаёт старую версию:
curl -fsSL \
-H "Accept: application/vnd.github.raw" \
"https://api.github.com/repos/Kuzz007/WARP_WireProxy_Manager/contents/warpwp.sh?ref=main" \
-o /usr/local/bin/warpwp
chmod +x /usr/local/bin/warpwpwarpwp --remove
warpwp --purgeWorkflow:
.github/workflows/shellcheck.yml
Проверяет:
bash -n
shellcheck --severity=warning
scripts/test-native.sh
Версия shellcheck закреплена в .shellcheck-version и ставится из релизов koalaman: набор правил заметно меняется между версиями, и версия из apt дрейфовала вместе с образом раннера.
Тот же набор проверок локально:
scripts/check.shСкрипт печатает свою версию shellcheck рядом с закреплённой и предупреждает при расхождении. Если версии разные, «локально зелено» ещё не значит «в CI зелено».
warpwp.sh единый менеджер с меню
warp-wireproxy-native.sh нативный установщик WARP + wireproxy
install-warp-check.sh отдельный минимальный установщик cron-проверки
warp-wireproxy-auto.sh deprecated-wrapper для обратной совместимости
TODO.md список дальнейших улучшений
CHANGELOG.md что менялось от версии к версии
LICENSE MIT
scripts/check.sh локальный прогон тех же проверок, что в CI
.shellcheck-version версия shellcheck, закреплённая для CI и локали
.github/workflows/ CI-проверки bash-скриптов