commit 3fd6614a415956890ad1b9f572d7ec0e0ce543ff Author: Jahlib Date: Mon Dec 15 16:48:44 2025 +0300 init commit diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..9abd19c --- /dev/null +++ b/Dockerfile @@ -0,0 +1,27 @@ +FROM alpine:latest + +# Install required packages +RUN apk add --no-cache wget tar ca-certificates + +# Set working directory +WORKDIR /app + +# Download and extract sing-box +RUN wget https://github.com/shtorm-7/sing-box-extended/releases/download/v1.12.12-extended-1.5.1/sing-box-1.12.12-extended-1.5.1-linux-amd64.tar.gz && \ + tar -xzf sing-box-1.12.12-extended-1.5.1-linux-amd64.tar.gz && \ + mv sing-box-1.12.12-extended-1.5.1-linux-amd64/sing-box /usr/local/bin/sing-box && \ + chmod +x /usr/local/bin/sing-box && \ + rm -rf sing-box-1.12.12-extended-1.5.1-linux-amd64.tar.gz sing-box-1.12.12-extended-1.5.1-linux-amd64 + +# Copy configuration generator script +COPY generate-config.sh /app/generate-config.sh +RUN chmod +x /app/generate-config.sh + +# Copy warp configuration +COPY warp.conf /app/warp.conf + +# Expose SOCKS5 proxy port +EXPOSE 2080 + +# Generate config and run sing-box +CMD ["/bin/sh", "-c", "/app/generate-config.sh && sing-box run -c /app/config.json"] diff --git a/README.md b/README.md new file mode 100644 index 0000000..1e1f69a --- /dev/null +++ b/README.md @@ -0,0 +1,51 @@ +# Sing-Box WARP Docker Project + +Docker проект для запуска sing-box с WARP конфигурацией. + +## Структура проекта + +- `Dockerfile` - образ с sing-box +- `docker-compose.yml` - оркестрация контейнера +- `generate-config.sh` - генератор конфига из wg:// URL +- `warp.conf` - WARP ключ в формате wg:// URL + +## Как это работает + +1. Положите ваш WARP ключ в формат `wg://` URL в файл `warp.conf` +2. При запуске контейнера `generate-config.sh` парсит ключ и генерирует `config.json` +3. SOCKS5 прокси поднимается на порту 2080 + +## Формат warp.conf + +``` +wg://SERVER:PORT?private_key=...&junk_packet_count=4&junk_packet_min_size=40&...#WARP +``` + +## Запуск + +```bash +# Собрать и запустить +docker-compose up -d + +# Просмотр логов +docker-compose logs -f + +# Остановить +docker-compose down +``` + +## Использование + +SOCKS5 прокси доступен на `localhost:2080` без авторизации. + +Пример использования: +```bash +curl --proxy socks5://localhost:2080 https://ifconfig.me +``` + +## Обновление конфигурации + +После изменения `config.json`: +```bash +docker-compose restart +``` diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..70733e6 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,26 @@ +version: '3.8' + +services: + sing-box: + build: . + container_name: sing-box-warp + restart: unless-stopped + ports: + - "2080:2080" + cap_add: + - NET_ADMIN + sysctls: + - net.ipv4.conf.all.src_valid_mark=1 + - net.ipv6.conf.all.disable_ipv6=0 + volumes: + - ./warp.conf:/app/warp.conf:ro + - warp-cache:/app/.cache + networks: + - sing-box-network + +volumes: + warp-cache: + +networks: + sing-box-network: + driver: bridge diff --git a/generate-config.sh b/generate-config.sh new file mode 100644 index 0000000..df04601 --- /dev/null +++ b/generate-config.sh @@ -0,0 +1,160 @@ +#!/bin/sh + +WARP_CONF="/app/warp.conf" +OUTPUT_CONFIG="/app/config.json" + +# URL decode function - only decode %3D to = for base64 +urldecode() { + echo "$1" | sed 's/%3D/=/g; s/%2B/+/g; s/%2F/\//g' +} + +# Extract parameter from URL +get_param() { + local url="$1" + local param="$2" + echo "$url" | sed -n "s/.*[?&]${param}=\([^&#]*\).*/\1/p" +} + +# Parse warp.conf +parse_warp_conf() { + # Read the wg:// URL from file + WG_URL=$(grep "^wg://" "$WARP_CONF" | head -1) + + if [ -z "$WG_URL" ]; then + echo "Error: No wg:// URL found in $WARP_CONF" + exit 1 + fi + + # Extract server and port from wg://SERVER:PORT?... + SERVER=$(echo "$WG_URL" | sed 's|wg://\([^:]*\):.*|\1|') + PORT=$(echo "$WG_URL" | sed 's|wg://[^:]*:\([0-9]*\)?.*|\1|') + + # Extract parameters + PRIVATE_KEY=$(urldecode "$(get_param "$WG_URL" "private_key")") + PUBLIC_KEY=$(urldecode "$(get_param "$WG_URL" "peer_public_key")") + RESERVED=$(get_param "$WG_URL" "reserved") + MTU=$(get_param "$WG_URL" "mtu") + LOCAL_ADDRESS=$(get_param "$WG_URL" "local_address") + + # Amnezia parameters + Jc=$(get_param "$WG_URL" "junk_packet_count") + Jmin=$(get_param "$WG_URL" "junk_packet_min_size") + Jmax=$(get_param "$WG_URL" "junk_packet_max_size") + H1=$(get_param "$WG_URL" "init_packet_magic_header") + H2=$(get_param "$WG_URL" "response_packet_magic_header") + H3=$(get_param "$WG_URL" "underload_packet_magic_header") + H4=$(get_param "$WG_URL" "transport_packet_magic_header") + INIT_JUNK=$(get_param "$WG_URL" "init_packet_junk_size") + RESP_JUNK=$(get_param "$WG_URL" "response_packet_junk_size") + + # Parse reserved (format: 131-184-249) + S1=$(echo "$RESERVED" | cut -d'-' -f1) + S2=$(echo "$RESERVED" | cut -d'-' -f2) + S3=$(echo "$RESERVED" | cut -d'-' -f3) + + # Parse local addresses (format: 172.16.0.2/32-2606:4700:110:8b6d:3808:7d65:ef2f:cc5d/128) + IPV4=$(echo "$LOCAL_ADDRESS" | cut -d'-' -f1) + IPV6=$(echo "$LOCAL_ADDRESS" | cut -d'-' -f2-) + + # Set defaults if empty + MTU=${MTU:-1280} + Jc=${Jc:-4} + Jmin=${Jmin:-40} + Jmax=${Jmax:-70} + H1=${H1:-1} + H2=${H2:-2} + H3=${H3:-3} + H4=${H4:-4} + INIT_JUNK=${INIT_JUNK:-0} + RESP_JUNK=${RESP_JUNK:-0} + S1=${S1:-0} + S2=${S2:-0} + S3=${S3:-0} + + # Debug output + echo "Parsed values:" + echo "SERVER: $SERVER:$PORT" + echo "PRIVATE_KEY: ${PRIVATE_KEY:0:20}..." + echo "PUBLIC_KEY: ${PUBLIC_KEY:0:20}..." + echo "RESERVED: [$S1, $S2, $S3]" + echo "LOCAL_ADDRESS: $IPV4, $IPV6" + echo "MTU: $MTU" + echo "Amnezia: jc=$Jc, jmin=$Jmin, jmax=$Jmax, h1=$H1, h2=$H2, h3=$H3, h4=$H4" + + # Generate config.json + cat > "$OUTPUT_CONFIG" <