1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/jackarain-proxy

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Один из вариантов реализации прокси с использованием C++20

CircleCI

actions workflow

Проект прокси: введение

Используя корутины C++20, можно реализовать серверный и клиентский прокси с высокой производительностью, поддерживающий стандартные протоколы socks4, socks4a, socks5, http и https. Проект может быть использован как самостоятельный прокси-сервер или как библиотека для разработки сетевых приложений с поддержкой прокси.

Проект охватывает большинство сценариев использования прокси и позволяет настроить SSL-шифрование между клиентом и сервером, а также многоуровневые прокси-соединения.

Пример архитектуры:


                  +--------------+     |      +--------------+
  browser/app --> | proxy server | ---ssl---> | proxy server | --> target server
                  +--------------+     |      +--------------+
                       local        Firewall       remote

В этой схеме прокси-серверы могут выступать в роли клиентов или серверов, поддерживая различные протоколы и обеспечивая доступ к целевым серверам.

Прокси-серверы защищены от обнаружения, так как при попытке сканирования они выдают страницу ошибки nginx. Это происходит потому, что без знания информации для аутентификации прокси-сервера попытка аутентификации завершается неудачей, и прокси-сервер автоматически имитирует сервис nginx, возвращая страницу ошибки.

                      |            +--------------+
  browser/app --> https proxy ---> | proxy server | --> target server
                      |            +--------------+
    local          Firewall             remote

Прокси-сервер принимает запросы socks и http (для http используется CONNECT), позволяя всем функциям (socks и http) работать на одном и том же порту сервера. Сервер автоматически определяет тип протокола, анализируя первые несколько байтов запроса, чтобы определить, является ли он запросом socks или http.

Размещение различных сервисов на одном порту может помочь скрыть особенности трафика, повышая устойчивость к анализу.

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

Компиляция проекта прокси

Компиляция среды

Для компиляции требуется следующее:

  • Система управления версиями git.
  • Компилятор C++: Linux с gcc версии 11 или выше, или clang версии 14 или выше; Windows с Visual Studio 2019 или более поздней версией.
  • Инструмент сборки cmake версии 3.5 или выше.
  • Docker, если вы хотите использовать его для компиляции.

После установки необходимых инструментов выполните следующие шаги:

  1. Клонируйте исходный код с помощью команды git clone .
  2. После клонирования исходного кода перейдите в каталог с исходным кодом и выполните команду cmake -S . -B build -DCMAKE_BUILD_TYPE=Release.
  3. После успешного выполнения команды cmake запустите команду cmake --build build для компиляции проекта.
  4. Если компиляция прошла успешно, исполняемый файл будет находиться в каталоге bin, а скомпилированные библиотеки — в соответствующих каталогах проекта.

Сборка в Docker

Чтобы собрать проект в Docker, выполните следующую команду в каталоге с исходным кодом:

docker build . -t proxy:v1

Это автоматически скомпилирует проект, и после успешной компиляции исполняемый файл proxy_server будет доступен в каталоге /usr/local/bin/ образа Docker.

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

Proxy server предоставляет полный набор функций и может использоваться в качестве tun2socks для глобального доступа в Интернет через прокси. Пример каталога содержит примеры программирования.

Параметры proxy server включают:

Параметр Описание
config Конфигурационный файл, например, server.conf, который содержит настройки в формате key=value, например, server_listen=[::0]:1080.
server_listen Адрес и порт для прослушивания, формат addr:port, поддерживает v6only (например, addr:port-v6only) и одновременное прослушивание на нескольких адресах.
reuse_port Включает опцию TCP SO_REUSEPORT, работает только на платформе Linux.
happyeyeballs Включает алгоритм подключения happyeyeballs, по умолчанию включён.
v4only Ограничивает использование только IPv4 для подключения к целевому адресу, по умолчанию отключено.
v6only Ограничивает использование только IPv6 для подключения к целевому адресу, по умолчанию отключено.
transparent Включает прозрачный прокси, по умолчанию отключен, работает только на Linux.
so_mark Используется при установлении соединения с proxy_pass для установки so_mark для упрощения маршрутизации прокси-трафика, работает только в режиме transparent.
local_ip При использовании в качестве промежуточного сервиса указывает локальный IP-адрес, используемый для установления соединения с вышестоящим сервисом.
auth_users Список пользователей для аутентификации, клиент должен соответствовать одной из пар пользователь/пароль для успешного подключения, по умолчанию используется пара jack:1111. Для отключения аутентификации установите auth_users в пустую строку.
proxy_pass В режиме промежуточного сервиса указывает адрес вышестоящего прокси-сервиса, формат url. При наличии аутентификационной информации она должна быть включена, например, https://jack:1111@example.com:1080/.
proxy_pass_ssl Указывает, будет ли соединение с proxy_pass осуществляться через SSL, требует настройки SSL на вышестоящем сервисе.
ssl_certificate_dir Каталог, где хранятся файлы сертификатов SSL, proxy_server автоматически ищет подкаталоги с файлами сертификатов для каждого домена. Каждый подкаталог соответствует одному домену.
ssl_cacert_dir Указывает каталог CA-сертификатов для использования при SSL-подключениях, по умолчанию используются встроенные сертификаты.
ssl_sni Указывает SNI для использования при SSL-подключениях.
ssl_ciphers Список разрешённых алгоритмов шифрования для SSL.
ssl_prefer_server_ciphers Предпочитает использование шифров, предложенных сервером. Алгоритм шифрования (если вы не знаете, что делаете, то вам не нужно беспокоиться об этом)
http_doc Включить статический файловый сервер HTTP, указать каталог статических файлов
htpasswd Включить аутентификацию HTTP, при доступе к статическим файлам через HTTP требуется аутентификация, auth_users используется для настройки информации о пользователях/ключах
autoindex При включении статического файлового сервера HTTP включить autoindex, это позволит браузеру просматривать список каталогов файлов, аналогично опции autoindex в nginx
ipip_db Указать файл базы данных IPIP, используемый для получения информации о регионе клиента. Адрес загрузки базы данных: 17monipdb
allow_region При использовании базы данных IP указать разрешённые регионы подключения клиентов (например: Пекин
deny_region При использовании базы данных IP указать запрещённые регионы подключения клиентов (например: Гуандун
udp_timeout В случае использования UDP-переадресации, ресурсы, связанные с сокетом UDP, будут освобождены по истечении указанного времени, время измеряется в секундах
tcp_timeout Установить тайм-аут чтения и записи TCP-соединения, значение меньше 0 означает отсутствие установки тайм-аута, время измеряется в секундах
rate_limit Установить скорость ввода-вывода TCP-соединений, единица измерения — байты/секунду, по умолчанию — неограниченная скорость
users_rate_limit Установить скорость ввода-вывода для определённых пользователей после аутентификации, единица измерения — байты/секунду, по умолчанию — неограниченная скорость, формат параметров: user1:102400 user2:204800
logs_path Каталог журналов
disable_logs Отключить генерацию журналов
disable_http Отключить протокол HTTP
disable_socks Отключить протоколы SOCKS5/SOCKS4
disable_insecure Отключить небезопасные соединения (разрешить только SSL/TLS-соединения)
disable_udp Отключить поддержку протокола UDP
scramble Включить или отключить добавление шума к данным (требуется одновременное включение на обоих концах)
noise_length Максимальная длина случайных данных при включённом scramble, по умолчанию максимальная длина составляет 4 КБ

Статический файловый HTTP-сервер

proxy server — это не только прокси-сервер, но и полноценный статический файловый HTTP-сервер, поддерживающий HTTP range, поэтому его можно использовать в качестве HTTP видеосервера. Плеер может использовать HTTP bytes range для поиска и перемотки HTTP видеофайлов. Для этого выполните следующие действия:

./proxy_server --autoindex true --http_doc /user/doc --server_listen 0.0.0.0:1080

Затем откройте адрес http://localhost:1080/ в браузере (откроется страница):

image image

Блог автора (https://www.jackarain.org) работает непосредственно на статической странице proxy_server. Он также является моим прокси-сервером.

Прочее

Настройка глобального прокси на маршрутизаторе


Если у вас есть какие-либо вопросы, вы можете связаться со мной через Telegram: https://t.me/jackarain или присоединиться к группе: https://t.me/joinchat/C3WytT4RMvJ4lqxiJiIVhg.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Реализация протоколов HTTP, HTTPS, SOCKS4/SOCKS4A, SOCKS5 с использованием современного C++. Развернуть Свернуть
BSL-1.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/jackarain-proxy.git
git@api.gitlife.ru:oschina-mirror/jackarain-proxy.git
oschina-mirror
jackarain-proxy
jackarain-proxy
master