diff --git a/README.md b/README.md index 3b14cac..c5028ba 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # Sing-Box WARP Project (Additional Proton out) > Author remark: -> вы спросите - нахуя такие сложности? А потому что нативный warp не поддерживает amneziaWG ключи для обфускации WireGuard. А ебаться в саму амнезию нет желания. К тому же sing-box сразу может поднять локальный сокс что упрощает просовывание этого варпа во всякого рода панели. -> UPD: Теперь в рф захотели блокировать github и появилась проблема установки панелей. Данное решение покрывает проблемы со скачиванием любых репозиториев или иного self-host софта с github и попутно покрывает ряд других блокнутых ресурсов при включении TUN во время установки. -> Список ресурсов будет дополняться. +>> вы спросите - нахуя такие сложности? А потому что нативный warp не поддерживает amneziaWG ключи для обфускации WireGuard. А ебаться в саму амнезию нет желания. К тому же sing-box сразу может поднять локальный сокс что упрощает просовывание этого варпа во всякого рода панели. +>> UPD: Теперь в рф захотели блокировать github и появилась проблема установки панелей. Данное решение покрывает проблемы со скачиванием любых репозиториев или иного self-host софта с github и попутно покрывает ряд других блокнутых ресурсов при включении TUN во время установки. +>> UPD: Добавлена поддержка ProtonVPN конфигураций совместно с warp или отдельно. Проект для запуска sing-box с WARP через systemd. @@ -10,27 +10,29 @@ ## Структура проекта - `quick-install.sh` — установка и настройка systemd-сервиса -- `generate-config.sh` — генератор `config.json` из WireGuard AWG3.0 +- `generate-config.sh` — генератор `config.json` из WireGuard AWG - `warp.conf.example` — пример WARP-конфигурации - `proton.conf.example` — пример второй (Proton) WireGuard-конфигурации ## Как это работает -1. При установке вводится WARP-конфиг (AWG 3.0) → сохраняется в `/etc/sing-box-warp/warp.conf` -2. Опционально вводится второй конфиг (Proton VPN, обычный WireGuard или `wg://`) → `/etc/sing-box-warp/proton.conf` -3. `generate-config.sh` парсит конфиги и пишет `/opt/sing-box-warp/config.json` -4. SOCKS5 WARP доступен на порту `2080`; при добавлении Proton — второй SOCKS5 на `3080` +1. При установке отдельно спрашивается добавление WARP и добавление Proton — каждый опционален +2. WARP-конфиг (AWG 3.0) → `/etc/sing-box-warp/warp.conf`, Proton-конфиг (обычный WireGuard или `wg://`) → `/etc/sing-box-warp/proton.conf` +3. `generate-config.sh` парсит доступные конфиги и пишет `/opt/sing-box-warp/config.json` +4. SOCKS5 WARP доступен на порту `2080`, Proton — на `3080` (создаётся только тот, что добавлен) 5. Опционально TUN для сплит-маршрутизации ### Схема маршрутизации -Скрипт работает в двух режимах: **только WARP** или **WARP + Proton**. +Скрипт работает в трёх режимах: **только WARP**, **только Proton** или **WARP + Proton**. +Нужно выбрать хотя бы один — если отказаться от обоих, установка завершается без действий. - SOCKS-инпуты жёстко привязаны к своим выходам: `2080 → warp-out`, `3080 → proton-out`. + Каждый инпут создаётся только если соответствующий конфиг добавлен. - Всё остальное (TUN-трафик, списки маршрутизации `.srs`, сайты проверки IP, proxy-DNS) идёт в - «дефолтный» выход. Дефолт выбирается при установке: **WARP** или **Proton** (вопрос задаётся - только если Proton добавлен). -- Если Proton не добавлен — второй SOCKS-инпут (`3080`) и `proton-out` не создаются, дефолт всегда WARP. + «дефолтный» выход. + - Если добавлены **оба** — дефолт выбирается при установке: **WARP** или **Proton**. + - Если добавлен **только один** — он и становится дефолтом автоматически, вопрос не задаётся. ## Установка @@ -40,11 +42,17 @@ curl -fsSL https://gitea.digitalforest.my/hesoyam/sing-warp-socks5/raw/branch/main/quick-install.sh | sudo bash ``` -Вставьте текстом всё содержимое сгенерированного AWG конфига в терминал. Enter затем ctrl+D +Скрипт последовательно спросит про WARP и про Proton — можно добавить оба, только один или, +если отказаться от обоих, установка завершится без изменений. -Затем скрипт спросит про Proton. Брать протон тут https://account.protonvpn.com/downloads (Нужен аккаунт) -Ответьте `n`, чтобы оставить только WARP, или `y` и вставьте -второй WireGuard-конфиг (формат `[Interface]`/`[Peer]` как у Proton VPN, либо `wg://`), завершив ввод Ctrl+D. +Сначала — WARP. Ответьте `y` и вставьте текстом содержимое AWG-конфига (Enter, затем Ctrl+D), либо `n`, чтобы пропустить. + +``` +Add WARP configuration? (y/n) +``` + +Затем — Proton. Брать протон тут https://account.protonvpn.com/downloads (нужен аккаунт). +Ответьте `y` и вставьте WireGuard-конфиг (формат `[Interface]`/`[Peer]` как у Proton VPN, либо `wg://`, Ctrl+D для завершения), либо `n`, чтобы пропустить. ``` Add Proton configuration? (y/n) @@ -56,7 +64,8 @@ Add Proton configuration? (y/n) Enable TUN mode? (y/n) ``` -Если Proton добавлен — скрипт спросит, куда направлять весь не-SOCKS трафик (дефолтный выход). +Если добавлены **оба** конфига — скрипт спросит, куда направлять весь не-SOCKS трафик (дефолтный выход). +Если добавлен только один — он становится дефолтом автоматически, без вопроса. SOCKS-инпуты при этом всегда остаются: `2080 → WARP`, `3080 → Proton`. ``` @@ -113,10 +122,10 @@ PersistentKeepalive = 25 ## Использование -SOCKS5 без авторизации: +SOCKS5 без авторизации (создаётся только тот инпут, чей конфиг добавлен): - WARP — `localhost:2080` -- Proton (если добавлен) — `0.0.0.0:3080` +- Proton — `0.0.0.0:3080` ```bash curl --proxy socks5://localhost:2080 ip-api.com # через WARP @@ -141,12 +150,12 @@ sudo systemctl restart sing-box-warp ## Обновление конфигурации -Отредактируйте нужные файлы в `/etc/sing-box-warp/`: +Отредактируйте нужные файлы в `/etc/sing-box-warp/` (нужен хотя бы один из `warp.conf` / `proton.conf`): -- `warp.conf` — конфиг WARP +- `warp.conf` — конфиг WARP (удалите файл, чтобы отключить WARP) - `proton.conf` — конфиг Proton (удалите файл, чтобы отключить Proton) - `enable-tun` — `1`/`0` для TUN -- `default-route` — `warp` или `proton` (куда идёт весь не-SOCKS трафик) +- `default-route` — `warp` или `proton` (куда идёт весь не-SOCKS трафик; при одном эндпоинте берётся он) затем: diff --git a/generate-config.sh b/generate-config.sh index ed43952..4a540b0 100644 --- a/generate-config.sh +++ b/generate-config.sh @@ -372,11 +372,44 @@ parse_proton_conf() { ENABLE_PROTON=1 } +# Join non-empty JSON object strings with ",\n" separators (for arrays). +join_objects() { + local out="" + local item + for item in "$@"; do + [ -z "$item" ] && continue + if [ -z "$out" ]; then + out="$item" + else + out="$out, +$item" + fi + done + printf '%s' "$out" +} + write_config() { + LOG_LEVEL="${LOG_LEVEL:-error}" + + # SOCKS inbound tag for WARP. Kept as "mixed-in" in WARP-only mode for + # backwards compatibility, "warp-in" when Proton is present too. + if [ "$ENABLE_PROTON" = "1" ]; then + WARP_IN_TAG="warp-in" + else + WARP_IN_TAG="mixed-in" + fi + # Default outbound for everything that is not a hard SOCKS rule # (TUN rules, routing lists, IP-leak sites, proxy DNS). - # Proton can only be the default when it is actually enabled. - if [ "$DEFAULT_ROUTE" = "proton" ] && [ "$ENABLE_PROTON" = "1" ]; then + # With both endpoints the user's choice wins; otherwise the only + # available endpoint becomes the default. + if [ "$ENABLE_WARP" = "1" ] && [ "$ENABLE_PROTON" = "1" ]; then + if [ "$DEFAULT_ROUTE" = "proton" ]; then + DEFAULT_OUTBOUND="proton-out" + else + DEFAULT_OUTBOUND="warp-out" + fi + elif [ "$ENABLE_PROTON" = "1" ]; then DEFAULT_OUTBOUND="proton-out" else DEFAULT_OUTBOUND="warp-out" @@ -389,8 +422,7 @@ write_config() { EXCLUDE_IFACE="eth0" } echo "TUN enabled, exclude_interface: $EXCLUDE_IFACE" >&2 - TUN_INBOUND_PART=$(cat <&2 - TUN_INBOUND_PART="" + TUN_INBOUND_BODY="" TUN_ROUTE_RULE_PART="" RULE_SET_RULE_PART="" ROUTE_RULE_SET_SECTION="" fi - if [ "$ENABLE_PROTON" = "1" ]; then - echo "Proton enabled, adding proton-out endpoint and proton-in inbound (:3080)" >&2 - WARP_IN_TAG="warp-in" - PROTON_ENDPOINT_PART=$(cat <&2 - WARP_IN_TAG="mixed-in" - PROTON_ENDPOINT_PART="" - PROTON_INBOUND_PART="" - PROTON_ROUTE_RULE_PART="" - fi - + # --- AmneziaWG i1/i2 lines (WARP only) --- if [ -n "$I1" ] || [ -n "$I2" ]; then H4_COMMA="," else @@ -584,34 +565,10 @@ PROTONEOF I2_LINE="" fi - cat > "$OUTPUT_CONFIG" <&2 + WARP_ENDPOINT_BODY=$(cat <&2 + WARP_ENDPOINT_BODY="" + WARP_INBOUND_BODY="" + WARP_ROUTE_RULE="" + fi + + # --- Proton endpoint / inbound / route rule --- + if [ "$ENABLE_PROTON" = "1" ]; then + echo "Proton enabled, adding proton-out endpoint and proton-in inbound (:3080)" >&2 + PROTON_ENDPOINT_BODY=$(cat <&2 + PROTON_ENDPOINT_BODY="" + PROTON_INBOUND_BODY="" + PROTON_ROUTE_RULE="" + fi + + # --- Assemble dynamic arrays --- + ENDPOINTS_BODY=$(join_objects "$WARP_ENDPOINT_BODY" "$PROTON_ENDPOINT_BODY") + INBOUNDS_BODY=$(join_objects "$WARP_INBOUND_BODY" "$PROTON_INBOUND_BODY" "$TUN_INBOUND_BODY") + SOCKS_ROUTE_RULES=$(join_objects "$WARP_ROUTE_RULE" "$PROTON_ROUTE_RULE") + + cat > "$OUTPUT_CONFIG" <> https://warp-generator.github.io/ generater for AWG 3.0" +echo "WARP exposes a SOCKS5 proxy on port 2080." +read -p "Add WARP configuration? (y/n) " -n 1 -r < /dev/tty +echo +ENABLE_WARP=0 +WARP_INPUT="" +if [[ $REPLY =~ ^[Yy]$ ]]; then + echo "Paste your WARP config (wg://... or [Interface]/[Peer] INI)." + echo "Finish input with Ctrl-D." + WARP_INPUT=$(cat < /dev/tty) + if [ -z "$WARP_INPUT" ]; then + echo "WARP input is empty, skipping WARP configuration." + else + ENABLE_WARP=1 + fi +else + echo "Skipping WARP configuration." +fi + +echo "" +echo "=== Proton Configuration (optional) ===" +echo "Proton (second WireGuard endpoint) exposes a SOCKS5 proxy on port 3080." +read -p "Add Proton configuration? (y/n) " -n 1 -r < /dev/tty +echo +ENABLE_PROTON=0 +PROTON_INPUT="" +if [[ $REPLY =~ ^[Yy]$ ]]; then + echo "Paste your Proton config ([Interface]/[Peer] INI or wg://)." + echo "Finish input with Ctrl-D." + PROTON_INPUT=$(cat < /dev/tty) + if [ -z "$PROTON_INPUT" ]; then + echo "Proton input is empty, skipping Proton configuration." + else + ENABLE_PROTON=1 + fi +else + echo "Skipping Proton configuration." +fi + +if [ "$ENABLE_WARP" -eq 0 ] && [ "$ENABLE_PROTON" -eq 0 ]; then + echo "" + echo "Neither WARP nor Proton selected. Nothing to do, exiting." + exit 0 +fi + prepare_reinstall echo "Creating directories..." @@ -109,49 +156,24 @@ mkdir -p "$INSTALL_DIR" mkdir -p "$CONFIG_DIR" mkdir -p "$CACHE_DIR" -echo "" -echo "=== WARP Configuration ===" -echo "goto ->> https://warp-generator.github.io/ generater for AWG 3.0" -echo "Paste your WARP config (wg://... or [Interface]/[Peer] INI)." -echo "Finish input with Ctrl-D." -WARP_INPUT=$(cat < /dev/tty) - -if [ -z "$WARP_INPUT" ]; then - echo "Error: warp.conf input is empty!" - exit 1 +if [ "$ENABLE_WARP" -eq 1 ]; then + printf "%s\n" "$WARP_INPUT" > "$CONFIG_DIR/warp.conf" + echo "WARP configuration saved to $CONFIG_DIR/warp.conf" +else + rm -f "$CONFIG_DIR/warp.conf" fi -printf "%s\n" "$WARP_INPUT" > "$CONFIG_DIR/warp.conf" - -echo "" -echo "Configuration saved to $CONFIG_DIR/warp.conf" - -echo "" -echo "=== Proton Configuration (optional) ===" -echo "Adds a second WireGuard endpoint (e.g. Proton VPN) exposed as SOCKS5 on port 3080." -echo "The main WARP proxy stays on port 2080." -read -p "Add Proton configuration? (y/n) " -n 1 -r < /dev/tty -echo -if [[ $REPLY =~ ^[Yy]$ ]]; then - echo "Paste your Proton config ([Interface]/[Peer] INI or wg://)." - echo "Finish input with Ctrl-D." - PROTON_INPUT=$(cat < /dev/tty) - if [ -z "$PROTON_INPUT" ]; then - echo "Proton input is empty, skipping Proton configuration." - rm -f "$CONFIG_DIR/proton.conf" - else - printf "%s\n" "$PROTON_INPUT" > "$CONFIG_DIR/proton.conf" - echo "Proton configuration saved to $CONFIG_DIR/proton.conf" - fi +if [ "$ENABLE_PROTON" -eq 1 ]; then + printf "%s\n" "$PROTON_INPUT" > "$CONFIG_DIR/proton.conf" + echo "Proton configuration saved to $CONFIG_DIR/proton.conf" else rm -f "$CONFIG_DIR/proton.conf" - echo "Skipping Proton configuration." fi echo "" echo "=== TUN mode ===" echo "TUN routes system traffic through sing-box (needs CAP_NET_ADMIN)." -echo "Without TUN, only SOCKS5 proxy on port 2080 is available." +echo "Without TUN, only the SOCKS5 proxies are available." read -p "Enable TUN mode? (y/n) " -n 1 -r < /dev/tty echo if [[ $REPLY =~ ^[Yy]$ ]]; then @@ -164,8 +186,7 @@ else echo "TUN mode disabled (SOCKS5 only)." fi -DEFAULT_ROUTE="warp" -if [ -f "$CONFIG_DIR/proton.conf" ]; then +if [ "$ENABLE_WARP" -eq 1 ] && [ "$ENABLE_PROTON" -eq 1 ]; then echo "" echo "=== Default route ===" echo "Choose where all non-SOCKS traffic goes (TUN rules, routing lists, IP-leak sites)." @@ -181,6 +202,12 @@ if [ -f "$CONFIG_DIR/proton.conf" ]; then DEFAULT_ROUTE="warp" echo "Default route: WARP (warp-out)." fi +elif [ "$ENABLE_PROTON" -eq 1 ]; then + DEFAULT_ROUTE="proton" + echo "Default route: Proton (proton-out) — only endpoint." +else + DEFAULT_ROUTE="warp" + echo "Default route: WARP (warp-out) — only endpoint." fi echo "$DEFAULT_ROUTE" > "$CONFIG_DIR/default-route" @@ -310,7 +337,14 @@ echo " Start: sudo systemctl start sing-box-warp" echo " Status: sudo systemctl status sing-box-warp" echo " Logs: sudo journalctl -u sing-box-warp -f" echo "" -echo "SOCKS5 proxy: localhost:2080" +echo "SOCKS5 proxies:" +if [ "$ENABLE_WARP" -eq 1 ]; then + echo " WARP: localhost:2080" +fi +if [ "$ENABLE_PROTON" -eq 1 ]; then + echo " Proton: 0.0.0.0:3080" +fi +echo " Default route for non-SOCKS traffic: $DEFAULT_ROUTE" echo "" if [ "$REINSTALL" -eq 1 ]; then