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 запросы:
- Клиент запускает локальный SOCKS5 прокси (по умолчанию
127.0.0.1:1080) - Приложение (браузер, curl и т.д.) подключается к локальному SOCKS5 прокси
- Клиент получает запрос от приложения, шифрует данные (AES-GCM) и отправляет на сервер через HTTP GET или PUT запросы
- Сервер получает зашифрованные данные, расшифровывает их и устанавливает соединение с целевым сервером
- Данные от целевого сервера возвращаются обратно: сервер шифрует → отправляет клиенту → клиент расшифровывает → передает приложению
Механизм передачи данных
- 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 - Зачем: Адрес, куда клиент будет отправлять зашифрованные данные
- URL сервера eGET, должен заканчиваться на
-
-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)
- Не храните ключи в публичных репозиториях
🛣️ Маршрутизация
Сервер поддерживает гибкую маршрутизацию трафика:
Типы правил:
-
exact - Точное совпадение домена
{ "type": "exact", "pattern": "example.com", "upstream": "socks5://127.0.0.1:1081" } -
suffix - Суффикс домена
{ "type": "suffix", "pattern": ".google.com", "upstream": "socks5://127.0.0.1:1082" } -
regex - Регулярное выражение
{ "type": "regex", "pattern": ".*\\.(facebook|fbcdn)\\.com", "upstream": "socks5://127.0.0.1:1083" } -
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
Советы по оптимизации:
- Используйте
-put -chunked- это значительно повышает производительность - Настройте
-chunk-size:- Быстрая сеть: 16384-32768 байт
- Обычная сеть: 8192 байт (рекомендуется)
- Медленная сеть: 4096 байт
- Увеличьте
-pollersпри высокой нагрузке (32-64) - Настройте таймауты в зависимости от задержек:
- Низкая задержка: уменьшите таймауты
- Высокая задержка: увеличьте таймауты
- Мониторьте логи с
-verboseдля понимания узких мест
📝 Логирование
Логи сохраняются в файлы:
- Сервер:
server.log - Клиент:
client.log
Для подробного логирования используйте флаг -verbose.
🔄 Обновление конфигурации
Сервер поддерживает горячую перезагрузку конфигурации без перезапуска:
killall -HUP eget-server
🤝 Вклад в проект
Приветствуются pull requests и issues! Пожалуйста, убедитесь, что:
- Код соответствует стилю проекта
- Добавлены тесты для новых функций
- Обновлена документация
📄 Лицензия
Этот проект распространяется под лицензией MIT License. См. файл LICENSE для подробностей.
MIT License — это разрешительная лицензия открытого ПО, которая позволяет свободно использовать, изменять и распространять код с минимальными ограничениями.
⚠️ Отказ от ответственности
Этот проект предназначен только для образовательных целей и легального использования. Авторы не несут ответственности за неправомерное использование.
📞 Поддержка
- Issues: https://github.com/t-i-r-e-l/eget/issues
- Discussions: https://github.com/t-i-r-e-l/eget/discussions
Documentation
¶
There is no documentation for this package.