eget

command module
v1.0.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 25, 2025 License: MIT Imports: 27 Imported by: 0

README

eGET - HTTP Tunnel для SOCKS5 прокси

eGET — это высокопроизводительный HTTP-туннель, который позволяет туннелировать SOCKS5 трафик через обычные HTTP/HTTPS запросы. Проект написан на Go и оптимизирован для работы через CDN и прокси-серверы.

🚀 Основные возможности

  • HTTP/HTTPS туннелирование: Трафик маскируется под обычные HTTP запросы
  • AES-GCM шифрование: Все данные шифруются с использованием AES-128-GCM
  • SOCKS5 прокси: Полная поддержка протокола SOCKS5 на стороне клиента
  • Гибкая маршрутизация: Настройка правил маршрутизации по доменам
  • Множественные upstream: Поддержка SOCKS5, direct и каскадных eGET серверов
  • Высокая производительность: Параллельная обработка, кэширование, пулы соединений

🔄 Как работает туннель

eGET создает туннель между клиентом и сервером, туннелируя SOCKS5 трафик через HTTP запросы:

  1. Клиент запускает локальный SOCKS5 прокси (по умолчанию 127.0.0.1:1080)
  2. Приложение (браузер, curl и т.д.) подключается к локальному SOCKS5 прокси
  3. Клиент получает запрос от приложения, шифрует данные (AES-GCM) и отправляет на сервер через HTTP GET или PUT запросы
  4. Сервер получает зашифрованные данные, расшифровывает их и устанавливает соединение с целевым сервером
  5. Данные от целевого сервера возвращаются обратно: сервер шифрует → отправляет клиенту → клиент расшифровывает → передает приложению
Механизм передачи данных
  • Upstream (клиент → сервер): Данные от приложения разбиваются на чанки, шифруются и отправляются через HTTP запросы
  • Downstream (сервер → клиент): Клиент периодически отправляет "poll" запросы к серверу для получения данных. Сервер отвечает зашифрованными данными или "NO_DATA" если данных нет
  • Множественные потоки: Один клиент может обрабатывать множество одновременных соединений (streams), каждое имеет уникальный ID
  • Переупорядочивание: Система гарантирует правильный порядок доставки пакетов даже при потере или переупорядочивании
Безопасность
  • Все данные шифруются AES-128-GCM перед отправкой
  • Каждый чанк имеет уникальный sequence number для защиты от replay атак
  • Аутентификация основана на SHA-256 хеше ключа

📋 Требования

  • Go 1.21 или выше
  • Доступ к серверу для развертывания серверной части

🔧 Установка

Сборка из исходников
# Клонируйте репозиторий
git clone https://github.com/t-i-r-e-l/eget.git
cd eget

# Установите зависимости
go mod download

# Соберите сервер
go build -o eget-server server.go

# Соберите клиент
go build -o eget-client client.go
Быстрая установка
go install github.com/t-i-r-e-l/eget/cmd/server@main
go install github.com/t-i-r-e-l/eget/cmd/client@main

Примечание: Используйте @main для установки последней версии из основной ветки. После создания релизов можно будет использовать @latest.

После установки бинарные файлы будут в $GOPATH/bin или $HOME/go/bin:

  • server (или eget-server)
  • client (или eget-client)

⚙️ Конфигурация

Сервер

Создайте файл users.json на основе config.example.json:

{
  "users": {
    "admin": "d9a4c1ed5b69875abcf15e1ef8ae8f37",
    "user": "62130bd9c1538eef230ae41d100e91d2"
  },
  "static_path": "static/index.html",
  "routing": {
    "rules": [
      {
        "type": "exact",
        "pattern": "example.com",
        "upstream": "socks5://127.0.0.1:1081"
      }
    ]
  }
}

Важно:

  • Ключи должны быть 32-символьными hex-строками (16 байт для AES-128)
  • НЕ используйте примеры ключей из config.example.json в продакшене - они предназначены только для демонстрации
  • Генерируйте уникальные ключи для каждого пользователя
Генерация ключа
# Генерация случайного ключа
openssl rand -hex 16

🚀 Использование

Запуск сервера
./eget-server -listen :8080 -config users.json

Параметры сервера:

  • -listen (по умолчанию: :8080)

    • Адрес и порт для прослушивания HTTP запросов
    • Примеры: :8080, 127.0.0.1:8080, 0.0.0.0:8080
    • Зачем: Определяет, на каком интерфейсе и порту сервер будет принимать соединения
  • -config (по умолчанию: users.json)

    • Путь к файлу конфигурации с пользователями и правилами маршрутизации
    • Зачем: Сервер читает список пользователей и их ключи из этого файла
  • -max-queue (по умолчанию: 1500)

    • Максимальное количество чанков в очереди на отправку клиенту для каждого потока
    • Зачем: Ограничивает использование памяти и предотвращает переполнение при медленном клиенте
    • Увеличьте при высокой нагрузке, уменьшите при ограниченной памяти
  • -poll-timeout (по умолчанию: 8 секунд)

    • Максимальное время ожидания данных перед отправкой "NO_DATA" клиенту
    • Зачем: Клиент периодически отправляет "poll" запросы. Если данных нет, сервер ждет до этого таймаута
    • Уменьшите для быстрого ответа (5-8 сек), увеличьте для экономии запросов (10-15 сек)
  • -chunk-size (по умолчанию: 8192 байт = 8KB)

    • Размер буфера для чтения данных из целевого сервера
    • Зачем: Определяет размер чанков данных. Больше = меньше запросов, но больше задержка
    • Рекомендуется: 8192 для большинства случаев, 16384 для быстрых сетей
  • -read-timeout (по умолчанию: 150 секунд)

    • Таймаут чтения данных из соединения с целевым сервером
    • Зачем: Если целевой сервер долго не отправляет данные, соединение закрывается
    • Увеличьте для медленных соединений, уменьшите для быстрого обнаружения разрывов
  • -dial-timeout (по умолчанию: 8 секунд)

    • Таймаут установки соединения с целевым сервером
    • Зачем: Максимальное время ожидания подключения к целевому серверу
    • Уменьшите для быстрого отказа при недоступности сервера
  • -poll-interval (по умолчанию: 10 микросекунд)

    • Интервал проверки очереди данных на сервере
    • Зачем: Как часто сервер проверяет наличие данных для отправки (внутренняя оптимизация)
    • Обычно не требует изменения
  • -verbose

    • Включить подробное логирование всех операций
    • Зачем: Для отладки и мониторинга работы сервера
    • Используйте при проблемах или для понимания работы системы

Перезагрузка конфигурации:

killall -HUP eget-server

Сервер перечитает файл конфигурации без перезапуска (полезно для добавления новых пользователей)

Запуск клиента
./eget-client -server http://your-server.com/tunnel -key YOUR_32_CHAR_HEX_KEY

Параметры клиента:

  • -server (обязательно)

    • URL сервера eGET, должен заканчиваться на /tunnel
    • Примеры: http://example.com/tunnel, https://server.com:8080/tunnel
    • Зачем: Адрес, куда клиент будет отправлять зашифрованные данные
  • -key (или переменная окружения EGET_KEY)

    • Ключ шифрования в hex формате (ровно 32 символа = 16 байт для AES-128)
    • Зачем: Используется для шифрования всех данных. Должен совпадать с ключом пользователя на сервере
    • Безопаснее использовать переменную окружения: export EGET_KEY=ваш_ключ
  • -id (по умолчанию: default)

    • Уникальный идентификатор сессии
    • Зачем: Позволяет нескольким клиентам работать одновременно с разными сессиями
    • Используйте разные ID для разных клиентов или приложений
  • -listen (по умолчанию: 127.0.0.1:1080)

    • Адрес и порт локального SOCKS5 прокси
    • Зачем: На этот адрес будут подключаться ваши приложения (браузер, curl и т.д.)
    • Примеры: 127.0.0.1:1080, 127.0.0.1:9050, 0.0.0.0:1080 (для доступа из сети)
  • -put (по умолчанию: выключено, используется GET)

    • Использовать HTTP PUT вместо GET для отправки данных
    • Зачем: PUT позволяет отправлять данные в теле запроса, а не в URL (GET имеет ограничение длины URL)
    • Рекомендуется: включить для больших объемов данных или при работе через прокси/CDN
  • -chunked (требует -put)

    • Использовать chunked transfer encoding для отправки нескольких чанков в одном PUT запросе
    • Зачем: Уменьшает количество HTTP запросов, повышая производительность
    • Рекомендуется: включить вместе с -put для лучшей производительности
  • -server-host (по умолчанию: не используется)

    • Переопределить HTTP Host заголовок в запросах
    • Зачем: Полезно при работе через CDN или reverse proxy, когда нужно указать другой домен
    • Пример: -server-host front.example.com при -server http://back.example.com/tunnel
  • -pollers (по умолчанию: 16)

    • Количество параллельных горутин, которые отправляют poll запросы к серверу
    • Зачем: Больше поллеров = быстрее получение данных, но больше нагрузка на сервер
    • Увеличьте до 32-64 при высокой нагрузке, уменьшите до 8 при ограниченных ресурсах
  • -poll-interval (по умолчанию: 100 микросекунд)

    • Пауза между poll запросами при получении "NO_DATA"
    • Зачем: Контролирует частоту запросов при отсутствии данных
    • Уменьшите для быстрого получения данных, увеличьте для экономии трафика
  • -chunk-size (по умолчанию: 8192 байт = 8KB)

    • Размер чанков данных для отправки на сервер
    • Зачем: Больше = меньше запросов, но больше задержка. Меньше = больше запросов, но меньше задержка
    • Рекомендуется: 8192 для большинства случаев, 16384 для быстрых сетей, 4096 для медленных
  • -timeout (по умолчанию: 20 секунд)

    • HTTP timeout для всех запросов к серверу
    • Зачем: Максимальное время ожидания ответа от сервера
    • Увеличьте до 30-60 для медленных соединений или CDN
  • -max-idle-conns (по умолчанию: 300)

    • Максимальное количество idle (неактивных) HTTP соединений в пуле
    • Зачем: Переиспользование соединений повышает производительность
    • Обычно не требует изменения
  • -max-idle-conns-host (по умолчанию: 50)

    • Максимальное количество idle соединений на один хост
    • Зачем: Ограничивает количество соединений к одному серверу
    • Обычно не требует изменения
  • -read-timeout (по умолчанию: 600 секунд = 10 минут)

    • Таймаут чтения данных из локального SOCKS5 соединения
    • Зачем: Если приложение долго не отправляет данные, соединение закрывается
    • Увеличьте для долгих соединений (например, стриминг)
  • -max-queue (по умолчанию: 1500)

    • Максимальный размер очереди чанков на сервере (передается серверу)
    • Зачем: Ограничивает буферизацию данных на сервере
    • Обычно не требует изменения
  • -poll-timeout (по умолчанию: 10 секунд)

    • Таймаут для poll запросов (передается серверу)
    • Зачем: Как долго сервер будет ждать данных перед отправкой "NO_DATA"
    • Должен быть согласован с настройкой сервера
  • -verbose

    • Включить подробное логирование всех операций
    • Зачем: Для отладки и понимания работы клиента
    • Используйте при проблемах или для мониторинга

Примеры использования:

# Базовый запуск (минимальная конфигурация)
./eget-client -server http://example.com/tunnel -key d9a4c1ed5b69875abcf15e1ef8ae8f37

# С использованием переменной окружения (безопаснее)
export EGET_KEY=d9a4c1ed5b69875abcf15e1ef8ae8f37
./eget-client -server http://example.com/tunnel

# С PUT и chunked encoding (лучшая производительность)
./eget-client -server http://example.com/tunnel -key $EGET_KEY -put -chunked

# С кастомным SOCKS5 портом (например, для Tor Browser)
./eget-client -server http://example.com/tunnel -key $EGET_KEY -listen 127.0.0.1:9050

# С увеличенными параметрами для высокой нагрузки
./eget-client -server http://example.com/tunnel -key $EGET_KEY \
  -put -chunked \
  -pollers 32 \
  -chunk-size 16384 \
  -timeout 30

# С подробным логированием для отладки
./eget-client -server http://example.com/tunnel -key $EGET_KEY -verbose

# Несколько клиентов с разными сессиями
./eget-client -server http://example.com/tunnel -key $EGET_KEY -id session1 -listen 127.0.0.1:1080
./eget-client -server http://example.com/tunnel -key $EGET_KEY -id session2 -listen 127.0.0.1:1081

🔐 Безопасность

  • Все данные шифруются с использованием AES-128-GCM
  • Ключи передаются через переменные окружения или флаги командной строки
  • Аутентификация основана на хеше ключа (SHA-256)
  • Не храните ключи в публичных репозиториях

🛣️ Маршрутизация

Сервер поддерживает гибкую маршрутизацию трафика:

Типы правил:
  1. exact - Точное совпадение домена

    {
      "type": "exact",
      "pattern": "example.com",
      "upstream": "socks5://127.0.0.1:1081"
    }
    
  2. suffix - Суффикс домена

    {
      "type": "suffix",
      "pattern": ".google.com",
      "upstream": "socks5://127.0.0.1:1082"
    }
    
  3. regex - Регулярное выражение

    {
      "type": "regex",
      "pattern": ".*\\.(facebook|fbcdn)\\.com",
      "upstream": "socks5://127.0.0.1:1083"
    }
    
  4. list - Список доменов из файла

    {
      "type": "list",
      "list_file": "domains.txt",
      "upstream": "socks5://127.0.0.1:1084"
    }
    

    Файл со списком доменов поддерживает текстовый формат:

    • Каждая строка = один домен
    • Строки, начинающиеся с #, являются комментариями
    • Пустые строки игнорируются
    • Домены, начинающиеся с точки (например, .google.com), считаются суффиксами и применяются ко всем поддоменам
    • Поддерживаются IDN домены (кириллица и другие не-ASCII символы)
    • Комментарии в конце строки также поддерживаются

    Пример файла см. в domains.example.txt

Типы upstream:
  • socks5://host:port - SOCKS5 прокси
  • direct - Прямое подключение
  • eget://host:port/path?user=USER&key=KEY - Каскадный eGET сервер
  • http://host:port/tunnel?user=USER&key=KEY - Каскадный eGET сервер (альтернативный формат)

📊 Производительность и оптимизация

Рекомендуемые настройки:

Для обычного использования (стандартная сеть):

# Сервер
./eget-server -poll-timeout 8 -chunk-size 8192 -read-timeout 150

# Клиент
./eget-client -server http://example.com/tunnel -key $EGET_KEY -put -chunked

Для быстрой сети (низкая задержка):

# Сервер
./eget-server -poll-timeout 5 -chunk-size 16384 -read-timeout 300

# Клиент
./eget-client -server http://example.com/tunnel -key $EGET_KEY \
  -put -chunked \
  -chunk-size 16384 \
  -pollers 32 \
  -timeout 15

Для медленной сети (высокая задержка):

# Сервер
./eget-server -poll-timeout 10 -chunk-size 4096 -read-timeout 300

# Клиент
./eget-client -server http://example.com/tunnel -key $EGET_KEY \
  -put -chunked \
  -chunk-size 4096 \
  -timeout 60 \
  -pollers 8
Советы по оптимизации:
  1. Используйте -put -chunked - это значительно повышает производительность
  2. Настройте -chunk-size:
    • Быстрая сеть: 16384-32768 байт
    • Обычная сеть: 8192 байт (рекомендуется)
    • Медленная сеть: 4096 байт
  3. Увеличьте -pollers при высокой нагрузке (32-64)
  4. Настройте таймауты в зависимости от задержек:
    • Низкая задержка: уменьшите таймауты
    • Высокая задержка: увеличьте таймауты
  5. Мониторьте логи с -verbose для понимания узких мест

📝 Логирование

Логи сохраняются в файлы:

  • Сервер: server.log
  • Клиент: client.log

Для подробного логирования используйте флаг -verbose.

🔄 Обновление конфигурации

Сервер поддерживает горячую перезагрузку конфигурации без перезапуска:

killall -HUP eget-server

🤝 Вклад в проект

Приветствуются pull requests и issues! Пожалуйста, убедитесь, что:

  1. Код соответствует стилю проекта
  2. Добавлены тесты для новых функций
  3. Обновлена документация

📄 Лицензия

Этот проект распространяется под лицензией MIT License. См. файл LICENSE для подробностей.

MIT License — это разрешительная лицензия открытого ПО, которая позволяет свободно использовать, изменять и распространять код с минимальными ограничениями.

⚠️ Отказ от ответственности

Этот проект предназначен только для образовательных целей и легального использования. Авторы не несут ответственности за неправомерное использование.

📞 Поддержка

Documentation

The Go Gopher

There is no documentation for this package.

Directories

Path Synopsis
cmd
client command
server command

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL