295 lines
9.1 KiB
Docker
295 lines
9.1 KiB
Docker
# 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"
|
||
|