diff --git a/README.md b/README.md index 1f15435..95f21e9 100644 --- a/README.md +++ b/README.md @@ -5,4 +5,58 @@ Профиль https://www.codewars.com/users/krotname -Для запуска в IntelliJ IDEA нажать правой кнопкой на src/main/java и Run 'All Tests' \ No newline at end of file +Для запуска в IntelliJ IDEA нажать правой кнопкой на src/main/java и Run 'All Tests' + +## Amnezia WireGuard proxy in Docker Compose + +Добавлен `docker-compose.yml`, который поднимает: +- WireGuard-клиент с подключением к существующему серверу Amnezia. +- Proxy-сервис (3proxy), работающий через VPN-туннель. +- Опционально `v2ray-server` (профиль `v2ray`) в том же network namespace, что и WireGuard. + +Логи отключены для контейнеров через `logging.driver: "none"`. + +### Конфиги сервера +- `wireguard/wg_confs/wg0.conf` — WireGuard-конфигурация клиента. +- `proxy/3proxy.cfg` — прокси с авторизацией. +- `v2ray/server-config.json` — конфиг V2Ray-сервера (VMess + WS). + +### Сгенерированные доступы +- Proxy user: `proxy_9b93b2` +- Proxy password: `DTvWPDSk6UeD3HGXiji7` +- V2Ray UUID #1: `229545ae-a4b5-4fd6-8146-77c3f3267bce` +- V2Ray UUID #2: `ad1ead97-6a7c-433d-9b53-03d7d881f510` + +### Доступ к сервисам +- SOCKS5 (3proxy): `127.0.0.1:1080` +- HTTP (3proxy): `127.0.0.1:3128` +- V2Ray VMess+WS: `127.0.0.1:10000` + +Перед запуском обязательно замените шаблонные значения: +- `REPLACE_WITH_*` в `wireguard/wg_confs/wg0.conf` +- `YOUR_SERVER_IP` в клиентских файлах + +### Конфиги клиента для подключения к этому серверу +- `client/proxy.env.example` — переменные окружения для `curl`, `wget`, CLI и приложений, которые читают `HTTP_PROXY/HTTPS_PROXY/ALL_PROXY`. +- `client/proxychains.conf` — готовый конфиг для `proxychains` (SOCKS5 + логин/пароль). +- `client/v2ray-client.example.json` — пример клиента для V2Ray UUID #1. +- `client/v2ray-client-2.example.json` — пример клиента для V2Ray UUID #2. + +Перед использованием замените `YOUR_SERVER_IP` на реальный IP/домен сервера. + +### Проверка конфигов +```bash +./scripts/validate.sh +``` + +Скрипт проверяет YAML/JSON синтаксис, наличие обязательных файлов и запускает `docker compose config`, если Docker доступен в системе. + +### Запуск +```bash +docker compose up -d +``` + +### Запуск с V2Ray сервером +```bash +docker compose --profile v2ray up -d +``` diff --git a/client/proxy.env.example b/client/proxy.env.example new file mode 100644 index 0000000..f4a814b --- /dev/null +++ b/client/proxy.env.example @@ -0,0 +1,11 @@ +# Замените PROXY_HOST на IP/домен хоста, где запущен docker-compose +PROXY_HOST=YOUR_SERVER_IP +PROXY_USER=proxy_9b93b2 +PROXY_PASS=DTvWPDSk6UeD3HGXiji7 + +# HTTP/HTTPS через 3proxy +HTTP_PROXY=http://${PROXY_USER}:${PROXY_PASS}@${PROXY_HOST}:3128 +HTTPS_PROXY=http://${PROXY_USER}:${PROXY_PASS}@${PROXY_HOST}:3128 + +# SOCKS5 через 3proxy +ALL_PROXY=socks5://${PROXY_USER}:${PROXY_PASS}@${PROXY_HOST}:1080 diff --git a/client/proxychains.conf b/client/proxychains.conf new file mode 100644 index 0000000..3673da7 --- /dev/null +++ b/client/proxychains.conf @@ -0,0 +1,9 @@ +strict_chain +proxy_dns +remote_dns_subnet 224 +tcp_read_time_out 15000 +tcp_connect_time_out 8000 + +[ProxyList] +# type host port user pass +socks5 YOUR_SERVER_IP 1080 proxy_9b93b2 DTvWPDSk6UeD3HGXiji7 diff --git a/client/v2ray-client-2.example.json b/client/v2ray-client-2.example.json new file mode 100644 index 0000000..4e637e5 --- /dev/null +++ b/client/v2ray-client-2.example.json @@ -0,0 +1,43 @@ +{ + "log": { + "access": "none", + "error": "none", + "loglevel": "warning" + }, + "inbounds": [ + { + "port": 10808, + "listen": "127.0.0.1", + "protocol": "socks", + "settings": { + "udp": true + } + } + ], + "outbounds": [ + { + "protocol": "vmess", + "settings": { + "vnext": [ + { + "address": "YOUR_SERVER_IP", + "port": 10000, + "users": [ + { + "id": "ad1ead97-6a7c-433d-9b53-03d7d881f510", + "alterId": 0, + "security": "auto" + } + ] + } + ] + }, + "streamSettings": { + "network": "ws", + "wsSettings": { + "path": "/ray" + } + } + } + ] +} diff --git a/client/v2ray-client.example.json b/client/v2ray-client.example.json new file mode 100644 index 0000000..997a9f3 --- /dev/null +++ b/client/v2ray-client.example.json @@ -0,0 +1,43 @@ +{ + "log": { + "access": "none", + "error": "none", + "loglevel": "warning" + }, + "inbounds": [ + { + "port": 10808, + "listen": "127.0.0.1", + "protocol": "socks", + "settings": { + "udp": true + } + } + ], + "outbounds": [ + { + "protocol": "vmess", + "settings": { + "vnext": [ + { + "address": "YOUR_SERVER_IP", + "port": 10000, + "users": [ + { + "id": "229545ae-a4b5-4fd6-8146-77c3f3267bce", + "alterId": 0, + "security": "auto" + } + ] + } + ] + }, + "streamSettings": { + "network": "ws", + "wsSettings": { + "path": "/ray" + } + } + } + ] +} diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..2c6a1d5 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,51 @@ +version: "3.9" + +services: + wireguard: + image: lscr.io/linuxserver/wireguard:latest + container_name: amnezia-wireguard-client + cap_add: + - NET_ADMIN + - SYS_MODULE + environment: + - PUID=1000 + - PGID=1000 + - TZ=UTC + volumes: + - ./wireguard:/config + - /lib/modules:/lib/modules:ro + sysctls: + - net.ipv4.conf.all.src_valid_mark=1 + restart: unless-stopped + ports: + - "1080:1080" # SOCKS5 proxy (with auth) + - "3128:3128" # HTTP proxy (with auth) + - "10000:10000" # V2Ray VMess + WS + logging: + driver: "none" + + proxy: + image: ghcr.io/tarampampam/3proxy:latest + container_name: amnezia-proxy + depends_on: + - wireguard + network_mode: "service:wireguard" + restart: unless-stopped + volumes: + - ./proxy/3proxy.cfg:/etc/3proxy/3proxy.cfg:ro + logging: + driver: "none" + + v2ray-server: + image: v2fly/v2fly-core:latest + container_name: v2ray-server + command: ["run", "-c", "/etc/v2ray/config.json"] + depends_on: + - wireguard + network_mode: "service:wireguard" + restart: unless-stopped + profiles: ["v2ray"] + volumes: + - ./v2ray/server-config.json:/etc/v2ray/config.json:ro + logging: + driver: "none" diff --git a/proxy/3proxy.cfg b/proxy/3proxy.cfg new file mode 100644 index 0000000..bd12132 --- /dev/null +++ b/proxy/3proxy.cfg @@ -0,0 +1,13 @@ +log /dev/null D +nserver 1.1.1.1 +nserver 1.0.0.1 +nscache 65536 +timeouts 1 5 30 60 180 1800 15 60 + +users proxy_9b93b2:CL:DTvWPDSk6UeD3HGXiji7 +auth strong +allow proxy_9b93b2 + +socks -p1080 +proxy -p3128 +flush diff --git a/scripts/validate.sh b/scripts/validate.sh new file mode 100755 index 0000000..6df7560 --- /dev/null +++ b/scripts/validate.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +cd "$ROOT_DIR" + +echo "[1/4] Validate docker-compose YAML syntax" +ruby -e 'require "yaml"; YAML.load_file("docker-compose.yml"); puts "docker-compose.yml: OK"' + +echo "[2/4] Validate JSON configs" +python - <<'PY' +import json +from pathlib import Path + +files = [ + 'v2ray/server-config.json', + 'client/v2ray-client.example.json', + 'client/v2ray-client-2.example.json', +] + +for f in files: + json.loads(Path(f).read_text(encoding='utf-8')) + print(f"{f}: OK") +PY + +echo "[3/4] Check required config files exist" +required=( + "docker-compose.yml" + "wireguard/wg_confs/wg0.conf" + "proxy/3proxy.cfg" + "v2ray/server-config.json" + "client/proxy.env.example" + "client/proxychains.conf" + "client/v2ray-client.example.json" + "client/v2ray-client-2.example.json" +) + +for file in "${required[@]}"; do + if [[ ! -f "$file" ]]; then + echo "Missing file: $file" >&2 + exit 1 + fi + echo "$file: OK" +done + +echo "[4/4] Docker Compose semantic validation (if docker exists)" +if command -v docker >/dev/null 2>&1; then + docker compose config >/dev/null + echo "docker compose config: OK" +else + echo "docker not found: skip docker compose config" +fi + +echo "Validation completed" diff --git a/v2ray/server-config.json b/v2ray/server-config.json new file mode 100644 index 0000000..4ae3e24 --- /dev/null +++ b/v2ray/server-config.json @@ -0,0 +1,37 @@ +{ + "log": { + "access": "none", + "error": "none", + "loglevel": "warning" + }, + "inbounds": [ + { + "port": 10000, + "protocol": "vmess", + "settings": { + "clients": [ + { + "id": "229545ae-a4b5-4fd6-8146-77c3f3267bce", + "alterId": 0 + }, + { + "id": "ad1ead97-6a7c-433d-9b53-03d7d881f510", + "alterId": 0 + } + ] + }, + "streamSettings": { + "network": "ws", + "wsSettings": { + "path": "/ray" + } + } + } + ], + "outbounds": [ + { + "protocol": "freedom", + "settings": {} + } + ] +} diff --git a/wireguard/wg_confs/wg0.conf b/wireguard/wg_confs/wg0.conf new file mode 100644 index 0000000..19eb3ae --- /dev/null +++ b/wireguard/wg_confs/wg0.conf @@ -0,0 +1,11 @@ +[Interface] +Address = 10.8.1.20/32 +DNS = 172.29.172.254, 1.0.0.1 +PrivateKey = REPLACE_WITH_PRIVATE_KEY + +[Peer] +PublicKey = REPLACE_WITH_SERVER_PUBLIC_KEY +PresharedKey = REPLACE_WITH_PRESHARED_KEY +AllowedIPs = 0.0.0.0/0, ::/0 +Endpoint = REPLACE_WITH_ENDPOINT_HOST:REPLACE_WITH_ENDPOINT_PORT +PersistentKeepalive = 25