# Phantom SOCKS5 Proxy Dockerfile # Создает контейнер с SOCKS5 прокси через Phantom сеть FROM ubuntu:22.04 LABEL maintainer="Phantom Protocol Team" LABEL description="SOCKS5 Proxy через Phantom сеть" LABEL version="1.0.0" # Установка зависимостей RUN apt-get update && apt-get install -y \ python3 \ python3-pip \ netcat-openbsd \ curl \ iproute2 \ iptables \ && rm -rf /var/lib/apt/lists/* # Создание пользователя phantom RUN useradd -r -s /bin/false phantom # Копирование исходного кода COPY src/ /usr/local/src/phantom/ COPY tools/ /usr/local/bin/ COPY examples/socks5-proxy.py /usr/local/bin/phantom-socks5-proxy # Установка Python зависимостей RUN pip3 install --no-cache-dir \ asyncio \ aiohttp \ cryptography \ pysocks # Создание директорий RUN mkdir -p /var/lib/phantom /var/log/phantom /etc/phantom # Копирование конфигурационных файлов COPY docker/configs/socks5-proxy.conf /etc/phantom/ COPY docker/scripts/socks5-entrypoint.sh /usr/local/bin/ # Установка прав RUN chmod +x /usr/local/bin/phantom-socks5-proxy \ && chmod +x /usr/local/bin/socks5-entrypoint.sh \ && chown -R phantom:phantom /var/lib/phantom /var/log/phantom # Создание конфигурационного файла RUN cat > /etc/phantom/socks5-proxy.conf << 'EOF' # Phantom SOCKS5 Proxy Configuration [phantom] # Узлы для подключения к Phantom сети bootstrap_nodes = ${PHANTOM_BOOTSTRAP_NODES:-127.0.0.1:8050} # Количество хопов через Phantom сеть hops = ${PHANTOM_HOPS:-3} # Логирование log_level = ${PHANTOM_LOG_LEVEL:-INFO} log_file = /var/log/phantom/socks5-proxy.log [socks5] # Адрес и порт для прослушивания listen_host = ${SOCKS5_LISTEN_HOST:-0.0.0.0} listen_port = ${SOCKS5_LISTEN_PORT:-8080} # Максимальное количество подключений max_connections = ${SOCKS5_MAX_CONNECTIONS:-100} # Таймаут подключения (секунды) connection_timeout = ${SOCKS5_CONNECTION_TIMEOUT:-30} # Буферизация данных buffer_size = ${SOCKS5_BUFFER_SIZE:-8192} [security] # Разрешенные клиенты (IP адреса или подсети) allowed_clients = ${SOCKS5_ALLOWED_CLIENTS:-0.0.0.0/0} # Запрещенные адреса назначения blocked_destinations = ${SOCKS5_BLOCKED_DESTINATIONS:-} # Аутентификация (none, password) auth_method = ${SOCKS5_AUTH_METHOD:-none} [performance] # Оптимизация производительности tcp_nodelay = ${SOCKS5_TCP_NODELAY:-true} tcp_keepalive = ${SOCKS5_TCP_KEEPALIVE:-true} reuse_address = ${SOCKS5_REUSE_ADDRESS:-true} EOF # Создание скрипта entrypoint RUN cat > /usr/local/bin/socks5-entrypoint.sh << 'EOF' #!/bin/bash set -e echo "🚀 Запуск Phantom SOCKS5 Proxy" # Замена переменных окружения в конфигурации envsubst < /etc/phantom/socks5-proxy.conf > /tmp/socks5-proxy.conf mv /tmp/socks5-proxy.conf /etc/phantom/socks5-proxy.conf # Ожидание доступности Phantom узлов echo "⏳ Ожидание доступности Phantom сети..." IFS=',' read -ra NODES <<< "${PHANTOM_BOOTSTRAP_NODES:-127.0.0.1:8050}" for node in "${NODES[@]}"; do IFS=':' read -ra ADDR <<< "$node" host=${ADDR[0]} port=${ADDR[1]:-8050} echo "Проверка узла $host:$port..." timeout=60 while ! nc -z "$host" "$port" && [ $timeout -gt 0 ]; do sleep 1 timeout=$((timeout-1)) done if [ $timeout -eq 0 ]; then echo "❌ Не удалось подключиться к узлу $host:$port" exit 1 fi echo "✅ Узел $host:$port доступен" done # Создание лог файла touch /var/log/phantom/socks5-proxy.log chown phantom:phantom /var/log/phantom/socks5-proxy.log echo "✅ Phantom SOCKS5 Proxy готов к запуску" echo " Прослушивание: ${SOCKS5_LISTEN_HOST:-0.0.0.0}:${SOCKS5_LISTEN_PORT:-8080}" echo " Хопов через Phantom: ${PHANTOM_HOPS:-3}" echo " Bootstrap узлы: ${PHANTOM_BOOTSTRAP_NODES:-127.0.0.1:8050}" # Запуск SOCKS5 прокси exec su-exec phantom python3 /usr/local/bin/phantom-socks5-proxy \ --host "${SOCKS5_LISTEN_HOST:-0.0.0.0}" \ --port "${SOCKS5_LISTEN_PORT:-8080}" \ --hops "${PHANTOM_HOPS:-3}" \ --verbose EOF # Установка su-exec для безопасного переключения пользователя RUN apt-get update && apt-get install -y su-exec && rm -rf /var/lib/apt/lists/* # Создание health check скрипта RUN cat > /usr/local/bin/socks5-health-check << 'EOF' #!/bin/bash # Health check для SOCKS5 прокси # Проверка, что процесс запущен if ! pgrep -f "phantom-socks5-proxy" > /dev/null; then echo "SOCKS5 прокси не запущен" exit 1 fi # Проверка, что порт прослушивается port=${SOCKS5_LISTEN_PORT:-8080} if ! nc -z localhost "$port"; then echo "SOCKS5 порт $port не доступен" exit 1 fi # Проверка подключения к Phantom сети if ! timeout 5 python3 -c " import socket import sys try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(5) bootstrap_nodes = '${PHANTOM_BOOTSTRAP_NODES:-127.0.0.1:8050}'.split(',') for node in bootstrap_nodes: host, port = node.split(':') s.connect((host.strip(), int(port.strip()))) s.close() break else: sys.exit(1) except: sys.exit(1) "; then echo "Phantom сеть недоступна" exit 1 fi echo "SOCKS5 прокси работает нормально" exit 0 EOF RUN chmod +x /usr/local/bin/socks5-health-check # Создание тестового скрипта RUN cat > /usr/local/bin/test-socks5-proxy << 'EOF' #!/bin/bash # Тестирование SOCKS5 прокси echo "🧪 Тестирование Phantom SOCKS5 Proxy" proxy_host=${SOCKS5_LISTEN_HOST:-127.0.0.1} proxy_port=${SOCKS5_LISTEN_PORT:-8080} echo "Прокси: $proxy_host:$proxy_port" # Тест 1: Проверка доступности прокси echo "Тест 1: Проверка доступности прокси..." if nc -z "$proxy_host" "$proxy_port"; then echo "✅ Прокси доступен" else echo "❌ Прокси недоступен" exit 1 fi # Тест 2: Проверка SOCKS5 handshake echo "Тест 2: Проверка SOCKS5 handshake..." if timeout 10 python3 -c " import socket import struct try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(10) s.connect(('$proxy_host', $proxy_port)) # SOCKS5 authentication request s.send(b'\x05\x01\x00') # Receive authentication response response = s.recv(2) if response == b'\x05\x00': print('SOCKS5 handshake успешен') else: print('SOCKS5 handshake неудачен') exit(1) s.close() except Exception as e: print(f'Ошибка SOCKS5 handshake: {e}') exit(1) "; then echo "✅ SOCKS5 handshake успешен" else echo "❌ SOCKS5 handshake неудачен" exit 1 fi # Тест 3: Проверка проксирования HTTP запроса echo "Тест 3: Проверка проксирования HTTP запроса..." if command -v curl > /dev/null; then if timeout 30 curl -s --socks5 "$proxy_host:$proxy_port" http://httpbin.org/ip > /dev/null; then echo "✅ HTTP проксирование работает" else echo "⚠️ HTTP проксирование не работает (возможно, нет интернета)" fi else echo "⚠️ curl не установлен, пропуск HTTP теста" fi echo "🎉 Тестирование завершено" EOF RUN chmod +x /usr/local/bin/test-socks5-proxy # Открытие портов EXPOSE 8080 # Переменные окружения по умолчанию ENV PHANTOM_BOOTSTRAP_NODES=127.0.0.1:8050 ENV PHANTOM_HOPS=3 ENV PHANTOM_LOG_LEVEL=INFO ENV SOCKS5_LISTEN_HOST=0.0.0.0 ENV SOCKS5_LISTEN_PORT=8080 ENV SOCKS5_MAX_CONNECTIONS=100 ENV SOCKS5_CONNECTION_TIMEOUT=30 # Health check HEALTHCHECK --interval=30s --timeout=10s --start-period=10s --retries=3 \ CMD /usr/local/bin/socks5-health-check # Рабочая директория WORKDIR /var/lib/phantom # Точка входа ENTRYPOINT ["/usr/local/bin/socks5-entrypoint.sh"] # Метаданные LABEL org.opencontainers.image.title="Phantom SOCKS5 Proxy" LABEL org.opencontainers.image.description="SOCKS5 прокси сервер через Phantom анонимную сеть" LABEL org.opencontainers.image.version="1.0.0" LABEL org.opencontainers.image.authors="Phantom Protocol Team" LABEL org.opencontainers.image.url="https://phantom-protocol.org" LABEL org.opencontainers.image.source="https://github.com/phantom-protocol/phantom" LABEL org.opencontainers.image.licenses="MIT"