Сети

Как ограничить скорость для пользователя в Xray Reality

Подробное руководство: как ограничить скорость для каждого пользователя в Xray Reality. Нативные fallback-лимиты, панели 3x-ui/x-ui, Nginx, tc shaping и XrayR. Примеры конфигураций и рекомендации по реализации.

Как ограничить скорость для каждого пользователя в системе Reality? Если такая возможность существует, то как её можно реализовать на практике?

Xray Reality не имеет нативного механизма, который позволял бы гибко ограничивать скорость для каждого пользователя; ядро поддерживает только ограничение для fallback‑соединений через параметры типа limitFallbackUpload / limitFallbackDownload и алгоритм token‑bucket (afterBytes, bytesPerSec, burstBytesPerSec). На практике per‑user лимиты реализуют внешними инструментами: панели управления (3x‑ui / x‑ui), прокси‑слой (Nginx/stream), сетевое shaping (tc, nftables) или бэкенды типа XrayR с учётом учётных записей — выбор зависит от задач и масштаба системы.


Содержание


Возможности Xray Reality для ограничения скорости

Коротко: нативного per‑user throttling в Xray Core для Reality нет. Ядро предоставляет возможность ограничивать скорость только для fallback‑соединений — тех подключений, которые не прошли проверку Reality (например, когда клиент прошёл через CDN/посредника). Это описано в официальной документации по транспортам и подтверждается обсуждениями в проекте Xray Core: в документации подробно указаны параметры afterBytes, bytesPerSec, burstBytesPerSec, а также limitFallbackUpload/limitFallbackDownload (ограничивают только fallback) — см. способы передачи (REALITY) и обсуждение разработчиков GitHub Discussions #3518.

Как это работает технически? Механизм — классический token‑bucket:

  • bytesPerSec — скорость пополнения корзины (байт/с);
  • burstBytesPerSec — ёмкость корзины (максимальный burst);
  • afterBytes — порог байт, после которого включается ограничение;
  • limitFallbackUpload / limitFallbackDownload — жёсткие пределы для fallback‑потока.

Важно: эти параметры помогают предотвращать злоупотребления через CDN/публичные fallback‑механизмы, но не дают управление на уровне «конкретный пользователь X с таким‑то UUID получает N kb/s».

Подтверждение отсутствия нативного per‑user лимита есть в обсуждениях сообщества: вопрос о возможности лимитировать трафик для каждого пользователя и issue с уточнениями поведения fallback #5201.


Как ограничить скорость для каждого пользователя — практические варианты

Если вам нужно ограничивать скорость для каждого пользователя (по аккаунту/UUID), реальная практика — не менять Xray Core, а ставить слой управления/шейпинга вокруг него. Ниже — конкретные варианты, их плюсы и минусы.

  1. Панели управления (3x‑ui / x‑ui)
  • Что делает: создаёт пользователей, иногда — отдельные inbound/порт для каждого, и предоставляет UI‑поля для лимита скорости.
  • Плюсы: удобно, быстро, мало ручной работы; часто включают учёт трафика.
  • Минусы: зависит от реализации панели (как именно она реализует лимит — на уровне TCP прокси, iptables, tc или логики приложения).
  • Где смотреть: обзор 3x‑ui — 3X‑UI Панель, примечания пользователей про x‑ui — reddit пример.
  1. Прокси‑слой перед Xray (Nginx / stream / специализированный TCP‑прокси)
  • Идея: поставить прокси, который принимает подключение от клиента, применяет rate‑limit и проксирует в Xray.
  • Пример (из обсуждений): конфигурация с директивами скорости в Nginx, предложенная в сообществе:
nginx
server {
listen 8888;
proxy_pass xray_backend;
ssl_preread on;
proxy_download_rate 100k;
proxy_upload_rate 100k;
}

(Источник: обсуждение/StackOverflow — https://stackoverflow.com/questions/78369980/how-to-limit-speed-for-client-in-xray-xtls)

  • Плюсы: можно централизовать лимиты, простая настройка для небольших сетей.
  • Минусы: не все nginx‑модули одинаково работают для raw TCP/STREAM; нагрузка на прокси; сложности при большом количестве пользователей.
  1. Сетевой shaping — tc / nftables / psched (на узле)
  • Идея: маркировать трафик по пользователю (по IP, по iptables mark, по cgroup) и применять qdisc (HTB, fq_codel и т.п.).
  • Пример (очень упрощённо):
bash
tc qdisc add dev eth0 root handle 1: htb default 30
tc class add dev eth0 parent 1: classid 1:10 htb rate 1mbit ceil 1mbit
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip src 10.0.0.2/32 flowid 1:10
  • Плюсы: точный контроль, высокая производительность, масштабируется для сотен/тысяч правил.
  • Минусы: требует сетевых навыков; NAT/динамические IP усложняют соответствие «пользователь ↔ IP».
  1. Разделение на отдельные inbounds / сервисы для пользователей
  • Идея: каждому важному пользователю дать свой inbound (порт/UUID) и накладывать лимит на уровне этого inboud/прокси/iptables.
  • Плюсы: простая логика контроля, легко применять правила по порту.
  • Минусы: масштабируемость — много портов/конфигураций.
  1. Бэкенд/учёт и динамическое shaping (XrayR / кастомный backend)
  • Как: XrayR или ваш авторизационный сервис ведёт учёт и по API управляет правилами шейпинга (добавляет/убирает tc/iptables правила или меняет конфигурацию прокси).
  • Документация XrayR: https://xcode75.github.io/XMPlusDocs/install/xrayr.html
  • Плюсы: гибкость, автоматизация, можно реализовать квоты, временные лимиты и прочее.
  • Минусы: требует разработки/интеграции.

Комбинированный подход обычно лучше: панель для управления пользователями + бэкенд для учёта + сетевой shaping для надёжности и производительности.


Примеры конфигураций и команды для тестирования

  1. Иллюстрация параметров fallback в Xray (псевдо‑фрагмент, смотреть актуальную структуру в документации):
json
{
 "streamSettings": {
 "network": "tcp",
 "realitySettings": {
 "settings": {
 "afterBytes": 8192,
 "bytesPerSec": 65536,
 "burstBytesPerSec": 131072,
 "limitFallbackUpload": 51200,
 "limitFallbackDownload": 102400
 }
 }
 }
}

Эти параметры применяются лишь к fallback‑соединениям — подробности в описании транспорта REALITY и обсуждениях ядра GitHub Discussions #3518.

  1. Nginx‑пример (из обсуждения): смотрите замечание про совместимость модулей и тестируйте у себя — https://stackoverflow.com/questions/78369980/how-to-limit-speed-for-client-in-xray-xtls

  2. tc‑пример (формирование одного класса + фильтр по IP):

bash
# создаём корневой qdisc
tc qdisc add dev eth0 root handle 1: htb default 30

# класс для 1 Mbit/s
tc class add dev eth0 parent 1: classid 1:10 htb rate 1mbit ceil 1mbit

# фильтр: примитивное соответствие по IP
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip src 203.0.113.42/32 flowid 1:10
  1. Как тестировать?
  • локально: iperf3 (сервер/клиент) для измерения пропускной способности;
  • через HTTP/тест: curl / wget и смотреть скорость;
  • использовать статистику панели (если есть) и логи Xray;
  • tcpdump/wireshark для подтверждения shaping.

Панели и бэкенды: 3x‑ui, x‑ui, XrayR — что умеют и как помогают

Панели часто дают самый быстрый путь: создать пользователя в UI и выставить у него «bandwidth limit». Сообщество отмечает, что панели вроде 3x‑ui/x‑ui предоставляют опцию ограничения пропускной способности — см. обзор 3x‑ui 3X‑UI Панель и упоминание x‑ui в обсуждениях reddit. Под капотом панели могут:

  • создавать отдельные inbound для пользователя;
  • выставлять iptables/mark + tc‑правила;
  • или обслуживать ограничение на уровне прокси.

XrayR — полезен как бэкенд для централизованного учёта и динамического управления (Redis, API), но сам по себе не обязательно выполняет низкоуровневый shaping — чаще он даёт данные, по которым ваши скрипты применяют правила.


Рекомендации и подводные камни при внедрении

  • Если нужна простота: начните с панели (3x‑ui/x‑ui). Быстро работает для небольших VPS и десятков пользователей.
  • Если нужна точность и производительность при сотнях/тысячах пользователей: используйте tc + маркировку трафика (уникальные порты/марки) + автоматизацию через бэкенд.
  • Не полагайтесь на limitFallback* как на средство per‑user throttling — это не её цель (fallback ≠ все соединения). Смотрите документацию: https://xtls.github.io/ru/config/transport.html.
  • Учтите NAT/динамические IP: если клиенты за NAT, сопоставление «IP → пользователь» ненадёжно; лучше маркировать трафик на хосте, где аутентификация видна (внутренний прокси / per‑inbound).
  • CDN и SNI: при использовании CDN часть логики может пойти иначе — проверяйте, как ваши клиенты проходят Reality‑аутентификацию.
  • Тестируйте на стенде: нагрузка, латентность, поведение при burst‑ах.
  • Логи и мониторинг: собирайте данные о скорости и потреблении, чтобы корректно менять правила.
  • Безопасность и закон: если вы собираетесь ограничивать трафик/биллинговые метрики, соблюдайте локальные законы и приватность пользователей.

Источники


Заключение

Если кратко: для Xray Reality нет встроенного способа «задать N kb/s конкретному UUID» — только ограничение для fallback‑соединений. Чтобы ограничить скорость для каждого пользователя, используйте внешний слой: панели управления (3x‑ui/x‑ui) для простых случаев, сетевой shaping (tc) и прокси‑слой для точного контроля, и/или бэкенд (XrayR / кастом) для автоматизации и учёта. Начните с простого (панель → тесты), а при росте трафика переходите к маркировке и tc — так вы получите масштабируемое и предсказуемое ограничение скорости.

Авторы
Проверено модерацией
Модерация
Как ограничить скорость для пользователя в Xray Reality