diff --git a/README.md b/README.md index 43bdb47..e7b986a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,10 @@ # WARP Web UI -Веб-панель для управления **Cloudflare WARP** на Linux: подключение и отключение туннеля, активация WARP+, настройка SOCKS-прокси и готовые пресеты для **3x-ui** и **Amnezia Xray**. +Веб-панель для управления **Cloudflare WARP** на Linux: подключение и отключение туннеля, активация WARP+, настройка SOCKS-прокси, готовые пресеты для **3x-ui**/**Amnezia Xray** и beta-модуль **WARP Relay**. + +![WARP Web UI dashboard](docs/images/dashboard.png) + +![WARP Relay beta](docs/images/warp-relay-beta.png) Документация на английском (кратко): [README.en.md](README.en.md). @@ -10,6 +14,7 @@ - **Аккаунт**: информация о регистрации, применение лицензионного ключа WARP+ - **Установка и удаление** пакета `cloudflare-warp` прямо из браузера (репозиторий Cloudflare для Debian/Ubuntu) - **SOCKS-прокси**: смена порта `warp-cli proxy` (часто `40000` или `1024`) +- **WARP Relay beta**: UDP relay через `nftables`/`iptables` на выбранный WARP/WireGuard endpoint, single-port или Cloudflare multiport - **Пресет 3x-ui**: outbound `warp-socks` → `127.0.0.1:ПОРТ` и правило маршрутизации `geosite:google` - **Пресет Amnezia**: мост Docker `172.17.0.1:11025` → SOCKS на хосте, маршрутизация WARP для выбранных клиентов с понятными именами @@ -18,6 +23,7 @@ - Linux (рекомендуется Debian/Ubuntu) - `python3` — только стандартная библиотека, без pip - `systemd` +- `nftables` или `iptables` для WARP Relay beta - По желанию: пакет `cloudflare-warp` (можно поставить из UI или скриптом `scripts/warp-install-cf.sh`) - Для интеграций: `docker`, `socat`, панель **3x-ui** и/или **Amnezia** @@ -29,6 +35,12 @@ curl -fsSL https://raw.githubusercontent.com/andrey271192/WARP-Web-UI/main/install.sh | sudo bash ``` +Beta-репозиторий с WARP Relay: + +```bash +curl -fsSL https://raw.githubusercontent.com/andrey271192/WARP-Web-UI-Relay-Beta/main/install.sh | sudo bash +``` + Установщик **задаёт вопросы** (можно нажать Enter для значения по умолчанию): | Вопрос | По умолчанию | Зачем это нужно | @@ -56,6 +68,12 @@ sudo bash install.sh curl -fsSL https://raw.githubusercontent.com/andrey271192/WARP-Web-UI/main/uninstall.sh | sudo bash ``` +Beta-репозиторий: + +```bash +curl -fsSL https://raw.githubusercontent.com/andrey271192/WARP-Web-UI-Relay-Beta/main/uninstall.sh | sudo bash +``` + Или из каталога клона: `sudo bash uninstall.sh` — останавливает сервис, по запросу удаляет файлы приложения, конфигурацию и при желании пакет `cloudflare-warp`. ## Структура репозитория @@ -98,6 +116,20 @@ install.sh / uninstall.sh # Установка и снятие «в одн Нужны `docker`, контейнер Amnezia Xray и переменные `AMNEZIA_*` при нестандартных путях — см. `.env.example`. +## WARP Relay beta + +`openwarpkit/warp-relay` взят как идея и встроен без запуска внешнего интерактивного скрипта. Панель сама управляет только своими firewall rules с тегом `WR_WEBUI_RELAY`. + +Что можно делать из UI: + +- выбрать endpoint: `engage.cloudflareclient.com`, IPv4 или свой hostname; +- выбрать source IP сервера или оставить автоопределение; +- включить single UDP port, обычно `4500 -> 4500`; +- включить Cloudflare multiport mode; +- удалить только managed relay rules. + +Важно: relay не гарантирует конкретный Cloudflare exit IP или страну. Он меняет WARP/WireGuard endpoint, через который клиент подключается. Для "желаемой точки" сейчас используйте ручной endpoint/IP; автоматический список точек и latency probe запланированы. + ## Безопасность - **Только HTTP Basic Auth** — учётные данные передаются с каждым запросом. В продакшене ставьте **HTTPS** (обратный прокси: nginx, Caddy + TLS). @@ -112,8 +144,10 @@ install.sh / uninstall.sh # Установка и снятие «в одн |-------|------|----------| | GET | `/` | HTML-интерфейс | | GET | `/status`, `/registration`, `/proxy`, `/logs` | Статус и диагностика | +| GET | `/relay` | Статус WARP Relay beta | | POST | `/connect`, `/disconnect`, `/restart` | Управление WARP | | POST | `/warp-install`, `/warp-uninstall` | Установка/удаление пакета | +| POST | `/relay-apply`, `/relay-remove` | Применить/удалить WARP Relay rules | | POST | `/proxy-port`, `/license` | Порт SOCKS, ключ WARP+ | | POST | `/xui-preset`, `/amnezia-preset`, `/amnezia-routing` | Пресеты интеграций | diff --git a/app.py b/app.py index 8036f33..dc23279 100755 --- a/app.py +++ b/app.py @@ -1142,7 +1142,8 @@ function setMsg(id, text, ok=null) { n.className = 'msg ' + (ok === true ? 'ok' : ok === false ? 'bad' : 'muted'); } async function api(path, opts={}) { - const res = await fetch(path, { cache: 'no-store', ...opts }); + const url = new URL(path, window.location.origin); + const res = await fetch(url, { cache: 'no-store', ...opts }); const ct = res.headers.get('content-type') || ''; const body = ct.includes('application/json') ? await res.json() : await res.text(); if (!res.ok) throw new Error(typeof body === 'string' ? body : JSON.stringify(body)); diff --git a/docs/images/dashboard.png b/docs/images/dashboard.png new file mode 100644 index 0000000..1b02996 Binary files /dev/null and b/docs/images/dashboard.png differ diff --git a/docs/images/warp-relay-beta.png b/docs/images/warp-relay-beta.png new file mode 100644 index 0000000..906a005 Binary files /dev/null and b/docs/images/warp-relay-beta.png differ diff --git a/uninstall.sh b/uninstall.sh index 05def1d..ea22071 100755 --- a/uninstall.sh +++ b/uninstall.sh @@ -7,6 +7,7 @@ ENV_FILE="/etc/default/warp-webui" SERVICE_NAME="warp-webui" UNIT="/etc/systemd/system/${SERVICE_NAME}.service" BRIDGE_UNIT="/etc/systemd/system/warp-socks-bridge.service" +RELAY_TAG="${WARP_RELAY_RULE_TAG:-WR_WEBUI_RELAY}" if [[ "${EUID:-0}" -ne 0 ]]; then echo "Запустите от root: sudo bash uninstall.sh" @@ -15,6 +16,40 @@ fi echo "=== Удаление WARP Web UI ===" +clean_relay_nftables() { + command -v nft >/dev/null 2>&1 || return 0 + nft -a list ruleset 2>/dev/null | awk -v tag="comment \""${RELAY_TAG}"\"" ' + /^table / { family=$2; table=$3 } + /^[[:space:]]*chain / { chain=$2 } + index($0, tag) && match($0, /# handle [0-9]+/) { + handle=substr($0, RSTART + 9, RLENGTH - 9) + print family, table, chain, handle + } + ' | while read -r family table chain handle; do + nft delete rule "${family}" "${table}" "${chain}" handle "${handle}" 2>/dev/null || true + done + nft delete set ip nat wr_webui_relay_ports 2>/dev/null || true + nft delete set ip filter wr_webui_relay_ports 2>/dev/null || true + nft list ruleset > /etc/nftables.conf 2>/dev/null || true +} + +clean_relay_iptables() { + command -v iptables >/dev/null 2>&1 || return 0 + iptables -t nat -S 2>/dev/null | grep "${RELAY_TAG}" | sed 's/^-A/-D/' | while read -r rule; do + eval iptables -t nat "$rule" 2>/dev/null || true + done + iptables -S 2>/dev/null | grep "${RELAY_TAG}" | sed 's/^-A/-D/' | while read -r rule; do + eval iptables "$rule" 2>/dev/null || true + done + if command -v netfilter-persistent >/dev/null 2>&1; then + netfilter-persistent save 2>/dev/null || true + fi +} + +echo "Удаляем managed WARP Relay rules (${RELAY_TAG})..." +clean_relay_nftables +clean_relay_iptables + if systemctl is-active --quiet "${SERVICE_NAME}.service" 2>/dev/null; then systemctl stop "${SERVICE_NAME}.service" fi