OxidProxy — руководство пользователя

Версия документа: 1.15
Версия программы: 2.6.2
Сайт: https://oxidproxy.com/ru/
Поддержка: support@oxidproxy.com · Telegram

СоветЧитать всё это необязательно. Отдайте инструкцию для ИИ-агента любому агенту с доступом к серверу по SSH — он спросит, что ему нужно, и развернёт сервер сам. Руководство ниже пригодится потом, когда захотите разобраться в настройках.

Содержание

  1. 1. Описание продукта
  2. 2. Системные требования
  3. 3. Установка
    - 3.1 3.1. Автоматическая установка (рекомендуется)
    - 3.2 3.2. Ручная установка
    - 3.3 3.3. Что создаётся при установке
    - 3.4 3.4. Обновление и удаление
  4. 4. Первоначальная настройка
  5. 5. Конфигурация (config.yaml)
    - 5.1 5.1. Лицензия
    - 5.2 5.2. Сетевые параметры
    - 5.3 5.3. Маскировка ОС (OS Fingerprinting)
    - 5.4 5.4. IPv6 подсети и ротация
    - 5.5 5.5. API и управление пользователями
    - 5.6 5.6. DNS-резолвер
    - 5.7 5.7. Ограничение скорости (Traffic Shaping)
    - 5.8 5.8. Тайм-ауты
    - 5.9 5.9. Сервисный аккаунт
    - 5.10 5.10. Чёрный список (Blacklist)
    - 5.11 5.11. Логирование
    - 5.12 5.12. MITM-режим (mitm_listeners)
    - 5.13 5.13. Брендирование панели
  6. 6. HTTP API
  7. 7. Web-Дашборд
  8. 8. Управление службой
  9. 9. Логирование и мониторинг
  10. 10. Командная строка (CLI)
  11. 11. Диагностика и устранение неполадок
  12. 12. FAQ
  13. 13. История изменений

1. Описание продукта

OxidProxy — высокопроизводительный SOCKS5(h) / HTTP CONNECT IPv6 прокси-сервер, написанный на Rust. Предназначен для развёртывания на собственном выделенном или виртуальном сервере (VPS) и выступает в роли шлюза: принимает входящие подключения по IPv4, авторизует их и маршрутизирует трафик через настроенные IPv6 подсети.

Ключевые возможности

Функция Описание
SOCKS5 / SOCKS5h Полная поддержка протокола, включая Remote DNS (предотвращение DNS-утечек)
HTTP CONNECT Поддержка HTTP(S) прокси-режима через метод CONNECT (для браузеров, curl, системных настроек)
Hybrid Mode Автоматическое определение протокола (SOCKS5/HTTP) на одном порту
UDP / QUIC Полноценное проксирование UDP-трафика, включая протокол QUIC (HTTP/3)
Мультисеть Подключение нескольких IPv6 подсетей с балансировкой по весам
Ленивая ротация Смена IP только при новой авторизации — активные сессии не разрываются
Smart DNS Failover Встроенный резолвер с балансировкой и автопереключением на резервные DNS
OS Fingerprinting (p0f) Маскировка TCP/IP отпечатка под различные ОС (Linux, Android, Windows, iOS, macOS)
Traffic Shaping Ограничение общей пропускной способности с поддержкой burst
HTTP(S) API Мгновенная генерация учётных записей, статистика, управление через REST API
IP Whitelist Управление списком разрешённых IP и подсетей прямо из дашборда, с защитой системных записей
Web-Дашборд Встроенная панель мониторинга с графиками трафика, аналитикой соединений и поддержкой тем оформления
Чёрный список Блокировка доменов и IP-адресов через файл blacklist.txt
Сервисный аккаунт Специальный аккаунт для чекеров/мониторинга с ограниченным доступом

Как это работает

   Ваше ПО            OxidProxy Server           IPv6 подсети         Интернет
  (SOCKS5h/HTTP)  →   Auth • DNS • Shaping   →  Subnet A (w:100)  →  Target
                                                 Subnet B (w:50)
ВажноДля максимальной анонимности ваш клиент должен использовать режим SOCKS5h (Remote DNS). В этом режиме DNS-запросы выполняются на стороне сервера OxidProxy, а не на вашем локальном компьютере.
ПримечаниеOxidProxy маршрутизирует трафик исключительно через IPv6. Целевой ресурс должен поддерживать IPv6.

2. Системные требования

Параметр Минимум Рекомендуется
ОС Debian 12 (Bookworm) или Debian 13 (Trixie), x64 Debian 12 (Bookworm) или Debian 13 (Trixie), x64
CPU 1 ядро 2+ ядра
RAM 512 МБ 1+ ГБ (зависит от max_accounts)
IPv6 /64 подсеть /48 или /32 подсеть
Права root (для установки) Служба запускается от пользователя oxidproxy
Виртуализация ВМ на KVM, VMware, Xen или Hyper-V либо выделенный сервер Контейнеры (OpenVZ, LXC и подобные) не поддерживаются: своё ядро в них не загрузить
Загрузчик GRUB Установщик подключает кастомное ядро через GRUB и без него останавливается
Диск Около 1 ГБ свободно и 150 МБ в /boot, если это отдельный раздел От 5 ГБ, чтобы хватало места журналу и логам
ПримечаниеДля работы функции маскировки ОС (p0f fingerprinting) требуется установка кастомного ядра: 6.1.187-oxidproxy-p0f на Debian 12 или 6.12.111-oxidproxy-p0f на Debian 13, установщик сам выберет подходящее. Без такого ядра все остальные функции будут работать в обычном режиме.

3. Установка

ВажноРекомендуется устанавливать OxidProxy на чистую, обновлённую Debian 12 (Bookworm) или Debian 13 (Trixie). Кастомное ядро, которое устанавливается вместе с сервером, обеспечивает поддержку OS Fingerprinting, однако оно не является на 100% универсальным — на некоторых конфигурациях оборудования могут отсутствовать необходимые драйверы, что приведёт к тому, что сервер не загрузится после установки ядра. Ядро не подписано, поэтому Secure Boot должен быть выключен; установщик проверяет это перед установкой ядра. Если после перезагрузки сервер недоступен — обратитесь в поддержку по почте support@oxidproxy.com или в Telegram.

Запустите от имени root. Если на сервере нет curl (на минимальном образе Debian 13 его нет), сначала поставьте его:

apt-get update && apt-get install -y curl

Проверка сервера перед установкой (необязательно). Скрипт проверки смотрит, подходит ли сервер: систему, ядро, загрузчик, сеть IPv6, свободные порты и то, доходит ли ваша подсеть до сервера. Он ничего не ставит и настроек не меняет. В конце пишет итог — готов, готов с замечаниями или не готов — и что исправить.

Если подсеть IPv6 у вас уже есть, впишите её вместо примера; если подсетей несколько — по --subnet на каждую:

curl -fsSL -o v6check.sh https://oxidproxy.com/downloads/v6check.sh
bash v6check.sh --ru --subnet 2a01:1234::/48

Если подсети пока нет, запустите без неё: bash v6check.sh --ru. Результат будет неполным: главное — доходит ли подсеть до сервера — останется непроверенным, и итог будет не лучше «готов, есть замечания». Когда подсеть появится, проверьте ещё раз.

Затем запустите установщик:

curl -fsSL https://oxidproxy.com/downloads/install.sh | bash

Скрипт автоматически:
1. Проверит, что запущен от root на Debian 12 или 13 для x86_64, и обновит списки пакетов
2. Скачает и установит кастомное ядро Linux с патчем p0f — подходящее для вашей версии Debian, — предварительно проверив, что Secure Boot выключен. Ядро, которое на сервере уже есть, повторно не скачивается
3. Настроит загрузчик GRUB на загрузку нового ядра по умолчанию и предупредит, если вместо него загрузится другое
4. Установит logrotate и nftables, затем пакет OxidProxy. Пакет создаёт системного пользователя oxidproxy и systemd-службу — она включена в автозапуск, но пока не запущена
5. Спросит, ставить ли баннер при входе. При каждом входе по SSH под root он показывает состояние службы, ядро, сети и адрес панели; стандартное приветствие Debian при этом отключается, оригинал сохраняется в /etc/motd.debian-backup
6. Предложит перезагрузить сервер, если это нужно: после установки ядра или если работает другое ядро

Без терминала (из скрипта или у агента по SSH) скрипт сам отвечает «нет» на оба вопроса. Чтобы ответить заранее, задайте OXID_MOTD (баннер) и OXID_REBOOT (перезагрузка) со значением y или n:

curl -fsSL https://oxidproxy.com/downloads/install.sh | OXID_MOTD=y OXID_REBOOT=n bash

3.2. Ручная установка

  1. Скачайте .deb-пакет со страницы загрузки
  2. Установите пакет вместе с зависимостями — logrotate и nftables, на минимальных образах их может не быть:
apt-get update
apt-get install -y logrotate nftables
dpkg -i oxidproxy_*.deb
# При ошибках зависимостей:
apt-get install -f -y
  1. (Опционально) Установите кастомное ядро для p0f. Команды ниже — для Debian 12; на Debian 13 ядро ставьте автоматическим установщиком (раздел 3.1): он ставит 6.12.111-oxidproxy-p0f и держит его в GRUB первым, впереди собственных ядер Debian.
dpkg -i linux-image-6.1.187-oxidproxy-p0f_6.1.187-oxidproxy-p0f-1_amd64.deb
update-grub
ПримечаниеПакет linux-headers для ядра 6.1.187-oxidproxy-p0f (Debian 12) доступен для скачивания на странице oxidproxy.com/#download. Он может понадобиться для сборки внешних модулей ядра.

3.3. Что создаётся при установке

Путь Назначение
/usr/bin/oxidproxy Исполняемый файл
/etc/oxidproxy/config.yaml Основной конфигурационный файл
/etc/oxidproxy/blacklist.txt Список заблокированных доменов/IP
/etc/oxidproxy/whitelist.txt Белый список разрешённых IP и подсетей
/etc/rc.local Загрузочный скрипт с закомментированной строкой маршрута подсети — её нужно заполнить (раздел 4, шаг 2); создаётся, если его нет, в существующий файл строка добавляется
/etc/sysctl.d/90-oxidproxy.conf Настройки ядра (sysctl)
/etc/sysctl.d/89-oxidproxy-ra.conf Только на серверах, где маршрут IPv6 по умолчанию приходит из объявлений маршрутизатора: сохраняет этот маршрут после включения пересылки (forwarding)
/usr/lib/systemd/system/oxidproxy.service Файл службы systemd
/etc/logrotate.d/oxidproxy Конфигурация ротации логов
/usr/lib/systemd/system/oxidproxy-logrotate.timer Ежечасная ротация файлов журнала в /var/log/oxidproxy, вместе с oxidproxy-logrotate.service
/var/log/oxidproxy/ Каталог логов
/var/lib/oxidproxy/ Каталог данных: файлы аккаунтов, CA сервера (ca/) и сертификат HTTPS API (api-tls/), их создаёт служба
/usr/share/doc/oxidproxy/README.txt Краткая справка по настройкам
/boot/vmlinuz-*-oxidproxy-p0f Кастомное ядро, пакет linux-image-<версия>-oxidproxy-p0f
/etc/default/grub.d/99-oxidproxy-p0f.cfg Только Debian 13: держит новейшее кастомное ядро первым в GRUB, впереди собственных ядер Debian
/etc/profile.d/99-oxidproxy-status.sh
/usr/local/sbin/oxidproxy-status
/usr/local/sbin/dashboard-url
Баннер при входе и команда dashboard-url, которая печатает полную ссылку на панель; только если вы согласились на баннер

3.4. Обновление и удаление

Обновление. Запустите установщик ещё раз — той же командой, что в разделе 3.1. Он заменит пакет, а ядро скачает, только если в выпуске есть ядро, которого на сервере ещё нет. Вопрос про баннер прозвучит снова; ответ «нет» уже установленный баннер не убирает. Обновить вручную — поставить новый пакет поверх старого:

dpkg --force-confold -i oxidproxy_*.deb
# При ошибках зависимостей:
apt-get install -f -y

Удаление.

apt remove oxidproxy

останавливает службу, убирает её из автозапуска и удаляет программу. Конфигурация, файлы аккаунтов, CA и логи остаются: повторная установка пакета подхватит их, логины и пароли будут прежними. Если служба была в автозапуске, она туда вернётся; запустите её командой systemctl start oxidproxy.

apt purge oxidproxy

удаляет и остальное: /etc/oxidproxy (конфиг с лицензионным ключом и токенами, списки), /var/lib/oxidproxy (файлы аккаунтов, CA), /var/log/oxidproxy, файлы /etc/sysctl.d/90-oxidproxy.conf и 89-oxidproxy-ra.conf, а также задержки профилей (latency_base_ms) на сетевых интерфейсах. Файлы аккаунтов и логи, которые конфиг складывал в другие места (accounts_file, log.dir), не трогаются.

Даже purge не удаляет:

ВниманиеПосле apt purge новая установка начинается с чистого листа: конфиг снова из шаблона, все логины, пароли и CA сервера новые. Клиентам понадобятся новые файлы аккаунтов, а устройствам, которые работают через MITM-порты, — доверие к новому CA.

4. Первоначальная настройка

Сразу после установки служба ещё не работает. Она включена в автозапуск и сама поднимется после перезагрузки на шаге 4, поэтому сначала выполните шаги 1–3:

Эти значения сервер проверяет при запуске. Если в license_key, master_token или public_ip остались значения из шаблона, служба назовёт нужное поле и не стартует: наполовину настроенный сервер в работу не уходит.

Шаг 1. Отредактируйте конфигурацию

nano /etc/oxidproxy/config.yaml

Обязательно заполните:
- license_key — ваш лицензионный ключ (получить в Telegram)
- public_ip — внешний IPv4 адрес вашего сервера
- ipv6_subnets — ваши IPv6 подсети
- master_token — секретный токен для API (замените на свой!)

Шаг 2. Настройте маршрутизацию IPv6

Отредактируйте файл /etc/rc.local и раскомментируйте строку маршрута:

nano /etc/rc.local

Замените шаблон на вашу реальную подсеть:

ip -6 route add local 2a01:xxxx::/32 dev lo
ВниманиеБез правильной маршрутизации IPv6 прокси не сможет привязываться к адресам из указанных подсетей.

Шаг 3. Проверьте конфигурацию

oxidproxy -t /etc/oxidproxy/config.yaml

Должно вывести ✅ Syntax OK. с перечислением основных параметров.

Шаг 4. Перезагрузите сервер

reboot

Это необходимо для применения кастомного ядра и правил маршрутизации.

Шаг 5. Проверьте службу

После перезагрузки служба уже работает. Проверьте:

systemctl status oxidproxy

В статусе должно быть active (running). Если вы не перезагружали сервер (например, кастомное ядро уже работало), запустите службу сами: systemctl start oxidproxy.


5. Конфигурация (config.yaml)

Все настройки находятся в файле /etc/oxidproxy/config.yaml. Для применения изменений необходимо перезапустить службу.

СоветПеред перезапуском всегда проверяйте конфигурацию командой oxidproxy -t.

5.1. Лицензия

license_key: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

# license_servers: не обязателен — см. пояснение ниже
Параметр Описание
license_key Обязательный. Лицензионный ключ, полученный при покупке
license_servers Необязательный. Штатные адреса встроены в сервер, задавать их не нужно. Заполняется только тем адресом, который выдала поддержка — например, если обычные точки недоступны из вашей сети. Указанное здесь пробуется в первую очередь.
Примечание

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

Параметр license_servers нужен только в одном случае: поддержка выдала вам отдельный адрес. Такие адреса пробуются раньше встроенных, поэтому рабочая точка начинает использоваться сразу, без ожидания таймаутов по недоступным.

license_servers:
  - "адрес.выданный.поддержкой:8000"

Порядок обхода: сначала адреса из конфига (если заданы), затем встроенные. Сервер, ответивший успешно, поднимается в начало списка и используется при последующих проверках.

ВажноБез валидной лицензии сервер не запустится. Проверить доступность конкретной точки можно командой oxidproxy --ping адрес:порт — например, если поддержка выдала вам отдельный адрес и нужно убедиться, что он доступен из вашей сети. Штатные адреса проверять вручную не требуется: сервер обходит их сам.

5.2. Сетевые параметры

listen_ip: "0.0.0.0"
public_ip: "123.45.67.89"
# ext_iface: "eth0"  # Опционально
Параметр Описание По умолчанию
listen_ip Обязательный. IPv4-адрес, на котором прокси-порты принимают подключения; 0.0.0.0 — все адреса, так и стоит в шаблоне. IPv6 здесь не принимается, с ним сервер не запустится: клиенты подключаются по IPv4. API всегда слушает все интерфейсы —
public_ip Обязательный. Публичный IPv4 адрес сервера (используется в API и генерации ссылок) —
ext_iface Внешний сетевой интерфейс для QoS. Если не указан — определяется автоматически auto

5.3. Маскировка ОС (OS Fingerprinting)

Секция listeners позволяет создать несколько портов, каждый с собственным профилем маскировки TCP/IP отпечатка. Антифрод-системы, анализирующие трафик утилитами типа p0f, увидят характерные для указанной ОС параметры.

Используйте порты 1024 и выше. Служба из пакета работает от пользователя oxidproxy и не может открыть порт ниже 1024: такой порт останется закрытым, а oxidproxy -t предупредит об этом. Это касается и mitm_listeners, api_port, api_port_https.

Каждый listener поддерживает поле mode, определяющее протокол:

Режим Описание
socks SOCKS5/SOCKS5h (по умолчанию)
http HTTP CONNECT прокси (метод CONNECT с авторизацией Proxy-Authorization: Basic)
hybrid Автодетект: SOCKS5 и HTTP на одном порту. Сервер определяет протокол по первому байту
listeners:
  - port: 1080
    os_preset: "linux"
    # mode: "socks"  # По умолчанию, можно не указывать

  - port: 1081
    os_preset: "android"
    mode: "hybrid"    # Принимает и SOCKS5, и HTTP CONNECT

  - port: 1082
    os_preset: "windows"
    mode: "http"

  - port: 1083
    os_preset: "ios"
    mode: "socks"

  - port: 1084
    os_preset: "macos"
    mode: "http"
СоветРежим hybrid — рекомендуемый. Один порт обслуживает оба протокола, не нужно открывать дополнительные порты. Определение протокола происходит мгновенно по первому байту.

Доступные профили:

Профиль TCP MSS Congestion Control Описание
linux Системное значение cubic Стандартный Linux сервер
android Распространённые для платформы bbr Мобильный Android-клиент
windows Распространённые для платформы cubic Windows-устройство
ios Распространённые для платформы cubic iPhone / iPad
macos Распространённые для платформы cubic macOS десктоп
ПримечаниеTCP MSS не является фиксированным числом. Для каждого профиля, который эмулирует операционную систему, значение выбирается из распространённых в тех сетях, где эта платформа обычно и работает, и привязывается к конкретному исходящему IPv6-адресу. В пределах сессии оно не меняется, поэтому поведение предсказуемо. При ротации адреса значение может смениться — так же, как это происходит у настоящего устройства при переходе между сетями. Профиль linux ничего не эмулирует и сохраняет системное значение.

Тонкая настройка (только для опытных пользователей):

Каждый профиль задаёт эти значения сам, поэтому в шаблоне конфигурации у портов только порт, профиль ОС и режим. Чтобы изменить значение, добавьте ключ под портом; без ключа действует значение профиля.

Ключ Что задаёт Значения По умолчанию
tcp_congestion Алгоритм контроля перегрузки Любой загруженный в ядро: cubic, bbr и другие. Регистр не важен: BBR читается как bbr bbr у android, cubic у остальных
tcp_window_size Буфер сокета в байтах — потолок скорости одного соединения Число. Больше 8388608 (8 МБ) ничего не даёт: пакет ограничивает буферы сокетов в системе 8 МБ 1 МБ у android, 2 МБ у ios, 4 МБ у windows и macos; у linux не задаётся
latency_base_ms Добавочная задержка сети доступа, мс. Действует на профиль, а не на порт: задайте всем портам одного os_preset одно значение, считая порт без ключа за 5. Если значения разные, действует только одно из них, а oxidproxy -t предупреждает 0 и больше; 0 — без задержки 5 у android, ios, windows и macos; к linux не применяется
tos Класс трафика IPv6 auto; число от 0 до 255 — одно значение на весь порт; список, например [0, 32, 40], — свой набор auto: у каждого исходящего адреса своё значение, как у реальных устройств в разных сетях
  - port: 1081
    os_preset: "android"
    mode: "hybrid"
    tos: [0, 32, 40]      # свой набор вместо auto

Прежние значения шаблона tos: 10 (android) и tos: 8 (ios, macos) работают как auto. Любое другое одно число, кроме 0, ставит один и тот же класс на все соединения порта. У настоящих устройств так не бывает, поэтому oxidproxy -t об этом предупреждает. Пустой список (tos: []) — ошибка. Два младших бита значения в TCP-соединениях не передаются: ими управляет ядро. UDP маркируется, только когда задано одно число.

ПримечаниеНеизвестный os_preset — ошибка конфигурации: такой порт не открывается, остальные работают, oxidproxy -t сообщает об ошибке и завершается с кодом 1. Допустимые профили: windows, macos, ios, android, linux. Порт без os_preset получает linux.
ВниманиеБездумное изменение параметров тонкой настройки может привести к нестабильной работе или ухудшению маскировки. Если вы не уверены — оставьте значения по умолчанию.

5.4. IPv6 подсети и ротация

ipv6_subnets:
  - cidr: "2a01:xxxx::/32"
    weight: 427
  - cidr: "2a02:yyyy:yyyy:yyyy::/64"
    weight: 16

rotation_interval: 10
Параметр Описание
cidr IPv6 подсеть в CIDR-нотации. Поддерживаются подсети любого размера (/29, /32, /48, /64 и т.д.)
weight Вес подсети, обязателен у каждой подсети. Чем больше значение, тем чаще подсеть используется при генерации исходящих адресов. Подсеть с весом 0 не используется; хотя бы у одной подсети вес должен быть больше 0
rotation_interval Интервал ротации IP в минутах. 0 — ротация отключена (IP сохраняется до перезапуска службы)

Как работает ротация:
- IP-адрес привязан к паре логин/пароль (Sticky Session)
- При каждой авторизации проверяется, не истёк ли rotation_interval
- Если истёк — генерируется новый IPv6 из подсети (с учётом весов)
- Активные соединения НЕ разрываются — смена IP происходит только при новом подключении
- При простое сессии более 5 минут (настраиваемо через timeouts.idle) она закрывается

СоветПример: Если у Подсети-A вес 100, а у Подсети-B вес 50, то Подсеть-A будет выдавать адреса в 2 раза чаще.

5.5. API и управление пользователями

api_port: 8080
api_port_https: 8443  # опционально — HTTPS API

master_token: "my-secret-token"

max_accounts: 100000

accounts_file: "/var/lib/oxidproxy/accounts_[os]_[mode]_[port].txt"

account_seed: 8312921461266748753  # задал установщик
Параметр Описание По умолчанию
api_port Обязательный. Порт HTTP API, 1024 и выше; в шаблоне 8080 —
api_port_https Порт HTTPS API, 1024 и выше. Необязателен: без него HTTPS API нет; в шаблоне 8443 —
master_token Обязательный. Секретный токен для аутентификации запросов к API. Не короче 12 байт (12 латинских букв или цифр), значение из шаблона не принимается — иначе сервер не запустится. Используйте латинские буквы, цифры и - . _ ~. Любой другой символ в ссылке с ?token=, набранной вручную, нужно URL-кодировать, и oxidproxy -t об этом предупреждает. Панель и ссылки в журнале кодируют токен сами —
max_accounts Обязательный. Максимум генерируемых уникальных аккаунтов (каждый со своим IPv6); в шаблоне 100000 —
accounts_file Путь для экспорта аккаунтов. Поддерживает шаблоны [port], [os] и [mode]. Если файлов получается больше одного — несколько портов, hybrid-порт или MITM-порт, — нужны все три шаблона, иначе сервер не запустится accounts.txt (только если файл один). Путь относительный, поэтому служба из пакета положит файл в /var/log/oxidproxy. Задайте абсолютный путь, как в шаблоне
account_seed Зерно генерации: логины и пароли выводятся из него и не меняются между перезапусками. Без ключа при каждом запуске выдаются новые логины и пароли, а уже выданные перестают работать. Смена значения переиздаёт все учётки задаёт установщик, своё у каждого сервера
СоветОставьте account_seed таким, как его задал установщик: логины и пароли сохраняются между перезапусками и обновлениями, внешним системам не нужны новые учётки. Копируя конфигурацию на другой сервер, задайте ему своё значение.

5.6. DNS-резолвер

Имена разрешает сам сервер. Кэш общий для всех листенеров: имя, найденное для одного клиента, следующему достаётся уже готовым. Серверы с weight делят нагрузку между собой, серверы без веса включаются только тогда, когда взвешенные не отвечают. Резолвер следит за поведением каждого сервера и перестаёт слать запросы тому, кто замолчал, возвращаясь к нему позже. Если основной сервер не ответил за 300 мс, запрос параллельно уходит резервному (серверу без weight), и побеждает первый ответ, поэтому один медленный сервер не задерживает клиента. Держите хотя бы один резервный сервер: если все серверы со взвешиванием, переключаться некуда.

timeout — это время, которое даётся одному серверу на ответ, а не время ожидания клиента: благодаря параллельному запросу клиент обычно получает ответ раньше. Задача этого значения — решать, как быстро замолчавший сервер будет выведен из ротации, поэтому оно короткое. Поставьте 2, если из ротации выводятся исправные серверы. Что происходит с каждым сервером сейчас, видно в /stats, раздел 6.2.

dns:
  timeout: 1
  cache_size: 8000
  suppress_aaaa_not_found: true

  servers:
    # Основные (с балансировкой)
    - address: "[2606:4700:4700::1111]:53"
      weight: 53
    - address: "1.1.1.1:53"
      weight: 7

    # Резервные (failover)
    - address: "[2620:fe::fe]:53"
    - address: "9.9.9.9:53"
Параметр Описание По умолчанию
timeout Сколько секунд даётся одному серверу на ответ 1
cache_size Количество закешированных DNS-записей 1024
suppress_aaaa_not_found Подавлять предупреждения о доменах без AAAA-записи false
servers Обязательный, хотя бы один сервер. address — только IP-адрес и порт, IPv6 в квадратных скобках: [2606:4700:4700::1111]:53; имя хоста не принимается. Сервер с weight больше 0 — основной; без weight или с weight: 0 — резервный —

Логика работы:
1. Запрос отправляется на один из основных серверов с весом (выбирается по weight — чем больше вес, тем чаще сервер используется). Основных серверов может быть несколько.
2. Если основной сервер не ответил (таймаут/ошибка) — запрос идёт в резервный пул. Резервных серверов также может быть несколько (указываются без параметра weight).
3. Если домен существует, но не имеет AAAA-записи — это не ошибка соединения, бэкап не используется

СоветРекомендация: Добавьте DNS вашего хостинг-провайдера с высоким весом. Адреса DNS бывают указаны в файле /etc/resolv.conf или их можно узнать в отделе поддержки провайдера. Провайдерские DNS обычно отвечают за 1–2 мс (против 10–50 мс у Google/Cloudflare).

5.7. Ограничение скорости (Traffic Shaping)

shaping:
  rate: 12500000   # 100 Мбит/с
  burst: 25000000  # 200 Мбит/с (burst)
Параметр Описание
rate Максимальная скорость в байтах/сек. 0 = без ограничения
burst Размер «взрывного» буфера в байтах. Позволяет кратковременно превысить rate. Рекомендуется rate × 2. 0 — одна секунда rate. Значение меньше 65536 поднимается до 65536 (или до rate, если rate меньше). При rate: 0 не действует
ПримечаниеОграничение действует суммарно на весь сервер (все пользователи, оба направления). Один и тот же лимит применяется отдельно к upload и download. Секция shaping необязательна; если она есть, обязательны оба ключа — rate и burst.

Шпаргалка:

Скорость Значение rate
1 Мбит/с 125 000
10 Мбит/с 1 250 000
100 Мбит/с 12 500 000
1 Гбит/с 125 000 000

5.8. Тайм-ауты

timeouts:
  shutdown: 10    # Ожидание завершения сессий при остановке (сек)
  idle: 300       # Максимальное бездействие сессии (сек)
Параметр Описание По умолчанию
shutdown Время ожидания (сек) для завершения активных соединений при остановке/перезапуске сервиса. Держите меньше 85: systemd принудительно завершает службу, если через 90 секунд после команды остановки она ещё работает 15
idle Максимальное время неактивности TCP/UDP сессии (сек), после которого она разрывается. Не меньше 1: с 0 сервер не запустится 300 (5 мин)

5.9. Сервисный аккаунт

service_account:
  enabled: true
  login: "checker"
  password: "strong_password"
  allowed_domain: "ifconfig.me"

Сервисный аккаунт предназначен для мониторинга и проверки работоспособности прокси. Особенности:
- Статический логин/пароль (не генерируется, не ротируется)
- Имеет доступ только к одному домену (allowed_domain)
- Не расходует лимиты ротации
- Не сменяет IP

Секция обязательна со всеми четырьмя ключами, даже если учётка вам не нужна: чтобы выключить её, поставьте enabled: false. Без секции или без одного из ключей сервер не запустится.

СоветИдеально подходит для внешних чекеров: настройте allowed_domain: "ifconfig.me" и проверяйте исходящий IP командой curl --proxy socks5h://checker:password@IP:PORT ifconfig.me. Именно socks5h: имя должно дойти до прокси, потому что учётка пропускает только allowed_domain по имени.

5.10. Чёрный список (Blacklist)

blocked_file: "/etc/oxidproxy/blacklist.txt"

В файле перечисляются заблокированные домены (вместе с поддоменами), IP-адреса и сети IPv4 или IPv6 в записи CIDR, по одному на строку. Комментарии начинаются с #. Список действует во всех режимах, включая браузерный.

Ключ blocked_file обязателен. Если самого файла нет, сервер запускается без чёрного списка и пишет об этом в журнал.

# Блокировка рекламных доменов
doubleclick.net
ads.google.com

# Блокировка приватных IPv6 сетей
fc00::/7
fe80::/10
ВажноБлокировка работает с учётом поддоменов. Если заблокирован google.com, то mail.google.com и ads.google.com тоже будут недоступны.

5.11. Логирование

По умолчанию сервер пишет журнал только в systemd-journald, читать его — journalctl -u oxidproxy. В шаблоне строка dir закомментирована:

log:
  # dir: "/var/log/oxidproxy"
  level: "info"
Уровень Описание
error Только критические ошибки
warn Ошибки и предупреждения
info Основные события (подключения, DNS, ротация) — рекомендуется
debug Детальная отладка (каждая сессия, каждый запрос DNS)

Раскомментируйте dir, чтобы писать ещё и в файлы. Создаются два файла:
- oxidproxy.log — полный лог (уровень задаётся параметром level)
- error.log — только ошибки (всегда)

Пакет ротирует файлы только в /var/log/oxidproxy: logrotate, который ставится вместе с пакетом, делает это раз в час и хранит три последних. Файлы в любом другом каталоге не ротируются и растут без ограничений; oxidproxy -t и служба при запуске об этом предупреждают. Оставьте dir: "/var/log/oxidproxy" или настройте logrotate для своего каталога сами.

Проверить, куда идёт журнал: oxidproxy -t покажет Log Dir: not set, logging to journal only или используемый каталог.

5.12. MITM-режим (mitm_listeners)

В MITM-режиме OxidProxy терминирует TLS-соединение клиента собственным удостоверяющим центром (CA) и пересобирает запрос к целевому серверу с сетевым отпечатком настоящего браузера: JA4 (со всеми составляющими), HTTP/2 и Akamai. Профиль выбирается автоматически по User-Agent клиента, поэтому один порт обслуживает все ОС и браузеры — Chrome, Firefox и Safari на Windows, macOS, Linux, Android и iOS.

MITM-листенеры описываются в отдельной секции mitm_listeners и работают параллельно с обычными listeners:

mitm_listeners:
  - port: 9443
    mode: "hybrid"             # socks (по умолчанию) / http / hybrid
    profiles:
      - "windows-chrome"
      - "windows-firefox"
      - "macos-safari"
      - "android-chrome"
      - "ios-safari"
    default: "windows-chrome"  # если для ОС клиента в списке нет профиля
    # strict: false            # true — отказывать, ничего не подставляя
    # allow_unknown_ua: false  # true — пускать и клиентов без браузерного UA

Профили именуются по схеме <ос>-<браузер>. Доступные варианты:

ОС Профили
Windows windows-chrome, windows-firefox, windows-edge
macOS macos-chrome, macos-firefox, macos-safari
Linux linux-chrome, linux-firefox
Android android-chrome, android-firefox
iOS ios-safari

Поля листенера:

Параметр Описание
port Порт MITM-листенера
profiles Список разрешённых профилей (<ос>-<браузер>). Нужный выбирается по User-Agent клиента
default Запасной профиль. Распознанный браузер, которого нет в profiles, сначала получает другой профиль той же ОС из списка, и только если такой ОС в списке нет — default. Должен входить в profiles, иначе сервер не запустится
strict Если true — отказывать любому браузеру не из profiles, не подставляя ни другой профиль, ни default (по умолчанию false)
allow_unknown_ua Клиентам без распознаваемого браузерного User-Agent — curl, скриптам, своему софту — по умолчанию отказ с короткой страницей-объяснением. true пускает их с профилем default (при strict: true — нет). По умолчанию false
mode Протокол листенера: socks (по умолчанию), http или hybrid — так же, как у обычных listeners. Если параметр не указан, порт работает в режиме socks.
ВажноПоскольку TLS терминируется собственным CA сервера — каждый сервер создаёт свой при первом запуске, и его ключ никогда не покидает сервер, — клиент должен один раз добавить сертификат CA сервера в доверенные — иначе браузер покажет ошибку сертификата. CA доступен для скачивания с сервера (эндпоинт /ca).

5.13. Брендирование панели

Веб-панель может нести ваш знак вместо нашего. Сделано для перепродажи: панель клиента не обязана рекламировать поставщика.

brand:
  name:   "Acme"
  accent: "Proxy"
  url:    "https://acme.example"
Параметр Описание
name Первая половина надписи, основным цветом. Если не задана — Oxid
accent Вторая половина, красится акцентным цветом выбранной темы. Оставьте пустой (accent: "") — надпись будет одноцветной; если не задана — Proxy
url Куда ведёт надпись. Пустое значение (url: "") убирает ссылку совсем; если параметр не задан, ссылка ведёт на https://oxidproxy.com. Принимаются только http:// и https://

Настройка меняет не только шапку. Она же переименовывает заголовок вкладки браузера, подпись темы в списке и имя файла сертификата, который панель предлагает скачать. Полное имя (name + accent) получают и сертификаты, которые сервер создаёт с этого момента: новый MITM-CA с примером выше называется AcmeProxy MITM Root CA, сертификат HTTPS API получает то же имя. Уже созданные сертификаты имя не меняют: переименованный CA — это новый CA, и всем клиентам пришлось бы ставить его заново.

ПримечаниеСекция необязательна. Без неё в панели остаётся знак OxidProxy, как и раньше. Обе половины имени вместе — не больше 64 букв на любом языке.

6. HTTP API

API доступен по адресу http://YOUR_IP:PORT или https://YOUR_IP:PORT, где PORT задаётся параметрами api_port и api_port_https в конфигурации (в шаблоне 8080 и 8443). Без api_port_https HTTPS API нет.

Для аутентификации используется параметр token (значение из master_token).

Каждый метод отвечает стандартным кодом HTTP: 200 при успехе, 401, если токен не передан или неверен, 400, если запрос невыполним как написан, например запрошен режим, которого нет у листенера, или правка белого списка отклонена (раздел 6.6), и 500, если сервер не смог выполнить верный запрос, например не удалось сохранить правку белого списка. 403 означает, что адреса вызывающего нет в белом списке IP (раздел 7.4): он охраняет и API, и панель. /ca отвечает 404, когда на сервере нет ни MITM-порта, ни HTTPS API и CA поэтому не создан (с api_port_https из шаблона CA есть); /list отвечает 404 в случаях из раздела 6.5; правки белого списка могут получить 409 (раздел 6.6), а /health отвечает 503, пока лицензия не подтверждена. Пояснение приходит в теле, но ветвиться в скрипте следует по коду.

6.1. Получение нового прокси — GET /allocate

Возвращает строку подключения с новой парой логин/пароль. Листенер указывается портом — ту же ссылку формирует дашборд (раздел 7.6):

curl "http://YOUR_IP:8080/allocate?token=YOUR_TOKEN&port=1080&mode=socks5"

Ответ:

socks5://user_AbCdEfGh:KlMnOpQrSt@YOUR_IP:1080

Параметры запроса:

Параметр Описание По умолчанию
token Обязательный. Секретный master_token —
port Порт листенера, для которого нужны реквизиты, в том числе MITM-порт. Указывает листенер однозначно —
mode Протокол: socks5 или http; socks — то же, что socks5, https — то же, что http. Любое другое значение даёт socks5, в журнал пишется предупреждение socks5
os Профиль ОС: linux, android, windows, ios, macos. Выбирает листенер по профилю; при заданном port не учитывается linux

Порт указывает листенер однозначно. os выбирает его по профилю; если листенеров с таким профилем несколько, вернётся первый по конфигурации. Вызов без port и без os берёт первый листенер linux, а если такого нет — первый листенер в конфигурации. Порт или профиль, которых нет в конфигурации, получают ответ 400 со списком настроенных.

Примеры:

# Реквизиты для листенера на порту 1081
curl "http://YOUR_IP:8080/allocate?token=YOUR_TOKEN&port=1081&mode=socks5"
# Ответ: socks5://user_xxx:pass_xxx@YOUR_IP:1081

# Тот же листенер, HTTP-прокси (листенер в режиме http или hybrid)
curl "http://YOUR_IP:8080/allocate?token=YOUR_TOKEN&port=1081&mode=http"
# Ответ: http://user_xxx:pass_xxx@YOUR_IP:1081

# По профилю ОС
curl "http://YOUR_IP:8080/allocate?token=YOUR_TOKEN&os=android"
ПримечаниеПорт, которого нет в конфигурации, и протокол, который листенер не поддерживает, отклоняются с кодом 400:
Error: no listener on port 1090. Configured ports: 1080, 1081, 1082
Error: http mode is not enabled for 'linux' profile (port 1080). Listener mode: socks
СоветВ режиме hybrid оба варианта (mode=socks5 и mode=http) работают на одном порту.

6.2. Статистика — GET /stats

Возвращает полную статистику сервера в JSON.

curl "http://YOUR_IP:8080/stats?token=YOUR_TOKEN"

Пример ответа (сокращённо — поля listeners/mitm_listeners опущены, это эхо соответствующих секций конфига; список DNS-серверов сокращён до двух, массивы hourly и daily — до одной точки):

{
  "version": "2.6.2",
  "uptime_seconds": 9980,
  "active_connections": { "tcp": 56, "udp": 4 },
  "mitm": { "active": 3, "total": 512 },
  "traffic": {
    "ingress_bytes": 264074969,
    "egress_bytes": 35524983
  },
  "dns": {
    "total_queries": 18905,
    "cache_hits": 17106,
    "cache_stale_served": 12,
    "cache_misses": 1799,
    "cache_entries": 1420,
    "inflight_joined": 63,
    "hedge_fired": 208,
    "hedge_won_by_backup": 41,
    "all_failed": 3,
    "bad_names": 0,
    "all_down_queries": 0,
    "servers": [
      {
        "address": "[2606:4700:4700::1111]:53",
        "weight": 58, "state": "healthy",
        "queries": 1502, "failures": 7,
        "timeouts": 6, "servfails": 1, "net_errors": 0,
        "consecutive_failures": 0,
        "last_failure_ago_s": 1840, "last_error": "Timeout"
      },
      {
        "address": "9.9.9.9:53",
        "weight": null, "state": "healthy",
        "queries": 36, "failures": 0,
        "timeouts": 0, "servfails": 0, "net_errors": 0,
        "consecutive_failures": 0,
        "last_failure_ago_s": null, "last_error": null
      }
    ]
  },
  "events": {
    "total_connections": 18963,
    "connection_errors": 12,
    "access_denied": 0,
    "blocked_domains": 0,
    "dns_no_ipv6": 4,
    "firewall_blocks": 0
  },
  "license": {
    "expires_at_unix": 1770484105,
    "days_left": 29,
    "seconds_left": 2530000,
    "is_active": true,
    "servers": { "node-1": "online", "node-2": "online", "node-3": "online" }
  },
  "telemetry": {
    "cpu_cores": 2,
    "total_mem_mb": 2048,
    "latest_cpu_usage": 4.8,
    "latest_mem_mb": 96,
    "open_fds": 412,
    "max_fds": 1000000,
    "hourly": [ { "ts": 1770480000, "rx": 1843200, "tx": 245760 } ],
    "daily": [ { "ts": 1770393660, "rx": 1650000, "tx": 231000 } ]
  },
  "kernel_p0f": true,
  "whitelist_fallback": null,
  "server_ip": "1.2.3.4",
  "shaper": {
    "enabled": false,
    "rate_bytes": 0,
    "burst_bytes": 0,
    "up_throttled": 0, "down_throttled": 0,
    "up_wait_ms": 0, "down_wait_ms": 0,
    "up_oversize": 0, "down_oversize": 0
  }
}

Основные поля:

Поле Описание
mitm Активные и суммарные (с момента запуска) соединения через MITM-порты
dns Попадания и промахи кэша, как часто использовался параллельный запрос к резервному серверу, и строка по каждому серверу: состояние, вес, сколько запросов он обслужил и как его отказы делятся на таймауты, SERVFAIL и сетевые ошибки. Сервер, который перестал отвечать, виден здесь первым. all_down_queries — сколько запросов ушло, пока все серверы были помечены недоступными.
whitelist_fallback null, пока действует белый список из файла; иначе — причина, по которой файл не удалось использовать
events.dns_no_ipv6 / firewall_blocks Домены без AAAA-записи и соединения, отклонённые IP Whitelist'ом — те же категории, что и на диаграмме дашборда (раздел 7.3)
license.is_active Подтверждена ли лицензия в данный момент. При false прокси-порты закрыты до повторной проверки
license.days_left / seconds_left Сколько осталось до конца лицензии по часам сервера. seconds_left — в секундах: после окончания срока значение отрицательное, пока срок ещё не известен (сразу после запуска) — 0. days_left — в целых сутках и отрицательным не бывает: 0 после окончания срока, пока срок не известен и в последние сутки
license.servers Состояние каждой встроенной ноды лицензирования
kernel_p0f true, когда сервер работает на ядре OxidProxy и подмена отпечатка ОС действует. false — трафик уходит с собственной TCP-сигнатурой машины: поставьте ядро и перезагрузитесь
telemetry Загрузка CPU/RAM сервера — источник данных для панели Hardware Health (раздел 7.1), открытые файловые дескрипторы против лимита и история трафика для графиков раздела 7.2: hourly и daily, по точке в минуту (60 и 1440 точек)
server_ip Значение public_ip из конфигурации
shaper Текущие лимиты и то, как часто и как долго ограничение придерживало трафик (раздел 5.7)
listeners / mitm_listeners Настройки портов из соответствующих секций config.yaml в том виде, в каком их применил сервер, — удобно для скриптов, которым нужен список активных портов и профилей
ПримечаниеСтатистика доступна без токена с localhost (127.0.0.1). Это позволяет использовать её в скриптах мониторинга непосредственно на сервере.

6.3. Состояние и версия — GET /health, GET /version

Оба отвечают без токена; белый список IP действует и здесь. /health отдаёт 200, пока лицензия подтверждена, и 503, когда нет, — удобно для внешнего мониторинга. /version отдаёт версию простым текстом.

curl "http://YOUR_IP:8080/health"
{"status":"ok","license_active":true,"uptime_seconds":9980,"version":"2.6.2"}

curl "http://YOUR_IP:8080/version"
2.6.2

6.4. Метрики — GET /metrics

Большая часть счётчиков из /stats в текстовом формате Prometheus: по строке имя значение, строки с # — HELP и TYPE. Читается любым Prometheus-совместимым сборщиком. Нужен токен, кроме запросов с самой машины.

curl "http://YOUR_IP:8080/metrics?token=YOUR_TOKEN"

Имена начинаются с oxidproxy_: например, oxidproxy_active_tcp, oxidproxy_bytes_egress_total, oxidproxy_license_active, oxidproxy_kernel_p0f_active, oxidproxy_dns_queries_total. Запросы к API, отклонённые из-за неверного или отсутствующего токена (401), считает oxidproxy_api_unauthorized_total. Запросы и соединения, отклонённые белым списком IP, сюда не выводятся: их считают events.firewall_blocks в /stats и панель Recent Blocks в дашборде.

6.5. Файлы аккаунтов — GET /list

Скачивает файл аккаунтов порта для одного протокола — тот же, что кнопки TXT в панели (раздел 7.8). mode — socks5 или http. Ответ 404 — для порта, которого нет в конфигурации, и пока файл не выгружен; без port или с любым другим mode — 400.

curl -OJ "http://YOUR_IP:8080/list?token=YOUR_TOKEN&port=1081&mode=socks5"

6.6. Белый список IP — GET /whitelist

Тот же список, которым управляет панель (раздел 7.4), меняется на ходу, без перезапуска. Только адреса и подсети IPv4. GET возвращает записи, итоги и последние блокировки в JSON; добавление и удаление отвечают OK: ….

curl "http://YOUR_IP:8080/whitelist?token=YOUR_TOKEN"
curl -X POST "http://YOUR_IP:8080/whitelist/add?token=YOUR_TOKEN&cidr=203.0.113.0/24"
curl -X DELETE "http://YOUR_IP:8080/whitelist/remove?token=YOUR_TOKEN&cidr=203.0.113.0/24"

Если правка невозможна по самому запросу, сервер отвечает 400 и пишет причину в теле: не передан cidr, адрес неверный или IPv6, такая запись уже есть, удаляемой записи нет в списке, запись защищена (замок в панели), запись последняя, удаление закрыло бы доступ вашему же адресу (каким его видит сервер) или в списке уже 1000 записей.

Файл whitelist.txt служба читает при запуске. Если его изменили мимо службы — вручную, скриптом или скопировав поверх другой файл — после того как служба его прочитала, правка действует после перезапуска (systemctl restart oxidproxy). До перезапуска добавление и удаление отвечают 409 и файл не трогают, чтобы не перезаписать вашу правку; после перезапуска повторите запрос. 500 означает, что правку не удалось сохранить: файл не удалось записать либо его не удалось прочитать при запуске службы (whitelist_fallback, раздел 6.2).


7. Web-Дашборд

Встроенный дашборд доступен по адресу:

http://YOUR_IP:8080/dashboard?token=YOUR_TOKEN

7.1. Мониторинг в реальном времени

Дашборд доступен по адресу http://YOUR_IP:PORT/dashboard?token=YOUR_TOKEN, где PORT задаётся параметром api_port в конфигурации. Поддерживается также HTTPS-режим через api_port_https.

Дашборд обновляется каждые 10 секунд и отображает:
- Hardware Health — загрузка CPU (с числом ядер), использование RAM и Open Sockets: открытые файловые дескрипторы, в основном сокеты, против лимита службы. Эта полоса желтеет выше 70% и окрашивается в тревожный цвет темы выше 90%: нагруженный прокси упирается в сокеты задолго до того, как кончится CPU
- Network Traffic — суммарный принятый и отправленный трафик (Rx / Tx), всего соединений с момента запуска, активные TCP и UDP соединения, MITM Sessions (активные сейчас и всего с момента запуска), Traffic Shaper — Disabled или скорость в Мбит/с и burst в МБ (раздел 5.7) — и Shaper Throttle: сколько раз лимит придержал трафик от клиента (↑) и к клиенту (↓)
- Recent Blocks — раздел 7.5
- License & Status — статус (таблица ниже), Days Left (осталось дней), Expires (дата окончания) и состояние каждого сервера лицензирования: online, offline или checking... сразу после запуска. Пока сервер лицензий не ответил, в Days Left и Expires стоит —; в последние сутки Days Left показывает < 1 жёлтым
- DNS Resolver — доля попаданий в кэш (при наведении — сами числа), строка на каждый сервер с весом: вес и состояние (healthy, probing — пробный запрос после сбоев — или down), одна строка Backup Pool — сколько резервных серверов исправны, Hedged Requests — сколько раз резервному серверу уходил параллельный запрос и сколько раз он ответил первым — и Stale / Failed: ответы из устаревших записей кэша и запросы, на которые не ответил ни один сервер (раздел 5.6)
- Версия и аптайм — в шапке дашборда

Статус Что значит
✅ Active Лицензия подтверждена, прокси-порты открыты. В последние сутки статус тоже Active: порты закрываются, только когда сервер лицензий сообщит, что срок вышел
❌ Expired Срок лицензии вышел, прокси-порты закрыты
❌ BLOCKED / ERROR Прокси-порты закрыты по другой причине: лицензия не подтверждена. Почему — сказано в журнале службы: journalctl -u oxidproxy
⛔ Your IP is not whitelisted Сервер теперь отказывает этому адресу с кодом 403: его нет в белом списке IP, например список изменился, пока страница была открыта. Наведите курсор на статус — там адрес, каким его видит сервер (за роутером, подменяющим адреса, — адрес роутера)
🔑 Token rejected Токен, с которым открыта страница, больше не совпадает с master_token: его сменили и перезапустили службу. Откройте дашборд с новым токеном
💀 OFFLINE / DEAD Дашборд не получил данных от сервера: служба остановлена или сервер недоступен

Заголовок и значок вкладки браузера меняются вместе со статусом.

Красный знак ! предупреждает об одном из двух режимов, в которых сервер работает не полностью; причина и что делать — в подсказке (наведите курсор или перейдите на знак клавишей Tab):
- у заголовка AUTO-ROTATION API LINKS, вместо «(p0f Profiled)», — сервер работает не на ядре OxidProxy, и соединения уходят с собственным TCP-отпечатком сервера, а не профиля (kernel_p0f, раздел 6.2). В выводе uname -r должно быть oxidproxy-p0f; если это ядро установлено, но не загружено, журнал при запуске подскажет, как поправить загрузку
- у заголовка панели IP Whitelist — whitelist.txt не удалось прочитать, поэтому пускаются все адреса, и на прокси-порты, и в дашборд, а правка списка выключена. В подсказке указана причина; файл должен читаться пользователем oxidproxy. Исправьте это и выполните systemctl restart oxidproxy

7.2. Графики трафика

Два графика скорости (Rx/Tx в Мбит/с) с подписями средних значений:
- Почасовой — последние 60 минут с шагом 1 минута
- Суточный — последние 24 часа с шагом 1 минута

7.3. Connection Analytics

Круговая диаграмма показывает разбивку всех соединений по категориям:

Категория Цвет Описание
Success зелёный Успешно проксированные соединения
Auth Denied жёлтый Отклонённые по причине неверной авторизации
Conn Errors фиолетовый Сетевые ошибки при установке соединения
Blocked (DPI) серый Заблокированные по чёрному списку доменов
No IPv6 синий Домены без AAAA-записи (не поддерживают IPv6)
Firewall Blocks красный Отклонённые IP Whitelist'ом

7.4. Управление IP Whitelist

Панель «IP Whitelist» позволяет управлять списком разрешённых IP-адресов и подсетей прямо из браузера, без перезапуска сервиса:
- Просмотр — отображает все записи с индикатором защищённости (🔒 — системная запись, недоступная для удаления)
- Добавление — поле ввода принимает отдельный адрес IPv4 или подсеть IPv4 в CIDR-нотации (например, 192.168.1.0/24); IPv6 в белом списке не поддерживается. Нажмите + Add Entry или Enter
- Удаление — кнопка «✕» напротив каждой записи. Удаление 0.0.0.0/0 требует подтверждения во избежание случайной блокировки доступа. Последнюю запись удалить нельзя — её кнопка неактивна: пустой список закрыл бы доступ всем, и дашборду тоже; нельзя удалить и запись, без которой ваш адрес (каким его видит сервер) перестал бы пускаться, — дашборд покажет причину
- Импорт из файла — кнопка «📁 Import» позволяет загрузить .txt-файл с перечнем IP/CIDR (по одному на строку, поддерживаются комментарии через #)

Список автоматически обновляется каждые 10 секунд — изменения, внесённые через панель с другого устройства или через API, отразятся без перезагрузки страницы. Хранится он в файле из параметра whitelist_file, по умолчанию /etc/oxidproxy/whitelist.txt. Ручная правка этого файла при работающей службе действует после перезапуска (systemctl restart oxidproxy); до него панель не сохраняет свои изменения списка, чтобы не перезаписать вашу правку, и подсказывает перезапустить службу.

В списке может быть до 1000 записей. Пока whitelist.txt не прочитан, пускаются все адреса, у заголовка панели горит красный ! (раздел 7.1), а правка списка выключена: исправьте файл и выполните systemctl restart oxidproxy.

ВниманиеЗапись 0.0.0.0/0 разрешает подключения со всех IP-адресов. Если вы её удалите, доступ к прокси получат только адреса, явно перечисленные в списке. Убедитесь, что ваш IP добавлен, прежде чем это делать.

7.5. Recent Blocks

Панель «🚨 Recent Blocks» отображает последние заблокированные соединения (до 10 записей) с IP-адресом и временем блокировки. Счётчик Total показывает суммарное число блокировок с момента последнего запуска сервиса.

В верхней части дашборда для каждого порта листенера автоматически создаётся карточка с подписью его профиля ОС. Кнопки API SOCKS5 и API HTTP неактивны, если порт не обслуживает этот протокол.

При нажатии на кнопку в буфер обмена копируется ссылка для получения нового прокси (запрос GET /allocate?port=...&mode=...), а в нижнем правом углу появляется уведомление.

Под кнопками API-ссылок для каждого профиля расположены кнопки TXT SOCKS5 и TXT HTTP для прямого скачивания файла со списком аккаунтов соответствующего профиля и режима. Кнопка неактивна, если порт не обслуживает этот режим; если файл ещё не выгружен, панель об этом скажет.

Каждый MITM-листенер получает свою карточку MITM, первой в ряду: в ней те же кнопки и ещё Download CA certificate — клиент скачивает CA сервера и один раз добавляет его в доверенные, после чего весь HTTPS-трафик идёт через выбранный профиль браузера. Без mitm_listeners карточка MITM приглушена, с надписью not configured.

7.7. Темы оформления

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

Тема Описание
OxidProxy Dark Фирменная тёмная тема (по умолчанию)
Light Classic Светлая классическая
Dracula Фиолетово-розовая тёмная
Deep Ocean Тёмно-синяя морская
Teal Lagoon Бирюзовая тёмная
Gruvbox Retro Тёплая ретро-палитра
Baroque Bling 💰 Барочная тема с золотыми акцентами
Hacker Монохромная зелёная на чёрном

7.8. Загрузка файлов аккаунтов

Кнопки TXT на карточке каждого порта скачивают его файлы аккаунтов. С путём accounts_file из шаблона они называются так:

Файл Содержимое
accounts_linux_socks5_1080.txt SOCKS5 аккаунты для профиля Linux (порт 1080)
accounts_android_socks5_1081.txt SOCKS5 аккаунты для профиля Android
accounts_android_http_1081.txt HTTP аккаунты для профиля Android (hybrid)
accounts_windows_http_1082.txt HTTP аккаунты для профиля Windows

Каждый файл содержит строки формата protocol://login:password@IP:PORT, готовые для импорта в любое ПО.

СоветНабор доступных файлов зависит от конфигурации listeners и accounts_file. Для hybrid-листенеров создаются два файла — SOCKS5 и HTTP.

8. Управление службой

OxidProxy устанавливается как systemd-сервис и запускается от пользователя oxidproxy.

# Запуск
systemctl start oxidproxy

# Остановка (graceful — ждёт завершения активных сессий)
systemctl stop oxidproxy

# Перезапуск
systemctl restart oxidproxy

# Статус
systemctl status oxidproxy

# Включить автозапуск
systemctl enable oxidproxy

# Просмотр логов в реальном времени
journalctl -u oxidproxy -f
ВниманиеНе запускайте OxidProxy напрямую от root! При запуске от root файлы логов и данных будут принадлежать root, что вызовет ошибки прав доступа при последующих запусках через systemd. Правильный способ — запускать сервис командой systemctl start oxidproxy: systemd автоматически переключается на пользователя oxidproxy, прописанного в юнит-файле службы.

9. Логирование и мониторинг

Файлы логов

По умолчанию сервер пишет журнал только в systemd-journald: journalctl -u oxidproxy. Файлы появляются, когда задан log.dir (раздел 5.11):

Файл Описание
/var/log/oxidproxy/oxidproxy.log Основной лог (уровень задаётся в конфиге)
/var/log/oxidproxy/error.log Только ошибки

Ротация логов

Файлы журнала в /var/log/oxidproxy ротирует logrotate раз в час, он ставится вместе с пакетом; запускает его собственный таймер пакета oxidproxy-logrotate.timer. Хранятся три последних файла, старые сжимаются gzip. Файлы в другом каталоге, заданном в log.dir, не ротируются, и oxidproxy -t об этом предупреждает.

Системная телеметрия

Каждые 10 секунд в лог выводится строка [SYS_STATS]:

[SYS_STATS] System Mem: 524/2048 MB | App Mem: 85 MB | CPU: 12.3% | Conns: 42 / 4096

10. Командная строка (CLI)

oxidproxy [OPTIONS]

Опции:
  -c, --config <PATH>      Путь к файлу конфигурации (по умолчанию: /etc/oxidproxy/config.yaml)
  -t, --test [<PATH>]      Проверить синтаксис конфигурации
  -g, --generate           Сгенерировать пример config.yaml.example
  -b, --blacklist          Сгенерировать пример blacklist.txt.example
  -H, --hwid               Показать HWID сервера
  -p, --ping <HOST:PORT>   Проверить доступность лицензионного сервера
  -V, --version            Показать версию
  -h, --help               Показать справку

oxidproxy -t без пути проверяет установленную конфигурацию, печатает те же предупреждения, что сервер пишет в журнал при запуске, и завершается с кодом 1 при любой ошибке конфигурации.

Без ключей -t, -g, -b, -H, -p, -V и -h команда oxidproxy запускает сам прокси — с конфигом из -c или с конфигом по умолчанию. На установленном сервере это работа службы (раздел 8): systemd запускает oxidproxy -c /etc/oxidproxy/config.yaml от пользователя oxidproxy и с теми сетевыми правами, которые нужны прокси. Не запускайте прокси из командной строки. Команды oxidproxy ниже (-t, -g, -p, -H) прокси не запускают, их можно выполнять от root.

Примеры:

# Запуск прокси — через systemd, не вручную
systemctl start oxidproxy

# Проверка конфига перед деплоем
oxidproxy -t /etc/oxidproxy/config.yaml

# Свежий пример конфигурации: config.yaml.example в текущем каталоге
oxidproxy -g

# Проверка доступности сервера лицензий
oxidproxy --ping адрес.выданный.поддержкой:8000

# Получение HWID
oxidproxy -H

11. Диагностика и устранение неполадок

Сервис не запускается

  1. Проверьте конфигурацию:
    oxidproxy -t /etc/oxidproxy/config.yaml

  2. Проверьте логи:
    journalctl -u oxidproxy --no-pager -n 50

  3. Проверьте лицензионный сервер:
    oxidproxy --ping <HOST:PORT>
    Используйте адрес, который дала поддержка. Штатные адреса встроены в сервер, проверять их вручную не нужно.

Нет подключения через прокси

  1. Убедитесь, что клиент использует правильный протокол — SOCKS5, SOCKS5h или HTTP CONNECT (все поддерживаются). Для максимальной анонимности рекомендуется SOCKS5h (DNS-запросы разрешаются на стороне сервера).
  2. Проверьте маршрутизацию IPv6 — осмотрите содержимое файла /etc/rc.local и вывод команды:
    ip -6 route show
  3. Проверьте, что порт доступен извне:
    ss -tlnp | grep oxidproxy
  4. Проверьте файрвол (iptables/nftables)

Не открываются некоторые сайты

OxidProxy работает только через IPv6. Если целевой сайт не имеет AAAA-записи (IPv6), подключение невозможно.

Проверить наличие AAAA:

dig AAAA example.com

IP не меняется

OxidProxy использует Sticky Sessions. IP привязан к паре логин/пароль. Для смены IP:
- Запросите нового пользователя через GET /allocate
- Или дождитесь истечения rotation_interval и переподключитесь

Загрузилось не то ядро

При старте в журнале есть строка Native kernel mimicking DISABLED, а uname -r не заканчивается на -oxidproxy-p0f: сервер загрузил другое ядро, и маскировка ОС не работает.

  1. Посмотрите, какое ядро работает и какие установлены:
    uname -r
    ls /boot/vmlinuz-*
  2. Проверьте, что в /etc/default/grub стоит GRUB_DEFAULT=0. На Debian 12 этого достаточно: наше ядро по номеру старше ядер Debian и идёт первым — если только рядом не стоит более новое ядро, например из backports.
  3. На Debian 13 собственные ядра Debian идут по номерам upstream и после обновления могут оказаться старше нашего, поэтому установщик держит наше первым с помощью файла /etc/default/grub.d/99-oxidproxy-p0f.cfg. Если файла нет, запустите установщик ещё раз (раздел 3.1) — он запишет файл заново.
  4. Примените изменения и перезагрузитесь:
    update-grub
    reboot

12. FAQ

В: Что такое SOCKS5h и чем отличается от SOCKS5?

О: В режиме SOCKS5h DNS-запросы выполняются на стороне прокси-сервера (Remote DNS). В обычном SOCKS5 DNS разрешается на стороне клиента — это может привести к DNS-утечкам и раскрыть реальный IP. Всегда используйте SOCKS5h.


В: Меняются ли логины и пароли после перезапуска или обновления?

О: Нет. Они выводятся из account_seed, который установщик задаёт один раз, своё значение у каждого сервера. Смена account_seed переиздаёт все учётки; копируя конфигурацию на другой сервер, задайте ему своё значение.


В: Можно ли использовать несколько IPv6 подсетей?

О: Да, добавьте их в секцию ipv6_subnets с разными весами. Трафик будет распределяться пропорционально весам.


В: Как узнать HWID моего сервера?

О: Выполните oxidproxy -H. HWID нужен для привязки лицензии к серверу.


В: Сколько ресурсов потребляет OxidProxy?

О: При 100 000 аккаунтов и ~50 активных соединениях — около 80–120 МБ RAM и ~5% CPU на 1 ядре. Сервер написан на Rust — это обеспечивает высокую производительность и предсказуемое потребление памяти.


В: Безопасен ли API?

О: При включённом api_port_https API работает через HTTPS. Сертификат подписан собственным CA сервера — тем же, что отдаётся по /ca; пока этот CA не установлен, cURL нужен флаг -k (или --cacert с файлом из /ca). Доступ защищён master_token: из методов API без него отвечают только /health, /version и /ca (сертификат CA — в нём нет секретов), а /stats и /metrics — только самой машине. При включённом белом списке IP API и панель отвечают только адресам из него.


В: Что такое HTTP CONNECT режим?

О: HTTP CONNECT — стандартный метод проксирования HTTPS-трафика. Клиент отправляет CONNECT host:443 HTTP/1.1 с заголовком Proxy-Authorization: Basic, после чего устанавливается зашифрованный туннель. Поддерживается всеми браузерами, curl, системными настройками прокси и большинством ПО.

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

curl -x http://user_xxx:pass_xxx@YOUR_IP:1081 https://ifconfig.me

В: Чем hybrid отличается от отдельных socks/http портов?

О: В режиме hybrid сервер принимает оба протокола на одном порту. Протокол определяется автоматически по первому байту соединения: 0x05 — SOCKS5, первая буква метода HTTP (CONNECT, GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS) — HTTP, всё остальное сбрасывается. Это удобнее — не нужно открывать дополнительные порты. Все фишки (p0f, shaping, DNS, лимиты) работают одинаково для обоих протоколов.


В: Что делает переменная [mode] в accounts_file?

О: При экспорте аккаунтов [mode] заменяется на протокол (socks5 или http). Для hybrid-листенеров создаются два файла — один с socks5:// ссылками, другой с http://. Пример: accounts_android_socks5_1081.txt и accounts_android_http_1081.txt.


В: Браузер показывает ошибку сертификата при работе через MITM-порт.

О: MITM-порт терминирует TLS собственным удостоверяющим центром (CA), поэтому клиентское устройство должно один раз добавить сертификат CA сервера в доверенные — иначе браузер будет считать соединение небезопасным. Сертификат доступен для скачивания с сервера (эндпоинт /ca) или кнопкой «Download CA certificate» на карточке MITM в дашборде (раздел 7.6).


В: Что произойдёт, если User-Agent клиента не входит ни в один из профилей mitm_listeners?

О: Зависит от клиента. Распознанный браузер, которого нет в profiles, получает другой профиль той же ОС из списка, а если такой ОС в списке нет — профиль default; при strict: true ему отказывают. Клиенту вовсе без браузерного User-Agent — curl, скрипту — отказывают со страницей-объяснением; allow_unknown_ua: true пускает его с профилем default.


13. История изменений

v2.6.2 — октябрь 2026

v2.6.1 — октябрь 2026

v2.6.0 — октябрь 2026

v2.5.1 — сентябрь 2026

При обновлении:

v2.4.1 — сентябрь 2026

v2.4.0 — сентябрь 2026

v2.3.7 — сентябрь 2026

v2.3.6 — сентябрь 2026

v2.2.0 — сентябрь 2026

v2.1.2 — август 2026

v2.1.0 — август 2026

v2.0.0 — июнь 2026

v1.8.1 — май 2026

v1.7.1 — апрель 2026

v1.7.0 — март 2026

v1.6.0 — январь 2026