Как ограничить скорость для пользователя в 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 для ограничения скорости
- Как ограничить скорость для каждого пользователя — практические варианты
- Примеры конфигураций и команды для тестирования
- Панели и бэкенды: 3x‑ui, x‑ui, 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, а ставить слой управления/шейпинга вокруг него. Ниже — конкретные варианты, их плюсы и минусы.
- Панели управления (3x‑ui / x‑ui)
- Что делает: создаёт пользователей, иногда — отдельные inbound/порт для каждого, и предоставляет UI‑поля для лимита скорости.
- Плюсы: удобно, быстро, мало ручной работы; часто включают учёт трафика.
- Минусы: зависит от реализации панели (как именно она реализует лимит — на уровне TCP прокси, iptables, tc или логики приложения).
- Где смотреть: обзор 3x‑ui — 3X‑UI Панель, примечания пользователей про x‑ui — reddit пример.
- Прокси‑слой перед Xray (Nginx / stream / специализированный TCP‑прокси)
- Идея: поставить прокси, который принимает подключение от клиента, применяет rate‑limit и проксирует в Xray.
- Пример (из обсуждений): конфигурация с директивами скорости в 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; нагрузка на прокси; сложности при большом количестве пользователей.
- Сетевой shaping — tc / nftables / psched (на узле)
- Идея: маркировать трафик по пользователю (по IP, по iptables mark, по cgroup) и применять qdisc (HTB, fq_codel и т.п.).
- Пример (очень упрощённо):
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».
- Разделение на отдельные inbounds / сервисы для пользователей
- Идея: каждому важному пользователю дать свой inbound (порт/UUID) и накладывать лимит на уровне этого inboud/прокси/iptables.
- Плюсы: простая логика контроля, легко применять правила по порту.
- Минусы: масштабируемость — много портов/конфигураций.
- Бэкенд/учёт и динамическое shaping (XrayR / кастомный backend)
- Как: XrayR или ваш авторизационный сервис ведёт учёт и по API управляет правилами шейпинга (добавляет/убирает tc/iptables правила или меняет конфигурацию прокси).
- Документация XrayR: https://xcode75.github.io/XMPlusDocs/install/xrayr.html
- Плюсы: гибкость, автоматизация, можно реализовать квоты, временные лимиты и прочее.
- Минусы: требует разработки/интеграции.
Комбинированный подход обычно лучше: панель для управления пользователями + бэкенд для учёта + сетевой shaping для надёжности и производительности.
Примеры конфигураций и команды для тестирования
- Иллюстрация параметров fallback в Xray (псевдо‑фрагмент, смотреть актуальную структуру в документации):
{
"streamSettings": {
"network": "tcp",
"realitySettings": {
"settings": {
"afterBytes": 8192,
"bytesPerSec": 65536,
"burstBytesPerSec": 131072,
"limitFallbackUpload": 51200,
"limitFallbackDownload": 102400
}
}
}
}
Эти параметры применяются лишь к fallback‑соединениям — подробности в описании транспорта REALITY и обсуждениях ядра GitHub Discussions #3518.
-
Nginx‑пример (из обсуждения): смотрите замечание про совместимость модулей и тестируйте у себя — https://stackoverflow.com/questions/78369980/how-to-limit-speed-for-client-in-xray-xtls
-
tc‑пример (формирование одного класса + фильтр по IP):
# создаём корневой 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
- Как тестировать?
- локально:
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‑ах.
- Логи и мониторинг: собирайте данные о скорости и потреблении, чтобы корректно менять правила.
- Безопасность и закон: если вы собираетесь ограничивать трафик/биллинговые метрики, соблюдайте локальные законы и приватность пользователей.
Источники
- Описание транспорта (REALITY, параметры скорости): https://xtls.github.io/ru/config/transport.html
- Обсуждение отсутствия нативного per‑user лимита в Xray Core: https://github.com/XTLS/Xray-core/discussions/2727
- Обсуждение параметров afterBytes / limitFallback* в Xray Core: https://github.com/XTLS/Xray-core/discussions/3518
- Issue с деталями по fallback‑ограничениям: https://github.com/XTLS/Xray-core/issues/5201
- Пример подхода с Nginx (обсуждение / StackOverflow): https://stackoverflow.com/questions/78369980/how-to-limit-speed-for-client-in-xray-xtls
- Обзор и руководство по панели 3X‑UI: https://teletype.in/@taypa/3X-UI-Panel
- Упоминание x‑ui и возможности лимита пропускной способности в сообществе: https://www.reddit.com/r/dumbclub/comments/17e6agw/school_blocking_xray_xtls_rprx_vision/
- Документация/пример XrayR (бэкенд для управления): https://xcode75.github.io/XMPlusDocs/install/xrayr.html
- Политики и статистика (upstream traffic statistics): https://xtls.github.io/en/config/policy.html
- Сообщество: Habr Q&A про идеи внешнего прокси/лимитирования: https://qna.habr.com/q/1378002
Заключение
Если кратко: для Xray Reality нет встроенного способа «задать N kb/s конкретному UUID» — только ограничение для fallback‑соединений. Чтобы ограничить скорость для каждого пользователя, используйте внешний слой: панели управления (3x‑ui/x‑ui) для простых случаев, сетевой shaping (tc) и прокси‑слой для точного контроля, и/или бэкенд (XrayR / кастом) для автоматизации и учёта. Начните с простого (панель → тесты), а при росте трафика переходите к маркировке и tc — так вы получите масштабируемое и предсказуемое ограничение скорости.