Files
Phantom/release/test-real-scenarios.sh

696 lines
27 KiB
Bash
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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.
#!/bin/bash
# Phantom Protocol - Тестирование реальных сценариев использования
# Этот скрипт демонстрирует практические примеры использования Phantom Protocol
set -e
# Цвета для вывода
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
# Функция для красивого вывода
print_header() {
echo -e "\n${BLUE}================================${NC}"
echo -e "${BLUE}$1${NC}"
echo -e "${BLUE}================================${NC}\n"
}
print_success() {
echo -e "${GREEN}$1${NC}"
}
print_error() {
echo -e "${RED}$1${NC}"
}
print_warning() {
echo -e "${YELLOW}⚠️ $1${NC}"
}
print_info() {
echo -e "${CYAN} $1${NC}"
}
# Проверка зависимостей
check_dependencies() {
print_header "Проверка зависимостей"
local deps=("docker" "docker-compose" "curl" "nc" "python3")
local missing_deps=()
for dep in "${deps[@]}"; do
if command -v "$dep" >/dev/null 2>&1; then
print_success "$dep установлен"
else
print_error "$dep не найден"
missing_deps+=("$dep")
fi
done
if [ ${#missing_deps[@]} -ne 0 ]; then
print_error "Отсутствуют зависимости: ${missing_deps[*]}"
print_info "Установите недостающие зависимости и повторите попытку"
exit 1
fi
print_success "Все зависимости установлены"
}
# Запуск базовой Phantom сети
start_phantom_network() {
print_header "Запуск базовой Phantom сети"
if docker-compose ps | grep -q "phantom-node"; then
print_warning "Phantom сеть уже запущена"
return 0
fi
print_info "Сборка Docker образов..."
docker-compose build --quiet
print_info "Запуск сети из 5 узлов..."
docker-compose up -d phantom-node-1 phantom-node-2 phantom-node-3 phantom-node-4 phantom-node-5
print_info "Ожидание инициализации сети (60 секунд)..."
sleep 60
# Проверка статуса узлов
local healthy_nodes=0
for i in {1..5}; do
if docker-compose ps phantom-node-$i | grep -q "Up"; then
healthy_nodes=$((healthy_nodes + 1))
print_success "Узел phantom-node-$i запущен"
else
print_error "Узел phantom-node-$i не запущен"
fi
done
if [ $healthy_nodes -ge 3 ]; then
print_success "Phantom сеть готова ($healthy_nodes/5 узлов активны)"
else
print_error "Недостаточно активных узлов для работы сети"
exit 1
fi
}
# Тест 1: SOCKS5 прокси
test_socks5_proxy() {
print_header "Тест 1: SOCKS5 прокси через Phantom"
print_info "Запуск SOCKS5 прокси контейнера..."
docker-compose up -d phantom-socks5-proxy
print_info "Ожидание готовности прокси (30 секунд)..."
sleep 30
# Проверка доступности прокси
if nc -z localhost 8080; then
print_success "SOCKS5 прокси доступен на порту 8080"
else
print_error "SOCKS5 прокси недоступен"
return 1
fi
# Тест проксирования HTTP запроса
print_info "Тестирование HTTP запроса через SOCKS5 прокси..."
# Получение IP без прокси
local direct_ip
direct_ip=$(curl -s --max-time 10 http://httpbin.org/ip | grep -o '"origin":"[^"]*' | cut -d'"' -f4)
# Получение IP через прокси
local proxy_ip
proxy_ip=$(curl -s --max-time 30 --socks5 localhost:8080 http://httpbin.org/ip | grep -o '"origin":"[^"]*' | cut -d'"' -f4)
if [ -n "$direct_ip" ] && [ -n "$proxy_ip" ]; then
print_info "IP без прокси: $direct_ip"
print_info "IP через Phantom прокси: $proxy_ip"
if [ "$direct_ip" != "$proxy_ip" ]; then
print_success "SOCKS5 прокси работает корректно (IP изменился)"
else
print_warning "IP не изменился, возможно прокси не работает"
fi
else
print_error "Не удалось получить IP адреса для сравнения"
fi
# Тест производительности
print_info "Тест производительности прокси..."
local start_time=$(date +%s%N)
curl -s --max-time 10 --socks5 localhost:8080 http://httpbin.org/get > /dev/null
local end_time=$(date +%s%N)
local duration=$(( (end_time - start_time) / 1000000 ))
print_info "Время ответа через прокси: ${duration}ms"
if [ $duration -lt 5000 ]; then
print_success "Производительность прокси отличная (<5s)"
elif [ $duration -lt 10000 ]; then
print_success "Производительность прокси хорошая (<10s)"
else
print_warning "Производительность прокси низкая (>10s)"
fi
}
# Тест 2: DNS резолвинг .phantom доменов
test_phantom_dns() {
print_header "Тест 2: DNS резолвинг .phantom доменов"
print_info "Запуск Phantom DNS сервера..."
docker-compose up -d phantom-dns-server
print_info "Ожидание готовности DNS сервера (30 секунд)..."
sleep 30
# Проверка доступности DNS сервера
if nc -z -u localhost 53; then
print_success "Phantom DNS сервер доступен на порту 53"
else
print_error "Phantom DNS сервер недоступен"
return 1
fi
# Тест резолвинга обычного домена
print_info "Тестирование резолвинга обычного домена..."
if nslookup google.com localhost > /dev/null 2>&1; then
print_success "Резолвинг обычных доменов работает"
else
print_error "Резолвинг обычных доменов не работает"
fi
# Создание тестового .phantom домена
print_info "Создание тестового .phantom домена..."
docker exec phantom-dns-server phantom-dns-admin --add-domain test.phantom --ip 172.20.0.100
# Тест резолвинга .phantom домена
print_info "Тестирование резолвинга .phantom домена..."
local phantom_ip
phantom_ip=$(nslookup test.phantom localhost 2>/dev/null | grep "Address:" | tail -1 | awk '{print $2}')
if [ "$phantom_ip" = "172.20.0.100" ]; then
print_success ".phantom домен резолвится корректно: test.phantom -> $phantom_ip"
else
print_error ".phantom домен не резолвится или резолвится неправильно"
fi
}
# Тест 3: Hidden Service
test_hidden_service() {
print_header "Тест 3: Hidden Service (.phantom сайт)"
print_info "Запуск Hidden Service..."
docker-compose up -d phantom-hidden-service test-web-server
print_info "Ожидание готовности сервиса (45 секунд)..."
sleep 45
# Получение адреса hidden service
local hidden_address
hidden_address=$(docker exec phantom-hidden-service cat /var/lib/phantom/hidden-service/hostname 2>/dev/null || echo "unknown.phantom")
print_info "Адрес Hidden Service: $hidden_address"
# Проверка доступности через обычный HTTP
if curl -s --max-time 10 http://localhost:8081 > /dev/null; then
print_success "Тестовый веб-сервер доступен напрямую"
else
print_error "Тестовый веб-сервер недоступен"
return 1
fi
# Проверка доступности через Phantom сеть
print_info "Тестирование доступа к Hidden Service через Phantom..."
# Используем SOCKS5 прокси для доступа к .phantom домену
if curl -s --max-time 30 --socks5 localhost:8080 "http://$hidden_address" > /dev/null; then
print_success "Hidden Service доступен через Phantom сеть"
else
print_warning "Hidden Service недоступен через Phantom (возможно, нужно больше времени)"
fi
}
# Тест 4: Туннелирование TCP трафика
test_tcp_tunnel() {
print_header "Тест 4: TCP туннелирование через Phantom"
print_info "Создание TCP туннеля для SSH (порт 2222 -> test-web-server:80)..."
# Запуск туннеля в фоне
docker run -d --name phantom-tcp-tunnel \
--network phantom-protocol-2025-release_phantom-network \
-p 2222:2222 \
phantom-protocol:tunnel \
phantom-tunnel --local 2222 --remote test-web-server:80 --hops 3 &
local tunnel_pid=$!
print_info "Ожидание готовности туннеля (30 секунд)..."
sleep 30
# Проверка доступности туннеля
if nc -z localhost 2222; then
print_success "TCP туннель доступен на порту 2222"
# Тест передачи данных через туннель
print_info "Тестирование передачи данных через туннель..."
local response
response=$(echo -e "GET / HTTP/1.1\r\nHost: test-web-server\r\n\r\n" | nc localhost 2222 | head -1)
if echo "$response" | grep -q "HTTP/1.1 200"; then
print_success "Данные успешно передаются через TCP туннель"
else
print_error "Ошибка передачи данных через туннель"
fi
else
print_error "TCP туннель недоступен"
fi
# Остановка туннеля
docker stop phantom-tcp-tunnel 2>/dev/null || true
docker rm phantom-tcp-tunnel 2>/dev/null || true
}
# Тест 5: Файловое хранилище
test_file_storage() {
print_header "Тест 5: Распределенное файловое хранилище"
print_info "Запуск системы файлового хранилища..."
docker-compose up -d phantom-storage
print_info "Ожидание готовности системы (30 секунд)..."
sleep 30
# Проверка API
if curl -s --max-time 10 http://localhost:8070/health > /dev/null; then
print_success "API файлового хранилища доступно"
else
print_error "API файлового хранилища недоступно"
return 1
fi
# Создание тестового файла
local test_file="/tmp/phantom_test_file.txt"
echo "Это тестовый файл для Phantom Protocol $(date)" > "$test_file"
# Загрузка файла
print_info "Загрузка тестового файла..."
local upload_response
upload_response=$(curl -s --max-time 30 -X POST -F "file=@$test_file" http://localhost:8070/upload)
local file_id
file_id=$(echo "$upload_response" | grep -o '"file_id":"[^"]*' | cut -d'"' -f4)
if [ -n "$file_id" ]; then
print_success "Файл загружен с ID: $file_id"
# Скачивание файла
print_info "Скачивание файла..."
local download_file="/tmp/phantom_downloaded_file.txt"
if curl -s --max-time 30 "http://localhost:8070/download/$file_id" -o "$download_file"; then
if diff "$test_file" "$download_file" > /dev/null; then
print_success "Файл успешно скачан и содержимое совпадает"
else
print_error "Содержимое скачанного файла не совпадает с оригиналом"
fi
else
print_error "Не удалось скачать файл"
fi
# Очистка
rm -f "$test_file" "$download_file"
else
print_error "Не удалось загрузить файл"
fi
}
# Тест 6: Мессенджер
test_messenger() {
print_header "Тест 6: Анонимный мессенджер"
print_info "Запуск мессенджера..."
docker-compose up -d phantom-messenger
print_info "Ожидание готовности мессенджера (30 секунд)..."
sleep 30
# Проверка API
if curl -s --max-time 10 http://localhost:8076/health > /dev/null; then
print_success "API мессенджера доступно"
else
print_error "API мессенджера недоступно"
return 1
fi
# Создание пользователя
print_info "Создание тестового пользователя..."
local user_response
user_response=$(curl -s --max-time 10 -X POST -H "Content-Type: application/json" \
-d '{"username":"test_user","password":"test_password"}' \
http://localhost:8076/register)
local user_id
user_id=$(echo "$user_response" | grep -o '"user_id":"[^"]*' | cut -d'"' -f4)
if [ -n "$user_id" ]; then
print_success "Пользователь создан с ID: $user_id"
# Отправка сообщения
print_info "Отправка тестового сообщения..."
local message_response
message_response=$(curl -s --max-time 10 -X POST -H "Content-Type: application/json" \
-d '{"from":"'$user_id'","to":"broadcast","message":"Привет, Phantom!","encrypted":true}' \
http://localhost:8076/send)
local message_id
message_id=$(echo "$message_response" | grep -o '"message_id":"[^"]*' | cut -d'"' -f4)
if [ -n "$message_id" ]; then
print_success "Сообщение отправлено с ID: $message_id"
else
print_error "Не удалось отправить сообщение"
fi
else
print_error "Не удалось создать пользователя"
fi
}
# Тест 7: Производительность сети
test_network_performance() {
print_header "Тест 7: Производительность сети"
print_info "Тестирование задержки между узлами..."
# Тест ping между узлами
local total_latency=0
local successful_pings=0
for i in {1..5}; do
for j in {1..5}; do
if [ $i -ne $j ]; then
local latency
latency=$(docker exec phantom-node-$i ping -c 1 -W 2 phantom-node-$j 2>/dev/null | grep "time=" | grep -o "time=[0-9.]*" | cut -d'=' -f2)
if [ -n "$latency" ]; then
total_latency=$(echo "$total_latency + $latency" | bc)
successful_pings=$((successful_pings + 1))
print_info "Задержка node-$i -> node-$j: ${latency}ms"
fi
fi
done
done
if [ $successful_pings -gt 0 ]; then
local avg_latency
avg_latency=$(echo "scale=2; $total_latency / $successful_pings" | bc)
print_success "Средняя задержка между узлами: ${avg_latency}ms"
if (( $(echo "$avg_latency < 10" | bc -l) )); then
print_success "Отличная производительность сети"
elif (( $(echo "$avg_latency < 50" | bc -l) )); then
print_success "Хорошая производительность сети"
else
print_warning "Производительность сети может быть улучшена"
fi
else
print_error "Не удалось измерить задержку между узлами"
fi
# Тест пропускной способности
print_info "Тестирование пропускной способности через SOCKS5 прокси..."
local start_time=$(date +%s)
curl -s --max-time 60 --socks5 localhost:8080 http://httpbin.org/bytes/1048576 > /dev/null
local end_time=$(date +%s)
local duration=$((end_time - start_time))
if [ $duration -gt 0 ]; then
local throughput=$((1048576 / duration / 1024))
print_info "Пропускная способность: ${throughput} KB/s"
if [ $throughput -gt 100 ]; then
print_success "Отличная пропускная способность"
elif [ $throughput -gt 50 ]; then
print_success "Хорошая пропускная способность"
else
print_warning "Низкая пропускная способность"
fi
else
print_error "Не удалось измерить пропускную способность"
fi
}
# Тест 8: Безопасность и анонимность
test_security_anonymity() {
print_header "Тест 8: Безопасность и анонимность"
print_info "Проверка шифрования соединений..."
# Проверка использования TLS/SSL
local ssl_check
ssl_check=$(docker exec phantom-node-1 netstat -tlnp | grep ":8050" | wc -l)
if [ "$ssl_check" -gt 0 ]; then
print_success "Узлы прослушивают зашифрованные соединения"
else
print_warning "Не удалось проверить шифрование соединений"
fi
# Проверка ротации ключей
print_info "Проверка ротации криптографических ключей..."
local key_rotation_log
key_rotation_log=$(docker logs phantom-node-1 2>&1 | grep -i "key rotation" | wc -l)
if [ "$key_rotation_log" -gt 0 ]; then
print_success "Ротация ключей активна"
else
print_info "Ротация ключей не обнаружена в логах (возможно, еще не произошла)"
fi
# Тест анонимности через множественные запросы
print_info "Тестирование анонимности через множественные запросы..."
local unique_ips=()
for i in {1..5}; do
local ip
ip=$(curl -s --max-time 10 --socks5 localhost:8080 http://httpbin.org/ip | grep -o '"origin":"[^"]*' | cut -d'"' -f4)
if [ -n "$ip" ]; then
unique_ips+=("$ip")
print_info "Запрос $i: IP = $ip"
fi
sleep 2
done
# Подсчет уникальных IP
local unique_count
unique_count=$(printf '%s\n' "${unique_ips[@]}" | sort -u | wc -l)
print_info "Обнаружено $unique_count уникальных IP из ${#unique_ips[@]} запросов"
if [ "$unique_count" -gt 1 ]; then
print_success "Анонимность работает - используются разные exit точки"
else
print_warning "Все запросы используют один IP (возможно, один exit node)"
fi
}
# Генерация отчета
generate_report() {
print_header "Генерация отчета тестирования"
local report_file="phantom_test_report_$(date +%Y%m%d_%H%M%S).txt"
{
echo "Phantom Protocol - Отчет тестирования"
echo "======================================"
echo "Дата: $(date)"
echo "Система: $(uname -a)"
echo ""
echo "Статус Docker контейнеров:"
docker-compose ps
echo ""
echo "Использование ресурсов:"
docker stats --no-stream --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}"
echo ""
echo "Логи узлов (последние 50 строк):"
for i in {1..5}; do
echo "--- Узел phantom-node-$i ---"
docker logs --tail 50 phantom-node-$i 2>&1 | tail -20
echo ""
done
} > "$report_file"
print_success "Отчет сохранен в файл: $report_file"
}
# Очистка ресурсов
cleanup() {
print_header "Очистка ресурсов"
print_info "Остановка всех контейнеров..."
docker-compose down
print_info "Удаление временных файлов..."
rm -f /tmp/phantom_test_file.txt /tmp/phantom_downloaded_file.txt
print_success "Очистка завершена"
}
# Главная функция
main() {
echo -e "${PURPLE}"
echo "╔══════════════════════════════════════════════════════════════╗"
echo "║ ║"
echo "║ Phantom Protocol - Тестирование сценариев ║"
echo "║ ║"
echo "║ Этот скрипт демонстрирует реальные сценарии использования ║"
echo "║ Phantom Protocol и проверяет работоспособность системы ║"
echo "║ ║"
echo "╚══════════════════════════════════════════════════════════════╝"
echo -e "${NC}\n"
# Проверка аргументов командной строки
local run_all=true
local tests_to_run=()
if [ $# -gt 0 ]; then
run_all=false
tests_to_run=("$@")
fi
# Проверка зависимостей
check_dependencies
# Запуск базовой сети
start_phantom_network
# Выполнение тестов
local test_results=()
if $run_all || [[ " ${tests_to_run[*]} " =~ " socks5 " ]]; then
if test_socks5_proxy; then
test_results+=("SOCKS5 Proxy: ✅")
else
test_results+=("SOCKS5 Proxy: ❌")
fi
fi
if $run_all || [[ " ${tests_to_run[*]} " =~ " dns " ]]; then
if test_phantom_dns; then
test_results+=("Phantom DNS: ✅")
else
test_results+=("Phantom DNS: ❌")
fi
fi
if $run_all || [[ " ${tests_to_run[*]} " =~ " hidden " ]]; then
if test_hidden_service; then
test_results+=("Hidden Service: ✅")
else
test_results+=("Hidden Service: ❌")
fi
fi
if $run_all || [[ " ${tests_to_run[*]} " =~ " tunnel " ]]; then
if test_tcp_tunnel; then
test_results+=("TCP Tunnel: ✅")
else
test_results+=("TCP Tunnel: ❌")
fi
fi
if $run_all || [[ " ${tests_to_run[*]} " =~ " storage " ]]; then
if test_file_storage; then
test_results+=("File Storage: ✅")
else
test_results+=("File Storage: ❌")
fi
fi
if $run_all || [[ " ${tests_to_run[*]} " =~ " messenger " ]]; then
if test_messenger; then
test_results+=("Messenger: ✅")
else
test_results+=("Messenger: ❌")
fi
fi
if $run_all || [[ " ${tests_to_run[*]} " =~ " performance " ]]; then
if test_network_performance; then
test_results+=("Performance: ✅")
else
test_results+=("Performance: ❌")
fi
fi
if $run_all || [[ " ${tests_to_run[*]} " =~ " security " ]]; then
if test_security_anonymity; then
test_results+=("Security: ✅")
else
test_results+=("Security: ❌")
fi
fi
# Генерация отчета
generate_report
# Итоговый отчет
print_header "Итоговый отчет тестирования"
local passed=0
local total=${#test_results[@]}
for result in "${test_results[@]}"; do
echo -e " $result"
if [[ "$result" =~ ✅ ]]; then
passed=$((passed + 1))
fi
done
echo ""
if [ $passed -eq $total ]; then
print_success "Все тесты пройдены успешно! ($passed/$total)"
echo -e "\n${GREEN}🎉 Phantom Protocol готов к использованию!${NC}"
elif [ $passed -gt $((total / 2)) ]; then
print_warning "Большинство тестов пройдено ($passed/$total)"
echo -e "\n${YELLOW}⚠️ Phantom Protocol частично функционален${NC}"
else
print_error "Многие тесты не пройдены ($passed/$total)"
echo -e "\n${RED}❌ Требуется дополнительная настройка${NC}"
fi
echo -e "\n${CYAN}Для получения помощи обратитесь к документации или сообществу Phantom Protocol${NC}"
# Опция очистки
echo ""
read -p "Очистить ресурсы после тестирования? (y/N): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
cleanup
else
print_info "Ресурсы оставлены для дальнейшего использования"
print_info "Для очистки выполните: docker-compose down"
fi
}
# Обработка сигналов
trap cleanup EXIT
# Запуск основной функции
main "$@"