Files
Phantom/release/Dockerfile.socks5-proxy

295 lines
9.1 KiB
Docker
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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"