Один из вариантов реализации прокси с использованием C++20
Проект прокси: введение
Используя корутины 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.
Компиляция проекта прокси
Для компиляции требуется следующее:
После установки необходимых инструментов выполните следующие шаги:
Чтобы собрать проект в 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 КБ |
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/
в браузере (откроется страница):
Блог автора (https://www.jackarain.org) работает непосредственно на статической странице proxy_server
. Он также является моим прокси-сервером.
Настройка глобального прокси на маршрутизаторе
Если у вас есть какие-либо вопросы, вы можете связаться со мной через Telegram: https://t.me/jackarain или присоединиться к группе: https://t.me/joinchat/C3WytT4RMvJ4lqxiJiIVhg.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )